diff --git a/AUTHORS b/AUTHORS index 3084c13d..8ee0c44 100644 --- a/AUTHORS +++ b/AUTHORS
@@ -307,6 +307,7 @@ Jesus Sanchez-Palencia <jesus.sanchez-palencia.fernandez.fil@intel.com> Jiadong Zhu <jiadong.zhu@linaro.org> Jiajia Qin <jiajia.qin@intel.com> +Jianjun Zhu <jianjun.zhu@intel.com> Jiawei Shao <jiawei.shao@intel.com> Jie Chen <jie.a.chen@intel.com> Jihoon Chung <jihoon@gmail.com>
diff --git a/BUILD.gn b/BUILD.gn index dd4aa36f..0fa9b59 100644 --- a/BUILD.gn +++ b/BUILD.gn
@@ -151,9 +151,8 @@ ] } - # TODO(sebmarchand): Remove this once we stop supporting Syzygy (M54+). group("All_syzygy") { - if (is_syzyasan || syzygy_optimize) { + if (is_syzyasan) { deps = [ "//chrome/installer/mini_installer:mini_installer", "//chrome/installer/mini_installer:mini_installer_syzygy",
diff --git a/DEPS b/DEPS index 3eae889..dae3980a 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': 'f489886915034093278353d06c6f1973b2e8b7d2', + 'skia_revision': 'ac66ae63eade5347864c5d0bd025756c5ea23fda', # 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': '2c4f7bfee172d5728184f24f93edc3a3bf16da27', + 'v8_revision': 'fd97bfe7190e2b515deed9c138c1617e675baa71', # 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. @@ -63,7 +63,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': '05923132ae08d45fbe957219775a48c55ee57aef', + 'pdfium_revision': '878dd5b121b38e6eaba5b3f3a90d0a9abf60feaf', # 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. @@ -95,7 +95,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling catapult # and whatever else without interference from each other. - 'catapult_revision': '60871179ac16079df83009da758b0e64e4227f2e', + 'catapult_revision': '8f2696631f9d6305cad5632e27284479ba7b01db', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling libFuzzer # and whatever else without interference from each other. @@ -186,7 +186,7 @@ Var('chromium_git') + '/external/bidichecker/lib.git' + '@' + '97f2aa645b74c28c57eca56992235c79850fa9e0', 'src/third_party/webgl/src': - Var('chromium_git') + '/external/khronosgroup/webgl.git' + '@' + '4e6c509', + Var('chromium_git') + '/external/khronosgroup/webgl.git' + '@' + '4e6c509e9af95cf777a3136aed0f956d6e1608cd', 'src/third_party/webdriver/pylib': Var('chromium_git') + '/external/selenium/py.git' + '@' + '5fd78261a75fe08d27ca4835fb6c5ce4b42275bd', @@ -222,7 +222,7 @@ Var('chromium_git') + '/native_client/src/third_party/scons-2.0.1.git' + '@' + '1c1550e17fc26355d08627fbdec13d8291227067', 'src/third_party/webrtc': - Var('chromium_git') + '/external/webrtc/trunk/webrtc.git' + '@' + 'b324719b079a589474e460e59f5dc0a3a9570624', # commit position 14617 + Var('chromium_git') + '/external/webrtc/trunk/webrtc.git' + '@' + '101046f7a78c104a8a4ffe6358951be4b892ce2e', # commit position 14660 'src/third_party/openmax_dl': Var('chromium_git') + '/external/webrtc/deps/third_party/openmax.git' + '@' + Var('openmax_dl_revision'), @@ -341,7 +341,7 @@ }, 'ios': { 'src/ios/third_party/earl_grey/src': - Var('chromium_git') + '/external/github.com/google/EarlGrey.git' + '@' + '090aa5fa68d4c422af4ee84912d30bc89a3e8820', + Var('chromium_git') + '/external/github.com/google/EarlGrey.git' + '@' + '625b2b7cdaf9371ae2b001d6cdc23b1790d41cd8', 'src/ios/third_party/fishhook/src': Var('chromium_git') + '/external/github.com/facebook/fishhook.git' + '@' + 'd172d5247aa590c25d0b1885448bae76036ea22c', @@ -390,7 +390,7 @@ # Build tools for Chrome OS. Note: This depends on third_party/pyelftools. 'src/third_party/chromite': - Var('chromium_git') + '/chromiumos/chromite.git' + '@' + '368c3e5db9c91424852aa37d8ef51f7a6d4ef2f5', + Var('chromium_git') + '/chromiumos/chromite.git' + '@' + '88592741eef1a4a0838060e63481825657f8663c', # Dependency of chromite.git and skia. 'src/third_party/pyelftools':
diff --git a/WATCHLISTS b/WATCHLISTS index 156484b1..b87170c 100644 --- a/WATCHLISTS +++ b/WATCHLISTS
@@ -806,6 +806,9 @@ 'safe_browsing': { 'filepath': 'chrome/(browser|common|renderer)/safe_browsing/', }, + 'safe_browsing_db': { + 'filepath': 'components/safe_browsing_db/', + }, 'sandbox': { 'filepath': 'sandbox/'\ '|content/browser/bootstrap_sandbox_mac'\ @@ -1405,7 +1408,6 @@ 'je_julie.kim@chromium.org', 'nektar+watch@chromium.org', 'yuzo+watch@chromium.org'], - 'activity_log': ['felt@chromium.org'], 'add_to_homescreen': ['agrieve+watch@chromium.org', 'dominickn+watch@chromium.org', 'pkotwicz+watch@chromium.org', @@ -1939,6 +1941,7 @@ 'gab+watch@chromium.org', 'robertshield+watch@chromium.org'], 'safe_browsing': ['grt+watch@chromium.org'], + 'safe_browsing_db': ['vakh+watch@chromium.org'], 'sandbox': ['rickyz+watch@chromium.org'], 'scheduler': ['scheduler-bugs@chromium.org'], 'screen_orientation': ['mlamouri+watch-screen-orientation@chromium.org'],
diff --git a/android_webview/browser/aw_browser_context.cc b/android_webview/browser/aw_browser_context.cc index 85093c1..c2fb501 100644 --- a/android_webview/browser/aw_browser_context.cc +++ b/android_webview/browser/aw_browser_context.cc
@@ -94,9 +94,6 @@ policy::URLBlacklistManager* CreateURLBlackListManager( PrefService* pref_service) { - policy::URLBlacklist::SegmentURLCallback segment_url_callback = - static_cast<policy::URLBlacklist::SegmentURLCallback>( - url_formatter::SegmentURL); base::SequencedWorkerPool* pool = BrowserThread::GetBlockingPool(); scoped_refptr<base::SequencedTaskRunner> background_task_runner = pool->GetSequencedTaskRunner(pool->GetSequenceToken()); @@ -104,7 +101,7 @@ BrowserThread::GetTaskRunnerForThread(BrowserThread::IO); return new policy::URLBlacklistManager(pref_service, background_task_runner, - io_task_runner, segment_url_callback, + io_task_runner, base::Bind(OverrideBlacklistForURL)); }
diff --git a/android_webview/glue/java/src/com/android/webview/chromium/WebMessagePortAdapter.java b/android_webview/glue/java/src/com/android/webview/chromium/WebMessagePortAdapter.java index 4b2688a..54d0aae 100644 --- a/android_webview/glue/java/src/com/android/webview/chromium/WebMessagePortAdapter.java +++ b/android_webview/glue/java/src/com/android/webview/chromium/WebMessagePortAdapter.java
@@ -10,7 +10,7 @@ import android.webkit.WebMessage; import android.webkit.WebMessagePort; -import org.chromium.content.browser.AppWebMessagePort; +import org.chromium.content_public.browser.MessagePort; /** * This class is used to convert a WebMessagePort to a MessagePort in chromium @@ -18,14 +18,14 @@ */ @TargetApi(Build.VERSION_CODES.M) public class WebMessagePortAdapter extends WebMessagePort { - private AppWebMessagePort mPort; + private MessagePort mPort; - public WebMessagePortAdapter(AppWebMessagePort port) { + public WebMessagePortAdapter(MessagePort port) { mPort = port; } public void postMessage(WebMessage message) { - mPort.postMessage(message.getData(), toAppWebMessagePorts(message.getPorts())); + mPort.postMessage(message.getData(), toMessagePorts(message.getPorts())); } public void close() { @@ -37,20 +37,20 @@ } public void setWebMessageCallback(final WebMessageCallback callback, final Handler handler) { - mPort.setMessageCallback(new AppWebMessagePort.MessageCallback() { + mPort.setMessageCallback(new MessagePort.MessageCallback() { @Override - public void onMessage(String message, AppWebMessagePort[] ports) { + public void onMessage(String message, MessagePort[] ports) { callback.onMessage(WebMessagePortAdapter.this, - new WebMessage(message, fromAppWebMessagePorts(ports))); + new WebMessage(message, fromMessagePorts(ports))); } }, handler); } - public AppWebMessagePort getPort() { + public MessagePort getPort() { return mPort; } - public static WebMessagePort[] fromAppWebMessagePorts(AppWebMessagePort[] messagePorts) { + public static WebMessagePort[] fromMessagePorts(MessagePort[] messagePorts) { if (messagePorts == null) return null; WebMessagePort[] ports = new WebMessagePort[messagePorts.length]; for (int i = 0; i < messagePorts.length; i++) { @@ -59,9 +59,9 @@ return ports; } - public static AppWebMessagePort[] toAppWebMessagePorts(WebMessagePort[] webMessagePorts) { + public static MessagePort[] toMessagePorts(WebMessagePort[] webMessagePorts) { if (webMessagePorts == null) return null; - AppWebMessagePort[] ports = new AppWebMessagePort[webMessagePorts.length]; + MessagePort[] ports = new MessagePort[webMessagePorts.length]; for (int i = 0; i < webMessagePorts.length; i++) { ports[i] = ((WebMessagePortAdapter) webMessagePorts[i]).getPort(); }
diff --git a/android_webview/glue/java/src/com/android/webview/chromium/WebViewChromium.java b/android_webview/glue/java/src/com/android/webview/chromium/WebViewChromium.java index 32e695e..57974c2 100644 --- a/android_webview/glue/java/src/com/android/webview/chromium/WebViewChromium.java +++ b/android_webview/glue/java/src/com/android/webview/chromium/WebViewChromium.java
@@ -1351,7 +1351,7 @@ }); return ret; } - return WebMessagePortAdapter.fromAppWebMessagePorts(mAwContents.createMessageChannel()); + return WebMessagePortAdapter.fromMessagePorts(mAwContents.createMessageChannel()); } @Override @@ -1367,7 +1367,7 @@ return; } mAwContents.postMessageToFrame(null, message.getData(), targetOrigin.toString(), - WebMessagePortAdapter.toAppWebMessagePorts(message.getPorts())); + WebMessagePortAdapter.toMessagePorts(message.getPorts())); } @Override
diff --git a/android_webview/java/src/org/chromium/android_webview/AwContents.java b/android_webview/java/src/org/chromium/android_webview/AwContents.java index 43bbe6be..a21d244f 100644 --- a/android_webview/java/src/org/chromium/android_webview/AwContents.java +++ b/android_webview/java/src/org/chromium/android_webview/AwContents.java
@@ -66,6 +66,7 @@ import org.chromium.content_public.browser.GestureStateListener; import org.chromium.content_public.browser.JavaScriptCallback; import org.chromium.content_public.browser.LoadUrlParams; +import org.chromium.content_public.browser.MessagePort; import org.chromium.content_public.browser.NavigationController; import org.chromium.content_public.browser.NavigationHistory; import org.chromium.content_public.browser.WebContents; @@ -86,7 +87,6 @@ import java.util.HashMap; import java.util.Locale; import java.util.Map; -import java.util.Map.Entry; import java.util.WeakHashMap; import java.util.concurrent.Callable; @@ -2246,7 +2246,7 @@ * message ports to pass. */ public void postMessageToFrame( - String frameName, String message, String targetOrigin, AppWebMessagePort[] sentPorts) { + String frameName, String message, String targetOrigin, MessagePort[] sentPorts) { if (isDestroyed(WARN)) return; if (mPostMessageSender == null) { AppWebMessagePortService service = mBrowserContext.getMessagePortService(); @@ -2254,7 +2254,7 @@ service.addObserver(mPostMessageSender); } mPostMessageSender.postMessage(frameName, message, targetOrigin, - sentPorts); + (AppWebMessagePort[]) sentPorts); } // Implements PostMessageSender.PostMessageSenderDelegate interface method.
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/PostMessageTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/PostMessageTest.java index b5fa0b13..31e253b 100644 --- a/android_webview/javatests/src/org/chromium/android_webview/test/PostMessageTest.java +++ b/android_webview/javatests/src/org/chromium/android_webview/test/PostMessageTest.java
@@ -22,6 +22,7 @@ import org.chromium.content.browser.test.util.Criteria; import org.chromium.content.browser.test.util.CriteriaHelper; import org.chromium.content.browser.test.util.TestCallbackHelperContainer.OnPageFinishedHelper; +import org.chromium.content_public.browser.MessagePort; import org.chromium.net.test.util.TestWebServer; import java.util.concurrent.Callable; @@ -255,9 +256,9 @@ public void run() { AppWebMessagePort[] channel = mAwContents.createMessageChannel(); // set a web event handler, this puts the port in a started state. - channel[1].setMessageCallback(new AppWebMessagePort.MessageCallback() { + channel[1].setMessageCallback(new MessagePort.MessageCallback() { @Override - public void onMessage(String message, AppWebMessagePort[] sentPorts) {} + public void onMessage(String message, MessagePort[] sentPorts) {} }, null); try { mAwContents.postMessageToFrame(null, "2", mWebServer.getBaseUrl(), @@ -308,9 +309,9 @@ public void run() { AppWebMessagePort[] channel1 = mAwContents.createMessageChannel(); // set a web event handler, this puts the port in a started state. - channel1[1].setMessageCallback(new AppWebMessagePort.MessageCallback() { + channel1[1].setMessageCallback(new MessagePort.MessageCallback() { @Override - public void onMessage(String message, AppWebMessagePort[] sentPorts) {} + public void onMessage(String message, MessagePort[] sentPorts) {} }, null); AppWebMessagePort[] channel2 = mAwContents.createMessageChannel(); try { @@ -584,9 +585,9 @@ AppWebMessagePort[] channel = mAwContents.createMessageChannel(); // verify communication from JS to Java. channelContainer.set(channel); - channel[0].setMessageCallback(new AppWebMessagePort.MessageCallback() { + channel[0].setMessageCallback(new MessagePort.MessageCallback() { @Override - public void onMessage(String message, AppWebMessagePort[] sentPorts) { + public void onMessage(String message, MessagePort[] sentPorts) { channelContainer.setMessage(message); } }, null); @@ -659,9 +660,9 @@ runTestOnUiThread(new Runnable() { @Override public void run() { - channel[0].setMessageCallback(new AppWebMessagePort.MessageCallback() { + channel[0].setMessageCallback(new MessagePort.MessageCallback() { @Override - public void onMessage(String message, AppWebMessagePort[] sentPorts) { + public void onMessage(String message, MessagePort[] sentPorts) { channelContainer.setMessage(message); } }, null); @@ -689,9 +690,9 @@ @Override public void run() { AppWebMessagePort[] channel = mAwContents.createMessageChannel(); - channel[0].setMessageCallback(new AppWebMessagePort.MessageCallback() { + channel[0].setMessageCallback(new MessagePort.MessageCallback() { @Override - public void onMessage(String message, AppWebMessagePort[] sentPorts) { + public void onMessage(String message, MessagePort[] sentPorts) { channelContainer.setMessage(message); } }, null); @@ -716,9 +717,9 @@ @Override public void run() { AppWebMessagePort[] channel = mAwContents.createMessageChannel(); - channel[1].setMessageCallback(new AppWebMessagePort.MessageCallback() { + channel[1].setMessageCallback(new MessagePort.MessageCallback() { @Override - public void onMessage(String message, AppWebMessagePort[] sentPorts) { + public void onMessage(String message, MessagePort[] sentPorts) { channelContainer.setMessage(message); } }, null); @@ -783,12 +784,12 @@ AppWebMessagePort[] channel = mAwContents.createMessageChannel(); mAwContents.postMessageToFrame( null, "1", mWebServer.getBaseUrl(), new AppWebMessagePort[] {channel[1]}); - channel[0].setMessageCallback(new AppWebMessagePort.MessageCallback() { + channel[0].setMessageCallback(new MessagePort.MessageCallback() { @Override - public void onMessage(String message, final AppWebMessagePort[] p) { - p[0].setMessageCallback(new AppWebMessagePort.MessageCallback() { + public void onMessage(String message, final MessagePort[] p) { + p[0].setMessageCallback(new MessagePort.MessageCallback() { @Override - public void onMessage(String message, AppWebMessagePort[] q) { + public void onMessage(String message, MessagePort[] q) { assertEquals("3", message); p[0].postMessage("4", null); } @@ -850,7 +851,7 @@ mPort.onMessage(message, sentPorts); } @Override - public void postMessage(String message, AppWebMessagePort[] sentPorts) + public void postMessage(String message, MessagePort[] sentPorts) throws IllegalStateException { mPort.postMessage(message, sentPorts); } @@ -976,9 +977,9 @@ public void run() { AppWebMessagePort[] channel = mAwContents.createMessageChannel(); channelContainer.set(channel); - channel[0].setMessageCallback(new AppWebMessagePort.MessageCallback() { + channel[0].setMessageCallback(new MessagePort.MessageCallback() { @Override - public void onMessage(String message, AppWebMessagePort[] sentPorts) { + public void onMessage(String message, MessagePort[] sentPorts) { channelContainer.setMessage(message); } }, null); @@ -1006,9 +1007,9 @@ public void run() { AppWebMessagePort[] channel = mAwContents.createMessageChannel(); channelContainer.set(channel); - channel[0].setMessageCallback(new AppWebMessagePort.MessageCallback() { + channel[0].setMessageCallback(new MessagePort.MessageCallback() { @Override - public void onMessage(String message, AppWebMessagePort[] sentPorts) { + public void onMessage(String message, MessagePort[] sentPorts) { channelContainer.setMessage(message); } }, null); @@ -1047,9 +1048,9 @@ public void run() { AppWebMessagePort[] channel = mAwContents.createMessageChannel(); channelContainer.set(channel); - channel[0].setMessageCallback(new AppWebMessagePort.MessageCallback() { + channel[0].setMessageCallback(new MessagePort.MessageCallback() { @Override - public void onMessage(String message, AppWebMessagePort[] sentPorts) { + public void onMessage(String message, MessagePort[] sentPorts) { channelContainer.setMessage(message); } }, null); @@ -1083,9 +1084,9 @@ public void run() { AppWebMessagePort[] channel = mAwContents.createMessageChannel(); channelContainer.set(channel); - channel[0].setMessageCallback(new AppWebMessagePort.MessageCallback() { + channel[0].setMessageCallback(new MessagePort.MessageCallback() { @Override - public void onMessage(String message, AppWebMessagePort[] sentPorts) { + public void onMessage(String message, MessagePort[] sentPorts) { channelContainer.setMessage(message); } }, null);
diff --git a/apps/app_lifetime_monitor.cc b/apps/app_lifetime_monitor.cc index 6051f0c..637c9091 100644 --- a/apps/app_lifetime_monitor.cc +++ b/apps/app_lifetime_monitor.cc
@@ -125,23 +125,28 @@ } void AppLifetimeMonitor::NotifyAppStart(const std::string& app_id) { - FOR_EACH_OBSERVER(Observer, observers_, OnAppStart(profile_, app_id)); + for (auto& observer : observers_) + observer.OnAppStart(profile_, app_id); } void AppLifetimeMonitor::NotifyAppActivated(const std::string& app_id) { - FOR_EACH_OBSERVER(Observer, observers_, OnAppActivated(profile_, app_id)); + for (auto& observer : observers_) + observer.OnAppActivated(profile_, app_id); } void AppLifetimeMonitor::NotifyAppDeactivated(const std::string& app_id) { - FOR_EACH_OBSERVER(Observer, observers_, OnAppDeactivated(profile_, app_id)); + for (auto& observer : observers_) + observer.OnAppDeactivated(profile_, app_id); } void AppLifetimeMonitor::NotifyAppStop(const std::string& app_id) { - FOR_EACH_OBSERVER(Observer, observers_, OnAppStop(profile_, app_id)); + for (auto& observer : observers_) + observer.OnAppStop(profile_, app_id); } void AppLifetimeMonitor::NotifyChromeTerminating() { - FOR_EACH_OBSERVER(Observer, observers_, OnChromeTerminating()); + for (auto& observer : observers_) + observer.OnChromeTerminating(); } } // namespace apps
diff --git a/ash/BUILD.gn b/ash/BUILD.gn index 5bcd80f3..a5b6062 100644 --- a/ash/BUILD.gn +++ b/ash/BUILD.gn
@@ -842,6 +842,7 @@ "//cc", "//components/device_event_log", "//components/onc", + "//components/session_manager:base", "//components/signin/core/account_id", "//components/user_manager", "//components/wallpaper",
diff --git a/ash/DEPS b/ash/DEPS index 768cf28..2015a88e 100644 --- a/ash/DEPS +++ b/ash/DEPS
@@ -2,6 +2,7 @@ "+device/bluetooth", "+cc/debug", "+components/quirks", + "+components/session_manager", "+components/signin/core/account_id", "+components/user_manager", "+components/wallpaper",
diff --git a/ash/aura/wm_shell_aura.cc b/ash/aura/wm_shell_aura.cc index 9e0150b..b316f8df 100644 --- a/ash/aura/wm_shell_aura.cc +++ b/ash/aura/wm_shell_aura.cc
@@ -239,12 +239,13 @@ } void WmShellAura::OnOverviewModeStarting() { - FOR_EACH_OBSERVER(ShellObserver, *shell_observers(), - OnOverviewModeStarting()); + for (auto& observer : *shell_observers()) + observer.OnOverviewModeStarting(); } void WmShellAura::OnOverviewModeEnded() { - FOR_EACH_OBSERVER(ShellObserver, *shell_observers(), OnOverviewModeEnded()); + for (auto& observer : *shell_observers()) + observer.OnOverviewModeEnded(); } SessionStateDelegate* WmShellAura::GetSessionStateDelegate() {
diff --git a/ash/common/frame/caption_buttons/frame_caption_button.cc b/ash/common/frame/caption_buttons/frame_caption_button.cc index b527ce80..d496f1b 100644 --- a/ash/common/frame/caption_buttons/frame_caption_button.cc +++ b/ash/common/frame/caption_buttons/frame_caption_button.cc
@@ -44,6 +44,7 @@ use_light_images_(false), alpha_(255), swap_images_animation_(new gfx::SlideAnimation(this)) { + set_animate_on_state_change(true); swap_images_animation_->Reset(1); // Do not flip the gfx::Canvas passed to the OnPaint() method. The snap left
diff --git a/ash/common/keyboard/keyboard_ui.cc b/ash/common/keyboard/keyboard_ui.cc index 993b83eb..25ecbd88 100644 --- a/ash/common/keyboard/keyboard_ui.cc +++ b/ash/common/keyboard/keyboard_ui.cc
@@ -46,8 +46,8 @@ return; enabled_ = enabled; - FOR_EACH_OBSERVER(KeyboardUIObserver, *observers(), - OnKeyboardEnabledStateChanged(enabled)); + for (auto& observer : *observers()) + observer.OnKeyboardEnabledStateChanged(enabled); } private:
diff --git a/ash/common/session/session_state_delegate.cc b/ash/common/session/session_state_delegate.cc index 2523787..fc1a949 100644 --- a/ash/common/session/session_state_delegate.cc +++ b/ash/common/session/session_state_delegate.cc
@@ -7,7 +7,7 @@ namespace ash { bool SessionStateDelegate::IsInSecondaryLoginScreen() const { - return GetSessionState() == SESSION_STATE_LOGIN_SECONDARY; + return GetSessionState() == session_manager::SessionState::LOGIN_SECONDARY; } bool SessionStateDelegate::CanAddUserToMultiProfile(
diff --git a/ash/common/session/session_state_delegate.h b/ash/common/session/session_state_delegate.h index 8a52532f..608a2d4 100644 --- a/ash/common/session/session_state_delegate.h +++ b/ash/common/session/session_state_delegate.h
@@ -7,6 +7,7 @@ #include "ash/ash_export.h" #include "ash/common/session/session_types.h" +#include "components/session_manager/session_manager_types.h" class AccountId; @@ -38,22 +39,6 @@ ADD_USER_ERROR_MAXIMUM_USERS_REACHED, }; - // Defines session state i.e. whether session is running or not and - // whether user session is blocked by things like multi-profile login. - enum SessionState { - // When primary user login UI is shown i.e. after boot or sign out, - // no active user session exists yet. - SESSION_STATE_LOGIN_PRIMARY = 0, - - // Inside user session (including lock screen), - // no login UI (primary or multi-profiles) is shown. - SESSION_STATE_ACTIVE, - - // When secondary user login UI is shown i.e. other users are - // already logged in and is currently adding another user to the session. - SESSION_STATE_LOGIN_SECONDARY, - }; - virtual ~SessionStateDelegate() {} // Returns the maximum possible number of logged in users. @@ -96,7 +81,7 @@ virtual bool IsUserSessionBlocked() const = 0; // Returns current session state. - virtual SessionState GetSessionState() const = 0; + virtual session_manager::SessionState GetSessionState() const = 0; // Gets the user info for the user with the given |index|. See session_types.h // for a description of UserIndex.
diff --git a/ash/common/session/session_state_observer.h b/ash/common/session/session_state_observer.h index cc323660..99bdb42 100644 --- a/ash/common/session/session_state_observer.h +++ b/ash/common/session/session_state_observer.h
@@ -6,8 +6,8 @@ #define ASH_COMMON_SESSION_SESSION_STATE_OBSERVER_H_ #include "ash/ash_export.h" -#include "ash/common/session/session_state_delegate.h" #include "base/macros.h" +#include "components/session_manager/session_manager_types.h" class AccountId; @@ -22,7 +22,7 @@ virtual void UserAddedToSession(const AccountId& account_id) {} // Called when session state is changed. - virtual void SessionStateChanged(SessionStateDelegate::SessionState state) {} + virtual void SessionStateChanged(session_manager::SessionState state) {} protected: virtual ~SessionStateObserver() {}
diff --git a/ash/common/shelf/shelf_layout_manager.cc b/ash/common/shelf/shelf_layout_manager.cc index 4308b03..dab6ac8f5 100644 --- a/ash/common/shelf/shelf_layout_manager.cc +++ b/ash/common/shelf/shelf_layout_manager.cc
@@ -969,10 +969,10 @@ } void ShelfLayoutManager::SessionStateChanged( - SessionStateDelegate::SessionState state) { + session_manager::SessionState state) { // Check transition changes to/from the add user to session and change the // shelf alignment accordingly - bool add_user = state == SessionStateDelegate::SESSION_STATE_LOGIN_SECONDARY; + const bool add_user = state == session_manager::SessionState::LOGIN_SECONDARY; if (add_user != state_.is_adding_user_screen) { state_.is_adding_user_screen = add_user; UpdateShelfVisibilityAfterLoginUIChange();
diff --git a/ash/common/shelf/shelf_layout_manager.h b/ash/common/shelf/shelf_layout_manager.h index 6666a8d3..e0eda19 100644 --- a/ash/common/shelf/shelf_layout_manager.h +++ b/ash/common/shelf/shelf_layout_manager.h
@@ -148,7 +148,7 @@ void OnLockStateEvent(LockStateObserver::EventType event) override; // Overridden from SessionStateObserver: - void SessionStateChanged(SessionStateDelegate::SessionState state) override; + void SessionStateChanged(session_manager::SessionState state) override; // TODO(msw): Remove these accessors, kept temporarily to simplify changes. ShelfAlignment GetAlignment() const { return shelf_widget_->GetAlignment(); }
diff --git a/ash/common/shelf/shelf_locking_manager.cc b/ash/common/shelf/shelf_locking_manager.cc index 05cc9ac..aabc145 100644 --- a/ash/common/shelf/shelf_locking_manager.cc +++ b/ash/common/shelf/shelf_locking_manager.cc
@@ -14,7 +14,7 @@ WmShell::Get()->AddLockStateObserver(this); SessionStateDelegate* delegate = WmShell::Get()->GetSessionStateDelegate(); session_locked_ = - delegate->GetSessionState() != SessionStateDelegate::SESSION_STATE_ACTIVE; + delegate->GetSessionState() != session_manager::SessionState::ACTIVE; screen_locked_ = delegate->IsScreenLocked(); delegate->AddSessionStateObserver(this); WmShell::Get()->AddShellObserver(this); @@ -32,8 +32,8 @@ } void ShelfLockingManager::SessionStateChanged( - SessionStateDelegate::SessionState state) { - session_locked_ = state != SessionStateDelegate::SESSION_STATE_ACTIVE; + session_manager::SessionState state) { + session_locked_ = state != session_manager::SessionState::ACTIVE; UpdateLockedState(); }
diff --git a/ash/common/shelf/shelf_locking_manager.h b/ash/common/shelf/shelf_locking_manager.h index bd1ea77c..2bf015e 100644 --- a/ash/common/shelf/shelf_locking_manager.h +++ b/ash/common/shelf/shelf_locking_manager.h
@@ -30,7 +30,7 @@ void OnLockStateChanged(bool locked) override; // SessionStateObserver: - void SessionStateChanged(SessionStateDelegate::SessionState state) override; + void SessionStateChanged(session_manager::SessionState state) override; // LockStateObserver: void OnLockStateEvent(EventType event) override;
diff --git a/ash/common/shelf/shelf_locking_manager_unittest.cc b/ash/common/shelf/shelf_locking_manager_unittest.cc index 05a5569..d225a937 100644 --- a/ash/common/shelf/shelf_locking_manager_unittest.cc +++ b/ash/common/shelf/shelf_locking_manager_unittest.cc
@@ -24,7 +24,7 @@ GetShelfLockingManager()->OnLockStateChanged(locked); } - void SetSessionState(SessionStateDelegate::SessionState state) { + void SetSessionState(session_manager::SessionState state) { GetShelfLockingManager()->SessionStateChanged(state); } @@ -54,14 +54,14 @@ shelf->SetAlignment(SHELF_ALIGNMENT_RIGHT); EXPECT_EQ(SHELF_ALIGNMENT_RIGHT, shelf->GetAlignment()); - SetSessionState(SessionStateDelegate::SESSION_STATE_LOGIN_PRIMARY); + SetSessionState(session_manager::SessionState::LOGIN_PRIMARY); EXPECT_EQ(SHELF_ALIGNMENT_BOTTOM_LOCKED, shelf->GetAlignment()); - SetSessionState(SessionStateDelegate::SESSION_STATE_ACTIVE); + SetSessionState(session_manager::SessionState::ACTIVE); EXPECT_EQ(SHELF_ALIGNMENT_RIGHT, shelf->GetAlignment()); - SetSessionState(SessionStateDelegate::SESSION_STATE_LOGIN_SECONDARY); + SetSessionState(session_manager::SessionState::LOGIN_SECONDARY); EXPECT_EQ(SHELF_ALIGNMENT_BOTTOM_LOCKED, shelf->GetAlignment()); - SetSessionState(SessionStateDelegate::SESSION_STATE_ACTIVE); + SetSessionState(session_manager::SessionState::ACTIVE); EXPECT_EQ(SHELF_ALIGNMENT_RIGHT, shelf->GetAlignment()); }
diff --git a/ash/common/strings/ash_strings_cs.xtb b/ash/common/strings/ash_strings_cs.xtb index 6d464d9..1c6a5cb 100644 --- a/ash/common/strings/ash_strings_cs.xtb +++ b/ash/common/strings/ash_strings_cs.xtb
@@ -64,7 +64,7 @@ <translation id="2844169650293029770">Zařízení USB Type-C (levý přední port)</translation> <translation id="2857608528410806398">Sem patří text oznámení funkce rychlého odemknutí. Sem patří text oznámení funkce rychlého odemknutí. Sem patří text oznámení funkce rychlého odemknutí. Sem patří text oznámení funkce rychlého odemknutí.</translation> <translation id="2872961005593481000">Vypnout</translation> -<translation id="2942516765047364088">Pozice na poličce</translation> +<translation id="2942516765047364088">Pozice poličky</translation> <translation id="2946640296642327832">Zapnout Bluetooth</translation> <translation id="2963773877003373896">mod3</translation> <translation id="2964193600955408481">Vypnout Wi-Fi</translation>
diff --git a/ash/common/strings/ash_strings_de.xtb b/ash/common/strings/ash_strings_de.xtb index c8e42f2..05a3b60 100644 --- a/ash/common/strings/ash_strings_de.xtb +++ b/ash/common/strings/ash_strings_de.xtb
@@ -2,7 +2,7 @@ <!DOCTYPE translationbundle> <translationbundle lang="de"> <translation id="1012876632442809908">USB-C-Gerät (Port vorne)</translation> -<translation id="1013923882670373915">Das Bluetooth-Gerät "<ph name="DEVICE_NAME" />" bittet um Erlaubnis für das Pairing. Geben Sie folgenden PIN-Code auf dem Gerät ein: <ph name="PINCODE" />.</translation> +<translation id="1013923882670373915">Das Bluetooth-Gerät "<ph name="DEVICE_NAME" />" bittet um Erlaubnis für Kopplung. Geben Sie folgenden PIN-Code auf dem Gerät ein: <ph name="PINCODE" />.</translation> <translation id="1021311941847921177">Die Tastenkombination für den Wechsel zur nächsten Eingabemethode hat sich geändert. Bitte drücken Sie <ph name="NEW_SHORTCUT" /> statt <ph name="OLD_SHORTCUT" />.</translation> <translation id="112308213915226829">Ablage automatisch ausblenden</translation> <translation id="1127238861555034875">Lupenmodus</translation> @@ -48,7 +48,7 @@ <translation id="2297568595583585744">Statusleiste</translation> <translation id="2303600792989757991">Fensterübersicht umschalten</translation> <translation id="2391579633712104609">180°</translation> -<translation id="2429753432712299108">Das Bluetooth-Gerät "<ph name="DEVICE_NAME" />" bittet um Erlaubnis für das Pairing. Bevor Sie akzeptieren, überprüfen Sie, ob folgender Zugangscode auf dem Gerät angezeigt wird: <ph name="PASSKEY" />.</translation> +<translation id="2429753432712299108">Das Bluetooth-Gerät "<ph name="DEVICE_NAME" />" bittet um Erlaubnis für Kopplung. Bevor Sie akzeptieren, überprüfen Sie, ob folgender Zugangscode auf dem Gerät angezeigt wird: <ph name="PASSKEY" />.</translation> <translation id="2475982808118771221">Ein Fehler ist aufgetreten.</translation> <translation id="2509468283778169019">Feststelltaste An</translation> <translation id="252373100621549798">Display unbekannt</translation> @@ -120,7 +120,7 @@ <translation id="4321179778687042513">Strg</translation> <translation id="4421231901400348175">Sie teilen sich die Bildschirmsteuerung mit <ph name="HELPER_NAME" /> per Remote-Unterstützung.</translation> <translation id="4430019312045809116">Lautstärke</translation> -<translation id="4527045527269911712">Das Bluetooth-Gerät "<ph name="DEVICE_NAME" />" bittet um Erlaubnis für das Pairing.</translation> +<translation id="4527045527269911712">Das Bluetooth-Gerät "<ph name="DEVICE_NAME" />" bittet um Erlaubnis für Kopplung.</translation> <translation id="453661520163887813">Vollständig geladen in <ph name="TIME" /> h</translation> <translation id="4544944664594876241">Die Tastenkombination zum Sperren des Bildschirms hat sich geändert. Bitte drücken Sie <ph name="NEW_SHORTCUT" /> statt <ph name="OLD_SHORTCUT" />.</translation> <translation id="479989351350248267">Suchen</translation> @@ -187,9 +187,9 @@ <translation id="6550675742724504774">Optionen</translation> <translation id="6585808820553845416">Sitzung endet in <ph name="SESSION_TIME_REMAINING" />.</translation> <translation id="6596816719288285829">IP-Adresse</translation> -<translation id="6650933572246256093">Das Bluetooth-Gerät "<ph name="DEVICE_NAME" />" bittet um Erlaubnis für das Pairing. Geben Sie auf dem Gerät folgenden Zugangscode ein: <ph name="PASSKEY" />.</translation> +<translation id="6650933572246256093">Das Bluetooth-Gerät "<ph name="DEVICE_NAME" />" bittet um Erlaubnis für Kopplung. Geben Sie auf dem Gerät folgenden Zugangscode ein: <ph name="PASSKEY" />.</translation> <translation id="6700713906295497288">IME-Menüschaltfläche</translation> -<translation id="6713285437468012787">Das Pairing für das Bluetooth-Gerät "<ph name="DEVICE_NAME" />" wurde durchgeführt und das Gerät ist nun für alle Nutzer verfügbar. Sie können das Pairing unter "Einstellungen" entfernen.</translation> +<translation id="6713285437468012787">Das Bluetooth-Gerät "<ph name="DEVICE_NAME" />" wurde gekoppelt und ist nun für alle Nutzer verfügbar. Sie können es unter "Einstellungen" wieder entkoppeln.</translation> <translation id="6785414152754474415">Akku ist zu <ph name="PERCENTAGE" /> % geladen und wird geladen.</translation> <translation id="683971173229319003">Suche + L</translation> <translation id="6911468394164995108">Andere Netzwerke...</translation>
diff --git a/ash/common/system/audio/tray_audio_delegate.h b/ash/common/system/audio/tray_audio_delegate.h index 0ae704c..a824ebf 100644 --- a/ash/common/system/audio/tray_audio_delegate.h +++ b/ash/common/system/audio/tray_audio_delegate.h
@@ -5,6 +5,10 @@ #ifndef ASH_COMMON_SYSTEM_AUDIO_TRAY_AUDIO_DELEGATE_H_ #define ASH_COMMON_SYSTEM_AUDIO_TRAY_AUDIO_DELEGATE_H_ +namespace gfx { +struct VectorIcon; +} + namespace ash { namespace system { @@ -26,9 +30,14 @@ // should be muted. virtual int GetOutputDefaultVolumeMuteLevel() = 0; - // Gets the icon to use for the active output device. + // Gets the non-MD icon to use for the active output device. + // TODO(mohsen): Remove this once material design is enabled by default. See + // https://crbug.com/614453. virtual int GetActiveOutputDeviceIconId() = 0; + // Gets the MD icon to use for the active output device. + virtual const gfx::VectorIcon& GetActiveOutputDeviceVectorIcon() = 0; + // Returns the volume level of the output device in the range 0%-100%. virtual int GetOutputVolumeLevel() = 0;
diff --git a/ash/common/system/audio/volume_view.cc b/ash/common/system/audio/volume_view.cc index d0ccda5..3a7b723 100644 --- a/ash/common/system/audio/volume_view.cc +++ b/ash/common/system/audio/volume_view.cc
@@ -21,6 +21,7 @@ #include "ui/gfx/canvas.h" #include "ui/gfx/image/image_skia_operations.h" #include "ui/gfx/paint_vector_icon.h" +#include "ui/gfx/vector_icon_types.h" #include "ui/views/background.h" #include "ui/views/border.h" #include "ui/views/controls/button/image_button.h" @@ -45,6 +46,14 @@ // four are used for ascending volume levels. const int kVolumeLevels = 4; +const gfx::VectorIcon* const kVolumeLevelIcons[] = { + &ash::kSystemMenuVolumeMuteIcon, // Muted. + &ash::kSystemMenuVolumeLowIcon, // Low volume. + &ash::kSystemMenuVolumeMediumIcon, // Medium volume. + &ash::kSystemMenuVolumeHighIcon, // High volume. + &ash::kSystemMenuVolumeHighIcon, // Full volume. +}; + } // namespace namespace ash { @@ -61,8 +70,10 @@ SetFocusPainter(views::Painter::CreateSolidFocusPainter( kFocusBorderColor, gfx::Insets(1, 1, 1, 1))); SetImageAlignment(ALIGN_CENTER, ALIGN_MIDDLE); - image_ = ui::ResourceBundle::GetSharedInstance().GetImageNamed( - IDR_AURA_UBER_TRAY_VOLUME_LEVELS); + if (!MaterialDesignController::IsSystemTrayMenuMaterial()) { + image_ = ui::ResourceBundle::GetSharedInstance().GetImageNamed( + IDR_AURA_UBER_TRAY_VOLUME_LEVELS); + } Update(); } @@ -71,17 +82,26 @@ void Update() { float level = static_cast<float>(audio_delegate_->GetOutputVolumeLevel()) / 100.0f; + int volume_levels = MaterialDesignController::IsSystemTrayMenuMaterial() + ? arraysize(kVolumeLevelIcons) - 1 + : kVolumeLevels; int image_index = audio_delegate_->IsOutputAudioMuted() ? 0 - : (level == 1.0 - ? kVolumeLevels - : std::max(1, int(std::ceil(level * (kVolumeLevels - 1))))); + : (level == 1.0 ? volume_levels + : std::max(1, static_cast<int>(std::ceil( + level * (volume_levels - 1))))); if (image_index != image_index_) { - gfx::Rect region(0, image_index * kVolumeImageHeight, kVolumeImageWidth, - kVolumeImageHeight); - gfx::ImageSkia image_skia = gfx::ImageSkiaOperations::ExtractSubset( - *(image_.ToImageSkia()), region); + gfx::ImageSkia image_skia; + if (MaterialDesignController::IsSystemTrayMenuMaterial()) { + image_skia = gfx::CreateVectorIcon(*kVolumeLevelIcons[image_index], + kMenuIconColor); + } else { + gfx::Rect region(0, image_index * kVolumeImageHeight, kVolumeImageWidth, + kVolumeImageHeight); + image_skia = gfx::ImageSkiaOperations::ExtractSubset( + *(image_.ToImageSkia()), region); + } SetImage(views::CustomButton::STATE_NORMAL, &image_skia); image_index_ = image_index; } @@ -231,20 +251,29 @@ } // Show output device icon if necessary. - int device_icon = audio_delegate_->GetActiveOutputDeviceIconId(); - if (device_icon != system::TrayAudioDelegate::kNoAudioDeviceIcon) { - device_type_->SetVisible(true); - device_type_->SetImage(ui::ResourceBundle::GetSharedInstance() - .GetImageNamed(device_icon) - .ToImageSkia()); - more_region_->SetLayoutManager(new views::BoxLayout( - views::BoxLayout::kHorizontal, 0, 0, kTrayPopupPaddingBetweenItems)); + device_type_->SetVisible(false); + if (MaterialDesignController::IsSystemTrayMenuMaterial()) { + const gfx::VectorIcon& device_icon = + audio_delegate_->GetActiveOutputDeviceVectorIcon(); + if (!device_icon.is_empty()) { + device_type_->SetImage( + gfx::CreateVectorIcon(device_icon, kMenuIconColor)); + device_type_->SetVisible(true); + } } else { - device_type_->SetVisible(false); - more_region_->SetLayoutManager(new views::BoxLayout( - views::BoxLayout::kHorizontal, 0, 0, - kTrayPopupPaddingBetweenItems + kExtraPaddingBetweenBarAndMore)); + int device_icon = audio_delegate_->GetActiveOutputDeviceIconId(); + if (device_icon != system::TrayAudioDelegate::kNoAudioDeviceIcon) { + device_type_->SetImage(ui::ResourceBundle::GetSharedInstance() + .GetImageNamed(device_icon) + .ToImageSkia()); + device_type_->SetVisible(true); + } } + int spacing = kTrayPopupPaddingBetweenItems; + if (!device_type_->visible()) + spacing += kExtraPaddingBetweenBarAndMore; + more_region_->SetLayoutManager( + new views::BoxLayout(views::BoxLayout::kHorizontal, 0, 0, spacing)); more_region_->SetVisible(true); }
diff --git a/ash/common/system/chromeos/audio/tray_audio_delegate_chromeos.cc b/ash/common/system/chromeos/audio/tray_audio_delegate_chromeos.cc index 927c7d9..be1b47b 100644 --- a/ash/common/system/chromeos/audio/tray_audio_delegate_chromeos.cc +++ b/ash/common/system/chromeos/audio/tray_audio_delegate_chromeos.cc
@@ -4,8 +4,10 @@ #include "ash/common/system/chromeos/audio/tray_audio_delegate_chromeos.h" +#include "ash/resources/vector_icons/vector_icons.h" #include "chromeos/audio/cras_audio_handler.h" #include "grit/ash_resources.h" +#include "ui/gfx/paint_vector_icon.h" using chromeos::CrasAudioHandler; @@ -41,6 +43,22 @@ return kNoAudioDeviceIcon; } +const gfx::VectorIcon& +TrayAudioDelegateChromeOs::GetActiveOutputDeviceVectorIcon() { + chromeos::AudioDevice device; + if (CrasAudioHandler::Get()->GetPrimaryActiveOutputDevice(&device)) { + if (device.type == chromeos::AUDIO_TYPE_HEADPHONE) + return kSystemMenuHeadsetIcon; + if (device.type == chromeos::AUDIO_TYPE_USB) + return kSystemMenuUsbIcon; + if (device.type == chromeos::AUDIO_TYPE_BLUETOOTH) + return kSystemMenuBluetoothIcon; + if (device.type == chromeos::AUDIO_TYPE_HDMI) + return kSystemMenuHdmiIcon; + } + return gfx::kNoneIcon; +} + bool TrayAudioDelegateChromeOs::HasAlternativeSources() { CrasAudioHandler* audio_handler = CrasAudioHandler::Get(); return (audio_handler->has_alternative_output() ||
diff --git a/ash/common/system/chromeos/audio/tray_audio_delegate_chromeos.h b/ash/common/system/chromeos/audio/tray_audio_delegate_chromeos.h index 14f5c7d..5b1343c2 100644 --- a/ash/common/system/chromeos/audio/tray_audio_delegate_chromeos.h +++ b/ash/common/system/chromeos/audio/tray_audio_delegate_chromeos.h
@@ -20,6 +20,7 @@ int GetOutputDefaultVolumeMuteLevel() override; int GetOutputVolumeLevel() override; int GetActiveOutputDeviceIconId() override; + const gfx::VectorIcon& GetActiveOutputDeviceVectorIcon() override; bool HasAlternativeSources() override; bool IsOutputAudioMuted() override; void SetOutputAudioIsMuted(bool is_muted) override;
diff --git a/ash/common/system/chromeos/palette/palette_tray.cc b/ash/common/system/chromeos/palette/palette_tray.cc index 4ffe589..31fa8ec 100644 --- a/ash/common/system/chromeos/palette/palette_tray.cc +++ b/ash/common/system/chromeos/palette/palette_tray.cc
@@ -4,6 +4,7 @@ #include "ash/common/system/chromeos/palette/palette_tray.h" +#include "ash/common/session/session_state_delegate.h" #include "ash/common/shelf/shelf_constants.h" #include "ash/common/shelf/wm_shelf.h" #include "ash/common/shelf/wm_shelf_util.h" @@ -76,7 +77,7 @@ WmShell::Get()->GetSessionStateDelegate(); return !session_state_delegate->IsUserSessionBlocked() && session_state_delegate->GetSessionState() == - SessionStateDelegate::SESSION_STATE_ACTIVE && + session_manager::SessionState::ACTIVE && WmShell::Get()->system_tray_delegate()->GetUserLoginStatus() != LoginStatus::KIOSK_APP; } @@ -269,8 +270,7 @@ return bubble_ && bubble_->bubble_view()->GetBoundsInScreen().Contains(point); } -void PaletteTray::SessionStateChanged( - SessionStateDelegate::SessionState state) { +void PaletteTray::SessionStateChanged(session_manager::SessionState state) { UpdateIconVisibility(); }
diff --git a/ash/common/system/chromeos/palette/palette_tray.h b/ash/common/system/chromeos/palette/palette_tray.h index 4805e12..e719ad9 100644 --- a/ash/common/system/chromeos/palette/palette_tray.h +++ b/ash/common/system/chromeos/palette/palette_tray.h
@@ -47,7 +47,7 @@ bool PerformAction(const ui::Event& event) override; // SessionStateObserver: - void SessionStateChanged(SessionStateDelegate::SessionState state) override; + void SessionStateChanged(session_manager::SessionState state) override; // ShellObserver: void OnLockStateChanged(bool locked) override;
diff --git a/ash/common/system/overview/overview_button_tray.cc b/ash/common/system/overview/overview_button_tray.cc index 6727989..f82f80c 100644 --- a/ash/common/system/overview/overview_button_tray.cc +++ b/ash/common/system/overview/overview_button_tray.cc
@@ -78,7 +78,7 @@ } void OverviewButtonTray::SessionStateChanged( - SessionStateDelegate::SessionState state) { + session_manager::SessionState state) { UpdateIconVisibility(); } @@ -145,7 +145,7 @@ session_state_delegate->IsActiveUserSessionStarted() && !session_state_delegate->IsScreenLocked() && session_state_delegate->GetSessionState() == - SessionStateDelegate::SESSION_STATE_ACTIVE && + session_manager::SessionState::ACTIVE && shell->system_tray_delegate()->GetUserLoginStatus() != LoginStatus::KIOSK_APP); }
diff --git a/ash/common/system/overview/overview_button_tray.h b/ash/common/system/overview/overview_button_tray.h index 1654458..314fd643 100644 --- a/ash/common/system/overview/overview_button_tray.h +++ b/ash/common/system/overview/overview_button_tray.h
@@ -37,7 +37,7 @@ bool PerformAction(const ui::Event& event) override; // SessionStateObserver: - void SessionStateChanged(SessionStateDelegate::SessionState state) override; + void SessionStateChanged(session_manager::SessionState state) override; // ShellObserver: void OnMaximizeModeStarted() override;
diff --git a/ash/common/test/test_session_state_delegate.cc b/ash/common/test/test_session_state_delegate.cc index 083350ba..d51511f 100644 --- a/ash/common/test/test_session_state_delegate.cc +++ b/ash/common/test/test_session_state_delegate.cc
@@ -93,7 +93,7 @@ logged_in_users_(1), active_user_index_(0), user_manager_(new TestUserManager()), - session_state_(SESSION_STATE_LOGIN_PRIMARY) { + session_state_(session_manager::SessionState::LOGIN_PRIMARY) { // This is intended to be capitalized. user_list_.push_back(base::MakeUnique<MockUserInfo>("First@tray")); // This is intended to be capitalized. @@ -125,7 +125,7 @@ bool TestSessionStateDelegate::IsActiveUserSessionStarted() const { return user_manager_->IsSessionStarted() && - session_state_ == SESSION_STATE_ACTIVE; + session_state_ == session_manager::SessionState::ACTIVE; } bool TestSessionStateDelegate::CanLockScreen() const { @@ -151,19 +151,20 @@ bool TestSessionStateDelegate::IsUserSessionBlocked() const { return !IsActiveUserSessionStarted() || IsScreenLocked() || - user_adding_screen_running_ || session_state_ != SESSION_STATE_ACTIVE; + user_adding_screen_running_ || + session_state_ != session_manager::SessionState::ACTIVE; } -SessionStateDelegate::SessionState TestSessionStateDelegate::GetSessionState() +session_manager::SessionState TestSessionStateDelegate::GetSessionState() const { return session_state_; } void TestSessionStateDelegate::SetHasActiveUser(bool has_active_user) { if (!has_active_user) { - session_state_ = SESSION_STATE_LOGIN_PRIMARY; + session_state_ = session_manager::SessionState::LOGIN_PRIMARY; } else { - session_state_ = SESSION_STATE_ACTIVE; + session_state_ = session_manager::SessionState::ACTIVE; WmShell::Get()->ShowShelf(); } } @@ -172,11 +173,11 @@ bool active_user_session_started) { if (active_user_session_started) { user_manager_->SessionStarted(); - session_state_ = SESSION_STATE_ACTIVE; + session_state_ = session_manager::SessionState::ACTIVE; WmShell::Get()->CreateShelf(); WmShell::Get()->UpdateAfterLoginStatusChange(LoginStatus::USER); } else { - session_state_ = SESSION_STATE_LOGIN_PRIMARY; + session_state_ = session_manager::SessionState::LOGIN_PRIMARY; user_manager_.reset(new TestUserManager()); } } @@ -198,9 +199,9 @@ bool user_adding_screen_running) { user_adding_screen_running_ = user_adding_screen_running; if (user_adding_screen_running_) - session_state_ = SESSION_STATE_LOGIN_SECONDARY; + session_state_ = session_manager::SessionState::LOGIN_SECONDARY; else - session_state_ = SESSION_STATE_ACTIVE; + session_state_ = session_manager::SessionState::ACTIVE; } void TestSessionStateDelegate::SetUserImage(const gfx::ImageSkia& user_image) {
diff --git a/ash/common/test/test_session_state_delegate.h b/ash/common/test/test_session_state_delegate.h index e825757f..14af1e8 100644 --- a/ash/common/test/test_session_state_delegate.h +++ b/ash/common/test/test_session_state_delegate.h
@@ -26,7 +26,7 @@ ~TestSessionStateDelegate() override; void set_logged_in_users(int users) { logged_in_users_ = users; } - void set_session_state(SessionState session_state) { + void set_session_state(session_manager::SessionState session_state) { session_state_ = session_state; } void AddUser(const AccountId& account_id); @@ -42,7 +42,7 @@ void LockScreen() override; void UnlockScreen() override; bool IsUserSessionBlocked() const override; - SessionState GetSessionState() const override; + session_manager::SessionState GetSessionState() const override; const user_manager::UserInfo* GetUserInfo( ash::UserIndex index) const override; bool ShouldShowAvatar(WmWindow* window) const override; @@ -111,7 +111,7 @@ // The current state of the login screen. |session_state_| becomes active // before the profile and browser UI are available. - SessionState session_state_; + session_manager::SessionState session_state_; DISALLOW_COPY_AND_ASSIGN(TestSessionStateDelegate); };
diff --git a/ash/common/wm/maximize_mode/maximize_mode_event_handler.cc b/ash/common/wm/maximize_mode/maximize_mode_event_handler.cc index b852f526..8edb1d0 100644 --- a/ash/common/wm/maximize_mode/maximize_mode_event_handler.cc +++ b/ash/common/wm/maximize_mode/maximize_mode_event_handler.cc
@@ -33,8 +33,7 @@ WmShell::Get()->GetSessionStateDelegate(); if (delegate->IsScreenLocked() || - delegate->GetSessionState() != - SessionStateDelegate::SESSION_STATE_ACTIVE) { + delegate->GetSessionState() != session_manager::SessionState::ACTIVE) { return false; }
diff --git a/ash/display/display_manager.cc b/ash/display/display_manager.cc index 1d08cacd..50aabb50 100644 --- a/ash/display/display_manager.cc +++ b/ash/display/display_manager.cc
@@ -1409,18 +1409,18 @@ void DisplayManager::NotifyMetricsChanged(const display::Display& display, uint32_t metrics) { - FOR_EACH_OBSERVER(display::DisplayObserver, observers_, - OnDisplayMetricsChanged(display, metrics)); + for (auto& observer : observers_) + observer.OnDisplayMetricsChanged(display, metrics); } void DisplayManager::NotifyDisplayAdded(const display::Display& display) { - FOR_EACH_OBSERVER(display::DisplayObserver, observers_, - OnDisplayAdded(display)); + for (auto& observer : observers_) + observer.OnDisplayAdded(display); } void DisplayManager::NotifyDisplayRemoved(const display::Display& display) { - FOR_EACH_OBSERVER(display::DisplayObserver, observers_, - OnDisplayRemoved(display)); + for (auto& observer : observers_) + observer.OnDisplayRemoved(display); } void DisplayManager::AddObserver(display::DisplayObserver* observer) {
diff --git a/ash/display/screen_orientation_controller_chromeos.cc b/ash/display/screen_orientation_controller_chromeos.cc index 22814367..df403ae6 100644 --- a/ash/display/screen_orientation_controller_chromeos.cc +++ b/ash/display/screen_orientation_controller_chromeos.cc
@@ -132,8 +132,8 @@ rotation_locked_ = rotation_locked; if (!rotation_locked_) rotation_locked_orientation_ = blink::WebScreenOrientationLockAny; - FOR_EACH_OBSERVER(Observer, observers_, - OnRotationLockChanged(rotation_locked_)); + for (auto& observer : observers_) + observer.OnRotationLockChanged(rotation_locked_); if (!display::Display::HasInternalDisplay()) return; base::AutoReset<bool> auto_ignore_display_configuration_updates(
diff --git a/ash/display/window_tree_host_manager.cc b/ash/display/window_tree_host_manager.cc index b7e99ee4..a158d60 100644 --- a/ash/display/window_tree_host_manager.cc +++ b/ash/display/window_tree_host_manager.cc
@@ -253,7 +253,8 @@ } void WindowTreeHostManager::Shutdown() { - FOR_EACH_OBSERVER(Observer, observers_, OnWindowTreeHostManagerShutdown()); + for (auto& observer : observers_) + observer.OnWindowTreeHostManagerShutdown(); // Unset the display manager's delegate here because // DisplayManager outlives WindowTreeHostManager. @@ -309,7 +310,8 @@ } } - FOR_EACH_OBSERVER(Observer, observers_, OnDisplaysInitialized()); + for (auto& observer : observers_) + observer.OnDisplaysInitialized(); } void WindowTreeHostManager::AddObserver(Observer* observer) { @@ -747,7 +749,8 @@ } void WindowTreeHostManager::PreDisplayConfigurationChange(bool clear_focus) { - FOR_EACH_OBSERVER(Observer, observers_, OnDisplayConfigurationChanging()); + for (auto& observer : observers_) + observer.OnDisplayConfigurationChanging(); focus_activation_store_->Store(clear_focus); display::Screen* screen = display::Screen::GetScreen(); gfx::Point point_in_screen = screen->GetCursorScreenPoint(); @@ -792,7 +795,8 @@ ->SetOutputIsSecure(output_is_secure); } - FOR_EACH_OBSERVER(Observer, observers_, OnDisplayConfigurationChanged()); + for (auto& observer : observers_) + observer.OnDisplayConfigurationChanged(); UpdateMouseLocationAfterDisplayChange(); }
diff --git a/ash/first_run/first_run_helper_impl.cc b/ash/first_run/first_run_helper_impl.cc index e472ab54..25a6bee 100644 --- a/ash/first_run/first_run_helper_impl.cc +++ b/ash/first_run/first_run_helper_impl.cc
@@ -62,7 +62,8 @@ } void FirstRunHelperImpl::Cancel() { - FOR_EACH_OBSERVER(Observer, observers(), OnCancelled()); + for (auto& observer : observers()) + observer.OnCancelled(); } bool FirstRunHelperImpl::IsCancelingKeyEvent(ui::KeyEvent* event) {
diff --git a/ash/laser/laser_pointer_controller.cc b/ash/laser/laser_pointer_controller.cc index 35a15d04..ad1a1500 100644 --- a/ash/laser/laser_pointer_controller.cc +++ b/ash/laser/laser_pointer_controller.cc
@@ -73,40 +73,40 @@ event->type() != ui::ET_MOUSE_RELEASED) return; - // Delete the LaserPointerView instance if mouse is released. - if (event->type() == ui::ET_MOUSE_RELEASED) { - stationary_timer_->Stop(); - laser_pointer_view_->Stop(); - laser_pointer_view_.reset(); + aura::Window* current_window = GetCurrentRootWindow(); + if (!current_window) { + DestroyLaserPointerView(); return; } - // This will handle creating the initial laser pointer view on - // ET_MOUSE_PRESSED events. - SwitchTargetRootWindowIfNeeded(GetCurrentRootWindow()); + // Compute the event coordinate relative to the display it is currently on + // (and not the one the event was captured on). + gfx::Point event_location = event->root_location(); + aura::Window* target = static_cast<aura::Window*>(event->target()); + aura::Window* event_root = target->GetRootWindow(); + aura::Window::ConvertPointToTarget(event_root, current_window, + &event_location); - if (laser_pointer_view_) { - // Remap point from where it was captured to the display it is actually on. - gfx::Point event_location = event->root_location(); - aura::Window* target = static_cast<aura::Window*>(event->target()); - aura::Window* event_root = target->GetRootWindow(); - aura::Window::ConvertPointToTarget( - event_root, laser_pointer_view_->GetRootWindow(), &event_location); + // Start a new laser session if the mouse is pressed but not pressed over the + // palette. + if (event->type() == ui::ET_MOUSE_PRESSED && + !PaletteContainsPointInScreen(event_location)) { + DestroyLaserPointerView(); + UpdateLaserPointerView(current_window, event_location, event); + } - current_mouse_location_ = event_location; - laser_pointer_view_->AddNewPoint(current_mouse_location_); + // Do not update laser if it is in the process of fading away. + if (event->type() == ui::ET_MOUSE_DRAGGED && laser_pointer_view_ && + !is_fading_away_) { + UpdateLaserPointerView(current_window, event_location, event); + RestartTimer(); + } - stationary_timer_repeat_count_ = 0; - if (event->type() == ui::ET_MOUSE_DRAGGED) { - // Start the timer to add stationary points if dragged. - if (!stationary_timer_->IsRunning()) - stationary_timer_->Reset(); - } - - // If the stylus is over the palette icon or widget, do not consume the - // event. - if (!PaletteContainsPointInScreen(current_mouse_location_)) - event->StopPropagation(); + if (event->type() == ui::ET_MOUSE_RELEASED && laser_pointer_view_ && + !is_fading_away_) { + is_fading_away_ = true; + UpdateLaserPointerView(current_window, event_location, event); + RestartTimer(); } } @@ -117,8 +117,7 @@ void LaserPointerController::SwitchTargetRootWindowIfNeeded( aura::Window* root_window) { if (!root_window) { - stationary_timer_->Stop(); - laser_pointer_view_.reset(); + DestroyLaserPointerView(); } else if (laser_pointer_view_) { laser_pointer_view_->ReparentWidget(root_window); } else if (enabled_) { @@ -127,13 +126,47 @@ } } -void LaserPointerController::AddStationaryPoint() { +void LaserPointerController::UpdateLaserPointerView( + aura::Window* current_window, + const gfx::Point& event_location, + ui::MouseEvent* event) { + SwitchTargetRootWindowIfNeeded(current_window); + current_mouse_location_ = event_location; laser_pointer_view_->AddNewPoint(current_mouse_location_); + event->StopPropagation(); +} + +void LaserPointerController::DestroyLaserPointerView() { + // |stationary_timer_| should also be stopped so that it does not attempt to + // add points when |laser_pointer_view_| is null. + stationary_timer_->Stop(); + if (laser_pointer_view_) { + is_fading_away_ = false; + laser_pointer_view_.reset(); + } +} + +void LaserPointerController::RestartTimer() { + stationary_timer_repeat_count_ = 0; + if (!stationary_timer_->IsRunning()) + stationary_timer_->Reset(); +} + +void LaserPointerController::AddStationaryPoint() { + if (is_fading_away_) + laser_pointer_view_->UpdateTime(); + else + laser_pointer_view_->AddNewPoint(current_mouse_location_); + // We can stop repeating the timer once the mouse has been stationary for // longer than the life of a point. if (stationary_timer_repeat_count_ * kAddStationaryPointsDelayMs >= kPointLifeDurationMs) { stationary_timer_->Stop(); + // Reset the view if the timer expires and the view was in process of fading + // away. + if (is_fading_away_) + DestroyLaserPointerView(); } stationary_timer_repeat_count_++; }
diff --git a/ash/laser/laser_pointer_controller.h b/ash/laser/laser_pointer_controller.h index 21697ca..13a0914 100644 --- a/ash/laser/laser_pointer_controller.h +++ b/ash/laser/laser_pointer_controller.h
@@ -54,6 +54,18 @@ // allows the trail to fade away when the mouse is stationary. void AddStationaryPoint(); + // Updates |laser_pointer_view_| by changing its root window or creating it if + // needed. Also adds the latest point at |event_location| and stops + // propagation of |event|. + void UpdateLaserPointerView(aura::Window* current_window, + const gfx::Point& event_location, + ui::MouseEvent* event); + + // Destroys |laser_pointer_view_|, if it exists. + void DestroyLaserPointerView(); + + void RestartTimer(); + // Timer which will add a new stationary point when the mouse stops moving. // This will remove points that are too old. std::unique_ptr<base::Timer> stationary_timer_; @@ -61,6 +73,12 @@ bool enabled_ = false; + // |is_fading_away_| determines whether the laser pointer view should accept + // points normally, or just advance the |laser_points_| time so that current + // points start fading away. This should be set to true when the view is about + // to be destroyed, such as when the stylus is released. + bool is_fading_away_ = false; + // The last seen mouse location in screen coordinates. gfx::Point current_mouse_location_;
diff --git a/ash/laser/laser_pointer_controller_test_api.cc b/ash/laser/laser_pointer_controller_test_api.cc index eda09a9..165608a 100644 --- a/ash/laser/laser_pointer_controller_test_api.cc +++ b/ash/laser/laser_pointer_controller_test_api.cc
@@ -24,6 +24,14 @@ return instance_->laser_pointer_view_ != nullptr; } +bool LaserPointerControllerTestApi::IsFadingAway() { + return IsShowingLaserPointer() && instance_->is_fading_away_; +} + +void LaserPointerControllerTestApi::SetIsFadingAway(bool fading_away) { + instance_->is_fading_away_ = fading_away; +} + const LaserPointerPoints& LaserPointerControllerTestApi::laser_points() { return instance_->laser_pointer_view_->laser_points_; }
diff --git a/ash/laser/laser_pointer_controller_test_api.h b/ash/laser/laser_pointer_controller_test_api.h index 6305c76..9d1aa01 100644 --- a/ash/laser/laser_pointer_controller_test_api.h +++ b/ash/laser/laser_pointer_controller_test_api.h
@@ -21,6 +21,8 @@ void SetEnabled(bool enabled); bool IsShowingLaserPointer(); + bool IsFadingAway(); + void SetIsFadingAway(bool fading_away); const LaserPointerPoints& laser_points(); LaserPointerView* laser_pointer_view();
diff --git a/ash/laser/laser_pointer_controller_unittest.cc b/ash/laser/laser_pointer_controller_unittest.cc index 6887803..fd35dc6 100644 --- a/ash/laser/laser_pointer_controller_unittest.cc +++ b/ash/laser/laser_pointer_controller_unittest.cc
@@ -111,23 +111,35 @@ LaserPointerPointsTestApi points_test_api_(&points_); // When a point older than kTestPointsLifetime (5 seconds) is added, it - // should get removed. + // should get removed. The age of the point is a number between 0.0 and 1.0, + // with 0.0 specifying a newly added point and 1.0 specifying the age of a + // point added |kTestPointsLifetime| ago. points_test_api_.MoveForwardInTime(base::TimeDelta::FromSeconds(1)); EXPECT_EQ(1, points_test_api_.GetNumberOfPoints()); + EXPECT_FLOAT_EQ(0.0, points_test_api_.GetPointAtIndex(0).age); + + // Verify when we move forward in time by one second, the age of the last + // point, added one second ago is 1 / |kTestPointsLifetime|. points_test_api_.MoveForwardInTime(base::TimeDelta::FromSeconds(1)); EXPECT_EQ(2, points_test_api_.GetNumberOfPoints()); - + EXPECT_FLOAT_EQ(0.2, points_test_api_.GetPointAtIndex(0).age); + EXPECT_FLOAT_EQ(0.0, points_test_api_.GetPointAtIndex(1).age); // Verify adding a point 10 seconds later will clear all other points, since // they are older than 5 seconds. points_test_api_.MoveForwardInTime(base::TimeDelta::FromSeconds(10)); EXPECT_EQ(1, points_test_api_.GetNumberOfPoints()); // Verify adding 3 points one second apart each will add 3 points to the - // collection, since all 4 poitns are younger than 5 seconds. + // collection, since all 4 points are younger than 5 seconds. All 4 points are + // added 1 second apart so their age should be 0.2 apart. points_test_api_.MoveForwardInTime(base::TimeDelta::FromSeconds(1)); points_test_api_.MoveForwardInTime(base::TimeDelta::FromSeconds(1)); points_test_api_.MoveForwardInTime(base::TimeDelta::FromSeconds(1)); EXPECT_EQ(4, points_test_api_.GetNumberOfPoints()); + EXPECT_FLOAT_EQ(0.6, points_test_api_.GetPointAtIndex(0).age); + EXPECT_FLOAT_EQ(0.4, points_test_api_.GetPointAtIndex(1).age); + EXPECT_FLOAT_EQ(0.2, points_test_api_.GetPointAtIndex(2).age); + EXPECT_FLOAT_EQ(0.0, points_test_api_.GetPointAtIndex(3).age); // Verify adding 1 point three seconds later will remove 2 points which are // older than 5 seconds. @@ -159,9 +171,11 @@ GetEventGenerator().MoveMouseToInHost(gfx::Point(5, 5)); EXPECT_FALSE(controller_test_api_.IsShowingLaserPointer()); - // Verify pressing the stylus will show the laser pointer and add a point. + // Verify pressing the stylus will show the laser pointer and add a point but + // will not activate fading out. GetEventGenerator().PressLeftButton(); EXPECT_TRUE(controller_test_api_.IsShowingLaserPointer()); + EXPECT_FALSE(controller_test_api_.IsFadingAway()); EXPECT_EQ(1, controller_test_api_.laser_points().GetNumberOfPoints()); // Verify dragging the stylus 2 times will add 2 more points. @@ -169,9 +183,11 @@ GetEventGenerator().MoveMouseToInHost(gfx::Point(7, 7)); EXPECT_EQ(3, controller_test_api_.laser_points().GetNumberOfPoints()); - // Verify releasing the stylus hides the laser pointer. + // Verify releasing the stylus still shows the laser pointer, which is fading + // away. GetEventGenerator().ReleaseLeftButton(); - EXPECT_FALSE(controller_test_api_.IsShowingLaserPointer()); + EXPECT_TRUE(controller_test_api_.IsShowingLaserPointer()); + EXPECT_TRUE(controller_test_api_.IsFadingAway()); // Verify that disabling the mode does not display the laser pointer. controller_test_api_.SetEnabled(false); @@ -179,6 +195,7 @@ // Verify that disabling the mode while laser pointer is displayed does not // display the laser pointer. + controller_test_api_.SetIsFadingAway(false); controller_test_api_.SetEnabled(true); GetEventGenerator().PressLeftButton(); GetEventGenerator().MoveMouseToInHost(gfx::Point(6, 6));
diff --git a/ash/laser/laser_pointer_points.cc b/ash/laser/laser_pointer_points.cc index 8f2176e..7ca20966 100644 --- a/ash/laser/laser_pointer_points.cc +++ b/ash/laser/laser_pointer_points.cc
@@ -15,11 +15,31 @@ LaserPointerPoints::~LaserPointerPoints() {} void LaserPointerPoints::AddPoint(const gfx::Point& point) { + MoveForwardToTime(base::Time::Now()); + LaserPoint new_point; new_point.location = point; - new_point.creation_time = base::Time::Now(); points_.push_back(new_point); - ClearOldPoints(); +} + +void LaserPointerPoints::MoveForwardToTime(const base::Time& latest_time) { + if (!points_.empty()) { + DCHECK(!collection_latest_time_.is_null()); + + // Increase the age of points based on how much time has elapsed. + base::TimeDelta delta = latest_time - collection_latest_time_; + double lifespan_change = + delta.InMillisecondsF() / life_duration_.InMillisecondsF(); + for (LaserPoint& point : points_) + point.age += lifespan_change; + + // Remove points that are too old (points age older than 1.0). + auto first_alive_point = + std::find_if(points_.begin(), points_.end(), + [](const LaserPoint& p) { return p.age < 1.0; }); + points_.erase(points_.begin(), first_alive_point); + } + collection_latest_time_ = latest_time; } void LaserPointerPoints::Clear() { @@ -61,14 +81,4 @@ LaserPointerPoints::laser_points() { return points_; } - -void LaserPointerPoints::ClearOldPoints() { - DCHECK(!IsEmpty()); - auto first_alive_point = - std::find_if(points_.begin(), points_.end(), [this](LaserPoint& p) { - return GetNewest().creation_time - p.creation_time < life_duration_; - }); - points_.erase(points_.begin(), first_alive_point); -} - } // namespace ash
diff --git a/ash/laser/laser_pointer_points.h b/ash/laser/laser_pointer_points.h index 19e95c1..69e7413d 100644 --- a/ash/laser/laser_pointer_points.h +++ b/ash/laser/laser_pointer_points.h
@@ -9,6 +9,7 @@ #include <memory> #include "ash/ash_export.h" +#include "base/macros.h" #include "base/time/time.h" #include "ui/gfx/geometry/point.h" #include "ui/gfx/geometry/rect.h" @@ -23,7 +24,9 @@ // Struct to describe each point. struct LaserPoint { gfx::Point location; - base::Time creation_time; + // age is a value between [0,1] where 0 means the point was just added and 1 + // means that the point is just about to be removed. + double age = 0.0; }; // Constructor with a parameter to choose the fade out time of the points in @@ -33,6 +36,9 @@ // Adds a point. Automatically clears points that are too old. void AddPoint(const gfx::Point& point); + // Updates the collection latest time. Automatically clears points that are + // too old. + void MoveForwardToTime(const base::Time& latest_time); // Removes all points. void Clear(); // Gets the bounding box of the points. @@ -51,10 +57,11 @@ private: friend class LaserPointerPointsTestApi; - void ClearOldPoints(); - base::TimeDelta life_duration_; std::deque<LaserPoint> points_; + // The latest time of the collection of points. This gets updated when new + // points are added or when MoveForwardInTime is called. + base::Time collection_latest_time_; DISALLOW_COPY_AND_ASSIGN(LaserPointerPoints); };
diff --git a/ash/laser/laser_pointer_points_test_api.cc b/ash/laser/laser_pointer_points_test_api.cc index 51807311..01d9d55 100644 --- a/ash/laser/laser_pointer_points_test_api.cc +++ b/ash/laser/laser_pointer_points_test_api.cc
@@ -4,13 +4,11 @@ #include "ash/laser/laser_pointer_points_test_api.h" -#include "ash/laser/laser_pointer_points.h" - namespace ash { LaserPointerPointsTestApi::LaserPointerPointsTestApi( LaserPointerPoints* instance) - : new_point_time_(base::Time::Now()), instance_(instance) {} + : instance_(instance) {} LaserPointerPointsTestApi::~LaserPointerPointsTestApi() {} @@ -20,12 +18,17 @@ void LaserPointerPointsTestApi::MoveForwardInTime( const base::TimeDelta& delta) { - for (LaserPointerPoints::LaserPoint& point : instance_->points_) - point.creation_time -= delta; + base::Time new_time = instance_->collection_latest_time_ + delta; + instance_->MoveForwardToTime(new_time); LaserPointerPoints::LaserPoint new_point; - new_point.creation_time = new_point_time_; instance_->points_.push_back(new_point); - instance_->ClearOldPoints(); } + +LaserPointerPoints::LaserPoint LaserPointerPointsTestApi::GetPointAtIndex( + int index) { + DCHECK(index >= 0 && index < GetNumberOfPoints()); + return instance_->points_[index]; +} + } // namespace ash
diff --git a/ash/laser/laser_pointer_points_test_api.h b/ash/laser/laser_pointer_points_test_api.h index d40834d0..a28889fd 100644 --- a/ash/laser/laser_pointer_points_test_api.h +++ b/ash/laser/laser_pointer_points_test_api.h
@@ -5,12 +5,11 @@ #ifndef ASH_LASER_LASER_POINTER_POINTS_TEST_API_H_ #define ASH_LASER_LASER_POINTER_POINTS_TEST_API_H_ +#include "ash/laser/laser_pointer_points.h" #include "base/time/time.h" namespace ash { -class LaserPointerPoints; - // An api for testing the laser_pointer_points class. class LaserPointerPointsTestApi { public: @@ -21,10 +20,9 @@ // Moves existing points back in time by |delta| and adds a new point at // (0,0). void MoveForwardInTime(const base::TimeDelta& delta); + LaserPointerPoints::LaserPoint GetPointAtIndex(int index); private: - // The time the new points are added. - base::Time new_point_time_; LaserPointerPoints* instance_; DISALLOW_COPY_AND_ASSIGN(LaserPointerPointsTestApi);
diff --git a/ash/laser/laser_pointer_view.cc b/ash/laser/laser_pointer_view.cc index 2bfe8da..e8c8a97 100644 --- a/ash/laser/laser_pointer_view.cc +++ b/ash/laser/laser_pointer_view.cc
@@ -87,7 +87,17 @@ void LaserPointerView::AddNewPoint(const gfx::Point& new_point) { laser_points_.AddPoint(new_point); + OnPointsUpdated(); +} +void LaserPointerView::UpdateTime() { + // Do not add the point but advance the time if the view is in process of + // fading away. + laser_points_.MoveForwardToTime(base::Time::Now()); + OnPointsUpdated(); +} + +void LaserPointerView::OnPointsUpdated() { // The bounding box should be relative to the screen. gfx::Point screen_offset = widget_->GetNativeView()->GetRootWindow()->GetBoundsInScreen().origin(); @@ -113,29 +123,25 @@ paint.setAntiAlias(true); paint.setStrokeJoin(SkPaint::kBevel_Join); - base::Time oldest = laser_points_.GetOldest().creation_time; - base::Time newest = laser_points_.GetNewest().creation_time; - gfx::Point previous_point = laser_points_.GetOldest().location; - gfx::Point current_point; - // Compute the offset of the current widget. gfx::Point widget_offset = widget_->GetNativeView()->GetBoundsInRootWindow().origin(); + + gfx::Point previous_point( + (laser_points_.GetOldest().location - widget_offset).x(), + (laser_points_.GetOldest().location - widget_offset).y()); + gfx::Point current_point; + int num_points_ = laser_points_.GetNumberOfPoints(); int point_count = 0; + int current_opacity = 0; for (const LaserPointerPoints::LaserPoint& point : laser_points_.laser_points()) { - // relative_time is a value between [0,1] where 0 means the point is about - // to be removed and 1 means that the point was just added. - double relative_time = 1.0; - if (oldest != newest) { - relative_time = 1.0 - ((point.creation_time - oldest).InMillisecondsF() / - (newest - oldest).InMillisecondsF()); - } - // Set the radius and opacity based on the distance. - double radius = LinearInterpolate(kPointInitialRadius, kPointFinalRadius, - relative_time); + double current_radius = + LinearInterpolate(kPointInitialRadius, kPointFinalRadius, point.age); + current_opacity = int{LinearInterpolate( + double{kPointInitialOpacity}, double{kPointFinalOpacity}, point.age)}; gfx::Vector2d center = point.location - widget_offset; current_point = gfx::Point(center.x(), center.y()); @@ -144,23 +150,20 @@ // the result will be very jagged, unless we are on the last point, then we // draw regardless. point_count++; - float distance_threshold = float{radius * 2}; + float distance_threshold = float{current_radius * 2}; if (DistanceBetweenPoints(previous_point, current_point) <= distance_threshold && point_count != num_points_) { continue; } - int opacity = - int{LinearInterpolate(double{kPointInitialOpacity}, - double{kPointFinalOpacity}, relative_time)}; - paint.setColor(SkColorSetA(kPointColor, opacity)); - paint.setStrokeWidth(radius * 2); + paint.setColor(SkColorSetA(kPointColor, current_opacity)); + paint.setStrokeWidth(current_radius * 2); canvas->DrawLine(previous_point, current_point, paint); previous_point = current_point; } // Draw the last point as a circle. - paint.setColor(SkColorSetA(kPointColor, kPointInitialOpacity)); + paint.setColor(SkColorSetA(kPointColor, current_opacity)); paint.setStyle(SkPaint::kFill_Style); canvas->DrawCircle(current_point, kPointInitialRadius, paint); }
diff --git a/ash/laser/laser_pointer_view.h b/ash/laser/laser_pointer_view.h index 11ff272..d7e1658 100644 --- a/ash/laser/laser_pointer_view.h +++ b/ash/laser/laser_pointer_view.h
@@ -34,7 +34,9 @@ ~LaserPointerView() override; void AddNewPoint(const gfx::Point& new_point); + void UpdateTime(); void Stop(); + aura::Window* GetRootWindow(); // Reparents the widget if needed. @@ -46,6 +48,8 @@ // view::View: void OnPaint(gfx::Canvas* canvas) override; + void OnPointsUpdated(); + LaserPointerPoints laser_points_; std::unique_ptr<views::Widget> widget_;
diff --git a/ash/mus/accelerators/accelerator_controller_delegate_mus.cc b/ash/mus/accelerators/accelerator_controller_delegate_mus.cc index 47588024..39a7f23 100644 --- a/ash/mus/accelerators/accelerator_controller_delegate_mus.cc +++ b/ash/mus/accelerators/accelerator_controller_delegate_mus.cc
@@ -7,6 +7,7 @@ #include "base/logging.h" #include "mash/public/interfaces/launchable.mojom.h" #include "services/ui/public/interfaces/display/display_controller.mojom.h" +#include "services/ui/public/interfaces/display/test_display_controller.mojom.h" namespace ash { namespace mus { @@ -51,30 +52,20 @@ return false; #if defined(OS_CHROMEOS) - case DEV_ADD_REMOVE_DISPLAY: { - display::mojom::DisplayControllerPtr display_controller; - connector_->ConnectToInterface("service:ui", &display_controller); - display_controller->ToggleVirtualDisplay(); + case DEV_ADD_REMOVE_DISPLAY: + case SWAP_PRIMARY_DISPLAY: + case TOUCH_HUD_PROJECTION_TOGGLE: return true; - } case DEV_TOGGLE_UNIFIED_DESKTOP: case LOCK_PRESSED: case LOCK_RELEASED: case POWER_PRESSED: case POWER_RELEASED: - case SWAP_PRIMARY_DISPLAY: case TOGGLE_MIRROR_MODE: case TOUCH_HUD_CLEAR: case TOUCH_HUD_MODE_CHANGE: NOTIMPLEMENTED(); return false; - case TOUCH_HUD_PROJECTION_TOGGLE: { - mash::mojom::LaunchablePtr launchable; - connector_->ConnectToInterface("service:touch_hud", &launchable); - launchable->Launch(mash::mojom::kWindow, - mash::mojom::LaunchMode::DEFAULT); - return true; - } #endif default: @@ -87,14 +78,49 @@ AcceleratorAction action, const ui::Accelerator& accelerator, const ui::Accelerator& previous_accelerator) { +#if defined(OS_CHROMEOS) + switch (action) { + case DEV_ADD_REMOVE_DISPLAY: + case SWAP_PRIMARY_DISPLAY: + case TOUCH_HUD_PROJECTION_TOGGLE: + return true; + default: + break; + } +#endif return false; } void AcceleratorControllerDelegateMus::PerformAction( AcceleratorAction action, const ui::Accelerator& accelerator) { - // Should never be hit as HandlesAction() unconditionally returns false. +#if defined(OS_CHROMEOS) + switch (action) { + case DEV_ADD_REMOVE_DISPLAY: { + display::mojom::TestDisplayControllerPtr test_display_controller; + connector_->ConnectToInterface("service:ui", &test_display_controller); + test_display_controller->ToggleAddRemoveDisplay(); + break; + } + case SWAP_PRIMARY_DISPLAY: { + display::mojom::DisplayControllerPtr display_controller; + connector_->ConnectToInterface("service:ui", &display_controller); + display_controller->SwapPrimaryDisplay(); + break; + } + case TOUCH_HUD_PROJECTION_TOGGLE: { + mash::mojom::LaunchablePtr launchable; + connector_->ConnectToInterface("service:touch_hud", &launchable); + launchable->Launch(mash::mojom::kWindow, + mash::mojom::LaunchMode::DEFAULT); + break; + } + default: + NOTREACHED(); + } +#else NOTREACHED(); +#endif } void AcceleratorControllerDelegateMus::ShowDeprecatedAcceleratorNotification(
diff --git a/ash/mus/bridge/wm_shell_mus.cc b/ash/mus/bridge/wm_shell_mus.cc index ed26084..113524f8 100644 --- a/ash/mus/bridge/wm_shell_mus.cc +++ b/ash/mus/bridge/wm_shell_mus.cc
@@ -75,7 +75,9 @@ screen_locked_ = false; } bool IsUserSessionBlocked() const override { return false; } - SessionState GetSessionState() const override { return SESSION_STATE_ACTIVE; } + session_manager::SessionState GetSessionState() const override { + return session_manager::SessionState::ACTIVE; + } const user_manager::UserInfo* GetUserInfo(UserIndex index) const override { return user_info_.get(); } @@ -380,12 +382,13 @@ } void WmShellMus::OnOverviewModeStarting() { - FOR_EACH_OBSERVER(ShellObserver, *shell_observers(), - OnOverviewModeStarting()); + for (auto& observer : *shell_observers()) + observer.OnOverviewModeStarting(); } void WmShellMus::OnOverviewModeEnded() { - FOR_EACH_OBSERVER(ShellObserver, *shell_observers(), OnOverviewModeEnded()); + for (auto& observer : *shell_observers()) + observer.OnOverviewModeEnded(); } SessionStateDelegate* WmShellMus::GetSessionStateDelegate() { @@ -457,8 +460,8 @@ if (gained_active == lost_active) return; - FOR_EACH_OBSERVER(WmActivationObserver, activation_observers_, - OnWindowActivated(gained_active, lost_active)); + for (auto& observer : activation_observers_) + observer.OnWindowActivated(gained_active, lost_active); } void WmShellMus::OnDidDestroyClient(ui::WindowTreeClient* client) {
diff --git a/ash/mus/bridge/wm_window_mus.cc b/ash/mus/bridge/wm_window_mus.cc index d567d30e..b35cad1 100644 --- a/ash/mus/bridge/wm_window_mus.cc +++ b/ash/mus/bridge/wm_window_mus.cc
@@ -882,10 +882,10 @@ return; snap_children_to_pixel_boundary_ = true; - FOR_EACH_OBSERVER( - WmWindowObserver, observers_, - OnWindowPropertyChanged( - this, WmWindowProperty::SNAP_CHILDREN_TO_PIXEL_BOUNDARY)); + for (auto& observer : observers_) { + observer.OnWindowPropertyChanged( + this, WmWindowProperty::SNAP_CHILDREN_TO_PIXEL_BOUNDARY); + } } void WmWindowMus::SnapToPixelBoundaryIfNecessary() { @@ -942,8 +942,8 @@ wm_params.target = Get(params.target); wm_params.new_parent = Get(params.new_parent); wm_params.old_parent = Get(params.old_parent); - FOR_EACH_OBSERVER(WmWindowObserver, observers_, - OnWindowTreeChanging(this, wm_params)); + for (auto& observer : observers_) + observer.OnWindowTreeChanging(this, wm_params); } void WmWindowMus::OnTreeChanged(const TreeChangeParams& params) { @@ -951,15 +951,15 @@ wm_params.target = Get(params.target); wm_params.new_parent = Get(params.new_parent); wm_params.old_parent = Get(params.old_parent); - FOR_EACH_OBSERVER(WmWindowObserver, observers_, - OnWindowTreeChanged(this, wm_params)); + for (auto& observer : observers_) + observer.OnWindowTreeChanged(this, wm_params); } void WmWindowMus::OnWindowReordered(ui::Window* window, ui::Window* relative_window, ui::mojom::OrderDirection direction) { - FOR_EACH_OBSERVER(WmWindowObserver, observers_, - OnWindowStackingChanged(this)); + for (auto& observer : observers_) + observer.OnWindowStackingChanged(this); } void WmWindowMus::OnWindowSharedPropertyChanged( @@ -972,15 +972,16 @@ return; } if (name == ui::mojom::WindowManager::kWindowTitle_Property) { - FOR_EACH_OBSERVER(WmWindowObserver, observers_, OnWindowTitleChanged(this)); + for (auto& observer : observers_) + observer.OnWindowTitleChanged(this); return; } // Notify WmWindowObserver of certain white-listed property changes. WmWindowProperty wm_property = WmWindowPropertyFromUI(name); if (wm_property != WmWindowProperty::INVALID_PROPERTY) { - FOR_EACH_OBSERVER(WmWindowObserver, observers_, - OnWindowPropertyChanged(this, wm_property)); + for (auto& observer : observers_) + observer.OnWindowPropertyChanged(this, wm_property); return; } @@ -991,39 +992,41 @@ void WmWindowMus::OnWindowBoundsChanged(ui::Window* window, const gfx::Rect& old_bounds, const gfx::Rect& new_bounds) { - FOR_EACH_OBSERVER(WmWindowObserver, observers_, - OnWindowBoundsChanged(this, old_bounds, new_bounds)); + for (auto& observer : observers_) + observer.OnWindowBoundsChanged(this, old_bounds, new_bounds); } void WmWindowMus::OnWindowDestroying(ui::Window* window) { - FOR_EACH_OBSERVER(WmWindowObserver, observers_, OnWindowDestroying(this)); + for (auto& observer : observers_) + observer.OnWindowDestroying(this); } void WmWindowMus::OnWindowDestroyed(ui::Window* window) { - FOR_EACH_OBSERVER(WmWindowObserver, observers_, OnWindowDestroyed(this)); + for (auto& observer : observers_) + observer.OnWindowDestroyed(this); } void WmWindowMus::OnWindowVisibilityChanging(ui::Window* window, bool visible) { DCHECK_EQ(window_, window); - FOR_EACH_OBSERVER(WmWindowObserver, observers_, - OnWindowVisibilityChanging(this, visible)); + for (auto& observer : observers_) + observer.OnWindowVisibilityChanging(this, visible); } void WmWindowMus::OnWindowVisibilityChanged(ui::Window* window, bool visible) { - FOR_EACH_OBSERVER(WmWindowObserver, observers_, - OnWindowVisibilityChanged(Get(window), visible)); + for (auto& observer : observers_) + observer.OnWindowVisibilityChanged(Get(window), visible); } void WmWindowMus::OnTransientChildAdded(ui::Window* window, ui::Window* transient) { - FOR_EACH_OBSERVER(WmTransientWindowObserver, transient_observers_, - OnTransientChildAdded(this, Get(transient))); + for (auto& observer : transient_observers_) + observer.OnTransientChildAdded(this, Get(transient)); } void WmWindowMus::OnTransientChildRemoved(ui::Window* window, ui::Window* transient) { - FOR_EACH_OBSERVER(WmTransientWindowObserver, transient_observers_, - OnTransientChildRemoved(this, Get(transient))); + for (auto& observer : transient_observers_) + observer.OnTransientChildRemoved(this, Get(transient)); } } // namespace mus
diff --git a/ash/mus/keyboard_ui_mus.cc b/ash/mus/keyboard_ui_mus.cc index ade175f..e9d9c20f 100644 --- a/ash/mus/keyboard_ui_mus.cc +++ b/ash/mus/keyboard_ui_mus.cc
@@ -47,8 +47,8 @@ return; is_enabled_ = is_enabled; - FOR_EACH_OBSERVER(KeyboardUIObserver, *observers(), - OnKeyboardEnabledStateChanged(is_enabled)); + for (auto& observer : *observers()) + observer.OnKeyboardEnabledStateChanged(is_enabled); } } // namespace ash
diff --git a/ash/mus/shell_delegate_mus.cc b/ash/mus/shell_delegate_mus.cc index df9d36e..a319cd9 100644 --- a/ash/mus/shell_delegate_mus.cc +++ b/ash/mus/shell_delegate_mus.cc
@@ -58,7 +58,9 @@ screen_locked_ = false; } bool IsUserSessionBlocked() const override { return false; } - SessionState GetSessionState() const override { return SESSION_STATE_ACTIVE; } + session_manager::SessionState GetSessionState() const override { + return session_manager::SessionState::ACTIVE; + } const user_manager::UserInfo* GetUserInfo(UserIndex index) const override { return user_info_.get(); }
diff --git a/ash/mus/window_manager.cc b/ash/mus/window_manager.cc index a03a986e..038db1d 100644 --- a/ash/mus/window_manager.cc +++ b/ash/mus/window_manager.cc
@@ -164,12 +164,11 @@ // TODO: this should be called when logged in. See http://crbug.com/654606. root_window_controller->wm_root_window_controller()->CreateShelf(); - FOR_EACH_OBSERVER(WindowManagerObserver, observers_, - OnRootWindowControllerAdded(root_window_controller)); + for (auto& observer : observers_) + observer.OnRootWindowControllerAdded(root_window_controller); - FOR_EACH_OBSERVER(display::DisplayObserver, - *screen_->display_list()->observers(), - OnDisplayAdded(root_window_controller->display())); + for (auto& observer : *screen_->display_list()->observers()) + observer.OnDisplayAdded(root_window_controller->display()); return root_window_controller; } @@ -199,8 +198,8 @@ // Observers can rely on WmShell from the callback. So notify the observers // before destroying it. - FOR_EACH_OBSERVER(WindowManagerObserver, observers_, - OnWindowTreeClientDestroyed()); + for (auto& observer : observers_) + observer.OnWindowTreeClientDestroyed(); // Primary RootWindowController must be destroyed last. RootWindowController* primary_root_window_controller =
diff --git a/ash/resources/vector_icons/BUILD.gn b/ash/resources/vector_icons/BUILD.gn index 247933f..57fe19c 100644 --- a/ash/resources/vector_icons/BUILD.gn +++ b/ash/resources/vector_icons/BUILD.gn
@@ -70,6 +70,8 @@ "system_menu_computer.icon", "system_menu_gamepad.1x.icon", "system_menu_gamepad.icon", + "system_menu_hdmi.1x.icon", + "system_menu_hdmi.icon", "system_menu_headset.1x.icon", "system_menu_headset.icon", "system_menu_help.1x.icon", @@ -101,8 +103,18 @@ "system_menu_timer.icon", "system_menu_update.1x.icon", "system_menu_update.icon", + "system_menu_usb.1x.icon", + "system_menu_usb.icon", "system_menu_videocam.1x.icon", "system_menu_videocam.icon", + "system_menu_volume_high.1x.icon", + "system_menu_volume_high.icon", + "system_menu_volume_low.1x.icon", + "system_menu_volume_low.icon", + "system_menu_volume_medium.1x.icon", + "system_menu_volume_medium.icon", + "system_menu_volume_mute.1x.icon", + "system_menu_volume_mute.icon", "system_tray_accessibility.1x.icon", "system_tray_accessibility.icon", "system_tray_battery.1x.icon",
diff --git a/ash/resources/vector_icons/system_menu_hdmi.1x.icon b/ash/resources/vector_icons/system_menu_hdmi.1x.icon new file mode 100644 index 0000000..a70e5ef6 --- /dev/null +++ b/ash/resources/vector_icons/system_menu_hdmi.1x.icon
@@ -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. + +CANVAS_DIMENSIONS, 20, +MOVE_TO, 15, 6, +V_LINE_TO, 3.75f, +CUBIC_TO, 15, 2.87f, 14.37f, 2, 13.43f, 2, +H_LINE_TO, 6.57f, +CUBIC_TO, 5.63f, 2, 5, 2.72f, 5, 3.6f, +V_LINE_TO, 6, +H_LINE_TO, 4, +R_V_LINE_TO, 4.8f, +R_LINE_TO, 3, 4.7f, +V_LINE_TO, 18, +R_H_LINE_TO, 6, +R_V_LINE_TO, -2.5f, +R_LINE_TO, 3, -4.7f, +V_LINE_TO, 6, +R_H_LINE_TO, -1, +CLOSE, +R_MOVE_TO, -2, -2, +R_V_LINE_TO, 2, +R_H_LINE_TO, -1, +V_LINE_TO, 5, +R_H_LINE_TO, -1, +R_V_LINE_TO, 1, +H_LINE_TO, 9, +V_LINE_TO, 5, +H_LINE_TO, 8, +R_V_LINE_TO, 1, +H_LINE_TO, 7, +V_LINE_TO, 4, +R_H_LINE_TO, 6, +CLOSE, +END
diff --git a/ash/resources/vector_icons/system_menu_hdmi.icon b/ash/resources/vector_icons/system_menu_hdmi.icon new file mode 100644 index 0000000..c9e2183 --- /dev/null +++ b/ash/resources/vector_icons/system_menu_hdmi.icon
@@ -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. + +CANVAS_DIMENSIONS, 40, +MOVE_TO, 30, 12, +V_LINE_TO, 7.5f, +CUBIC_TO, 30, 5.74f, 28.74f, 4, 26.86f, 4, +H_LINE_TO, 13.14f, +CUBIC_TO, 11.26f, 4, 10, 5.44f, 10, 7.2f, +V_LINE_TO, 12, +H_LINE_TO, 8, +R_V_LINE_TO, 9.6f, +R_LINE_TO, 5, 9.4f, +R_V_LINE_TO, 5, +R_H_LINE_TO, 14, +R_V_LINE_TO, -5, +R_LINE_TO, 5, -9.4f, +V_LINE_TO, 12, +R_H_LINE_TO, -2, +CLOSE, +MOVE_TO, 13, 7, +R_H_LINE_TO, 14, +R_V_LINE_TO, 5, +R_H_LINE_TO, -3.5f, +V_LINE_TO, 8.67f, +R_H_LINE_TO, -1.75f, +V_LINE_TO, 12, +R_H_LINE_TO, -3.5f, +V_LINE_TO, 8.67f, +H_LINE_TO, 16.5f, +V_LINE_TO, 12, +H_LINE_TO, 13, +V_LINE_TO, 7, +CLOSE, +END
diff --git a/ash/resources/vector_icons/system_menu_usb.1x.icon b/ash/resources/vector_icons/system_menu_usb.1x.icon new file mode 100644 index 0000000..d7ceaa62d --- /dev/null +++ b/ash/resources/vector_icons/system_menu_usb.1x.icon
@@ -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. + +CANVAS_DIMENSIONS, 20, +MOVE_TO, 12.54f, 9.55f, +R_H_LINE_TO, 0.74f, +R_V_LINE_TO, 1.51f, +H_LINE_TO, 11, +V_LINE_TO, 5.02f, +R_H_LINE_TO, 1.54f, +LINE_TO, 10.25f, 2, +LINE_TO, 8, 5.02f, +R_H_LINE_TO, 1.5f, +R_V_LINE_TO, 6.04f, +H_LINE_TO, 7.37f, +V_LINE_TO, 9.49f, +R_CUBIC_TO, 0.52f, -0.28f, 0.89f, -0.81f, 0.89f, -1.46f, +R_CUBIC_TO, 0, -0.91f, -0.73f, -1.66f, -1.63f, -1.66f, +R_CUBIC_TO, -0.89f, 0, -1.63f, 0.75f, -1.63f, 1.66f, +R_CUBIC_TO, 0, 0.64f, 0.37f, 1.18f, 0.89f, 1.46f, +R_V_LINE_TO, 1.56f, +R_CUBIC_TO, 0, 0.84f, 0.54f, 1.44f, 1.36f, 1.44f, +H_LINE_TO, 9.5f, +V_LINE_TO, 15, +R_CUBIC_TO, -0.52f, 0.28f, -0.8f, 0.7f, -0.8f, 1.34f, +R_CUBIC_TO, 0, 0.92f, 0.73f, 1.66f, 1.63f, 1.66f, +R_CUBIC_TO, 0.9f, 0, 1.63f, -0.74f, 1.63f, -1.66f, +R_CUBIC_TO, 0, -0.64f, -0.42f, -1.06f, -0.95f, -1.34f, +R_V_LINE_TO, -2.5f, +R_H_LINE_TO, 2.28f, +R_CUBIC_TO, 0.82f, 0, 1.48f, -0.61f, 1.48f, -1.44f, +R_V_LINE_TO, -1.51f, +R_H_LINE_TO, 0.74f, +R_V_LINE_TO, -3.02f, +R_H_LINE_TO, -2.96f, +R_V_LINE_TO, 3.02f, +CLOSE, +END
diff --git a/ash/resources/vector_icons/system_menu_usb.icon b/ash/resources/vector_icons/system_menu_usb.icon new file mode 100644 index 0000000..2ca56a8 --- /dev/null +++ b/ash/resources/vector_icons/system_menu_usb.icon
@@ -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. + +CANVAS_DIMENSIONS, 40, +MOVE_TO, 25.09f, 19.09f, +R_H_LINE_TO, 1.48f, +R_V_LINE_TO, 3.02f, +H_LINE_TO, 22, +V_LINE_TO, 10.04f, +R_H_LINE_TO, 3.09f, +LINE_TO, 20.5f, 4, +LINE_TO, 16, 10.04f, +R_H_LINE_TO, 3, +R_V_LINE_TO, 12.08f, +R_H_LINE_TO, -4.27f, +V_LINE_TO, 18.99f, +R_CUBIC_TO, 1.04f, -0.56f, 1.78f, -1.63f, 1.78f, -2.91f, +R_CUBIC_TO, 0, -1.83f, -1.46f, -3.32f, -3.25f, -3.32f, +R_CUBIC_TO, -1.79f, 0, -3.25f, 1.49f, -3.25f, 3.32f, +R_CUBIC_TO, 0, 1.28f, 0.74f, 2.36f, 1.78f, 2.91f, +R_V_LINE_TO, 3.12f, +CUBIC_TO, 11.78f, 23.79f, 12.86f, 25, 14.5f, 25, +H_LINE_TO, 19, +R_V_LINE_TO, 5, +R_CUBIC_TO, -1.05f, 0.56f, -1.61f, 1.4f, -1.61f, 2.68f, +R_CUBIC_TO, 0, 1.84f, 1.46f, 3.32f, 3.25f, 3.32f, +R_CUBIC_TO, 1.79f, 0, 3.25f, -1.48f, 3.25f, -3.32f, +R_CUBIC_TO, 0, -1.28f, -0.85f, -2.12f, -1.9f, -2.68f, +R_V_LINE_TO, -5, +R_H_LINE_TO, 4.56f, +R_CUBIC_TO, 1.64f, 0, 2.96f, -1.21f, 2.96f, -2.89f, +R_V_LINE_TO, -3.02f, +H_LINE_TO, 31, +R_V_LINE_TO, -6.04f, +R_H_LINE_TO, -5.91f, +R_V_LINE_TO, 6.04f, +CLOSE, +END
diff --git a/ash/resources/vector_icons/system_menu_volume_high.1x.icon b/ash/resources/vector_icons/system_menu_volume_high.1x.icon new file mode 100644 index 0000000..1144ee66 --- /dev/null +++ b/ash/resources/vector_icons/system_menu_volume_high.1x.icon
@@ -0,0 +1,27 @@ +// 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. + +CANVAS_DIMENSIONS, 20, +MOVE_TO, 2, 13, +R_H_LINE_TO, 3.47f, +LINE_TO, 10, 17, +V_LINE_TO, 3, +LINE_TO, 5.47f, 7, +H_LINE_TO, 2, +R_V_LINE_TO, 6, +CLOSE, +R_MOVE_TO, 9, -6.5f, +R_V_LINE_TO, 7, +R_CUBIC_TO, 1.78f, -0.63f, 2.5f, -2.5f, 2.5f, -3.5f, +R_CUBIC_TO, 0, -1, -0.72f, -2.86f, -2.5f, -3.5f, +CLOSE, +R_MOVE_TO, 0, -2.24f, +R_CUBIC_TO, 2.48f, 0.74f, 4.5f, 3.03f, 4.5f, 5.74f, +R_CUBIC_TO, 0, 2.71f, -2.02f, 5, -4.5f, 5.74f, +V_LINE_TO, 17.5f, +R_CUBIC_TO, 3.44f, -0.78f, 6, -3.84f, 6, -7.5f, +R_CUBIC_TO, 0, -3.66f, -2.56f, -6.72f, -6, -7.5f, +R_V_LINE_TO, 1.76f, +CLOSE, +END
diff --git a/ash/resources/vector_icons/system_menu_volume_high.icon b/ash/resources/vector_icons/system_menu_volume_high.icon new file mode 100644 index 0000000..c4d53f0a4 --- /dev/null +++ b/ash/resources/vector_icons/system_menu_volume_high.icon
@@ -0,0 +1,27 @@ +// 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. + +CANVAS_DIMENSIONS, 40, +MOVE_TO, 5, 25, +R_H_LINE_TO, 6.5f, +R_LINE_TO, 8.5f, 9, +V_LINE_TO, 6, +R_LINE_TO, -8.5f, 9, +H_LINE_TO, 5, +R_V_LINE_TO, 10, +CLOSE, +R_MOVE_TO, 22, -4.99f, +R_CUBIC_TO, 0, -3.08f, -1.63f, -5.72f, -4, -7.01f, +R_V_LINE_TO, 14, +R_CUBIC_TO, 2.37f, -1.27f, 4, -3.91f, 4, -6.99f, +CLOSE, +MOVE_TO, 23, 8.52f, +R_CUBIC_TO, 4.95f, 1.47f, 8.57f, 6.06f, 8.57f, 11.48f, +R_CUBIC_TO, 0, 5.42f, -3.62f, 10.01f, -8.57f, 11.48f, +V_LINE_TO, 35, +R_CUBIC_TO, 6.87f, -1.56f, 12, -7.68f, 12, -15, +CUBIC_TO_SHORTHAND, 29.87f, 6.56f, 23, 5, +R_V_LINE_TO, 3.52f, +CLOSE, +END
diff --git a/ash/resources/vector_icons/system_menu_volume_low.1x.icon b/ash/resources/vector_icons/system_menu_volume_low.1x.icon new file mode 100644 index 0000000..f886c6d --- /dev/null +++ b/ash/resources/vector_icons/system_menu_volume_low.1x.icon
@@ -0,0 +1,13 @@ +// 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. + +CANVAS_DIMENSIONS, 20, +MOVE_TO, 2, 13, +R_H_LINE_TO, 3.47f, +LINE_TO, 10, 17, +V_LINE_TO, 3, +LINE_TO, 5.47f, 7, +H_LINE_TO, 2, +CLOSE, +END
diff --git a/ash/resources/vector_icons/system_menu_volume_low.icon b/ash/resources/vector_icons/system_menu_volume_low.icon new file mode 100644 index 0000000..f37f4d5 --- /dev/null +++ b/ash/resources/vector_icons/system_menu_volume_low.icon
@@ -0,0 +1,13 @@ +// 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. + +CANVAS_DIMENSIONS, 40, +MOVE_TO, 5, 15, +R_V_LINE_TO, 10, +R_H_LINE_TO, 6.5f, +R_LINE_TO, 8.5f, 9, +V_LINE_TO, 6, +R_LINE_TO, -8.5f, 9, +CLOSE, +END
diff --git a/ash/resources/vector_icons/system_menu_volume_medium.1x.icon b/ash/resources/vector_icons/system_menu_volume_medium.1x.icon new file mode 100644 index 0000000..fead053 --- /dev/null +++ b/ash/resources/vector_icons/system_menu_volume_medium.1x.icon
@@ -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. + +CANVAS_DIMENSIONS, 20, +MOVE_TO, 2, 13, +R_H_LINE_TO, 3.47f, +LINE_TO, 10, 17, +V_LINE_TO, 3, +LINE_TO, 5.47f, 7, +H_LINE_TO, 2, +R_V_LINE_TO, 6, +CLOSE, +R_MOVE_TO, 9, -6.5f, +R_V_LINE_TO, 7, +R_CUBIC_TO, 1.78f, -0.63f, 2.5f, -2.5f, 2.5f, -3.5f, +R_CUBIC_TO, 0, -1, -0.72f, -2.86f, -2.5f, -3.5f, +CLOSE, +END
diff --git a/ash/resources/vector_icons/system_menu_volume_medium.icon b/ash/resources/vector_icons/system_menu_volume_medium.icon new file mode 100644 index 0000000..47f4f965 --- /dev/null +++ b/ash/resources/vector_icons/system_menu_volume_medium.icon
@@ -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. + +CANVAS_DIMENSIONS, 40, +MOVE_TO, 28, 21.01f, +R_CUBIC_TO, 0, -3.08f, -2.04f, -5.72f, -5, -7.01f, +R_V_LINE_TO, 14, +R_CUBIC_TO, 2.96f, -1.27f, 5, -3.91f, 5, -6.99f, +CLOSE, +MOVE_TO, 5, 25, +R_H_LINE_TO, 6.55f, +LINE_TO, 20, 34, +V_LINE_TO, 6, +R_LINE_TO, -8.45f, 9, +H_LINE_TO, 5, +R_V_LINE_TO, 10, +CLOSE, +END
diff --git a/ash/resources/vector_icons/system_menu_volume_mute.1x.icon b/ash/resources/vector_icons/system_menu_volume_mute.1x.icon new file mode 100644 index 0000000..a3019c62 --- /dev/null +++ b/ash/resources/vector_icons/system_menu_volume_mute.1x.icon
@@ -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. + +CANVAS_DIMENSIONS, 20, +MOVE_TO, 13.73f, 9.96f, +R_CUBIC_TO, 0, -1.62f, -1.11f, -3.01f, -2.73f, -3.69f, +V_LINE_TO, 8.29f, +R_LINE_TO, 2.68f, 2.24f, +R_CUBIC_TO, 0.03f, -0.18f, 0.05f, -0.37f, 0.05f, -0.58f, +CLOSE, +R_MOVE_TO, 1.95f, 2.4f, +R_LINE_TO, 1.38f, 1.37f, +R_CUBIC_TO, 0.6f, -1.12f, 0.94f, -2.4f, 0.94f, -3.77f, +CUBIC_TO, 18, 6.08f, 14.67f, 2.83f, 11, 2, +R_V_LINE_TO, 2, +R_CUBIC_TO, 2.64f, 0.78f, 5.5f, 3.09f, 5.5f, 5.96f, +R_CUBIC_TO, 0, 0.85f, -0.51f, 1.65f, -0.82f, 2.4f, +CLOSE, +MOVE_TO, 2, 3.13f, +LINE_TO, 5.5f, 7, +H_LINE_TO, 2, +R_V_LINE_TO, 6, +R_H_LINE_TO, 3.5f, +R_LINE_TO, 4.5f, 4.11f, +R_V_LINE_TO, -5.98f, +R_LINE_TO, 3.78f, 3.78f, +CUBIC_TO, 13.18f, 15.37f, 12.5f, 16, 11, 16, +R_V_LINE_TO, 2, +R_CUBIC_TO, 1.5f, 0, 3.12f, -1.06f, 4.06f, -1.82f, +LINE_TO, 16.87f, 18, +LINE_TO, 18, 16.87f, +R_LINE_TO, -8, -8, +LINE_TO, 3.13f, 2, +LINE_TO, 2, 3.13f, +CLOSE, +R_MOVE_TO, 8, -0.24f, +LINE_TO, 8.14f, 4.75f, +LINE_TO, 10, 6.6f, +V_LINE_TO, 2.89f, +CLOSE, +END
diff --git a/ash/resources/vector_icons/system_menu_volume_mute.icon b/ash/resources/vector_icons/system_menu_volume_mute.icon new file mode 100644 index 0000000..7467f11 --- /dev/null +++ b/ash/resources/vector_icons/system_menu_volume_mute.icon
@@ -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. + +CANVAS_DIMENSIONS, 40, +MOVE_TO, 27, 19.92f, +R_CUBIC_TO, 0, -3.04f, -1.63f, -5.65f, -4, -6.92f, +R_V_LINE_TO, 3.79f, +LINE_TO, 26.92f, 21, +R_CUBIC_TO, 0.05f, -0.34f, 0.08f, -0.7f, 0.08f, -1.08f, +CLOSE, +R_MOVE_TO, 3.65f, 4.51f, +LINE_TO, 33.23f, 27, +CUBIC_TO, 34.37f, 24.89f, 35, 22.49f, 35, 19.93f, +CUBIC_TO, 35, 12.65f, 29.87f, 6.55f, 23, 5, +R_V_LINE_TO, 3.51f, +R_CUBIC_TO, 4.95f, 1.46f, 8.57f, 6.03f, 8.57f, 11.43f, +R_CUBIC_TO, 0, 1.6f, -0.34f, 3.1f, -0.92f, 4.5f, +CLOSE, +MOVE_TO, 5, 7.12f, +LINE_TO, 12.88f, 15, +H_LINE_TO, 5, +R_V_LINE_TO, 10, +R_H_LINE_TO, 6.5f, +R_LINE_TO, 8.5f, 8.33f, +V_LINE_TO, 22.12f, +R_LINE_TO, 7.08f, 7.08f, +CUBIC_TO, 25.97f, 30.07f, 25.5f, 30.5f, 23, 31, +R_V_LINE_TO, 4, +R_CUBIC_TO, 2.5f, 0, 4.72f, -1.98f, 6.48f, -3.42f, +R_LINE_TO, 3.4f, 3.42f, +LINE_TO, 35, 32.88f, +R_LINE_TO, -15, -15, +LINE_TO, 7.12f, 5, +LINE_TO, 5, 7.12f, +CLOSE, +R_MOVE_TO, 15, -0.45f, +R_LINE_TO, -3.48f, 3.48f, +LINE_TO, 20, 13.63f, +V_LINE_TO, 6.67f, +CLOSE, +END
diff --git a/ash/shell.cc b/ash/shell.cc index 0d798bc..a5d27a9 100644 --- a/ash/shell.cc +++ b/ash/shell.cc
@@ -270,8 +270,8 @@ } void Shell::OnLoginStateChanged(LoginStatus status) { - FOR_EACH_OBSERVER(ShellObserver, *wm_shell_->shell_observers(), - OnLoginStateChanged(status)); + for (auto& observer : *wm_shell_->shell_observers()) + observer.OnLoginStateChanged(status); } void Shell::OnLoginUserProfilePrepared() { @@ -280,13 +280,13 @@ } void Shell::OnAppTerminating() { - FOR_EACH_OBSERVER(ShellObserver, *wm_shell_->shell_observers(), - OnAppTerminating()); + for (auto& observer : *wm_shell_->shell_observers()) + observer.OnAppTerminating(); } void Shell::OnLockStateChanged(bool locked) { - FOR_EACH_OBSERVER(ShellObserver, *wm_shell_->shell_observers(), - OnLockStateChanged(locked)); + for (auto& observer : *wm_shell_->shell_observers()) + observer.OnLockStateChanged(locked); #ifndef NDEBUG // Make sure that there is no system modal in Lock layer when unlocked. if (!locked) { @@ -301,14 +301,14 @@ void Shell::OnCastingSessionStartedOrStopped(bool started) { #if defined(OS_CHROMEOS) - FOR_EACH_OBSERVER(ShellObserver, *wm_shell_->shell_observers(), - OnCastingSessionStartedOrStopped(started)); + for (auto& observer : *wm_shell_->shell_observers()) + observer.OnCastingSessionStartedOrStopped(started); #endif } void Shell::OnRootWindowAdded(WmWindow* root_window) { - FOR_EACH_OBSERVER(ShellObserver, *wm_shell_->shell_observers(), - OnRootWindowAdded(root_window)); + for (auto& observer : *wm_shell_->shell_observers()) + observer.OnRootWindowAdded(root_window); } void Shell::CreateKeyboard() { @@ -364,8 +364,8 @@ return; is_touch_hud_projection_enabled_ = enabled; - FOR_EACH_OBSERVER(ShellObserver, *wm_shell_->shell_observers(), - OnTouchHudProjectionToggled(enabled)); + for (auto& observer : *wm_shell_->shell_observers()) + observer.OnTouchHudProjectionToggled(enabled); } #if defined(OS_CHROMEOS) @@ -828,8 +828,8 @@ // is started. display_manager_->CreateMirrorWindowAsyncIfAny(); - FOR_EACH_OBSERVER(ShellObserver, *wm_shell_->shell_observers(), - OnShellInitialized()); + for (auto& observer : *wm_shell_->shell_observers()) + observer.OnShellInitialized(); user_metrics_recorder_->OnShellInitialized(); }
diff --git a/ash/shell/shell_delegate_impl.cc b/ash/shell/shell_delegate_impl.cc index 509fd3d..461ea42 100644 --- a/ash/shell/shell_delegate_impl.cc +++ b/ash/shell/shell_delegate_impl.cc
@@ -137,10 +137,11 @@ bool IsUserSessionBlocked() const override { return !IsActiveUserSessionStarted() || IsScreenLocked(); } - SessionState GetSessionState() const override { + session_manager::SessionState GetSessionState() const override { // Assume that if session is not active we're at login. - return IsActiveUserSessionStarted() ? SESSION_STATE_ACTIVE - : SESSION_STATE_LOGIN_PRIMARY; + return IsActiveUserSessionStarted() + ? session_manager::SessionState::ACTIVE + : session_manager::SessionState::LOGIN_PRIMARY; } const user_manager::UserInfo* GetUserInfo(UserIndex index) const override { return user_info_.get();
diff --git a/ash/test/ash_test_base.cc b/ash/test/ash_test_base.cc index 786e9d3..df39b261 100644 --- a/ash/test/ash_test_base.cc +++ b/ash/test/ash_test_base.cc
@@ -319,7 +319,7 @@ void AshTestBase::SetSessionStarting() { AshTestHelper::GetTestSessionStateDelegate()->set_session_state( - SessionStateDelegate::SESSION_STATE_ACTIVE); + session_manager::SessionState::ACTIVE); } void AshTestBase::SetUserLoggedIn(bool user_logged_in) {
diff --git a/ash/wm/video_detector.cc b/ash/wm/video_detector.cc index 777f36f6..356bbd3 100644 --- a/ash/wm/video_detector.cc +++ b/ash/wm/video_detector.cc
@@ -191,7 +191,8 @@ if (state_ != new_state) { state_ = new_state; - FOR_EACH_OBSERVER(Observer, observers_, OnVideoStateChanged(state_)); + for (auto& observer : observers_) + observer.OnVideoStateChanged(state_); } }
diff --git a/base/BUILD.gn b/base/BUILD.gn index 154c068..1c47b51 100644 --- a/base/BUILD.gn +++ b/base/BUILD.gn
@@ -263,6 +263,13 @@ "cpu.h", "critical_closure.h", "critical_closure_internal_ios.mm", + + # This file depends on files from the "debug/allocator" target, + # but this target does not depend on "debug/allocator". + "debug/activity_analyzer.cc", + "debug/activity_analyzer.h", + "debug/activity_tracker.cc", + "debug/activity_tracker.h", "debug/alias.cc", "debug/alias.h", "debug/asan_invalid_access.cc", @@ -279,22 +286,12 @@ "debug/dump_without_crashing.h", "debug/gdi_debug_util_win.cc", "debug/gdi_debug_util_win.h", - - # This file depends on files from the "debug/allocator" target, - # but this target does not depend on "debug/allocator" (see - # allocator.gyp for details). - "debug/activity_analyzer.cc", - "debug/activity_analyzer.h", - "debug/activity_tracker.cc", - "debug/activity_tracker.h", "debug/leak_annotations.h", "debug/leak_tracker.h", "debug/proc_maps_linux.cc", "debug/proc_maps_linux.h", "debug/profiler.cc", "debug/profiler.h", - "debug/scoped_thread_heap_usage.cc", - "debug/scoped_thread_heap_usage.h", "debug/stack_trace.cc", "debug/stack_trace.h", "debug/stack_trace_android.cc", @@ -302,6 +299,8 @@ "debug/stack_trace_win.cc", "debug/task_annotator.cc", "debug/task_annotator.h", + "debug/thread_heap_usage_tracker.cc", + "debug/thread_heap_usage_tracker.h", "deferred_sequenced_task_runner.cc", "deferred_sequenced_task_runner.h", "environment.cc", @@ -1782,9 +1781,9 @@ "debug/debugger_unittest.cc", "debug/leak_tracker_unittest.cc", "debug/proc_maps_linux_unittest.cc", - "debug/scoped_thread_heap_usage_unittest.cc", "debug/stack_trace_unittest.cc", "debug/task_annotator_unittest.cc", + "debug/thread_heap_usage_tracker_unittest.cc", "deferred_sequenced_task_runner_unittest.cc", "environment_unittest.cc", "feature_list_unittest.cc",
diff --git a/base/debug/scoped_thread_heap_usage.h b/base/debug/scoped_thread_heap_usage.h deleted file mode 100644 index a843fc9..0000000 --- a/base/debug/scoped_thread_heap_usage.h +++ /dev/null
@@ -1,103 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef BASE_DEBUG_SCOPED_THREAD_HEAP_USAGE_H_ -#define BASE_DEBUG_SCOPED_THREAD_HEAP_USAGE_H_ - -#include <stdint.h> - -#include "base/allocator/features.h" -#include "base/base_export.h" -#include "base/threading/thread_checker.h" - -namespace base { -namespace allocator { -struct AllocatorDispatch; -} // namespace allocator - -namespace debug { - -// By keeping a tally on heap operations, it's possible to track: -// - the number of alloc/free operations, where a realloc is zero or one -// of each, depending on the input parameters (see man realloc). -// - the number of bytes allocated/freed. -// - the number of estimated bytes of heap overhead used. -// - the high-watermark amount of bytes allocated in the scope. -// This in turn allows measuring the memory usage and memory usage churn over -// a scope. Scopes must be cleanly nested, and each scope must be -// destroyed on the thread where it's created. -// -// Note that this depends on the capabilities of the underlying heap shim. If -// that shim can not yield a size estimate for an allocation, it's not possible -// to keep track of overhead, freed bytes and the allocation high water mark. -class BASE_EXPORT ScopedThreadHeapUsage { - public: - struct ThreadAllocatorUsage { - // The cumulative number of allocation operations. - uint64_t alloc_ops; - - // The cumulative number of allocated bytes. Where available, this is - // inclusive heap padding and estimated or actual heap overhead. - uint64_t alloc_bytes; - - // Where available, cumulative number of heap padding heap - // and overhead bytes. - uint64_t alloc_overhead_bytes; - - // The cumulative number of free operations. - uint64_t free_ops; - - // The cumulative number of bytes freed. - // Only recorded if the underlying heap shim can return the size of an - // allocation. - uint64_t free_bytes; - - // The maximal value of alloc_bytes - free_bytes seen for this thread. - // Only recorded if the underlying heap shim supports returning the size of - // an allocation. - uint64_t max_allocated_bytes; - }; - - ScopedThreadHeapUsage(); - ~ScopedThreadHeapUsage(); - - const ThreadAllocatorUsage& usage_at_creation() const { - return usage_at_creation_; - } - - // Returns this thread's allocator usage from the creation of the innermost - // enclosing ScopedThreadHeapUsage instance, if any. Note that this is - // inclusive allocator usage in all inner scopes. - static ThreadAllocatorUsage CurrentUsage(); - - // Initializes the TLS machinery this class uses. Must be called before - // creating instances of this class. - static void Initialize(); - - // Enables the heap intercept. May only be called once, and only if the heap - // shim is available, e.g. if BUILDFLAG(USE_EXPERIMENTAL_ALLOCATOR_SHIM) is - // true. - static void EnableHeapTracking(); - - protected: - // Exposed for testing only - note that it's safe to re-EnableHeapTracking() - // after calling this function in tests. - static void DisableHeapTrackingForTesting(); - - // Exposed to allow testing the shim without inserting it in the allocator - // shim chain. - static base::allocator::AllocatorDispatch* GetDispatchForTesting(); - - private: - static void EnsureTLSInitialized(); - - ThreadChecker thread_checker_; - // The allocator usage captured at creation of this instance. - ThreadAllocatorUsage usage_at_creation_; -}; - -} // namespace debug -} // namespace base - -#endif // BASE_DEBUG_SCOPED_THREAD_HEAP_USAGE_H_ \ No newline at end of file
diff --git a/base/debug/scoped_thread_heap_usage_unittest.cc b/base/debug/scoped_thread_heap_usage_unittest.cc deleted file mode 100644 index da66a32..0000000 --- a/base/debug/scoped_thread_heap_usage_unittest.cc +++ /dev/null
@@ -1,487 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "base/debug/scoped_thread_heap_usage.h" - -#include <map> - -#include "base/allocator/allocator_shim.h" -#include "base/allocator/features.h" -#include "testing/gtest/include/gtest/gtest.h" - -namespace base { -namespace debug { - -namespace { - -class TestingScopedThreadHeapUsage : public ScopedThreadHeapUsage { - public: - using ScopedThreadHeapUsage::DisableHeapTrackingForTesting; - using ScopedThreadHeapUsage::GetDispatchForTesting; -}; - -// A fixture class that allows testing the AllocatorDispatch associated with -// the ScopedThreadHeapUsage class in isolation against a mocked underlying -// heap implementation. -class ScopedThreadHeapUsageTest : public testing::Test { - public: - using AllocatorDispatch = base::allocator::AllocatorDispatch; - - static const size_t kAllocationPadding; - enum SizeFunctionKind { - EXACT_SIZE_FUNCTION, - PADDING_SIZE_FUNCTION, - ZERO_SIZE_FUNCTION, - }; - - ScopedThreadHeapUsageTest() : size_function_kind_(EXACT_SIZE_FUNCTION) { - EXPECT_EQ(nullptr, g_self); - g_self = this; - } - - ~ScopedThreadHeapUsageTest() override { - EXPECT_EQ(this, g_self); - g_self = nullptr; - } - - void set_size_function_kind(SizeFunctionKind kind) { - size_function_kind_ = kind; - } - - void SetUp() override { - ScopedThreadHeapUsage::Initialize(); - - dispatch_under_test_ = - TestingScopedThreadHeapUsage::GetDispatchForTesting(); - ASSERT_EQ(nullptr, dispatch_under_test_->next); - - dispatch_under_test_->next = &g_mock_dispatch; - } - - void TearDown() override { - ASSERT_EQ(&g_mock_dispatch, dispatch_under_test_->next); - - dispatch_under_test_->next = nullptr; - } - - void* MockMalloc(size_t size) { - return dispatch_under_test_->alloc_function(dispatch_under_test_, size); - } - - void* MockCalloc(size_t n, size_t size) { - return dispatch_under_test_->alloc_zero_initialized_function( - dispatch_under_test_, n, size); - } - - void* MockAllocAligned(size_t alignment, size_t size) { - return dispatch_under_test_->alloc_aligned_function(dispatch_under_test_, - alignment, size); - } - - void* MockRealloc(void* address, size_t size) { - return dispatch_under_test_->realloc_function(dispatch_under_test_, address, - size); - } - - void MockFree(void* address) { - dispatch_under_test_->free_function(dispatch_under_test_, address); - } - - size_t MockGetSizeEstimate(void* address) { - return dispatch_under_test_->get_size_estimate_function( - dispatch_under_test_, address); - } - - private: - void RecordAlloc(void* address, size_t size) { - if (address != nullptr) - allocation_size_map_[address] = size; - } - - void DeleteAlloc(void* address) { - if (address != nullptr) - EXPECT_EQ(1U, allocation_size_map_.erase(address)); - } - - size_t GetSizeEstimate(void* address) { - auto it = allocation_size_map_.find(address); - if (it == allocation_size_map_.end()) - return 0; - - size_t ret = it->second; - switch (size_function_kind_) { - case EXACT_SIZE_FUNCTION: - break; - case PADDING_SIZE_FUNCTION: - ret += kAllocationPadding; - break; - case ZERO_SIZE_FUNCTION: - ret = 0; - break; - } - - return ret; - } - - static void* OnAllocFn(const AllocatorDispatch* self, size_t size) { - EXPECT_EQ(&g_mock_dispatch, self); - - void* ret = malloc(size); - g_self->RecordAlloc(ret, size); - return ret; - } - - static void* OnAllocZeroInitializedFn(const AllocatorDispatch* self, - size_t n, - size_t size) { - EXPECT_EQ(&g_mock_dispatch, self); - - void* ret = calloc(n, size); - g_self->RecordAlloc(ret, n * size); - return ret; - } - - static void* OnAllocAlignedFn(const AllocatorDispatch* self, - size_t alignment, - size_t size) { - EXPECT_EQ(&g_mock_dispatch, self); - - // This is a cheat as it doesn't return aligned allocations. This has the - // advantage of working for all platforms for this test. - void* ret = malloc(size); - g_self->RecordAlloc(ret, size); - return ret; - } - - static void* OnReallocFn(const AllocatorDispatch* self, - void* address, - size_t size) { - EXPECT_EQ(&g_mock_dispatch, self); - - g_self->DeleteAlloc(address); - void* ret = realloc(address, size); - g_self->RecordAlloc(ret, size); - return ret; - } - - static void OnFreeFn(const AllocatorDispatch* self, void* address) { - EXPECT_EQ(&g_mock_dispatch, self); - - g_self->DeleteAlloc(address); - free(address); - } - - static size_t OnGetSizeEstimateFn(const AllocatorDispatch* self, - void* address) { - EXPECT_EQ(&g_mock_dispatch, self); - - return g_self->GetSizeEstimate(address); - } - - using AllocationSizeMap = std::map<void*, size_t>; - - SizeFunctionKind size_function_kind_; - AllocationSizeMap allocation_size_map_; - AllocatorDispatch* dispatch_under_test_; - - static base::allocator::AllocatorDispatch g_mock_dispatch; - static ScopedThreadHeapUsageTest* g_self; -}; - -const size_t ScopedThreadHeapUsageTest::kAllocationPadding = 23; - -ScopedThreadHeapUsageTest* ScopedThreadHeapUsageTest::g_self = nullptr; - -base::allocator::AllocatorDispatch ScopedThreadHeapUsageTest::g_mock_dispatch = - { - &ScopedThreadHeapUsageTest::OnAllocFn, // alloc_function - &ScopedThreadHeapUsageTest:: - OnAllocZeroInitializedFn, // alloc_zero_initialized_function - &ScopedThreadHeapUsageTest::OnAllocAlignedFn, // alloc_aligned_function - &ScopedThreadHeapUsageTest::OnReallocFn, // realloc_function - &ScopedThreadHeapUsageTest::OnFreeFn, // free_function - &ScopedThreadHeapUsageTest:: - OnGetSizeEstimateFn, // get_size_estimate_function - nullptr, // next -}; - -} // namespace - -TEST_F(ScopedThreadHeapUsageTest, SimpleUsageWithExactSizeFunction) { - set_size_function_kind(EXACT_SIZE_FUNCTION); - - ScopedThreadHeapUsage scoped_usage; - - ScopedThreadHeapUsage::ThreadAllocatorUsage u1 = - ScopedThreadHeapUsage::CurrentUsage(); - - EXPECT_EQ(0U, u1.alloc_ops); - EXPECT_EQ(0U, u1.alloc_bytes); - EXPECT_EQ(0U, u1.alloc_overhead_bytes); - EXPECT_EQ(0U, u1.free_ops); - EXPECT_EQ(0U, u1.free_bytes); - EXPECT_EQ(0U, u1.max_allocated_bytes); - - const size_t kAllocSize = 1029U; - void* ptr = MockMalloc(kAllocSize); - MockFree(ptr); - - ScopedThreadHeapUsage::ThreadAllocatorUsage u2 = - ScopedThreadHeapUsage::CurrentUsage(); - - EXPECT_EQ(1U, u2.alloc_ops); - EXPECT_EQ(kAllocSize, u2.alloc_bytes); - EXPECT_EQ(0U, u2.alloc_overhead_bytes); - EXPECT_EQ(1U, u2.free_ops); - EXPECT_EQ(kAllocSize, u2.free_bytes); - EXPECT_EQ(kAllocSize, u2.max_allocated_bytes); -} - -TEST_F(ScopedThreadHeapUsageTest, SimpleUsageWithPaddingSizeFunction) { - set_size_function_kind(PADDING_SIZE_FUNCTION); - - ScopedThreadHeapUsage scoped_usage; - - ScopedThreadHeapUsage::ThreadAllocatorUsage u1 = - ScopedThreadHeapUsage::CurrentUsage(); - - EXPECT_EQ(0U, u1.alloc_ops); - EXPECT_EQ(0U, u1.alloc_bytes); - EXPECT_EQ(0U, u1.alloc_overhead_bytes); - EXPECT_EQ(0U, u1.free_ops); - EXPECT_EQ(0U, u1.free_bytes); - EXPECT_EQ(0U, u1.max_allocated_bytes); - - const size_t kAllocSize = 1029U; - void* ptr = MockMalloc(kAllocSize); - MockFree(ptr); - - ScopedThreadHeapUsage::ThreadAllocatorUsage u2 = - ScopedThreadHeapUsage::CurrentUsage(); - - EXPECT_EQ(1U, u2.alloc_ops); - EXPECT_EQ(kAllocSize + kAllocationPadding, u2.alloc_bytes); - EXPECT_EQ(kAllocationPadding, u2.alloc_overhead_bytes); - EXPECT_EQ(1U, u2.free_ops); - EXPECT_EQ(kAllocSize + kAllocationPadding, u2.free_bytes); - EXPECT_EQ(kAllocSize + kAllocationPadding, u2.max_allocated_bytes); -} - -TEST_F(ScopedThreadHeapUsageTest, SimpleUsageWithZeroSizeFunction) { - set_size_function_kind(ZERO_SIZE_FUNCTION); - - ScopedThreadHeapUsage scoped_usage; - - ScopedThreadHeapUsage::ThreadAllocatorUsage u1 = - ScopedThreadHeapUsage::CurrentUsage(); - EXPECT_EQ(0U, u1.alloc_ops); - EXPECT_EQ(0U, u1.alloc_bytes); - EXPECT_EQ(0U, u1.alloc_overhead_bytes); - EXPECT_EQ(0U, u1.free_ops); - EXPECT_EQ(0U, u1.free_bytes); - EXPECT_EQ(0U, u1.max_allocated_bytes); - - const size_t kAllocSize = 1029U; - void* ptr = MockMalloc(kAllocSize); - MockFree(ptr); - - ScopedThreadHeapUsage::ThreadAllocatorUsage u2 = - ScopedThreadHeapUsage::CurrentUsage(); - - // With a get-size function that returns zero, there's no way to get the size - // of an allocation that's being freed, hence the shim can't tally freed bytes - // nor the high-watermark allocated bytes. - EXPECT_EQ(1U, u2.alloc_ops); - EXPECT_EQ(kAllocSize, u2.alloc_bytes); - EXPECT_EQ(0U, u2.alloc_overhead_bytes); - EXPECT_EQ(1U, u2.free_ops); - EXPECT_EQ(0U, u2.free_bytes); - EXPECT_EQ(0U, u2.max_allocated_bytes); -} - -TEST_F(ScopedThreadHeapUsageTest, ReallocCorrectlyTallied) { - const size_t kAllocSize = 237U; - - { - ScopedThreadHeapUsage scoped_usage; - - // Reallocating nullptr should count as a single alloc. - void* ptr = MockRealloc(nullptr, kAllocSize); - ScopedThreadHeapUsage::ThreadAllocatorUsage usage = - ScopedThreadHeapUsage::CurrentUsage(); - EXPECT_EQ(1U, usage.alloc_ops); - EXPECT_EQ(kAllocSize, usage.alloc_bytes); - EXPECT_EQ(0U, usage.alloc_overhead_bytes); - EXPECT_EQ(0U, usage.free_ops); - EXPECT_EQ(0U, usage.free_bytes); - EXPECT_EQ(kAllocSize, usage.max_allocated_bytes); - - // Reallocating a valid pointer to a zero size should count as a single - // free. - ptr = MockRealloc(ptr, 0U); - - usage = ScopedThreadHeapUsage::CurrentUsage(); - EXPECT_EQ(1U, usage.alloc_ops); - EXPECT_EQ(kAllocSize, usage.alloc_bytes); - EXPECT_EQ(0U, usage.alloc_overhead_bytes); - EXPECT_EQ(1U, usage.free_ops); - EXPECT_EQ(kAllocSize, usage.free_bytes); - EXPECT_EQ(kAllocSize, usage.max_allocated_bytes); - - // Realloc to zero size may or may not return a nullptr - make sure to - // free the zero-size alloc in the latter case. - if (ptr != nullptr) - MockFree(ptr); - } - - { - ScopedThreadHeapUsage scoped_usage; - - void* ptr = MockMalloc(kAllocSize); - ScopedThreadHeapUsage::ThreadAllocatorUsage usage = - ScopedThreadHeapUsage::CurrentUsage(); - EXPECT_EQ(1U, usage.alloc_ops); - - // Now try reallocating a valid pointer to a larger size, this should count - // as one free and one alloc. - const size_t kLargerAllocSize = kAllocSize + 928U; - ptr = MockRealloc(ptr, kLargerAllocSize); - - usage = ScopedThreadHeapUsage::CurrentUsage(); - EXPECT_EQ(2U, usage.alloc_ops); - EXPECT_EQ(kAllocSize + kLargerAllocSize, usage.alloc_bytes); - EXPECT_EQ(0U, usage.alloc_overhead_bytes); - EXPECT_EQ(1U, usage.free_ops); - EXPECT_EQ(kAllocSize, usage.free_bytes); - EXPECT_EQ(kLargerAllocSize, usage.max_allocated_bytes); - - MockFree(ptr); - } -} - -TEST_F(ScopedThreadHeapUsageTest, NestedMaxWorks) { - ScopedThreadHeapUsage outer_scoped_usage; - - const size_t kOuterAllocSize = 1029U; - void* ptr = MockMalloc(kOuterAllocSize); - MockFree(ptr); - - EXPECT_EQ(kOuterAllocSize, - ScopedThreadHeapUsage::CurrentUsage().max_allocated_bytes); - - { - ScopedThreadHeapUsage inner_scoped_usage; - - const size_t kInnerAllocSize = 673U; - ptr = MockMalloc(kInnerAllocSize); - MockFree(ptr); - - EXPECT_EQ(kInnerAllocSize, - ScopedThreadHeapUsage::CurrentUsage().max_allocated_bytes); - } - - // The greater, outer allocation size should have been restored. - EXPECT_EQ(kOuterAllocSize, - ScopedThreadHeapUsage::CurrentUsage().max_allocated_bytes); - - const size_t kLargerInnerAllocSize = kOuterAllocSize + 673U; - { - ScopedThreadHeapUsage inner_scoped_usage; - - ptr = MockMalloc(kLargerInnerAllocSize); - MockFree(ptr); - - EXPECT_EQ(kLargerInnerAllocSize, - ScopedThreadHeapUsage::CurrentUsage().max_allocated_bytes); - } - - // The greater, inner allocation size should have been preserved. - EXPECT_EQ(kLargerInnerAllocSize, - ScopedThreadHeapUsage::CurrentUsage().max_allocated_bytes); - - // Now try the case with an outstanding net alloc size when entering the - // inner scope. - void* outer_ptr = MockMalloc(kOuterAllocSize); - EXPECT_EQ(kLargerInnerAllocSize, - ScopedThreadHeapUsage::CurrentUsage().max_allocated_bytes); - { - ScopedThreadHeapUsage inner_scoped_usage; - - ptr = MockMalloc(kLargerInnerAllocSize); - MockFree(ptr); - - EXPECT_EQ(kLargerInnerAllocSize, - ScopedThreadHeapUsage::CurrentUsage().max_allocated_bytes); - } - - // While the inner scope saw only the inner net outstanding allocation size, - // the outer scope saw both outstanding at the same time. - EXPECT_EQ(kOuterAllocSize + kLargerInnerAllocSize, - ScopedThreadHeapUsage::CurrentUsage().max_allocated_bytes); - - MockFree(outer_ptr); -} - -TEST_F(ScopedThreadHeapUsageTest, AllShimFunctionsAreProvided) { - const size_t kAllocSize = 100; - void* alloc = MockMalloc(kAllocSize); - size_t estimate = MockGetSizeEstimate(alloc); - ASSERT_TRUE(estimate == 0 || estimate >= kAllocSize); - MockFree(alloc); - - alloc = MockCalloc(kAllocSize, 1); - estimate = MockGetSizeEstimate(alloc); - ASSERT_TRUE(estimate == 0 || estimate >= kAllocSize); - MockFree(alloc); - - alloc = MockAllocAligned(1, kAllocSize); - estimate = MockGetSizeEstimate(alloc); - ASSERT_TRUE(estimate == 0 || estimate >= kAllocSize); - - alloc = MockRealloc(alloc, kAllocSize); - estimate = MockGetSizeEstimate(alloc); - ASSERT_TRUE(estimate == 0 || estimate >= kAllocSize); - MockFree(alloc); -} - -#if BUILDFLAG(USE_EXPERIMENTAL_ALLOCATOR_SHIM) -TEST(ScopedThreadHeapShimTest, HooksIntoMallocWhenShimAvailable) { - ScopedThreadHeapUsage::Initialize(); - ScopedThreadHeapUsage::EnableHeapTracking(); - - const size_t kAllocSize = 9993; - // This test verifies that the scoped heap data is affected by malloc & - // free only when the shim is available. - ScopedThreadHeapUsage scoped_usage; - - ScopedThreadHeapUsage::ThreadAllocatorUsage u1 = - ScopedThreadHeapUsage::CurrentUsage(); - void* ptr = malloc(kAllocSize); - // Prevent the compiler from optimizing out the malloc/free pair. - ASSERT_NE(nullptr, ptr); - - ScopedThreadHeapUsage::ThreadAllocatorUsage u2 = - ScopedThreadHeapUsage::CurrentUsage(); - free(ptr); - ScopedThreadHeapUsage::ThreadAllocatorUsage u3 = - ScopedThreadHeapUsage::CurrentUsage(); - - // Verify that at least one allocation operation was recorded, and that free - // operations are at least monotonically growing. - EXPECT_LE(0U, u1.alloc_ops); - EXPECT_LE(u1.alloc_ops + 1, u2.alloc_ops); - EXPECT_LE(u1.alloc_ops + 1, u3.alloc_ops); - - // Verify that at least the bytes above were recorded. - EXPECT_LE(u1.alloc_bytes + kAllocSize, u2.alloc_bytes); - - // Verify that at least the one free operation above was recorded. - EXPECT_LE(u2.free_ops + 1, u3.free_ops); - - TestingScopedThreadHeapUsage::DisableHeapTrackingForTesting(); -} -#endif // BUILDFLAG(USE_EXPERIMENTAL_ALLOCATOR_SHIM) - -} // namespace debug -} // namespace base
diff --git a/base/debug/scoped_thread_heap_usage.cc b/base/debug/thread_heap_usage_tracker.cc similarity index 61% rename from base/debug/scoped_thread_heap_usage.cc rename to base/debug/thread_heap_usage_tracker.cc index 2f5ed8c..b9018e0 100644 --- a/base/debug/scoped_thread_heap_usage.cc +++ b/base/debug/thread_heap_usage_tracker.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "base/debug/scoped_thread_heap_usage.h" +#include "base/debug/thread_heap_usage_tracker.h" #include <stdint.h> #include <algorithm> @@ -29,14 +29,14 @@ ThreadLocalStorage::StaticSlot g_thread_allocator_usage = TLS_INITIALIZER; -ScopedThreadHeapUsage::ThreadAllocatorUsage* const kInitializingSentinel = - reinterpret_cast<ScopedThreadHeapUsage::ThreadAllocatorUsage*>(-1); +ThreadHeapUsage* const kInitializingSentinel = + reinterpret_cast<ThreadHeapUsage*>(-1); bool g_heap_tracking_enabled = false; // Forward declared as it needs to delegate memory allocation to the next // lower shim. -ScopedThreadHeapUsage::ThreadAllocatorUsage* GetOrCreateThreadUsage(); +ThreadHeapUsage* GetOrCreateThreadUsage(); size_t GetAllocSizeEstimate(const AllocatorDispatch* next, void* ptr) { if (ptr == nullptr) @@ -46,28 +46,32 @@ } void RecordAlloc(const AllocatorDispatch* next, void* ptr, size_t size) { - ScopedThreadHeapUsage::ThreadAllocatorUsage* usage = GetOrCreateThreadUsage(); + ThreadHeapUsage* usage = GetOrCreateThreadUsage(); if (usage == nullptr) return; usage->alloc_ops++; size_t estimate = GetAllocSizeEstimate(next, ptr); if (size && estimate) { + // Only keep track of the net number of bytes allocated in the scope if the + // size estimate function returns sane values, e.g. non-zero. usage->alloc_bytes += estimate; usage->alloc_overhead_bytes += estimate - size; - // Only keep track of the net number of bytes allocated in the scope if the - // size estimate function returns sane values, e.g. non-zero. - uint64_t allocated_bytes = usage->alloc_bytes - usage->free_bytes; - if (allocated_bytes > usage->max_allocated_bytes) - usage->max_allocated_bytes = allocated_bytes; + // Record the max outstanding number of bytes, but only if the difference + // is net positive (e.g. more bytes allocated than freed in the scope). + if (usage->alloc_bytes > usage->free_bytes) { + uint64_t allocated_bytes = usage->alloc_bytes - usage->free_bytes; + if (allocated_bytes > usage->max_allocated_bytes) + usage->max_allocated_bytes = allocated_bytes; + } } else { usage->alloc_bytes += size; } } void RecordFree(const AllocatorDispatch* next, void* ptr) { - ScopedThreadHeapUsage::ThreadAllocatorUsage* usage = GetOrCreateThreadUsage(); + ThreadHeapUsage* usage = GetOrCreateThreadUsage(); if (usage == nullptr) return; @@ -130,10 +134,9 @@ &AllocFn, &AllocZeroInitializedFn, &AllocAlignedFn, &ReallocFn, &FreeFn, &GetSizeEstimateFn, nullptr}; -ScopedThreadHeapUsage::ThreadAllocatorUsage* GetOrCreateThreadUsage() { - ScopedThreadHeapUsage::ThreadAllocatorUsage* allocator_usage = - static_cast<ScopedThreadHeapUsage::ThreadAllocatorUsage*>( - g_thread_allocator_usage.Get()); +ThreadHeapUsage* GetOrCreateThreadUsage() { + ThreadHeapUsage* allocator_usage = + static_cast<ThreadHeapUsage*>(g_thread_allocator_usage.Get()); if (allocator_usage == kInitializingSentinel) return nullptr; // Re-entrancy case. @@ -141,7 +144,7 @@ // Prevent reentrancy due to the allocation below. g_thread_allocator_usage.Set(kInitializingSentinel); - allocator_usage = new ScopedThreadHeapUsage::ThreadAllocatorUsage; + allocator_usage = new ThreadHeapUsage; memset(allocator_usage, 0, sizeof(*allocator_usage)); g_thread_allocator_usage.Set(allocator_usage); } @@ -151,61 +154,75 @@ } // namespace -ScopedThreadHeapUsage::ScopedThreadHeapUsage() { - // Initialize must be called before creating instances of this class. - CHECK(g_thread_allocator_usage.initialized()); +ThreadHeapUsageTracker::ThreadHeapUsageTracker() : thread_usage_(nullptr) { + static_assert(std::is_pod<ThreadHeapUsage>::value, "Must be POD."); +} - ThreadAllocatorUsage* usage = GetOrCreateThreadUsage(); - usage_at_creation_ = *usage; +ThreadHeapUsageTracker::~ThreadHeapUsageTracker() { + DCHECK(thread_checker_.CalledOnValidThread()); + + if (thread_usage_ != nullptr) { + // If this tracker wasn't stopped, make it inclusive so that the + // usage isn't lost. + Stop(false); + } +} + +void ThreadHeapUsageTracker::Start() { + DCHECK(thread_checker_.CalledOnValidThread()); + DCHECK(g_thread_allocator_usage.initialized()); + + thread_usage_ = GetOrCreateThreadUsage(); + usage_ = *thread_usage_; // Reset the stats for our current scope. // The per-thread usage instance now tracks this scope's usage, while this // instance persists the outer scope's usage stats. On destruction, this - // instance will restore the outer scope's usage stats with this scope's usage - // added. - memset(usage, 0, sizeof(*usage)); - - static_assert(std::is_pod<ThreadAllocatorUsage>::value, "Must be POD."); + // instance will restore the outer scope's usage stats with this scope's + // usage added. + memset(thread_usage_, 0, sizeof(*thread_usage_)); } -ScopedThreadHeapUsage::~ScopedThreadHeapUsage() { +void ThreadHeapUsageTracker::Stop(bool usage_is_exclusive) { DCHECK(thread_checker_.CalledOnValidThread()); + DCHECK_NE(nullptr, thread_usage_); - ThreadAllocatorUsage* usage = GetOrCreateThreadUsage(); + ThreadHeapUsage current = *thread_usage_; + if (usage_is_exclusive) { + // Restore the outer scope. + *thread_usage_ = usage_; + } else { + // Update the outer scope with the accrued inner usage. + if (thread_usage_->max_allocated_bytes) { + uint64_t outer_net_alloc_bytes = usage_.alloc_bytes - usage_.free_bytes; - // Update the outer max. - if (usage->max_allocated_bytes) { - uint64_t outer_net_alloc_bytes = - usage_at_creation_.alloc_bytes - usage_at_creation_.free_bytes; + thread_usage_->max_allocated_bytes = + std::max(usage_.max_allocated_bytes, + outer_net_alloc_bytes + thread_usage_->max_allocated_bytes); + } - usage->max_allocated_bytes = - std::max(usage_at_creation_.max_allocated_bytes, - outer_net_alloc_bytes + usage->max_allocated_bytes); + thread_usage_->alloc_ops += usage_.alloc_ops; + thread_usage_->alloc_bytes += usage_.alloc_bytes; + thread_usage_->alloc_overhead_bytes += usage_.alloc_overhead_bytes; + thread_usage_->free_ops += usage_.free_ops; + thread_usage_->free_bytes += usage_.free_bytes; } - usage->alloc_ops += usage_at_creation_.alloc_ops; - usage->alloc_bytes += usage_at_creation_.alloc_bytes; - usage->alloc_overhead_bytes += usage_at_creation_.alloc_overhead_bytes; - usage->free_ops += usage_at_creation_.free_ops; - usage->free_bytes += usage_at_creation_.free_bytes; + thread_usage_ = nullptr; + usage_ = current; } -ScopedThreadHeapUsage::ThreadAllocatorUsage -ScopedThreadHeapUsage::CurrentUsage() { - ThreadAllocatorUsage* usage = GetOrCreateThreadUsage(); +ThreadHeapUsage ThreadHeapUsageTracker::GetUsageSnapshot() { + DCHECK(g_thread_allocator_usage.initialized()); + + ThreadHeapUsage* usage = GetOrCreateThreadUsage(); + DCHECK_NE(nullptr, usage); return *usage; } -void ScopedThreadHeapUsage::Initialize() { - if (!g_thread_allocator_usage.initialized()) { - g_thread_allocator_usage.Initialize([](void* allocator_usage) { - delete static_cast<ScopedThreadHeapUsage::ThreadAllocatorUsage*>( - allocator_usage); - }); - } -} +void ThreadHeapUsageTracker::EnableHeapTracking() { + EnsureTLSInitialized(); -void ScopedThreadHeapUsage::EnableHeapTracking() { CHECK_EQ(false, g_heap_tracking_enabled) << "No double-enabling."; g_heap_tracking_enabled = true; #if BUILDFLAG(USE_EXPERIMENTAL_ALLOCATOR_SHIM) @@ -215,7 +232,11 @@ #endif // BUILDFLAG(USE_EXPERIMENTAL_ALLOCATOR_SHIM) } -void ScopedThreadHeapUsage::DisableHeapTrackingForTesting() { +bool ThreadHeapUsageTracker::IsHeapTrackingEnabled() { + return g_heap_tracking_enabled; +} + +void ThreadHeapUsageTracker::DisableHeapTrackingForTesting() { #if BUILDFLAG(USE_EXPERIMENTAL_ALLOCATOR_SHIM) base::allocator::RemoveAllocatorDispatchForTesting(&allocator_dispatch); #else @@ -226,9 +247,17 @@ } base::allocator::AllocatorDispatch* -ScopedThreadHeapUsage::GetDispatchForTesting() { +ThreadHeapUsageTracker::GetDispatchForTesting() { return &allocator_dispatch; } +void ThreadHeapUsageTracker::EnsureTLSInitialized() { + if (!g_thread_allocator_usage.initialized()) { + g_thread_allocator_usage.Initialize([](void* allocator_usage) { + delete static_cast<ThreadHeapUsage*>(allocator_usage); + }); + } +} + } // namespace debug } // namespace base
diff --git a/base/debug/thread_heap_usage_tracker.h b/base/debug/thread_heap_usage_tracker.h new file mode 100644 index 0000000..508a0a3 --- /dev/null +++ b/base/debug/thread_heap_usage_tracker.h
@@ -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. + +#ifndef BASE_DEBUG_THREAD_HEAP_USAGE_TRACKER_H_ +#define BASE_DEBUG_THREAD_HEAP_USAGE_TRACKER_H_ + +#include <stdint.h> + +#include "base/allocator/features.h" +#include "base/base_export.h" +#include "base/threading/thread_checker.h" + +namespace base { +namespace allocator { +struct AllocatorDispatch; +} // namespace allocator + +namespace debug { + +// Used to store the heap allocator usage in a scope. +struct ThreadHeapUsage { + // The cumulative number of allocation operations. + uint64_t alloc_ops; + + // The cumulative number of allocated bytes. Where available, this is + // inclusive heap padding and estimated or actual heap overhead. + uint64_t alloc_bytes; + + // Where available, cumulative number of heap padding and overhead bytes. + uint64_t alloc_overhead_bytes; + + // The cumulative number of free operations. + uint64_t free_ops; + + // The cumulative number of bytes freed. + // Only recorded if the underlying heap shim can return the size of an + // allocation. + uint64_t free_bytes; + + // The maximal value of |alloc_bytes| - |free_bytes| seen for this thread. + // Only recorded if the underlying heap shim supports returning the size of + // an allocation. + uint64_t max_allocated_bytes; +}; + +// By keeping a tally on heap operations, it's possible to track: +// - the number of alloc/free operations, where a realloc is zero or one +// of each, depending on the input parameters (see man realloc). +// - the number of bytes allocated/freed. +// - the number of estimated bytes of heap overhead used. +// - the high-watermark amount of bytes allocated in the scope. +// This in turn allows measuring the memory usage and memory usage churn over +// a scope. Scopes must be cleanly nested, and each scope must be +// destroyed on the thread where it's created. +// +// Note that this depends on the capabilities of the underlying heap shim. If +// that shim can not yield a size estimate for an allocation, it's not possible +// to keep track of overhead, freed bytes and the allocation high water mark. +class BASE_EXPORT ThreadHeapUsageTracker { + public: + ThreadHeapUsageTracker(); + ~ThreadHeapUsageTracker(); + + // Start tracking heap usage on this thread. + // This may only be called on the thread where the instance is created. + // Note IsHeapTrackingEnabled() must be true. + void Start(); + + // Stop tracking heap usage on this thread and store the usage tallied. + // If |usage_is_exclusive| is true, the usage tallied won't be added to the + // outer scope's usage. If |usage_is_exclusive| is false, the usage tallied + // in this scope will also tally to any outer scope. + // This may only be called on the thread where the instance is created. + void Stop(bool usage_is_exclusive); + + // After Stop() returns the usage tallied from Start() to Stop(). + const ThreadHeapUsage& usage() const { return usage_; } + + // Returns this thread's heap usage from the start of the innermost + // enclosing ThreadHeapUsageTracker instance, if any. + static ThreadHeapUsage GetUsageSnapshot(); + + // Enables the heap intercept. May only be called once, and only if the heap + // shim is available, e.g. if BUILDFLAG(USE_EXPERIMENTAL_ALLOCATOR_SHIM) is + // true. + static void EnableHeapTracking(); + + // Returns true iff heap tracking is enabled. + static bool IsHeapTrackingEnabled(); + + protected: + // Exposed for testing only - note that it's safe to re-EnableHeapTracking() + // after calling this function in tests. + static void DisableHeapTrackingForTesting(); + + // Exposed for testing only. + static void EnsureTLSInitialized(); + + // Exposed to allow testing the shim without inserting it in the allocator + // shim chain. + static base::allocator::AllocatorDispatch* GetDispatchForTesting(); + + private: + ThreadChecker thread_checker_; + + // The heap usage at Start(), or the difference from Start() to Stop(). + ThreadHeapUsage usage_; + + // This thread's heap usage, non-null from Start() to Stop(). + ThreadHeapUsage* thread_usage_; +}; + +} // namespace debug +} // namespace base + +#endif // BASE_DEBUG_THREAD_HEAP_USAGE_TRACKER_H_ \ No newline at end of file
diff --git a/base/debug/thread_heap_usage_tracker_unittest.cc b/base/debug/thread_heap_usage_tracker_unittest.cc new file mode 100644 index 0000000..6aac4b5 --- /dev/null +++ b/base/debug/thread_heap_usage_tracker_unittest.cc
@@ -0,0 +1,584 @@ +// 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/debug/thread_heap_usage_tracker.h" + +#include <map> + +#include "base/allocator/allocator_shim.h" +#include "base/allocator/features.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace base { +namespace debug { + +namespace { + +class TestingThreadHeapUsageTracker : public ThreadHeapUsageTracker { + public: + using ThreadHeapUsageTracker::DisableHeapTrackingForTesting; + using ThreadHeapUsageTracker::EnsureTLSInitialized; + using ThreadHeapUsageTracker::GetDispatchForTesting; +}; + +// A fixture class that allows testing the AllocatorDispatch associated with +// the ThreadHeapUsageTracker class in isolation against a mocked +// underlying +// heap implementation. +class ThreadHeapUsageTrackerTest : public testing::Test { + public: + using AllocatorDispatch = base::allocator::AllocatorDispatch; + + static const size_t kAllocationPadding; + enum SizeFunctionKind { + EXACT_SIZE_FUNCTION, + PADDING_SIZE_FUNCTION, + ZERO_SIZE_FUNCTION, + }; + + ThreadHeapUsageTrackerTest() : size_function_kind_(EXACT_SIZE_FUNCTION) { + EXPECT_EQ(nullptr, g_self); + g_self = this; + } + + ~ThreadHeapUsageTrackerTest() override { + EXPECT_EQ(this, g_self); + g_self = nullptr; + } + + void set_size_function_kind(SizeFunctionKind kind) { + size_function_kind_ = kind; + } + + void SetUp() override { + TestingThreadHeapUsageTracker::EnsureTLSInitialized(); + + dispatch_under_test_ = + TestingThreadHeapUsageTracker::GetDispatchForTesting(); + ASSERT_EQ(nullptr, dispatch_under_test_->next); + + dispatch_under_test_->next = &g_mock_dispatch; + } + + void TearDown() override { + ASSERT_EQ(&g_mock_dispatch, dispatch_under_test_->next); + + dispatch_under_test_->next = nullptr; + } + + void* MockMalloc(size_t size) { + return dispatch_under_test_->alloc_function(dispatch_under_test_, size); + } + + void* MockCalloc(size_t n, size_t size) { + return dispatch_under_test_->alloc_zero_initialized_function( + dispatch_under_test_, n, size); + } + + void* MockAllocAligned(size_t alignment, size_t size) { + return dispatch_under_test_->alloc_aligned_function(dispatch_under_test_, + alignment, size); + } + + void* MockRealloc(void* address, size_t size) { + return dispatch_under_test_->realloc_function(dispatch_under_test_, address, + size); + } + + void MockFree(void* address) { + dispatch_under_test_->free_function(dispatch_under_test_, address); + } + + size_t MockGetSizeEstimate(void* address) { + return dispatch_under_test_->get_size_estimate_function( + dispatch_under_test_, address); + } + + private: + void RecordAlloc(void* address, size_t size) { + if (address != nullptr) + allocation_size_map_[address] = size; + } + + void DeleteAlloc(void* address) { + if (address != nullptr) + EXPECT_EQ(1U, allocation_size_map_.erase(address)); + } + + size_t GetSizeEstimate(void* address) { + auto it = allocation_size_map_.find(address); + if (it == allocation_size_map_.end()) + return 0; + + size_t ret = it->second; + switch (size_function_kind_) { + case EXACT_SIZE_FUNCTION: + break; + case PADDING_SIZE_FUNCTION: + ret += kAllocationPadding; + break; + case ZERO_SIZE_FUNCTION: + ret = 0; + break; + } + + return ret; + } + + static void* OnAllocFn(const AllocatorDispatch* self, size_t size) { + EXPECT_EQ(&g_mock_dispatch, self); + + void* ret = malloc(size); + g_self->RecordAlloc(ret, size); + return ret; + } + + static void* OnAllocZeroInitializedFn(const AllocatorDispatch* self, + size_t n, + size_t size) { + EXPECT_EQ(&g_mock_dispatch, self); + + void* ret = calloc(n, size); + g_self->RecordAlloc(ret, n * size); + return ret; + } + + static void* OnAllocAlignedFn(const AllocatorDispatch* self, + size_t alignment, + size_t size) { + EXPECT_EQ(&g_mock_dispatch, self); + + // This is a cheat as it doesn't return aligned allocations. This has the + // advantage of working for all platforms for this test. + void* ret = malloc(size); + g_self->RecordAlloc(ret, size); + return ret; + } + + static void* OnReallocFn(const AllocatorDispatch* self, + void* address, + size_t size) { + EXPECT_EQ(&g_mock_dispatch, self); + + g_self->DeleteAlloc(address); + void* ret = realloc(address, size); + g_self->RecordAlloc(ret, size); + return ret; + } + + static void OnFreeFn(const AllocatorDispatch* self, void* address) { + EXPECT_EQ(&g_mock_dispatch, self); + + g_self->DeleteAlloc(address); + free(address); + } + + static size_t OnGetSizeEstimateFn(const AllocatorDispatch* self, + void* address) { + EXPECT_EQ(&g_mock_dispatch, self); + + return g_self->GetSizeEstimate(address); + } + + using AllocationSizeMap = std::map<void*, size_t>; + + SizeFunctionKind size_function_kind_; + AllocationSizeMap allocation_size_map_; + AllocatorDispatch* dispatch_under_test_; + + static base::allocator::AllocatorDispatch g_mock_dispatch; + static ThreadHeapUsageTrackerTest* g_self; +}; + +const size_t ThreadHeapUsageTrackerTest::kAllocationPadding = 23; + +ThreadHeapUsageTrackerTest* ThreadHeapUsageTrackerTest::g_self = nullptr; + +base::allocator::AllocatorDispatch ThreadHeapUsageTrackerTest::g_mock_dispatch = + { + &ThreadHeapUsageTrackerTest::OnAllocFn, // alloc_function + &ThreadHeapUsageTrackerTest:: + OnAllocZeroInitializedFn, // alloc_zero_initialized_function + &ThreadHeapUsageTrackerTest:: + OnAllocAlignedFn, // alloc_aligned_function + &ThreadHeapUsageTrackerTest::OnReallocFn, // realloc_function + &ThreadHeapUsageTrackerTest::OnFreeFn, // free_function + &ThreadHeapUsageTrackerTest:: + OnGetSizeEstimateFn, // get_size_estimate_function + nullptr, // next +}; + +} // namespace + +TEST_F(ThreadHeapUsageTrackerTest, SimpleUsageWithExactSizeFunction) { + set_size_function_kind(EXACT_SIZE_FUNCTION); + + ThreadHeapUsageTracker usage_tracker; + usage_tracker.Start(); + + ThreadHeapUsage u1 = ThreadHeapUsageTracker::GetUsageSnapshot(); + + EXPECT_EQ(0U, u1.alloc_ops); + EXPECT_EQ(0U, u1.alloc_bytes); + EXPECT_EQ(0U, u1.alloc_overhead_bytes); + EXPECT_EQ(0U, u1.free_ops); + EXPECT_EQ(0U, u1.free_bytes); + EXPECT_EQ(0U, u1.max_allocated_bytes); + + const size_t kAllocSize = 1029U; + void* ptr = MockMalloc(kAllocSize); + MockFree(ptr); + + usage_tracker.Stop(false); + ThreadHeapUsage u2 = usage_tracker.usage(); + + EXPECT_EQ(1U, u2.alloc_ops); + EXPECT_EQ(kAllocSize, u2.alloc_bytes); + EXPECT_EQ(0U, u2.alloc_overhead_bytes); + EXPECT_EQ(1U, u2.free_ops); + EXPECT_EQ(kAllocSize, u2.free_bytes); + EXPECT_EQ(kAllocSize, u2.max_allocated_bytes); +} + +TEST_F(ThreadHeapUsageTrackerTest, SimpleUsageWithPaddingSizeFunction) { + set_size_function_kind(PADDING_SIZE_FUNCTION); + + ThreadHeapUsageTracker usage_tracker; + usage_tracker.Start(); + + ThreadHeapUsage u1 = ThreadHeapUsageTracker::GetUsageSnapshot(); + + EXPECT_EQ(0U, u1.alloc_ops); + EXPECT_EQ(0U, u1.alloc_bytes); + EXPECT_EQ(0U, u1.alloc_overhead_bytes); + EXPECT_EQ(0U, u1.free_ops); + EXPECT_EQ(0U, u1.free_bytes); + EXPECT_EQ(0U, u1.max_allocated_bytes); + + const size_t kAllocSize = 1029U; + void* ptr = MockMalloc(kAllocSize); + MockFree(ptr); + + usage_tracker.Stop(false); + ThreadHeapUsage u2 = usage_tracker.usage(); + + EXPECT_EQ(1U, u2.alloc_ops); + EXPECT_EQ(kAllocSize + kAllocationPadding, u2.alloc_bytes); + EXPECT_EQ(kAllocationPadding, u2.alloc_overhead_bytes); + EXPECT_EQ(1U, u2.free_ops); + EXPECT_EQ(kAllocSize + kAllocationPadding, u2.free_bytes); + EXPECT_EQ(kAllocSize + kAllocationPadding, u2.max_allocated_bytes); +} + +TEST_F(ThreadHeapUsageTrackerTest, SimpleUsageWithZeroSizeFunction) { + set_size_function_kind(ZERO_SIZE_FUNCTION); + + ThreadHeapUsageTracker usage_tracker; + usage_tracker.Start(); + + ThreadHeapUsage u1 = ThreadHeapUsageTracker::GetUsageSnapshot(); + EXPECT_EQ(0U, u1.alloc_ops); + EXPECT_EQ(0U, u1.alloc_bytes); + EXPECT_EQ(0U, u1.alloc_overhead_bytes); + EXPECT_EQ(0U, u1.free_ops); + EXPECT_EQ(0U, u1.free_bytes); + EXPECT_EQ(0U, u1.max_allocated_bytes); + + const size_t kAllocSize = 1029U; + void* ptr = MockMalloc(kAllocSize); + MockFree(ptr); + + usage_tracker.Stop(false); + ThreadHeapUsage u2 = usage_tracker.usage(); + + // With a get-size function that returns zero, there's no way to get the size + // of an allocation that's being freed, hence the shim can't tally freed bytes + // nor the high-watermark allocated bytes. + EXPECT_EQ(1U, u2.alloc_ops); + EXPECT_EQ(kAllocSize, u2.alloc_bytes); + EXPECT_EQ(0U, u2.alloc_overhead_bytes); + EXPECT_EQ(1U, u2.free_ops); + EXPECT_EQ(0U, u2.free_bytes); + EXPECT_EQ(0U, u2.max_allocated_bytes); +} + +TEST_F(ThreadHeapUsageTrackerTest, ReallocCorrectlyTallied) { + const size_t kAllocSize = 237U; + + { + ThreadHeapUsageTracker usage_tracker; + usage_tracker.Start(); + + // Reallocating nullptr should count as a single alloc. + void* ptr = MockRealloc(nullptr, kAllocSize); + ThreadHeapUsage usage = ThreadHeapUsageTracker::GetUsageSnapshot(); + EXPECT_EQ(1U, usage.alloc_ops); + EXPECT_EQ(kAllocSize, usage.alloc_bytes); + EXPECT_EQ(0U, usage.alloc_overhead_bytes); + EXPECT_EQ(0U, usage.free_ops); + EXPECT_EQ(0U, usage.free_bytes); + EXPECT_EQ(kAllocSize, usage.max_allocated_bytes); + + // Reallocating a valid pointer to a zero size should count as a single + // free. + ptr = MockRealloc(ptr, 0U); + + usage_tracker.Stop(false); + EXPECT_EQ(1U, usage_tracker.usage().alloc_ops); + EXPECT_EQ(kAllocSize, usage_tracker.usage().alloc_bytes); + EXPECT_EQ(0U, usage_tracker.usage().alloc_overhead_bytes); + EXPECT_EQ(1U, usage_tracker.usage().free_ops); + EXPECT_EQ(kAllocSize, usage_tracker.usage().free_bytes); + EXPECT_EQ(kAllocSize, usage_tracker.usage().max_allocated_bytes); + + // Realloc to zero size may or may not return a nullptr - make sure to + // free the zero-size alloc in the latter case. + if (ptr != nullptr) + MockFree(ptr); + } + + { + ThreadHeapUsageTracker usage_tracker; + usage_tracker.Start(); + + void* ptr = MockMalloc(kAllocSize); + ThreadHeapUsage usage = ThreadHeapUsageTracker::GetUsageSnapshot(); + EXPECT_EQ(1U, usage.alloc_ops); + + // Now try reallocating a valid pointer to a larger size, this should count + // as one free and one alloc. + const size_t kLargerAllocSize = kAllocSize + 928U; + ptr = MockRealloc(ptr, kLargerAllocSize); + + usage_tracker.Stop(false); + EXPECT_EQ(2U, usage_tracker.usage().alloc_ops); + EXPECT_EQ(kAllocSize + kLargerAllocSize, usage_tracker.usage().alloc_bytes); + EXPECT_EQ(0U, usage_tracker.usage().alloc_overhead_bytes); + EXPECT_EQ(1U, usage_tracker.usage().free_ops); + EXPECT_EQ(kAllocSize, usage_tracker.usage().free_bytes); + EXPECT_EQ(kLargerAllocSize, usage_tracker.usage().max_allocated_bytes); + + MockFree(ptr); + } +} + +TEST_F(ThreadHeapUsageTrackerTest, NestedMaxWorks) { + ThreadHeapUsageTracker usage_tracker; + usage_tracker.Start(); + + const size_t kOuterAllocSize = 1029U; + void* ptr = MockMalloc(kOuterAllocSize); + MockFree(ptr); + + EXPECT_EQ(kOuterAllocSize, + ThreadHeapUsageTracker::GetUsageSnapshot().max_allocated_bytes); + + { + ThreadHeapUsageTracker inner_usage_tracker; + inner_usage_tracker.Start(); + + const size_t kInnerAllocSize = 673U; + ptr = MockMalloc(kInnerAllocSize); + MockFree(ptr); + + inner_usage_tracker.Stop(false); + + EXPECT_EQ(kInnerAllocSize, inner_usage_tracker.usage().max_allocated_bytes); + } + + // The greater, outer allocation size should have been restored. + EXPECT_EQ(kOuterAllocSize, + ThreadHeapUsageTracker::GetUsageSnapshot().max_allocated_bytes); + + const size_t kLargerInnerAllocSize = kOuterAllocSize + 673U; + { + ThreadHeapUsageTracker inner_usage_tracker; + inner_usage_tracker.Start(); + + ptr = MockMalloc(kLargerInnerAllocSize); + MockFree(ptr); + + inner_usage_tracker.Stop(false); + EXPECT_EQ(kLargerInnerAllocSize, + inner_usage_tracker.usage().max_allocated_bytes); + } + + // The greater, inner allocation size should have been preserved. + EXPECT_EQ(kLargerInnerAllocSize, + ThreadHeapUsageTracker::GetUsageSnapshot().max_allocated_bytes); + + // Now try the case with an outstanding net alloc size when entering the + // inner scope. + void* outer_ptr = MockMalloc(kOuterAllocSize); + EXPECT_EQ(kLargerInnerAllocSize, + ThreadHeapUsageTracker::GetUsageSnapshot().max_allocated_bytes); + { + ThreadHeapUsageTracker inner_usage_tracker; + inner_usage_tracker.Start(); + + ptr = MockMalloc(kLargerInnerAllocSize); + MockFree(ptr); + + inner_usage_tracker.Stop(false); + EXPECT_EQ(kLargerInnerAllocSize, + inner_usage_tracker.usage().max_allocated_bytes); + } + + // While the inner scope saw only the inner net outstanding allocation size, + // the outer scope saw both outstanding at the same time. + EXPECT_EQ(kOuterAllocSize + kLargerInnerAllocSize, + ThreadHeapUsageTracker::GetUsageSnapshot().max_allocated_bytes); + + MockFree(outer_ptr); + + // Test a net-negative scope. + ptr = MockMalloc(kLargerInnerAllocSize); + { + ThreadHeapUsageTracker inner_usage_tracker; + inner_usage_tracker.Start(); + + MockFree(ptr); + + const size_t kInnerAllocSize = 1; + ptr = MockMalloc(kInnerAllocSize); + + inner_usage_tracker.Stop(false); + // Since the scope is still net-negative, the max is clamped at zero. + EXPECT_EQ(0U, inner_usage_tracker.usage().max_allocated_bytes); + } + + MockFree(ptr); +} + +TEST_F(ThreadHeapUsageTrackerTest, NoStopImpliesInclusive) { + ThreadHeapUsageTracker usage_tracker; + usage_tracker.Start(); + + const size_t kOuterAllocSize = 1029U; + void* ptr = MockMalloc(kOuterAllocSize); + MockFree(ptr); + + ThreadHeapUsage usage = ThreadHeapUsageTracker::GetUsageSnapshot(); + EXPECT_EQ(kOuterAllocSize, usage.max_allocated_bytes); + + const size_t kInnerLargerAllocSize = kOuterAllocSize + 673U; + + { + ThreadHeapUsageTracker inner_usage_tracker; + inner_usage_tracker.Start(); + + // Make a larger allocation than the outer scope. + ptr = MockMalloc(kInnerLargerAllocSize); + MockFree(ptr); + + // inner_usage_tracker goes out of scope without a Stop(). + } + + ThreadHeapUsage current = ThreadHeapUsageTracker::GetUsageSnapshot(); + EXPECT_EQ(usage.alloc_ops + 1, current.alloc_ops); + EXPECT_EQ(usage.alloc_bytes + kInnerLargerAllocSize, current.alloc_bytes); + EXPECT_EQ(usage.free_ops + 1, current.free_ops); + EXPECT_EQ(usage.free_bytes + kInnerLargerAllocSize, current.free_bytes); + EXPECT_EQ(kInnerLargerAllocSize, current.max_allocated_bytes); +} + +TEST_F(ThreadHeapUsageTrackerTest, ExclusiveScopesWork) { + ThreadHeapUsageTracker usage_tracker; + usage_tracker.Start(); + + const size_t kOuterAllocSize = 1029U; + void* ptr = MockMalloc(kOuterAllocSize); + MockFree(ptr); + + ThreadHeapUsage usage = ThreadHeapUsageTracker::GetUsageSnapshot(); + EXPECT_EQ(kOuterAllocSize, usage.max_allocated_bytes); + + { + ThreadHeapUsageTracker inner_usage_tracker; + inner_usage_tracker.Start(); + + // Make a larger allocation than the outer scope. + ptr = MockMalloc(kOuterAllocSize + 673U); + MockFree(ptr); + + // This tracker is exlusive, all activity should be private to this scope. + inner_usage_tracker.Stop(true); + } + + ThreadHeapUsage current = ThreadHeapUsageTracker::GetUsageSnapshot(); + EXPECT_EQ(usage.alloc_ops, current.alloc_ops); + EXPECT_EQ(usage.alloc_bytes, current.alloc_bytes); + EXPECT_EQ(usage.alloc_overhead_bytes, current.alloc_overhead_bytes); + EXPECT_EQ(usage.free_ops, current.free_ops); + EXPECT_EQ(usage.free_bytes, current.free_bytes); + EXPECT_EQ(usage.max_allocated_bytes, current.max_allocated_bytes); +} + +TEST_F(ThreadHeapUsageTrackerTest, AllShimFunctionsAreProvided) { + const size_t kAllocSize = 100; + void* alloc = MockMalloc(kAllocSize); + size_t estimate = MockGetSizeEstimate(alloc); + ASSERT_TRUE(estimate == 0 || estimate >= kAllocSize); + MockFree(alloc); + + alloc = MockCalloc(kAllocSize, 1); + estimate = MockGetSizeEstimate(alloc); + ASSERT_TRUE(estimate == 0 || estimate >= kAllocSize); + MockFree(alloc); + + alloc = MockAllocAligned(1, kAllocSize); + estimate = MockGetSizeEstimate(alloc); + ASSERT_TRUE(estimate == 0 || estimate >= kAllocSize); + + alloc = MockRealloc(alloc, kAllocSize); + estimate = MockGetSizeEstimate(alloc); + ASSERT_TRUE(estimate == 0 || estimate >= kAllocSize); + MockFree(alloc); +} + +#if BUILDFLAG(USE_EXPERIMENTAL_ALLOCATOR_SHIM) +TEST(ThreadHeapUsageShimTest, HooksIntoMallocWhenShimAvailable) { + ASSERT_FALSE(ThreadHeapUsageTracker::IsHeapTrackingEnabled()); + + ThreadHeapUsageTracker::EnableHeapTracking(); + + ASSERT_TRUE(ThreadHeapUsageTracker::IsHeapTrackingEnabled()); + + const size_t kAllocSize = 9993; + // This test verifies that the scoped heap data is affected by malloc & + // free only when the shim is available. + ThreadHeapUsageTracker usage_tracker; + usage_tracker.Start(); + + ThreadHeapUsage u1 = ThreadHeapUsageTracker::GetUsageSnapshot(); + void* ptr = malloc(kAllocSize); + // Prevent the compiler from optimizing out the malloc/free pair. + ASSERT_NE(nullptr, ptr); + + ThreadHeapUsage u2 = ThreadHeapUsageTracker::GetUsageSnapshot(); + free(ptr); + + usage_tracker.Stop(false); + ThreadHeapUsage u3 = usage_tracker.usage(); + + // Verify that at least one allocation operation was recorded, and that free + // operations are at least monotonically growing. + EXPECT_LE(0U, u1.alloc_ops); + EXPECT_LE(u1.alloc_ops + 1, u2.alloc_ops); + EXPECT_LE(u1.alloc_ops + 1, u3.alloc_ops); + + // Verify that at least the bytes above were recorded. + EXPECT_LE(u1.alloc_bytes + kAllocSize, u2.alloc_bytes); + + // Verify that at least the one free operation above was recorded. + EXPECT_LE(u2.free_ops + 1, u3.free_ops); + + TestingThreadHeapUsageTracker::DisableHeapTrackingForTesting(); + + ASSERT_FALSE(ThreadHeapUsageTracker::IsHeapTrackingEnabled()); +} +#endif // BUILDFLAG(USE_EXPERIMENTAL_ALLOCATOR_SHIM) + +} // namespace debug +} // namespace base
diff --git a/blimp/DEPS b/blimp/DEPS index 36d9d3f..627e9de 100644 --- a/blimp/DEPS +++ b/blimp/DEPS
@@ -1,5 +1,6 @@ include_rules = [ "+third_party/libwebp", + "+third_party/protobuf", "+third_party/skia", "+skia", ]
diff --git a/blimp/client/DEPS b/blimp/client/DEPS index e2188e26..d299885 100644 --- a/blimp/client/DEPS +++ b/blimp/client/DEPS
@@ -16,6 +16,7 @@ "+third_party/WebKit/public/web/WebInputEvent.h", "+ui/android", "+ui/base/ime/text_input_type.h", + "+ui/base/l10n", "+ui/events", "+ui/events/android", "+ui/events/blink",
diff --git a/blimp/client/core/contents/blimp_contents_impl.cc b/blimp/client/core/contents/blimp_contents_impl.cc index 42e9a1a3..5cd4bb1 100644 --- a/blimp/client/core/contents/blimp_contents_impl.cc +++ b/blimp/client/core/contents/blimp_contents_impl.cc
@@ -45,7 +45,8 @@ } BlimpContentsImpl::~BlimpContentsImpl() { - FOR_EACH_OBSERVER(BlimpContentsObserver, observers_, BlimpContentsDying()); + for (auto& observer : observers_) + observer.BlimpContentsDying(); ime_feature_->set_delegate(nullptr); } @@ -103,18 +104,18 @@ } void BlimpContentsImpl::OnNavigationStateChanged() { - FOR_EACH_OBSERVER(BlimpContentsObserver, observers_, - OnNavigationStateChanged()); + for (auto& observer : observers_) + observer.OnNavigationStateChanged(); } void BlimpContentsImpl::OnLoadingStateChanged(bool loading) { - FOR_EACH_OBSERVER(BlimpContentsObserver, observers_, - OnLoadingStateChanged(loading)); + for (auto& observer : observers_) + observer.OnLoadingStateChanged(loading); } void BlimpContentsImpl::OnPageLoadingStateChanged(bool loading) { - FOR_EACH_OBSERVER(BlimpContentsObserver, observers_, - OnPageLoadingStateChanged(loading)); + for (auto& observer : observers_) + observer.OnPageLoadingStateChanged(loading); } void BlimpContentsImpl::SetSizeAndScale(const gfx::Size& size,
diff --git a/blimp/client/core/session/connection_status.cc b/blimp/client/core/session/connection_status.cc index 9539320..069dcbb 100644 --- a/blimp/client/core/session/connection_status.cc +++ b/blimp/client/core/session/connection_status.cc
@@ -36,14 +36,15 @@ void ConnectionStatus::OnConnected() { is_connected_ = true; UMA_HISTOGRAM_BOOLEAN("Blimp.Connected", true); - FOR_EACH_OBSERVER(NetworkEventObserver, connection_observers_, OnConnected()); + for (auto& observer : connection_observers_) + observer.OnConnected(); } void ConnectionStatus::OnDisconnected(int result) { is_connected_ = false; UMA_HISTOGRAM_BOOLEAN("Blimp.Connected", false); - FOR_EACH_OBSERVER(NetworkEventObserver, connection_observers_, - OnDisconnected(result)); + for (auto& observer : connection_observers_) + observer.OnDisconnected(result); } } // namespace client
diff --git a/blimp/client/support/BUILD.gn b/blimp/client/support/BUILD.gn index 946008aa3..54ce3ef 100644 --- a/blimp/client/support/BUILD.gn +++ b/blimp/client/support/BUILD.gn
@@ -5,6 +5,7 @@ group("support") { public_deps = [ "//blimp/client/support/compositor", + "//blimp/client/support/resources", "//blimp/client/support/session", ] }
diff --git a/blimp/client/support/resources/BUILD.gn b/blimp/client/support/resources/BUILD.gn new file mode 100644 index 0000000..1d45ce6 --- /dev/null +++ b/blimp/client/support/resources/BUILD.gn
@@ -0,0 +1,38 @@ +# 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("//blimp/client/core/config.gni") +import("//build/config/locales.gni") +import("//tools/grit/grit_rule.gni") + +# Resources exposed to the embedder. +source_set("resources") { + sources = [ + "blimp_strings.cc", + "blimp_strings.h", + ] + + public_deps = [ + ":strings", + ] + + deps = [ + "//base", + "//ui/base:base", + ] +} + +# Strings exposed to the embedder. The embedder will generate target to depend on this, so no +# visibility here. +grit("strings") { + source = "blimp_strings.grd" + use_qualified_include = true + outputs = [ + "grit/blimp_strings.h", + ] + + foreach(locale, locales_with_fake_bidi) { + outputs += [ "blimp_strings_$locale.pak" ] + } +}
diff --git a/blimp/client/support/resources/blimp_strings.cc b/blimp/client/support/resources/blimp_strings.cc new file mode 100644 index 0000000..943d6f6 --- /dev/null +++ b/blimp/client/support/resources/blimp_strings.cc
@@ -0,0 +1,15 @@ +// 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 "blimp/client/support/resources/blimp_strings.h" + +namespace blimp { +namespace string { + +base::string16 BlimpPrefix(const base::string16& str) { + return l10n_util::GetStringFUTF16(IDS_BLIMP_TAG, str); +} + +} // namespace string +} // namespace blimp
diff --git a/blimp/client/support/resources/blimp_strings.grd b/blimp/client/support/resources/blimp_strings.grd new file mode 100644 index 0000000..6bb2abcf --- /dev/null +++ b/blimp/client/support/resources/blimp_strings.grd
@@ -0,0 +1,127 @@ +<?xml version="1.0" encoding="UTF-8"?> +<grit current_release="1" latest_public_release="0" output_all_resource_defines="false"> + <outputs> + + <output filename="grit/blimp_strings.h" type="rc_header"> + <emit emit_type="prepend"/> + </output> + + <output filename="blimp_strings_am.pak" type="data_package" lang="am" /> + <output filename="blimp_strings_ar.pak" type="data_package" lang="ar" /> + <output filename="blimp_strings_bg.pak" type="data_package" lang="bg" /> + <output filename="blimp_strings_bn.pak" type="data_package" lang="bn" /> + <output filename="blimp_strings_ca.pak" type="data_package" lang="ca" /> + <output filename="blimp_strings_cs.pak" type="data_package" lang="cs" /> + <output filename="blimp_strings_da.pak" type="data_package" lang="da" /> + <output filename="blimp_strings_de.pak" type="data_package" lang="de" /> + <output filename="blimp_strings_el.pak" type="data_package" lang="el" /> + <output filename="blimp_strings_en-GB.pak" type="data_package" lang="en-GB" /> + <output filename="blimp_strings_en-US.pak" type="data_package" lang="en" /> + <output filename="blimp_strings_es.pak" type="data_package" lang="es" /> + <output filename="blimp_strings_es-419.pak" type="data_package" lang="es-419" /> + <output filename="blimp_strings_et.pak" type="data_package" lang="et" /> + <output filename="blimp_strings_fa.pak" type="data_package" lang="fa" /> + <output filename="blimp_strings_fake-bidi.pak" type="data_package" lang="fake-bidi" /> + <output filename="blimp_strings_fi.pak" type="data_package" lang="fi" /> + <output filename="blimp_strings_fil.pak" type="data_package" lang="fil" /> + <output filename="blimp_strings_fr.pak" type="data_package" lang="fr" /> + <output filename="blimp_strings_gu.pak" type="data_package" lang="gu" /> + <output filename="blimp_strings_he.pak" type="data_package" lang="he" /> + <output filename="blimp_strings_hi.pak" type="data_package" lang="hi" /> + <output filename="blimp_strings_hr.pak" type="data_package" lang="hr" /> + <output filename="blimp_strings_hu.pak" type="data_package" lang="hu" /> + <output filename="blimp_strings_id.pak" type="data_package" lang="id" /> + <output filename="blimp_strings_it.pak" type="data_package" lang="it" /> + <output filename="blimp_strings_ja.pak" type="data_package" lang="ja" /> + <output filename="blimp_strings_kn.pak" type="data_package" lang="kn" /> + <output filename="blimp_strings_ko.pak" type="data_package" lang="ko" /> + <output filename="blimp_strings_lt.pak" type="data_package" lang="lt" /> + <output filename="blimp_strings_lv.pak" type="data_package" lang="lv" /> + <output filename="blimp_strings_ml.pak" type="data_package" lang="ml" /> + <output filename="blimp_strings_mr.pak" type="data_package" lang="mr" /> + <output filename="blimp_strings_ms.pak" type="data_package" lang="ms" /> + <output filename="blimp_strings_nl.pak" type="data_package" lang="nl" /> + <!-- The translation console uses 'no' for Norwegian Bokmål. It should + be 'nb'. --> + <output filename="blimp_strings_nb.pak" type="data_package" lang="no" /> + <output filename="blimp_strings_pl.pak" type="data_package" lang="pl" /> + <output filename="blimp_strings_pt-BR.pak" type="data_package" lang="pt-BR" /> + <output filename="blimp_strings_pt-PT.pak" type="data_package" lang="pt-PT" /> + <output filename="blimp_strings_ro.pak" type="data_package" lang="ro" /> + <output filename="blimp_strings_ru.pak" type="data_package" lang="ru" /> + <output filename="blimp_strings_sk.pak" type="data_package" lang="sk" /> + <output filename="blimp_strings_sl.pak" type="data_package" lang="sl" /> + <output filename="blimp_strings_sr.pak" type="data_package" lang="sr" /> + <output filename="blimp_strings_sv.pak" type="data_package" lang="sv" /> + <output filename="blimp_strings_sw.pak" type="data_package" lang="sw" /> + <output filename="blimp_strings_ta.pak" type="data_package" lang="ta" /> + <output filename="blimp_strings_te.pak" type="data_package" lang="te" /> + <output filename="blimp_strings_th.pak" type="data_package" lang="th" /> + <output filename="blimp_strings_tr.pak" type="data_package" lang="tr" /> + <output filename="blimp_strings_uk.pak" type="data_package" lang="uk" /> + <output filename="blimp_strings_vi.pak" type="data_package" lang="vi" /> + <output filename="blimp_strings_zh-CN.pak" type="data_package" lang="zh-CN" /> + <output filename="blimp_strings_zh-TW.pak" type="data_package" lang="zh-TW" /> + </outputs> + <translations> + <file lang="am" path="translations/blimp_strings_am.xtb" /> + <file lang="ar" path="translations/blimp_strings_ar.xtb" /> + <file lang="bg" path="translations/blimp_strings_bg.xtb" /> + <file lang="ca" path="translations/blimp_strings_ca.xtb" /> + <file lang="cs" path="translations/blimp_strings_cs.xtb" /> + <file lang="da" path="translations/blimp_strings_da.xtb" /> + <file lang="de" path="translations/blimp_strings_de.xtb" /> + <file lang="el" path="translations/blimp_strings_el.xtb" /> + <file lang="en-GB" path="translations/blimp_strings_en-GB.xtb" /> + <file lang="es" path="translations/blimp_strings_es.xtb" /> + <file lang="es-419" path="translations/blimp_strings_es-419.xtb" /> + <file lang="fa" path="translations/blimp_strings_fa.xtb" /> + <file lang="fi" path="translations/blimp_strings_fi.xtb" /> + <file lang="fil" path="translations/blimp_strings_fil.xtb" /> + <file lang="fr" path="translations/blimp_strings_fr.xtb" /> + <file lang="hi" path="translations/blimp_strings_hi.xtb" /> + <file lang="hr" path="translations/blimp_strings_hr.xtb" /> + <file lang="hu" path="translations/blimp_strings_hu.xtb" /> + <file lang="id" path="translations/blimp_strings_id.xtb" /> + <file lang="it" path="translations/blimp_strings_it.xtb" /> + <file lang="iw" path="translations/blimp_strings_iw.xtb" /> + <file lang="ja" path="translations/blimp_strings_ja.xtb" /> + <file lang="ko" path="translations/blimp_strings_ko.xtb" /> + <file lang="lt" path="translations/blimp_strings_lt.xtb" /> + <file lang="lv" path="translations/blimp_strings_lv.xtb" /> + <file lang="nl" path="translations/blimp_strings_nl.xtb" /> + <file lang="no" path="translations/blimp_strings_no.xtb" /> + <file lang="pl" path="translations/blimp_strings_pl.xtb" /> + <file lang="pt-BR" path="translations/blimp_strings_pt-BR.xtb" /> + <file lang="pt-PT" path="translations/blimp_strings_pt-PT.xtb" /> + <file lang="ro" path="translations/blimp_strings_ro.xtb" /> + <file lang="ru" path="translations/blimp_strings_ru.xtb" /> + <file lang="sk" path="translations/blimp_strings_sk.xtb" /> + <file lang="sl" path="translations/blimp_strings_sl.xtb" /> + <file lang="sr" path="translations/blimp_strings_sr.xtb" /> + <file lang="sv" path="translations/blimp_strings_sv.xtb" /> + <file lang="sw" path="translations/blimp_strings_sw.xtb" /> + <file lang="th" path="translations/blimp_strings_th.xtb" /> + <file lang="tr" path="translations/blimp_strings_tr.xtb" /> + <file lang="uk" path="translations/blimp_strings_uk.xtb" /> + <file lang="vi" path="translations/blimp_strings_vi.xtb" /> + <file lang="zh-CN" path="translations/blimp_strings_zh-CN.xtb" /> + <file lang="zh-TW" path="translations/blimp_strings_zh-TW.xtb" /> + </translations> + <release allow_pseudo="false" seq="1"> + <messages fallback_to_english="true"> + <message name="IDS_BLIMP_SIGNIN_GET_TOKEN_FAILED" desc="Message for authentication failure."> + Unable to authenticate user. Failed to get OAuth2 token. + </message> + <message name="IDS_BLIMP_NETWORK_CONNECTED" desc="Message shown when a connection is successfully established."> + Connected. + </message> + <message name="IDS_BLIMP_NETWORK_DISCONNECTED" desc="Message shown when a connection terminates."> + Disconnected, ($1). + </message> + <message name="IDS_BLIMP_TAG" desc="Tag that can be used as prefix in the error message."> + Blimp: $1 + </message> + </messages> + </release> +</grit>
diff --git a/blimp/client/support/resources/blimp_strings.h b/blimp/client/support/resources/blimp_strings.h new file mode 100644 index 0000000..ad031de --- /dev/null +++ b/blimp/client/support/resources/blimp_strings.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 BLIMP_CLIENT_SUPPORT_RESOURCES_BLIMP_STRINGS_H_ +#define BLIMP_CLIENT_SUPPORT_RESOURCES_BLIMP_STRINGS_H_ + +#include "blimp/client/support/resources/grit/blimp_strings.h" + +#include "base/strings/string16.h" +#include "ui/base/l10n/l10n_util.h" + +// Include this header to access blimp support string id. +// Do not directly include grit/blimp_strings.h. +namespace blimp { +namespace string { + +base::string16 BlimpPrefix(const base::string16& str); + +} // namespace string +} // namespace blimp + +#endif // BLIMP_CLIENT_SUPPORT_RESOURCES_BLIMP_STRINGS_H_
diff --git a/blimp/client/support/resources/translations/blimp_strings_am.xtb b/blimp/client/support/resources/translations/blimp_strings_am.xtb new file mode 100644 index 0000000..1a8356cf --- /dev/null +++ b/blimp/client/support/resources/translations/blimp_strings_am.xtb
@@ -0,0 +1 @@ +<?xml version="1.0" ?><!DOCTYPE translationbundle><translationbundle lang="am"></translationbundle>
diff --git a/blimp/client/support/resources/translations/blimp_strings_ar.xtb b/blimp/client/support/resources/translations/blimp_strings_ar.xtb new file mode 100644 index 0000000..577c15f --- /dev/null +++ b/blimp/client/support/resources/translations/blimp_strings_ar.xtb
@@ -0,0 +1 @@ +<?xml version="1.0" ?><!DOCTYPE translationbundle><translationbundle lang="ar"></translationbundle>
diff --git a/blimp/client/support/resources/translations/blimp_strings_bg.xtb b/blimp/client/support/resources/translations/blimp_strings_bg.xtb new file mode 100644 index 0000000..25d06b3 --- /dev/null +++ b/blimp/client/support/resources/translations/blimp_strings_bg.xtb
@@ -0,0 +1 @@ +<?xml version="1.0" ?><!DOCTYPE translationbundle><translationbundle lang="bg"></translationbundle>
diff --git a/blimp/client/support/resources/translations/blimp_strings_ca.xtb b/blimp/client/support/resources/translations/blimp_strings_ca.xtb new file mode 100644 index 0000000..1e9d243 --- /dev/null +++ b/blimp/client/support/resources/translations/blimp_strings_ca.xtb
@@ -0,0 +1 @@ +<?xml version="1.0" ?><!DOCTYPE translationbundle><translationbundle lang="ca"></translationbundle>
diff --git a/blimp/client/support/resources/translations/blimp_strings_cs.xtb b/blimp/client/support/resources/translations/blimp_strings_cs.xtb new file mode 100644 index 0000000..b6103f7 --- /dev/null +++ b/blimp/client/support/resources/translations/blimp_strings_cs.xtb
@@ -0,0 +1 @@ +<?xml version="1.0" ?><!DOCTYPE translationbundle><translationbundle lang="cs"></translationbundle>
diff --git a/blimp/client/support/resources/translations/blimp_strings_da.xtb b/blimp/client/support/resources/translations/blimp_strings_da.xtb new file mode 100644 index 0000000..6feffd32 --- /dev/null +++ b/blimp/client/support/resources/translations/blimp_strings_da.xtb
@@ -0,0 +1 @@ +<?xml version="1.0" ?><!DOCTYPE translationbundle><translationbundle lang="da"></translationbundle>
diff --git a/blimp/client/support/resources/translations/blimp_strings_de.xtb b/blimp/client/support/resources/translations/blimp_strings_de.xtb new file mode 100644 index 0000000..d2908e8a --- /dev/null +++ b/blimp/client/support/resources/translations/blimp_strings_de.xtb
@@ -0,0 +1 @@ +<?xml version="1.0" ?><!DOCTYPE translationbundle><translationbundle lang="de"></translationbundle>
diff --git a/blimp/client/support/resources/translations/blimp_strings_el.xtb b/blimp/client/support/resources/translations/blimp_strings_el.xtb new file mode 100644 index 0000000..2d96e6c --- /dev/null +++ b/blimp/client/support/resources/translations/blimp_strings_el.xtb
@@ -0,0 +1 @@ +<?xml version="1.0" ?><!DOCTYPE translationbundle><translationbundle lang="el"></translationbundle>
diff --git a/blimp/client/support/resources/translations/blimp_strings_en-GB.xtb b/blimp/client/support/resources/translations/blimp_strings_en-GB.xtb new file mode 100644 index 0000000..769a524 --- /dev/null +++ b/blimp/client/support/resources/translations/blimp_strings_en-GB.xtb
@@ -0,0 +1 @@ +<?xml version="1.0" ?><!DOCTYPE translationbundle><translationbundle lang="en-GB"></translationbundle>
diff --git a/blimp/client/support/resources/translations/blimp_strings_es-419.xtb b/blimp/client/support/resources/translations/blimp_strings_es-419.xtb new file mode 100644 index 0000000..37258dd --- /dev/null +++ b/blimp/client/support/resources/translations/blimp_strings_es-419.xtb
@@ -0,0 +1 @@ +<?xml version="1.0" ?><!DOCTYPE translationbundle><translationbundle lang="es-419"></translationbundle>
diff --git a/blimp/client/support/resources/translations/blimp_strings_es.xtb b/blimp/client/support/resources/translations/blimp_strings_es.xtb new file mode 100644 index 0000000..27d8ca3 --- /dev/null +++ b/blimp/client/support/resources/translations/blimp_strings_es.xtb
@@ -0,0 +1 @@ +<?xml version="1.0" ?><!DOCTYPE translationbundle><translationbundle lang="es"></translationbundle>
diff --git a/blimp/client/support/resources/translations/blimp_strings_fa.xtb b/blimp/client/support/resources/translations/blimp_strings_fa.xtb new file mode 100644 index 0000000..41bc8c38 --- /dev/null +++ b/blimp/client/support/resources/translations/blimp_strings_fa.xtb
@@ -0,0 +1 @@ +<?xml version="1.0" ?><!DOCTYPE translationbundle><translationbundle lang="fa"></translationbundle>
diff --git a/blimp/client/support/resources/translations/blimp_strings_fi.xtb b/blimp/client/support/resources/translations/blimp_strings_fi.xtb new file mode 100644 index 0000000..b2ed2bf --- /dev/null +++ b/blimp/client/support/resources/translations/blimp_strings_fi.xtb
@@ -0,0 +1 @@ +<?xml version="1.0" ?><!DOCTYPE translationbundle><translationbundle lang="fi"></translationbundle>
diff --git a/blimp/client/support/resources/translations/blimp_strings_fil.xtb b/blimp/client/support/resources/translations/blimp_strings_fil.xtb new file mode 100644 index 0000000..6ca565417 --- /dev/null +++ b/blimp/client/support/resources/translations/blimp_strings_fil.xtb
@@ -0,0 +1 @@ +<?xml version="1.0" ?><!DOCTYPE translationbundle><translationbundle lang="fil"></translationbundle>
diff --git a/blimp/client/support/resources/translations/blimp_strings_fr.xtb b/blimp/client/support/resources/translations/blimp_strings_fr.xtb new file mode 100644 index 0000000..1ce4293c --- /dev/null +++ b/blimp/client/support/resources/translations/blimp_strings_fr.xtb
@@ -0,0 +1 @@ +<?xml version="1.0" ?><!DOCTYPE translationbundle><translationbundle lang="fr"></translationbundle>
diff --git a/blimp/client/support/resources/translations/blimp_strings_hi.xtb b/blimp/client/support/resources/translations/blimp_strings_hi.xtb new file mode 100644 index 0000000..e9f9cc54 --- /dev/null +++ b/blimp/client/support/resources/translations/blimp_strings_hi.xtb
@@ -0,0 +1 @@ +<?xml version="1.0" ?><!DOCTYPE translationbundle><translationbundle lang="hi"></translationbundle>
diff --git a/blimp/client/support/resources/translations/blimp_strings_hr.xtb b/blimp/client/support/resources/translations/blimp_strings_hr.xtb new file mode 100644 index 0000000..abb82688 --- /dev/null +++ b/blimp/client/support/resources/translations/blimp_strings_hr.xtb
@@ -0,0 +1 @@ +<?xml version="1.0" ?><!DOCTYPE translationbundle><translationbundle lang="hr"></translationbundle>
diff --git a/blimp/client/support/resources/translations/blimp_strings_hu.xtb b/blimp/client/support/resources/translations/blimp_strings_hu.xtb new file mode 100644 index 0000000..5a7e2c9 --- /dev/null +++ b/blimp/client/support/resources/translations/blimp_strings_hu.xtb
@@ -0,0 +1 @@ +<?xml version="1.0" ?><!DOCTYPE translationbundle><translationbundle lang="hu"></translationbundle>
diff --git a/blimp/client/support/resources/translations/blimp_strings_id.xtb b/blimp/client/support/resources/translations/blimp_strings_id.xtb new file mode 100644 index 0000000..bced312 --- /dev/null +++ b/blimp/client/support/resources/translations/blimp_strings_id.xtb
@@ -0,0 +1 @@ +<?xml version="1.0" ?><!DOCTYPE translationbundle><translationbundle lang="id"></translationbundle>
diff --git a/blimp/client/support/resources/translations/blimp_strings_it.xtb b/blimp/client/support/resources/translations/blimp_strings_it.xtb new file mode 100644 index 0000000..d56be5c --- /dev/null +++ b/blimp/client/support/resources/translations/blimp_strings_it.xtb
@@ -0,0 +1 @@ +<?xml version="1.0" ?><!DOCTYPE translationbundle><translationbundle lang="it"></translationbundle>
diff --git a/blimp/client/support/resources/translations/blimp_strings_iw.xtb b/blimp/client/support/resources/translations/blimp_strings_iw.xtb new file mode 100644 index 0000000..d17d24e --- /dev/null +++ b/blimp/client/support/resources/translations/blimp_strings_iw.xtb
@@ -0,0 +1 @@ +<?xml version="1.0" ?><!DOCTYPE translationbundle><translationbundle lang="iw"></translationbundle>
diff --git a/blimp/client/support/resources/translations/blimp_strings_ja.xtb b/blimp/client/support/resources/translations/blimp_strings_ja.xtb new file mode 100644 index 0000000..c5828bf2 --- /dev/null +++ b/blimp/client/support/resources/translations/blimp_strings_ja.xtb
@@ -0,0 +1 @@ +<?xml version="1.0" ?><!DOCTYPE translationbundle><translationbundle lang="ja"></translationbundle>
diff --git a/blimp/client/support/resources/translations/blimp_strings_ko.xtb b/blimp/client/support/resources/translations/blimp_strings_ko.xtb new file mode 100644 index 0000000..aac09f4 --- /dev/null +++ b/blimp/client/support/resources/translations/blimp_strings_ko.xtb
@@ -0,0 +1 @@ +<?xml version="1.0" ?><!DOCTYPE translationbundle><translationbundle lang="ko"></translationbundle>
diff --git a/blimp/client/support/resources/translations/blimp_strings_lt.xtb b/blimp/client/support/resources/translations/blimp_strings_lt.xtb new file mode 100644 index 0000000..e386c81b --- /dev/null +++ b/blimp/client/support/resources/translations/blimp_strings_lt.xtb
@@ -0,0 +1 @@ +<?xml version="1.0" ?><!DOCTYPE translationbundle><translationbundle lang="lt"></translationbundle>
diff --git a/blimp/client/support/resources/translations/blimp_strings_lv.xtb b/blimp/client/support/resources/translations/blimp_strings_lv.xtb new file mode 100644 index 0000000..c27c4065 --- /dev/null +++ b/blimp/client/support/resources/translations/blimp_strings_lv.xtb
@@ -0,0 +1 @@ +<?xml version="1.0" ?><!DOCTYPE translationbundle><translationbundle lang="lv"></translationbundle>
diff --git a/blimp/client/support/resources/translations/blimp_strings_nl.xtb b/blimp/client/support/resources/translations/blimp_strings_nl.xtb new file mode 100644 index 0000000..08c20249 --- /dev/null +++ b/blimp/client/support/resources/translations/blimp_strings_nl.xtb
@@ -0,0 +1 @@ +<?xml version="1.0" ?><!DOCTYPE translationbundle><translationbundle lang="nl"></translationbundle>
diff --git a/blimp/client/support/resources/translations/blimp_strings_no.xtb b/blimp/client/support/resources/translations/blimp_strings_no.xtb new file mode 100644 index 0000000..52b6011 --- /dev/null +++ b/blimp/client/support/resources/translations/blimp_strings_no.xtb
@@ -0,0 +1 @@ +<?xml version="1.0" ?><!DOCTYPE translationbundle><translationbundle lang="no"></translationbundle>
diff --git a/blimp/client/support/resources/translations/blimp_strings_pl.xtb b/blimp/client/support/resources/translations/blimp_strings_pl.xtb new file mode 100644 index 0000000..57c76f6 --- /dev/null +++ b/blimp/client/support/resources/translations/blimp_strings_pl.xtb
@@ -0,0 +1 @@ +<?xml version="1.0" ?><!DOCTYPE translationbundle><translationbundle lang="pl"></translationbundle>
diff --git a/blimp/client/support/resources/translations/blimp_strings_pt-BR.xtb b/blimp/client/support/resources/translations/blimp_strings_pt-BR.xtb new file mode 100644 index 0000000..1ccc1be --- /dev/null +++ b/blimp/client/support/resources/translations/blimp_strings_pt-BR.xtb
@@ -0,0 +1 @@ +<?xml version="1.0" ?><!DOCTYPE translationbundle><translationbundle lang="pt-BR"></translationbundle>
diff --git a/blimp/client/support/resources/translations/blimp_strings_pt-PT.xtb b/blimp/client/support/resources/translations/blimp_strings_pt-PT.xtb new file mode 100644 index 0000000..448ac9de --- /dev/null +++ b/blimp/client/support/resources/translations/blimp_strings_pt-PT.xtb
@@ -0,0 +1 @@ +<?xml version="1.0" ?><!DOCTYPE translationbundle><translationbundle lang="pt-PT"></translationbundle>
diff --git a/blimp/client/support/resources/translations/blimp_strings_ro.xtb b/blimp/client/support/resources/translations/blimp_strings_ro.xtb new file mode 100644 index 0000000..ee107e4 --- /dev/null +++ b/blimp/client/support/resources/translations/blimp_strings_ro.xtb
@@ -0,0 +1 @@ +<?xml version="1.0" ?><!DOCTYPE translationbundle><translationbundle lang="ro"></translationbundle>
diff --git a/blimp/client/support/resources/translations/blimp_strings_ru.xtb b/blimp/client/support/resources/translations/blimp_strings_ru.xtb new file mode 100644 index 0000000..1161eea --- /dev/null +++ b/blimp/client/support/resources/translations/blimp_strings_ru.xtb
@@ -0,0 +1 @@ +<?xml version="1.0" ?><!DOCTYPE translationbundle><translationbundle lang="ru"></translationbundle>
diff --git a/blimp/client/support/resources/translations/blimp_strings_sk.xtb b/blimp/client/support/resources/translations/blimp_strings_sk.xtb new file mode 100644 index 0000000..285c7cb --- /dev/null +++ b/blimp/client/support/resources/translations/blimp_strings_sk.xtb
@@ -0,0 +1 @@ +<?xml version="1.0" ?><!DOCTYPE translationbundle><translationbundle lang="sk"></translationbundle>
diff --git a/blimp/client/support/resources/translations/blimp_strings_sl.xtb b/blimp/client/support/resources/translations/blimp_strings_sl.xtb new file mode 100644 index 0000000..5b943686 --- /dev/null +++ b/blimp/client/support/resources/translations/blimp_strings_sl.xtb
@@ -0,0 +1 @@ +<?xml version="1.0" ?><!DOCTYPE translationbundle><translationbundle lang="sl"></translationbundle>
diff --git a/blimp/client/support/resources/translations/blimp_strings_sr.xtb b/blimp/client/support/resources/translations/blimp_strings_sr.xtb new file mode 100644 index 0000000..037a5c14 --- /dev/null +++ b/blimp/client/support/resources/translations/blimp_strings_sr.xtb
@@ -0,0 +1 @@ +<?xml version="1.0" ?><!DOCTYPE translationbundle><translationbundle lang="sr"></translationbundle>
diff --git a/blimp/client/support/resources/translations/blimp_strings_sv.xtb b/blimp/client/support/resources/translations/blimp_strings_sv.xtb new file mode 100644 index 0000000..8f4581fd --- /dev/null +++ b/blimp/client/support/resources/translations/blimp_strings_sv.xtb
@@ -0,0 +1 @@ +<?xml version="1.0" ?><!DOCTYPE translationbundle><translationbundle lang="sv"></translationbundle>
diff --git a/blimp/client/support/resources/translations/blimp_strings_sw.xtb b/blimp/client/support/resources/translations/blimp_strings_sw.xtb new file mode 100644 index 0000000..0b25c33 --- /dev/null +++ b/blimp/client/support/resources/translations/blimp_strings_sw.xtb
@@ -0,0 +1 @@ +<?xml version="1.0" ?><!DOCTYPE translationbundle><translationbundle lang="sw"></translationbundle>
diff --git a/blimp/client/support/resources/translations/blimp_strings_th.xtb b/blimp/client/support/resources/translations/blimp_strings_th.xtb new file mode 100644 index 0000000..5d81291 --- /dev/null +++ b/blimp/client/support/resources/translations/blimp_strings_th.xtb
@@ -0,0 +1 @@ +<?xml version="1.0" ?><!DOCTYPE translationbundle><translationbundle lang="th"></translationbundle>
diff --git a/blimp/client/support/resources/translations/blimp_strings_tr.xtb b/blimp/client/support/resources/translations/blimp_strings_tr.xtb new file mode 100644 index 0000000..ead1d39 --- /dev/null +++ b/blimp/client/support/resources/translations/blimp_strings_tr.xtb
@@ -0,0 +1 @@ +<?xml version="1.0" ?><!DOCTYPE translationbundle><translationbundle lang="tr"></translationbundle>
diff --git a/blimp/client/support/resources/translations/blimp_strings_uk.xtb b/blimp/client/support/resources/translations/blimp_strings_uk.xtb new file mode 100644 index 0000000..29134e1 --- /dev/null +++ b/blimp/client/support/resources/translations/blimp_strings_uk.xtb
@@ -0,0 +1 @@ +<?xml version="1.0" ?><!DOCTYPE translationbundle><translationbundle lang="uk"></translationbundle>
diff --git a/blimp/client/support/resources/translations/blimp_strings_vi.xtb b/blimp/client/support/resources/translations/blimp_strings_vi.xtb new file mode 100644 index 0000000..d858f99 --- /dev/null +++ b/blimp/client/support/resources/translations/blimp_strings_vi.xtb
@@ -0,0 +1 @@ +<?xml version="1.0" ?><!DOCTYPE translationbundle><translationbundle lang="vi"></translationbundle>
diff --git a/blimp/client/support/resources/translations/blimp_strings_zh-CN.xtb b/blimp/client/support/resources/translations/blimp_strings_zh-CN.xtb new file mode 100644 index 0000000..effe01e --- /dev/null +++ b/blimp/client/support/resources/translations/blimp_strings_zh-CN.xtb
@@ -0,0 +1 @@ +<?xml version="1.0" ?><!DOCTYPE translationbundle><translationbundle lang="zh-CN"></translationbundle>
diff --git a/blimp/client/support/resources/translations/blimp_strings_zh-TW.xtb b/blimp/client/support/resources/translations/blimp_strings_zh-TW.xtb new file mode 100644 index 0000000..cb82bea --- /dev/null +++ b/blimp/client/support/resources/translations/blimp_strings_zh-TW.xtb
@@ -0,0 +1 @@ +<?xml version="1.0" ?><!DOCTYPE translationbundle><translationbundle lang="zh-TW"></translationbundle>
diff --git a/blimp/engine/BUILD.gn b/blimp/engine/BUILD.gn index a4dc49e..d026d40 100644 --- a/blimp/engine/BUILD.gn +++ b/blimp/engine/BUILD.gn
@@ -309,6 +309,7 @@ "//blimp/common/proto", "//blimp/engine:app_settings", "//blimp/engine:common", + "//blimp/helium", "//blimp/net", "//content/public/browser", "//content/public/common",
diff --git a/blimp/engine/app/settings_manager.cc b/blimp/engine/app/settings_manager.cc index 0c7fd35..50254fd 100644 --- a/blimp/engine/app/settings_manager.cc +++ b/blimp/engine/app/settings_manager.cc
@@ -43,7 +43,8 @@ if (settings_.record_whole_document != old_settings.record_whole_document) { // Notify the observers that the web preferences have changed. - FOR_EACH_OBSERVER(Observer, observer_list_, OnWebPreferencesChanged()); + for (auto& observer : observer_list_) + observer.OnWebPreferencesChanged(); } }
diff --git a/blimp/engine/app/ui/blimp_screen.cc b/blimp/engine/app/ui/blimp_screen.cc index c10396af..e5d33ad 100644 --- a/blimp/engine/app/ui/blimp_screen.cc +++ b/blimp/engine/app/ui/blimp_screen.cc
@@ -39,8 +39,8 @@ display_.SetScaleAndBounds(scale, gfx::Rect(size)); - FOR_EACH_OBSERVER(display::DisplayObserver, observers_, - OnDisplayMetricsChanged(display_, metrics)); + for (auto& observer : observers_) + observer.OnDisplayMetricsChanged(display_, metrics); } gfx::Point BlimpScreen::GetCursorScreenPoint() {
diff --git a/blimp/helium/BUILD.gn b/blimp/helium/BUILD.gn new file mode 100644 index 0000000..e25c41a --- /dev/null +++ b/blimp/helium/BUILD.gn
@@ -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. + +component("helium") { + output_name = "helium" + sources = [ + "errors.h", + "result.cc", + "result.h", + "stream.h", + "sync_manager.cc", + "sync_manager.h", + "syncable.h", + "transport.h", + "version_vector.cc", + "version_vector.h", + "version_vector_generator.h", + ] + + defines = [ "HELIUM_IMPLEMENTATION=1" ] + + deps = [ + ":helium_export", + "//base", + "//blimp/common", + "//net", + ] + + public_deps = [ + "//blimp/common/proto", + ] +} + +source_set("helium_export") { + sources = [ + "blimp_helium_export.h", + ] +} + +source_set("unit_tests") { + testonly = true + + sources = [ + "result_unittest.cc", + "syncable_unittest.cc", + "version_vector_generator_unittest.cc", + "version_vector_unittest.cc", + ] + + deps = [ + ":helium", + "//base", + "//blimp/common", + "//testing/gmock", + "//testing/gtest", + ] +}
diff --git a/blimp/helium/blimp_helium_export.h b/blimp/helium/blimp_helium_export.h new file mode 100644 index 0000000..7e93b27 --- /dev/null +++ b/blimp/helium/blimp_helium_export.h
@@ -0,0 +1,29 @@ +// 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 BLIMP_HELIUM_BLIMP_HELIUM_EXPORT_H_ +#define BLIMP_HELIUM_BLIMP_HELIUM_EXPORT_H_ + +#if defined(COMPONENT_BUILD) +#if defined(WIN32) + +#if defined(HELIUM_IMPLEMENTATION) +#define BLIMP_HELIUM_EXPORT __declspec(dllexport) +#else +#define BLIMP_HEIULM_EXPORT __declspec(dllimport) +#endif // defined(HELIUM_IMPLEMENTATION) + +#else // defined(WIN32) +#if defined(HELIUM_IMPLEMENTATION) +#define BLIMP_HELIUM_EXPORT __attribute__((visibility("default"))) +#else +#define BLIMP_HELIUM_EXPORT +#endif // defined(HELIUM_IMPLEMENTATION) +#endif + +#else // defined(COMPONENT_BUILD) +#define BLIMP_HELIUM_EXPORT +#endif + +#endif // BLIMP_HELIUM_BLIMP_HELIUM_EXPORT_H_
diff --git a/blimp/net/helium/helium_errors.h b/blimp/helium/errors.h similarity index 100% rename from blimp/net/helium/helium_errors.h rename to blimp/helium/errors.h
diff --git a/blimp/net/helium/helium_result.cc b/blimp/helium/result.cc similarity index 66% rename from blimp/net/helium/helium_result.cc rename to blimp/helium/result.cc index 55074ae7..5a84fb1 100644 --- a/blimp/net/helium/helium_result.cc +++ b/blimp/helium/result.cc
@@ -2,22 +2,23 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "blimp/net/helium/helium_result.h" +#include "blimp/helium/result.h" #include "base/logging.h" namespace blimp { +namespace helium { -const char* HeliumResultToString(HeliumResult result) { +const char* ResultToString(Result result) { switch (result) { - case HeliumResult::SUCCESS: + case Result::SUCCESS: return "SUCCESS"; break; #define HELIUM_ERROR(label, value) \ - case HeliumResult::ERR_##label: \ + case Result::ERR_##label: \ return "ERR_" #label; break; -#include "blimp/net/helium/helium_errors.h" +#include "blimp/helium/errors.h" #undef HELIUM_ERROR } @@ -25,4 +26,5 @@ return ""; } +} // namespace helium } // namespace blimp
diff --git a/blimp/net/helium/helium_result.h b/blimp/helium/result.h similarity index 62% rename from blimp/net/helium/helium_result.h rename to blimp/helium/result.h index 8f9f722..5d17e01a 100644 --- a/blimp/net/helium/helium_result.h +++ b/blimp/helium/result.h
@@ -2,29 +2,29 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef BLIMP_NET_HELIUM_HELIUM_RESULT_H_ -#define BLIMP_NET_HELIUM_HELIUM_RESULT_H_ - -#include "blimp/net/blimp_net_export.h" +#ifndef BLIMP_HELIUM_RESULT_H_ +#define BLIMP_HELIUM_RESULT_H_ namespace blimp { +namespace helium { // Defines the canonical list of Helium result codes. -// HeliumResult::OK is the only non-error code. +// Result::OK is the only non-error code. // All other codes are considered errors and are prefixed by ERR_. // See error_list.h for the unprefixed list of error codes. // // (Approach is inspired by net/base/net_errors.h) -enum HeliumResult { +enum Result { SUCCESS, #define HELIUM_ERROR(label, value) ERR_##label = value, -#include "blimp/net/helium/helium_errors.h" +#include "blimp/helium/errors.h" #undef HELIUM_ERROR }; // Gets a human-readable string representation of |result|. -const char* BLIMP_NET_EXPORT HeliumResultToString(HeliumResult result); +const char* ResultToString(Result result); +} // namespace helium } // namespace blimp -#endif // BLIMP_NET_HELIUM_HELIUM_RESULT_H_ +#endif // BLIMP_HELIUM_RESULT_H_
diff --git a/blimp/helium/result_unittest.cc b/blimp/helium/result_unittest.cc new file mode 100644 index 0000000..bc68740 --- /dev/null +++ b/blimp/helium/result_unittest.cc
@@ -0,0 +1,32 @@ +// 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 "blimp/helium/result.h" + +#include "base/macros.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace blimp { +namespace helium { +namespace { + +class ResultTest : public testing::Test { + public: + ResultTest() {} + ~ResultTest() override {} +}; + +TEST_F(ResultTest, ResultToString) { + // The exhaustive list of errors need not be specified here, but enough are + // specified that we can verify that the switch/case mapping works as + // intended. + EXPECT_STREQ("SUCCESS", ResultToString(Result::SUCCESS)); + EXPECT_STREQ("ERR_INTERNAL_ERROR", + ResultToString(Result::ERR_INTERNAL_ERROR)); + EXPECT_STREQ("ERR_DISCONNECTED", ResultToString(Result::ERR_DISCONNECTED)); +} + +} // namespace +} // namespace helium +} // namespace blimp
diff --git a/blimp/net/helium/helium_stream.h b/blimp/helium/stream.h similarity index 71% rename from blimp/net/helium/helium_stream.h rename to blimp/helium/stream.h index f68bb07..119e433 100644 --- a/blimp/net/helium/helium_stream.h +++ b/blimp/helium/stream.h
@@ -2,27 +2,28 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef BLIMP_NET_HELIUM_HELIUM_STREAM_H_ -#define BLIMP_NET_HELIUM_HELIUM_STREAM_H_ +#ifndef BLIMP_HELIUM_STREAM_H_ +#define BLIMP_HELIUM_STREAM_H_ #include <memory> #include "base/callback.h" -#include "blimp/net/helium/helium_result.h" +#include "blimp/helium/result.h" namespace blimp { +namespace helium { class HeliumMessage; // Pure virtual interface for HeliumMessage-oriented transport streams. -// Details about how the HeliumStream is bound to the network layer are handled -// by subclasses of HeliumStream. -class HeliumStream { +// Details about how the helium::Stream is bound to the network layer are +// handled by subclasses of helium::Stream. +class Stream { public: using ReceiveMessageCallback = - base::Callback<void(std::unique_ptr<HeliumMessage>, HeliumResult)>; + base::Callback<void(std::unique_ptr<HeliumMessage>, Result)>; - virtual ~HeliumStream() = default; + virtual ~Stream() = default; // Sends |helium_message| over the Stream. |callback| is invoked when the // message is sent (or otherwise moved to the low-level write buffers), @@ -30,9 +31,8 @@ // // The caller is responsible for ensuring that only one outstanding // SendMessage() call is made at a time. - virtual void SendMessage( - std::unique_ptr<HeliumMessage> helium_message, - const base::Callback<void(HeliumResult)>& callback) = 0; + virtual void SendMessage(std::unique_ptr<HeliumMessage> helium_message, + const base::Callback<void(Result)>& callback) = 0; // Asynchronously reads a HeliumMessage from the stream. // The caller is responsible for ensuring that only one outstanding @@ -45,6 +45,7 @@ virtual void ReceiveMessage(const ReceiveMessageCallback& on_receive_cb) = 0; }; +} // namespace helium } // namespace blimp #endif // BLIMP_NET_HELIUM_HELIUM_STREAM_H_
diff --git a/blimp/helium/sync_manager.cc b/blimp/helium/sync_manager.cc new file mode 100644 index 0000000..88612c1 --- /dev/null +++ b/blimp/helium/sync_manager.cc
@@ -0,0 +1,84 @@ +// 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 "blimp/helium/sync_manager.h" + +#include <utility> + +#include "base/logging.h" +#include "base/memory/ptr_util.h" + +namespace blimp { +namespace helium { +namespace { + +class SyncManagerImpl : public SyncManager { + public: + explicit SyncManagerImpl(std::unique_ptr<HeliumTransport> transport); + ~SyncManagerImpl() override; + + // HeliumSyncManager implementation. + std::unique_ptr<SyncRegistration> Register(Syncable* object) override; + std::unique_ptr<SyncRegistration> RegisterExisting(HeliumObjectId id, + Syncable* object) override; + void Unregister(HeliumObjectId id) override; + void Pause(HeliumObjectId id, bool paused) override; + + private: + std::unique_ptr<HeliumTransport> transport_; + + DISALLOW_COPY_AND_ASSIGN(SyncManagerImpl); +}; + +SyncManagerImpl::SyncManagerImpl(std::unique_ptr<HeliumTransport> transport) + : transport_(std::move(transport)) { + DCHECK(transport_); +} + +SyncManagerImpl::~SyncManagerImpl() {} + +std::unique_ptr<SyncManager::SyncRegistration> SyncManagerImpl::Register( + Syncable* object) { + NOTIMPLEMENTED(); + return nullptr; +} + +std::unique_ptr<SyncManager::SyncRegistration> +SyncManagerImpl::RegisterExisting(HeliumObjectId id, Syncable* object) { + NOTIMPLEMENTED(); + return nullptr; +} + +void SyncManagerImpl::Unregister(HeliumObjectId id) { + NOTIMPLEMENTED(); +} + +void SyncManagerImpl::Pause(HeliumObjectId id, bool paused) { + NOTIMPLEMENTED(); +} + +} // namespace + +// static +std::unique_ptr<SyncManager> SyncManager::Create( + std::unique_ptr<HeliumTransport> transport) { + return base::MakeUnique<SyncManagerImpl>(std::move(transport)); +} + +SyncManager::SyncRegistration::SyncRegistration(SyncManager* sync_manager, + HeliumObjectId id) + : id_(id), sync_manager_(sync_manager) { + DCHECK(sync_manager); +} + +SyncManager::SyncRegistration::~SyncRegistration() { + sync_manager_->Unregister(id_); +} + +void SyncManager::SyncRegistration::Pause(bool paused) { + sync_manager_->Pause(id_, paused); +} + +} // namespace helium +} // namespace blimp
diff --git a/blimp/net/helium/helium_sync_manager.h b/blimp/helium/sync_manager.h similarity index 85% rename from blimp/net/helium/helium_sync_manager.h rename to blimp/helium/sync_manager.h index 17c287ed..1fcdb9f 100644 --- a/blimp/net/helium/helium_sync_manager.h +++ b/blimp/helium/sync_manager.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef BLIMP_NET_HELIUM_HELIUM_SYNC_MANAGER_H_ -#define BLIMP_NET_HELIUM_HELIUM_SYNC_MANAGER_H_ +#ifndef BLIMP_HELIUM_SYNC_MANAGER_H_ +#define BLIMP_HELIUM_SYNC_MANAGER_H_ #include <stdint.h> #include <memory> @@ -11,6 +11,7 @@ #include "base/macros.h" namespace blimp { +namespace helium { class HeliumObject; class HeliumTransport; @@ -21,7 +22,7 @@ // TODO(kmarshall): Define this type. class HeliumTransport {}; -class HeliumSyncManager { +class SyncManager { public: // RAII object for managing the sync control and registration status of a // Syncable. When a Syncable is registered, it should hold onto the resulting @@ -36,8 +37,7 @@ // tell the SyncManager to exclude or include the Syncable in state sync. class SyncRegistration { public: - explicit SyncRegistration(HeliumSyncManager* sync_manager, - HeliumObjectId id); + SyncRegistration(SyncManager* sync_manager, HeliumObjectId id); ~SyncRegistration(); // Tells the HeliumSyncManager to pause or unpause synchronization for the @@ -48,15 +48,15 @@ private: HeliumObjectId id_; - HeliumSyncManager* sync_manager_; + SyncManager* sync_manager_; DISALLOW_COPY_AND_ASSIGN(SyncRegistration); }; - virtual ~HeliumSyncManager() {} + virtual ~SyncManager() {} // Returns a concrete implementation of HeliumSyncManager. - static std::unique_ptr<HeliumSyncManager> Create( + static std::unique_ptr<SyncManager> Create( std::unique_ptr<HeliumTransport> transport); // Registers a new Syncable for synchronization. The Sync layer allocates a @@ -74,7 +74,7 @@ Syncable* syncable) = 0; protected: - friend class HeliumSyncManager::SyncRegistration; + friend class SyncManager::SyncRegistration; // Tells the HeliumSyncManager to pause or unpause synchronization for the // HeliumObject associated with |this|. @@ -89,6 +89,7 @@ virtual void Unregister(HeliumObjectId id) = 0; }; +} // namespace helium } // namespace blimp -#endif // BLIMP_NET_HELIUM_HELIUM_SYNC_MANAGER_H_ +#endif // BLIMP_HELIUM_SYNC_MANAGER_H_
diff --git a/blimp/net/helium/syncable.h b/blimp/helium/syncable.h similarity index 74% rename from blimp/net/helium/syncable.h rename to blimp/helium/syncable.h index 81e806d..3011ae21 100644 --- a/blimp/net/helium/syncable.h +++ b/blimp/helium/syncable.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef BLIMP_NET_HELIUM_SYNCABLE_H_ -#define BLIMP_NET_HELIUM_SYNCABLE_H_ +#ifndef BLIMP_HELIUM_SYNCABLE_H_ +#define BLIMP_HELIUM_SYNCABLE_H_ #include <stdint.h> #include <memory> @@ -11,10 +11,20 @@ #include "base/callback.h" #include "base/macros.h" #include "blimp/common/mandatory_callback.h" -#include "blimp/net/helium/version_vector.h" -#include "blimp/net/helium/version_vector_generator.h" +#include "blimp/helium/version_vector.h" +#include "blimp/helium/version_vector_generator.h" + +namespace google { +namespace protobuf { +namespace io { +class CodedInputStream; +class CodedOutputStream; +} // namespace io +} // namespace protobuf +} // namespace google namespace blimp { +namespace helium { namespace proto { class ChangesetMessage; @@ -33,28 +43,29 @@ // Syncable is a base interface that is used for both self contained // objects (i.e. Simple register) and objects which are disconnected replicas // of external state. -// -template <class ChangesetType> class Syncable { public: virtual ~Syncable() {} - // Constructs a changeset between the |from| revision and its current state. - // The Sync layer will encapsulate the changeset with details since |from|, + // Emits a byte stream representation a changeset comprised of the changes + // between |from| and the current revision. + // + // The Sync layer will construct the changeset with details since |from|, // but the Syncable is responsible for including any revision information // additional to that expressed by the VersionVectors, that is necessary to // detect and resolve conflicts. - // The changeset is returned as a return value. - virtual std::unique_ptr<ChangesetType> CreateChangesetToCurrent( - const VersionVector& from) = 0; + virtual void CreateChangesetToCurrent( + const VersionVector& from, + google::protobuf::io::CodedOutputStream* output_stream) = 0; - // Applies a |changeset| given as parameter to the contents of the - // Syncable. + // Reads and applies a stream of changes originating from this Syncable. The + // unconsumed bytes of |input_stream| are left intact. // The VersionVectors |from| and |to| can be used to detect and resolve // concurrent change conflicts. - virtual void ApplyChangeset(const VersionVector& from, - const VersionVector& to, - std::unique_ptr<ChangesetType> changeset) = 0; + virtual void ApplyChangeset( + const VersionVector& from, + const VersionVector& to, + google::protobuf::io::CodedInputStream* input_stream) = 0; // Gives a chance for the Syncable to delete any old data previous to the // |checkpoint|. @@ -80,7 +91,7 @@ // 2.1) ApplyChangeset is called which updates the local state. // 2.2) PostApplyChangeset is called to apply the state from the local // object into the external state. -class TwoPhaseSyncable : public Syncable<proto::ChangesetMessage> { +class TwoPhaseSyncable : public Syncable { public: ~TwoPhaseSyncable() override {} @@ -102,6 +113,7 @@ MandatoryClosure&& done) = 0; }; +} // namespace helium } // namespace blimp -#endif // BLIMP_NET_HELIUM_SYNCABLE_H_ +#endif // BLIMP_HELIUM_SYNCABLE_H_
diff --git a/blimp/helium/syncable_unittest.cc b/blimp/helium/syncable_unittest.cc new file mode 100644 index 0000000..24d4902 --- /dev/null +++ b/blimp/helium/syncable_unittest.cc
@@ -0,0 +1,233 @@ +// 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 "blimp/helium/syncable.h" + +#include <utility> + +#include <string> + +#include "base/bind.h" +#include "base/macros.h" +#include "base/memory/ptr_util.h" +#include "blimp/common/mandatory_callback.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "third_party/protobuf/src/google/protobuf/io/coded_stream.h" +#include "third_party/protobuf/src/google/protobuf/io/zero_copy_stream_impl_lite.h" + +namespace blimp { +namespace helium { +namespace { + +// This is a sample implementation that demostrates the implementation +// of the Syncable and TwoPhaseSyncable +// For simplicity of this example, the ChangeSet will be an integer. +class FakeIntSyncable : public Syncable { + public: + explicit FakeIntSyncable(VersionVectorGenerator* clock_gen) + : clock_gen_(clock_gen), value_(0) { + last_modified_ = clock_gen_->current(); + } + + bool ModifiedSince(const VersionVector& from) const override { + return from.local_revision() < last_modified_.local_revision(); + } + + void CreateChangesetToCurrent( + const VersionVector& from, + google::protobuf::io::CodedOutputStream* output_stream) override { + output_stream->WriteVarint32(value_); + } + + void ApplyChangeset( + const VersionVector& from, + const VersionVector& to, + google::protobuf::io::CodedInputStream* input_stream) override { + input_stream->ReadVarint32(&value_); + + // Update our clock to the latest clock + last_modified_ = to; + } + + void ReleaseCheckpointsBefore(const VersionVector& checkpoint) override { + last_modified_ = checkpoint; + } + + void SetValue(int value) { + value_ = value; + + // Increment the parent clock and update our last_modified_ value + clock_gen_->Increment(); + last_modified_ = clock_gen_->current(); + } + + int value() { return value_; } + + private: + // The last time this object was changed + VersionVectorGenerator* clock_gen_; + VersionVector last_modified_; + uint32_t value_; + + DISALLOW_COPY_AND_ASSIGN(FakeIntSyncable); +}; + +class ParentObjectSyncable : public TwoPhaseSyncable { + public: + explicit ParentObjectSyncable(VersionVectorGenerator* clock_gen) + : TwoPhaseSyncable(), child1_(clock_gen), child2_(clock_gen) {} + + void CreateChangesetToCurrent( + const VersionVector& from, + google::protobuf::io::CodedOutputStream* output_stream) override { + // Low-level serialization. + // Field format: <field count> (<field id> <varint>)*. + int count = child1_.ModifiedSince(from) + child2_.ModifiedSince(from); + output_stream->WriteVarint32(count); + if (child1_.ModifiedSince(from)) { + output_stream->WriteTag(1); + child1_.CreateChangesetToCurrent(from, output_stream); + } + + if (child2_.ModifiedSince(from)) { + output_stream->WriteTag(2); + child2_.CreateChangesetToCurrent(from, output_stream); + } + } + + void ApplyChangeset( + const VersionVector& from, + const VersionVector& to, + google::protobuf::io::CodedInputStream* input_stream) override { + uint32_t count; + CHECK(input_stream->ReadVarint32(&count)); + CHECK_GT(count, 0u); + + for (uint32_t i = 0; i < count; ++i) { + switch (input_stream->ReadTag()) { + case 1: + child1_.ApplyChangeset(from, to, input_stream); + break; + case 2: + child2_.ApplyChangeset(from, to, input_stream); + break; + } + } + } + + void ReleaseCheckpointsBefore(const VersionVector& checkpoint) override { + child1_.ReleaseCheckpointsBefore(checkpoint); + child2_.ReleaseCheckpointsBefore(checkpoint); + } + + bool ModifiedSince(const VersionVector& from) const override { + return child1_.ModifiedSince(from) || child2_.ModifiedSince(from); + } + + void PreCreateChangesetToCurrent(const VersionVector& from, + MandatoryClosure&& done) override { + done.Run(); + } + + void PostApplyChangeset(const VersionVector& from, + const VersionVector& to, + MandatoryClosure&& done) override { + done.Run(); + } + + FakeIntSyncable* mutable_child1() { return &child1_; } + FakeIntSyncable* mutable_child2() { return &child2_; } + + private: + FakeIntSyncable child1_; + FakeIntSyncable child2_; + + DISALLOW_COPY_AND_ASSIGN(ParentObjectSyncable); +}; + +class SyncableTest : public testing::Test { + public: + SyncableTest() + : last_sync_master_(master_clock_.current()), + last_sync_replica_(replica_clock_.current()), + master_(&master_clock_), + replica_(&replica_clock_) {} + + ~SyncableTest() override {} + + protected: + // Propagates pending changes from |master_| to |replica_|. + void Synchronize() { + EXPECT_TRUE(master_.ModifiedSince(last_sync_master_)); + EXPECT_FALSE(replica_.ModifiedSince(last_sync_replica_)); + + // Create the changeset stream from |master_|. + std::string changeset; + google::protobuf::io::StringOutputStream raw_output_stream(&changeset); + google::protobuf::io::CodedOutputStream output_stream(&raw_output_stream); + + master_.CreateChangesetToCurrent(last_sync_master_, &output_stream); + CHECK(!changeset.empty()); + output_stream.Trim(); + + // Apply the changeset stream to |replica_|. + google::protobuf::io::ArrayInputStream raw_input_stream(changeset.data(), + changeset.size()); + google::protobuf::io::CodedInputStream input_stream(&raw_input_stream); + + replica_.ApplyChangeset(last_sync_replica_, replica_clock_.current(), + &input_stream); + last_sync_master_ = master_clock_.current(); + master_.ReleaseCheckpointsBefore(last_sync_master_); + + // Ensure that the changeset stream was consumed in its entirety. + EXPECT_FALSE(master_.ModifiedSince(last_sync_master_)); + EXPECT_FALSE(replica_.ModifiedSince(last_sync_replica_)); + EXPECT_FALSE(input_stream.Skip(1)); + } + + VersionVectorGenerator master_clock_; + VersionVectorGenerator replica_clock_; + VersionVector last_sync_master_; + VersionVector last_sync_replica_; + ParentObjectSyncable master_; + ParentObjectSyncable replica_; + + private: + DISALLOW_COPY_AND_ASSIGN(SyncableTest); +}; + +TEST_F(SyncableTest, SequentialMutations) { + master_.mutable_child1()->SetValue(123); + Synchronize(); + EXPECT_EQ(123, replica_.mutable_child1()->value()); + + master_.mutable_child1()->SetValue(456); + Synchronize(); + EXPECT_EQ(456, replica_.mutable_child1()->value()); +} + +TEST_F(SyncableTest, MutateMultiple) { + master_.mutable_child1()->SetValue(123); + master_.mutable_child2()->SetValue(456); + Synchronize(); + EXPECT_EQ(123, replica_.mutable_child1()->value()); + EXPECT_EQ(456, replica_.mutable_child2()->value()); +} + +TEST_F(SyncableTest, MutateMultipleDiscrete) { + master_.mutable_child1()->SetValue(123); + Synchronize(); + EXPECT_EQ(123, replica_.mutable_child1()->value()); + + master_.mutable_child2()->SetValue(456); + Synchronize(); + EXPECT_EQ(123, replica_.mutable_child1()->value()); + EXPECT_EQ(456, replica_.mutable_child2()->value()); +} + +} // namespace +} // namespace helium +} // namespace blimp
diff --git a/blimp/net/helium/helium_transport.h b/blimp/helium/transport.h similarity index 71% rename from blimp/net/helium/helium_transport.h rename to blimp/helium/transport.h index 21157da..2608e76 100644 --- a/blimp/net/helium/helium_transport.h +++ b/blimp/helium/transport.h
@@ -2,29 +2,30 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef BLIMP_NET_HELIUM_HELIUM_TRANSPORT_H_ -#define BLIMP_NET_HELIUM_HELIUM_TRANSPORT_H_ +#ifndef BLIMP_HELIUM_TRANSPORT_H_ +#define BLIMP_HELIUM_TRANSPORT_H_ #include <memory> #include "base/callback.h" #include "base/cancelable_callback.h" -#include "blimp/net/helium/helium_result.h" +#include "blimp/helium/result.h" namespace blimp { +namespace helium { -// Pure virtual interface for a HeliumStream factory. Subclasses can use this +// Pure virtual interface for a helium::Stream factory. Subclasses can use this // interface to encapsulate transport-specific stream connection semantics. -class HeliumTransport { +class Transport { public: // Callback invoked with the stream and result code of a Connect or Accept // attempt. - // The HeliumStream is assumed to be authenticated and ready to use. + // The helium::Stream is assumed to be authenticated and ready to use. // If the connection attempt failed, the value of |stream| will be null and // |result| will be set to the relevant error code. using StreamCreatedCallback = - base::CancelableCallback<void(std::unique_ptr<HeliumStream> stream, - HeliumResult result)>; + base::CancelableCallback<void(std::unique_ptr<Stream> stream, + Result result)>; // Callback to be invoked when the underlying transport transitions // between an offline/unusable state and an online/usable state. @@ -33,7 +34,7 @@ virtual void SetAvailabilityChangedCallback( const AvailabilityChangedCallback& callback); - // Asynchronously attempts to connect a new HeliumStream. + // Asynchronously attempts to connect a new helium::Stream. // Multiple overlapping connection attempts are permitted. // The caller can cancel |cb| if it no longer needs the stream. virtual void Connect(const StreamCreatedCallback& cb) = 0; @@ -46,6 +47,7 @@ virtual bool IsAvailable() = 0; }; +} // namespace helium } // namespace blimp -#endif // BLIMP_NET_HELIUM_HELIUM_TRANSPORT_H_ +#endif // BLIMP_HELIUM_TRANSPORT_H_
diff --git a/blimp/net/helium/version_vector.cc b/blimp/helium/version_vector.cc similarity index 96% rename from blimp/net/helium/version_vector.cc rename to blimp/helium/version_vector.cc index de76bb5..4ccaefc4 100644 --- a/blimp/net/helium/version_vector.cc +++ b/blimp/helium/version_vector.cc
@@ -2,13 +2,14 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "blimp/net/helium/version_vector.h" +#include "blimp/helium/version_vector.h" #include <algorithm> #include "base/logging.h" namespace blimp { +namespace helium { VersionVector::VersionVector() {} @@ -66,4 +67,5 @@ return VersionVector(remote_revision_, local_revision_); } +} // namespace helium } // namespace blimp
diff --git a/blimp/net/helium/version_vector.h b/blimp/helium/version_vector.h similarity index 91% rename from blimp/net/helium/version_vector.h rename to blimp/helium/version_vector.h index f29b55a..92b0d0b 100644 --- a/blimp/net/helium/version_vector.h +++ b/blimp/helium/version_vector.h
@@ -2,15 +2,16 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef BLIMP_NET_HELIUM_VERSION_VECTOR_H_ -#define BLIMP_NET_HELIUM_VERSION_VECTOR_H_ +#ifndef BLIMP_HELIUM_VERSION_VECTOR_H_ +#define BLIMP_HELIUM_VERSION_VECTOR_H_ #include <stdint.h> #include "blimp/common/proto/helium.pb.h" -#include "blimp/net/blimp_net_export.h" +#include "blimp/helium/blimp_helium_export.h" namespace blimp { +namespace helium { // Version Vectors are used to store revisions of both client and engine // objects. It will allow determining partial ordering between 2 VersionVectors. @@ -23,7 +24,7 @@ typedef uint64_t Revision; -class BLIMP_NET_EXPORT VersionVector { +class BLIMP_HELIUM_EXPORT VersionVector { public: enum class Comparison { LessThan, EqualTo, GreaterThan, Conflict }; @@ -74,6 +75,7 @@ Revision remote_revision_ = 0; }; +} // namespace helium } // namespace blimp -#endif // BLIMP_NET_HELIUM_VERSION_VECTOR_H_ +#endif // BLIMP_HELIUM_VERSION_VECTOR_H_
diff --git a/blimp/net/helium/version_vector_generator.h b/blimp/helium/version_vector_generator.h similarity index 74% rename from blimp/net/helium/version_vector_generator.h rename to blimp/helium/version_vector_generator.h index d22b9ab..3e93b02 100644 --- a/blimp/net/helium/version_vector_generator.h +++ b/blimp/helium/version_vector_generator.h
@@ -2,13 +2,14 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef BLIMP_NET_HELIUM_VERSION_VECTOR_GENERATOR_H_ -#define BLIMP_NET_HELIUM_VERSION_VECTOR_GENERATOR_H_ +#ifndef BLIMP_HELIUM_VERSION_VECTOR_GENERATOR_H_ +#define BLIMP_HELIUM_VERSION_VECTOR_GENERATOR_H_ #include "base/macros.h" -#include "blimp/net/helium/version_vector.h" +#include "blimp/helium/version_vector.h" namespace blimp { +namespace helium { // Responsible for generating monotonically increasing values // of VersionVectors. This generator is going to be used one per host @@ -28,6 +29,7 @@ DISALLOW_COPY_AND_ASSIGN(VersionVectorGenerator); }; +} // namespace helium } // namespace blimp -#endif // BLIMP_NET_HELIUM_VERSION_VECTOR_GENERATOR_H_ +#endif // BLIMP_HELIUM_VERSION_VECTOR_GENERATOR_H_
diff --git a/blimp/net/helium/version_vector_generator_unittest.cc b/blimp/helium/version_vector_generator_unittest.cc similarity index 91% rename from blimp/net/helium/version_vector_generator_unittest.cc rename to blimp/helium/version_vector_generator_unittest.cc index ea8d2b6..99b9ae0 100644 --- a/blimp/net/helium/version_vector_generator_unittest.cc +++ b/blimp/helium/version_vector_generator_unittest.cc
@@ -2,12 +2,13 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "blimp/net/helium/version_vector_generator.h" +#include "blimp/helium/version_vector_generator.h" #include "base/macros.h" #include "testing/gtest/include/gtest/gtest.h" namespace blimp { +namespace helium { namespace { class VersionVectorGeneratorTest : public testing::Test { @@ -36,4 +37,5 @@ } } // namespace +} // namespace helium } // namespace blimp
diff --git a/blimp/net/helium/version_vector_unittest.cc b/blimp/helium/version_vector_unittest.cc similarity index 97% rename from blimp/net/helium/version_vector_unittest.cc rename to blimp/helium/version_vector_unittest.cc index 5e3defe..285f059 100644 --- a/blimp/net/helium/version_vector_unittest.cc +++ b/blimp/helium/version_vector_unittest.cc
@@ -2,12 +2,15 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "blimp/net/helium/version_vector.h" +#include "blimp/helium/version_vector.h" + +#include <tuple> #include "base/macros.h" #include "testing/gtest/include/gtest/gtest.h" namespace blimp { +namespace helium { namespace { class VersionVectorComparisonTest @@ -137,4 +140,5 @@ } } // namespace +} // namespace helium } // namespace blimp
diff --git a/blimp/net/BUILD.gn b/blimp/net/BUILD.gn index 77b19a3..7b2df60f 100644 --- a/blimp/net/BUILD.gn +++ b/blimp/net/BUILD.gn
@@ -77,10 +77,10 @@ defines = [ "BLIMP_NET_IMPLEMENTATION=1" ] deps = [ - ":helium", ":net_export", "//base", "//blimp/common", + "//blimp/helium", "//net", "//third_party/WebKit/public:blink_headers", "//third_party/zlib", @@ -92,32 +92,6 @@ ] } -source_set("helium") { - sources = [ - "helium/helium_errors.h", - "helium/helium_result.cc", - "helium/helium_result.h", - "helium/helium_stream.h", - "helium/helium_sync_manager.cc", - "helium/helium_sync_manager.h", - "helium/helium_transport.h", - "helium/syncable.h", - "helium/version_vector.cc", - "helium/version_vector.h", - "helium/version_vector_generator.h", - ] - deps = [ - ":net_export", - "//base", - "//blimp/common", - "//net", - ] - - public_deps = [ - "//blimp/common/proto", - ] -} - source_set("net_export") { sources = [ "blimp_net_export.h", @@ -169,10 +143,6 @@ "delta_encoding_unittest.cc", "engine_authentication_handler_unittest.cc", "engine_connection_manager_unittest.cc", - "helium/helium_result_unittest.cc", - "helium/syncable_unittest.cc", - "helium/version_vector_generator_unittest.cc", - "helium/version_vector_unittest.cc", "input_message_unittest.cc", "ssl_client_transport_unittest.cc", "stream_packet_reader_unittest.cc", @@ -182,7 +152,6 @@ ] deps = [ - ":helium", ":net", ":test_support", "//base", @@ -190,9 +159,11 @@ "//blimp/common", "//blimp/common:test_support", "//blimp/common/proto", + "//blimp/helium", "//net:test_support", "//testing/gmock", "//testing/gtest", "//third_party/WebKit/public:blink_headers", + "//third_party/protobuf:protobuf_lite", ] }
diff --git a/blimp/net/blimp_connection.cc b/blimp/net/blimp_connection.cc index cc5f855f..57a3580d 100644 --- a/blimp/net/blimp_connection.cc +++ b/blimp/net/blimp_connection.cc
@@ -192,8 +192,8 @@ VLOG(1) << "OnConnectionError, error=" << error; // Propagate the error to all observers. - FOR_EACH_OBSERVER(ConnectionErrorObserver, error_observers_, - OnConnectionError(error)); + for (auto& observer : error_observers_) + observer.OnConnectionError(error); } } // namespace blimp
diff --git a/blimp/net/helium/helium_result_unittest.cc b/blimp/net/helium/helium_result_unittest.cc deleted file mode 100644 index 76c809e..0000000 --- a/blimp/net/helium/helium_result_unittest.cc +++ /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. - -#include "blimp/net/helium/helium_result.h" - -#include "base/macros.h" -#include "testing/gtest/include/gtest/gtest.h" - -namespace blimp { -namespace { - -class HeliumResultTest : public testing::Test { - public: - HeliumResultTest() {} - ~HeliumResultTest() override {} -}; - -TEST_F(HeliumResultTest, HeliumResultToString) { - // The exhaustive list of errors need not be specified here, but enough are - // specified that we can verify that the switch/case mapping works as - // intended. - EXPECT_STREQ("SUCCESS", HeliumResultToString(HeliumResult::SUCCESS)); - EXPECT_STREQ("ERR_INTERNAL_ERROR", - HeliumResultToString(HeliumResult::ERR_INTERNAL_ERROR)); - EXPECT_STREQ("ERR_DISCONNECTED", - HeliumResultToString(HeliumResult::ERR_DISCONNECTED)); -} - -} // namespace -} // namespace blimp
diff --git a/blimp/net/helium/helium_sync_manager.cc b/blimp/net/helium/helium_sync_manager.cc deleted file mode 100644 index 958ef53..0000000 --- a/blimp/net/helium/helium_sync_manager.cc +++ /dev/null
@@ -1,84 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "blimp/net/helium/helium_sync_manager.h" - -#include <utility> - -#include "base/logging.h" -#include "base/memory/ptr_util.h" - -namespace blimp { -namespace { - -class HeliumSyncManagerImpl : public HeliumSyncManager { - public: - explicit HeliumSyncManagerImpl(std::unique_ptr<HeliumTransport> transport); - ~HeliumSyncManagerImpl() override; - - // HeliumSyncManager implementation. - std::unique_ptr<SyncRegistration> Register(Syncable* object) override; - std::unique_ptr<SyncRegistration> RegisterExisting(HeliumObjectId id, - Syncable* object) override; - void Unregister(HeliumObjectId id) override; - void Pause(HeliumObjectId id, bool paused) override; - - private: - std::unique_ptr<HeliumTransport> transport_; - - DISALLOW_COPY_AND_ASSIGN(HeliumSyncManagerImpl); -}; - -HeliumSyncManagerImpl::HeliumSyncManagerImpl( - std::unique_ptr<HeliumTransport> transport) - : transport_(std::move(transport)) { - DCHECK(transport_); -} - -HeliumSyncManagerImpl::~HeliumSyncManagerImpl() {} - -std::unique_ptr<HeliumSyncManager::SyncRegistration> -HeliumSyncManagerImpl::Register(Syncable* object) { - NOTIMPLEMENTED(); - return nullptr; -} - -std::unique_ptr<HeliumSyncManager::SyncRegistration> -HeliumSyncManagerImpl::RegisterExisting(HeliumObjectId id, Syncable* object) { - NOTIMPLEMENTED(); - return nullptr; -} - -void HeliumSyncManagerImpl::Unregister(HeliumObjectId id) { - NOTIMPLEMENTED(); -} - -void HeliumSyncManagerImpl::Pause(HeliumObjectId id, bool paused) { - NOTIMPLEMENTED(); -} - -} // namespace - -// static -std::unique_ptr<HeliumSyncManager> HeliumSyncManager::Create( - std::unique_ptr<HeliumTransport> transport) { - return base::MakeUnique<HeliumSyncManagerImpl>(std::move(transport)); -} - -HeliumSyncManager::SyncRegistration::SyncRegistration( - HeliumSyncManager* sync_manager, - HeliumObjectId id) - : id_(id), sync_manager_(sync_manager) { - DCHECK(sync_manager); -} - -HeliumSyncManager::SyncRegistration::~SyncRegistration() { - sync_manager_->Unregister(id_); -} - -void HeliumSyncManager::SyncRegistration::Pause(bool paused) { - sync_manager_->Pause(id_, paused); -} - -} // namespace blimp
diff --git a/blimp/net/helium/syncable_unittest.cc b/blimp/net/helium/syncable_unittest.cc deleted file mode 100644 index 659df14e..0000000 --- a/blimp/net/helium/syncable_unittest.cc +++ /dev/null
@@ -1,204 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "blimp/net/helium/syncable.h" - -#include "base/bind.h" -#include "base/macros.h" -#include "base/memory/ptr_util.h" -#include "blimp/common/mandatory_callback.h" -#include "testing/gmock/include/gmock/gmock.h" -#include "testing/gtest/include/gtest/gtest.h" - -namespace blimp { -namespace { - -// This is a sample implementation that demostrates the implementation -// of the Syncable and TwoPhaseSyncable - -// For simplicity of this example, the ChangeSet will be an integer. -class FakeIntSyncable : public Syncable<int> { - public: - explicit FakeIntSyncable(VersionVectorGenerator* clock_gen) - : Syncable<int>(), clock_gen_(clock_gen), value_(0) { - last_modified_ = clock_gen_->current(); - } - - bool ModifiedSince(const VersionVector& from) const override { - return from.local_revision() < last_modified_.local_revision(); - } - - std::unique_ptr<int> CreateChangesetToCurrent( - const VersionVector& from) override { - return base::MakeUnique<int>(value_); - } - - void ApplyChangeset(const VersionVector& from, - const VersionVector& to, - std::unique_ptr<int> changeset) override { - // Restore the value - value_ = *changeset; - - // Update our clock to the latest clock - last_modified_ = to; - } - - void ReleaseCheckpointsBefore(const VersionVector& checkpoint) override { - last_modified_ = checkpoint; - } - - void SetValue(int value) { - value_ = value; - - // Increment the parent clock and update our last_modified_ value - clock_gen_->Increment(); - last_modified_ = clock_gen_->current(); - } - - int value() { return value_; } - - private: - // The last time this object was changed - VersionVectorGenerator* clock_gen_; - VersionVector last_modified_; - int32_t value_; - - DISALLOW_COPY_AND_ASSIGN(FakeIntSyncable); -}; - -class ParentObjectSyncable : public TwoPhaseSyncable { - public: - explicit ParentObjectSyncable(VersionVectorGenerator* clock_gen) - : TwoPhaseSyncable(), child1_(clock_gen), child2_(clock_gen) {} - - std::unique_ptr<proto::ChangesetMessage> CreateChangesetToCurrent( - const VersionVector& from) override { - std::unique_ptr<proto::ChangesetMessage> changeset = - base::MakeUnique<proto::ChangesetMessage>(); - - proto::TestChangesetMessage* bm = changeset->mutable_test(); - - if (child1_.ModifiedSince(from)) { - std::unique_ptr<int> value1 = child1_.CreateChangesetToCurrent(from); - bm->set_value1(*value1); - } - - if (child2_.ModifiedSince(from)) { - std::unique_ptr<int> value2 = child2_.CreateChangesetToCurrent(from); - bm->set_value2(*value2); - } - - return changeset; - } - - void ApplyChangeset( - const VersionVector& from, - const VersionVector& to, - std::unique_ptr<proto::ChangesetMessage> changeset) override { - proto::TestChangesetMessage bm = changeset->test(); - - int child1_value = bm.value1(); - if (child1_value != 0) { - child1_.ApplyChangeset(from, to, base::MakeUnique<int>(child1_value)); - } - - int child2_value = bm.value2(); - if (child2_value != 0) { - child2_.ApplyChangeset(from, to, base::MakeUnique<int>(child2_value)); - } - } - - void ReleaseCheckpointsBefore(const VersionVector& checkpoint) override { - child1_.ReleaseCheckpointsBefore(checkpoint); - child2_.ReleaseCheckpointsBefore(checkpoint); - } - - bool ModifiedSince(const VersionVector& from) const override { - return child1_.ModifiedSince(from) || child2_.ModifiedSince(from); - } - - void PreCreateChangesetToCurrent(const VersionVector& from, - MandatoryClosure&& done) override { - done.Run(); - } - - void PostApplyChangeset(const VersionVector& from, - const VersionVector& to, - MandatoryClosure&& done) override { - done.Run(); - } - - FakeIntSyncable* get_mutable_child1() { return &child1_; } - FakeIntSyncable* get_mutable_child2() { return &child2_; } - - private: - FakeIntSyncable child1_; - FakeIntSyncable child2_; - - DISALLOW_COPY_AND_ASSIGN(ParentObjectSyncable); -}; - -class SyncableTest : public testing::Test { - public: - SyncableTest() - : clock_gen1_(base::MakeUnique<VersionVectorGenerator>()), - clock_gen2_(base::MakeUnique<VersionVectorGenerator>()), - last_sync_local_(clock_gen1_->current()), - last_sync_remote_(clock_gen2_->current()), - parent_local_(clock_gen1_.get()), - parent_remote_(clock_gen2_.get()) {} - - ~SyncableTest() override {} - - protected: - void ChangeChild(int value1_set, - int value1_get, - int value2_get, - FakeIntSyncable* child_to_be_modified, - FakeIntSyncable* child_to_be_read_only) { - // Lets modify a children object - child_to_be_modified->SetValue(value1_set); - - // At this point |child1| and |parent_local_| should have its clock - // incremented whereas |child2| should still be the same. - EXPECT_TRUE(child_to_be_modified->ModifiedSince(last_sync_local_)); - EXPECT_FALSE(child_to_be_read_only->ModifiedSince(last_sync_local_)); - - std::unique_ptr<proto::ChangesetMessage> changeset = - parent_local_.CreateChangesetToCurrent(last_sync_local_); - - VersionVector local_clock = clock_gen1_->current(); - VersionVector remote_clock = local_clock.Invert(); - - parent_remote_.ApplyChangeset(last_sync_remote_, remote_clock, - std::move(changeset)); - last_sync_local_ = local_clock; - parent_local_.ReleaseCheckpointsBefore(local_clock); - EXPECT_FALSE(child_to_be_modified->ModifiedSince(last_sync_local_)); - EXPECT_FALSE(child_to_be_read_only->ModifiedSince(last_sync_local_)); - - EXPECT_EQ(value1_get, child_to_be_modified->value()); - EXPECT_EQ(value2_get, child_to_be_read_only->value()); - } - - std::unique_ptr<VersionVectorGenerator> clock_gen1_; - std::unique_ptr<VersionVectorGenerator> clock_gen2_; - VersionVector last_sync_local_; - VersionVector last_sync_remote_; - ParentObjectSyncable parent_local_; - ParentObjectSyncable parent_remote_; - - private: - DISALLOW_COPY_AND_ASSIGN(SyncableTest); -}; - -TEST_F(SyncableTest, CreateAndApplyChangesetTest) { - ChangeChild(123, 123, 0, parent_local_.get_mutable_child1(), - parent_local_.get_mutable_child2()); - ChangeChild(456, 456, 123, parent_local_.get_mutable_child2(), - parent_local_.get_mutable_child1()); -} - -} // namespace -} // namespace blimp
diff --git a/build/android/docs/coverage.md b/build/android/docs/coverage.md index 0a17987..3cc4c99 100644 --- a/build/android/docs/coverage.md +++ b/build/android/docs/coverage.md
@@ -1,32 +1,42 @@ # Android code coverage instructions -This is instruction for code coverage for android instrumentation and junit tests. +These are instructions for collecting code coverage data for android +instrumentation and junit tests. [TOC] ## How EMMA coverage works -In order to use EMMA code coverage, we need to create build time **.em** file and runtime -**.ec** file. Then we need to process them using the +In order to use EMMA code coverage, we need to create build time **.em** files +and runtime **.ec** files. Then we need to process them using the build/android/generate_emma_html.py script. ## How to collect EMMA coverage data -1. Build your APK with the GN arg emma_coverage=true. +1. Use the following GN build arguments: ``` - gn args out-gn/Debug - > target_os = "android" - > emma_coverage = true + target_os = "android" + emma_coverage = true + emma_filter = "org.chromium.chrome.browser.ntp.*,-*Test*,-*Fake*,-*Mock*" ``` - By doing so, **.em** files will be created in out-gn/Debug. + The filter syntax is as documented for the [EMMA coverage + filters](http://emma.sourceforge.net/reference/ch02s06s02.html). + + Now when building, **.em** files will be created in the build directory. 2. Run tests, with option `--coverage-dir <directory>`, to specify where to save the .ec file. For example, you can run chrome junit tests: - `out-gn/Debug/bin/run_chrome_junit_tests --coverage-dir /tmp/coverage`. -3. Now we have both .em and .ec files. We can merge them and create a html file, - using generate_emma_html.py. For example, generate_emma_html.py can be called - this way: + `out/Debug/bin/run_chrome_junit_tests --coverage-dir /tmp/coverage`. +3. Turn off strict mode when running instrumentation tests by adding + `--strict-mode=off` because the EMMA code causes strict mode violations by + accessing disk. +4. Use a pre-L Android OS (running Dalvik) because code coverage is not + supported in ART. +5. The coverage results of junit and instrumentation tests will be merged + automatically if they are in the same directory. +6. Now we have both .em and .ec files. We can create a html report using + `generate_emma_html.py`, for example: `build/android/generate_emma_html.py --coverage-dir /tmp/coverage/ - --metadata-dir out-gn/Debug/ --output example.html`. + --metadata-dir out/Debug/ --output example.html`. Then an example.html containing coverage info will be created: `EMMA: writing [html] report to [<your_current_directory>/example.html] …`
diff --git a/build/android/generate_emma_html.py b/build/android/generate_emma_html.py index 34121fd..dab3992 100755 --- a/build/android/generate_emma_html.py +++ b/build/android/generate_emma_html.py
@@ -90,7 +90,8 @@ input_args.append('-in') input_args.append(f) - output_args = ['-Dreport.html.out.file', options.output] + output_args = ['-Dreport.html.out.file', options.output, + '-Dreport.html.out.encoding', 'UTF-8'] source_args = ['-sp', ','.join(sources)] exit_code = cmd_helper.RunCmd(
diff --git a/build/args/bots/tryserver.chromium.linux/linux_chromium_headless_dbg.gn b/build/args/bots/tryserver.chromium.linux/linux_chromium_headless_dbg.gn new file mode 100644 index 0000000..70f8ffd --- /dev/null +++ b/build/args/bots/tryserver.chromium.linux/linux_chromium_headless_dbg.gn
@@ -0,0 +1,6 @@ +import("//build/args/headless.gn") + +# TODO(perezju): Remove this config after recipe is moved to release trybot. +is_debug = true +use_goma = true +symbol_level = 1
diff --git a/build/args/bots/tryserver.chromium.linux/headless_linux_dbg_trybot.gn b/build/args/bots/tryserver.chromium.linux/linux_chromium_headless_rel.gn similarity index 62% rename from build/args/bots/tryserver.chromium.linux/headless_linux_dbg_trybot.gn rename to build/args/bots/tryserver.chromium.linux/linux_chromium_headless_rel.gn index bcb5f2ce..eeeec7c 100644 --- a/build/args/bots/tryserver.chromium.linux/headless_linux_dbg_trybot.gn +++ b/build/args/bots/tryserver.chromium.linux/linux_chromium_headless_rel.gn
@@ -1,4 +1,5 @@ import("//build/args/headless.gn") -is_debug = true +is_debug = false +dcheck_always_on = true use_goma = true symbol_level = 1
diff --git a/build/config/compiler/compiler.gni b/build/config/compiler/compiler.gni index 5a4f99c2..b77b645ce 100644 --- a/build/config/compiler/compiler.gni +++ b/build/config/compiler/compiler.gni
@@ -65,13 +65,6 @@ } declare_args() { - # Generate Syzygy optimized binaries. Syzygy optimize mode is a profile - # guided optimization that reorders code for better locality. - syzygy_optimize = is_win && target_cpu == "x86" && is_official_build && - !is_clang && !is_win_fastlink && !is_syzyasan -} - -declare_args() { # Whether to use the gold linker from binutils instead of lld or bfd. use_gold = !use_lld && !(is_chromecast && is_linux && (current_cpu == "arm" || current_cpu == "mipsel")) &&
diff --git a/build/config/sanitizers/sanitizers.gni b/build/config/sanitizers/sanitizers.gni index 881ea32..b7053e7 100644 --- a/build/config/sanitizers/sanitizers.gni +++ b/build/config/sanitizers/sanitizers.gni
@@ -155,6 +155,12 @@ prebuilt_instrumented_libraries_available = is_msan && (msan_track_origins == 0 || msan_track_origins == 2) +if (use_libfuzzer && is_asan && is_linux) { + # We do leak checking with libFuzzer on Linux. Set is_lsan for code that + # relies on LEAK_SANITIZER define to avoid false positives. + is_lsan = true +} + # MSan only links Chrome properly in release builds (brettw -- 9/1/2015). The # same is possibly true for the other non-ASan sanitizers. But regardless of # whether it links, one would normally never run a sanitizer in debug mode.
diff --git a/build/win/syzygy/syzygy.gni b/build/win/syzygy/syzygy.gni index 1ae2ebe..1a45e86 100644 --- a/build/win/syzygy/syzygy.gni +++ b/build/win/syzygy/syzygy.gni
@@ -7,57 +7,6 @@ # Where the output binaries will be placed. syzygy_dest_dir = "$root_out_dir/syzygy" -# Generates a Syzygy optimize target. -# -# binary_name (required) -# Name of the binary to be instrumented, with no extension or path. This -# binary_name is assumed to be in the output directory and must be -# generated by a dependency of this target. -# -# deps (required) -# Normal meaning. -# -# data_deps -# Normal meaning. -template("syzygy_optimize") { - action(target_name) { - if (defined(invoker.visibility)) { - visibility = invoker.visibility - } - script = "//build/win/syzygy/reorder.py" - - binary_name = invoker.binary_name - input_dll = "$root_out_dir/$binary_name" - input_pdb = "$root_out_dir/$binary_name.pdb" - - inputs = [ - input_dll, - #input_pdb, - ] - - outputs = [ - "$syzygy_dest_dir/$binary_name", - "$syzygy_dest_dir/$binary_name.pdb", - ] - - args = [ - "--input_executable", - rebase_path(input_dll, root_build_dir), - "--input_symbol", - rebase_path(input_pdb, root_build_dir), - "--destination_dir", - rebase_path(syzygy_dest_dir, root_build_dir), - ] - - forward_variables_from(invoker, - [ - "deps", - "data_deps", - "public_deps", - ]) - } -} - # Instruments a binary with SyzyAsan. # # binary_name (required)
diff --git a/cc/output/color_lut_cache.cc b/cc/output/color_lut_cache.cc index 60e44623..21883c63 100644 --- a/cc/output/color_lut_cache.cc +++ b/cc/output/color_lut_cache.cc
@@ -21,7 +21,7 @@ GLuint textures[10]; size_t n = 0; for (const auto& cache_entry : lut_cache_) { - textures[n++] = cache_entry.second.first; + textures[n++] = cache_entry.second.texture; if (n == arraysize(textures)) { gl_->DeleteTextures(n, textures); n = 0; @@ -89,21 +89,21 @@ CacheKey key(from, std::make_pair(to, lut_samples)); auto iter = lut_cache_.Get(key); if (iter != lut_cache_.end()) { - iter->second.second = current_frame_; - return iter->second.first; + iter->second.last_used_frame = current_frame_; + return iter->second.texture; } unsigned int lut = MakeLUT(from, to, lut_samples); - lut_cache_.Put(key, std::make_pair(lut, current_frame_)); + lut_cache_.Put(key, CacheVal(lut, current_frame_)); return lut; } void ColorLUTCache::Swap() { current_frame_++; while (!lut_cache_.empty() && - current_frame_ - lut_cache_.rbegin()->second.first > + current_frame_ - lut_cache_.rbegin()->second.last_used_frame > kMaxFramesUnused) { - gl_->DeleteTextures(1, &lut_cache_.rbegin()->second.first); + gl_->DeleteTextures(1, &lut_cache_.rbegin()->second.texture); lut_cache_.ShrinkToSize(lut_cache_.size() - 1); } }
diff --git a/cc/output/color_lut_cache.h b/cc/output/color_lut_cache.h index 7d5effc..4ea5732 100644 --- a/cc/output/color_lut_cache.h +++ b/cc/output/color_lut_cache.h
@@ -33,10 +33,18 @@ unsigned int MakeLUT(const gfx::ColorSpace& from, gfx::ColorSpace to, int lut_samples); + typedef std::pair<gfx::ColorSpace, std::pair<gfx::ColorSpace, size_t>> CacheKey; - base::MRUCache<CacheKey, std::pair<unsigned int, size_t>> lut_cache_; + struct CacheVal { + CacheVal(unsigned int texture, uint32_t last_used_frame) + : texture(texture), last_used_frame(last_used_frame) {} + unsigned int texture; + uint32_t last_used_frame; + }; + + base::MRUCache<CacheKey, CacheVal> lut_cache_; uint32_t current_frame_; gpu::gles2::GLES2Interface* gl_; DISALLOW_COPY_AND_ASSIGN(ColorLUTCache);
diff --git a/chrome/VERSION b/chrome/VERSION index 93c9113..d6954ee9 100644 --- a/chrome/VERSION +++ b/chrome/VERSION
@@ -1,4 +1,4 @@ MAJOR=56 MINOR=0 -BUILD=2892 +BUILD=2895 PATCH=0
diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn index 01fff6e..c8e3f4d 100644 --- a/chrome/android/BUILD.gn +++ b/chrome/android/BUILD.gn
@@ -630,7 +630,7 @@ "//build/config/sanitizers:deps", "//chrome:chrome_android_core", "//components/sync", - "//components/sync:test_support_sync_fake_server_android", + "//components/sync:test_support_fake_server_android", ] } @@ -672,7 +672,7 @@ # This exists here because com.google.protobuf.nano is needed in tests, # but that code is stripped out via proguard. Adding this deps adds # usages and prevents removal of the proto code. - "//components/sync:test_support_sync_proto_java", + "//components/sync:test_support_proto_java", ] } @@ -728,7 +728,7 @@ "//components/policy/android:policy_java", "//components/signin/core/browser/android:signin_java_test_support", "//components/sync:sync_java_test_support", - "//components/sync:test_support_sync_proto_java", + "//components/sync:test_support_proto_java", "//components/sync/android:sync_java", "//content/public/android:content_java", "//content/public/test/android:content_java_test_support",
diff --git a/chrome/android/java/res/layout/account_chooser_dialog_item.xml b/chrome/android/java/res/layout/account_chooser_dialog_item.xml index 710a701..41875eca 100644 --- a/chrome/android/java/res/layout/account_chooser_dialog_item.xml +++ b/chrome/android/java/res/layout/account_chooser_dialog_item.xml
@@ -31,6 +31,7 @@ android:ellipsize="end" android:singleLine="true" android:fontFamily="sans-serif" + android:textColor="@color/default_text_color" android:textSize="@dimen/account_chooser_dialog_title_main_text_size"/> <TextView android:id="@+id/secondary_name"
diff --git a/chrome/android/java/res/layout/account_chooser_dialog_title.xml b/chrome/android/java/res/layout/account_chooser_dialog_title.xml index e339b060..2471f3d 100644 --- a/chrome/android/java/res/layout/account_chooser_dialog_title.xml +++ b/chrome/android/java/res/layout/account_chooser_dialog_title.xml
@@ -16,7 +16,8 @@ android:ellipsize="end" android:lineSpacingExtra="4dp" android:fontFamily="sans-serif" - android:textSize="@dimen/account_chooser_dialog_title_main_text_size" /> + android:textSize="@dimen/account_chooser_dialog_title_main_text_size" + android:textColor="@color/default_text_color"/> <TextView android:id="@+id/origin" android:layout_width="match_parent" @@ -26,4 +27,5 @@ android:fontFamily="sans-serif" android:textSize="@dimen/account_chooser_dialog_title_descriptive_text_size" android:textColor="@color/descriptive_text_color"/> + </LinearLayout>
diff --git a/chrome/android/java/res/layout/account_signin_account_view.xml b/chrome/android/java/res/layout/account_signin_account_view.xml index a39436a..5d65a12e 100644 --- a/chrome/android/java/res/layout/account_signin_account_view.xml +++ b/chrome/android/java/res/layout/account_signin_account_view.xml
@@ -28,6 +28,7 @@ android:layout_weight="1" android:minHeight="56dp" android:gravity="center_vertical" + android:textColor="@color/default_text_color" android:textSize="@dimen/fre_normal_text_size"/> <ImageView
diff --git a/chrome/android/java/res/layout/account_signin_view.xml b/chrome/android/java/res/layout/account_signin_view.xml index 9a43783..646127e 100644 --- a/chrome/android/java/res/layout/account_signin_view.xml +++ b/chrome/android/java/res/layout/account_signin_view.xml
@@ -41,6 +41,7 @@ android:paddingEnd="@dimen/signin_chooser_padding" android:paddingBottom="@dimen/signin_chooser_padding" android:background="@color/signin_head_background" + android:textColor="@color/default_text_color" android:textSize="@dimen/fre_title_text_size" android:text="@string/sign_in_to_chrome"/> @@ -57,6 +58,7 @@ android:padding="@dimen/signin_chooser_padding" android:lineSpacingMultiplier="1.4" android:text="@string/signin_account_choice_description" + android:textColor="@color/default_text_color" android:textSize="@dimen/fre_normal_text_size"/> </LinearLayout> </org.chromium.chrome.browser.signin.AccountSigninChooseView> @@ -100,6 +102,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="8dp" + android:textColor="@color/default_text_color" android:textSize="@dimen/fre_title_text_size" android:ellipsize="end" android:maxLines="1"/> @@ -133,6 +136,7 @@ android:paddingStart="16dp" android:paddingEnd="16dp" android:text="@string/sync_confirmation_chrome_sync_title" + android:textColor="@color/default_text_color" android:textSize="@dimen/fre_normal_text_size" android:fontFamily="sans-serif-medium" android:drawableStart="@drawable/chrome_sync_logo" @@ -171,6 +175,7 @@ android:paddingStart="16dp" android:paddingEnd="16dp" android:text="@string/sync_confirmation_personalize_services_title" + android:textColor="@color/default_text_color" android:textSize="@dimen/fre_normal_text_size" android:fontFamily="sans-serif-medium" android:drawableStart="@drawable/googleg"
diff --git a/chrome/android/java/res/layout/bookmark_row_content.xml b/chrome/android/java/res/layout/bookmark_row_content.xml index 41654e3..f176914 100644 --- a/chrome/android/java/res/layout/bookmark_row_content.xml +++ b/chrome/android/java/res/layout/bookmark_row_content.xml
@@ -31,6 +31,7 @@ android:singleLine="true" android:gravity="center_vertical" android:textAlignment="viewStart" + android:textColor="@color/default_text_color" android:textSize="16sp" /> <org.chromium.chrome.browser.widget.TintedImageButton
diff --git a/chrome/android/java/res/layout/bookmark_widget_item.xml b/chrome/android/java/res/layout/bookmark_widget_item.xml index 1e16fdf..bf1b669 100644 --- a/chrome/android/java/res/layout/bookmark_widget_item.xml +++ b/chrome/android/java/res/layout/bookmark_widget_item.xml
@@ -26,6 +26,7 @@ android:paddingEnd="16dp" android:singleLine="true" android:textAlignment="viewStart" + android:textColor="@color/default_text_color" android:textSize="16sp" /> </LinearLayout>
diff --git a/chrome/android/java/res/layout/data_reduction_promo_screen.xml b/chrome/android/java/res/layout/data_reduction_promo_screen.xml index 4d1850c..8370f8e 100644 --- a/chrome/android/java/res/layout/data_reduction_promo_screen.xml +++ b/chrome/android/java/res/layout/data_reduction_promo_screen.xml
@@ -57,6 +57,7 @@ android:layout_width="match_parent" android:layout_marginBottom="8dp" android:text="@string/data_reduction_promo_title" + android:textColor="@color/default_text_color" android:textSize="@dimen/data_reduction_promo_title_text_size" /> <TextView
diff --git a/chrome/android/java/res/layout/download_item_view.xml b/chrome/android/java/res/layout/download_item_view.xml index 4c68fa1..3c6fefd 100644 --- a/chrome/android/java/res/layout/download_item_view.xml +++ b/chrome/android/java/res/layout/download_item_view.xml
@@ -38,6 +38,7 @@ android:layout_alignParentEnd="true" android:layout_toEndOf="@+id/icon_view" android:singleLine="true" + android:textColor="@color/default_text_color" android:textSize="16sp" /> <TextView
diff --git a/chrome/android/java/res/layout/download_manager_ui_drawer_filter.xml b/chrome/android/java/res/layout/download_manager_ui_drawer_filter.xml index da8d2f3..58d2a73 100644 --- a/chrome/android/java/res/layout/download_manager_ui_drawer_filter.xml +++ b/chrome/android/java/res/layout/download_manager_ui_drawer_filter.xml
@@ -12,4 +12,5 @@ android:drawablePadding="@dimen/drawer_drawable_padding" android:paddingStart="@dimen/drawer_margin_large" android:paddingEnd="@dimen/drawer_margin_large" + android:textColor="@color/default_text_color" android:gravity="center_vertical" /> \ No newline at end of file
diff --git a/chrome/android/java/res/layout/infobar_control_icon_with_description.xml b/chrome/android/java/res/layout/infobar_control_icon_with_description.xml index 4fb6ea8..2d72ddf 100644 --- a/chrome/android/java/res/layout/infobar_control_icon_with_description.xml +++ b/chrome/android/java/res/layout/infobar_control_icon_with_description.xml
@@ -27,7 +27,8 @@ android:id="@+id/control_message" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:textSize="@dimen/infobar_text_size" /> + android:textSize="@dimen/infobar_text_size" + android:textColor="@color/default_text_color" /> <TextView android:id="@+id/control_secondary_message"
diff --git a/chrome/android/java/res/layout/infobar_control_message.xml b/chrome/android/java/res/layout/infobar_control_message.xml index 524a4d7..752c519b 100644 --- a/chrome/android/java/res/layout/infobar_control_message.xml +++ b/chrome/android/java/res/layout/infobar_control_message.xml
@@ -8,6 +8,7 @@ android:id="@+id/infobar_message" android:layout_width="match_parent" android:layout_height="wrap_content" + android:textColor="@color/default_text_color" android:textColorLink="@color/infobar_accent_blue" android:textDirection="locale" android:textSize="@dimen/infobar_text_size" />
diff --git a/chrome/android/java/res/layout/infobar_control_spinner_view.xml b/chrome/android/java/res/layout/infobar_control_spinner_view.xml index 5e1a729..cd79d8b6 100644 --- a/chrome/android/java/res/layout/infobar_control_spinner_view.xml +++ b/chrome/android/java/res/layout/infobar_control_spinner_view.xml
@@ -21,6 +21,7 @@ <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" + android:textColor="@color/default_text_color" android:textSize="@dimen/infobar_text_size" /> </org.chromium.chrome.browser.widget.DualControlLayout> \ No newline at end of file
diff --git a/chrome/android/java/res/layout/infobar_control_toggle.xml b/chrome/android/java/res/layout/infobar_control_toggle.xml index 153c2a30..9a65327 100644 --- a/chrome/android/java/res/layout/infobar_control_toggle.xml +++ b/chrome/android/java/res/layout/infobar_control_toggle.xml
@@ -25,7 +25,8 @@ android:layout_weight="1" android:layout_marginEnd="@dimen/infobar_control_margin_between_items" android:gravity="center_vertical" - android:textSize="@dimen/infobar_text_size" /> + android:textSize="@dimen/infobar_text_size" + android:textColor="@color/default_text_color" /> <android.support.v7.widget.SwitchCompat android:id="@+id/control_toggle_switch"
diff --git a/chrome/android/java/res/layout/password_entry_editor_interactive.xml b/chrome/android/java/res/layout/password_entry_editor_interactive.xml index 571c811b..7a999b1 100644 --- a/chrome/android/java/res/layout/password_entry_editor_interactive.xml +++ b/chrome/android/java/res/layout/password_entry_editor_interactive.xml
@@ -32,6 +32,7 @@ <TextView android:id="@+id/password_entry_editor_url" + android:textColor="@color/default_text_color" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginTop="10dp" @@ -72,6 +73,7 @@ <TextView android:id="@+id/password_entry_editor_name" + android:textColor="@color/default_text_color" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginTop="10dp" @@ -112,6 +114,7 @@ <TextView android:id="@+id/password_entry_editor_password" + android:textColor="@color/default_text_color" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginTop="10dp"
diff --git a/chrome/android/java/res/layout/password_generation_popup_suggestion.xml b/chrome/android/java/res/layout/password_generation_popup_suggestion.xml index 12a4b4e..7f01ef96 100644 --- a/chrome/android/java/res/layout/password_generation_popup_suggestion.xml +++ b/chrome/android/java/res/layout/password_generation_popup_suggestion.xml
@@ -33,6 +33,7 @@ android:paddingEnd="@dimen/password_generation_horizontal_margin" android:singleLine="true" android:textStyle="bold" + android:textColor="@color/default_text_color" android:textSize="@dimen/password_generation_text_size" android:includeFontPadding="false"/> @@ -44,6 +45,7 @@ android:paddingBottom="@dimen/password_generation_text_vertical_margin" android:paddingEnd="@dimen/password_generation_horizontal_margin" android:singleLine="true" + android:textColor="@color/default_text_color" android:textSize="@dimen/password_generation_text_size" android:includeFontPadding="false"/>
diff --git a/chrome/android/java/res/layout/payment_request_header.xml b/chrome/android/java/res/layout/payment_request_header.xml index dbb1e8b..aa227a2 100644 --- a/chrome/android/java/res/layout/payment_request_header.xml +++ b/chrome/android/java/res/layout/payment_request_header.xml
@@ -38,13 +38,14 @@ android:orientation="vertical"> <TextView - style="@style/PaymentsUiSectionDefaultText" android:id="@+id/page_title" android:layout_height="wrap_content" android:layout_width="wrap_content" android:ellipsize="end" android:maxLines="1" android:singleLine="true" + android:textColor="@color/default_text_color" + android:textSize="16sp" android:textStyle="bold" /> <TextView
diff --git a/chrome/android/java/res/layout/signin_and_sync_view.xml b/chrome/android/java/res/layout/signin_and_sync_view.xml index befa363e..76a4fe7 100644 --- a/chrome/android/java/res/layout/signin_and_sync_view.xml +++ b/chrome/android/java/res/layout/signin_and_sync_view.xml
@@ -15,6 +15,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginBottom="8dp" + android:textColor="@color/default_text_color" android:textSize="16sp" android:textStyle="bold" /> @@ -22,6 +23,7 @@ android:id="@+id/description" android:layout_width="wrap_content" android:layout_height="wrap_content" + android:textColor="@color/default_text_color" android:textSize="14sp" /> <LinearLayout
diff --git a/chrome/android/java/res/layout/tab_switcher_callout.xml b/chrome/android/java/res/layout/tab_switcher_callout.xml index 95c5c21..a8e467ad 100644 --- a/chrome/android/java/res/layout/tab_switcher_callout.xml +++ b/chrome/android/java/res/layout/tab_switcher_callout.xml
@@ -16,7 +16,8 @@ android:layout_height="wrap_content" android:fontFamily="sans-serif-medium" android:text="@string/tab_switcher_callout_header" - android:textSize="@dimen/infobar_big_icon_message_size" /> + android:textSize="@dimen/infobar_big_icon_message_size" + android:textColor="@color/default_text_color" /> <TextView android:id="@+id/description_view"
diff --git a/chrome/android/java/res/layout/upgrade_activity.xml b/chrome/android/java/res/layout/upgrade_activity.xml index b2e45bd..0b6150a 100644 --- a/chrome/android/java/res/layout/upgrade_activity.xml +++ b/chrome/android/java/res/layout/upgrade_activity.xml
@@ -43,7 +43,8 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/updating_chrome" - android:textSize="16sp" /> + android:textSize="16sp" + android:textColor="@color/default_text_color" /> </LinearLayout> </RelativeLayout>
diff --git a/chrome/android/java/res/values-v17/styles.xml b/chrome/android/java/res/values-v17/styles.xml index a28c35f..53fcd3c 100644 --- a/chrome/android/java/res/values-v17/styles.xml +++ b/chrome/android/java/res/values-v17/styles.xml
@@ -22,8 +22,8 @@ <item name="android:windowContentOverlay">@null</item> <item name="android:textColorHighlight">@color/text_highlight_color</item> <item name="android:textColorLink">@color/light_active_color</item> - <item name="android:textColor">@color/default_text_color</item> <item name="colorPrimaryDark">@android:color/black</item> + <item name="android:statusBarColor" tools:targetApi="21">@android:color/black</item> <!-- Overriding AppCompat values --> <item name="colorControlNormal">@color/light_normal_color</item> @@ -48,7 +48,6 @@ <style name="FullscreenWhite" parent="Theme.AppCompat.Light" > <item name="android:windowBackground">@android:color/white</item> - <item name="android:textColor">@color/default_text_color</item> <item name="android:textColorLink">@color/light_active_color</item> <item name="colorPrimaryDark">@android:color/black</item> <item name="colorPrimary">@color/light_active_color</item> @@ -453,6 +452,7 @@ <style name="ContextualSearchTextView"> <item name="android:layout_height">match_parent</item> <item name="android:ellipsize">end</item> + <item name="android:includeFontPadding">false</item> <item name="android:singleLine">true</item> <item name="android:textColor">#000</item> <item name="android:textSize">@dimen/overlay_panel_text_size</item> @@ -460,10 +460,11 @@ <style name="ContextualSearchContextTextView"> <item name="android:layout_width">0dp</item> <item name="android:layout_height">match_parent</item> + <item name="android:layout_weight">1</item> <item name="android:ellipsize">none</item> <item name="android:fadingEdge">horizontal</item> <item name="android:fadingEdgeLength">30dp</item> - <item name="android:layout_weight">1</item> + <item name="android:includeFontPadding">false</item> <item name="android:requiresFadingEdge">horizontal</item> <item name="android:singleLine">true</item> <item name="android:textColor">#CCC</item> @@ -477,6 +478,7 @@ <item name="android:layout_marginEnd">7dp</item> <item name="android:background">#FFF</item> <item name="android:ellipsize">end</item> + <item name="android:includeFontPadding">false</item> <item name="android:singleLine">true</item> <item name="android:textColor">#444</item> <item name="android:textSize">@dimen/contextual_search_caption_text_size</item>
diff --git a/chrome/android/java/res/values/colors.xml b/chrome/android/java/res/values/colors.xml index 8a27e1d2..9f22fa6 100644 --- a/chrome/android/java/res/values/colors.xml +++ b/chrome/android/java/res/values/colors.xml
@@ -5,7 +5,7 @@ <resources> <!-- Common colors --> - <color name="default_text_color">#000000</color> + <color name="default_text_color">#333</color> <color name="default_primary_color">#f2f2f2</color> <color name="light_normal_color">#5A5A5A</color> <color name="light_active_color">#4285F4</color>
diff --git a/chrome/android/java/res/values/dimens.xml b/chrome/android/java/res/values/dimens.xml index a1b5e3dd..1e60324 100644 --- a/chrome/android/java/res/values/dimens.xml +++ b/chrome/android/java/res/values/dimens.xml
@@ -102,6 +102,11 @@ <dimen name="contextual_search_peek_promo_padding">12dp</dimen> <dimen name="contextual_search_caption_text_size">14sp</dimen> <dimen name="contextual_search_thumbnail_size">36dp</dimen> + <!-- The following two dimensions were taking from the UI specs for contextual search, where + they were 36dp and 3dp respectively, but have been updated to allow for padding around + TextViews that we cannot get rid of. --> + <dimen name="contextual_search_text_layer_min_height">38dp</dimen> + <dimen name="contextual_search_term_caption_spacing">1.5dp</dimen> <!-- Overlay panel dimensions --> <dimen name="overlay_panel_bar_height">56dp</dimen>
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java index a77232bd..c45b3ace 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java
@@ -319,6 +319,7 @@ // Inform the WindowAndroid of the keyboard accessory view. mWindowAndroid.setKeyboardAccessoryView((ViewGroup) findViewById(R.id.keyboard_accessory)); initializeToolbar(); + mFullscreenManager = createFullscreenManager(); } @Override @@ -1361,14 +1362,11 @@ /** * Create a full-screen manager to be used by this activity. - * @param controlContainer The control container that will be controlled by the full-screen - * manager. + * Note: This is called during {@link #postInflationStartup}, so native code may not have been + * initialized, but Android Views will have been. * @return A {@link ChromeFullscreenManager} instance that's been created. */ - protected ChromeFullscreenManager createFullscreenManager(ControlContainer controlContainer) { - return new ChromeFullscreenManager( - this, controlContainer, getControlContainerHeightResource(), true); - } + protected abstract ChromeFullscreenManager createFullscreenManager(); /** * Exits the fullscreen mode, if any. Does nothing if no fullscreen is present. @@ -1403,10 +1401,6 @@ protected void initializeCompositorContent( LayoutManagerDocument layoutManager, View urlBar, ViewGroup contentContainer, ControlContainer controlContainer) { - if (controlContainer != null) { - mFullscreenManager = createFullscreenManager(controlContainer); - } - if (mContextualSearchManager != null) { mContextualSearchManager.initialize(contentContainer); mContextualSearchManager.setSearchContentViewDelegate(layoutManager);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java index bfd2b1f..62b54a8 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
@@ -61,6 +61,7 @@ import org.chromium.chrome.browser.firstrun.FirstRunFlowSequencer; import org.chromium.chrome.browser.firstrun.FirstRunSignInProcessor; import org.chromium.chrome.browser.firstrun.FirstRunStatus; +import org.chromium.chrome.browser.fullscreen.ChromeFullscreenManager; import org.chromium.chrome.browser.incognito.IncognitoNotificationManager; import org.chromium.chrome.browser.infobar.DataReductionPromoInfoBar; import org.chromium.chrome.browser.locale.LocaleManager; @@ -549,13 +550,6 @@ (int) controlHeight; } - // Bootstrap the first tab as it may have been created before initializing the - // fullscreen manager. - if (mTabModelSelectorImpl != null && mTabModelSelectorImpl.getCurrentTab() != null - && getFullscreenManager() != null) { - getFullscreenManager().setTab(mTabModelSelectorImpl.getCurrentTab()); - } - mFindToolbarManager = new FindToolbarManager(this, getToolbarManager().getActionModeController().getActionModeCallback()); if (getContextualSearchManager() != null) { @@ -1044,8 +1038,10 @@ boolean startIncognito = savedInstanceState != null && savedInstanceState.getBoolean("is_incognito_selected", false); int index = savedInstanceState != null ? savedInstanceState.getInt(WINDOW_INDEX, 0) : 0; + mTabModelSelectorImpl = (TabModelSelectorImpl) - TabWindowManager.getInstance().requestSelector(this, index); + TabWindowManager.getInstance().requestSelector(this, this, getFullscreenManager(), + index); if (mTabModelSelectorImpl == null) { Toast.makeText(this, getString(R.string.unsupported_number_of_windows), Toast.LENGTH_LONG).show(); @@ -1647,4 +1643,11 @@ public VrShellDelegate getVrShellDelegate() { return mVrShellDelegate; } + + @Override + protected ChromeFullscreenManager createFullscreenManager() { + return new ChromeFullscreenManager(this, + (ToolbarControlContainer) findViewById(R.id.control_container), + getControlContainerHeightResource(), true); + } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/EmbedContentViewActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/EmbedContentViewActivity.java index b7a283f..b6f5918 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/EmbedContentViewActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/EmbedContentViewActivity.java
@@ -16,7 +16,6 @@ import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tabmodel.document.TabDelegate; import org.chromium.chrome.browser.webapps.FullScreenActivity; -import org.chromium.chrome.browser.widget.ControlContainer; import org.chromium.content_public.browser.LoadUrlParams; import org.chromium.ui.base.PageTransition; @@ -80,8 +79,7 @@ } @Override - protected final ChromeFullscreenManager createFullscreenManager( - ControlContainer controlContainer) { + protected final ChromeFullscreenManager createFullscreenManager() { return null; }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ItemChooserDialog.java b/chrome/android/java/src/org/chromium/chrome/browser/ItemChooserDialog.java index 41c20906..50de5333 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ItemChooserDialog.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ItemChooserDialog.java
@@ -10,8 +10,6 @@ import android.content.DialogInterface; import android.graphics.Color; import android.graphics.drawable.ColorDrawable; -import android.support.annotation.ColorInt; -import android.support.annotation.ColorRes; import android.text.SpannableString; import android.text.method.LinkMovementMethod; import android.view.Gravity; @@ -137,6 +135,9 @@ // The background color of the highlighted item. private final int mBackgroundHighlightColor; + // The color of the non-highlighted text. + private final int mDefaultTextColor; + // The zero-based index of the item currently selected in the dialog, // or -1 (INVALID_POSITION) if nothing is selected. private int mSelectedItem = ListView.INVALID_POSITION; @@ -157,6 +158,8 @@ mBackgroundHighlightColor = ApiCompatibilityUtils.getColor(getContext().getResources(), R.color.light_active_color); + mDefaultTextColor = ApiCompatibilityUtils.getColor(getContext().getResources(), + R.color.default_text_color); } @Override @@ -297,22 +300,18 @@ R.layout.item_chooser_dialog_row, parent, false); } - // Set highlighting for currently selected item. if (position == mSelectedItem) { view.setBackgroundColor(mBackgroundHighlightColor); view.setTextColor(Color.WHITE); } else { view.setBackground(null); - - @ColorRes final int textColorId = isEnabled(position) - ? R.color.default_text_color - : R.color.primary_text_disabled_material_light; - - @ColorInt final int textColor = ApiCompatibilityUtils.getColor( - getContext().getResources(), textColorId); - - view.setTextColor(textColor); + if (!isEnabled(position)) { + view.setTextColor(ApiCompatibilityUtils.getColor(getContext().getResources(), + R.color.primary_text_disabled_material_light)); + } else { + view.setTextColor(mDefaultTextColor); + } } view.setText(getDisplayText(position));
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/PersonalDataManager.java b/chrome/android/java/src/org/chromium/chrome/browser/autofill/PersonalDataManager.java index 16e47f4..9e364fe 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/PersonalDataManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/autofill/PersonalDataManager.java
@@ -548,14 +548,14 @@ * Gets the profiles to suggest when filling a form or completing a transaction. The profiles * will have been processed to be more relevant to the user. * - * @param includeName Whether to include the name in the profile's label. + * @param includeNameInLabel Whether to include the name in the profile's label. * @return The list of profiles to suggest to the user. */ - public List<AutofillProfile> getProfilesToSuggest(boolean includeName) { + public List<AutofillProfile> getProfilesToSuggest(boolean includeNameInLabel) { ThreadUtils.assertOnUiThread(); return getProfilesWithLabels( nativeGetProfileLabelsToSuggest( - mPersonalDataManagerAndroid, includeName), + mPersonalDataManagerAndroid, includeNameInLabel), nativeGetProfileGUIDsToSuggest(mPersonalDataManagerAndroid)); } @@ -823,7 +823,7 @@ private native String[] nativeGetProfileLabelsForSettings( long nativePersonalDataManagerAndroid); private native String[] nativeGetProfileLabelsToSuggest(long nativePersonalDataManagerAndroid, - boolean includeName); + boolean includeNameInLabel); private native AutofillProfile nativeGetProfileByGUID(long nativePersonalDataManagerAndroid, String guid); private native String nativeSetProfile(long nativePersonalDataManagerAndroid,
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchBarControl.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchBarControl.java index 09c8c55..f3d5ad7 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchBarControl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchBarControl.java
@@ -7,6 +7,7 @@ import android.content.Context; import android.view.ViewGroup; +import org.chromium.chrome.R; import org.chromium.chrome.browser.compositor.bottombar.OverlayPanel; import org.chromium.chrome.browser.compositor.bottombar.OverlayPanelAnimation; import org.chromium.chrome.browser.compositor.layouts.ChromeAnimation; @@ -55,6 +56,10 @@ */ private float mSearchBarTermOpacity = 1.f; + // Dimensions used for laying out the search bar. + private final float mTextLayerMinHeight; + private final float mTermCaptionSpacing; + /** * Constructs a new bottom bar control container by inflating views from XML. * @@ -71,6 +76,26 @@ mContextControl = new ContextualSearchContextControl(panel, context, container, loader); mSearchTermControl = new ContextualSearchTermControl(panel, context, container, loader); mCaptionControl = new ContextualSearchCaptionControl(panel, context, container, loader); + + mTextLayerMinHeight = context.getResources().getDimension( + R.dimen.contextual_search_text_layer_min_height); + mTermCaptionSpacing = context.getResources().getDimension( + R.dimen.contextual_search_term_caption_spacing); + } + + /** + * Returns the minimum height that the text layer (containing the Search Context, Term and + * Caption) should be. + */ + public float getTextLayerMinHeight() { + return mTextLayerMinHeight; + } + + /** + * Returns the spacing that should be placed between the Search Term and Caption. + */ + public float getSearchTermCaptionSpacing() { + return mTermCaptionSpacing; } /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchCaptionControl.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchCaptionControl.java index 0a6b9646..4efe86bf6 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchCaptionControl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchCaptionControl.java
@@ -5,8 +5,10 @@ package org.chromium.chrome.browser.compositor.bottombar.contextualsearch; import android.content.Context; +import android.support.v4.view.animation.FastOutSlowInInterpolator; import android.view.View; import android.view.ViewGroup; +import android.view.animation.Interpolator; import android.widget.TextView; import org.chromium.chrome.R; @@ -14,6 +16,7 @@ import org.chromium.chrome.browser.compositor.bottombar.OverlayPanelAnimation; import org.chromium.chrome.browser.compositor.bottombar.OverlayPanelInflater; import org.chromium.chrome.browser.compositor.layouts.ChromeAnimation; +import org.chromium.chrome.browser.compositor.layouts.ChromeAnimation.Animatable; import org.chromium.ui.resources.dynamics.DynamicResourceLoader; /** @@ -24,6 +27,7 @@ implements ChromeAnimation.Animatable<ContextualSearchCaptionControl.AnimationType> { private static final float ANIMATION_PERCENTAGE_ZERO = 0.f; private static final float ANIMATION_PERCENTAGE_COMPLETE = 1.f; + private static final Interpolator ANIMATION_INTERPOLATOR = new FastOutSlowInInterpolator(); /** * Animation properties. @@ -147,7 +151,7 @@ private void animateTransitionIn() { mOverlayPanel.addToAnimation(this, AnimationType.APPEARANCE, ANIMATION_PERCENTAGE_ZERO, ANIMATION_PERCENTAGE_COMPLETE, OverlayPanelAnimation.MAXIMUM_ANIMATION_DURATION_MS, - 0); + 0, false, ANIMATION_INTERPOLATOR); } @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/scene_layer/ContextualSearchSceneLayer.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/scene_layer/ContextualSearchSceneLayer.java index 39edfed..f33a148 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/scene_layer/ContextualSearchSceneLayer.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/scene_layer/ContextualSearchSceneLayer.java
@@ -155,7 +155,9 @@ searchBarMarginSide * mDpToPx, searchBarHeight * mDpToPx, searchContextOpacity, + searchBarControl.getTextLayerMinHeight(), searchTermOpacity, + searchBarControl.getSearchTermCaptionSpacing(), searchCaptionAnimationPercentage, searchCaptionVisible, searchBarBorderVisible, @@ -259,7 +261,9 @@ float searchBarMarginSide, float searchBarHeight, float searchContextOpacity, + float searchTextLayerMinHeight, float searchTermOpacity, + float searchTermCaptionSpacing, float searchCaptionAnimationPercentage, boolean searchCaptionVisible, boolean searchBarBorderVisible,
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuTitleView.java b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuTitleView.java index 4093c29..2cef760 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuTitleView.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuTitleView.java
@@ -9,6 +9,9 @@ import android.widget.ScrollView; import android.widget.TextView; +import org.chromium.base.ApiCompatibilityUtils; +import org.chromium.chrome.R; + /** * Context menu title text view that is restricted height and scrollable. */ @@ -38,6 +41,8 @@ title = sb.toString(); } titleView.setText(title); + titleView.setTextColor(ApiCompatibilityUtils.getColor(getResources(), + R.color.default_text_color)); titleView.setPadding(0, 0, 0, padding); addView(titleView); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchFieldTrial.java b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchFieldTrial.java index b39e1b0..e6a8ad2 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchFieldTrial.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchFieldTrial.java
@@ -73,6 +73,11 @@ private static final String ENABLE_BAR_OVERLAP_COLLECTION = "enable_bar_overlap_collection"; private static final String BAR_OVERLAP_SUPPRESSION_ENABLED = "enable_bar_overlap_suppression"; + // Safety switch for disabling online-detection. Also used to disable detection when running + // tests. + @VisibleForTesting + static final String ONLINE_DETECTION_DISABLED = "disable_online_detection"; + // Cached values to avoid repeated and redundant JNI operations. private static Boolean sEnabled; private static Boolean sDisableSearchTermResolution; @@ -95,6 +100,7 @@ private static Boolean sIsBarOverlapSuppressionEnabled; private static Integer sSuppressionTaps; private static Boolean sIsContextualCardsBarIntegrationEnabled; + private static Boolean sIsOnlineDetectionDisabled; /** * Don't instantiate. @@ -375,6 +381,17 @@ return sIsContextualCardsBarIntegrationEnabled; } + /** + * @return Whether detection of device-online should be disabled (default false). + */ + static boolean isOnlineDetectionDisabled() { + // TODO(donnd): Convert to test-only after launch and we have confidence it's robust. + if (sIsOnlineDetectionDisabled == null) { + sIsOnlineDetectionDisabled = getBooleanParam(ONLINE_DETECTION_DISABLED); + } + return sIsOnlineDetectionDisabled; + } + // -------------------------------------------------------------------------------------------- // Helpers. // --------------------------------------------------------------------------------------------
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManager.java b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManager.java index 7cf16f1..d1e0c44 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManager.java
@@ -48,6 +48,7 @@ import org.chromium.content_public.browser.NavigationEntry; import org.chromium.content_public.browser.WebContents; import org.chromium.content_public.common.TopControlsState; +import org.chromium.net.NetworkChangeNotifier; import org.chromium.ui.base.WindowAndroid; import java.net.MalformedURLException; @@ -676,7 +677,8 @@ String message; boolean doLiteralSearch = false; if (isNetworkUnavailable) { - // TODO(donnd): double-check that the network is really unavailable? + // TODO(donnd): double-check that the network is really unavailable, maybe using + // NetworkChangeNotifier#isOnline. message = mActivity.getResources().getString( R.string.contextual_search_network_unavailable); } else if (!isHttpFailureCode(responseCode) && !TextUtils.isEmpty(displayText)) { @@ -738,6 +740,23 @@ } /** + * External entry point to determine if the device is currently online or not. + * Stubbed out when under test. + * @return Whether the device is currently online. + */ + boolean isDeviceOnline() { + return mNetworkCommunicator.isOnline(); + } + + /** + * Handles this {@link ContextualSearchNetworkCommunicator} vector when not under test. + */ + @Override + public boolean isOnline() { + return NetworkChangeNotifier.isOnline(); + } + + /** * Loads a Search Request in the Contextual Search's Content View. */ private void loadSearchUrl() {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchNetworkCommunicator.java b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchNetworkCommunicator.java index a46f42a..641f5df 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchNetworkCommunicator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchNetworkCommunicator.java
@@ -44,6 +44,11 @@ boolean doPreventPreload, int selectionStartAdjust, int selectionEndAdjust, String contextLanguage, String thumbnailUrl, String caption); + /** + * @return Whether the device is currently online. + */ + boolean isOnline(); + // -------------------------------------------------------------------------------------------- // These are non-network actions that need to be stubbed out for testing. // --------------------------------------------------------------------------------------------
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchTabHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchTabHelper.java index ecc3526..0bee2a4 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchTabHelper.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchTabHelper.java
@@ -18,11 +18,13 @@ import org.chromium.chrome.browser.tab.Tab; import org.chromium.content.browser.ContentViewCore; import org.chromium.content_public.browser.GestureStateListener; +import org.chromium.net.NetworkChangeNotifier; /** * Manages the activation and gesture listeners for ContextualSearch on a given tab. */ -public class ContextualSearchTabHelper extends EmptyTabObserver { +public class ContextualSearchTabHelper + extends EmptyTabObserver implements NetworkChangeNotifier.ConnectionTypeObserver { /** * Notification handler for Contextual Search events. */ @@ -53,8 +55,16 @@ private ContextualSearchTabHelper(Tab tab) { mTab = tab; tab.addObserver(this); + // Connect to a network, unless under test. + if (NetworkChangeNotifier.isInitialized()) { + NetworkChangeNotifier.addConnectionTypeObserver(this); + } } + // ============================================================================================ + // EmptyTabObserver overrides. + // ============================================================================================ + @Override public void onPageLoadStarted(Tab tab, String url) { if (tab.getContentViewCore() == null) { @@ -132,6 +142,19 @@ } } + // ============================================================================================ + // NetworkChangeNotifier.ConnectionTypeObserver overrides. + // ============================================================================================ + + @Override + public void onConnectionTypeChanged(int connectionType) { + updateContextualSearchHooks(mBaseContentViewCore); + } + + // ============================================================================================ + // Private helpers. + // ============================================================================================ + /** * Should be called whenever the Tab's ContentViewCore changes. Removes hooks from the * existing ContentViewCore, if necessary and then adds hooks for the new ContentViewCore. @@ -198,9 +221,18 @@ // Svelte and Accessibility devices are incompatible with the first-run flow and // Talkback has poor interaction with tap to search (see http://crbug.com/399708 and // http://crbug.com/396934). - // TODO(jeremycho): Handle these cases. && !manager.isRunningInCompatibilityMode() - && !(mTab.isShowingErrorPage() || mTab.isShowingInterstitialPage()); + && !(mTab.isShowingErrorPage() || mTab.isShowingInterstitialPage()) + && isDeviceOnline(manager); + } + + /** + * @return Whether the device is online, or we have disabled online-detection. + */ + private boolean isDeviceOnline(ContextualSearchManager manager) { + if (ContextualSearchFieldTrial.isOnlineDetectionDisabled()) return true; + + return manager.isDeviceOnline(); } /** @@ -214,6 +246,10 @@ return null; } + // ============================================================================================ + // Native support. + // ============================================================================================ + @CalledByNative private void onContextualSearchPrefChanged() { updateContextualSearchHooks(mBaseContentViewCore);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/crash/MinidumpUploadCallable.java b/chrome/android/java/src/org/chromium/chrome/browser/crash/MinidumpUploadCallable.java index 58e6857..d5c4aa6 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/crash/MinidumpUploadCallable.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/crash/MinidumpUploadCallable.java
@@ -4,7 +4,6 @@ package org.chromium.chrome.browser.crash; -import android.content.Context; import android.content.SharedPreferences; import android.support.annotation.IntDef; @@ -12,8 +11,7 @@ import org.chromium.base.Log; import org.chromium.base.StreamUtil; import org.chromium.base.VisibleForTesting; -import org.chromium.chrome.browser.preferences.privacy.CrashReportingPermissionManager; -import org.chromium.chrome.browser.preferences.privacy.PrivacyPreferencesManager; +import org.chromium.components.minidump_uploader.util.CrashReportingPermissionManager; import org.chromium.components.minidump_uploader.util.HttpURLConnectionFactory; import org.chromium.components.minidump_uploader.util.HttpURLConnectionFactoryImpl; @@ -71,19 +69,19 @@ private final HttpURLConnectionFactory mHttpURLConnectionFactory; private final CrashReportingPermissionManager mPermManager; - public MinidumpUploadCallable(File fileToUpload, File logfile, Context context) { - this(fileToUpload, logfile, new HttpURLConnectionFactoryImpl(), - PrivacyPreferencesManager.getInstance()); + public MinidumpUploadCallable( + File fileToUpload, File logfile, CrashReportingPermissionManager permissionManager) { + this(fileToUpload, logfile, new HttpURLConnectionFactoryImpl(), permissionManager); removeOutdatedPrefs(ContextUtils.getAppSharedPreferences()); } public MinidumpUploadCallable(File fileToUpload, File logfile, HttpURLConnectionFactory httpURLConnectionFactory, - CrashReportingPermissionManager permManager) { + CrashReportingPermissionManager permissionManager) { mFileToUpload = fileToUpload; mLogfile = logfile; mHttpURLConnectionFactory = httpURLConnectionFactory; - mPermManager = permManager; + mPermManager = permissionManager; } @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/crash/MinidumpUploadService.java b/chrome/android/java/src/org/chromium/chrome/browser/crash/MinidumpUploadService.java index f8eec1f..72178f6 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/crash/MinidumpUploadService.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/crash/MinidumpUploadService.java
@@ -15,6 +15,7 @@ import org.chromium.base.annotations.CalledByNative; import org.chromium.base.metrics.RecordHistogram; import org.chromium.chrome.browser.preferences.ChromePreferenceManager; +import org.chromium.chrome.browser.preferences.privacy.PrivacyPreferencesManager; import java.io.BufferedReader; import java.io.File; @@ -334,7 +335,8 @@ */ @VisibleForTesting MinidumpUploadCallable createMinidumpUploadCallable(File minidumpFile, File logfile) { - return new MinidumpUploadCallable(minidumpFile, logfile, getApplicationContext()); + return new MinidumpUploadCallable( + minidumpFile, logfile, PrivacyPreferencesManager.getInstance()); } /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabActivity.java index 4f11f59..26afef05 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabActivity.java
@@ -44,6 +44,7 @@ import org.chromium.chrome.browser.datausage.DataUseTabUIManager; import org.chromium.chrome.browser.document.ChromeLauncherActivity; import org.chromium.chrome.browser.externalnav.ExternalNavigationDelegateImpl; +import org.chromium.chrome.browser.fullscreen.ChromeFullscreenManager; import org.chromium.chrome.browser.metrics.PageLoadMetrics; import org.chromium.chrome.browser.net.spdyproxy.DataReductionProxySettings; import org.chromium.chrome.browser.pageinfo.WebsiteSettingsPopup; @@ -274,7 +275,10 @@ super.postInflationStartup(); TabPersistencePolicy persistencePolicy = new CustomTabTabPersistencePolicy( getTaskId(), getSavedInstanceState() != null); - setTabModelSelector(new TabModelSelectorImpl(this, persistencePolicy, false)); + + setTabModelSelector(new TabModelSelectorImpl(this, this, getFullscreenManager(), + persistencePolicy, false)); + setTabCreators( new CustomTabCreator( this, getWindowAndroid(), false, @@ -344,11 +348,10 @@ getTabModelSelector().getModel(false).addTab(mMainTab, 0, mMainTab.getLaunchType()); } - ToolbarControlContainer controlContainer = (ToolbarControlContainer) findViewById( - R.id.control_container); LayoutManagerDocument layoutDriver = new CustomTabLayoutManager(getCompositorViewHolder()); initializeCompositorContent(layoutDriver, findViewById(R.id.url_bar), - (ViewGroup) findViewById(android.R.id.content), controlContainer); + (ViewGroup) findViewById(android.R.id.content), + (ToolbarControlContainer) findViewById(R.id.control_container)); mFindToolbarManager = new FindToolbarManager(this, getToolbarManager().getActionModeController().getActionModeCallback()); if (getContextualSearchManager() != null) { @@ -364,7 +367,6 @@ } }); - getFullscreenManager().setTab(mMainTab); mCustomTabContentHandler = new CustomTabContentHandler() { @Override public void loadUrlAndTrackFromTimestamp(LoadUrlParams params, long timestamp) { @@ -851,4 +853,11 @@ } return url; } + + @Override + protected ChromeFullscreenManager createFullscreenManager() { + return new ChromeFullscreenManager(this, + (ToolbarControlContainer) findViewById(R.id.control_container), + getControlContainerHeightResource(), true); + } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabTabPersistencePolicy.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabTabPersistencePolicy.java index f54e4b12..58e6efe 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabTabPersistencePolicy.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabTabPersistencePolicy.java
@@ -120,6 +120,11 @@ } @Override + public boolean shouldMergeOnStartup() { + return false; + } + + @Override @Nullable public String getStateToBeMergedFileName() { return null;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/document/DocumentActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/document/DocumentActivity.java index 105071c..087bf05 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/document/DocumentActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/document/DocumentActivity.java
@@ -11,6 +11,7 @@ import org.chromium.base.Log; import org.chromium.chrome.browser.ChromeActivity; +import org.chromium.chrome.browser.fullscreen.ChromeFullscreenManager; import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tabmodel.document.ActivityDelegate; @@ -72,4 +73,9 @@ || TextUtils.equals(className, LEGACY_CLASS_NAME) || TextUtils.equals(className, LEGACY_INCOGNITO_CLASS_NAME); } + + @Override + protected ChromeFullscreenManager createFullscreenManager() { + return null; + } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/fullscreen/ChromeFullscreenManager.java b/chrome/android/java/src/org/chromium/chrome/browser/fullscreen/ChromeFullscreenManager.java index eb14180..38ef2a8 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/fullscreen/ChromeFullscreenManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/fullscreen/ChromeFullscreenManager.java
@@ -29,6 +29,7 @@ import org.chromium.base.ThreadUtils; import org.chromium.base.TraceEvent; import org.chromium.base.VisibleForTesting; +import org.chromium.base.library_loader.LibraryLoader; import org.chromium.chrome.browser.fullscreen.FullscreenHtmlApiHandler.FullscreenHtmlApiDelegate; import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.widget.ControlContainer; @@ -226,6 +227,8 @@ public void onWindowFocusChanged(Activity activity, boolean hasFocus) { if (mActivity != activity) return; onWindowFocusChanged(hasFocus); + // {@link ContentVideoView#getContentVideoView} requires native to have been initialized. + if (!LibraryLoader.isInitialized()) return; ContentVideoView videoView = ContentVideoView.getContentVideoView(); if (videoView != null) { videoView.onFullscreenWindowFocused();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/metrics/UmaSessionStats.java b/chrome/android/java/src/org/chromium/chrome/browser/metrics/UmaSessionStats.java index d80714c..ae2ec3e 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/metrics/UmaSessionStats.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/metrics/UmaSessionStats.java
@@ -9,7 +9,6 @@ import android.content.res.Configuration; import org.chromium.base.ContextUtils; -import org.chromium.chrome.browser.preferences.privacy.CrashReportingPermissionManager; import org.chromium.chrome.browser.preferences.privacy.PrivacyPreferencesManager; import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tabmodel.TabModel; @@ -39,13 +38,11 @@ private ComponentCallbacks mComponentCallbacks; private boolean mKeyboardConnected = false; - private final CrashReportingPermissionManager mReportingPermissionManager; public UmaSessionStats(Context context) { mContext = context; mIsMultiWindowCapable = context.getPackageManager().hasSystemFeature( SAMSUNG_MULTWINDOW_PACKAGE); - mReportingPermissionManager = PrivacyPreferencesManager.getInstance(); } private void recordPageLoadStats(Tab tab) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationPlatformBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationPlatformBridge.java index 55e1de2..d68eea08 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationPlatformBridge.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationPlatformBridge.java
@@ -7,6 +7,7 @@ import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; +import android.app.RemoteInput; import android.content.Context; import android.content.Intent; import android.content.res.Resources; @@ -199,8 +200,8 @@ } int actionIndex = intent.getIntExtra( NotificationConstants.EXTRA_NOTIFICATION_INFO_ACTION_INDEX, -1); - sInstance.onNotificationClicked( - notificationId, origin, profileId, incognito, tag, webApkPackage, actionIndex); + sInstance.onNotificationClicked(notificationId, origin, profileId, incognito, tag, + webApkPackage, actionIndex, getNotificationReply(intent)); return true; } else if (NotificationConstants.ACTION_CLOSE_NOTIFICATION.equals(intent.getAction())) { // Notification deleteIntent is executed only "when the notification is explicitly @@ -215,6 +216,22 @@ return false; } + @Nullable + private static String getNotificationReply(Intent intent) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT_WATCH) { + // RemoteInput was added in KITKAT_WATCH. + Bundle remoteInputResults = RemoteInput.getResultsFromIntent(intent); + if (remoteInputResults != null) { + CharSequence reply = + remoteInputResults.getCharSequence(NotificationConstants.KEY_TEXT_REPLY); + if (reply != null) { + return reply.toString(); + } + } + } + return null; + } + /** * Launches the notifications preferences screen. If the received intent indicates it came * from the gear button on a flipped notification, this launches the site specific preferences @@ -679,12 +696,15 @@ * @param webApkPackage The package of the WebAPK associated with the notification. * Empty if the notification is not associated with a WebAPK. * @param actionIndex + * @param reply User reply to a text action on the notification. Null if the user did not click + * on a text action or if inline replies are not supported. */ private void onNotificationClicked(String notificationId, String origin, String profileId, - boolean incognito, String tag, String webApkPackage, int actionIndex) { + boolean incognito, String tag, String webApkPackage, int actionIndex, + @Nullable String reply) { mLastNotificationClickMs = System.currentTimeMillis(); nativeOnNotificationClicked(mNativeNotificationPlatformBridge, notificationId, origin, - profileId, incognito, tag, webApkPackage, actionIndex); + profileId, incognito, tag, webApkPackage, actionIndex, reply); } /** @@ -708,7 +728,7 @@ private native void nativeOnNotificationClicked(long nativeNotificationPlatformBridgeAndroid, String notificationId, String origin, String profileId, boolean incognito, String tag, - String webApkPackage, int actionIndex); + String webApkPackage, int actionIndex, String reply); private native void nativeOnNotificationClosed(long nativeNotificationPlatformBridgeAndroid, String notificationId, String origin, String profileId, boolean incognito, String tag, boolean byUser);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageView.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageView.java index 6471197..2aa48dd 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageView.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageView.java
@@ -92,7 +92,7 @@ private NewTabPageLayout mNewTabPageLayout; private LogoView mSearchProviderLogoView; - private ViewGroup mSearchBoxView; + private View mSearchBoxView; private ImageView mVoiceSearchButton; private MostVisitedLayout mMostVisitedLayout; private View mMostVisitedPlaceholder; @@ -372,7 +372,7 @@ mSearchProviderLogoView = (LogoView) mNewTabPageLayout.findViewById(R.id.search_provider_logo); - mSearchBoxView = (ViewGroup) mNewTabPageLayout.findViewById(R.id.search_box); + mSearchBoxView = mNewTabPageLayout.findViewById(R.id.search_box); mNoSearchLogoSpacer = mNewTabPageLayout.findViewById(R.id.no_search_logo_spacer); initializeSearchBoxTextView(); @@ -493,9 +493,7 @@ if (!mManager.isCurrentPage()) return; // Disable the search box contents if it is the process of being animated away. - for (int i = 0; i < mSearchBoxView.getChildCount(); i++) { - mSearchBoxView.getChildAt(i).setEnabled(mSearchBoxView.getAlpha() == 1.0f); - } + ViewUtils.setEnabledRecursive(mSearchBoxView, mSearchBoxView.getAlpha() == 1.0f); if (mSearchBoxScrollListener != null) { mSearchBoxScrollListener.onNtpScrollChanged(getToolbarTransitionPercentage());
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/AboveTheFoldItem.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/AboveTheFoldItem.java index b06b7e1..6b454f8d 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/AboveTheFoldItem.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/AboveTheFoldItem.java
@@ -13,14 +13,15 @@ * Other elements coming after it and initially off-screen are just added to the RecyclerView after * that. */ -class AboveTheFoldItem extends SingleItemGroup { +class AboveTheFoldItem extends Leaf { @Override - public int getType() { - return NewTabPageItem.VIEW_TYPE_ABOVE_THE_FOLD; + @ItemViewType + protected int getItemViewType() { + return ItemViewType.ABOVE_THE_FOLD; } @Override - public void onBindViewHolder(NewTabPageViewHolder holder) { + protected void onBindViewHolder(NewTabPageViewHolder holder) { // Nothing to do. } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/ActionItem.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/ActionItem.java index 76138b9..08cf25e9b 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/ActionItem.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/ActionItem.java
@@ -13,7 +13,7 @@ /** * Item that allows the user to perform an action on the NTP. */ -class ActionItem implements NewTabPageItem { +class ActionItem extends Leaf { private static final String TAG = "NtpCards"; private final SuggestionsCategoryInfo mCategoryInfo; @@ -28,8 +28,9 @@ } @Override - public int getType() { - return NewTabPageItem.VIEW_TYPE_ACTION; + @ItemViewType + protected int getItemViewType() { + return ItemViewType.ACTION; } public int getPosition() { @@ -83,7 +84,7 @@ } @Override - public void onBindViewHolder(NewTabPageViewHolder holder) { + protected void onBindViewHolder(NewTabPageViewHolder holder) { assert holder instanceof ViewHolder; ((ViewHolder) holder).onBindViewHolder(this); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/AllDismissedItem.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/AllDismissedItem.java index 040a14cf..f3b5c2d 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/AllDismissedItem.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/AllDismissedItem.java
@@ -22,10 +22,11 @@ * Displayed when all suggested content and their sections have been dismissed. Provides a button * to restore the dismissed sections and load new suggestions from the server. */ -public class AllDismissedItem extends SingleItemGroup { +public class AllDismissedItem extends Leaf { @Override - public int getType() { - return NewTabPageItem.VIEW_TYPE_ALL_DISMISSED; + @ItemViewType + public int getItemViewType() { + return ItemViewType.ALL_DISMISSED; } @Override @@ -35,7 +36,7 @@ } /** - * ViewHolder for an item of type {@link #VIEW_TYPE_ALL_DISMISSED}. + * ViewHolder for an item of type {@link ItemViewType#ALL_DISMISSED}. */ public static class ViewHolder extends NewTabPageViewHolder { private final TextView mBodyTextView;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/CardViewHolder.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/CardViewHolder.java index f5d553e..16a5ec6 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/CardViewHolder.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/CardViewHolder.java
@@ -138,13 +138,16 @@ // Nothing to do for dismissed cards. if (getAdapterPosition() == RecyclerView.NO_POSITION) return; + NewTabPageAdapter adapter = mRecyclerView.getNewTabPageAdapter(); + // Each card has the full elevation effect (the shadow) in the 9-patch. If the next item is // a card a negative bottom margin is set so the next card is overlaid slightly on top of // this one and hides the bottom shadow. - boolean hasCardAbove = - isCard(mRecyclerView.getAdapter().getItemViewType(getAdapterPosition() - 1)); - boolean hasCardBelow = - isCard(mRecyclerView.getAdapter().getItemViewType(getAdapterPosition() + 1)); + int abovePosition = getAdapterPosition() - 1; + boolean hasCardAbove = abovePosition >= 0 && isCard(adapter.getItemViewType(abovePosition)); + int belowPosition = getAdapterPosition() + 1; + boolean hasCardBelow = belowPosition < adapter.getItemCount() + && isCard(adapter.getItemViewType(belowPosition)); getParams().bottomMargin = hasCardBelow ? -mCards9PatchAdjustment : 0; @@ -233,19 +236,19 @@ return LayoutInflater.from(parent.getContext()).inflate(resourceId, parent, false); } - public static boolean isCard(@NewTabPageItem.ViewType int type) { + public static boolean isCard(@ItemViewType int type) { switch (type) { - case NewTabPageItem.VIEW_TYPE_SNIPPET: - case NewTabPageItem.VIEW_TYPE_STATUS: - case NewTabPageItem.VIEW_TYPE_ACTION: - case NewTabPageItem.VIEW_TYPE_PROMO: + case ItemViewType.SNIPPET: + case ItemViewType.STATUS: + case ItemViewType.ACTION: + case ItemViewType.PROMO: return true; - case NewTabPageItem.VIEW_TYPE_ABOVE_THE_FOLD: - case NewTabPageItem.VIEW_TYPE_HEADER: - case NewTabPageItem.VIEW_TYPE_SPACING: - case NewTabPageItem.VIEW_TYPE_PROGRESS: - case NewTabPageItem.VIEW_TYPE_FOOTER: - case NewTabPageItem.VIEW_TYPE_ALL_DISMISSED: + case ItemViewType.ABOVE_THE_FOLD: + case ItemViewType.HEADER: + case ItemViewType.SPACING: + case ItemViewType.PROGRESS: + case ItemViewType.FOOTER: + case ItemViewType.ALL_DISMISSED: return false; default: assert false;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/ChildNode.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/ChildNode.java new file mode 100644 index 0000000..f08e2a9 --- /dev/null +++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/ChildNode.java
@@ -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. + +package org.chromium.chrome.browser.ntp.cards; + +/** + * A node in the tree that has a parent and can notify it about changes. + * + * This class mostly serves as a convenience base class for implementations of {@link TreeNode}. + */ +public abstract class ChildNode implements TreeNode { + private final NodeParent mParent; + + protected ChildNode(NodeParent parent) { + mParent = parent; + } + + protected void notifyItemRangeChanged(int index, int count) { + mParent.onItemRangeChanged(this, index, count); + } + + protected void notifyItemRangeInserted(int index, int count) { + mParent.onItemRangeInserted(this, index, count); + } + + protected void notifyItemRangeRemoved(int index, int count) { + mParent.onItemRangeRemoved(this, index, count); + } + + protected void notifyItemChanged(int index) { + notifyItemRangeChanged(index, 1); + } + + protected void notifyItemInserted(int index) { + notifyItemRangeInserted(index, 1); + } + + protected void notifyItemRemoved(int index) { + notifyItemRangeRemoved(index, 1); + } +}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/Footer.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/Footer.java index 7698c5a..9b8589d 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/Footer.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/Footer.java
@@ -18,14 +18,15 @@ /** * A footer to show some text and a link to learn more. */ -public class Footer extends SingleItemGroup { +public class Footer extends Leaf { @Override - public int getType() { - return NewTabPageItem.VIEW_TYPE_FOOTER; + @ItemViewType + protected int getItemViewType() { + return ItemViewType.FOOTER; } @Override - public void onBindViewHolder(NewTabPageViewHolder holder) { + protected void onBindViewHolder(NewTabPageViewHolder holder) { // Nothing to do (the footer view is static). }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/InnerNode.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/InnerNode.java new file mode 100644 index 0000000..8c0078a --- /dev/null +++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/InnerNode.java
@@ -0,0 +1,90 @@ +// 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.ntp.cards; + +import org.chromium.chrome.browser.ntp.snippets.SnippetArticle; + +import java.util.List; + +/** + * An inner node in the tree: the root of a subtree, with a list of child nodes. + */ +public abstract class InnerNode extends ChildNode implements NodeParent { + public InnerNode(NodeParent parent) { + super(parent); + } + + protected abstract List<TreeNode> getChildren(); + + int getChildIndexForPosition(int position) { + List<TreeNode> children = getChildren(); + int numItems = 0; + int numChildren = children.size(); + for (int i = 0; i < numChildren; i++) { + numItems += children.get(i).getItemCount(); + if (position < numItems) return i; + } + return -1; + } + + private int getStartingOffsetForChildIndex(int childIndex) { + List<TreeNode> children = getChildren(); + int offset = 0; + for (int i = 0; i < childIndex; i++) { + offset += children.get(i).getItemCount(); + } + return offset; + } + + int getStartingOffsetForChild(TreeNode child) { + return getStartingOffsetForChildIndex(getChildren().indexOf(child)); + } + + @Override + public int getItemCount() { + int numItems = 0; + for (TreeNode child : getChildren()) { + numItems += child.getItemCount(); + } + return numItems; + } + + @Override + @ItemViewType + public int getItemViewType(int position) { + int index = getChildIndexForPosition(position); + return getChildren().get(index).getItemViewType( + position - getStartingOffsetForChildIndex(index)); + } + + @Override + public void onBindViewHolder(NewTabPageViewHolder holder, int position) { + int index = getChildIndexForPosition(position); + getChildren().get(index).onBindViewHolder( + holder, position - getStartingOffsetForChildIndex(index)); + } + + @Override + public SnippetArticle getSuggestionAt(int position) { + int index = getChildIndexForPosition(position); + return getChildren().get(index).getSuggestionAt( + position - getStartingOffsetForChildIndex(index)); + } + + @Override + public void onItemRangeChanged(TreeNode child, int index, int count) { + notifyItemRangeChanged(getStartingOffsetForChild(child) + index, count); + } + + @Override + public void onItemRangeInserted(TreeNode child, int index, int count) { + notifyItemRangeInserted(getStartingOffsetForChild(child) + index, count); + } + + @Override + public void onItemRangeRemoved(TreeNode child, int index, int count) { + notifyItemRangeRemoved(getStartingOffsetForChild(child) + index, count); + } +}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/ItemGroup.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/ItemGroup.java deleted file mode 100644 index b269890..0000000 --- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/ItemGroup.java +++ /dev/null
@@ -1,32 +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. - -package org.chromium.chrome.browser.ntp.cards; - -import java.util.List; - -/** - * A group of items. - */ -public interface ItemGroup { - /** - * @return A list of items contained in this group. The list should not be modified. - */ - List<NewTabPageItem> getItems(); - - /** - * Defines the actions an object can be notified about when there are changes inside of - * an {@link ItemGroup}. - */ - interface Observer { - /** Notification about items having been changed in the group. */ - void onItemRangeChanged(ItemGroup group, int itemPosition, int itemCount); - - /** Notification about items having been added to the group. */ - void onItemRangeInserted(ItemGroup group, int itemPosition, int itemCount); - - /** Notification about items having been removed from the group. */ - void onItemRangeRemoved(ItemGroup group, int itemPosition, int itemCount); - } -}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/ItemViewType.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/ItemViewType.java new file mode 100644 index 0000000..db0e627 --- /dev/null +++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/ItemViewType.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.chrome.browser.ntp.cards; + +import android.support.annotation.IntDef; +import android.support.v7.widget.RecyclerView.Adapter; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +/** + * View type values for the items that will be held by the NTP's RecyclerView. + * + * @see Adapter#getItemViewType(int) + */ +@IntDef({ + ItemViewType.ABOVE_THE_FOLD, + ItemViewType.HEADER, + ItemViewType.SNIPPET, + ItemViewType.SPACING, + ItemViewType.STATUS, + ItemViewType.PROGRESS, + ItemViewType.ACTION, + ItemViewType.FOOTER, + ItemViewType.PROMO, + ItemViewType.ALL_DISMISSED +}) +@Retention(RetentionPolicy.SOURCE) +public @interface ItemViewType { + + /** + * View type for the above the fold item + * + * @see Adapter#getItemViewType(int) + */ + int ABOVE_THE_FOLD = 1; + /** + * View type for card group headers + * + * @see Adapter#getItemViewType(int) + */ + int HEADER = 2; + /** + * View type for snippet cards + * + * @see Adapter#getItemViewType(int) + */ + int SNIPPET = 3; + /** + * View type for a {@link SpacingItem} used to provide spacing at the end of the list. + * + * @see Adapter#getItemViewType(int) + */ + int SPACING = 4; + /** + * View type for a {@link StatusItem}, the card displaying status information + * + * @see Adapter#getItemViewType(int) + */ + int STATUS = 5; + /** + * View type for a {@link ProgressItem}, the progress indicator. + * + * @see Adapter#getItemViewType(int) + */ + int PROGRESS = 6; + /** + * View type for a {@link ActionItem}, an action button. + * + * @see Adapter#getItemViewType(int) + */ + int ACTION = 7; + /** + * View type for a {@link Footer}. + * + * @see Adapter#getItemViewType(int) + */ + int FOOTER = 8; + /** + * View type for a {@link SignInPromo}. + * + * @see Adapter#getItemViewType(int) + */ + int PROMO = 9; + /** + * View type for a {@link AllDismissedItem}. + * + * @see Adapter#getItemViewType(int) + */ + int ALL_DISMISSED = 10; +}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/Leaf.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/Leaf.java new file mode 100644 index 0000000..d0b18bdb --- /dev/null +++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/Leaf.java
@@ -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. + +package org.chromium.chrome.browser.ntp.cards; + +import org.chromium.chrome.browser.ntp.snippets.SnippetArticle; + +/** + * A leaf in the tree, i.e. a single item. + */ +public abstract class Leaf implements TreeNode { + @Override + public int getItemCount() { + return 1; + } + + @Override + @ItemViewType + public int getItemViewType(int position) { + if (position != 0) throw new IndexOutOfBoundsException(); + return getItemViewType(); + } + + @Override + public void onBindViewHolder(NewTabPageViewHolder holder, int position) { + if (position != 0) throw new IndexOutOfBoundsException(); + onBindViewHolder(holder); + } + + @Override + public SnippetArticle getSuggestionAt(int position) { + if (position != 0) throw new IndexOutOfBoundsException(); + + return null; + } + + /** + * Display the data for this item. + * @param holder The view holder that should be updated. + * @see #onBindViewHolder(NewTabPageViewHolder, int) + * @see android.support.v7.widget.RecyclerView.Adapter#onBindViewHolder + */ + protected abstract void onBindViewHolder(NewTabPageViewHolder holder); + + /** + * @return The view type of this item. + * @see android.support.v7.widget.RecyclerView.Adapter#getItemViewType + */ + @ItemViewType + protected abstract int getItemViewType(); +}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/NewTabPageAdapter.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/NewTabPageAdapter.java index 87ab56f1..e5a64c384 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/NewTabPageAdapter.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/NewTabPageAdapter.java
@@ -21,7 +21,6 @@ import org.chromium.chrome.browser.ntp.snippets.CategoryInt; import org.chromium.chrome.browser.ntp.snippets.CategoryStatus; import org.chromium.chrome.browser.ntp.snippets.CategoryStatus.CategoryStatusEnum; -import org.chromium.chrome.browser.ntp.snippets.SectionHeader; import org.chromium.chrome.browser.ntp.snippets.SectionHeaderViewHolder; import org.chromium.chrome.browser.ntp.snippets.SnippetArticle; import org.chromium.chrome.browser.ntp.snippets.SnippetArticleViewHolder; @@ -41,8 +40,8 @@ * the above-the-fold view (containing the logo, search box, and most visited tiles) and subsequent * elements will be the cards shown to the user */ -public class NewTabPageAdapter extends Adapter<NewTabPageViewHolder> - implements SuggestionsSource.Observer, ItemGroup.Observer { +public class NewTabPageAdapter + extends Adapter<NewTabPageViewHolder> implements SuggestionsSource.Observer, NodeParent { private static final String TAG = "Ntp"; private final NewTabPageManager mNewTabPageManager; @@ -55,12 +54,13 @@ * List of all item groups (which can themselves contain multiple items. When flattened, this * will be a list of all items the adapter exposes. */ - private final List<ItemGroup> mGroups = new ArrayList<>(); + private final List<TreeNode> mGroups = new ArrayList<>(); private final AboveTheFoldItem mAboveTheFold = new AboveTheFoldItem(); - private final SignInPromo mSigninPromo = new SignInPromo(); + private final SignInPromo mSigninPromo; private final AllDismissedItem mAllDismissed = new AllDismissedItem(); private final Footer mFooter = new Footer(); private final SpacingItem mBottomSpacer = new SpacingItem(); + private final InnerNode mRoot; /** Maps suggestion categories to sections, with stable iteration ordering. */ private final Map<Integer, SuggestionsSection> mSections = new LinkedHashMap<>(); @@ -134,7 +134,14 @@ mNewTabPageManager = manager; mAboveTheFoldView = aboveTheFoldView; mUiConfig = uiConfig; - mSigninPromo.setObserver(this); + mRoot = new InnerNode(this) { + @Override + protected List<TreeNode> getChildren() { + return mGroups; + } + }; + + mSigninPromo = new SignInPromo(mRoot); resetSections(/*alwaysAllowEmptySections=*/false); mNewTabPageManager.getSuggestionsSource().setObserver(this); @@ -166,8 +173,8 @@ int i = 0; for (int category : categories) { int categoryStatus = suggestionsSource.getCategoryStatus(category); - assert categoryStatus != CategoryStatus.NOT_PROVIDED; if (categoryStatus == CategoryStatus.LOADING_ERROR + || categoryStatus == CategoryStatus.NOT_PROVIDED || categoryStatus == CategoryStatus.CATEGORY_EXPLICITLY_DISABLED) continue; @@ -205,7 +212,7 @@ // Create the section if needed. SuggestionsSection section = mSections.get(category); if (section == null) { - section = new SuggestionsSection(info, this); + section = new SuggestionsSection(mRoot, info); mSections.put(category, section); } @@ -285,66 +292,59 @@ } @Override - @NewTabPageItem.ViewType + @ItemViewType public int getItemViewType(int position) { - return getItems().get(position).getType(); + return mRoot.getItemViewType(position); } @Override public NewTabPageViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { assert parent == mRecyclerView; - if (viewType == NewTabPageItem.VIEW_TYPE_ABOVE_THE_FOLD) { - return new NewTabPageViewHolder(mAboveTheFoldView); + switch (viewType) { + case ItemViewType.ABOVE_THE_FOLD: + return new NewTabPageViewHolder(mAboveTheFoldView); + + case ItemViewType.HEADER: + return new SectionHeaderViewHolder(mRecyclerView, mUiConfig); + + case ItemViewType.SNIPPET: + return new SnippetArticleViewHolder(mRecyclerView, mNewTabPageManager, mUiConfig); + + case ItemViewType.SPACING: + return new NewTabPageViewHolder(SpacingItem.createView(parent)); + + case ItemViewType.STATUS: + return new StatusCardViewHolder(mRecyclerView, mUiConfig); + + case ItemViewType.PROGRESS: + return new ProgressViewHolder(mRecyclerView); + + case ItemViewType.ACTION: + return new ActionItem.ViewHolder(mRecyclerView, mNewTabPageManager, mUiConfig); + + case ItemViewType.PROMO: + return new SignInPromo.ViewHolder(mRecyclerView, mUiConfig); + + case ItemViewType.FOOTER: + return new Footer.ViewHolder(mRecyclerView, mNewTabPageManager); + + case ItemViewType.ALL_DISMISSED: + return new AllDismissedItem.ViewHolder(mRecyclerView, mNewTabPageManager, this); } - if (viewType == NewTabPageItem.VIEW_TYPE_HEADER) { - return new SectionHeaderViewHolder(mRecyclerView, mUiConfig); - } - - if (viewType == NewTabPageItem.VIEW_TYPE_SNIPPET) { - return new SnippetArticleViewHolder(mRecyclerView, mNewTabPageManager, mUiConfig); - } - - if (viewType == NewTabPageItem.VIEW_TYPE_SPACING) { - return new NewTabPageViewHolder(SpacingItem.createView(parent)); - } - - if (viewType == NewTabPageItem.VIEW_TYPE_STATUS) { - return new StatusCardViewHolder(mRecyclerView, mUiConfig); - } - - if (viewType == NewTabPageItem.VIEW_TYPE_PROGRESS) { - return new ProgressViewHolder(mRecyclerView); - } - - if (viewType == NewTabPageItem.VIEW_TYPE_ACTION) { - return new ActionItem.ViewHolder(mRecyclerView, mNewTabPageManager, mUiConfig); - } - - if (viewType == NewTabPageItem.VIEW_TYPE_PROMO) { - return new SignInPromo.ViewHolder(mRecyclerView, mUiConfig); - } - - if (viewType == NewTabPageItem.VIEW_TYPE_FOOTER) { - return new Footer.ViewHolder(mRecyclerView, mNewTabPageManager); - } - - if (viewType == NewTabPageItem.VIEW_TYPE_ALL_DISMISSED) { - return new AllDismissedItem.ViewHolder(mRecyclerView, mNewTabPageManager, this); - } - + assert false : viewType; return null; } @Override public void onBindViewHolder(NewTabPageViewHolder holder, final int position) { - getItems().get(position).onBindViewHolder(holder); + mRoot.onBindViewHolder(holder, position); } @Override public int getItemCount() { - return getItems().size(); + return mRoot.getItemCount(); } public int getAboveTheFoldPosition() { @@ -352,9 +352,9 @@ } public int getFirstHeaderPosition() { - List<NewTabPageItem> items = getItems(); - for (int i = 0; i < items.size(); i++) { - if (items.get(i) instanceof SectionHeader) return i; + int count = getItemCount(); + for (int i = 0; i < count; i++) { + if (getItemViewType(i) == ItemViewType.HEADER) return i; } return RecyclerView.NO_POSITION; } @@ -379,10 +379,9 @@ } public int getSuggestionPosition(SnippetArticle article) { - List<NewTabPageItem> items = getItems(); - for (int i = 0; i < items.size(); i++) { - NewTabPageItem item = items.get(i); - if (article.equals(item)) return i; + for (int i = 0; i < mRoot.getItemCount(); i++) { + SnippetArticle articleToCheck = mRoot.getSuggestionAt(i); + if (articleToCheck != null && articleToCheck.equals(article)) return i; } return RecyclerView.NO_POSITION; } @@ -425,7 +424,7 @@ mSections.remove(section.getCategory()); int startPos = getGroupPositionOffset(section); mGroups.remove(section); - notifyItemRangeRemoved(startPos, section.getItems().size()); + notifyItemRangeRemoved(startPos, section.getItemCount()); if (hasAllBeenDismissed()) { int footerPosition = getFooterPosition(); @@ -437,23 +436,26 @@ } @Override - public void onItemRangeChanged(ItemGroup group, int itemPosition, int itemCount) { + public void onItemRangeChanged(TreeNode child, int itemPosition, int itemCount) { + assert child == mRoot; if (mGroups.isEmpty()) return; // The sections have not been initialised yet. - notifyItemRangeChanged(getGroupPositionOffset(group) + itemPosition, itemCount); + notifyItemRangeChanged(itemPosition, itemCount); } @Override - public void onItemRangeInserted(ItemGroup group, int itemPosition, int itemCount) { + public void onItemRangeInserted(TreeNode child, int itemPosition, int itemCount) { + assert child == mRoot; if (mGroups.isEmpty()) return; // The sections have not been initialised yet. - notifyItemRangeInserted(getGroupPositionOffset(group) + itemPosition, itemCount); - notifyItemChanged(getItems().size() - 1); // Refresh the spacer too. + notifyItemRangeInserted(itemPosition, itemCount); + notifyItemChanged(getItemCount() - 1); // Refresh the spacer too. } @Override - public void onItemRangeRemoved(ItemGroup group, int itemPosition, int itemCount) { + public void onItemRangeRemoved(TreeNode child, int itemPosition, int itemCount) { + assert child == mRoot; if (mGroups.isEmpty()) return; // The sections have not been initialised yet. - notifyItemRangeRemoved(getGroupPositionOffset(group) + itemPosition, itemCount); - notifyItemChanged(getItems().size() - 1); // Refresh the spacer too. + notifyItemRangeRemoved(itemPosition, itemCount); + notifyItemChanged(getItemCount() - 1); // Refresh the spacer too. } @Override @@ -481,16 +483,16 @@ // TODO(dgn): Polymorphism is supposed to allow to avoid that kind of stuff. switch (itemViewType) { - case NewTabPageItem.VIEW_TYPE_STATUS: - case NewTabPageItem.VIEW_TYPE_ACTION: - dismissSection((SuggestionsSection) getGroup(position)); + case ItemViewType.STATUS: + case ItemViewType.ACTION: + dismissSection(getSuggestionsSection(position)); return; - case NewTabPageItem.VIEW_TYPE_SNIPPET: + case ItemViewType.SNIPPET: dismissSuggestion(position); return; - case NewTabPageItem.VIEW_TYPE_PROMO: + case ItemViewType.PROMO: dismissPromo(); return; @@ -506,8 +508,7 @@ } private void dismissSuggestion(int position) { - SnippetArticle suggestion = (SnippetArticle) getItems().get(position); - + SnippetArticle suggestion = mRoot.getSuggestionAt(position); SuggestionsSource suggestionsSource = mNewTabPageManager.getSuggestionsSource(); if (suggestionsSource == null) { // It is possible for this method to be called after the NewTabPage has had destroy() @@ -520,7 +521,7 @@ announceItemRemoved(suggestion.mTitle); suggestionsSource.dismissSuggestion(suggestion); - SuggestionsSection section = (SuggestionsSection) getGroup(position); + SuggestionsSection section = getSuggestionsSection(position); section.removeSuggestion(suggestion); } @@ -536,27 +537,15 @@ } /** - * Returns an unmodifiable list containing all items in the adapter. - */ - private List<NewTabPageItem> getItems() { - List<NewTabPageItem> items = new ArrayList<>(); - for (ItemGroup group : mGroups) { - items.addAll(group.getItems()); - } - return Collections.unmodifiableList(items); - } - - /** * Returns another view holder that should be dismissed at the same time as the provided one. */ public ViewHolder getDismissSibling(ViewHolder viewHolder) { int swipePos = viewHolder.getAdapterPosition(); - ItemGroup group = getGroup(swipePos); + SuggestionsSection section = getSuggestionsSection(swipePos); + if (section == null) return null; - if (!(group instanceof SuggestionsSection)) return null; - - SuggestionsSection section = (SuggestionsSection) group; - int siblingPosDelta = section.getDismissSiblingPosDelta(getItems().get(swipePos)); + int siblingPosDelta = + section.getDismissSiblingPosDelta(swipePos - getGroupPositionOffset(section)); if (siblingPosDelta == 0) return null; return mRecyclerView.findViewHolderForAdapterPosition(siblingPosDelta + swipePos); @@ -566,36 +555,31 @@ return mSections.isEmpty() && !mSigninPromo.isShown(); } + /** + * @param itemPosition The position of an item in the adapter. + * @return Returns the {@link SuggestionsSection} that contains the item at + * {@code itemPosition}, or null if the item is not part of one. + */ @VisibleForTesting - ItemGroup getGroup(int itemPosition) { - int itemsSkipped = 0; - for (ItemGroup group : mGroups) { - List<NewTabPageItem> items = group.getItems(); - itemsSkipped += items.size(); - if (itemPosition < itemsSkipped) return group; - } - return null; + SuggestionsSection getSuggestionsSection(int itemPosition) { + TreeNode child = mGroups.get(mRoot.getChildIndexForPosition(itemPosition)); + if (!(child instanceof SuggestionsSection)) return null; + return (SuggestionsSection) child; } @VisibleForTesting - List<ItemGroup> getGroups() { + List<TreeNode> getGroups() { return Collections.unmodifiableList(mGroups); } @VisibleForTesting - int getGroupPositionOffset(ItemGroup group) { - int positionOffset = 0; - for (ItemGroup candidateGroup : mGroups) { - if (candidateGroup == group) return positionOffset; - positionOffset += candidateGroup.getItems().size(); - } - Log.d(TAG, "Group not found: %s", group); - return RecyclerView.NO_POSITION; + int getGroupPositionOffset(TreeNode group) { + return mRoot.getStartingOffsetForChild(group); } @VisibleForTesting SnippetArticle getSuggestionAt(int position) { - return (SnippetArticle) getItems().get(position); + return mRoot.getSuggestionAt(position); } private void announceItemRemoved(String suggestionTitle) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/NewTabPageItem.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/NewTabPageItem.java deleted file mode 100644 index 6be6060..0000000 --- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/NewTabPageItem.java +++ /dev/null
@@ -1,103 +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. - -package org.chromium.chrome.browser.ntp.cards; - -import android.support.annotation.IntDef; -import android.support.v7.widget.RecyclerView.Adapter; - -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; - -/** Base type for anything to add to the new tab page */ -public interface NewTabPageItem { - /** - * View type values for the items that will be held by the NTP's RecyclerView. - * @see Adapter#getItemViewType(int) - * @see NewTabPageItem#getType() - */ - @IntDef({VIEW_TYPE_ABOVE_THE_FOLD, VIEW_TYPE_HEADER, VIEW_TYPE_SNIPPET, VIEW_TYPE_SPACING, - VIEW_TYPE_STATUS, VIEW_TYPE_PROGRESS, VIEW_TYPE_ACTION, VIEW_TYPE_FOOTER, - VIEW_TYPE_PROMO, VIEW_TYPE_ALL_DISMISSED}) - @Retention(RetentionPolicy.SOURCE) - public @interface ViewType {} - - /** - * View type for the above the fold item - * @see Adapter#getItemViewType(int) - */ - public static final int VIEW_TYPE_ABOVE_THE_FOLD = 1; - - /** - * View type for card group headers - * @see Adapter#getItemViewType(int) - */ - public static final int VIEW_TYPE_HEADER = 2; - - /** - * View type for snippet cards - * @see Adapter#getItemViewType(int) - */ - public static final int VIEW_TYPE_SNIPPET = 3; - - /** - * View type for a {@link SpacingItem} used to provide spacing at the end of the list. - * @see Adapter#getItemViewType(int) - */ - public static final int VIEW_TYPE_SPACING = 4; - - /** - * View type for a {@link StatusItem}, the card displaying status information - * @see Adapter#getItemViewType(int) - */ - public static final int VIEW_TYPE_STATUS = 5; - - /** - * View type for a {@link ProgressItem}, the progress indicator. - * @see Adapter#getItemViewType(int) - */ - public static final int VIEW_TYPE_PROGRESS = 6; - - /** - * View type for a {@link ActionItem}, an action button. - * @see Adapter#getItemViewType(int) - */ - public static final int VIEW_TYPE_ACTION = 7; - - /** - * View type for a {@link Footer}. - * @see Adapter#getItemViewType(int) - */ - public static final int VIEW_TYPE_FOOTER = 8; - - /** - * View type for a {@link SignInPromo}. - * @see Adapter#getItemViewType(int) - */ - public static final int VIEW_TYPE_PROMO = 9; - - /** - * View type for a {@link AllDismissedItem}. - * @see Adapter#getItemViewType(int) - */ - public static final int VIEW_TYPE_ALL_DISMISSED = 10; - - // NOTE: when adding new entries here, also update the IntDef at the top of this file, and - // CardViewHolder#isCard(int type). - - /** - * Returns the type ({@link ViewType}) of this list item. This is so we can - * distinguish between different elements that are held in a single RecyclerView holder. - * - * @return the type of this list item. - */ - @ViewType - public int getType(); - - /** - * Update the given {@link NewTabPageViewHolder} with data from this item. - * @param holder The {@link NewTabPageViewHolder} to update. - */ - void onBindViewHolder(NewTabPageViewHolder holder); -} \ No newline at end of file
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/NewTabPageRecyclerView.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/NewTabPageRecyclerView.java index 34442a7..33be918 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/NewTabPageRecyclerView.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/NewTabPageRecyclerView.java
@@ -174,7 +174,7 @@ // It might not be in the layout yet if it's not visible or ready to be displayed. if (bottomSpacingViewHolder == null) return; - assert bottomSpacingViewHolder.getItemViewType() == NewTabPageItem.VIEW_TYPE_SPACING; + assert bottomSpacingViewHolder.getItemViewType() == ItemViewType.SPACING; bottomSpacingViewHolder.itemView.requestLayout(); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/NodeParent.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/NodeParent.java new file mode 100644 index 0000000..533e6f4 --- /dev/null +++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/NodeParent.java
@@ -0,0 +1,41 @@ +// 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.ntp.cards; + +/** + * Interface to allow propagating change events upwards in the tree. + */ +public interface NodeParent { + /** + * Notifies that {@code count} items starting at position {@code index} under the {@code child} + * have changed. + * @param child The child whose items have changed. + * @param index The starting position of the range of changed items, relative to the + * {@code child}. + * @param count The number of changed items. + * @see android.support.v7.widget.RecyclerView.Adapter#notifyItemRangeChanged(int, int) + */ + void onItemRangeChanged(TreeNode child, int index, int count); + + /** + * Notifies that {@code count} items starting at position {@code index} under the {@code child} + * have been added. + * @param child The child to which items have been added. + * @param index The starting position of the range of added items, relative to the child. + * @param count The number of added items. + * @see android.support.v7.widget.RecyclerView.Adapter#notifyItemRangeInserted(int, int) + */ + void onItemRangeInserted(TreeNode child, int index, int count); + + /** + * Notifies that {@code count} items starting at position {@code index} under the {@code child} + * have been removed. + * @param child The child from which items have been removed. + * @param index The starting position of the range of removed items, relative to the child. + * @param count The number of removed items. + * @see android.support.v7.widget.RecyclerView.Adapter#notifyItemRangeRemoved(int, int) + */ + void onItemRangeRemoved(TreeNode child, int index, int count); +}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/ProgressItem.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/ProgressItem.java index 428c97f..788aa7f 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/ProgressItem.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/ProgressItem.java
@@ -10,12 +10,13 @@ * * @see ProgressViewHolder */ -class ProgressItem implements NewTabPageItem { +class ProgressItem extends Leaf { private boolean mVisible = false; @Override - public int getType() { - return NewTabPageItem.VIEW_TYPE_PROGRESS; + @ItemViewType + protected int getItemViewType() { + return ItemViewType.PROGRESS; } public boolean isVisible() { @@ -27,7 +28,7 @@ } @Override - public void onBindViewHolder(NewTabPageViewHolder holder) { + protected void onBindViewHolder(NewTabPageViewHolder holder) { assert holder instanceof ProgressViewHolder; ((ProgressViewHolder) holder).onBindViewHolder(this); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/ProgressViewHolder.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/ProgressViewHolder.java index 912f35b5..08488d7 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/ProgressViewHolder.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/ProgressViewHolder.java
@@ -9,7 +9,7 @@ import org.chromium.chrome.R; /** - * ViewHolder for an item of type {@link NewTabPageItem#VIEW_TYPE_PROGRESS}. + * ViewHolder for an item of type {@link ItemViewType#PROGRESS}. * Adds a {@link ProgressIndicatorView} to the recycler view. */ public class ProgressViewHolder extends NewTabPageViewHolder {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/SignInPromo.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/SignInPromo.java index 3b635b89..d9903b5 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/SignInPromo.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/SignInPromo.java
@@ -13,23 +13,17 @@ import org.chromium.base.metrics.RecordUserAction; import org.chromium.chrome.R; import org.chromium.chrome.browser.ntp.UiConfig; +import org.chromium.chrome.browser.ntp.snippets.SnippetArticle; import org.chromium.chrome.browser.preferences.ChromePreferenceManager; import org.chromium.chrome.browser.signin.AccountSigninActivity; import org.chromium.chrome.browser.signin.SigninAccessPoint; import org.chromium.chrome.browser.signin.SigninManager; -import java.util.Collections; -import java.util.List; - /** - * Shows a card prompting the user to sign in. This item is also an {@link ItemGroup}, and calling + * Shows a card prompting the user to sign in. This item is also a {@link TreeNode}, and calling * {@link #hide()} or {@link #maybeShow()} will control its visibility. */ -public class SignInPromo implements ItemGroup, StatusCardViewHolder.DataSource { - private final NewTabPageItem mItem = new Item(); - private final List<NewTabPageItem> mItems = Collections.<NewTabPageItem>singletonList(mItem); - private Observer mChangeObserver; - +public class SignInPromo extends ChildNode implements StatusCardViewHolder.DataSource { /** * Whether the promo should be visible, according to the parent object. * @@ -44,7 +38,8 @@ */ private boolean mDismissed; - public SignInPromo() { + public SignInPromo(NodeParent parent) { + super(parent); mDismissed = ChromePreferenceManager.getInstance(ContextUtils.getApplicationContext()) .getNewTabPageSigninPromoDismissed(); SigninManager signinManager = SigninManager.get(ContextUtils.getApplicationContext()); @@ -52,32 +47,30 @@ } @Override - public List<NewTabPageItem> getItems() { - return isShown() ? mItems : Collections.<NewTabPageItem>emptyList(); - } + public int getItemCount() { + if (!isShown()) return 0; - private class Item implements NewTabPageItem { - @Override - public int getType() { - return NewTabPageItem.VIEW_TYPE_PROMO; - } - - @Override - public void onBindViewHolder(NewTabPageViewHolder holder) { - assert holder instanceof ViewHolder; - ((ViewHolder) holder).onBindViewHolder(SignInPromo.this); - } + return 1; } @Override - public void performAction(Context context) { - AccountSigninActivity.startIfAllowed(context, SigninAccessPoint.NTP_CONTENT_SUGGESTIONS); + @ItemViewType + public int getItemViewType(int position) { + checkIndex(position); + return ItemViewType.PROMO; } - /** Sets the {@link Observer} that will be notified when the visibility of the item changes. */ - public void setObserver(Observer changeObserver) { - assert mChangeObserver == null; - this.mChangeObserver = changeObserver; + @Override + public void onBindViewHolder(NewTabPageViewHolder holder, int position) { + checkIndex(position); + assert holder instanceof StatusCardViewHolder; + ((StatusCardViewHolder) holder).onBindViewHolder(this); + } + + @Override + public SnippetArticle getSuggestionAt(int position) { + checkIndex(position); + return null; } @Override @@ -98,6 +91,11 @@ return R.string.sign_in_button; } + @Override + public void performAction(Context context) { + AccountSigninActivity.startIfAllowed(context, SigninAccessPoint.NTP_CONTENT_SUGGESTIONS); + } + public boolean isShown() { return !mDismissed && mVisible; } @@ -110,7 +108,7 @@ if (mDismissed) return; RecordUserAction.record("Signin_Impression_FromNTPContentSuggestions"); - mChangeObserver.onItemRangeInserted(this, 0, 1); + notifyItemInserted(0); } /** Hides the sign in promo. */ @@ -120,7 +118,7 @@ if (mDismissed) return; - mChangeObserver.onItemRangeRemoved(this, 0, 1); + notifyItemRemoved(0); } /** Hides the sign in promo and sets a preference to make sure it is not shown again. */ @@ -157,17 +155,26 @@ if (getAdapterPosition() == RecyclerView.NO_POSITION) return; - @NewTabPageItem.ViewType + int precedingPosition = getAdapterPosition() - 1; + if (precedingPosition < 0) return; // Invalid adapter position, just do nothing. + + @ItemViewType int precedingCardType = - getRecyclerView().getAdapter().getItemViewType(getAdapterPosition() - 1); + getRecyclerView().getAdapter().getItemViewType(precedingPosition); // The sign in promo should stick to the articles of the preceding section, but have // some space otherwise. - if (precedingCardType != NewTabPageItem.VIEW_TYPE_SNIPPET) { + if (precedingCardType != ItemViewType.SNIPPET) { getParams().topMargin = mSeparationSpaceSize; } else { getParams().topMargin = 0; } } } + + private void checkIndex(int position) { + if (position < 0 || position >= getItemCount()) { + throw new IndexOutOfBoundsException(position + "/" + getItemCount()); + } + } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/SingleItemGroup.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/SingleItemGroup.java deleted file mode 100644 index 3d8a9ca..0000000 --- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/SingleItemGroup.java +++ /dev/null
@@ -1,21 +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. - -package org.chromium.chrome.browser.ntp.cards; - -import java.util.Collections; -import java.util.List; - -/** - * A single item that represents itself as a group. - */ -public abstract class SingleItemGroup implements ItemGroup, NewTabPageItem { - private final List<NewTabPageItem> mItems = - Collections.<NewTabPageItem>singletonList(this); - - @Override - public List<NewTabPageItem> getItems() { - return mItems; - } -}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/SpacingItem.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/SpacingItem.java index 00bf7a3..c4c045d 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/SpacingItem.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/SpacingItem.java
@@ -13,7 +13,7 @@ * contain enough of them. It is displayed as a dummy item with variable height that just occupies * the remaining space between the last item in the RecyclerView and the bottom of the screen. */ -public class SpacingItem extends SingleItemGroup { +public class SpacingItem extends Leaf { private static class SpacingView extends View { public SpacingView(Context context) { super(context); @@ -32,12 +32,13 @@ } @Override - public int getType() { - return NewTabPageItem.VIEW_TYPE_SPACING; + @ItemViewType + protected int getItemViewType() { + return ItemViewType.SPACING; } @Override - public void onBindViewHolder(NewTabPageViewHolder holder) { + protected void onBindViewHolder(NewTabPageViewHolder holder) { // Nothing to do. } } \ No newline at end of file
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/StatusItem.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/StatusItem.java index 9285ff9..98b21db 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/StatusItem.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/StatusItem.java
@@ -13,7 +13,7 @@ * Card that is shown when the user needs to be made aware of some information about their * configuration that affects the NTP suggestions. */ -public abstract class StatusItem implements NewTabPageItem, StatusCardViewHolder.DataSource { +public abstract class StatusItem extends Leaf implements StatusCardViewHolder.DataSource { public static StatusItem createNoSuggestionsItem(SuggestionsCategoryInfo categoryInfo) { return new NoSuggestionsItem(categoryInfo); } @@ -50,12 +50,13 @@ } @Override - public int getType() { - return NewTabPageItem.VIEW_TYPE_STATUS; + @ItemViewType + protected int getItemViewType() { + return ItemViewType.STATUS; } @Override - public void onBindViewHolder(NewTabPageViewHolder holder) { + protected void onBindViewHolder(NewTabPageViewHolder holder) { assert holder instanceof StatusCardViewHolder; ((StatusCardViewHolder) holder).onBindViewHolder(this); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/SuggestionsCategoryInfo.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/SuggestionsCategoryInfo.java index 687a67e..3a3113d 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/SuggestionsCategoryInfo.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/SuggestionsCategoryInfo.java
@@ -125,10 +125,9 @@ Log.wtf(TAG, "Requested description for unsupported category: %d", mCategory); return 0; case KnownCategories.ARTICLES: - default: - // TODO(dgn): For now, we assume any unknown sections are remote sections and just - // reuse the string for ARTICLES. crbug.com/656008 return R.string.ntp_status_card_no_articles; + default: + return R.string.ntp_status_card_no_suggestions; } } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/SuggestionsSection.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/SuggestionsSection.java index 669c291f..48a787a 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/SuggestionsSection.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/SuggestionsSection.java
@@ -18,27 +18,26 @@ /** * A group of suggestions, with a header, a status card, and a progress indicator. */ -public class SuggestionsSection implements ItemGroup { +public class SuggestionsSection extends InnerNode { private final List<SnippetArticle> mSuggestions = new ArrayList<>(); private final SectionHeader mHeader; private final StatusItem mStatus; private final ProgressItem mProgressIndicator = new ProgressItem(); private final ActionItem mMoreButton; - private final Observer mObserver; private final SuggestionsCategoryInfo mCategoryInfo; - public SuggestionsSection(SuggestionsCategoryInfo info, Observer observer) { + public SuggestionsSection(NodeParent parent, SuggestionsCategoryInfo info) { + super(parent); mHeader = new SectionHeader(info.getTitle()); mCategoryInfo = info; - mObserver = observer; mMoreButton = new ActionItem(info); mStatus = StatusItem.createNoSuggestionsItem(info); } @Override - public List<NewTabPageItem> getItems() { + public List<TreeNode> getChildren() { // Note: Keep this coherent with the various notify** calls on ItemGroup.Observer - List<NewTabPageItem> items = new ArrayList<>(); + List<TreeNode> items = new ArrayList<>(); items.add(mHeader); items.addAll(mSuggestions); @@ -58,16 +57,16 @@ // Note: Keep this coherent with getItems() int globalRemovedIndex = removedIndex + 1; // Header has index 0 in the section. - mObserver.onItemRangeRemoved(this, globalRemovedIndex, 1); + notifyItemRemoved(globalRemovedIndex); // If we still have some suggestions, we are done. Otherwise, we'll have to notify about the // status-related items that are now present. if (hasSuggestions()) return; - mObserver.onItemRangeInserted(this, globalRemovedIndex, 1); // Status card. + notifyItemInserted(globalRemovedIndex); // Status card. if (!mCategoryInfo.hasMoreButton()) { - mObserver.onItemRangeInserted(this, globalRemovedIndex + 1, 1); // Action card. + notifyItemInserted(globalRemovedIndex + 1); // Action card. } - mObserver.onItemRangeInserted(this, globalRemovedIndex + 2, 1); // Progress indicator. + notifyItemInserted(globalRemovedIndex + 2); // Progress indicator. } public void removeSuggestionById(String idWithinCategory) { @@ -90,7 +89,7 @@ public void setSuggestions(List<SnippetArticle> suggestions, @CategoryStatusEnum int status) { copyThumbnails(suggestions); - int itemCountBefore = getItems().size(); + int itemCountBefore = getItemCount(); setStatusInternal(status); mSuggestions.clear(); @@ -105,7 +104,7 @@ /** Sets the status for the section. Some statuses can cause the suggestions to be cleared. */ public void setStatus(@CategoryStatusEnum int status) { - int itemCountBefore = getItems().size(); + int itemCountBefore = getItemCount(); setStatusInternal(status); notifySectionChanged(itemCountBefore); } @@ -140,7 +139,7 @@ * @return a position delta to apply to the position of the provided item to get the adapter * position of the item to animate. Returns {@code 0} if there is no dismiss sibling. */ - public int getDismissSiblingPosDelta(NewTabPageItem item) { + public int getDismissSiblingPosDelta(int position) { // The only dismiss siblings we have so far are the More button and the status card. // Exit early if there is no More button. if (mMoreButton == null) return 0; @@ -148,6 +147,8 @@ // When there are suggestions we won't have contiguous status and action items. if (hasSuggestions()) return 0; + TreeNode item = getChildren().get(position); + // The sibling of the more button is the status card, that should be right above. if (item == mMoreButton) return -1; @@ -158,23 +159,29 @@ } private void notifySectionChanged(int itemCountBefore) { - int itemCountAfter = getItems().size(); + int itemCountAfter = getItemCount(); // The header is stable in sections. Don't notify about it. final int startPos = 1; itemCountBefore--; itemCountAfter--; - mObserver.onItemRangeChanged(this, startPos, Math.min(itemCountBefore, itemCountAfter)); + notifyItemRangeChanged(startPos, Math.min(itemCountBefore, itemCountAfter)); if (itemCountBefore < itemCountAfter) { - mObserver.onItemRangeInserted( - this, startPos + itemCountBefore, itemCountAfter - itemCountBefore); + notifyItemRangeInserted(startPos + itemCountBefore, itemCountAfter - itemCountBefore); } else if (itemCountBefore > itemCountAfter) { - mObserver.onItemRangeRemoved( - this, startPos + itemCountAfter, itemCountBefore - itemCountAfter); + notifyItemRangeRemoved(startPos + itemCountAfter, itemCountBefore - itemCountAfter); } } + /** + * @return The progress indicator. + */ + @VisibleForTesting + ProgressItem getProgressItemForTesting() { + return mProgressIndicator; + } + @VisibleForTesting ActionItem getActionItem() { return mMoreButton;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/TreeNode.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/TreeNode.java new file mode 100644 index 0000000..d054875 --- /dev/null +++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/TreeNode.java
@@ -0,0 +1,41 @@ +// 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.ntp.cards; + +import org.chromium.chrome.browser.ntp.snippets.SnippetArticle; + +/** + * A tree interface to allow the New Tab Page RecyclerView to delegate to other components. + */ +interface TreeNode { + /** + * @return The number of items under this subtree. + * @see android.support.v7.widget.RecyclerView.Adapter#getItemCount() + */ + int getItemCount(); + + /** + * @param position The position to query + * @return The view type of the item at {@code position} under this subtree. + * @see android.support.v7.widget.RecyclerView.Adapter#getItemViewType + */ + @ItemViewType + int getItemViewType(int position); + + /** + * Display the data at {@code position} under this subtree. + * @param holder The view holder that should be updated. + * @param position The position of the item under this subtree. + * @see android.support.v7.widget.RecyclerView.Adapter#onBindViewHolder + */ + void onBindViewHolder(NewTabPageViewHolder holder, final int position); + + /** + * @param position The position to query. + * @return The article at {@code position} under this subtree, or null if the item is not + * an article. + */ + SnippetArticle getSuggestionAt(int position); +}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/snippets/SectionHeader.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/snippets/SectionHeader.java index 6e3bdf4..4d68c65 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/snippets/SectionHeader.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/snippets/SectionHeader.java
@@ -4,13 +4,14 @@ package org.chromium.chrome.browser.ntp.snippets; -import org.chromium.chrome.browser.ntp.cards.NewTabPageItem; +import org.chromium.chrome.browser.ntp.cards.ItemViewType; +import org.chromium.chrome.browser.ntp.cards.Leaf; import org.chromium.chrome.browser.ntp.cards.NewTabPageViewHolder; /** * Represents the data for a header of a group of snippets */ -public class SectionHeader implements NewTabPageItem { +public class SectionHeader extends Leaf { /** Whether the header should be shown. */ private final boolean mVisible; @@ -26,8 +27,9 @@ } @Override - public int getType() { - return NewTabPageItem.VIEW_TYPE_HEADER; + @ItemViewType + public int getItemViewType() { + return ItemViewType.HEADER; } public boolean isVisible() { @@ -39,7 +41,7 @@ } @Override - public void onBindViewHolder(NewTabPageViewHolder holder) { + protected void onBindViewHolder(NewTabPageViewHolder holder) { assert holder instanceof SectionHeaderViewHolder; ((SectionHeaderViewHolder) holder).onBindViewHolder(this); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/snippets/SnippetArticle.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/snippets/SnippetArticle.java index c47c40c..de06a3c 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/snippets/SnippetArticle.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/snippets/SnippetArticle.java
@@ -5,14 +5,15 @@ import android.graphics.Bitmap; -import org.chromium.chrome.browser.ntp.cards.NewTabPageItem; +import org.chromium.chrome.browser.ntp.cards.ItemViewType; +import org.chromium.chrome.browser.ntp.cards.Leaf; import org.chromium.chrome.browser.ntp.cards.NewTabPageViewHolder; import org.chromium.chrome.browser.ntp.snippets.ContentSuggestionsCardLayout.ContentSuggestionsCardLayoutEnum; /** * Represents the data for an article card on the NTP. */ -public class SnippetArticle implements NewTabPageItem { +public class SnippetArticle extends Leaf { /** The category of this article. */ public final int mCategory; @@ -88,16 +89,24 @@ } @Override - public int getType() { - return NewTabPageItem.VIEW_TYPE_SNIPPET; + @ItemViewType + public int getItemViewType() { + return ItemViewType.SNIPPET; } @Override - public void onBindViewHolder(NewTabPageViewHolder holder) { + protected void onBindViewHolder(NewTabPageViewHolder holder) { assert holder instanceof SnippetArticleViewHolder; ((SnippetArticleViewHolder) holder).onBindViewHolder(this); } + @Override + public SnippetArticle getSuggestionAt(int position) { + if (position != 0) throw new IndexOutOfBoundsException(); + + return this; + } + /** * Returns this article's thumbnail as a {@link Bitmap}. Can return {@code null} as it is * initially unset.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java index c5a8eec..03165867 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java
@@ -674,12 +674,6 @@ } else if (animation == mNavigationIconShowAnimator) { mSecurityButton.setVisibility(INVISIBLE); } - // This is done specifically not to show offline page verbose status with the - // icon. It should be properly solved, when omnibox verbose status animation is - // implemented. See: http://crbug.com/648129 - updateVerboseStatusVisibility(); - // URL cleanup to not show not emphasized URL next to padlock. - setUrlToPageUrl(); } @Override @@ -689,8 +683,6 @@ } else if (animation == mNavigationIconShowAnimator) { mNavigationButton.setVisibility(VISIBLE); } - // As above. See: http://crbug.com/648129 - updateVerboseStatusVisibility(); } }; @@ -1397,10 +1389,8 @@ * omnibox. */ private void updateVerboseStatusVisibility() { - boolean verboseStatusVisible = !mUrlHasFocus - && mNavigationButtonType == NavigationButtonType.OFFLINE - && mNavigationButton.getVisibility() == VISIBLE - && mSecurityButton.getVisibility() == INVISIBLE; + boolean verboseStatusVisible = + mNavigationButtonType == NavigationButtonType.OFFLINE && !mUrlHasFocus; int verboseStatusVisibility = verboseStatusVisible ? VISIBLE : GONE;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/CardEditor.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/CardEditor.java index e9e7a9b..1015746 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/payments/CardEditor.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/CardEditor.java
@@ -73,6 +73,9 @@ /** The dropdown key that triggers the address editor to add a new billing address. */ private static final String BILLING_ADDRESS_ADD_NEW = "add"; + /** The shared preference for the 'save card to device' checkbox status*/ + private static final String CHECK_SAVE_CARD_TO_DEVICE = "check_save_card_to_device"; + /** The web contents where the web payments API is invoked. */ private final WebContents mWebContents; @@ -141,7 +144,7 @@ mObserverForTest = observerForTest; List<AutofillProfile> profiles = PersonalDataManager.getInstance().getProfilesToSuggest( - true /* includeName */); + true /* includeNameInLabel */); mProfilesForBillingAddress = new HashMap<>(); for (int i = 0; i < profiles.size(); i++) { AutofillProfile profile = profiles.get(i); @@ -546,9 +549,9 @@ private void addSaveCardCheckbox(EditorModel editor) { if (mSaveCardCheckbox == null) { mSaveCardCheckbox = EditorFieldModel.createCheckbox( - mContext.getString(R.string.payments_save_card_to_device_checkbox)); + mContext.getString(R.string.payments_save_card_to_device_checkbox), + CHECK_SAVE_CARD_TO_DEVICE); } - mSaveCardCheckbox.setIsChecked(true); editor.addField(mSaveCardCheckbox); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentRequestImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentRequestImpl.java index 06c9313..44bc75d 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentRequestImpl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentRequestImpl.java
@@ -277,7 +277,7 @@ List<AutofillProfile> profiles = null; if (requestShipping || requestPayerPhone || requestPayerEmail) { profiles = PersonalDataManager.getInstance().getProfilesToSuggest( - false /* includeName */); + false /* includeNameInLabel */); } if (requestShipping) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/ui/EditorFieldModel.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/ui/EditorFieldModel.java index 38de271..c299f081 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/payments/ui/EditorFieldModel.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/ui/EditorFieldModel.java
@@ -8,6 +8,7 @@ import android.util.Pair; import org.chromium.base.Callback; +import org.chromium.base.ContextUtils; import org.chromium.chrome.browser.preferences.autofill.AutofillProfileBridge.DropdownKeyValue; import java.util.ArrayList; @@ -109,7 +110,6 @@ private int mLabelIconResourceId; private int mActionIconResourceId; private int mActionDescriptionForAccessibility; - private boolean mIsChecked = false; private boolean mIsFullLine = true; /** @@ -139,14 +139,18 @@ } /** - * Constructs a checkbox to show in the editor. It's unchecked by default. + * Constructs a checkbox to show in the editor. It's checked by default. * - * @param checkboxLabel The label for the checkbox. + * @param checkboxLabel The label for the checkbox. + * @param checkboxPreference The shared preference for the checkbox status. */ - public static EditorFieldModel createCheckbox(CharSequence checkboxLabel) { + public static EditorFieldModel createCheckbox( + CharSequence checkboxLabel, CharSequence checkboxPreference) { assert checkboxLabel != null; + assert checkboxPreference != null; EditorFieldModel result = new EditorFieldModel(INPUT_TYPE_HINT_CHECKBOX); result.mLabel = checkboxLabel; + result.mValue = checkboxPreference; return result; } @@ -288,13 +292,16 @@ /** @return Whether the checkbox is checked. */ public boolean isChecked() { assert mInputTypeHint == INPUT_TYPE_HINT_CHECKBOX; - return mIsChecked; + return ContextUtils.getAppSharedPreferences().getBoolean(mValue.toString(), true); } /** Sets the checkbox state. */ public void setIsChecked(boolean isChecked) { assert mInputTypeHint == INPUT_TYPE_HINT_CHECKBOX; - mIsChecked = isChecked; + ContextUtils.getAppSharedPreferences() + .edit() + .putBoolean(mValue.toString(), isChecked) + .apply(); } /** @return The list of icons resource identifiers to display. */
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/ManagedPreferenceDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/ManagedPreferenceDelegate.java index b195030..df0edf6 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/ManagedPreferenceDelegate.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/ManagedPreferenceDelegate.java
@@ -6,7 +6,8 @@ import android.preference.Preference; import android.view.View; -import android.view.ViewGroup; + +import org.chromium.chrome.browser.util.ViewUtils; /** * A delegate that determines whether a Preference is managed by enterprise policy. This is used @@ -80,7 +81,7 @@ */ public void onBindViewToPreference(Preference preference, View view) { if (isPreferenceClickDisabledByPolicy(preference)) { - disableView(view); + ViewUtils.setEnabledRecursive(view, false); } } @@ -101,17 +102,4 @@ return false; } - - /** - * Disables the given View and any subviews, recursively. - */ - private static void disableView(View view) { - view.setEnabled(false); - if (view instanceof ViewGroup) { - ViewGroup group = (ViewGroup) view; - for (int i = 0; i < group.getChildCount(); i++) { - disableView(group.getChildAt(i)); - } - } - } } \ No newline at end of file
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/PrivacyPreferencesManager.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/PrivacyPreferencesManager.java index a63a266..0e6e93a 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/PrivacyPreferencesManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/PrivacyPreferencesManager.java
@@ -16,6 +16,7 @@ import org.chromium.chrome.browser.device.DeviceClassManager; import org.chromium.chrome.browser.physicalweb.PhysicalWeb; import org.chromium.chrome.browser.preferences.PrefServiceBridge; +import org.chromium.components.minidump_uploader.util.CrashReportingPermissionManager; /** * Reads, writes, and migrates preferences related to network usage and privacy.
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 9b2e015..c52ea716 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
@@ -1550,7 +1550,10 @@ tabModelSelector.getModel(mIncognito).removeTab(this); - updateWindowAndroid(null); + // TODO(yusufo): We can't call updateWindowAndroid here and set mWindowAndroid to null + // because many code paths (including navigation) expect the tab to always be associated + // with an activity, and will crash. crbug.com/657007 + if (mContentViewCore != null) mContentViewCore.updateWindowAndroid(null); attachTabContentManager(null); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelSelectorImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelSelectorImpl.java index 3c696d5..2827bd1 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelSelectorImpl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelSelectorImpl.java
@@ -4,10 +4,10 @@ package org.chromium.chrome.browser.tabmodel; +import android.app.Activity; import android.os.Handler; import org.chromium.base.VisibleForTesting; -import org.chromium.chrome.browser.ChromeActivity; import org.chromium.chrome.browser.compositor.layouts.OverviewModeBehavior; import org.chromium.chrome.browser.compositor.layouts.content.TabContentManager; import org.chromium.chrome.browser.fullscreen.FullscreenManager; @@ -28,7 +28,9 @@ public class TabModelSelectorImpl extends TabModelSelectorBase implements TabModelDelegate { public static final int CUSTOM_TABS_SELECTOR_INDEX = -1; - private final ChromeActivity mActivity; + private final TabCreatorManager mTabCreatorManager; + + private FullscreenManager mFullscreenManager; /** Flag set to false when the asynchronous loading of tabs is finished. */ private final AtomicBoolean mSessionRestoreInProgress = @@ -55,14 +57,20 @@ /** * Builds a {@link TabModelSelectorImpl} instance. - * @param activity The {@link ChromeActivity} this model selector lives in. - * @param supportUndo Whether a tab closure can be undone. + * + * @param activity An {@link Activity} instance. + * @param tabCreatorManager A {@link TabCreatorManager} instance. + * @param fullscreenManager A {@link FullscreenManager} instance. + * @param persistencePolicy A {@link TabPersistencePolicy} instance. + * @param supportUndo Whether a tab closure can be undone. */ - public TabModelSelectorImpl(ChromeActivity activity, TabPersistencePolicy persistencePolicy, + public TabModelSelectorImpl(Activity activity, TabCreatorManager tabCreatorManager, + FullscreenManager fullscreenManager, TabPersistencePolicy persistencePolicy, boolean supportUndo) { super(); - mActivity = activity; - mUma = new TabModelSelectorUma(mActivity); + mTabCreatorManager = tabCreatorManager; + mFullscreenManager = fullscreenManager; + mUma = new TabModelSelectorUma(activity); final TabPersistentStoreObserver persistentStoreObserver = new TabPersistentStoreObserver() { @Override @@ -72,7 +80,7 @@ }; mIsUndoSupported = supportUndo; mTabSaver = new TabPersistentStore( - persistencePolicy, this, mActivity, persistentStoreObserver); + persistencePolicy, this, mTabCreatorManager, persistentStoreObserver); mOrderController = new TabModelOrderController(this); } @@ -122,8 +130,10 @@ assert !mActiveState : "onNativeLibraryReady called twice!"; mTabContentManager = tabContentProvider; - ChromeTabCreator regularTabCreator = (ChromeTabCreator) mActivity.getTabCreator(false); - ChromeTabCreator incognitoTabCreator = (ChromeTabCreator) mActivity.getTabCreator(true); + ChromeTabCreator regularTabCreator = + (ChromeTabCreator) mTabCreatorManager.getTabCreator(false); + ChromeTabCreator incognitoTabCreator = + (ChromeTabCreator) mTabCreatorManager.getTabCreator(true); TabModelImpl normalModel = new TabModelImpl(false, regularTabCreator, incognitoTabCreator, mUma, mOrderController, mTabContentManager, mTabSaver, this, mIsUndoSupported); TabModel incognitoModel = new IncognitoTabModel(new IncognitoTabModelImplCreator( @@ -312,7 +322,8 @@ @Override public Tab openNewTab(LoadUrlParams loadUrlParams, TabLaunchType type, Tab parent, boolean incognito) { - return mActivity.getTabCreator(incognito).createNewTab(loadUrlParams, type, parent); + return mTabCreatorManager.getTabCreator(incognito).createNewTab( + loadUrlParams, type, parent); } /** @@ -330,7 +341,6 @@ if (mVisibleTab != tab && tab != null && !tab.isNativePage()) { TabModelImpl.startTabSwitchLatencyTiming(type); } - FullscreenManager fullscreenManager = mActivity.getFullscreenManager(); if (mVisibleTab != null && mVisibleTab != tab && !mVisibleTab.needsReload()) { if (mVisibleTab.isInitialized() && !mVisibleTab.isDetachedForReparenting()) { // TODO(dtrainor): Once we figure out why we can't grab a snapshot from the current @@ -341,7 +351,7 @@ cacheTabBitmap(mVisibleTab); } mVisibleTab.hide(); - if (fullscreenManager != null) fullscreenManager.setTab(null); + if (mFullscreenManager != null) mFullscreenManager.setTab(null); mTabSaver.addTabToSaveQueue(mVisibleTab); } mVisibleTab = null; @@ -359,8 +369,7 @@ tab.loadIfNeeded(); return; } - - if (fullscreenManager != null) fullscreenManager.setTab(tab); + if (mFullscreenManager != null) mFullscreenManager.setTab(tab); mVisibleTab = tab; // Don't execute the tab display part if Chrome has just been sent to background. This
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabPersistencePolicy.java b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabPersistencePolicy.java index d3f92c63..f36bc741 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabPersistencePolicy.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabPersistencePolicy.java
@@ -37,6 +37,11 @@ String getStateFileName(); /** + * @return Whether a merge needs to be performed on startup. + */ + boolean shouldMergeOnStartup(); + + /** * @return The filename of the state that is to be merged. If null, no merge will be * triggered. */
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabPersistentStore.java b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabPersistentStore.java index 9f95debf..7e7c1c16 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabPersistentStore.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabPersistentStore.java
@@ -223,9 +223,10 @@ startFetchTabListTask(executor, mPersistencePolicy.getStateFileName()); startPrefetchActiveTabTask(executor); - String mergedStateFileName = mPersistencePolicy.getStateToBeMergedFileName(); - if (mergedStateFileName != null) { - mPrefetchTabListToMergeTask = startFetchTabListTask(executor, mergedStateFileName); + if (mPersistencePolicy.shouldMergeOnStartup()) { + assert mPersistencePolicy.getStateToBeMergedFileName() != null; + mPrefetchTabListToMergeTask = startFetchTabListTask( + executor, mPersistencePolicy.getStateToBeMergedFileName()); } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabWindowManager.java b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabWindowManager.java index e4fc207..b56beea 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabWindowManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabWindowManager.java
@@ -12,8 +12,8 @@ import org.chromium.base.ApplicationStatus.ActivityStateListener; import org.chromium.base.ThreadUtils; import org.chromium.base.VisibleForTesting; -import org.chromium.chrome.browser.ChromeActivity; import org.chromium.chrome.browser.ChromeTabbedActivity; +import org.chromium.chrome.browser.fullscreen.FullscreenManager; import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.util.FeatureUtilities; import org.chromium.ui.base.WindowAndroid; @@ -28,7 +28,7 @@ */ public class TabWindowManager implements ActivityStateListener { /** - * An index that represents the invalid state (i.e. when the window wasn't found in the list. + * An index that represents the invalid state (i.e. when the window wasn't found in the list). */ public static final int INVALID_WINDOW_INDEX = -1; @@ -41,11 +41,14 @@ public interface TabModelSelectorFactory { /** * Builds a {@link TabModelSelector}. - * @param activity A {@link ChromeActivity} instance. + * + * @param activity An {@link Activity} instance. + * @param tabCreatorManager A {@link TabCreatorManager} instance. * @param selectorIndex The index of the {@link TabModelSelector}. - * @return A new {@link TabModelSelector} instance. + * @return A new {@link TabModelSelector} instance. */ - TabModelSelector buildSelector(ChromeActivity activity, int selectorIndex); + TabModelSelector buildSelector(Activity activity, TabCreatorManager tabCreatorManager, + FullscreenManager fullscreenManager, int selectorIndex); } /** The singleton reference. */ @@ -67,17 +70,18 @@ } /** - * Called to request a {@link TabModelSelector} based on {@code index}. Note that the - * {@link TabModelSelector} returned might not actually be the one related to {@code index} - * and {@link #getIndexForWindow(Activity)} should be called to grab the actual index if - * required. - * @param activity An instance of {@link ChromeActivity}. - * @param index The index of the requested {@link TabModelSelector}. Not guaranteed to be - * the index of the {@link TabModelSelector} returned. - * @return A {@link TabModelSelector} index, or {@code null} if there are too many - * {@link TabModelSelector}s already built. + * Called to request a {@link TabModelSelector} based on {@code index}. Note that the + * {@link TabModelSelector} returned might not actually be the one related to {@code index} and + * {@link #getIndexForWindow(Activity)} should be called to grab the actual index if required. + * + * @param tabCreatorManager An instance of {@link TabCreatorManager}. + * @param index The index of the requested {@link TabModelSelector}. Not guaranteed to be the + * index of the {@link TabModelSelector} returned. + * @return A {@link TabModelSelector} index, or {@code null} if there are too many + * {@link TabModelSelector}s already built. */ - public TabModelSelector requestSelector(ChromeActivity activity, int index) { + public TabModelSelector requestSelector(Activity activity, TabCreatorManager tabCreatorManager, + FullscreenManager fullscreenManager, int index) { if (mAssignments.get(activity) != null) { return mAssignments.get(activity); } @@ -96,7 +100,8 @@ // Too many activities going at once. if (mSelectors.get(index) != null) return null; - TabModelSelector selector = mSelectorFactory.buildSelector(activity, index); + TabModelSelector selector = mSelectorFactory.buildSelector(activity, tabCreatorManager, + fullscreenManager, index); mSelectors.set(index, selector); mAssignments.put(activity, selector); @@ -202,7 +207,9 @@ private static class DefaultTabModelSelectorFactory implements TabModelSelectorFactory { @Override - public TabModelSelector buildSelector(ChromeActivity activity, int selectorIndex) { + public TabModelSelector buildSelector(Activity activity, + TabCreatorManager tabCreatorManager, FullscreenManager fullscreenManager, + int selectorIndex) { // Merge tabs if this is the TabModelSelector for ChromeTabbedActivity and there are no // other instances running. This indicates that it is a complete cold start of // ChromeTabbedActivity. Tabs should only be merged during a cold start of @@ -210,10 +217,10 @@ boolean mergeTabs = FeatureUtilities.isTabModelMergingEnabled() && activity.getClass().equals(ChromeTabbedActivity.class) && getInstance().getNumberOfAssignedTabModelSelectors() == 0; - TabPersistencePolicy persistencePolicy = new TabbedModeTabPersistencePolicy( selectorIndex, mergeTabs); - return new TabModelSelectorImpl(activity, persistencePolicy, true); + return new TabModelSelectorImpl(activity, tabCreatorManager, fullscreenManager, + persistencePolicy, true); } } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabbedModeTabPersistencePolicy.java b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabbedModeTabPersistencePolicy.java index 5688aca..9290e217 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabbedModeTabPersistencePolicy.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabbedModeTabPersistencePolicy.java
@@ -107,8 +107,12 @@ } @Override + public boolean shouldMergeOnStartup() { + return mMergeTabs; + } + + @Override public String getStateToBeMergedFileName() { - if (!mMergeTabs) return null; return getStateFileName(mOtherSelectorIndex); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/CustomTabToolbar.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/CustomTabToolbar.java index d9358a5..e83afab7 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/CustomTabToolbar.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/CustomTabToolbar.java
@@ -342,7 +342,7 @@ setUrlBarHidden(false); } } - showOfflineBoltIfNecessary(); + updateSecurityIcon(getSecurityLevel()); } @Override @@ -497,13 +497,22 @@ mSecurityIconType = securityLevel; + boolean isOfflinePage = getCurrentTab() != null && getCurrentTab().isOfflinePage(); + boolean showSecurityButton = securityLevel != ConnectionSecurityLevel.NONE || isOfflinePage; + if (securityLevel == ConnectionSecurityLevel.NONE) { - mAnimDelegate.hideSecurityButton(); + if (isOfflinePage && mShowsOfflinePage != isOfflinePage) { + TintedDrawable bolt = TintedDrawable.constructTintedDrawable( + getResources(), R.drawable.offline_pin); + bolt.setTint(mUseDarkColors ? mDarkModeTint : mLightModeTint); + mSecurityButton.setImageDrawable(bolt); + } } else { boolean isSmallDevice = !DeviceFormFactor.isTablet(getContext()); int id = LocationBarLayout.getSecurityIconResource(securityLevel, isSmallDevice); if (id == 0) { - mSecurityButton.setImageDrawable(null); + // Hide the button if we don't have an actual icon to display. + showSecurityButton = false; } else { // ImageView#setImageResource is no-op if given resource is the current one. mSecurityButton.setImageResource(id); @@ -511,29 +520,18 @@ LocationBarLayout.getColorStateList(securityLevel, getToolbarDataProvider(), getResources(), false /* omnibox is not opaque */)); } - mAnimDelegate.showSecurityButton(); } - mUrlBar.emphasizeUrl(); - mUrlBar.invalidate(); - } - - private void showOfflineBoltIfNecessary() { - boolean isOfflinePage = getCurrentTab() != null && getCurrentTab().isOfflinePage(); - if (isOfflinePage == mShowsOfflinePage) return; mShowsOfflinePage = isOfflinePage; - if (mShowsOfflinePage) { - // If we are showing an offline page, immediately update icon to offline bolt. - TintedDrawable bolt = TintedDrawable.constructTintedDrawable( - getResources(), R.drawable.offline_pin); - bolt.setTint(mUseDarkColors ? mDarkModeTint : mLightModeTint); - mSecurityButton.setImageDrawable(bolt); + + if (showSecurityButton) { mAnimDelegate.showSecurityButton(); } else { - // We are hiding the offline page so connection security information will change. - mSecurityIconType = ConnectionSecurityLevel.NONE; mAnimDelegate.hideSecurityButton(); } + + mUrlBar.emphasizeUrl(); + mUrlBar.invalidate(); } /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarPhone.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarPhone.java index 6380f9b..a5a4692 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarPhone.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarPhone.java
@@ -814,9 +814,7 @@ Tab currentTab = getToolbarDataProvider().getTab(); if (currentTab != null) { NewTabPage ntp = getToolbarDataProvider().getNewTabPageForCurrentTab(); - // Explicitly use the focus change percentage here because it applies scroll - // compensation that only applies during focus animations. - if (ntp != null && mUrlFocusChangeInProgress) { + if (ntp != null) { ntp.setUrlFocusChangeAnimationPercent(mUrlFocusChangePercent); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/util/ViewUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/util/ViewUtils.java index dc292e3..79d4f02e 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/util/ViewUtils.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/util/ViewUtils.java
@@ -34,6 +34,19 @@ } /** + * Sets the enabled property of a View and all of its descendants. + */ + public static void setEnabledRecursive(View view, boolean enabled) { + view.setEnabled(enabled); + if (view instanceof ViewGroup) { + ViewGroup group = (ViewGroup) view; + for (int i = 0; i < group.getChildCount(); i++) { + setEnabledRecursive(group.getChildAt(i), enabled); + } + } + } + + /** * Captures a bitmap of a View and draws it to a Canvas. */ public static void captureBitmap(View view, Canvas canvas) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/FullScreenActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/FullScreenActivity.java index 4bb4c35..9c77351b 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/FullScreenActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/FullScreenActivity.java
@@ -13,6 +13,7 @@ import org.chromium.chrome.browser.ChromeActivity; import org.chromium.chrome.browser.TabState; import org.chromium.chrome.browser.compositor.layouts.LayoutManagerDocument; +import org.chromium.chrome.browser.fullscreen.ChromeFullscreenManager; import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tab.TabDelegateFactory; import org.chromium.chrome.browser.tab.TabUma.TabCreationState; @@ -172,4 +173,11 @@ @Override public void onCheckForUpdate(boolean updateAvailable) { } + + @Override + protected ChromeFullscreenManager createFullscreenManager() { + return new ChromeFullscreenManager(this, + (ControlContainer) findViewById(R.id.control_container), + getControlContainerHeightResource(), true); + } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappActivity.java index 7b22d9a..fe5e1d51 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappActivity.java
@@ -567,9 +567,9 @@ } @Override - protected final ChromeFullscreenManager createFullscreenManager( - ControlContainer controlContainer) { - return new ChromeFullscreenManager(this, controlContainer, + protected ChromeFullscreenManager createFullscreenManager() { + return new ChromeFullscreenManager(this, + (ControlContainer) findViewById(R.id.control_container), getControlContainerHeightResource(), false /* supportsBrowserOverride */); }
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 56c56cc..30e8f71 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_am.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_am.xtb
@@ -286,6 +286,7 @@ <translation id="4351244548802238354">መገናኛ ዝጋ</translation> <translation id="4376501731284077108">ቁጥጥር ያልተደረገበት</translation> <translation id="4378154925671717803">ስልክ</translation> +<translation id="4384468725000734951">ለፍለጋ Sogouን መጠቀም</translation> <translation id="4412992751769744546">የሶስተኛ ወገን ኩኪዎችን ፍቀድ</translation> <translation id="4440256989292146959">ባነሰ ተጨማሪ ያስሱ</translation> <translation id="4452548195519783679"><ph name="FOLDER_NAME" /> ላይ ዕልባት ተደርጓል</translation> @@ -424,6 +425,8 @@ <translation id="5916664084637901428">በርቷል</translation> <translation id="5919204609460789179">ስምረትን ለመጀመር <ph name="PRODUCT_NAME" />ን ያዘምኑ</translation> <translation id="5939518447894949180">ዳግም አስጀምር</translation> +<translation id="5942872142862698679">ለፍለጋ Googleን መጠቀም</translation> +<translation id="6000066717592683814">Googleን አቆየው</translation> <translation id="6010869025736512584">የቪዲዮ ግብዓትን በመድረስ ላይ</translation> <translation id="6012342843556706400">Chrome እሱን ለዚህ ጣቢያ ለማጋራት የአካባቢ መዳረሻ ያስፈልገዋል።</translation> <translation id="6031101910111098835">ተሰብስቧል - ለመዘርጋት ጠቅ ያድርጉ</translation> @@ -441,6 +444,7 @@ <translation id="6159335304067198720"><ph name="PERCENT" /> የውሂብ ቁጠባዎች</translation> <translation id="6165508094623778733">ተጨማሪ ለመረዳት</translation> <translation id="6177390657002841081">የውሂብ አስቀማጭን አብራ</translation> +<translation id="617991007797131187">Chrome በቻይና ውስጥ Sogouን ለፍለጋ ሊጠቀም ይችላል። ይህንን በ<ph name="BEGIN_LINK" />ቅንብሮች<ph name="END_LINK" /> ውስጥ መለወጥ ይችላሉ።</translation> <translation id="6181444274883918285">ለየት ያለ ጣቢያን አክል</translation> <translation id="6192792657125177640">የተለዩ</translation> <translation id="6232535412751077445">«አትከታተል»ን ማንቃት ማለት አንድ ጥያቄ በአሰሳ ትራፊክዎ ላይ ይካተታል ማለት ነው። ማንኛውም ውጤት አንድ ድር ጣቢያ ለጥያቄው ምላሽ ከሰጠና ጥያቄውን በሚተረጎምበት መንገድ ላይ የሚወሰን ነው። @@ -472,6 +476,7 @@ <translation id="654446541061731451">በሞገድ የሚለቅቁት ትር ይምረጡ</translation> <translation id="6545017243486555795">ሁሉንም ውሂብ አጽዳ</translation> <translation id="6550675742724504774">አማራጮች</translation> +<translation id="6560414384669816528">ከSogou ጋር ይፈልጉ</translation> <translation id="656628257199996201"><ph name="SOURCE_LANGUAGE" />ን ሁልጊዜ መተርጎም</translation> <translation id="6571070086367343653">ክሬዲት ካርድን አርትዕ</translation> <translation id="6573431926118603307">በሌሎች መሣሪያዎችዎ ላይ ባለ Chrome ላይ የከፈቷቸው ትሮች እዚህ ይመጣሉ።</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 a0a98405..97367a7 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_ar.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_ar.xtb
@@ -286,6 +286,7 @@ <translation id="4351244548802238354">إغلاق مربع الحوار</translation> <translation id="4376501731284077108">غير مُتحكم فيه</translation> <translation id="4378154925671717803">الهاتف</translation> +<translation id="4384468725000734951">استخدام محرك Sogou للبحث</translation> <translation id="4412992751769744546">السماح لملفات تعريف ارتباط الجهات الخارجية</translation> <translation id="4440256989292146959">تصفح المزيد بتكلفة أقل</translation> <translation id="4452548195519783679">أُضيفَت إشارة مرجعية إلى <ph name="FOLDER_NAME" /></translation> @@ -425,6 +426,8 @@ <translation id="5916664084637901428">تشغيل</translation> <translation id="5919204609460789179">تحديث <ph name="PRODUCT_NAME" /> لبدء المزامنة</translation> <translation id="5939518447894949180">إعادة</translation> +<translation id="5942872142862698679">استخدام محرك Google للبحث</translation> +<translation id="6000066717592683814">الاستمرار في استخدام محرك Google</translation> <translation id="6010869025736512584">جارٍ الوصول إلى إدخال الفيديو</translation> <translation id="6012342843556706400">يحتاج Chrome إلى الحصول على حق الوصول إلى الموقع لمشاركته مع موقع الويب هذا.</translation> <translation id="6031101910111098835">تم التصغير - انقر للتوسيع</translation> @@ -442,6 +445,7 @@ <translation id="6159335304067198720">توفير البيانات بنسبة <ph name="PERCENT" /></translation> <translation id="6165508094623778733">مزيد من المعلومات</translation> <translation id="6177390657002841081">تشغيل إضافة "توفير البيانات"</translation> +<translation id="617991007797131187">يمكن أن يستخدم Chrome محرك Sogou للبحث في الصين. يمكنك تغيير هذا في <ph name="BEGIN_LINK" />الإعدادات<ph name="END_LINK" />.</translation> <translation id="6181444274883918285">إضافة موقع ويب إلى قائمة الاستثناءات</translation> <translation id="6192792657125177640">الاستثناءات</translation> <translation id="6232535412751077445">يعني تمكين ميزة "عدم التعقب" تضمين الطلب مع عدد زيارات التصفح. ويعتمد أي تأثير على استجابة موقع الويب للطلب من عدمه، بالإضافة إلى كيفية تفسير الطلب. @@ -473,6 +477,7 @@ <translation id="654446541061731451">حدد علامة تبويب لإرسالها باستخدام الشعاع</translation> <translation id="6545017243486555795">مسح جميع البيانات</translation> <translation id="6550675742724504774">خيارات</translation> +<translation id="6560414384669816528">البحث باستخدام Sogou</translation> <translation id="656628257199996201">ترجمة <ph name="SOURCE_LANGUAGE" /> دائمًا</translation> <translation id="6571070086367343653">تعديل بطاقة الائتمان</translation> <translation id="6573431926118603307">ستظهر هنا علامات التبويب التي فتحتها في Chrome من أجهزتك الأخرى.</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 bed1e434..d2737010 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_bg.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_bg.xtb
@@ -286,6 +286,7 @@ <translation id="4351244548802238354">Затваряне на диалоговия прозорец</translation> <translation id="4376501731284077108">Без контрол</translation> <translation id="4378154925671717803">Телефон</translation> +<translation id="4384468725000734951">За търсене ще се използва Sogou</translation> <translation id="4412992751769744546">Разрешаване на „бисквитките“ на трети страни</translation> <translation id="4440256989292146959">Сърфирайте повече за по-малко</translation> <translation id="4452548195519783679">Отметката бе запазена в/ъв „<ph name="FOLDER_NAME" />“</translation> @@ -424,6 +425,8 @@ <translation id="5916664084637901428">Включено</translation> <translation id="5919204609460789179">Актуализирайте <ph name="PRODUCT_NAME" />, за да стартира синхронизирането</translation> <translation id="5939518447894949180">Нулиране</translation> +<translation id="5942872142862698679">Използване на Google за търсене</translation> +<translation id="6000066717592683814">Запазване на Google</translation> <translation id="6010869025736512584">Осъществява се достъп до видеовхода</translation> <translation id="6012342843556706400">Chrome се нуждае от достъп до местоположението, за да го сподели с този сайт.</translation> <translation id="6031101910111098835">Свито – Кликнете за разгъване</translation> @@ -441,6 +444,7 @@ <translation id="6159335304067198720"><ph name="PERCENT" /> икономия на данни</translation> <translation id="6165508094623778733">Научете повече</translation> <translation id="6177390657002841081">Включване на Икономия на данни</translation> +<translation id="617991007797131187">Chrome може да използва Sogou за търсене в Китай. Можете да промените това в <ph name="BEGIN_LINK" />настройките<ph name="END_LINK" />.</translation> <translation id="6181444274883918285">Добавяне на изключение за сайт</translation> <translation id="6192792657125177640">Изключения</translation> <translation id="6232535412751077445">Активирането на „Do Not Track“ означава, че с трафика ви на сърфиране ще се подава заявка. Ефектите зависят от това, дали уебсайтът ще отговори на нея и как ще я изтълкува. @@ -472,6 +476,7 @@ <translation id="654446541061731451">Изберете раздел за излъчване</translation> <translation id="6545017243486555795">Изчистване на всички данни</translation> <translation id="6550675742724504774">Опции</translation> +<translation id="6560414384669816528">Търсене със Sogou</translation> <translation id="656628257199996201">Винаги да се превежда от <ph name="SOURCE_LANGUAGE" /></translation> <translation id="6571070086367343653">Редактиране на кредитната карта</translation> <translation id="6573431926118603307">Тук ще се показват разделите, които сте отворили в Chrome на другите си устройства.</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 e9cb181e..d55ad35 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_ca.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_ca.xtb
@@ -286,6 +286,7 @@ <translation id="4351244548802238354">Tanca el quadre de diàleg</translation> <translation id="4376501731284077108">No controlats</translation> <translation id="4378154925671717803">Telèfon</translation> +<translation id="4384468725000734951">S'utilitza Sogou per a la cerca</translation> <translation id="4412992751769744546">Permet les galetes de tercers</translation> <translation id="4440256989292146959">Navegueu més per menys</translation> <translation id="4452548195519783679">Adreça d'interès afegida a <ph name="FOLDER_NAME" /></translation> @@ -424,6 +425,8 @@ <translation id="5916664084637901428">Activat</translation> <translation id="5919204609460789179">Actualitza <ph name="PRODUCT_NAME" /> per iniciar la sincronització</translation> <translation id="5939518447894949180">Restableix</translation> +<translation id="5942872142862698679">S'utilitza Google per a la cerca</translation> +<translation id="6000066717592683814">Continua amb Google</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> <translation id="6031101910111098835">Vista replegada (feu clic per desplegar-la)</translation> @@ -441,6 +444,7 @@ <translation id="6159335304067198720"><ph name="PERCENT" /> de reducció de dades</translation> <translation id="6165508094623778733">Més informació</translation> <translation id="6177390657002841081">Activa l'Economitzador de dades</translation> +<translation id="617991007797131187">Chrome pot utilitzar Sogou per fer cerques a la Xina. Per canviar-ho, vés a <ph name="BEGIN_LINK" />Configuració<ph name="END_LINK" />.</translation> <translation id="6181444274883918285">Afegeix una excepció per a un lloc</translation> <translation id="6192792657125177640">Excepcions</translation> <translation id="6232535412751077445">Si activeu l'opció No segueixis, s'inclourà una sol·licitud al trànsit de navegació. Que s'apliqui o no dependrà de si algun lloc web respon a la sol·licitud i de com s'interpreta. @@ -472,6 +476,7 @@ <translation id="654446541061731451">Trieu una pestanya per compartir-la.</translation> <translation id="6545017243486555795">Esborra totes les dades</translation> <translation id="6550675742724504774">Opcions</translation> +<translation id="6560414384669816528">Cerca amb Sogou</translation> <translation id="656628257199996201">Tradueix sempre de: <ph name="SOURCE_LANGUAGE" /></translation> <translation id="6571070086367343653">Edita la targeta de crèdit</translation> <translation id="6573431926118603307">Les pestanyes que tingueu obertes a Chrome als altres dispositius es mostraran aquí.</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 bbed4bcf..46620c7 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_cs.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_cs.xtb
@@ -286,6 +286,7 @@ <translation id="4351244548802238354">Zavřít dialogové okno</translation> <translation id="4376501731284077108">Neurčeno</translation> <translation id="4378154925671717803">Telefon</translation> +<translation id="4384468725000734951">K vyhledávání se používá služba Sogou</translation> <translation id="4412992751769744546">Povolit cookies třetích stran</translation> <translation id="4440256989292146959">Více webu za méně peněz</translation> <translation id="4452548195519783679">Záložka přidána do složky <ph name="FOLDER_NAME" /></translation> @@ -424,6 +425,8 @@ <translation id="5916664084637901428">Zapnuto</translation> <translation id="5919204609460789179">Chcete-li zahájit synchronizaci, aktualizujte aplikaci <ph name="PRODUCT_NAME" /></translation> <translation id="5939518447894949180">Resetovat</translation> +<translation id="5942872142862698679">K vyhledávání se používá Google</translation> +<translation id="6000066717592683814">Ponechat Google</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> <translation id="6031101910111098835">Sbaleno – kliknutím rozbalíte</translation> @@ -441,6 +444,7 @@ <translation id="6159335304067198720">Úspora dat: <ph name="PERCENT" /></translation> <translation id="6165508094623778733">Další informace</translation> <translation id="6177390657002841081">Zapnutí Spořiče dat</translation> +<translation id="617991007797131187">Chrome může v Číně k vyhledávání používat službu Sogou. Tuto volbu můžete změnit v <ph name="BEGIN_LINK" />Nastavení<ph name="END_LINK" />.</translation> <translation id="6181444274883918285">Přidat výjimku pro konkrétní web</translation> <translation id="6192792657125177640">Výjimky</translation> <translation id="6232535412751077445">Pokud povolíte požadavek Do Not Track, bude připojován k datům provozu prohlížení. Účinek tohoto požadavku závisí na tom, zda na něj budou webové stránky reagovat a jak jej budou interpretovat. @@ -472,6 +476,7 @@ <translation id="654446541061731451">Vyberte kartu, kterou chcete přenést</translation> <translation id="6545017243486555795">Vymazat všechna data</translation> <translation id="6550675742724504774">Možnosti</translation> +<translation id="6560414384669816528">Vyhledávat pomocí Sogou</translation> <translation id="656628257199996201">Vždy překládat jazyk <ph name="SOURCE_LANGUAGE" /></translation> <translation id="6571070086367343653">Upravit platební kartu</translation> <translation id="6573431926118603307">Zde se objeví karty, které jste otevřeli v Chromu ve svých ostatních zařízeních.</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 4184dd0..31925b9b 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_da.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_da.xtb
@@ -286,6 +286,7 @@ <translation id="4351244548802238354">Luk dialogboksen</translation> <translation id="4376501731284077108">Ukontrolleret</translation> <translation id="4378154925671717803">Telefon</translation> +<translation id="4384468725000734951">Søgning via Sogou</translation> <translation id="4412992751769744546">Tillad tredjepartscookies</translation> <translation id="4440256989292146959">Flere data for færre penge</translation> <translation id="4452548195519783679">Bogmærket er gemt i <ph name="FOLDER_NAME" /></translation> @@ -424,6 +425,8 @@ <translation id="5916664084637901428">Til</translation> <translation id="5919204609460789179">Opdater <ph name="PRODUCT_NAME" /> for at starte synkroniseringen</translation> <translation id="5939518447894949180">Nulstil</translation> +<translation id="5942872142862698679">Søgning via Google</translation> +<translation id="6000066717592683814">Behold Google</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> <translation id="6031101910111098835">Skjult – klik for at udvide</translation> @@ -441,6 +444,7 @@ <translation id="6159335304067198720"><ph name="PERCENT" /> sparet data</translation> <translation id="6165508094623778733">Flere oplysninger</translation> <translation id="6177390657002841081">Slå Datasparefunktion til</translation> +<translation id="617991007797131187">Chrome kan bruge Sogou til søgning i Kina. Du kan ændre dette i <ph name="BEGIN_LINK" />Indstillinger<ph name="END_LINK" />.</translation> <translation id="6181444274883918285">Tilføj en undtagelse for et website</translation> <translation id="6192792657125177640">Undtagelser</translation> <translation id="6232535412751077445">Aktivering af "Do Not Track" betyder, at en anmodning medtages i din browsertrafik. Effekten afhænger af, om et website reagerer på anmodningen, og hvordan anmodningen fortolkes. @@ -472,6 +476,7 @@ <translation id="654446541061731451">Vælg en fane, der skal overføres</translation> <translation id="6545017243486555795">Ryd alle data</translation> <translation id="6550675742724504774">Valgmuligheder</translation> +<translation id="6560414384669816528">Søg via Sogou</translation> <translation id="656628257199996201">Oversæt altid <ph name="SOURCE_LANGUAGE" /></translation> <translation id="6571070086367343653">Rediger kreditkort</translation> <translation id="6573431926118603307">Faner, du har åbnet i Chrome på dine andre enheder, vises her.</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 7c03fc0..07e88464 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_de.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_de.xtb
@@ -286,6 +286,7 @@ <translation id="4351244548802238354">Dialogfeld schließen</translation> <translation id="4376501731284077108">Nicht kontrolliert</translation> <translation id="4378154925671717803">Telefon</translation> +<translation id="4384468725000734951">Suche erfolgt mit Sogou</translation> <translation id="4412992751769744546">Cookies Dritter zulassen</translation> <translation id="4440256989292146959">Mehr surfen, weniger verbrauchen</translation> <translation id="4452548195519783679">Als Lesezeichen in "<ph name="FOLDER_NAME" />" gespeichert</translation> @@ -411,7 +412,7 @@ <translation id="5777170031995031090">Sie können festlegen, wie Google Ihren Browserverlauf nutzt, um die Suche, Werbung und andere Google-Dienste zu personalisieren.</translation> <translation id="5804241973901381774">Berechtigungen</translation> <translation id="5809361687334836369">{HOURS,plural, =1{Vor # Stunde}other{Vor # Stunden}}</translation> -<translation id="5817918615728894473">Pairing durchführen</translation> +<translation id="5817918615728894473">Koppeln</translation> <translation id="583281660410589416">Unbekannt</translation> <translation id="5832934273103296195">Maximiert – zum Minimieren klicken</translation> <translation id="583891442612896534">Chrome kann die Google-Server für die Datenkomprimierung nicht erreichen. Ihre Einsparungen bei der Datennutzung können begrenzt sein.</translation> @@ -424,6 +425,8 @@ <translation id="5916664084637901428">An</translation> <translation id="5919204609460789179">Zur Synchronisierung müssen Sie <ph name="PRODUCT_NAME" /> aktualisieren</translation> <translation id="5939518447894949180">Zurücksetzen</translation> +<translation id="5942872142862698679">Suche erfolgt mit Google</translation> +<translation id="6000066717592683814">Google beibehalten</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> <translation id="6031101910111098835">Minimiert – zum Maximieren klicken</translation> @@ -441,6 +444,7 @@ <translation id="6159335304067198720"><ph name="PERCENT" /> Einsparungen bei der Datennutzung</translation> <translation id="6165508094623778733">Weitere Informationen</translation> <translation id="6177390657002841081">Datensparmodus aktivieren</translation> +<translation id="617991007797131187">Chrome kann in China Sogou für die Suche verwenden. Sie können dies unter <ph name="BEGIN_LINK" />Einstellungen<ph name="END_LINK" /> ändern.</translation> <translation id="6181444274883918285">Ausnahme für Website hinzufügen</translation> <translation id="6192792657125177640">Ausnahmen</translation> <translation id="6232535412751077445">Wenn Sie das Kästchen "Do Not Track" anklicken, wird mit Ihren Browserzugriffen eine Anforderung gesendet. Wie sich diese Anforderung auswirkt, hängt davon ab, ob eine Website darauf reagiert und wie die Anforderung interpretiert wird. @@ -472,6 +476,7 @@ <translation id="654446541061731451">Tab zum Beamen auswählen</translation> <translation id="6545017243486555795">Alle Daten löschen</translation> <translation id="6550675742724504774">Optionen</translation> +<translation id="6560414384669816528">Suche mit Sogou</translation> <translation id="656628257199996201"><ph name="SOURCE_LANGUAGE" /> immer übersetzen</translation> <translation id="6571070086367343653">Kreditkarte bearbeiten</translation> <translation id="6573431926118603307">Hier werden Tabs angezeigt, die Sie auf Ihren anderen Geräten in Chrome geöffnet haben.</translation> @@ -523,7 +528,7 @@ <translation id="7062545763355031412">Akzeptieren und Konto wechseln</translation> <translation id="7063006564040364415">Verbindung zum Synchronisierungsserver konnte nicht hergestellt werden.</translation> <translation id="7064851114919012435">Kontaktdaten</translation> -<translation id="7074853159844403180"><ph name="SITE" /> möchte ein Pairing durchführen mit:</translation> +<translation id="7074853159844403180"><ph name="SITE" /> möchte sich koppeln 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="7115197232530297436">Nicht unterstützte Versandadresse. Wählen Sie eine andere Adresse aus.</translation> @@ -697,7 +702,7 @@ <translation id="917685106653909562">Physical Web-Seiten zu Objekten in der Nähe</translation> <translation id="9187199695613236444">Für Mobilgeräte optimierte Ansicht</translation> <translation id="9188680907066685419">Von verwaltetem Konto abmelden</translation> -<translation id="9192643434065497760">Aktivieren Sie Bluetooth in den <ph name="BEGIN_LINK" />Geräteeinstellungen<ph name="END_LINK" />, um ein Pairing zuzulassen.</translation> +<translation id="9192643434065497760">Aktivieren Sie Bluetooth in den <ph name="BEGIN_LINK" />Geräteeinstellungen<ph name="END_LINK" />, um eine Kopplung zu ermöglichen.</translation> <translation id="9198708126133947749">Die Daten dieses Geräts werden durch die Daten von <ph name="TO_ACCOUNT" /> ersetzt. Wenn Sie Ihre vorhandenen Daten abrufen möchten, wechseln Sie zurück zu <ph name="FROM_ACCOUNT" />.</translation> <translation id="9206873250291191720">A</translation> <translation id="9219103736887031265">Bilder</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 529294b9..de3b55c 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_el.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_el.xtb
@@ -286,6 +286,7 @@ <translation id="4351244548802238354">Κλείσιμο παραθύρου διαλόγου</translation> <translation id="4376501731284077108">Χωρίς έλεγχο</translation> <translation id="4378154925671717803">Τηλέφωνο</translation> +<translation id="4384468725000734951">Χρήση του Sogou για αναζήτηση</translation> <translation id="4412992751769744546">Αποδοχή cookie τρίτου μέρους</translation> <translation id="4440256989292146959">Περισσότερη περιήγηση με λιγότερα δεδομένα</translation> <translation id="4452548195519783679">Ο σελιδοδείκτης είναι στο "<ph name="FOLDER_NAME" />"</translation> @@ -424,6 +425,8 @@ <translation id="5916664084637901428">Ενεργό</translation> <translation id="5919204609460789179">Ενημερώστε το <ph name="PRODUCT_NAME" /> για να ξεκινήσει ο συγχρονισμός</translation> <translation id="5939518447894949180">Επαναφορά</translation> +<translation id="5942872142862698679">Χρήση του Google για αναζήτηση</translation> +<translation id="6000066717592683814">Διατήρηση του Google</translation> <translation id="6010869025736512584">Πρόσβαση στην είσοδο βίντεο</translation> <translation id="6012342843556706400">Το Chrome χρειάζεται πρόσβαση στην τοποθεσία προκειμένου να την μοιραστεί με αυτόν τον ιστότοπο.</translation> <translation id="6031101910111098835">Συμπτυγμένη - Κάντε κλικ για ανάπτυξη</translation> @@ -441,6 +444,7 @@ <translation id="6159335304067198720">Εξοικονόμηση δεδομένων κατά <ph name="PERCENT" /></translation> <translation id="6165508094623778733">Μάθετε περισσότερα</translation> <translation id="6177390657002841081">Ενεργοποίηση Εξοικονόμησης δεδομένων</translation> +<translation id="617991007797131187">Το Chrome μπορεί να χρησιμοποιεί το Sogou για αναζητήσεις στην Κίνα. Μπορείτε να αλλάξετε αυτήν την επιλογή από τις <ph name="BEGIN_LINK" />Ρυθμίσεις<ph name="END_LINK" />.</translation> <translation id="6181444274883918285">Προσθήκη εξαίρεσης ιστότοπου</translation> <translation id="6192792657125177640">Εξαιρέσεις</translation> <translation id="6232535412751077445">Η ενεργοποίηση της επιλογής "Να μην γίνεται εντοπισμός" σημαίνει ότι θα συμπεριληφθεί ένα αίτημα με την επισκεψιμότητα της περιήγησής σας. Τυχόν αποτελέσματα εξαρτώνται από το κατά πόσο ένας ιστότοπος ανταποκρίνεται στο αίτημα, καθώς και από τον τρόπο με τον οποίο ερμηνεύεται το αίτημα. @@ -472,6 +476,7 @@ <translation id="654446541061731451">Επιλέξτε μια καρτέλα για ζεύξη</translation> <translation id="6545017243486555795">Διαγραφή όλων των δεδομένων</translation> <translation id="6550675742724504774">Επιλογές</translation> +<translation id="6560414384669816528">Αναζήτηση με το Sogou</translation> <translation id="656628257199996201">Να γίνεται πάντα μετάφραση των <ph name="SOURCE_LANGUAGE" /></translation> <translation id="6571070086367343653">Επεξεργασία πιστωτικής κάρτας</translation> <translation id="6573431926118603307">Οι καρτέλες που έχετε ανοίξει στο Chrome στις άλλες συσκευές σας θα εμφανίζονται εδώ.</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 d55f4304..34e424c3 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
@@ -286,6 +286,7 @@ <translation id="4351244548802238354">Close dialogue</translation> <translation id="4376501731284077108">Uncontrolled</translation> <translation id="4378154925671717803">Phone</translation> +<translation id="4384468725000734951">Using Sogou for search</translation> <translation id="4412992751769744546">Allow third-party cookies</translation> <translation id="4440256989292146959">Browse more for less</translation> <translation id="4452548195519783679">Bookmarked to <ph name="FOLDER_NAME" /></translation> @@ -424,6 +425,8 @@ <translation id="5916664084637901428">On</translation> <translation id="5919204609460789179">Update <ph name="PRODUCT_NAME" /> to start sync</translation> <translation id="5939518447894949180">Reset</translation> +<translation id="5942872142862698679">Using Google for search</translation> +<translation id="6000066717592683814">Keep Google</translation> <translation id="6010869025736512584">Accessing video input</translation> <translation id="6012342843556706400">Chrome needs location access to share it with this site.</translation> <translation id="6031101910111098835">Collapsed – Click to expand</translation> @@ -441,6 +444,7 @@ <translation id="6159335304067198720"><ph name="PERCENT" /> data savings</translation> <translation id="6165508094623778733">Learn more</translation> <translation id="6177390657002841081">Turn on Data Saver</translation> +<translation id="617991007797131187">Chrome can use Sogou for search in China. You can change this in <ph name="BEGIN_LINK" />Settings<ph name="END_LINK" />.</translation> <translation id="6181444274883918285">Add site exception</translation> <translation id="6192792657125177640">Exceptions</translation> <translation id="6232535412751077445">Enabling “Do Not Track” means that a request will be included with your browsing traffic. Any effect depends on whether a website responds to the request and how the request is interpreted. @@ -472,6 +476,7 @@ <translation id="654446541061731451">Select a tab to beam</translation> <translation id="6545017243486555795">Clear All Data</translation> <translation id="6550675742724504774">Options</translation> +<translation id="6560414384669816528">Search with Sogou</translation> <translation id="656628257199996201">Always translate <ph name="SOURCE_LANGUAGE" /></translation> <translation id="6571070086367343653">Edit credit card</translation> <translation id="6573431926118603307">Tabs that you've opened in Chrome on your other devices will appear here.</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 e2f7af1..75643cc 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
@@ -286,6 +286,7 @@ <translation id="4351244548802238354">Cerrar cuadro de diálogo</translation> <translation id="4376501731284077108">Sin controlar</translation> <translation id="4378154925671717803">Teléfono</translation> +<translation id="4384468725000734951">Se usa Sogou para la búsqueda</translation> <translation id="4412992751769744546">Permitir cookies de terceros</translation> <translation id="4440256989292146959">Navega más y gasta menos</translation> <translation id="4452548195519783679">Se agregó a marcadores en <ph name="FOLDER_NAME" /></translation> @@ -424,6 +425,8 @@ <translation id="5916664084637901428">Activada</translation> <translation id="5919204609460789179">Actualiza <ph name="PRODUCT_NAME" /> para iniciar la sincronización</translation> <translation id="5939518447894949180">Restablecer</translation> +<translation id="5942872142862698679">Se usa Google para la búsqueda</translation> +<translation id="6000066717592683814">Seguir usando Google</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> <translation id="6031101910111098835">Contraído (hacer clic para expandir)</translation> @@ -441,6 +444,7 @@ <translation id="6159335304067198720"><ph name="PERCENT" /> de ahorro de datos</translation> <translation id="6165508094623778733">Más información</translation> <translation id="6177390657002841081">Activar la extensión Reducir datos</translation> +<translation id="617991007797131187">Chrome puede usar Sogou para realizar búsquedas en China. Puedes cambiar esta acción en la <ph name="BEGIN_LINK" />Configuración<ph name="END_LINK" />.</translation> <translation id="6181444274883918285">Agregar excepción del sitio</translation> <translation id="6192792657125177640">Excepciones</translation> <translation id="6232535412751077445">Si se habilita la opción de "No realizar seguimiento", se incluirá una solicitud con tu tráfico de navegación. Los efectos dependerán de si hay algún sitio web que responda a la solicitud y de cómo se interprete. @@ -472,6 +476,7 @@ <translation id="654446541061731451">Elige una pestaña para transmitir.</translation> <translation id="6545017243486555795">Borrar todos los datos</translation> <translation id="6550675742724504774">Opciones</translation> +<translation id="6560414384669816528">Buscar con Sogou</translation> <translation id="656628257199996201">Traducir siempre el texto en <ph name="SOURCE_LANGUAGE" /></translation> <translation id="6571070086367343653">Editar tarjeta de crédito</translation> <translation id="6573431926118603307">Aquí aparecerán las pestañas que abriste en Chrome en tus otros dispositivos.</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 6a1caed7..1b843b52 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_es.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_es.xtb
@@ -66,7 +66,7 @@ <translation id="1644574205037202324">Historial</translation> <translation id="1647391597548383849">Acceder a la cámara</translation> <translation id="169033420419426091">No se ha podido descargar <ph name="FILE_NAME" /> porque falta la tarjeta SD.</translation> -<translation id="1709438864123551175">Economizador de Datos</translation> +<translation id="1709438864123551175">Ahorro de datos</translation> <translation id="1742134235943978220">Se ha traducido al <ph name="TARGET_LANGUAGE" />.</translation> <translation id="1749561566933687563">Sincronizar marcadores</translation> <translation id="17513872634828108">Pestañas abiertas</translation> @@ -141,7 +141,7 @@ <translation id="2498359688066513246">Ayuda y sugerencias</translation> <translation id="2501278716633472235">Volver</translation> <translation id="2512222046227390255">Autocompletar formularios</translation> -<translation id="2526148617758225454">El Economizador de datos está activado. Puedes administrarlo en la configuración.</translation> +<translation id="2526148617758225454">Ahorro de Datos está activado. Puedes administrarlo en la configuración.</translation> <translation id="2532336938189706096">Vista web</translation> <translation id="2536728043171574184">Viendo una copia sin conexión de esta página</translation> <translation id="2546283357679194313">Datos de sitios y cookies</translation> @@ -206,7 +206,7 @@ <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="3365671512111106261">No disponible cuando se activa el Economizador de Datos</translation> +<translation id="3365671512111106261">No disponible cuando se activa Ahorro de Datos</translation> <translation id="3367813778245106622">Vuelve a iniciar sesión para que comience la sincronización</translation> <translation id="3384347053049321195">Compartir imagen</translation> <translation id="3386292677130313581">Preguntar antes de permitir que los sitios web detecten tu ubicación (recomendado)</translation> @@ -286,6 +286,7 @@ <translation id="4351244548802238354">Cerrar cuadro de diálogo</translation> <translation id="4376501731284077108">Sin control</translation> <translation id="4378154925671717803">Teléfono</translation> +<translation id="4384468725000734951">Usando Sogou para realizar búsquedas</translation> <translation id="4412992751769744546">Permitir cookies de terceros</translation> <translation id="4440256989292146959">Navega más por menos</translation> <translation id="4452548195519783679">Marcador añadido a <ph name="FOLDER_NAME" /></translation> @@ -415,7 +416,7 @@ <translation id="583281660410589416">Desconocido</translation> <translation id="5832934273103296195">Vista expandida (hacer clic para contraerla)</translation> <translation id="583891442612896534">Chrome no puede acceder a los servidores de Google para comprimir los datos. El ahorro de datos puede estar limitado.</translation> -<translation id="585027516397408832">Economizador de datos habilitado</translation> +<translation id="585027516397408832">Ahorro de Datos habilitado</translation> <translation id="5860033963881614850">No</translation> <translation id="5869522115854928033">Contraseñas guardadas</translation> <translation id="5899349522111170522">Crear archivo nuevo</translation> @@ -424,6 +425,8 @@ <translation id="5916664084637901428">Activar</translation> <translation id="5919204609460789179">Actualiza <ph name="PRODUCT_NAME" /> para iniciar la sincronización</translation> <translation id="5939518447894949180">Restablecer</translation> +<translation id="5942872142862698679">Usando Google para realizar búsquedas</translation> +<translation id="6000066717592683814">Mantener Google como motor de búsqueda predeterminado</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> <translation id="6031101910111098835">Vista contraída (hacer clic para expandirla)</translation> @@ -440,7 +443,8 @@ <translation id="6140912465461743537">País/región</translation> <translation id="6159335304067198720"><ph name="PERCENT" /> de ahorro de datos</translation> <translation id="6165508094623778733">Más información</translation> -<translation id="6177390657002841081">Activar el Economizador de datos</translation> +<translation id="6177390657002841081">Activar Ahorro de Datos</translation> +<translation id="617991007797131187">Chrome puede usar Sogou para realizar búsquedas en China. Puedes cambiar esta función en <ph name="BEGIN_LINK" />Ajustes<ph name="END_LINK" />.</translation> <translation id="6181444274883918285">Añadir excepción de sitio web</translation> <translation id="6192792657125177640">Excepciones</translation> <translation id="6232535412751077445">Al habilitar la opción No realizar seguimiento, se incluirá una solicitud con el tráfico de navegación. El efecto dependerá de si algún sitio web responde a la solicitud y de cómo se interpreta. @@ -472,6 +476,7 @@ <translation id="654446541061731451">Selecciona una pestaña para compartir</translation> <translation id="6545017243486555795">Borrar todos los datos</translation> <translation id="6550675742724504774">Configuración</translation> +<translation id="6560414384669816528">Realizar búsquedas con Sogou</translation> <translation id="656628257199996201">Traducir siempre del <ph name="SOURCE_LANGUAGE" /></translation> <translation id="6571070086367343653">Editar tarjeta de crédito</translation> <translation id="6573431926118603307">Aquí aparecen las pestañas que hayas abierto en Chrome en otros dispositivos.</translation> @@ -514,7 +519,7 @@ <translation id="6992289844737586249">Preguntar antes de permitir que los sitios web utilicen el micrófono (recomendado)</translation> <translation id="7021515813996758557">Se ha descargado <ph name="FILE_NAME" /></translation> <translation id="7022756207310403729">Abrir en el navegador</translation> -<translation id="7026897394897382018">Habilitar Economizador de datos</translation> +<translation id="7026897394897382018">Habilitar Ahorro de Datos</translation> <translation id="7029809446516969842">Contraseñas</translation> <translation id="7031882061095297553">Sincronizar con</translation> <translation id="7040138676081995583">Abrir con...</translation> @@ -530,7 +535,7 @@ <translation id="7138678301420049075">Otro</translation> <translation id="7180611975245234373">Actualizar</translation> <translation id="7191430249889272776">Pestaña abierta en segundo plano.</translation> -<translation id="7208788139759694678">Economizador de datos inhabilitado</translation> +<translation id="7208788139759694678">Ahorro de Datos inhabilitado</translation> <translation id="7243308994586599757">Opciones disponibles cerca de la parte inferior de la pantalla</translation> <translation id="7244362611678346589"><ph name="SEARCH_ENGINE_URL" /> utiliza tu ubicación para mostrar resultados de búsqueda locales</translation> <translation id="7347770551817603360">Contenido sin conexión</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 8c8e8022..d4a2a34e 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_fa.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_fa.xtb
@@ -286,6 +286,7 @@ <translation id="4351244548802238354">بستن کادر گفتگو</translation> <translation id="4376501731284077108">کنترل نشده</translation> <translation id="4378154925671717803">تلفن</translation> +<translation id="4384468725000734951">استفاده از Sogou برای جستجو</translation> <translation id="4412992751769744546">اجازه به کوکیهای طرف ثالث</translation> <translation id="4440256989292146959">مرور بیشتر با هزینه کمتر</translation> <translation id="4452548195519783679">در <ph name="FOLDER_NAME" /> نشانک گذاشته شد</translation> @@ -423,6 +424,8 @@ <translation id="5916664084637901428">روشن</translation> <translation id="5919204609460789179">برای شروع همگامسازی، <ph name="PRODUCT_NAME" /> را بهروزرسانی کنید</translation> <translation id="5939518447894949180">بازنشانی</translation> +<translation id="5942872142862698679">استفاده از Google برای جستجو</translation> +<translation id="6000066717592683814">حفظ Google</translation> <translation id="6010869025736512584">در حال دسترسی به ورودی ویدئویی</translation> <translation id="6012342843556706400">Chrome باید به موقعیت مکانی دسترسی داشته باشد تا آن را با این سایت به اشتراک بگذارد.</translation> <translation id="6031101910111098835">کوچک شده - برای بزرگ کردن کلیک کنید</translation> @@ -440,6 +443,7 @@ <translation id="6159335304067198720">ذخیره دادهها: <ph name="PERCENT" /></translation> <translation id="6165508094623778733">بیشتر بدانید</translation> <translation id="6177390657002841081">روشن کردن «صرفهجویی در مصرف داده»</translation> +<translation id="617991007797131187">در چین، Chrome میتواند از Sogou برای جستجو استفاده کند. میتوانید این قابلیت را در <ph name="BEGIN_LINK" /> تنظیمات<ph name="END_LINK" /> تغییر دهید.</translation> <translation id="6181444274883918285">افزودن استثنای سایت</translation> <translation id="6192792657125177640">موارد استثنا</translation> <translation id="6232535412751077445">فعال کردن «ردیابی نشود» به این معنی است که درخواستی به ترافیک مرور شما اضافه میشود. هر گونه اثری به این بستگی دارد که وبسایت به درخواست پاسخ میدهد یا نه و درخواست چگونه تفسیر میشود. @@ -471,6 +475,7 @@ <translation id="654446541061731451">برگهای برای انتقال با پرتو انتخاب کنید</translation> <translation id="6545017243486555795">پاک کردن همه دادهها</translation> <translation id="6550675742724504774">گزینهها</translation> +<translation id="6560414384669816528">جستجو با Sogou</translation> <translation id="656628257199996201"><ph name="SOURCE_LANGUAGE" /> همیشه ترجمه شود</translation> <translation id="6571070086367343653">ویرایش کارت اعتباری</translation> <translation id="6573431926118603307">برگههایی که در دستگاههای دیگر در Chrome باز کردهاید، در اینجا نمایان میشوند.</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 6032a04..68a73ad 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_fi.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_fi.xtb
@@ -286,6 +286,7 @@ <translation id="4351244548802238354">Sulje ikkuna</translation> <translation id="4376501731284077108">Ei rajoitettu</translation> <translation id="4378154925671717803">Puhelin</translation> +<translation id="4384468725000734951">Hakukoneena käytetään Sogouta.</translation> <translation id="4412992751769744546">Salli kolmannen osapuolen evästeet</translation> <translation id="4440256989292146959">Selaa enemmän vähemmällä</translation> <translation id="4452548195519783679">Lisätty kirjanmerkiksi kansioon <ph name="FOLDER_NAME" /></translation> @@ -424,6 +425,8 @@ <translation id="5916664084637901428">Käytössä</translation> <translation id="5919204609460789179">Aloita synkronointi päivittämällä <ph name="PRODUCT_NAME" /></translation> <translation id="5939518447894949180">Tyhjennä</translation> +<translation id="5942872142862698679">Hakukoneena käytetään Googlea.</translation> +<translation id="6000066717592683814">Käytä Googlea</translation> <translation id="6010869025736512584">Videotuloa käytetään</translation> <translation id="6012342843556706400">Chrome tarvitsee sijainnin käyttöoikeuden voidakseen jakaa sen tämän sivuston kanssa.</translation> <translation id="6031101910111098835">Tiivistetty – laajenna klikkaamalla</translation> @@ -441,6 +444,7 @@ <translation id="6159335304067198720"><ph name="PERCENT" /> vähemmän tiedonsiirtoa</translation> <translation id="6165508094623778733">Lisätietoja</translation> <translation id="6177390657002841081">Ota Data Saver käyttöön</translation> +<translation id="617991007797131187">Chrome voi käyttää Sogouta hakujen tekemiseen Kiinassa. Voit muokata tätä <ph name="BEGIN_LINK" />Asetuksissa<ph name="END_LINK" />.</translation> <translation id="6181444274883918285">Lisää sivustopoikkeus</translation> <translation id="6192792657125177640">Poikkeukset</translation> <translation id="6232535412751077445">Do Not Track -toiminnon käyttöönotto tarkoittaa sitä, että selausliikenteeseesi sisällytetään pyyntö. Sen vaikutus riippuu siitä, vastaako verkkosivusto pyyntöön ja miten pyyntöä tulkitaan. @@ -472,6 +476,7 @@ <translation id="654446541061731451">Valitse siirrettävä välilehti</translation> <translation id="6545017243486555795">Poista kaikki tiedot</translation> <translation id="6550675742724504774">Asetukset</translation> +<translation id="6560414384669816528">Käytä Sogouta</translation> <translation id="656628257199996201">Käännä aina <ph name="SOURCE_LANGUAGE" /></translation> <translation id="6571070086367343653">Luottokortin muokkaus</translation> <translation id="6573431926118603307">Muilla laitteilla Chromessa avaamasi välilehdet näytetään täällä.</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 7638754..ab2efb2 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_fil.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_fil.xtb
@@ -286,6 +286,7 @@ <translation id="4351244548802238354">Isara ang dialog</translation> <translation id="4376501731284077108">Hindi kinokontrol</translation> <translation id="4378154925671717803">Telepono</translation> +<translation id="4384468725000734951">Ginagamit ang Sogou para sa paghahanap</translation> <translation id="4412992751769744546">Payagan ang third-party na cookies</translation> <translation id="4440256989292146959">Mag-browse pa nang mas mura</translation> <translation id="4452548195519783679">Na-bookmark sa <ph name="FOLDER_NAME" /></translation> @@ -424,6 +425,8 @@ <translation id="5916664084637901428">Naka-on</translation> <translation id="5919204609460789179">I-update ang <ph name="PRODUCT_NAME" /> upang simulan ang pag-sync</translation> <translation id="5939518447894949180">I-reset</translation> +<translation id="5942872142862698679">Ginagamit ang Google para sa paghahanap</translation> +<translation id="6000066717592683814">Panatilihin ang Google</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> <translation id="6031101910111098835">Naka-collapse - I-click upang palawakin</translation> @@ -441,6 +444,7 @@ <translation id="6159335304067198720"><ph name="PERCENT" /> natipid sa data</translation> <translation id="6165508094623778733">Matuto nang higit pa</translation> <translation id="6177390657002841081">I-on ang Data Saver</translation> +<translation id="617991007797131187">Magagamit ng Chrome ang Sogou para sa paghahanap sa China. Maaari mo itong baguhin sa <ph name="BEGIN_LINK" />Mga Setting<ph name="END_LINK" />.</translation> <translation id="6181444274883918285">Magdagdag ng pagbubukod ng site</translation> <translation id="6192792657125177640">Mga Pagbubukod</translation> <translation id="6232535412751077445">Kapag na-enable mo ang “Huwag Subaybayan,” magsasama ng isang kahilingan sa trapiko ng iyong pagba-browse. Ang anumang magiging epekto ay dedepende sa pagtugon at pagbibigay-kahulugan ng website sa nabanggit na kahilingan. @@ -472,6 +476,7 @@ <translation id="654446541061731451">Pumili ng tab upang mag-beam</translation> <translation id="6545017243486555795">I-clear ang Lahat ng Data</translation> <translation id="6550675742724504774">Mga Pagpipilian</translation> +<translation id="6560414384669816528">Maghanap gamit ang Sogou</translation> <translation id="656628257199996201">Palaging isalin ang <ph name="SOURCE_LANGUAGE" /></translation> <translation id="6571070086367343653">I-edit ang credit card</translation> <translation id="6573431926118603307">Dito lalabas ang mga nabuksan mong tab sa Chrome sa iba mo pang mga device.</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 ad82d711..ad7c269 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_fr.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_fr.xtb
@@ -286,6 +286,7 @@ <translation id="4351244548802238354">Fermer la boîte de dialogue</translation> <translation id="4376501731284077108">Aucun contrôle</translation> <translation id="4378154925671717803">Téléphone</translation> +<translation id="4384468725000734951">Utilisation de Sogou pour les recherches</translation> <translation id="4412992751769744546">Autoriser les cookies tiers</translation> <translation id="4440256989292146959">Consommer moins de données</translation> <translation id="4452548195519783679">Ajouté aux favoris dans "<ph name="FOLDER_NAME" />"</translation> @@ -424,6 +425,8 @@ <translation id="5916664084637901428">Activé</translation> <translation id="5919204609460789179">Mettre à jour <ph name="PRODUCT_NAME" /> pour lancer la synchronisation</translation> <translation id="5939518447894949180">Réinitialiser</translation> +<translation id="5942872142862698679">Utilisation de Google pour les recherches</translation> +<translation id="6000066717592683814">Conserver Google</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> <translation id="6031101910111098835">Réduit – Cliquer pour développer</translation> @@ -441,6 +444,7 @@ <translation id="6159335304067198720">Économies de données de <ph name="PERCENT" /></translation> <translation id="6165508094623778733">En savoir plus</translation> <translation id="6177390657002841081">Activer l'Économiseur de données</translation> +<translation id="617991007797131187">En Chine, Chrome peut utiliser Sogou pour des effectuer des recherches. Vous pouvez modifier cette option dans <ph name="BEGIN_LINK" />Paramètres<ph name="END_LINK" />.</translation> <translation id="6181444274883918285">Ajouter une exception pour un site</translation> <translation id="6192792657125177640">Exceptions</translation> <translation id="6232535412751077445">Si vous interdisez le suivi, une demande sera incluse dans le trafic lié à votre navigation. Les résultats obtenus dépendent de la réponse du site (s'il répond ou non) et de la manière dont il interprète la demande. @@ -472,6 +476,7 @@ <translation id="654446541061731451">Sélectionnez un onglet à partager.</translation> <translation id="6545017243486555795">Supprimer toutes les données</translation> <translation id="6550675742724504774">Options</translation> +<translation id="6560414384669816528">Rechercher avec Sogou</translation> <translation id="656628257199996201">Toujours traduire les pages en <ph name="SOURCE_LANGUAGE" /></translation> <translation id="6571070086367343653">Modifier la carte de paiement</translation> <translation id="6573431926118603307">Les onglets que vous avez ouverts dans Chrome sur vos autres appareils s'affichent ici.</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 30d73bc..c654261 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_hi.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_hi.xtb
@@ -286,6 +286,7 @@ <translation id="4351244548802238354">संवाद बंद करें</translation> <translation id="4376501731284077108">अनियंत्रित</translation> <translation id="4378154925671717803">फ़ोन</translation> +<translation id="4384468725000734951">खोजने के लिए Sogou का उपयोग करना</translation> <translation id="4412992751769744546">तृतीय-पक्ष कुकी को अनुमति दें</translation> <translation id="4440256989292146959">कम से अधिक ब्राउज़ करें</translation> <translation id="4452548195519783679"><ph name="FOLDER_NAME" /> में बुकमार्क किया गया</translation> @@ -424,6 +425,8 @@ <translation id="5916664084637901428">चालू</translation> <translation id="5919204609460789179">समन्वयन प्रारंभ करने के लिए <ph name="PRODUCT_NAME" /> अपडेट करें</translation> <translation id="5939518447894949180">रीसेट करें</translation> +<translation id="5942872142862698679">खोजने के लिए Google का उपयोग करना</translation> +<translation id="6000066717592683814">Google को डिफ़ॉल्ट बनाए रखें</translation> <translation id="6010869025736512584">वीडियो इनपुट ऐक्सेस हो रहा है</translation> <translation id="6012342843556706400">Chrome को स्थान ऐक्सेस की आवश्यकता है ताकि स्थान को इस साइट के साथ साझा किया जा सके.</translation> <translation id="6031101910111098835">संक्षिप्त - विस्तृत करने के लिए क्लिक करें</translation> @@ -441,6 +444,7 @@ <translation id="6159335304067198720"><ph name="PERCENT" /> डेटा बचत</translation> <translation id="6165508094623778733">अधिक जानें</translation> <translation id="6177390657002841081">डेटा बचाने का साधन चालू करना</translation> +<translation id="617991007797131187">Chrome चीन में खोज करने के लिए Sogou का उपयोग कर सकता है. आप <ph name="BEGIN_LINK" />सेटिंग<ph name="END_LINK" /> में इसे बदल सकते हैं.</translation> <translation id="6181444274883918285">साइट का अपवाद जोड़ें</translation> <translation id="6192792657125177640">अपवाद</translation> <translation id="6232535412751077445">“नज़र न रखें” सक्षम करने का अर्थ है कि आपके ब्राउज़िंग ट्रैफ़िक के साथ एक अनुरोध शामिल किया जाएगा. कोई भी प्रभाव इस बात पर निर्भर करता है कि वेबसाइट अनुरोध का प्रतिसाद देती है या नहीं और अनुरोध को किस तरह समझा जाता है. @@ -472,6 +476,7 @@ <translation id="654446541061731451">बीम के लिए टैब को चुनें</translation> <translation id="6545017243486555795">सभी डेटा साफ़ करें</translation> <translation id="6550675742724504774">विकल्प</translation> +<translation id="6560414384669816528">Sogou से खोजें</translation> <translation id="656628257199996201"><ph name="SOURCE_LANGUAGE" /> का हमेशा अनुवाद करें</translation> <translation id="6571070086367343653">क्रेडिट कार्ड संपादित करें</translation> <translation id="6573431926118603307">आपके द्वारा अपने अन्य डिवाइस पर खोले गए टैब यहां दिखाई देंगे.</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 a5443a3..eaeb0d30 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_hr.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_hr.xtb
@@ -286,6 +286,7 @@ <translation id="4351244548802238354">Zatvori dijaloški okvir</translation> <translation id="4376501731284077108">Nenadzirani</translation> <translation id="4378154925671717803">Telefon</translation> +<translation id="4384468725000734951">Za pretraživanje se upotrebljava Sogou</translation> <translation id="4412992751769744546">Dopusti kolačiće trećih strana</translation> <translation id="4440256989292146959">Brže pregledavanje</translation> <translation id="4452548195519783679">Oznaka dodana u mapu <ph name="FOLDER_NAME" /></translation> @@ -424,6 +425,8 @@ <translation id="5916664084637901428">Uključi</translation> <translation id="5919204609460789179">Ažurirajte <ph name="PRODUCT_NAME" /> za pokretanje sinkronizacije</translation> <translation id="5939518447894949180">Ponovno postavi</translation> +<translation id="5942872142862698679">Za pretraživanje se upotrebljava Google</translation> +<translation id="6000066717592683814">Zadrži Google</translation> <translation id="6010869025736512584">Pristupanje videoulazu</translation> <translation id="6012342843556706400">Chrome treba imati pristup lokaciji da bi je dijelio s ovom web-lokacijom.</translation> <translation id="6031101910111098835">Sažeto – kliknite za proširivanje</translation> @@ -441,6 +444,7 @@ <translation id="6159335304067198720"><ph name="PERCENT" /> manji podatkovni promet</translation> <translation id="6165508094623778733">Saznajte više</translation> <translation id="6177390657002841081">Uključi uštedu podataka</translation> +<translation id="617991007797131187">Chrome može upotrebljavati Sogou za pretraživanje u Kini. To možete promijeniti u <ph name="BEGIN_LINK" />postavkama<ph name="END_LINK" />.</translation> <translation id="6181444274883918285">Dodaj iznimku za web-lokaciju</translation> <translation id="6192792657125177640">Iznimke</translation> <translation id="6232535412751077445">Omogućivanje opcije "Nemoj pratiti" znači da će se u promet pregledavanja uključiti zahtjev. Učinak ovisi o tome odgovara li web-lokacija na taj zahtjev i kako se zahtjev tumači. @@ -472,6 +476,7 @@ <translation id="654446541061731451">Odaberite karticu za emitiranje</translation> <translation id="6545017243486555795">Izbriši sve podatke</translation> <translation id="6550675742724504774">Opcije</translation> +<translation id="6560414384669816528">Pretražujte na usluzi Sogou</translation> <translation id="656628257199996201">Uvijek prevodi <ph name="SOURCE_LANGUAGE" /></translation> <translation id="6571070086367343653">Uređivanje kreditne kartice</translation> <translation id="6573431926118603307">Ovdje će se prikazati kartice koje ste otvorili u Chromeu na svojim ostalim uređajima.</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 fe9b5c79..f84e8de 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_hu.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_hu.xtb
@@ -286,6 +286,7 @@ <translation id="4351244548802238354">Párbeszédablak bezárása</translation> <translation id="4376501731284077108">Nem kezelt</translation> <translation id="4378154925671717803">Telefon</translation> +<translation id="4384468725000734951">A Sogou használata a kereséshez</translation> <translation id="4412992751769744546">Harmadik felektől származó cookie-k engedélyezése</translation> <translation id="4440256989292146959">Több böngészés kedvezőbb áron</translation> <translation id="4452548195519783679">Könyvjelzők közé téve itt: <ph name="FOLDER_NAME" /></translation> @@ -424,6 +425,8 @@ <translation id="5916664084637901428">Be</translation> <translation id="5919204609460789179">A szinkronizálás megkezdéséhez frissítse a következőt: <ph name="PRODUCT_NAME" /></translation> <translation id="5939518447894949180">Visszaállítás</translation> +<translation id="5942872142862698679">A Google használata a kereséshez</translation> +<translation id="6000066717592683814">A Google megtartá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> <translation id="6031101910111098835">Összecsukva – Kattintson a kibontáshoz</translation> @@ -441,6 +444,7 @@ <translation id="6159335304067198720"><ph name="PERCENT" />-os adatmegtakarítás</translation> <translation id="6165508094623778733">További információ</translation> <translation id="6177390657002841081">Az Adatforgalom-csökkentő bekapcsolása</translation> +<translation id="617991007797131187">A Chrome a Sogou szolgáltatást használhatja a kereséshez Kínában. Ezt a <ph name="BEGIN_LINK" />Beállítások<ph name="END_LINK" /> részben módosíthatja.</translation> <translation id="6181444274883918285">Webhelykivétel hozzáadása</translation> <translation id="6192792657125177640">Kivételek</translation> <translation id="6232535412751077445">A „Nincs nyomon követés” engedélyezése azt jelenti, hogy a böngészési forgalommal együtt kérelmet is küld a rendszer. Ennek hatása attól függ, hogy a webhely reagál-e a kérelemre, és hogyan értelmezi azt. @@ -472,6 +476,7 @@ <translation id="654446541061731451">Válassza ki a sugározni kívánt lapot</translation> <translation id="6545017243486555795">Összes adat törlése</translation> <translation id="6550675742724504774">Beállítások</translation> +<translation id="6560414384669816528">Keresés a Sogou használatával</translation> <translation id="656628257199996201">Mindig fordítson <ph name="SOURCE_LANGUAGE" /> nyelvről</translation> <translation id="6571070086367343653">Hitelkártya szerkesztése</translation> <translation id="6573431926118603307">A más eszközökön futó Chrome böngészőben megnyitott lapok itt jelennek meg.</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 f58b698..a77fd68c 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_id.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_id.xtb
@@ -286,6 +286,7 @@ <translation id="4351244548802238354">Tutup dialog</translation> <translation id="4376501731284077108">Tidak terkontrol</translation> <translation id="4378154925671717803">Telepon</translation> +<translation id="4384468725000734951">Menggunakan Sogou untuk penelusuran</translation> <translation id="4412992751769744546">Izinkan cookie pihak ketiga</translation> <translation id="4440256989292146959">Jelajahi lebih banyak dengan lebih hemat</translation> <translation id="4452548195519783679">Dibookmark ke <ph name="FOLDER_NAME" /></translation> @@ -424,6 +425,8 @@ <translation id="5916664084637901428">Aktif</translation> <translation id="5919204609460789179">Perbarui <ph name="PRODUCT_NAME" /> untuk memulai sinkronisasi</translation> <translation id="5939518447894949180">Setel ulang</translation> +<translation id="5942872142862698679">Menggunakan Google untuk penelusuran</translation> +<translation id="6000066717592683814">Tetap menggunakan Google</translation> <translation id="6010869025736512584">Mengakses masukan video</translation> <translation id="6012342843556706400">Chrome memerlukan akses lokasi untuk berbagi dengan situs ini.</translation> <translation id="6031101910111098835">Diciutkan - Klik untuk memperluas</translation> @@ -441,6 +444,7 @@ <translation id="6159335304067198720">Penghematan data <ph name="PERCENT" /></translation> <translation id="6165508094623778733">Pelajari lebih lanjut</translation> <translation id="6177390657002841081">Mengaktifkan Penghemat Data</translation> +<translation id="617991007797131187">Chrome dapat menggunakan Sogou untuk penelusuran di China. Anda dapat mengubah ini di <ph name="BEGIN_LINK" />Setelan<ph name="END_LINK" />.</translation> <translation id="6181444274883918285">Tambahkan pengecualian situs</translation> <translation id="6192792657125177640">Pengecualian</translation> <translation id="6232535412751077445">Jika ‘Jangan Lacak’ diaktifkan, permintaan akan disertakan dengan lalu lintas penjelajahan Anda. Dampak apa pun yang muncul bergantung pada apakah situs web menanggapi permintaan, dan bagaimana permintaan diinterpretasikan. @@ -472,6 +476,7 @@ <translation id="654446541061731451">Pilih tab untuk dipancarkan</translation> <translation id="6545017243486555795">Hapus Semua Data</translation> <translation id="6550675742724504774">Opsi</translation> +<translation id="6560414384669816528">Menelusuri menggunakan Sogou</translation> <translation id="656628257199996201">Selalu terjemahkan bahasa <ph name="SOURCE_LANGUAGE" /></translation> <translation id="6571070086367343653">Edit kartu kredit</translation> <translation id="6573431926118603307">Tab yang telah dibuka di Chrome pada perangkat lainnya akan muncul di sini.</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 30b913d..1914443 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_it.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_it.xtb
@@ -286,6 +286,7 @@ <translation id="4351244548802238354">Chiudi finestra di dialogo</translation> <translation id="4376501731284077108">Non controllati</translation> <translation id="4378154925671717803">Telefono</translation> +<translation id="4384468725000734951">Sogou in uso per la ricerca</translation> <translation id="4412992751769744546">Consenti cookie di terze parti</translation> <translation id="4440256989292146959">Naviga di più e consuma meno dati</translation> <translation id="4452548195519783679">Preferito aggiunto in: <ph name="FOLDER_NAME" /></translation> @@ -424,6 +425,8 @@ <translation id="5916664084637901428">On</translation> <translation id="5919204609460789179">Aggiorna <ph name="PRODUCT_NAME" /> per avviare la sincronizzazione</translation> <translation id="5939518447894949180">Ripristina</translation> +<translation id="5942872142862698679">Google in uso per la ricerca</translation> +<translation id="6000066717592683814">Mantieni Google</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> <translation id="6031101910111098835">Visualizzazione compressa. Fai clic per espandere</translation> @@ -441,6 +444,7 @@ <translation id="6159335304067198720">Riduzioni dei dati: <ph name="PERCENT" /></translation> <translation id="6165508094623778733">Ulteriori informazioni</translation> <translation id="6177390657002841081">Attiva Risparmio dati</translation> +<translation id="617991007797131187">Chrome può utilizzare Sogou per le ricerche in Cina. Puoi modificare questa opzione nelle <ph name="BEGIN_LINK" />Impostazioni<ph name="END_LINK" />.</translation> <translation id="6181444274883918285">Aggiungi eccezione per un sito</translation> <translation id="6192792657125177640">Eccezioni</translation> <translation id="6232535412751077445">Se attivi l'opzione "Non tenere traccia", verrà inclusa una richiesta nel tuo traffico di navigazione. Gli effetti dipendono dall'eventuale risposta dei siti web alla richiesta e dall'interpretazione di quest'ultima. @@ -472,6 +476,7 @@ <translation id="654446541061731451">Seleziona una scheda da trasmettere</translation> <translation id="6545017243486555795">Cancella tutti i dati</translation> <translation id="6550675742724504774">Opzioni</translation> +<translation id="6560414384669816528">Ricerche con Sogou</translation> <translation id="656628257199996201">Traduci sempre da <ph name="SOURCE_LANGUAGE" /></translation> <translation id="6571070086367343653">Modifica carta di credito</translation> <translation id="6573431926118603307">Le schede aperte in Chrome sugli altri dispositivi verranno visualizzate qui.</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 9a5ad01..e8dd3b22 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_iw.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_iw.xtb
@@ -286,6 +286,7 @@ <translation id="4351244548802238354">סגור את תיבת הדו-שיח</translation> <translation id="4376501731284077108">לא מבוקר</translation> <translation id="4378154925671717803">טלפון</translation> +<translation id="4384468725000734951">שימוש ב-Sogou לחיפוש</translation> <translation id="4412992751769744546">התר קובצי Cookie של צד שלישי</translation> <translation id="4440256989292146959">לגלוש יותר, לשלם פחות</translation> <translation id="4452548195519783679">התווסף לסימניות ב-<ph name="FOLDER_NAME" /></translation> @@ -424,6 +425,8 @@ <translation id="5916664084637901428">פועל</translation> <translation id="5919204609460789179">עדכן את <ph name="PRODUCT_NAME" /> כדי להתחיל סנכרון</translation> <translation id="5939518447894949180">אפס</translation> +<translation id="5942872142862698679">שימוש ב-Google לחיפוש</translation> +<translation id="6000066717592683814">המשך להשתמש ב-Google</translation> <translation id="6010869025736512584">גישה לפלט אודיו</translation> <translation id="6012342843556706400">Chrome זקוק לגישה אל המיקום כדי לשתף אותו עם האתר הזה.</translation> <translation id="6031101910111098835">מכווץ - לחץ כדי להרחיב</translation> @@ -441,6 +444,7 @@ <translation id="6159335304067198720">חיסכון בצריכת נתונים בשיעור של <ph name="PERCENT" /></translation> <translation id="6165508094623778733">למידע נוסף</translation> <translation id="6177390657002841081">הפעל את חוסך הנתונים (Data Saver)</translation> +<translation id="617991007797131187">Chrome יכול להשתמש ב-Sogou לחיפוש בסין. ניתן לשנות את הבחירה דרך <ph name="BEGIN_LINK" /> הגדרות <ph name="END_LINK" /> .</translation> <translation id="6181444274883918285">הוסף חריג של אתר</translation> <translation id="6192792657125177640">יוצאי דופן</translation> <translation id="6232535412751077445">אם תפעיל את התכונה 'אל תעקוב', בקשה זו תיכלל בתנועת הגלישה שלך. השפעת הבקשה תלויה באופן הפעולה של כל אתר - אם הוא מגיב לבקשה או לא, וכיצד הוא מפרש אותה. @@ -472,6 +476,7 @@ <translation id="654446541061731451">בחר כרטיסייה להעברת התוכן שלה</translation> <translation id="6545017243486555795">נקה את כל הנתונים</translation> <translation id="6550675742724504774">אפשרויות</translation> +<translation id="6560414384669816528">השתמש ב-Sogou לחפוש</translation> <translation id="656628257199996201">תרגם <ph name="SOURCE_LANGUAGE" /> תמיד</translation> <translation id="6571070086367343653">ערוך כרטיס אשראי</translation> <translation id="6573431926118603307">כרטיסיות שפתחת ב-Chrome במכשירים האחרים שלך יופיעו כאן.</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 9dff2c3..82dd70b 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_ja.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_ja.xtb
@@ -286,6 +286,7 @@ <translation id="4351244548802238354">ダイアログを閉じる</translation> <translation id="4376501731284077108">管理対象外</translation> <translation id="4378154925671717803">電話番号</translation> +<translation id="4384468725000734951">検索に Sogou を使用します</translation> <translation id="4412992751769744546">サードパーティの Cookie を許可</translation> <translation id="4440256989292146959">データ使用量を抑えながら快適にブラウジング</translation> <translation id="4452548195519783679">「<ph name="FOLDER_NAME" />」にブックマークしました</translation> @@ -424,6 +425,8 @@ <translation id="5916664084637901428">オン</translation> <translation id="5919204609460789179">同期を開始するには <ph name="PRODUCT_NAME" /> を更新してください</translation> <translation id="5939518447894949180">リセット</translation> +<translation id="5942872142862698679">検索に Google を使用します</translation> +<translation id="6000066717592683814">Google のままにする</translation> <translation id="6010869025736512584">ビデオ入力にアクセスしています</translation> <translation id="6012342843556706400">このサイトと位置情報を共有するには Chrome に位置情報へのアクセスを許可する必要があります。</translation> <translation id="6031101910111098835">折りたたみ状態 - クリックして展開</translation> @@ -441,6 +444,7 @@ <translation id="6159335304067198720"><ph name="PERCENT" /> のデータを削減</translation> <translation id="6165508094623778733">詳しく見る</translation> <translation id="6177390657002841081">データセーバーをオンにする</translation> +<translation id="617991007797131187">中国のユーザーは、Chrome での検索に Sogou を使用できます。この設定は [<ph name="BEGIN_LINK" />設定<ph name="END_LINK" />] で変更できます。</translation> <translation id="6181444274883918285">サイトの例外を追加</translation> <translation id="6192792657125177640">例外</translation> <translation id="6232535412751077445">「トラッキング拒否」を有効にすると、リクエストが閲覧トラフィックに含まれるようになります。ウェブサイトがリクエストに応答するかどうか、またリクエストがどのように解釈されるかによって、この影響は異なります。 @@ -472,6 +476,7 @@ <translation id="654446541061731451">ビームするにはタブを選択してください</translation> <translation id="6545017243486555795">すべてのデータを消去</translation> <translation id="6550675742724504774">オプション</translation> +<translation id="6560414384669816528">Sogou で検索します</translation> <translation id="656628257199996201"><ph name="SOURCE_LANGUAGE" />を常に翻訳</translation> <translation id="6571070086367343653">クレジットカードの編集</translation> <translation id="6573431926118603307">他の端末の Chrome で開いているタブがここに表示されます。</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 7ef4dcfb..88b28b2 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_ko.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_ko.xtb
@@ -197,7 +197,7 @@ <translation id="3232754137068452469">웹 앱</translation> <translation id="3236059992281584593">1분 남음</translation> <translation id="3244271242291266297">MM</translation> -<translation id="3254409185687681395">페이지 북마크</translation> +<translation id="3254409185687681395">현재 페이지를 북마크에 추가</translation> <translation id="3269093882174072735">이미지 로드</translation> <translation id="3269956123044984603">다른 기기에서 탭을 가져오려면 Android 계정 설정에서 '데이터 자동 동기화'를 사용 설정하세요.</translation> <translation id="3278850099957560514">Google을 사용하여 방문한 페이지를 최적화함으로써 데이터 사용량을 줄일 수 있습니다. 비공개 연결(HTTPS)이나 시크릿 탭을 통해 액세스한 페이지는 Google에서 최적화하거나 볼 수 없습니다.</translation> @@ -286,6 +286,7 @@ <translation id="4351244548802238354">대화상자 닫기</translation> <translation id="4376501731284077108">제어되지 않음</translation> <translation id="4378154925671717803">휴대전화</translation> +<translation id="4384468725000734951">검색할 때 Sogou 사용</translation> <translation id="4412992751769744546">타사 쿠키 허용</translation> <translation id="4440256989292146959">더 많은 항목을 간편하게 탐색</translation> <translation id="4452548195519783679">북마크를 <ph name="FOLDER_NAME" />에 추가함</translation> @@ -424,6 +425,8 @@ <translation id="5916664084637901428">사용</translation> <translation id="5919204609460789179"><ph name="PRODUCT_NAME" />을(를) 업데이트하여 동기화를 시작합니다.</translation> <translation id="5939518447894949180">초기화</translation> +<translation id="5942872142862698679">검색할 때 Google 사용</translation> +<translation id="6000066717592683814">계속 Google 사용</translation> <translation id="6010869025736512584">비디오 입력 장치에 액세스 중</translation> <translation id="6012342843556706400">이 사이트에 공유하려면 Chrome에 위치 정보 액세스 권한이 있어야 합니다.</translation> <translation id="6031101910111098835">접힘 - 펼치려면 클릭</translation> @@ -441,6 +444,7 @@ <translation id="6159335304067198720"><ph name="PERCENT" /> 데이터 절약</translation> <translation id="6165508094623778733">자세히 알아보기</translation> <translation id="6177390657002841081">데이터 세이버 사용 설정</translation> +<translation id="617991007797131187">중국에서 검색할 때 Chrome에서 Sogou를 사용할 수 있습니다. <ph name="BEGIN_LINK" />설정<ph name="END_LINK" />에서 변경할 수 있습니다.</translation> <translation id="6181444274883918285">사이트 예외 추가</translation> <translation id="6192792657125177640">예외</translation> <translation id="6232535412751077445">‘추적 안함’을 사용하도록 설정하면 요청이 사용자의 인터넷 사용 트래픽에 포함됩니다. 웹사이트가 요청에 응답하는지 여부와 요청이 해석되는 방법에 따라 결과가 결정됩니다. @@ -472,6 +476,7 @@ <translation id="654446541061731451">공유할 탭을 선택하세요.</translation> <translation id="6545017243486555795">모든 데이터 삭제</translation> <translation id="6550675742724504774">옵션</translation> +<translation id="6560414384669816528">Sogou로 검색</translation> <translation id="656628257199996201"><ph name="SOURCE_LANGUAGE" /> 항상 번역</translation> <translation id="6571070086367343653">신용카드 수정</translation> <translation id="6573431926118603307">다른 기기의 Chrome에서 연 탭이 여기에 표시됩니다.</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 ebbb7372..9bb3f38 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_lt.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_lt.xtb
@@ -286,6 +286,7 @@ <translation id="4351244548802238354">Uždaryti dialogo langą</translation> <translation id="4376501731284077108">Nevaldoma</translation> <translation id="4378154925671717803">Telefonas</translation> +<translation id="4384468725000734951">Atliekant paiešką naudojama „Sogou“</translation> <translation id="4412992751769744546">Leisti trečiųjų šalių slapukus</translation> <translation id="4440256989292146959">Naršykite daugiau ir mokėkite mažiau</translation> <translation id="4452548195519783679">Sukurta „<ph name="FOLDER_NAME" />“ žymė</translation> @@ -424,6 +425,8 @@ <translation id="5916664084637901428">Įjungta</translation> <translation id="5919204609460789179">Atnaujinkite „<ph name="PRODUCT_NAME" />“, kad galėtumėte pradėti sinchronizuoti</translation> <translation id="5939518447894949180">Nustatyti iš naujo</translation> +<translation id="5942872142862698679">Atliekant paiešką naudojama „Google“</translation> +<translation id="6000066717592683814">Palikti „Google“</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> <translation id="6031101910111098835">Sutraukta – spustelėkite, kad išskleistumėte</translation> @@ -441,6 +444,7 @@ <translation id="6159335304067198720">Sutaupyta duomenų: <ph name="PERCENT" /></translation> <translation id="6165508094623778733">Sužinokite daugiau</translation> <translation id="6177390657002841081">Duomenų taupymo priemonės įjungimas</translation> +<translation id="617991007797131187">Atlikdama paiešką „Chrome“ Kinijoje gali naudoti „Sogou“. Tai galite pakeisti apsilankę <ph name="BEGIN_LINK" />Nustatymuose<ph name="END_LINK" />.</translation> <translation id="6181444274883918285">Pridėti svetainės išimtį</translation> <translation id="6192792657125177640">Išimtys</translation> <translation id="6232535412751077445">Įgalinus funkciją „Nestebėti“, užklausa bus įtraukta į naršymo srautą. Poveikis priklauso nuo to, ar svetainė atsako į užklausą ir kaip užklausa interpretuojama. @@ -472,6 +476,7 @@ <translation id="654446541061731451">Kad perduotumėte, pasirinkite skirtuką</translation> <translation id="6545017243486555795">Išvalyti visus duomenis</translation> <translation id="6550675742724504774">Parinktys</translation> +<translation id="6560414384669816528">Atlikti paiešką naudojant „Sogou“</translation> <translation id="656628257199996201">Visada versti iš <ph name="SOURCE_LANGUAGE" /> k.</translation> <translation id="6571070086367343653">Kredito kortelės redagavimas</translation> <translation id="6573431926118603307">Čia bus rodomi kituose įrenginiuose atidaryti „Chrome“ skirtukai.</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 0130ddb..0e0d250 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_lv.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_lv.xtb
@@ -286,6 +286,7 @@ <translation id="4351244548802238354">Aizvērt dialoglodziņu</translation> <translation id="4376501731284077108">Netiek kontrolēts</translation> <translation id="4378154925671717803">Tālrunis</translation> +<translation id="4384468725000734951">Tiek izmantota meklētājprogramma Sogou</translation> <translation id="4412992751769744546">Atļaut trešo pušu sīkfailus</translation> <translation id="4440256989292146959">Pārlūkojiet vairāk, tērējot mazāk datu!</translation> <translation id="4452548195519783679">Grāmatzīme saglabāta mapē <ph name="FOLDER_NAME" /></translation> @@ -424,6 +425,8 @@ <translation id="5916664084637901428">Iesl.</translation> <translation id="5919204609460789179">Lai sāktu sinhronizēšanu, atjauniniet <ph name="PRODUCT_NAME" /></translation> <translation id="5939518447894949180">Atiestatīt</translation> +<translation id="5942872142862698679">Tiek izmantota meklētājprogramma Google</translation> +<translation id="6000066717592683814">Arī turpmāk izmantot Google</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> <translation id="6031101910111098835">Sakļauts — noklikšķiniet, lai izvērstu</translation> @@ -441,6 +444,7 @@ <translation id="6159335304067198720">Datu lietojuma samazinājums: <ph name="PERCENT" /></translation> <translation id="6165508094623778733">Uzziniet vairāk</translation> <translation id="6177390657002841081">Ieslēgt Datu lietojuma samazinātāju</translation> +<translation id="617991007797131187">Ķīnā varat pārlūkā Chrome izmantot meklētājprogrammu Sogou. Šo iestatījumu varat mainīt sadaļā <ph name="BEGIN_LINK" />Iestatījumi<ph name="END_LINK" />.</translation> <translation id="6181444274883918285">Pievienot vietnes izņēmumu</translation> <translation id="6192792657125177640">Izņēmumi</translation> <translation id="6232535412751077445">Iespējojot funkciju “Nesekot”, jūsu pārlūkošanas datplūsmā tiks iekļauts pieprasījums. Rezultāts būs atkarīgs no tā, vai vietne nodrošinās atbildi uz pieprasījumu un kā pieprasījums tiks interpretēts. @@ -472,6 +476,7 @@ <translation id="654446541061731451">Atlasiet cilni, ko kopīgot.</translation> <translation id="6545017243486555795">Notīrīt visus datus</translation> <translation id="6550675742724504774">Opcijas</translation> +<translation id="6560414384669816528">Meklēšana, izmantojot Sogou</translation> <translation id="656628257199996201">Vienmēr tulkot no šādas valodas: <ph name="SOURCE_LANGUAGE" /></translation> <translation id="6571070086367343653">Rediģēt kredītkarti</translation> <translation id="6573431926118603307">Šeit būs redzamas cilnes, kuras esat atvēris pārlūkā Chrome citās ierīcēs.</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 321a5b6..8675d98 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_nl.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_nl.xtb
@@ -286,6 +286,7 @@ <translation id="4351244548802238354">Dialoogvenster sluiten</translation> <translation id="4376501731284077108">Niet-beheerd</translation> <translation id="4378154925671717803">Telefoon</translation> +<translation id="4384468725000734951">Sogou wordt gebruikt om te zoeken</translation> <translation id="4412992751769744546">Cookies van derden toestaan</translation> <translation id="4440256989292146959">Meer internet voor minder</translation> <translation id="4452548195519783679">Bladwijzer gemaakt in <ph name="FOLDER_NAME" /></translation> @@ -424,6 +425,8 @@ <translation id="5916664084637901428">Aan</translation> <translation id="5919204609460789179">Update <ph name="PRODUCT_NAME" /> om de synchronisatie te starten</translation> <translation id="5939518447894949180">Resetten</translation> +<translation id="5942872142862698679">Google wordt gebruikt om te zoeken</translation> +<translation id="6000066717592683814">Google blijven gebruiken</translation> <translation id="6010869025736512584">Video-invoer openen</translation> <translation id="6012342843556706400">Chrome heeft locatietoegang nodig om het item te delen met deze site.</translation> <translation id="6031101910111098835">Samengevouwen; klik om uit te vouwen</translation> @@ -441,6 +444,7 @@ <translation id="6159335304067198720"><ph name="PERCENT" /> besparing van data</translation> <translation id="6165508094623778733">Meer informatie</translation> <translation id="6177390657002841081">Databesparing inschakelen</translation> +<translation id="617991007797131187">Chrome kan Sogou gebruiken om te zoeken in China. Je kunt dit wijzigen via <ph name="BEGIN_LINK" />Instellingen<ph name="END_LINK" />.</translation> <translation id="6181444274883918285">Site-uitzondering toevoegen</translation> <translation id="6192792657125177640">Uitzonderingen</translation> <translation id="6232535412751077445">Als je 'Niet bijhouden' inschakelt, wordt hiervoor een verzoek opgenomen in je browseverkeer. Het resultaat daarvan hangt af van of een website reageert op het verzoek en hoe het verzoek wordt geïnterpreteerd. @@ -472,6 +476,7 @@ <translation id="654446541061731451">Selecteer een tabblad om te beamen</translation> <translation id="6545017243486555795">Alle gegevens wissen</translation> <translation id="6550675742724504774">Opties</translation> +<translation id="6560414384669816528">Zoeken met Sogou</translation> <translation id="656628257199996201">Altijd <ph name="SOURCE_LANGUAGE" /> vertalen</translation> <translation id="6571070086367343653">Creditcard bewerken</translation> <translation id="6573431926118603307">Tabbladen die je op andere apparaten in Chrome hebt geopend, worden hier weergegeven.</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 6a26610..a6ffa74d 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_no.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_no.xtb
@@ -286,6 +286,7 @@ <translation id="4351244548802238354">Lukk dialogboks</translation> <translation id="4376501731284077108">Ukontrollert</translation> <translation id="4378154925671717803">Telefon</translation> +<translation id="4384468725000734951">Bruker Sogou til å søke</translation> <translation id="4412992751769744546">Tillat informasjonskapsler fra tredjeparter</translation> <translation id="4440256989292146959">Mer surfing for mindre penger</translation> <translation id="4452548195519783679">Satt som bokmerke i <ph name="FOLDER_NAME" /></translation> @@ -424,6 +425,8 @@ <translation id="5916664084637901428">På</translation> <translation id="5919204609460789179">Oppdater <ph name="PRODUCT_NAME" /> for å starte synkroniseringen</translation> <translation id="5939518447894949180">Tilbakestill</translation> +<translation id="5942872142862698679">Bruker Google til å søke</translation> +<translation id="6000066717592683814">Behold Google</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> <translation id="6031101910111098835">Skjult – klikk for å vise</translation> @@ -441,6 +444,7 @@ <translation id="6159335304067198720"><ph name="PERCENT" /> datasparing</translation> <translation id="6165508094623778733">Les mer</translation> <translation id="6177390657002841081">Slå på Datasparing</translation> +<translation id="617991007797131187">Chrome kan bruke Sogou for søk i Kina. Du kan endre dette i <ph name="BEGIN_LINK" />innstillingene<ph name="END_LINK" />.</translation> <translation id="6181444274883918285">Legg til et nettsted som unntak</translation> <translation id="6192792657125177640">Unntak</translation> <translation id="6232535412751077445">Hvis du slår på «Deaktivering av sporing», blir det sendt en forespørsel sammen med nettrafikken din. Hvilke virkninger dette eventuelt får, avhenger av om det aktuelle nettstedet svarer på forespørselen eller ikke, samt hvordan forespørselen tolkes. @@ -472,6 +476,7 @@ <translation id="654446541061731451">Velg en fane for beaming</translation> <translation id="6545017243486555795">Slett alle data</translation> <translation id="6550675742724504774">Alternativer</translation> +<translation id="6560414384669816528">Søk med Sogou</translation> <translation id="656628257199996201">Oversett alltid <ph name="SOURCE_LANGUAGE" /></translation> <translation id="6571070086367343653">Rediger kredittkort</translation> <translation id="6573431926118603307">Faner du har åpnet i Chrome på de andre enhetene dine, vises her.</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 2c27115..72c2e50 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_pl.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_pl.xtb
@@ -286,6 +286,7 @@ <translation id="4351244548802238354">Zamknij okno</translation> <translation id="4376501731284077108">Brak kontroli</translation> <translation id="4378154925671717803">Telefon</translation> +<translation id="4384468725000734951">Korzystam z wyszukiwarki Sogou</translation> <translation id="4412992751769744546">Zezwalaj na pliki cookie innych firm</translation> <translation id="4440256989292146959">Przeglądaj więcej za mniej</translation> <translation id="4452548195519783679">Utworzono zakładkę w folderze <ph name="FOLDER_NAME" /></translation> @@ -424,6 +425,8 @@ <translation id="5916664084637901428">Włączone</translation> <translation id="5919204609460789179">Zaktualizuj przeglądarkę <ph name="PRODUCT_NAME" />, by rozpocząć synchronizację</translation> <translation id="5939518447894949180">Resetuj</translation> +<translation id="5942872142862698679">Korzystam z wyszukiwarki Google</translation> +<translation id="6000066717592683814">Zachowaj Google</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> <translation id="6031101910111098835">Zwinięty – kliknij, by rozwinąć</translation> @@ -441,6 +444,7 @@ <translation id="6159335304067198720">Oszczędność danych: <ph name="PERCENT" /></translation> <translation id="6165508094623778733">Więcej informacji</translation> <translation id="6177390657002841081">Włącz Oszczędzanie danych</translation> +<translation id="617991007797131187">Do wyszukiwania w Chinach Chrome może używać Sogou. Tę opcje możesz zmienić w <ph name="BEGIN_LINK" />Ustawieniach<ph name="END_LINK" />.</translation> <translation id="6181444274883918285">Dodaj witrynę do wyjątków</translation> <translation id="6192792657125177640">Wyjątki</translation> <translation id="6232535412751077445">Włączenie opcji „Bez śledzenia” oznacza, że podczas przeglądania będzie wysyłane żądanie. Jego wynik zależy od tego, czy strona na nie odpowie oraz jak zostanie ono zinterpretowane. @@ -472,6 +476,7 @@ <translation id="654446541061731451">Wybierz kartę do przesłania</translation> <translation id="6545017243486555795">Wyczyść wszystkie dane</translation> <translation id="6550675742724504774">Opcje</translation> +<translation id="6560414384669816528">Szukaj w Sogou</translation> <translation id="656628257199996201">Zawsze tłumacz z języka: <ph name="SOURCE_LANGUAGE" /></translation> <translation id="6571070086367343653">Edytuj kartę kredytową</translation> <translation id="6573431926118603307">Tutaj wyświetlą się karty otwarte w Chrome na innych urządzeniach.</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 9dc1ba7..1e78973 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
@@ -285,6 +285,7 @@ <translation id="4351244548802238354">Fechar caixa de diálogo</translation> <translation id="4376501731284077108">Sem controle</translation> <translation id="4378154925671717803">Telefone</translation> +<translation id="4384468725000734951">Usando o Sogou para pesquisar</translation> <translation id="4412992751769744546">Permitir cookies de terceiros</translation> <translation id="4440256989292146959">Navegue mais por menos</translation> <translation id="4452548195519783679">Adicionado como favorito em <ph name="FOLDER_NAME" /></translation> @@ -422,6 +423,8 @@ <translation id="5916664084637901428">Ativado</translation> <translation id="5919204609460789179">Atualize <ph name="PRODUCT_NAME" /> para iniciar a sincronização</translation> <translation id="5939518447894949180">Redefinir</translation> +<translation id="5942872142862698679">Usando o Google para pesquisar</translation> +<translation id="6000066717592683814">Continuar usando o Google</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> <translation id="6031101910111098835">Visualização recolhida: clique para expandir</translation> @@ -439,6 +442,7 @@ <translation id="6159335304067198720">Economia de dados de <ph name="PERCENT" /></translation> <translation id="6165508094623778733">Saiba mais</translation> <translation id="6177390657002841081">Ativar a Economia de dados</translation> +<translation id="617991007797131187">O Chrome pode usar o Sogou para fazer pesquisas na China. É possível alterar isso em <ph name="BEGIN_LINK" />Configurações<ph name="END_LINK" />.</translation> <translation id="6181444274883918285">Adicionar site às exceções</translation> <translation id="6192792657125177640">Exceções</translation> <translation id="6232535412751077445">A ativação de "Não rastrear" significa que uma solicitação será incluída no tráfego de navegação. Todo efeito depende de um website responder à solicitação e de como a solicitação é interpretada. @@ -470,6 +474,7 @@ <translation id="654446541061731451">Selecione uma guia para transferir</translation> <translation id="6545017243486555795">Limpar todos os dados</translation> <translation id="6550675742724504774">Opções</translation> +<translation id="6560414384669816528">Pesquisar usando o Sogou</translation> <translation id="656628257199996201">Sempre traduzir <ph name="SOURCE_LANGUAGE" /></translation> <translation id="6571070086367343653">Editar cartão de crédito</translation> <translation id="6573431926118603307">As guias que você abriu no Chrome nos seus outros dispositivos serão exibidas aqui.</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 c6ff91a2..7b8fc6b 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
@@ -286,6 +286,7 @@ <translation id="4351244548802238354">Fechar caixa de diálogo</translation> <translation id="4376501731284077108">Não controlado</translation> <translation id="4378154925671717803">Telefone</translation> +<translation id="4384468725000734951">A utilizar o Sogou para pesquisa</translation> <translation id="4412992751769744546">Permitir cookies de terceiros</translation> <translation id="4440256989292146959">Navegar mais por menos</translation> <translation id="4452548195519783679">Adicionado aos marcadores em <ph name="FOLDER_NAME" /></translation> @@ -424,6 +425,8 @@ <translation id="5916664084637901428">Ativado</translation> <translation id="5919204609460789179">Atualizar <ph name="PRODUCT_NAME" /> para iniciar a sincronização</translation> <translation id="5939518447894949180">Repor</translation> +<translation id="5942872142862698679">A utilizar o Google para pesquisa</translation> +<translation id="6000066717592683814">Manter o Google</translation> <translation id="6010869025736512584">A aceder à entrada de vídeo</translation> <translation id="6012342843556706400">O Chrome necessita de acesso à localização para a partilhar com este site.</translation> <translation id="6031101910111098835">Reduzida – clicar para expandir</translation> @@ -441,6 +444,7 @@ <translation id="6159335304067198720"><ph name="PERCENT" /> de poupança de dados</translation> <translation id="6165508094623778733">Saiba mais</translation> <translation id="6177390657002841081">Ativar a Poupança de dados</translation> +<translation id="617991007797131187">O Chrome pode utilizar o Sogou para efetuar pesquisas na China. Pode alterar esta opção em <ph name="BEGIN_LINK" />Definições<ph name="END_LINK" />.</translation> <translation id="6181444274883918285">Adicionar exceção de site</translation> <translation id="6192792657125177640">Excepções</translation> <translation id="6232535412751077445">A ativação da funcionalidade "Não Monitorizar" significa que é incluído um pedido no seu tráfego de navegação. Qualquer efeito depende de um Website responder ou não ao pedido e do modo como o pedido é interpretado. @@ -472,6 +476,7 @@ <translation id="654446541061731451">Selecione um separador a transmitir</translation> <translation id="6545017243486555795">Limpar todos os dados</translation> <translation id="6550675742724504774">Opções</translation> +<translation id="6560414384669816528">Pesquisar com o Sogou</translation> <translation id="656628257199996201">Traduzir sempre <ph name="SOURCE_LANGUAGE" /></translation> <translation id="6571070086367343653">Editar cartão de crédito</translation> <translation id="6573431926118603307">Os separadores que abriu no Chrome nos seus outros dispositivos são apresentados aqui.</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 9a31cac..917993a0 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_ro.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_ro.xtb
@@ -286,6 +286,7 @@ <translation id="4351244548802238354">Închide caseta de dialog</translation> <translation id="4376501731284077108">Necontrolat</translation> <translation id="4378154925671717803">Telefon</translation> +<translation id="4384468725000734951">Pentru căutare se folosește Sogou</translation> <translation id="4412992751769744546">Permite cookie-urile terță parte</translation> <translation id="4440256989292146959">Navighează mai mult plătind mai puțin</translation> <translation id="4452548195519783679">Marcaj adăugat în <ph name="FOLDER_NAME" /></translation> @@ -424,6 +425,8 @@ <translation id="5916664084637901428">Activat</translation> <translation id="5919204609460789179">Actualizează <ph name="PRODUCT_NAME" /> pentru a începe sincronizarea</translation> <translation id="5939518447894949180">Resetează</translation> +<translation id="5942872142862698679">Pentru căutare se folosește Google</translation> +<translation id="6000066717592683814">Păstrează Google</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> <translation id="6031101910111098835">Afișare restrânsă – dă clic pentru a extinde</translation> @@ -441,6 +444,7 @@ <translation id="6159335304067198720">Economie de date de <ph name="PERCENT" /></translation> <translation id="6165508094623778733">Află mai multe</translation> <translation id="6177390657002841081">Activează Economizorul de date</translation> +<translation id="617991007797131187">Chrome poate folosi Sogou pentru căutare în China. Poți modifica această opțiune din <ph name="BEGIN_LINK" />Setări<ph name="END_LINK" />.</translation> <translation id="6181444274883918285">Adaugă o excepție privind site-urile</translation> <translation id="6192792657125177640">Excepții</translation> <translation id="6232535412751077445">Dacă activezi opțiunea „Nu urmări”, o solicitare va fi inclusă împreună cu traficul de navigare. Efectul variază în funcție de răspunsul site-ului la solicitare și în funcție de modul în care este interpretată solicitarea. @@ -472,6 +476,7 @@ <translation id="654446541061731451">Selectează o filă pentru transmitere</translation> <translation id="6545017243486555795">Șterge toate datele</translation> <translation id="6550675742724504774">Opțiuni</translation> +<translation id="6560414384669816528">Caută cu Sogou</translation> <translation id="656628257199996201">Tradu întotdeauna din <ph name="SOURCE_LANGUAGE" /></translation> <translation id="6571070086367343653">Editează cardul de credit</translation> <translation id="6573431926118603307">Filele deschise în Chrome pe alte dispozitive vor apărea aici.</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 cb79994..5207c55 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_ru.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_ru.xtb
@@ -286,6 +286,7 @@ <translation id="4351244548802238354">Закрыть</translation> <translation id="4376501731284077108">Не контролируется</translation> <translation id="4378154925671717803">Телефон</translation> +<translation id="4384468725000734951">Sogou используется как поисковая система по умолчанию</translation> <translation id="4412992751769744546">Разрешить сторонним сайтам сохранять файлы cookie</translation> <translation id="4440256989292146959">Разумная экономия</translation> <translation id="4452548195519783679">Закладка добавлена в папку "<ph name="FOLDER_NAME" />"</translation> @@ -424,6 +425,8 @@ <translation id="5916664084637901428">ВКЛ</translation> <translation id="5919204609460789179">Обновите <ph name="PRODUCT_NAME" />, чтобы начать синхронизацию</translation> <translation id="5939518447894949180">Сбросить</translation> +<translation id="5942872142862698679">Google используется как поисковая система по умолчанию</translation> +<translation id="6000066717592683814">Использовать Google</translation> <translation id="6010869025736512584">Доступ к видеовходу</translation> <translation id="6012342843556706400">Предоставьте браузеру Chrome доступ к геоданным, чтобы продолжить работу на этом сайте.</translation> <translation id="6031101910111098835">Свернуто. Нажмите, чтобы развернуть.</translation> @@ -441,6 +444,7 @@ <translation id="6159335304067198720">Сжатие данных: <ph name="PERCENT" /></translation> <translation id="6165508094623778733">Подробнее...</translation> <translation id="6177390657002841081">Включить режим экономии трафика</translation> +<translation id="617991007797131187">В Китае Chrome может использовать поисковую систему Sogou. Включить или отключить ее можно в <ph name="BEGIN_LINK" />настройках<ph name="END_LINK" />.</translation> <translation id="6181444274883918285">Добавить исключение</translation> <translation id="6192792657125177640">Исключения</translation> <translation id="6232535412751077445">Если вы запретите отслеживание, в запросы браузера будет включена специальная команда. Сайты могут интерпретировать ее и отвечать на нее по-разному. @@ -472,6 +476,7 @@ <translation id="654446541061731451">Выберите вкладку для передачи</translation> <translation id="6545017243486555795">Удалить все данные</translation> <translation id="6550675742724504774">Параметры</translation> +<translation id="6560414384669816528">Поиск в Sogou</translation> <translation id="656628257199996201">Всегда переводить <ph name="SOURCE_LANGUAGE" /></translation> <translation id="6571070086367343653">Изменить данные карты</translation> <translation id="6573431926118603307">Здесь появятся вкладки, открытые в Chrome на других устройствах.</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 450d7f7..f77d385 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_sk.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_sk.xtb
@@ -286,6 +286,7 @@ <translation id="4351244548802238354">Zavrieť dialógové okno</translation> <translation id="4376501731284077108">Nespravované</translation> <translation id="4378154925671717803">Telefón</translation> +<translation id="4384468725000734951">Na vyhľadávanie sa používa Sogou</translation> <translation id="4412992751769744546">Povoliť súbory cookie tretích strán</translation> <translation id="4440256989292146959">Prehliadajte viac a za menej peňazí</translation> <translation id="4452548195519783679">Uložené ako záložka v priečinku <ph name="FOLDER_NAME" /></translation> @@ -424,6 +425,8 @@ <translation id="5916664084637901428">Zapnúť</translation> <translation id="5919204609460789179">Ak chcete spustiť synchronizáciu, aktualizujte aplikáciu <ph name="PRODUCT_NAME" /></translation> <translation id="5939518447894949180">Obnoviť</translation> +<translation id="5942872142862698679">Na vyhľadávanie sa používa Google</translation> +<translation id="6000066717592683814">Ponechať Google</translation> <translation id="6010869025736512584">Pristupovanie k vstupu videa</translation> <translation id="6012342843556706400">Na to, aby Chrome mohol s týmito webovými stránkami zdieľať polohu, musí mať k nej prístup.</translation> <translation id="6031101910111098835">Zbalené – kliknutím rozbaliť</translation> @@ -441,6 +444,7 @@ <translation id="6159335304067198720">Úspora dát: <ph name="PERCENT" /></translation> <translation id="6165508094623778733">Viac informácií</translation> <translation id="6177390657002841081">Zapnúť Šetrič dát</translation> +<translation id="617991007797131187">Chrome môže v Číne použiť na vyhľadávanie službu Sogou. Túto voľbu môžete zmeniť v <ph name="BEGIN_LINK" />Nastaveniach<ph name="END_LINK" />.</translation> <translation id="6181444274883918285">Pridať výnimku pre web</translation> <translation id="6192792657125177640">Výnimky</translation> <translation id="6232535412751077445">Ak povolíte možnosť Nesledovať, k odosielaným dátam prehliadania sa pridá žiadosť. Akýkoľvek účinok závisí od toho, či bude web na žiadosť reagovať, a tiež od interpretácie žiadosti. @@ -472,6 +476,7 @@ <translation id="654446541061731451">Vyberte kartu, ktorú chcete preniesť</translation> <translation id="6545017243486555795">Vymazať všetky dáta</translation> <translation id="6550675742724504774">Možnosti</translation> +<translation id="6560414384669816528">Vyhľadávať pomocou Sogou</translation> <translation id="656628257199996201">Vždy prekladať jazyk <ph name="SOURCE_LANGUAGE" /></translation> <translation id="6571070086367343653">Upraviť kreditnú kartu</translation> <translation id="6573431926118603307">Tu sa zobrazia karty, ktoré ste otvorili v Chrome na iných zariadeniach.</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 8116cf1..707f6fe 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_sl.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_sl.xtb
@@ -286,6 +286,7 @@ <translation id="4351244548802238354">Zapri pogovorno okno</translation> <translation id="4376501731284077108">Nenadzorovano</translation> <translation id="4378154925671717803">Telefon</translation> +<translation id="4384468725000734951">Uporaba iskalnika Sogou za iskanje</translation> <translation id="4412992751769744546">Omogočanje piškotkov drugih spletnih mest</translation> <translation id="4440256989292146959">Brskajte več za manj</translation> <translation id="4452548195519783679">Zaznamek ustvarjen v mapi <ph name="FOLDER_NAME" /></translation> @@ -424,6 +425,8 @@ <translation id="5916664084637901428">Vklopljeno</translation> <translation id="5919204609460789179">Posodobite izdelek <ph name="PRODUCT_NAME" />, če želite začeti sinhronizacijo</translation> <translation id="5939518447894949180">Ponastavi</translation> +<translation id="5942872142862698679">Uporaba iskalnika Google za iskanje</translation> +<translation id="6000066717592683814">Ohrani Google</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> <translation id="6031101910111098835">Strnjeno – kliknite, če želite razširiti</translation> @@ -441,6 +444,7 @@ <translation id="6159335304067198720">Prihranek pri prenosu podatkov: <ph name="PERCENT" /></translation> <translation id="6165508094623778733">Več o tem</translation> <translation id="6177390657002841081">Vklop varčevanja s podatki</translation> +<translation id="617991007797131187">Chrome lahko za iskanje na Kitajskem uporablja Sogou. To lahko spremenite v <ph name="BEGIN_LINK" />nastavitvah<ph name="END_LINK" />.</translation> <translation id="6181444274883918285">Dodaj izjemo za spletno mesto</translation> <translation id="6192792657125177640">Izjeme</translation> <translation id="6232535412751077445">Če omogočite možnost »Ne sledi«, bo zahteva vključena v vaš promet brskanja. Učinek je odvisen od odziva spletnega mesta na zahtevo in od tega, kako si zahtevo razlaga. @@ -472,6 +476,7 @@ <translation id="654446541061731451">Izberite zavihek za prenos</translation> <translation id="6545017243486555795">Izbris vseh podatkov</translation> <translation id="6550675742724504774">Možnosti</translation> +<translation id="6560414384669816528">Iskanje z iskalnikom Sogou</translation> <translation id="656628257199996201">Vedno prevedi ta jezik: <ph name="SOURCE_LANGUAGE" /></translation> <translation id="6571070086367343653">Urejanje kreditne kartice</translation> <translation id="6573431926118603307">Zavihki, ki ste jih odprli v Chromu v drugih napravah, bodo prikazani tukaj.</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 a866bc0..de2df9a9 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_sr.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_sr.xtb
@@ -267,7 +267,7 @@ <translation id="410351446219883937">Аутоплеј</translation> <translation id="4113030288477039509">Овим управља администратор</translation> <translation id="4165986682804962316">Подешавања сајта</translation> -<translation id="4170011742729630528">Услуга није доступна. Покушајте поново касније.</translation> +<translation id="4170011742729630528">Услуга није доступна. Пробајте поново касније.</translation> <translation id="4195643157523330669">Отвори у новој картици</translation> <translation id="4226663524361240545">Уређај ће вибрирати када примате обавештења</translation> <translation id="423410644998903704">Chrome-у је потребан приступ за дозволе да би их делио са овим сајтом.</translation> @@ -286,6 +286,7 @@ <translation id="4351244548802238354">Затвори дијалог</translation> <translation id="4376501731284077108">Без контроле</translation> <translation id="4378154925671717803">Телефон</translation> +<translation id="4384468725000734951">Користите Sogou за претрагу</translation> <translation id="4412992751769744546">Дозволи колачиће треће стране</translation> <translation id="4440256989292146959">Прегледајте више за мање</translation> <translation id="4452548195519783679">Обележивач је додат у <ph name="FOLDER_NAME" /></translation> @@ -424,6 +425,8 @@ <translation id="5916664084637901428">Укључи</translation> <translation id="5919204609460789179">Ажурирајте <ph name="PRODUCT_NAME" /> да бисте започели синхронизацију</translation> <translation id="5939518447894949180">Ресетуј</translation> +<translation id="5942872142862698679">Користите Google за претрагу</translation> +<translation id="6000066717592683814">Задржи Google</translation> <translation id="6010869025736512584">Приступа се видео улазу</translation> <translation id="6012342843556706400">Chrome-у је потребан приступ за локацију да би га делио са овим сајтом.</translation> <translation id="6031101910111098835">Скупљено је – Кликните да бисте проширили</translation> @@ -441,12 +444,13 @@ <translation id="6159335304067198720"><ph name="PERCENT" /> уштеде података</translation> <translation id="6165508094623778733">Сазнајте више</translation> <translation id="6177390657002841081">Укључи Уштеду података</translation> +<translation id="617991007797131187">Chrome може да користи Sogou за претрагу у Кини. Ово можете да промените у <ph name="BEGIN_LINK" />Подешавањима<ph name="END_LINK" />.</translation> <translation id="6181444274883918285">Додај изузетак за сајтове</translation> <translation id="6192792657125177640">Изузеци</translation> <translation id="6232535412751077445">Ако омогућите функцију „Не прати“, захтев ће бити обухваћен саобраћајем прегледања. Последица те радње зависи од тога да ли веб-сајт одговара на захтев и како се захтев тумачи. На пример, неки веб-сајтови могу да одговоре на овај захтев приказивањем огласа који нису засновани на другим веб-сајтовима које сте посетили. Многи веб-сајтови ће ипак прикупљати и користити податке прегледања, на пример, ради побољшања безбедности, пружања садржаја, огласа и препорука, као и ради генерисања статистике извештавања.</translation> -<translation id="6277522088822131679">Дошло је до проблема при штампању странице. Покушајте поново.</translation> +<translation id="6277522088822131679">Дошло је до проблема при штампању странице. Пробајте поново.</translation> <translation id="6295158916970320988">Сви сајтови</translation> <translation id="6320088164292336938">Вибрација</translation> <translation id="6324034347079777476">Синхронизација Android система је онемогућена</translation> @@ -472,6 +476,7 @@ <translation id="654446541061731451">Изаберите картицу за пребацивање</translation> <translation id="6545017243486555795">Обриши све податке</translation> <translation id="6550675742724504774">Опције</translation> +<translation id="6560414384669816528">Претрага помоћу Sogou-а</translation> <translation id="656628257199996201">Увек преводи <ph name="SOURCE_LANGUAGE" /></translation> <translation id="6571070086367343653">Измена кредитне картице</translation> <translation id="6573431926118603307">Овде ће се приказати картице које отворите у Chrome-у на другим уређајима.</translation> @@ -617,7 +622,7 @@ <translation id="8218934717680664417">Сада можете да претражујете једним додиром</translation> <translation id="8223946939421658889">Обриши податке за:</translation> <translation id="8250920743982581267">Документи</translation> -<translation id="8260126382462817229">Покушајте поново да се пријавите</translation> +<translation id="8260126382462817229">Пробајте поново да се пријавите</translation> <translation id="8261506727792406068">Избриши</translation> <translation id="8275818695183729150">Дозволите (за претраге у траци за адресу)</translation> <translation id="8283853025636624853">Синхронизује се са <ph name="SYNC_ACCOUNT_USER_NAME" /></translation> @@ -656,7 +661,7 @@ <translation id="869891660844655955">Датум истека</translation> <translation id="8699799819461268362">Филтрирање на основу Google листе безбедних сајтова</translation> <translation id="8719023831149562936">Није могуће пребацити актуелну картицу</translation> -<translation id="8725066075913043281">Покушајте поново</translation> +<translation id="8725066075913043281">Пробајте поново</translation> <translation id="8730621377337864115">Готово</translation> <translation id="8748850008226585750">Садржај је сакривен</translation> <translation id="8812942424849541387">Контролишите како ово функционише у <ph name="BEGIN_LINK1" />Подешавањима<ph name="END_LINK1" /></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 8ee58a6e..9ec91fe 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_sv.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_sv.xtb
@@ -286,6 +286,7 @@ <translation id="4351244548802238354">Stäng dialogrutan</translation> <translation id="4376501731284077108">Inte styrda</translation> <translation id="4378154925671717803">Telefon</translation> +<translation id="4384468725000734951">Du söker med Sogou</translation> <translation id="4412992751769744546">Tillåt cookies från tredje part</translation> <translation id="4440256989292146959">Surfa mer för mindre</translation> <translation id="4452548195519783679">Bokmärkt i <ph name="FOLDER_NAME" /></translation> @@ -424,6 +425,8 @@ <translation id="5916664084637901428">På</translation> <translation id="5919204609460789179">Uppdatera <ph name="PRODUCT_NAME" /> för att starta synkronisering</translation> <translation id="5939518447894949180">Återställ</translation> +<translation id="5942872142862698679">Du söker med Google</translation> +<translation id="6000066717592683814">Behåll Google</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> <translation id="6031101910111098835">Gruppvyn har komprimerats. Expandera vyn genom att klicka.</translation> @@ -441,6 +444,7 @@ <translation id="6159335304067198720">Sparat utrymme: <ph name="PERCENT" /></translation> <translation id="6165508094623778733">Läs mer</translation> <translation id="6177390657002841081">Aktivera Databesparing</translation> +<translation id="617991007797131187">I Kina kan du söka med Sogou i Chrome. Du kan ändra detta i <ph name="BEGIN_LINK" />inställningarna<ph name="END_LINK" />.</translation> <translation id="6181444274883918285">Lägg till en webbplats i undantagen</translation> <translation id="6192792657125177640">Undantag</translation> <translation id="6232535412751077445">Om du aktiverar Do Not Track inkluderas en begäran i din surftrafik. Eventuella effekter beror på om webbplatsen svarar på begäran och hur begäran tolkas. @@ -472,6 +476,7 @@ <translation id="654446541061731451">Välj en flik som du vill överföra</translation> <translation id="6545017243486555795">Rensa all data</translation> <translation id="6550675742724504774">Alternativ</translation> +<translation id="6560414384669816528">Sök med Sogou</translation> <translation id="656628257199996201">Översätt alltid <ph name="SOURCE_LANGUAGE" /></translation> <translation id="6571070086367343653">Redigera kreditkort</translation> <translation id="6573431926118603307">Här visas flikar som du har öppnat i Chrome på andra enheter.</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 69680328..adf4a0c 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_sw.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_sw.xtb
@@ -286,6 +286,7 @@ <translation id="4351244548802238354">Funga kidirisha</translation> <translation id="4376501731284077108">Hazidhibitiwi</translation> <translation id="4378154925671717803">Simu</translation> +<translation id="4384468725000734951">Unatumia Sogou kutafuta</translation> <translation id="4412992751769744546">Ruhusu vidakuzi vingine</translation> <translation id="4440256989292146959">Vinjari zaidi ukitumia kiasi kidogo cha data</translation> <translation id="4452548195519783679">Imetia alamishwa kwenye <ph name="FOLDER_NAME" /></translation> @@ -424,6 +425,8 @@ <translation id="5916664084637901428">Imewashwa</translation> <translation id="5919204609460789179">Sasisha <ph name="PRODUCT_NAME" /> ili uanze kusawazisha</translation> <translation id="5939518447894949180">Weka upya</translation> +<translation id="5942872142862698679">Unatumia Google kutafuta</translation> +<translation id="6000066717592683814">Endelea Kutumia Google</translation> <translation id="6010869025736512584">Inafikia vifaa vya kuingiza sauti ya video</translation> <translation id="6012342843556706400">Chrome inahitaji idhini ya kufikia mahali ili ipashiriki na tovuti hii.</translation> <translation id="6031101910111098835">Imekunjwa - Bofya ili upanue</translation> @@ -441,6 +444,7 @@ <translation id="6159335304067198720"><ph name="PERCENT" /> ya data imeokolewa</translation> <translation id="6165508094623778733">Pata maelezo zaidi</translation> <translation id="6177390657002841081">Washa Kiokoa Data</translation> +<translation id="617991007797131187">Chrome inaweza kutumia Sogou nchini Uchina. Unaweza kuibadilisha katika <ph name="BEGIN_LINK" />Mipangilio<ph name="END_LINK" />.</translation> <translation id="6181444274883918285">Ongeza tovuti mpya kwenye orodha ya vighairi</translation> <translation id="6192792657125177640">Vighairi</translation> <translation id="6232535412751077445">Kuwasha ‘Usifuatilie’ kunamaanisha kuwa ombi litajumuishwa pamoja na maelezo yako mengine ya kuvinjari. Athari yoyote itategemea ikiwa tovuti inajibu ombi, na namna ombi litakavyofasiriwa. @@ -472,6 +476,7 @@ <translation id="654446541061731451">Chagua kichupo cha kusambaza</translation> <translation id="6545017243486555795">Futa Data Yote</translation> <translation id="6550675742724504774">Chaguo</translation> +<translation id="6560414384669816528">Tafuta kwa kutumia Sogou</translation> <translation id="656628257199996201">Tafsiri <ph name="SOURCE_LANGUAGE" /> kila wakati</translation> <translation id="6571070086367343653">Hariri kadi ya mkopo</translation> <translation id="6573431926118603307">Vichupo ulivyofungua katika Chrome kwenye vifaa vyako vingine vitaonekana hapa.</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 e051daf..3bfd00ac 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_th.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_th.xtb
@@ -286,6 +286,7 @@ <translation id="4351244548802238354">ปิดหน้าต่างโต้ตอบ</translation> <translation id="4376501731284077108">ไม่มีการควบคุม</translation> <translation id="4378154925671717803">โทรศัพท์</translation> +<translation id="4384468725000734951">กำลังใช้ Sogou ในการค้นหา</translation> <translation id="4412992751769744546">อนุญาตคุกกี้ของบุคคลที่สาม</translation> <translation id="4440256989292146959">ท่องเว็บได้มากขึ้นแต่ใช้อินเทอร์เน็ตน้อยลง</translation> <translation id="4452548195519783679">เพิ่มบุ๊กมาร์กไปยัง <ph name="FOLDER_NAME" /> แล้ว</translation> @@ -424,6 +425,8 @@ <translation id="5916664084637901428">เปิด</translation> <translation id="5919204609460789179">อัปเดต <ph name="PRODUCT_NAME" /> เพื่อเริ่มซิงค์</translation> <translation id="5939518447894949180">รีเซ็ต</translation> +<translation id="5942872142862698679">กำลังใช้ Google ในการค้นหา</translation> +<translation id="6000066717592683814">ใช้ Google ต่อ</translation> <translation id="6010869025736512584">กำลังเข้าถึงอินพุตวิดีโอ</translation> <translation id="6012342843556706400">Chrome ต้องการเข้าถึงตำแหน่งเพื่อแชร์กับเว็บไซต์นี้</translation> <translation id="6031101910111098835">ยุบ - คลิกเพื่อขยาย</translation> @@ -441,6 +444,7 @@ <translation id="6159335304067198720">ประหยัดอินเทอร์เน็ต <ph name="PERCENT" /></translation> <translation id="6165508094623778733">เรียนรู้เพิ่มเติม</translation> <translation id="6177390657002841081">เปิดโปรแกรมประหยัดอินเทอร์เน็ต</translation> +<translation id="617991007797131187">Chrome สามารถใช้ Sogou สำหรับการค้นหาในประเทศจีน คุณสามารถเปลี่ยนการตั้งค่านี้ได้ใน<ph name="BEGIN_LINK" />การตั้งค่า<ph name="END_LINK" /></translation> <translation id="6181444274883918285">เพิ่มข้อยกเว้นของเว็บไซต์</translation> <translation id="6192792657125177640">ข้อยกเว้น</translation> <translation id="6232535412751077445">การเปิดใช้ "ไม่ติดตาม" หมายความว่าจะมีการรวมคำขอหนึ่งไว้กับการเข้าชมของคุณ ผลกระทบทั้งหมดขึ้นอยู่กับว่าเว็บไซต์ตอบสนองต่อคำขอนั้นไหม และวิธีตีความคำขอ @@ -472,6 +476,7 @@ <translation id="654446541061731451">เลือกแท็บที่จะบีม</translation> <translation id="6545017243486555795">ล้างข้อมูลทั้งหมด</translation> <translation id="6550675742724504774">ตัวเลือก</translation> +<translation id="6560414384669816528">ค้นหาด้วย Sogou</translation> <translation id="656628257199996201">แปลภาษา<ph name="SOURCE_LANGUAGE" />เสมอ</translation> <translation id="6571070086367343653">แก้ไขบัตรเครดิต</translation> <translation id="6573431926118603307">แท็บที่คุณเปิดไว้ใน Chrome ในอุปกรณ์เครื่องอื่นๆ จะปรากฏที่นี่</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 0fde982..57d2f8a 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_tr.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_tr.xtb
@@ -286,6 +286,7 @@ <translation id="4351244548802238354">İletişim kutusunu kapat</translation> <translation id="4376501731284077108">Denetimsiz</translation> <translation id="4378154925671717803">Telefon</translation> +<translation id="4384468725000734951">Arama için Sogou kullanılıyor</translation> <translation id="4412992751769744546">Üçüncü taraf çerezlere izin ver</translation> <translation id="4440256989292146959">Daha az bant genişliği harcayarak daha çok göz atın</translation> <translation id="4452548195519783679">Yer işareti <ph name="FOLDER_NAME" /> klasörüne eklendi</translation> @@ -424,6 +425,8 @@ <translation id="5916664084637901428">Açık</translation> <translation id="5919204609460789179">Senkronizasyonu başlatmak için <ph name="PRODUCT_NAME" /> adlı uygulamayı güncelleyin</translation> <translation id="5939518447894949180">Sıfırla</translation> +<translation id="5942872142862698679">Arama için Google kullanılıyor</translation> +<translation id="6000066717592683814">Google kalsın</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> <translation id="6031101910111098835">Daraltıldı - Genişletmek için tıklayın</translation> @@ -441,6 +444,7 @@ <translation id="6159335304067198720"><ph name="PERCENT" /> veri tasarrufu</translation> <translation id="6165508094623778733">Daha fazla bilgi edinin</translation> <translation id="6177390657002841081">Veri Tasarrufu'nu aç</translation> +<translation id="617991007797131187">Chrome, Çin'de arama yapmak için Sogou'yu kullanabilir. Bunu, <ph name="BEGIN_LINK" />Ayarlar<ph name="END_LINK" />'dan değiştirebilirsiniz.</translation> <translation id="6181444274883918285">Site istisnası ekle</translation> <translation id="6192792657125177640">İstisnalar</translation> <translation id="6232535412751077445">"Do Not Track" seçeneği etkinleştirildiğinde, göz atma trafiğinize bir istek eklenir. Her türlü etki, bir web sitesinin isteğe cevap verip vermemesine ve isteğin nasıl yorumlandığına bağlıdır. @@ -472,6 +476,7 @@ <translation id="654446541061731451">Işınlamak için bir sekme seçin</translation> <translation id="6545017243486555795">Tüm Verileri Temizle</translation> <translation id="6550675742724504774">Seçenekler</translation> +<translation id="6560414384669816528">Sogou ile arama</translation> <translation id="656628257199996201"><ph name="SOURCE_LANGUAGE" /> dilini her zaman çevir</translation> <translation id="6571070086367343653">Kredi kartını düzenle</translation> <translation id="6573431926118603307">Diğer cihazlarınızda Chrome ile açtığınız sekmeler burada görünür.</translation> @@ -638,14 +643,14 @@ <translation id="8518901949365209398">Bu site düşük bir güvenlik yapılandırması (SHA-1 imzaları) kullandığından bağlantınız gizli olmayabilir.</translation> <translation id="8523928698583292556">Kayıtlı şifreyi sil</translation> <translation id="8525306231823319788">Tam ekran</translation> -<translation id="85415543246899402"><ph name="MEGABYTES" /> MB kullanıldı</translation> +<translation id="85415543246899402"><ph name="MEGABYTES" /> MB kullanılıyor</translation> <translation id="854522910157234410">Şu sayfayı aç:</translation> <translation id="8562452229998620586">Kayıtlı şifreleriniz burada görünür.</translation> <translation id="856481929701340285">Masaüstü sitesi iste</translation> <translation id="857943718398505171">İzin verildi (önerilir)</translation> <translation id="8583805026567836021">Hesap verileri temizleniyor</translation> <translation id="8617240290563765734">İndirilen öğede belirtilen URL önerisi açılsın mı?</translation> -<translation id="8618653050765576793"><ph name="KILOBYTES" /> KB kullanıldı</translation> +<translation id="8618653050765576793"><ph name="KILOBYTES" /> KB kullanılıyor</translation> <translation id="862875433388403934">Diğer uygulamalarda indirilen içerikler (film, müzik vb.), ilgili uygulamalar cihazın yeni kimlik bilgilerine dayanarak yeniden lisans alana kadar oynatılmayabilir. Yeni lisansları edinmek için İnternet'e bağlanın ve indirdiğiniz içeriği oynatın.</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 eea4214c..22f2ffd57 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_uk.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_uk.xtb
@@ -105,7 +105,7 @@ <translation id="213279576345780926">Вкладку "<ph name="TAB_TITLE" />" закрито</translation> <translation id="2138201775715568214">Пошук веб-сторінок у сервісі "Інтернет навколо нас"</translation> <translation id="2139186145475833000">Додати на головний екран</translation> -<translation id="2146738493024040262">Відкрити миттєвий додаток</translation> +<translation id="2146738493024040262">Відкрити додаток із миттєвим запуском</translation> <translation id="2148716181193084225">Сьогодні</translation> <translation id="2154710561487035718">Копіювати URL-адресу</translation> <translation id="219985413780390209">Захистіть себе та свій пристрій від небезпечних сайтів</translation> @@ -286,6 +286,7 @@ <translation id="4351244548802238354">Закрити діалогове вікно</translation> <translation id="4376501731284077108">Без контролю</translation> <translation id="4378154925671717803">Телефон</translation> +<translation id="4384468725000734951">Пошук за допомогою Sogou</translation> <translation id="4412992751769744546">Дозволити сторонні файли cookie</translation> <translation id="4440256989292146959">Більше Інтернету – менше витрат</translation> <translation id="4452548195519783679">Закладку збережено в папці "<ph name="FOLDER_NAME" />"</translation> @@ -424,6 +425,8 @@ <translation id="5916664084637901428">Увімкнути</translation> <translation id="5919204609460789179">Оновіть <ph name="PRODUCT_NAME" />, щоб почати синхронізацію</translation> <translation id="5939518447894949180">Скинути</translation> +<translation id="5942872142862698679">Пошук за допомогою Google</translation> +<translation id="6000066717592683814">Залишити Google</translation> <translation id="6010869025736512584">Отримання доступу до відеовходу</translation> <translation id="6012342843556706400">Chrome потрібен доступ до геоданих, щоб дозволити цьому сайту використовувати їх.</translation> <translation id="6031101910111098835">Згорнуто – натисніть, щоб розгорнути</translation> @@ -441,6 +444,7 @@ <translation id="6159335304067198720">Заощадження даних: <ph name="PERCENT" /></translation> <translation id="6165508094623778733">Докладніше</translation> <translation id="6177390657002841081">Увімкнути Заощадження трафіку</translation> +<translation id="617991007797131187">Chrome може здійснювати пошук за допомогою Sogou в Китаї. Можна змінити цей параметр у <ph name="BEGIN_LINK" />налаштуваннях<ph name="END_LINK" />.</translation> <translation id="6181444274883918285">Додати сайт у список винятків</translation> <translation id="6192792657125177640">Винятки</translation> <translation id="6232535412751077445">Якщо ввімкнути параметр "Не відстежувати", запит додаватиметься в трафік веб-перегляду. Результат залежатиме від того, чи реагує веб-сайт на цей запит і як тлумачиться запит. @@ -472,6 +476,7 @@ <translation id="654446541061731451">Виберіть вкладку для передавання даних</translation> <translation id="6545017243486555795">Видалити всі дані</translation> <translation id="6550675742724504774">Параметри</translation> +<translation id="6560414384669816528">Шукати за допомогою Sogou</translation> <translation id="656628257199996201">Завжди перекладати з такої мови: <ph name="SOURCE_LANGUAGE" /></translation> <translation id="6571070086367343653">Редагувати дані кредитної картки</translation> <translation id="6573431926118603307">Тут відображатимуться вкладки, відкриті в Chrome на інших ваших пристроях.</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 ffcc82f..12b105c3 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_vi.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_vi.xtb
@@ -286,6 +286,7 @@ <translation id="4351244548802238354">Đóng hộp thoại</translation> <translation id="4376501731284077108">Không bị hạn chế</translation> <translation id="4378154925671717803">Điện thoại</translation> +<translation id="4384468725000734951">Sử dụng Sogou để tìm kiếm</translation> <translation id="4412992751769744546">Cho phép cookie của bên thứ ba</translation> <translation id="4440256989292146959">Duyệt nhiều hơn với ít chi phí hơn</translation> <translation id="4452548195519783679">Đã đánh dấu trang vào <ph name="FOLDER_NAME" /></translation> @@ -424,6 +425,8 @@ <translation id="5916664084637901428">Bật</translation> <translation id="5919204609460789179">Cập nhật <ph name="PRODUCT_NAME" /> để bắt đầu đồng bộ hóa</translation> <translation id="5939518447894949180">Đặt lại</translation> +<translation id="5942872142862698679">Sử dụng Google để tìm kiếm</translation> +<translation id="6000066717592683814">Giữ Google làm công cụ tìm kiếm mặc định</translation> <translation id="6010869025736512584">Đang truy cập thiết bị đầu vào video</translation> <translation id="6012342843556706400">Chrome cần quyền truy cập vị trí để chia sẻ vị trí với trang web này.</translation> <translation id="6031101910111098835">Đã thu gọn - Nhấp để mở rộng</translation> @@ -441,6 +444,7 @@ <translation id="6159335304067198720">Tiết kiệm <ph name="PERCENT" /> dữ liệu</translation> <translation id="6165508094623778733">Tìm hiểu thêm</translation> <translation id="6177390657002841081">Bật Trình tiết kiệm dữ liệu</translation> +<translation id="617991007797131187">Chrome có thể sử dụng Sogou để tìm kiếm ở Trung Quốc. Bạn có thể thay đổi tùy chọn này trong <ph name="BEGIN_LINK" />Cài đặt<ph name="END_LINK" />.</translation> <translation id="6181444274883918285">Thêm ngoại lệ cho trang web</translation> <translation id="6192792657125177640">Ngoại lệ</translation> <translation id="6232535412751077445">Bật tính năng “Không theo dõi” nghĩa là một yêu cầu sẽ được đi kèm với lưu lượng duyệt web của bạn. Mọi ảnh hưởng đều phụ thuộc vào việc trang web có phản hồi yêu cầu không và cách thức diễn giải yêu cầu. @@ -472,6 +476,7 @@ <translation id="654446541061731451">Chọn một tab để chiếu</translation> <translation id="6545017243486555795">Xóa tất cả dữ liệu</translation> <translation id="6550675742724504774">Tùy chọn</translation> +<translation id="6560414384669816528">Tìm kiếm với Sogou</translation> <translation id="656628257199996201">Luôn dịch <ph name="SOURCE_LANGUAGE" /></translation> <translation id="6571070086367343653">Chỉnh sửa thẻ tín dụng</translation> <translation id="6573431926118603307">Các tab bạn đã mở trong Chrome trên thiết bị khác sẽ xuất hiện tại đây.</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 29b7edb..a92acc3 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
@@ -286,6 +286,7 @@ <translation id="4351244548802238354">关闭对话框</translation> <translation id="4376501731284077108">不限</translation> <translation id="4378154925671717803">电话</translation> +<translation id="4384468725000734951">使用搜狗进行搜索</translation> <translation id="4412992751769744546">允许第三方 Cookie</translation> <translation id="4440256989292146959">加载更快,流量更省</translation> <translation id="4452548195519783679">已将书签添加到“<ph name="FOLDER_NAME" />”</translation> @@ -424,6 +425,8 @@ <translation id="5916664084637901428">启用</translation> <translation id="5919204609460789179">需更新 <ph name="PRODUCT_NAME" />,才能开始同步</translation> <translation id="5939518447894949180">重置</translation> +<translation id="5942872142862698679">使用 Google 进行搜索</translation> +<translation id="6000066717592683814">默认使用 Google</translation> <translation id="6010869025736512584">正在存取视频输入</translation> <translation id="6012342843556706400">Chrome 需要具有位置信息使用权,才能批准此网站的分享请求。</translation> <translation id="6031101910111098835">已折叠 - 点击即可展开</translation> @@ -441,6 +444,7 @@ <translation id="6159335304067198720">节省 <ph name="PERCENT" /> 的数据流量</translation> <translation id="6165508094623778733">了解详情</translation> <translation id="6177390657002841081">启用流量节省程序</translation> +<translation id="617991007797131187">Chrome 可以使用搜狗在中国境内进行搜索。您可以在<ph name="BEGIN_LINK" />设置<ph name="END_LINK" />中更改此设置。</translation> <translation id="6181444274883918285">添加例外网站</translation> <translation id="6192792657125177640">例外</translation> <translation id="6232535412751077445">如果您启用了“不跟踪”,您的浏览流量中将会包含一项请求。具体影响取决于网站是否会回应该请求以及如何解读该请求。 @@ -472,6 +476,7 @@ <translation id="654446541061731451">选择要传输的标签页</translation> <translation id="6545017243486555795">清除所有数据</translation> <translation id="6550675742724504774">选项</translation> +<translation id="6560414384669816528">使用搜狗进行搜索</translation> <translation id="656628257199996201">一律翻译<ph name="SOURCE_LANGUAGE" /></translation> <translation id="6571070086367343653">修改信用卡</translation> <translation id="6573431926118603307">您在其他设备上的 Chrome 中打开的标签页将列在此处。</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 84855cba..4412c8de 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
@@ -286,6 +286,7 @@ <translation id="4351244548802238354">關閉對話方塊</translation> <translation id="4376501731284077108">不受控制</translation> <translation id="4378154925671717803">電話</translation> +<translation id="4384468725000734951">現已使用 Sogou 搜尋</translation> <translation id="4412992751769744546">允許第三方 Cookie</translation> <translation id="4440256989292146959">在節省數據用量的情況下瀏覽更多網頁</translation> <translation id="4452548195519783679">已將書籤加入「<ph name="FOLDER_NAME" />」</translation> @@ -424,6 +425,8 @@ <translation id="5916664084637901428">開啟</translation> <translation id="5919204609460789179">更新 <ph name="PRODUCT_NAME" /> 即可開始同步處理</translation> <translation id="5939518447894949180">重設</translation> +<translation id="5942872142862698679">現已使用 Google 搜尋</translation> +<translation id="6000066717592683814">繼續使用 Google</translation> <translation id="6010869025736512584">正在存取視訊輸入</translation> <translation id="6012342843556706400">Chrome 需要存取位置資訊,才能與這個網站分享。</translation> <translation id="6031101910111098835">已收合 - 按一下即可展開</translation> @@ -441,6 +444,7 @@ <translation id="6159335304067198720">節省 <ph name="PERCENT" /> 的數據流量</translation> <translation id="6165508094623778733">瞭解詳情</translation> <translation id="6177390657002841081">開啟 Data Saver</translation> +<translation id="617991007797131187">Chrome 可以在中國使用 Sogou 搜尋。你可以在<ph name="BEGIN_LINK" />設定<ph name="END_LINK" />中變更這項設定。</translation> <translation id="6181444274883918285">新增例外網站</translation> <translation id="6192792657125177640">例外</translation> <translation id="6232535412751077445">啟用「不追蹤」選項後,您的瀏覽流量會置入一項特定的要求,其作用則視網站是否回應要求,以及網站解讀要求的方式而定。 @@ -472,6 +476,7 @@ <translation id="654446541061731451">選取要傳輸的分頁</translation> <translation id="6545017243486555795">清除所有資料</translation> <translation id="6550675742724504774">選項</translation> +<translation id="6560414384669816528">使用 Sogou 搜尋</translation> <translation id="656628257199996201">一律翻譯<ph name="SOURCE_LANGUAGE" /></translation> <translation id="6571070086367343653">編輯信用卡</translation> <translation id="6573431926118603307">您在其他裝置上透過 Chrome 開啟的分頁會顯示在這裡。</translation>
diff --git a/chrome/android/java_sources.gni b/chrome/android/java_sources.gni index c48adbda..53443458 100644 --- a/chrome/android/java_sources.gni +++ b/chrome/android/java_sources.gni
@@ -564,25 +564,28 @@ "java/src/org/chromium/chrome/browser/ntp/cards/AllDismissedItem.java", "java/src/org/chromium/chrome/browser/ntp/cards/CardViewHolder.java", "java/src/org/chromium/chrome/browser/ntp/cards/CardsVariationParameters.java", + "java/src/org/chromium/chrome/browser/ntp/cards/ChildNode.java", "java/src/org/chromium/chrome/browser/ntp/cards/DisplayStyleObserverAdapter.java", + "java/src/org/chromium/chrome/browser/ntp/cards/InnerNode.java", "java/src/org/chromium/chrome/browser/ntp/cards/ImpressionTracker.java", - "java/src/org/chromium/chrome/browser/ntp/cards/ItemGroup.java", + "java/src/org/chromium/chrome/browser/ntp/cards/ItemViewType.java", + "java/src/org/chromium/chrome/browser/ntp/cards/Leaf.java", "java/src/org/chromium/chrome/browser/ntp/cards/Footer.java", "java/src/org/chromium/chrome/browser/ntp/cards/MarginResizer.java", "java/src/org/chromium/chrome/browser/ntp/cards/NewTabPageAdapter.java", - "java/src/org/chromium/chrome/browser/ntp/cards/NewTabPageItem.java", "java/src/org/chromium/chrome/browser/ntp/cards/NewTabPageRecyclerView.java", "java/src/org/chromium/chrome/browser/ntp/cards/NewTabPageViewHolder.java", + "java/src/org/chromium/chrome/browser/ntp/cards/NodeParent.java", "java/src/org/chromium/chrome/browser/ntp/cards/ProgressIndicatorView.java", "java/src/org/chromium/chrome/browser/ntp/cards/ProgressItem.java", "java/src/org/chromium/chrome/browser/ntp/cards/ProgressViewHolder.java", "java/src/org/chromium/chrome/browser/ntp/cards/SignInPromo.java", - "java/src/org/chromium/chrome/browser/ntp/cards/SingleItemGroup.java", "java/src/org/chromium/chrome/browser/ntp/cards/SpacingItem.java", "java/src/org/chromium/chrome/browser/ntp/cards/StatusCardViewHolder.java", "java/src/org/chromium/chrome/browser/ntp/cards/StatusItem.java", "java/src/org/chromium/chrome/browser/ntp/cards/SuggestionsCategoryInfo.java", "java/src/org/chromium/chrome/browser/ntp/cards/SuggestionsSection.java", + "java/src/org/chromium/chrome/browser/ntp/cards/TreeNode.java", "java/src/org/chromium/chrome/browser/ntp/snippets/CategoryInt.java", "java/src/org/chromium/chrome/browser/ntp/snippets/FakeSuggestionsSource.java", "java/src/org/chromium/chrome/browser/ntp/snippets/SectionHeader.java", @@ -779,7 +782,6 @@ "java/src/org/chromium/chrome/browser/preferences/privacy/ClearBrowsingDataPreferences.java", "java/src/org/chromium/chrome/browser/preferences/privacy/ConfirmImportantSitesDialogFragment.java", "java/src/org/chromium/chrome/browser/preferences/privacy/ContextualSearchPreferenceFragment.java", - "java/src/org/chromium/chrome/browser/preferences/privacy/CrashReportingPermissionManager.java", "java/src/org/chromium/chrome/browser/preferences/privacy/DoNotTrackPreference.java", "java/src/org/chromium/chrome/browser/preferences/privacy/OtherFormsOfHistoryDialogFragment.java", "java/src/org/chromium/chrome/browser/preferences/privacy/PhysicalWebPreferenceFragment.java", @@ -1441,6 +1443,7 @@ "junit/src/org/chromium/chrome/browser/ntp/NativePageFactoryTest.java", "junit/src/org/chromium/chrome/browser/ntp/TitleUtilTest.java", "junit/src/org/chromium/chrome/browser/ntp/cards/ContentSuggestionsTestUtils.java", + "junit/src/org/chromium/chrome/browser/ntp/cards/InnerNodeTest.java", "junit/src/org/chromium/chrome/browser/ntp/cards/NewTabPageAdapterTest.java", "junit/src/org/chromium/chrome/browser/ntp/cards/SuggestionsSectionTest.java", "junit/src/org/chromium/chrome/browser/offlinepages/BackgroundSchedulerTest.java",
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/AutofillTestHelper.java b/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/AutofillTestHelper.java index 137a1b66..393ccac7 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/AutofillTestHelper.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/AutofillTestHelper.java
@@ -45,12 +45,12 @@ }); } - List<AutofillProfile> getProfilesToSuggest(final boolean includeName) throws + List<AutofillProfile> getProfilesToSuggest(final boolean includeNameInLabel) throws ExecutionException { return ThreadUtils.runOnUiThreadBlocking(new Callable<List<AutofillProfile>>() { @Override public List<AutofillProfile> call() { - return PersonalDataManager.getInstance().getProfilesToSuggest(includeName); + return PersonalDataManager.getInstance().getProfilesToSuggest(includeNameInLabel); } }); }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/PersonalDataManagerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/PersonalDataManagerTest.java index c0be4f4c..7483487 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/PersonalDataManagerTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/PersonalDataManagerTest.java
@@ -325,7 +325,8 @@ // a bigger use count that the first profile. It should be second. mHelper.setProfileUseStatsForTesting(guid3, 6, 5000); - List<AutofillProfile> profiles = mHelper.getProfilesToSuggest(false /* includeName */); + List<AutofillProfile> profiles = + mHelper.getProfilesToSuggest(false /* includeNameInLabel */); assertEquals(3, profiles.size()); assertTrue("Profile2 should be ranked first", guid2.equals(profiles.get(0).getGUID())); assertTrue("Profile3 should be ranked second", guid3.equals(profiles.get(1).getGUID())); @@ -499,7 +500,8 @@ TimeoutException { mHelper.setProfile(createTestProfile()); - List<AutofillProfile> profiles = mHelper.getProfilesToSuggest(false /* includeName */); + List<AutofillProfile> profiles = + mHelper.getProfilesToSuggest(false /* includeNameInLabel */); assertEquals("Acme Inc., 123 Main, Los Angeles, California 90210, United States", profiles.get(0).getLabel()); } @@ -511,7 +513,8 @@ TimeoutException { mHelper.setProfile(createTestProfile()); - List<AutofillProfile> profiles = mHelper.getProfilesToSuggest(true /* includeName */); + List<AutofillProfile> profiles = + mHelper.getProfilesToSuggest(true /* includeNameInLabel */); assertEquals("John Major, Acme Inc., 123 Main, Los Angeles, California 90210, " + "United States", profiles.get(0).getLabel()); }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchFakeServer.java b/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchFakeServer.java index 9f8e077..7f1d5ebd 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchFakeServer.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchFakeServer.java
@@ -53,6 +53,7 @@ private String mSearchTermRequested; private boolean mShouldUseHttps; + private boolean mIsOnline = true; private boolean mDidEverCallContentViewCoreOnShow; @@ -476,6 +477,14 @@ } /** + * Sets whether the device is currently online or not. + */ + @VisibleForTesting + void setIsOnline(boolean isOnline) { + mIsOnline = isOnline; + } + + /** * Resets the fake server's member data. */ @VisibleForTesting @@ -483,6 +492,7 @@ mLoadedUrl = null; mSearchTermRequested = null; mShouldUseHttps = false; + mIsOnline = true; mLoadedUrlCount = 0; } @@ -523,7 +533,13 @@ } @Override - @Nullable public URL getBasePageUrl() { + public boolean isOnline() { + return mIsOnline; + } + + @Override + @Nullable + public URL getBasePageUrl() { URL baseUrl = mBaseManager.getBasePageUrl(); if (mShouldUseHttps && baseUrl != null) { try {
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 24ed42e..275c701e 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
@@ -79,9 +79,9 @@ /** * Tests the Contextual Search Manager using instrumentation tests. */ - +// NOTE: Disable online detection so we we'll default to online on test bots with no network. +@CommandLineFlags.Add(ContextualSearchFieldTrial.ONLINE_DETECTION_DISABLED) public class ContextualSearchManagerTest extends ChromeActivityTestCaseBase<ChromeActivity> { - private static final String TEST_PAGE = "/chrome/test/data/android/contextualsearch/tap_test.html"; private static final int TEST_TIMEOUT = 15000; @@ -151,17 +151,47 @@ super.tearDown(); } + /** + * Sets the online status and reloads the current Tab with our test URL. + * @param isOnline Whether to go online. + * @throws InterruptedException + * @throws TimeoutException + */ + private void setOnlineStatusAndReload(boolean isOnline) + throws InterruptedException, TimeoutException { + mFakeServer.setIsOnline(isOnline); + final String testUrl = mTestServer.getURL(TEST_PAGE); + final Tab tab = getActivity().getActivityTab(); + ThreadUtils.runOnUiThreadBlocking(new Runnable() { + @Override + public void run() { + tab.reload(); + } + }); + // Make sure the page is fully loaded. + ChromeTabUtils.waitForTabPageLoaded(tab, testUrl); + } + //============================================================================================ // Public API //============================================================================================ /** - * Simulates a long-press on the given node. + * Simulates a long-press on the given node without waiting for the panel to respond. + * @param nodeId A string containing the node ID. + */ + public void longPressNodeWithoutWaiting(String nodeId) + throws InterruptedException, TimeoutException { + Tab tab = getActivity().getActivityTab(); + DOMUtils.longPressNode(this, tab.getContentViewCore(), nodeId); + } + + /** + * Simulates a long-press on the given node and waits for the panel to peek. * @param nodeId A string containing the node ID. */ public void longPressNode(String nodeId) throws InterruptedException, TimeoutException { - Tab tab = getActivity().getActivityTab(); - DOMUtils.longPressNode(this, tab.getContentViewCore(), nodeId); + longPressNodeWithoutWaiting(nodeId); waitForPanelToPeek(); } @@ -447,7 +477,7 @@ } /** - * Fakes navigation of the Content View to the URL was previously requested. + * Fakes navigation of the Content View to the URL that was previously requested. * @param isFailure whether the request resulted in a failure. */ private void fakeContentViewDidNavigate(boolean isFailure) { @@ -559,6 +589,10 @@ assertTrue(success); } + private void assertPanelPeeked() { + assertTrue(mPanel.getPanelState() == PanelState.PEEKED); + } + private void assertLoadedNoUrl() { assertTrue("Requested a search or preload when none was expected!", mFakeServer.getLoadedUrl() == null); @@ -960,6 +994,13 @@ }); } + /** + * Waits for the Action Bar to be visible in response to a selection. + */ + private void waitForSelectActionBarVisible() throws InterruptedException { + assertWaitForSelectActionBarVisible(true); + } + //============================================================================================ // Test Cases //============================================================================================ @@ -1945,6 +1986,11 @@ assertEquals(1, observer.hideCount); } + /** + * Asserts that the action bar does or does not become visible in response to a selection. + * @param visible Whether the Action Bar must become visible or not. + * @throws InterruptedException + */ private void assertWaitForSelectActionBarVisible(final boolean visible) throws InterruptedException { CriteriaHelper.pollUiThread(Criteria.equals(visible, new Callable<Boolean>() { @@ -2703,4 +2749,29 @@ // TODO(twellington): Add an end-to-end integration test for fetching a thumbnail based on a // a URL that is included with the resolution response. + + /** + * Tests that Contextual Search is fully disabled when offline. + */ + @SmallTest + @Feature({"ContextualSearch"}) + @Restriction(RESTRICTION_TYPE_NON_LOW_END_DEVICE) + // NOTE: Remove the flag so we will run just this test with onLine detection enabled. + @CommandLineFlags.Remove(ContextualSearchFieldTrial.ONLINE_DETECTION_DISABLED) + public void testNetworkDisconnectedDeactivatesSearch() + throws InterruptedException, TimeoutException { + setOnlineStatusAndReload(false); + longPressNodeWithoutWaiting("states"); + waitForSelectActionBarVisible(); + // Verify the panel didn't open. It should open by now if CS has not been disabled. + // TODO(donnd): Consider waiting for some condition to be sure we'll catch all failures, + // e.g. in case the Bar is about to show but has not yet appeared. Currently catches ~90%. + assertPanelClosedOrUndefined(); + + // Similar sequence with network connected should peek for Longpress. + setOnlineStatusAndReload(true); + longPressNodeWithoutWaiting("states"); + waitForSelectActionBarVisible(); + waitForPanelToPeek(); + } }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/crash/MinidumpUploadCallableTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/crash/MinidumpUploadCallableTest.java index 672562f..8f4f7cc 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/crash/MinidumpUploadCallableTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/crash/MinidumpUploadCallableTest.java
@@ -8,7 +8,7 @@ import org.chromium.base.annotations.SuppressFBWarnings; import org.chromium.base.test.util.Feature; -import org.chromium.chrome.browser.preferences.privacy.CrashReportingPermissionManager; +import org.chromium.components.minidump_uploader.util.CrashReportingPermissionManager; import org.chromium.components.minidump_uploader.util.HttpURLConnectionFactory; import java.io.BufferedReader;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabTabPersistencePolicyTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabTabPersistencePolicyTest.java index 977c1b3..602998ec 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabTabPersistencePolicyTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabTabPersistencePolicyTest.java
@@ -363,6 +363,11 @@ } @Override + public boolean shouldMergeOnStartup() { + return false; + } + + @Override public boolean isMergeInProgress() { return false; } @@ -428,7 +433,7 @@ CustomTabActivity activity = new CustomTabActivity(); ApplicationStatus.onStateChangeForTesting(activity, ActivityState.CREATED); TabModelSelectorImpl selector = new TabModelSelectorImpl( - activity, buildTestPersistencePolicy(), false); + activity, activity, null, buildTestPersistencePolicy(), false); selector.initializeForTesting(normalTabModel, incognitoTabModel); ApplicationStatus.onStateChangeForTesting(activity, ActivityState.DESTROYED); return selector;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/notifications/NotificationPlatformBridgeTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/notifications/NotificationPlatformBridgeTest.java index 110831c..ad9f0b0 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/notifications/NotificationPlatformBridgeTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/notifications/NotificationPlatformBridgeTest.java
@@ -8,11 +8,15 @@ import android.annotation.TargetApi; import android.app.Notification; +import android.app.PendingIntent; +import android.app.RemoteInput; import android.content.Context; +import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Color; import android.os.Build; +import android.os.Bundle; import android.test.suitebuilder.annotation.LargeTest; import android.test.suitebuilder.annotation.MediumTest; @@ -239,7 +243,7 @@ @TargetApi(Build.VERSION_CODES.KITKAT_WATCH) // RemoteInputs were only added in KITKAT_WATCH. @MediumTest @Feature({"Browser", "Notifications"}) - public void testNotificationWithTextAction() throws Exception { + public void testShowNotificationWithTextAction() throws Exception { setNotificationContentSettingForCurrentOrigin(ContentSetting.ALLOW); Notification notification = showAndGetNotification("MyNotification", "{ " @@ -257,6 +261,106 @@ } /** + * Verifies that setting a reply on the remote input of a notification action with type 'text' + * and triggering the action's intent causes the same reply to be received in the subsequent + * notificationclick event on the service worker. + */ + @CommandLineFlags.Add("enable-experimental-web-platform-features") + @MinAndroidSdkLevel(Build.VERSION_CODES.KITKAT_WATCH) + @TargetApi(Build.VERSION_CODES.KITKAT_WATCH) // RemoteInputs were only added in KITKAT_WATCH. + @MediumTest + @Feature({"Browser", "Notifications"}) + public void testReplyToNotification() throws Exception { + setNotificationContentSettingForCurrentOrigin(ContentSetting.ALLOW); + Context context = getInstrumentation().getTargetContext(); + + Notification notification = showAndGetNotification("MyNotification", "{ " + + " actions: [{action: 'myAction', title: 'reply', type: 'text'}]," + + " data: 'ACTION_REPLY'}"); + + // Check the action is present with a remote input attached. + Notification.Action action = notification.actions[0]; + assertEquals("reply", action.title); + RemoteInput[] remoteInputs = action.getRemoteInputs(); + assertNotNull(remoteInputs); + + // Set a reply using the action's remote input key and send it on the intent. + sendIntentWithRemoteInput(context, action.actionIntent, remoteInputs, + remoteInputs[0].getResultKey(), "My Reply" /* reply */); + + // Check reply was received by the service worker (see android_test_worker.js). + waitForTitle("reply: My Reply"); + } + + /** + * Verifies that setting an empty reply on the remote input of a notification action with type + * 'text' and triggering the action's intent causes an empty reply string to be received in the + * subsequent notificationclick event on the service worker. + */ + @CommandLineFlags.Add("enable-experimental-web-platform-features") + @MinAndroidSdkLevel(Build.VERSION_CODES.KITKAT_WATCH) + @TargetApi(Build.VERSION_CODES.KITKAT_WATCH) // RemoteInputs added in KITKAT_WATCH. + @MediumTest + @Feature({"Browser", "Notifications"}) + public void testReplyToNotificationWithEmptyReply() throws Exception { + setNotificationContentSettingForCurrentOrigin(ContentSetting.ALLOW); + Context context = getInstrumentation().getTargetContext(); + + Notification notification = showAndGetNotification("MyNotification", "{ " + + " actions: [{action: 'myAction', title: 'reply', type: 'text'}]," + + " data: 'ACTION_REPLY'}"); + + // Check the action is present with a remote input attached. + Notification.Action action = notification.actions[0]; + assertEquals("reply", action.title); + RemoteInput[] remoteInputs = action.getRemoteInputs(); + assertNotNull(remoteInputs); + + // Set a reply using the action's remote input key and send it on the intent. + sendIntentWithRemoteInput(context, action.actionIntent, remoteInputs, + remoteInputs[0].getResultKey(), "" /* reply */); + + // Check empty reply was received by the service worker (see android_test_worker.js). + waitForTitle("reply:"); + } + + @TargetApi(Build.VERSION_CODES.KITKAT_WATCH) // RemoteInputs added in KITKAT_WATCH. + private static void sendIntentWithRemoteInput(Context context, PendingIntent pendingIntent, + RemoteInput[] remoteInputs, String resultKey, String reply) + throws PendingIntent.CanceledException { + Bundle results = new Bundle(); + results.putString(resultKey, reply); + Intent fillInIntent = new Intent().addFlags(Intent.FLAG_RECEIVER_FOREGROUND); + RemoteInput.addResultsToIntent(remoteInputs, fillInIntent, results); + + // Send the pending intent filled in with the additional information from the new intent. + pendingIntent.send(context, 0 /* code */, fillInIntent); + } + + /** + * Verifies that *not* setting a reply on the remote input of a notification action with type + * 'text' and triggering the action's intent causes a null reply to be received in the + * subsequent notificationclick event on the service worker. + */ + @TargetApi(Build.VERSION_CODES.KITKAT) // Notification.Action.actionIntent added in Android K. + @CommandLineFlags.Add("enable-experimental-web-platform-features") + @MediumTest + @Feature({"Browser", "Notifications"}) + public void testReplyToNotificationWithNoRemoteInput() throws Exception { + setNotificationContentSettingForCurrentOrigin(ContentSetting.ALLOW); + + Notification notification = showAndGetNotification("MyNotification", "{ " + + " actions: [{action: 'myAction', title: 'reply', type: 'text'}]," + + " data: 'ACTION_REPLY'}"); + + assertEquals("reply", notification.actions[0].title); + notification.actions[0].actionIntent.send(); + + // Check reply was received by the service worker (see android_test_worker.js). + waitForTitle("reply: null"); + } + + /** * Verifies that the ONLY_ALERT_ONCE flag is not set when renotify is true. */ @MediumTest
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/ContextMenuLoadUrlParamsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/ContextMenuLoadUrlParamsTest.java index 1403419a..e256257 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/ContextMenuLoadUrlParamsTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/ContextMenuLoadUrlParamsTest.java
@@ -4,6 +4,7 @@ package org.chromium.chrome.browser.tabmodel; +import android.app.Activity; import android.os.Environment; import android.test.suitebuilder.annotation.MediumTest; @@ -11,7 +12,7 @@ import org.chromium.base.test.util.Feature; import org.chromium.base.test.util.RetryOnFailure; import org.chromium.chrome.R; -import org.chromium.chrome.browser.ChromeActivity; +import org.chromium.chrome.browser.fullscreen.FullscreenManager; import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tabmodel.TabModel.TabLaunchType; import org.chromium.chrome.browser.tabmodel.TabWindowManager.TabModelSelectorFactory; @@ -47,8 +48,10 @@ return super.openNewTab(loadUrlParams, type, parent, incognito); } - public RecordingTabModelSelector(ChromeActivity activity, int selectorIndex) { - super(activity, new TabbedModeTabPersistencePolicy(selectorIndex, false), true); + public RecordingTabModelSelector(Activity activity, TabCreatorManager tabCreatorManager, + FullscreenManager fullscreenManager, int selectorIndex) { + super(activity, tabCreatorManager, fullscreenManager, + new TabbedModeTabPersistencePolicy(selectorIndex, false), true); } } @@ -63,9 +66,11 @@ TabWindowManager.getInstance().setTabModelSelectorFactory( new TabModelSelectorFactory() { @Override - public TabModelSelector buildSelector(ChromeActivity activity, - int selectorIndex) { - return new RecordingTabModelSelector(activity, selectorIndex); + public TabModelSelector buildSelector( + Activity activity, TabCreatorManager tabCreatorManager, + FullscreenManager fullscreenManager, int selectorIndex) { + return new RecordingTabModelSelector(activity, tabCreatorManager, + fullscreenManager, selectorIndex); } }); }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/TabPersistentStoreTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/TabPersistentStoreTest.java index c848ff8..8cc1d922 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/TabPersistentStoreTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/TabPersistentStoreTest.java
@@ -4,6 +4,7 @@ package org.chromium.chrome.browser.tabmodel; +import android.app.Activity; import android.content.SharedPreferences; import android.os.AsyncTask; import android.test.suitebuilder.annotation.SmallTest; @@ -19,6 +20,8 @@ import org.chromium.chrome.browser.ChromeActivity; import org.chromium.chrome.browser.TabState; import org.chromium.chrome.browser.compositor.overlays.strip.StripLayoutHelper; +import org.chromium.chrome.browser.fullscreen.ChromeFullscreenManager; +import org.chromium.chrome.browser.fullscreen.FullscreenManager; import org.chromium.chrome.browser.snackbar.undo.UndoBarController; import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tabmodel.TabCreatorManager.TabCreator; @@ -253,12 +256,19 @@ protected boolean handleBackPressed() { return false; } + + @Override + protected ChromeFullscreenManager createFullscreenManager() { + return null; + } }; private final TabWindowManager.TabModelSelectorFactory mMockTabModelSelectorFactory = new TabWindowManager.TabModelSelectorFactory() { @Override - public TabModelSelector buildSelector(ChromeActivity activity, int selectorIndex) { + public TabModelSelector buildSelector(Activity activity, + TabCreatorManager tabCreatorManager, FullscreenManager fullscreenManager, + int selectorIndex) { try { return new TestTabModelSelector(); } catch (Exception e) { @@ -654,7 +664,7 @@ tabWindowManager.onActivityStateChange( mFakeChromeActivity, ActivityState.DESTROYED); return (TestTabModelSelector) tabWindowManager.requestSelector( - mFakeChromeActivity, 0); + mFakeChromeActivity, mFakeChromeActivity, null, 0); } });
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/TabWindowManagerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/TabWindowManagerTest.java index aa0de54..9306a06 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/TabWindowManagerTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/TabWindowManagerTest.java
@@ -15,6 +15,7 @@ import org.chromium.base.test.util.Feature; import org.chromium.chrome.browser.ChromeActivity; import org.chromium.chrome.browser.EmbedContentViewActivity; +import org.chromium.chrome.browser.fullscreen.FullscreenManager; import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tabmodel.TabWindowManager.TabModelSelectorFactory; import org.chromium.chrome.test.util.browser.tabmodel.MockTabModelSelector; @@ -27,7 +28,9 @@ private final TabModelSelectorFactory mMockTabModelSelectorFactory = new TabModelSelectorFactory() { @Override - public TabModelSelector buildSelector(ChromeActivity activity, int selectorIndex) { + public TabModelSelector buildSelector(Activity activity, + TabCreatorManager tabCreatorManager, FullscreenManager fullscreenManager, + int selectorIndex) { return new MockTabModelSelector(0, 0, null); } }; @@ -41,7 +44,8 @@ private MockTabModelSelector requestSelector(ChromeActivity activity, int requestedIndex) { final TabWindowManager manager = TabWindowManager.getInstance(); manager.setTabModelSelectorFactory(mMockTabModelSelectorFactory); - return (MockTabModelSelector) manager.requestSelector(activity, requestedIndex); + return (MockTabModelSelector) manager.requestSelector(activity, activity, + activity.getFullscreenManager(), requestedIndex); } /**
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/ntp/cards/ContentSuggestionsTestUtils.java b/chrome/android/junit/src/org/chromium/chrome/browser/ntp/cards/ContentSuggestionsTestUtils.java index bb67f07..11842ac 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/ntp/cards/ContentSuggestionsTestUtils.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/ntp/cards/ContentSuggestionsTestUtils.java
@@ -33,8 +33,8 @@ } public static SuggestionsSection createSection( - boolean moreButton, boolean showIfEmpty, ItemGroup.Observer observer) { + boolean moreButton, boolean showIfEmpty, NodeParent parent) { SuggestionsCategoryInfo info = createInfo(42, moreButton, showIfEmpty); - return new SuggestionsSection(info, observer); + return new SuggestionsSection(parent, info); } }
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/ntp/cards/InnerNodeTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/ntp/cards/InnerNodeTest.java new file mode 100644 index 0000000..0a5faae --- /dev/null +++ b/chrome/android/junit/src/org/chromium/chrome/browser/ntp/cards/InnerNodeTest.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.ntp.cards; + +import static org.hamcrest.CoreMatchers.is; +import static org.junit.Assert.assertThat; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.robolectric.annotation.Config; + +import org.chromium.chrome.browser.ntp.snippets.SnippetArticle; +import org.chromium.testing.local.LocalRobolectricTestRunner; + +import java.util.Arrays; +import java.util.List; + +/** + * JUnit tests for {@link InnerNode}. + */ +@RunWith(LocalRobolectricTestRunner.class) +@Config(manifest = Config.NONE) +public class InnerNodeTest { + + private static final int[] ITEM_COUNTS = {1, 2, 3, 0, 3, 2, 1}; + private final List<TreeNode> mChildren = Arrays.asList(new TreeNode[ITEM_COUNTS.length]); + @Mock private NodeParent mParent; + private InnerNode mInnerNode; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + + for (int i = 0; i < ITEM_COUNTS.length; i++) { + TreeNode child = mock(TreeNode.class); + when(child.getItemCount()).thenReturn(ITEM_COUNTS[i]); + mChildren.set(i, child); + } + mInnerNode = new InnerNode(mParent) { + @Override + protected List<TreeNode> getChildren() { + return mChildren; + } + }; + } + + @Test + public void testItemCount() { + assertThat(mInnerNode.getItemCount(), is(12)); + } + + @Test + public void testGetItemViewType() { + when(mChildren.get(0).getItemViewType(0)).thenReturn(42); + when(mChildren.get(2).getItemViewType(2)).thenReturn(23); + when(mChildren.get(4).getItemViewType(0)).thenReturn(4711); + when(mChildren.get(6).getItemViewType(0)).thenReturn(1729); + + assertThat(mInnerNode.getItemViewType(0), is(42)); + assertThat(mInnerNode.getItemViewType(5), is(23)); + assertThat(mInnerNode.getItemViewType(6), is(4711)); + assertThat(mInnerNode.getItemViewType(11), is(1729)); + } + + @Test + public void testBindViewHolder() { + NewTabPageViewHolder holder = mock(NewTabPageViewHolder.class); + mInnerNode.onBindViewHolder(holder, 0); + mInnerNode.onBindViewHolder(holder, 5); + mInnerNode.onBindViewHolder(holder, 6); + mInnerNode.onBindViewHolder(holder, 11); + + verify(mChildren.get(0)).onBindViewHolder(holder, 0); + verify(mChildren.get(2)).onBindViewHolder(holder, 2); + verify(mChildren.get(4)).onBindViewHolder(holder, 0); + verify(mChildren.get(6)).onBindViewHolder(holder, 0); + } + + @Test + public void testGetSuggestion() { + SnippetArticle article1 = mock(SnippetArticle.class); + SnippetArticle article2 = mock(SnippetArticle.class); + SnippetArticle article3 = mock(SnippetArticle.class); + SnippetArticle article4 = mock(SnippetArticle.class); + + when(mChildren.get(0).getSuggestionAt(0)).thenReturn(article1); + when(mChildren.get(2).getSuggestionAt(2)).thenReturn(article2); + when(mChildren.get(4).getSuggestionAt(0)).thenReturn(article3); + when(mChildren.get(6).getSuggestionAt(0)).thenReturn(article4); + + assertThat(mInnerNode.getSuggestionAt(0), is(article1)); + assertThat(mInnerNode.getSuggestionAt(5), is(article2)); + assertThat(mInnerNode.getSuggestionAt(6), is(article3)); + assertThat(mInnerNode.getSuggestionAt(11), is(article4)); + } + + @Test + public void testNotifications() { + mInnerNode.onItemRangeInserted(mChildren.get(0), 0, 23); + mInnerNode.onItemRangeChanged(mChildren.get(2), 2, 9000); + mInnerNode.onItemRangeChanged(mChildren.get(4), 0, 6502); + mInnerNode.onItemRangeRemoved(mChildren.get(6), 0, 8086); + + verify(mParent).onItemRangeInserted(mInnerNode, 0, 23); + verify(mParent).onItemRangeChanged(mInnerNode, 5, 9000); + verify(mParent).onItemRangeChanged(mInnerNode, 6, 6502); + verify(mParent).onItemRangeRemoved(mInnerNode, 11, 8086); + } +} +
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/ntp/cards/NewTabPageAdapterTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/ntp/cards/NewTabPageAdapterTest.java index a129cdfe..2d31743 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/ntp/cards/NewTabPageAdapterTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/ntp/cards/NewTabPageAdapterTest.java
@@ -107,27 +107,27 @@ mCurrentIndex = startingIndex; } - public void expect(@NewTabPageItem.ViewType int expectedItemType) { + public void expect(@ItemViewType int expectedItemType) { if (mCurrentIndex >= mAdapter.getItemCount()) { fail("Expected item of type " + expectedItemType + " but encountered end of list"); } - @NewTabPageItem.ViewType int itemType = mAdapter.getItemViewType(mCurrentIndex); + @ItemViewType int itemType = mAdapter.getItemViewType(mCurrentIndex); assertEquals("Type mismatch at position " + mCurrentIndex, expectedItemType, itemType); mCurrentIndex++; } public void expect(SectionDescriptor descriptor) { - expect(NewTabPageItem.VIEW_TYPE_HEADER); + expect(ItemViewType.HEADER); if (descriptor.mStatusCard) { - expect(NewTabPageItem.VIEW_TYPE_STATUS); - expect(NewTabPageItem.VIEW_TYPE_ACTION); - expect(NewTabPageItem.VIEW_TYPE_PROGRESS); + expect(ItemViewType.STATUS); + expect(ItemViewType.ACTION); + expect(ItemViewType.PROGRESS); } else { for (int i = 1; i <= descriptor.mNumSuggestions; i++) { - expect(NewTabPageItem.VIEW_TYPE_SNIPPET); + expect(ItemViewType.SNIPPET); } if (descriptor.mMoreButton) { - expect(NewTabPageItem.VIEW_TYPE_ACTION); + expect(ItemViewType.ACTION); } } } @@ -143,11 +143,11 @@ * @param descriptor The section descriptor to match against. * @param itemGroup The items from the adapter. */ - private void assertMatches(SectionDescriptor descriptor, ItemGroup itemGroup) { + private void assertMatches(SectionDescriptor descriptor, TreeNode itemGroup) { int offset = mAdapter.getGroupPositionOffset(itemGroup); ItemsMatcher matcher = new ItemsMatcher(mAdapter, offset); matcher.expect(descriptor); - matcher.expectPosition(offset + itemGroup.getItems().size()); + matcher.expectPosition(offset + itemGroup.getItemCount()); } /** @@ -158,14 +158,14 @@ */ private void assertItemsFor(SectionDescriptor... descriptors) { ItemsMatcher matcher = new ItemsMatcher(mAdapter, 0); - matcher.expect(NewTabPageItem.VIEW_TYPE_ABOVE_THE_FOLD); + matcher.expect(ItemViewType.ABOVE_THE_FOLD); for (SectionDescriptor descriptor : descriptors) matcher.expect(descriptor); if (descriptors.length == 0) { - matcher.expect(NewTabPageItem.VIEW_TYPE_ALL_DISMISSED); + matcher.expect(ItemViewType.ALL_DISMISSED); } else { - matcher.expect(NewTabPageItem.VIEW_TYPE_FOOTER); + matcher.expect(ItemViewType.FOOTER); } - matcher.expect(NewTabPageItem.VIEW_TYPE_SPACING); + matcher.expect(ItemViewType.SPACING); matcher.expectPosition(mAdapter.getItemCount()); } @@ -363,9 +363,8 @@ @Feature({"Ntp"}) public void testProgressIndicatorDisplay() { int progressPos = mAdapter.getFooterPosition() - 1; - SuggestionsSection section = (SuggestionsSection) mAdapter.getGroup(progressPos); - List<NewTabPageItem> items = section.getItems(); - ProgressItem progress = (ProgressItem) items.get(items.size() - 1); + SuggestionsSection section = mAdapter.getSuggestionsSection(progressPos); + ProgressItem progress = section.getProgressItemForTesting(); mSource.setStatusForCategory(KnownCategories.ARTICLES, CategoryStatus.INITIALIZING); assertTrue(progress.isVisible()); @@ -614,7 +613,7 @@ NewTabPageAdapter ntpAdapter = new NewTabPageAdapter(new MockNewTabPageManager(suggestionsSource), null, null); - List<ItemGroup> groups = ntpAdapter.getGroups(); + List<TreeNode> groups = ntpAdapter.getGroups(); assertEquals(basicGroupCount + 4, groups.size()); assertEquals(AboveTheFoldItem.class, groups.get(0).getClass()); @@ -760,8 +759,7 @@ MockNewTabPageManager ntpManager = new MockNewTabPageManager(mSource); NewTabPageAdapter adapter = new NewTabPageAdapter(ntpManager, null, null); - assertEquals(5, adapter.getGroups().size()); - ItemGroup signinPromoGroup = adapter.getGroup(5); + TreeNode signinPromoGroup = adapter.getGroups().get(2); // Adapter content: // Idx | Item | Group Index @@ -775,14 +773,14 @@ // 6 | Footer | 3 // 7 | Spacer | 4 - assertEquals(1, signinPromoGroup.getItems().size()); - assertEquals(NewTabPageItem.VIEW_TYPE_PROMO, signinPromoGroup.getItems().get(0).getType()); + assertEquals(1, signinPromoGroup.getItemCount()); + assertEquals(ItemViewType.PROMO, signinPromoGroup.getItemViewType(0)); ntpManager.mSignInStateObserver.onSignedIn(); - assertEquals(0, signinPromoGroup.getItems().size()); + assertEquals(0, signinPromoGroup.getItemCount()); ntpManager.mSignInStateObserver.onSignedOut(); - assertEquals(1, signinPromoGroup.getItems().size()); + assertEquals(1, signinPromoGroup.getItemCount()); } @Test @@ -797,31 +795,31 @@ final int signInPromoIndex = 5; assertEquals(5, adapter.getGroups().size()); - ItemGroup signinPromoGroup = adapter.getGroup(signInPromoIndex); + TreeNode signinPromoGroup = adapter.getGroups().get(2); // Adapter content: - // Idx | Item - // ----|---------------- - // 0 | Above-the-fold - // 1 | Header - // 2 | Status - // 3 | Action - // 4 | Progress Indicator - // 5 | Sign in promo - // 6 | Footer - // 7 | Spacer + // Idx | Item | Group Index + // ----|--------------------|------------- + // 0 | Above-the-fold | 0 + // 1 | Header | 1 + // 2 | Status | 1 + // 3 | Action | 1 + // 4 | Progress Indicator | 1 + // 5 | Sign in promo | 2 + // 6 | Footer | 3 + // 7 | Spacer | 4 - assertEquals(NewTabPageItem.VIEW_TYPE_PROMO, signinPromoGroup.getItems().get(0).getType()); + assertEquals(ItemViewType.PROMO, signinPromoGroup.getItemViewType(0)); adapter.dismissItem(signInPromoIndex); - assertTrue(signinPromoGroup.getItems().isEmpty()); + assertEquals(0, signinPromoGroup.getItemCount()); assertTrue(ChromePreferenceManager.getInstance(RuntimeEnvironment.application) .getNewTabPageSigninPromoDismissed()); adapter = new NewTabPageAdapter(ntpManager, null, null); assertEquals(5, adapter.getGroups().size()); // The items below the signin promo move up, footer is now at the position of the promo. - assertEquals(NewTabPageItem.VIEW_TYPE_FOOTER, adapter.getItemViewType(signInPromoIndex)); + assertEquals(ItemViewType.FOOTER, adapter.getItemViewType(signInPromoIndex)); } /** Registers the category with hasMoreButton=false and showIfEmpty=true*/ @@ -836,7 +834,7 @@ category, createDummySuggestions(suggestionCount)); } - private int getCategory(ItemGroup itemGroup) { + private int getCategory(TreeNode itemGroup) { return ((SuggestionsSection) itemGroup).getCategory(); }
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/ntp/cards/SuggestionsSectionTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/ntp/cards/SuggestionsSectionTest.java index c8f05d1..63251b61 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/ntp/cards/SuggestionsSectionTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/ntp/cards/SuggestionsSectionTest.java
@@ -8,11 +8,13 @@ import static org.junit.Assert.assertNotNull; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; -import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.never; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; +import static org.chromium.chrome.browser.ntp.cards.ContentSuggestionsTestUtils.createDummySuggestions; +import static org.chromium.chrome.browser.ntp.cards.ContentSuggestionsTestUtils.createSection; + import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -20,9 +22,6 @@ import org.mockito.MockitoAnnotations; import org.robolectric.annotation.Config; -import static org.chromium.chrome.browser.ntp.cards.ContentSuggestionsTestUtils.createDummySuggestions; -import static org.chromium.chrome.browser.ntp.cards.ContentSuggestionsTestUtils.createSection; - import org.chromium.base.test.util.Feature; import org.chromium.chrome.browser.ntp.snippets.CategoryStatus; import org.chromium.chrome.browser.ntp.snippets.SnippetArticle; @@ -42,7 +41,7 @@ private static final int EMPTY_SECTION_COUNT = 4; @Mock - private ItemGroup.Observer mObserver; + private NodeParent mParent; @Before public void setUp() { @@ -55,19 +54,20 @@ List<SnippetArticle> snippets = createDummySuggestions(3); SuggestionsSection section; - section = ContentSuggestionsTestUtils.createSection(true, true, mObserver); + section = ContentSuggestionsTestUtils.createSection(true, true, mParent); section.setStatus(CategoryStatus.AVAILABLE); assertNotNull(section.getActionItem()); // Without snippets. - assertEquals(-1, section.getDismissSiblingPosDelta(section.getActionItem())); - assertEquals(1, section.getDismissSiblingPosDelta(section.getStatusItem())); + assertEquals(ItemViewType.ACTION, section.getItemViewType(2)); + assertEquals(-1, section.getDismissSiblingPosDelta(2)); + assertEquals(ItemViewType.STATUS, section.getItemViewType(1)); + assertEquals(1, section.getDismissSiblingPosDelta(1)); // With snippets. section.setSuggestions(snippets, CategoryStatus.AVAILABLE); - assertEquals(0, section.getDismissSiblingPosDelta(section.getActionItem())); - assertEquals(0, section.getDismissSiblingPosDelta(section.getStatusItem())); - assertEquals(0, section.getDismissSiblingPosDelta(snippets.get(0))); + assertEquals(ItemViewType.SNIPPET, section.getItemViewType(1)); + assertEquals(0, section.getDismissSiblingPosDelta(1)); } @Test @@ -76,14 +76,14 @@ final int suggestionCount = 5; List<SnippetArticle> snippets = createDummySuggestions(suggestionCount); - SuggestionsSection section = createSection(false, true, mObserver); + SuggestionsSection section = createSection(false, true, mParent); // Note: when status is not initialised, we insert an item for the status card, but it's // null! - assertEquals(EMPTY_SECTION_COUNT, section.getItems().size()); + assertEquals(EMPTY_SECTION_COUNT, section.getItemCount()); section.setSuggestions(snippets, CategoryStatus.AVAILABLE); - verify(mObserver).onItemRangeChanged(section, 1, EMPTY_SECTION_COUNT - 1); - verify(mObserver).onItemRangeInserted( + verify(mParent).onItemRangeChanged(section, 1, EMPTY_SECTION_COUNT - 1); + verify(mParent).onItemRangeInserted( section, EMPTY_SECTION_COUNT, suggestionCount - EMPTY_SECTION_COUNT + 1); } @@ -93,23 +93,23 @@ final int suggestionCount = 5; List<SnippetArticle> snippets = createDummySuggestions(suggestionCount); - SuggestionsSection section = createSection(false, true, mObserver); + SuggestionsSection section = createSection(false, true, mParent); section.setStatus(CategoryStatus.AVAILABLE); - verify(mObserver).onItemRangeChanged(section, 1, EMPTY_SECTION_COUNT - 1); + verify(mParent).onItemRangeChanged(section, 1, EMPTY_SECTION_COUNT - 1); section.setSuggestions(snippets, CategoryStatus.AVAILABLE); // We don't clear suggestions when the status is AVAILABLE. section.setStatus(CategoryStatus.AVAILABLE); - verify(mObserver, times(2)).onItemRangeChanged(section, 1, EMPTY_SECTION_COUNT - 1); - verify(mObserver).onItemRangeInserted( + verify(mParent, times(2)).onItemRangeChanged(section, 1, EMPTY_SECTION_COUNT - 1); + verify(mParent).onItemRangeInserted( section, EMPTY_SECTION_COUNT, suggestionCount - EMPTY_SECTION_COUNT + 1); // We clear existing suggestions when the status is not AVAILABLE. section.setStatus(CategoryStatus.SIGNED_OUT); - verify(mObserver, times(3)).onItemRangeChanged(section, 1, EMPTY_SECTION_COUNT - 1); - verify(mObserver).onItemRangeRemoved( + verify(mParent, times(3)).onItemRangeChanged(section, 1, EMPTY_SECTION_COUNT - 1); + verify(mParent).onItemRangeRemoved( section, EMPTY_SECTION_COUNT, suggestionCount - EMPTY_SECTION_COUNT + 1); } @@ -119,25 +119,25 @@ final int suggestionCount = 2; List<SnippetArticle> snippets = createDummySuggestions(suggestionCount); - SuggestionsSection section = createSection(false, true, mObserver); + SuggestionsSection section = createSection(false, true, mParent); section.removeSuggestion(snippets.get(0)); - verify(mObserver, never()) + verify(mParent, never()) .onItemRangeChanged(any(SuggestionsSection.class), anyInt(), anyInt()); - verify(mObserver, never()) + verify(mParent, never()) .onItemRangeInserted(any(SuggestionsSection.class), anyInt(), anyInt()); - verify(mObserver, never()) + verify(mParent, never()) .onItemRangeRemoved(any(SuggestionsSection.class), anyInt(), anyInt()); section.setSuggestions(snippets, CategoryStatus.AVAILABLE); section.removeSuggestion(snippets.get(1)); - verify(mObserver).onItemRangeRemoved(eq(section), eq(2), eq(1)); + verify(mParent).onItemRangeRemoved(section, 2, 1); section.removeSuggestion(snippets.get(0)); - verify(mObserver).onItemRangeRemoved(eq(section), eq(1), eq(1)); - verify(mObserver).onItemRangeInserted(eq(section), eq(1), eq(1)); - verify(mObserver).onItemRangeInserted(eq(section), eq(2), eq(1)); + verify(mParent).onItemRangeRemoved(section, 1, 1); + verify(mParent).onItemRangeInserted(section, 1, 1); + verify(mParent).onItemRangeInserted(section, 2, 1); } @Test @@ -146,24 +146,24 @@ final int suggestionCount = 2; List<SnippetArticle> snippets = createDummySuggestions(suggestionCount); - SuggestionsSection section = createSection(true, true, mObserver); + SuggestionsSection section = createSection(true, true, mParent); section.removeSuggestion(snippets.get(0)); - verify(mObserver, never()) + verify(mParent, never()) .onItemRangeChanged(any(SuggestionsSection.class), anyInt(), anyInt()); - verify(mObserver, never()) + verify(mParent, never()) .onItemRangeInserted(any(SuggestionsSection.class), anyInt(), anyInt()); - verify(mObserver, never()) + verify(mParent, never()) .onItemRangeRemoved(any(SuggestionsSection.class), anyInt(), anyInt()); section.setSuggestions(snippets, CategoryStatus.AVAILABLE); section.removeSuggestion(snippets.get(0)); - verify(mObserver).onItemRangeRemoved(eq(section), eq(1), eq(1)); + verify(mParent).onItemRangeRemoved(section, 1, 1); section.removeSuggestion(snippets.get(1)); - verify(mObserver, times(2)).onItemRangeRemoved(eq(section), eq(1), eq(1)); - verify(mObserver).onItemRangeInserted(eq(section), eq(1), eq(1)); - verify(mObserver).onItemRangeInserted(eq(section), eq(3), eq(1)); + verify(mParent, times(2)).onItemRangeRemoved(section, 1, 1); + verify(mParent).onItemRangeInserted(section, 1, 1); + verify(mParent).onItemRangeInserted(section, 3, 1); } }
diff --git a/chrome/app/chrome_crash_reporter_client_win.cc b/chrome/app/chrome_crash_reporter_client_win.cc index 139a0ed..045ac65 100644 --- a/chrome/app/chrome_crash_reporter_client_win.cc +++ b/chrome/app/chrome_crash_reporter_client_win.cc
@@ -46,6 +46,11 @@ constexpr char kGPUVertexShaderVersion[] = "gpu-vsver"; constexpr char kHungAudioThreadDetails[] = "hung-audio-thread-details"; +constexpr char kHungRendererOutstandingAckCount[] = "hung-outstanding-acks"; +constexpr char kHungRendererOutstandingEventType[] = + "hung-outstanding-event-type"; +constexpr char kHungRendererLastEventType[] = "hung-last-event-type"; +constexpr char kHungRendererReason[] = "hung-reason"; constexpr char kViewCount[] = "view-count"; constexpr char kZeroEncodeDetails[] = "zero-encode-details"; @@ -99,6 +104,10 @@ {"total-discardable-memory-allocated", kSmallSize}, {kBug464926CrashKey, kSmallSize}, {kViewCount, kSmallSize}, + {kHungRendererOutstandingAckCount, kSmallSize}, + {kHungRendererOutstandingEventType, kSmallSize}, + {kHungRendererLastEventType, kSmallSize}, + {kHungRendererReason, kSmallSize}, // media/: {kHungAudioThreadDetails, kSmallSize},
diff --git a/chrome/app/chrome_exe_main_win.cc b/chrome/app/chrome_exe_main_win.cc index 75454db..230e8b7 100644 --- a/chrome/app/chrome_exe_main_win.cc +++ b/chrome/app/chrome_exe_main_win.cc
@@ -204,6 +204,8 @@ int main() { HINSTANCE instance = GetModuleHandle(nullptr); #endif + SignalInitializeCrashReporting(); + // Initialize the CommandLine singleton from the environment. base::CommandLine::Init(0, nullptr); const base::CommandLine* command_line =
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd index ce3ce3c..e6ddb0ba 100644 --- a/chrome/app/generated_resources.grd +++ b/chrome/app/generated_resources.grd
@@ -4467,6 +4467,12 @@ <message name="IDS_EXTENSIONS_LOG_LEVEL_ERROR" desc="Alt-text indicating a high severity level for the error icon in the chrome://extensions page."> Error </message> + <message name="IDS_MD_EXTENSIONS_ERROR_PAGE_HEADING" desc="The heading of the page displaying an extension's errors."> + Errors + </message> + <message name="IDS_MD_EXTENSIONS_ITEM_ERRORS" desc="The label of the button to bring the user to the page showing an extension's errors."> + Errors + </message> <message name="IDS_MD_EXTENSIONS_ITEM_ID" desc="The text for the label next to the extension id."> <span>ID:</span><ph name="EXTENSION_ID">$1<ex>cfhdojbkjhnklbpkdaibdccddilifddb</ex></ph> </message> @@ -5661,6 +5667,18 @@ <message name="IDS_FLAGS_WEBRTC_HW_ENCODING_DESCRIPTION" desc="Description of chrome:flags option to turn off WebRTC hardware video encoding support."> Support in WebRTC for encoding video streams using platform hardware. </message> + <message name="IDS_FLAGS_WEBRTC_HW_ENCODING_ALL"> + Disable all hw encoding + </message> + <message name="IDS_FLAGS_WEBRTC_HW_ENCODING_VPX"> + Disable vpx hw encoding + </message> + <message name="IDS_FLAGS_WEBRTC_HW_ENCODING_H264"> + Disable h264 hw encoding + </message> + <message name="IDS_FLAGS_WEBRTC_HW_ENCODING_NONE"> + Disable none hw encoding + </message> <message name="IDS_FLAGS_WEBRTC_STUN_ORIGIN_NAME" desc="Name of chrome:flags option to turn on Origin header for WebRTC STUN messages"> WebRTC Stun origin header </message> @@ -11558,9 +11576,12 @@ <message name="IDS_SYNC_ENTER_GOOGLE_PASSPHRASE_BODY_WITH_DATE" desc="Instructions for the dialog where the user needs to enter their previous google passphrase."> Your data was encrypted with your Google password as of <ph name="TIME">$1<ex>Sept 1, 2012</ex></ph>. Please enter it below. </message> - <message name="IDS_SYNC_ACCOUNT_SYNCING_TO_USER" desc="The message that appears in the options dialog indicating that account is syncing to a user with the given email address."> + <message name="IDS_SYNC_ACCOUNT_INFO" desc="The message that appears in the options dialog indicating that the user is signed in with the given email address."> Signed in as <ph name="USER_EMAIL_ADDRESS">$1<ex>foo@gmail.com</ex></ph>. </message> + <message name="IDS_SYNC_ACCOUNT_SYNCING" desc="The message that appears in the settings page indicating that account is syncing."> + On - sync everything + </message> <!-- Sync/sign-in error messages --> <message name="IDS_SIGNIN_ERROR_BUBBLE_VIEW_TITLE" desc="Title in the sign-in error bubble view/notification."> @@ -11670,17 +11691,17 @@ <message name="IDS_SYNC_SETUP_ABORTED_BY_PENDING_CLEAR" desc="The error message displayed to the user when setup was aborted because the server reported that a pending clear private data operation is in progress"> The sync server is busy, please try again later. </message> - <message name="IDS_SIGNED_IN_WITH_SYNC_DISABLED" desc="The message that appears in the options dialog indicating that user is signed in with the given email address, but sync is not enabled."> - Signed in as <ph name="USER_EMAIL_ADDRESS">$1<ex>foo@gmail.com</ex></ph>. Sync is disabled by your administrator. + <message name="IDS_SIGNED_IN_WITH_SYNC_DISABLED" desc="The message that appears in the settings page indicating that user is signed in, but sync is not enabled."> + Sync is disabled by your administrator. </message> - <message name="IDS_SIGNED_IN_WITH_SYNC_SUPPRESSED" desc="The message that appears in the options dialog indicating that user is signed in with the given email address, but sync has been stopped."> - Signed in as <ph name="USER_EMAIL_ADDRESS">$1<ex>foo@gmail.com</ex></ph>. Sync has been stopped via the Google Dashboard. + <message name="IDS_SIGNED_IN_WITH_SYNC_SUPPRESSED" desc="The message that appears in the settings page indicating that user is signed in, but sync has been stopped."> + Sync has been stopped via the Google Dashboard. </message> - <message name="IDS_SYNC_ACCOUNT_SYNCING_TO_USER_WITH_MANAGE_LINK" desc="The message that appears in the options dialog indicating that account is syncing to a user with the given email address, together with a link to manage their data (where supported, or not possible through the application)"> - Signed in as <ph name="USER_EMAIL_ADDRESS">$1<ex>foo@gmail.com</ex></ph>. Manage your synced data on <ph name="BEGIN_LINK"><a href="$2" target="_blank"><ex><a href="$2" target="_blank"></ex></ph>Google Dashboard<ph name="END_LINK"></a><ex></a></ex></ph>. + <message name="IDS_SYNC_ACCOUNT_SYNCING_WITH_MANAGE_LINK" desc="The message that appears in the options dialog indicating that account is syncing along with a link to manage their data (where supported, or not possible through the application)"> + Manage your synced data on <ph name="BEGIN_LINK"><a href="$1" target="_blank"><ex><a href="$1" target="_blank"></ex></ph>Google Dashboard<ph name="END_LINK"></a><ex></a></ex></ph>. </message> - <message name="IDS_SYNC_ACCOUNT_SYNCING_TO_USER_WITH_MANAGE_LINK_NEW" desc="The message that appears in the options dialog indicating that account is syncing to a user with the given email address, together with a link to manage their data (where supported, or not possible through the application)"> - Signed in as <ph name="USER_EMAIL_ADDRESS">$1<ex>foo@gmail.com</ex></ph>. Manage your synced data and devices on <ph name="BEGIN_LINK"><a href="$2" target="_blank"><ex><a href="$2" target="_blank"></ex></ph>Chrome Dashboard<ph name="END_LINK"></a><ex></a></ex></ph>. + <message name="IDS_SYNC_ACCOUNT_SYNCING_WITH_MANAGE_LINK_NEW" desc="The message that appears in the options dialog indicating that account is syncing along with a link to manage their data (where supported, or not possible through the application)"> + Manage your synced data and devices on <ph name="BEGIN_LINK"><a href="$1" target="_blank"><ex><a href="$1" target="_blank"></ex></ph>Chrome Dashboard<ph name="END_LINK"></a><ex></a></ex></ph>. </message> <message name="IDS_SYNC_AUTHENTICATING_LABEL" desc="Label to display while the user is being authenticated to use sync."> Authenticating... @@ -15359,6 +15380,15 @@ <message name="IDS_FLAGS_ENABLE_VR_SHELL_DESCRIPTION" desc="Description for the flag to enable VR shell"> Enable VR shell if available for this device. </message> + <message name="IDS_VR_SHELL_UI_BACK_BUTTON" desc="Text under the VR scene history back button"> + Back + </message> + <message name="IDS_VR_SHELL_UI_FORWARD_BUTTON" desc="Text under the VR scene history forward button"> + Forward + </message> + <message name="IDS_VR_SHELL_UI_RELOAD_BUTTON" desc="Text under the VR scene reload page button"> + Reload + </message> </if> <!-- Web payments -->
diff --git a/chrome/app/resources/chromium_strings_am.xtb b/chrome/app/resources/chromium_strings_am.xtb index 30be1c7..9d4c0be 100644 --- a/chrome/app/resources/chromium_strings_am.xtb +++ b/chrome/app/resources/chromium_strings_am.xtb
@@ -39,6 +39,7 @@ <translation id="2158734852934720349">Chromium OS የክፍት ምንጭ ፈቃዶች</translation> <translation id="2241627712206172106">ኮምፒውተር የሚጋሩ ከሆኑ ጓደኛዎች እና ቤተሰብ ተለይተው ሊያስሱ እና Chromiumን በሚፈልጉበት መንገድ ማዋቀር ይችላሉ።</translation> <translation id="225614027745146050">እንኳን ደህና መጡ</translation> +<translation id="2264142189334629813">Chromium OS ይህን ገጽ መክፈት አይቻልም</translation> <translation id="2316129865977710310">አይ፣ አመሰግናለሁ</translation> <translation id="2347108572062610441">ይህ ቅጥያ Chromiumን ሲጀምሩት የሚታየውን ገጽ ቀይሮታል።</translation> <translation id="2372704305038231957">32-ቢት Chromium በዚህ የLinux ስርዓት ላይ ከእንግዲህ ስለማይደገፍ በአግባቡ ላይሰራ ይችላል። እባክዎን ወደ 64-ቢት ያልቁ።</translation> @@ -77,6 +78,7 @@ <translation id="3258596308407688501">Chromium የውሂብ አቃፊው ላይ ማንበብ እና መጻፍ አይችልም፦ <ph name="USER_DATA_DIRECTORY" /></translation> +<translation id="3264279740686075150">Chromium የእርስዎ ነባሪ አሳሽ ነው። ወንዳታ!</translation> <translation id="328888136576916638">የGoogle ኤ ፒ አይ ቁልፎች ይጎድላሉ። አንዳንድ የChromium ተግባራት ይሰናከላሉ።</translation> <translation id="3289635842886789612">Chromium ጊዜው አልፎበታል።</translation> <translation id="3296368748942286671">Chromium ሲዘጋ የጀርባ መተግበሪያዎች ማሂዱን ይቀጥሉ</translation>
diff --git a/chrome/app/resources/chromium_strings_ar.xtb b/chrome/app/resources/chromium_strings_ar.xtb index 3c91669..22f702d 100644 --- a/chrome/app/resources/chromium_strings_ar.xtb +++ b/chrome/app/resources/chromium_strings_ar.xtb
@@ -37,6 +37,7 @@ <translation id="2158734852934720349">تراخيص مفتوحة المصدر لنظام التشغيل Chromium</translation> <translation id="2241627712206172106">إذا كنت تشارك الكمبيوتر مع أصدقائك وعائلتك، فبإمكانهم التصفح على حدة وإعداد Chromium على النحو الذي يريدونه.</translation> <translation id="225614027745146050">مرحبًا</translation> +<translation id="2264142189334629813">يتعذر على نظام التشغيل Chromium فتح هذه الصفحة.</translation> <translation id="2316129865977710310">لا، شكرًا</translation> <translation id="2347108572062610441">غيّرت هذه الإضافة الصفحة التي تظهر عند بدء Chromium.</translation> <translation id="2372704305038231957">قد لا يعمل Chromium إصدار 32 بت على نحو صحيح لأنه لم يعد مدعومًا على نظام Linux هذا. الرجاء الترقية إلى Chromium إصدار 64 بت.</translation> @@ -75,6 +76,7 @@ <translation id="3258596308407688501">يتعذر على Chromium القراءة والكتابة في دليل البيانات الخاص به: <ph name="USER_DATA_DIRECTORY" /></translation> +<translation id="3264279740686075150">Chromium هو متصفحك الافتراضي. مع أطيب التمنيات.</translation> <translation id="328888136576916638">مفاتيح واجهة برمجة تطبيقات Google مفقودة. وسيترتب على ذلك توقف بعض وظائف Chromium عن العمل.</translation> <translation id="3289635842886789612">إصدار Chromium قديم.</translation> <translation id="3296368748942286671">استمرار تشغيل تطبيقات الخلفية عند إغلاق Chromium</translation>
diff --git a/chrome/app/resources/chromium_strings_bg.xtb b/chrome/app/resources/chromium_strings_bg.xtb index a3f63e1e..23ab711 100644 --- a/chrome/app/resources/chromium_strings_bg.xtb +++ b/chrome/app/resources/chromium_strings_bg.xtb
@@ -37,6 +37,7 @@ <translation id="2158734852934720349">Лицензи за отворен код за Chromium OS</translation> <translation id="2241627712206172106">Ако споделяте компютър, близките и приятелите ви могат да сърфират отделно и да настроят Chromium точно така, както искат.</translation> <translation id="225614027745146050">Добре дошли</translation> +<translation id="2264142189334629813">Chromium OS не може да отвори тази страница.</translation> <translation id="2316129865977710310">Не, благодаря</translation> <translation id="2347108572062610441">Това разширение промени страницата, която се показва при стартиране на Chromium.</translation> <translation id="2372704305038231957">32-битовата версия на Chromium може да не функционира правилно, защото вече не се поддържа за тази система Linux. Моля, надстройте до 64-битовата версия на браузъра.</translation> @@ -73,6 +74,7 @@ <translation id="3190315855212034486">О, не! Chromium претърпя срив. Да се стартира ли отново сега?</translation> <translation id="3256316712990552818">Копирано в Chromium</translation> <translation id="3258596308407688501">Chromium не може да чете и записва в директорията си за данни: <ph name="USER_DATA_DIRECTORY" /></translation> +<translation id="3264279740686075150">Chromium е браузърът ви по подразбиране. Браво.</translation> <translation id="328888136576916638">Ключовете на приложния програмен интерфейс (API) на Google липсват. Някои функции на Chromium ще бъдат деактивирани.</translation> <translation id="3289635842886789612">Chromium не е актуален.</translation> <translation id="3296368748942286671">Да продължават да се изпълняват приложения на заден план, когато Chromium е затворен</translation>
diff --git a/chrome/app/resources/chromium_strings_bn.xtb b/chrome/app/resources/chromium_strings_bn.xtb index 77d0fb6..12536474 100644 --- a/chrome/app/resources/chromium_strings_bn.xtb +++ b/chrome/app/resources/chromium_strings_bn.xtb
@@ -37,6 +37,7 @@ <translation id="2158734852934720349">Chromium OS মুক্ত উৎসে লাইসেন্সগুলি</translation> <translation id="2241627712206172106">যদি আপনি একটি কম্পিউটার ভাগ করেন, তাহলে বন্ধু ও পরিবারের লোকজন পৃথকভাবে ব্রাউজ করতে পারবেন এবং তাদের ইচ্ছা অনুযায়ী Chromium এর সেট আপ করতে পারবেন৷</translation> <translation id="225614027745146050">স্বাগতম</translation> +<translation id="2264142189334629813">Chromium OS এই পৃষ্ঠাটি খুলতে পারবে না।</translation> <translation id="2316129865977710310">না, ধন্যবাদ</translation> <translation id="2347108572062610441">আপনি Chromium শুরু করলে কোন পৃষ্ঠাটি দেখানো হবে তা এই এক্সটেনশানটি পরিবর্তন করেছে।</translation> <translation id="2372704305038231957">৩২-বিট Chromium সঠিকভাবে কাজ নাও করতে পারে কারণ এটি এখন আর এই Linux সিস্টেমে সমর্থিত নয়। দয়া করে ৬৪-বিট Chromium এ আপগ্রেড করুন।</translation> @@ -75,6 +76,7 @@ <translation id="3258596308407688501">Chromium তার ডেটা ডিরেক্টরিতে পড়তে এবং লিখতে পারে না: <ph name="USER_DATA_DIRECTORY" /></translation> +<translation id="3264279740686075150">Chromium আপনার ডিফল্ট ব্রাউজার। ধন্যবাদ।</translation> <translation id="328888136576916638">Google API কীগুলি অনুপস্থিত৷ Chromium এর কিছু বৈশিষ্ট্য নিষ্ক্রিয় হয়ে যাবে৷</translation> <translation id="3289635842886789612">Chromium পুরানো হয়ে গেছে।</translation> <translation id="3296368748942286671"> Chromium বন্ধ হলে পটভূমির অ্যাপ্লিকেশন চালু রাখুন</translation>
diff --git a/chrome/app/resources/chromium_strings_ca.xtb b/chrome/app/resources/chromium_strings_ca.xtb index 8d86e9c..6cf05f0 100644 --- a/chrome/app/resources/chromium_strings_ca.xtb +++ b/chrome/app/resources/chromium_strings_ca.xtb
@@ -37,6 +37,7 @@ <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> <translation id="225614027745146050">Benvingut</translation> +<translation id="2264142189334629813">Chromium OS no pot obrir aquesta pàgina.</translation> <translation id="2316129865977710310">No, gràcies</translation> <translation id="2347108572062610441">Aquesta extensió ha canviat la pàgina que es mostra quan inicieu Chromium.</translation> <translation id="2372704305038231957">Pot ser que Chromium de 32 bits no funcioni correctament perquè ja no és compatible amb aquest sistema Linux. Feu l'actualització a Chromium de 64 bits.</translation> @@ -75,6 +76,7 @@ <translation id="3258596308407688501">Chromium no pot llegir ni escriure en el directori de dades: <ph name="USER_DATA_DIRECTORY" /></translation> +<translation id="3264279740686075150">Chromium és el navegador predeterminat. Gaudeix-ne.</translation> <translation id="328888136576916638">Falten les claus de l'API de Google. Es desactivaran algunes de les funcions de Chromium.</translation> <translation id="3289635842886789612">Chromium no està actualitzat.</translation> <translation id="3296368748942286671">Continua executant les aplicacions en segon pla quan es tanqui Chromium</translation>
diff --git a/chrome/app/resources/chromium_strings_cs.xtb b/chrome/app/resources/chromium_strings_cs.xtb index 1577d14..07394e9 100644 --- a/chrome/app/resources/chromium_strings_cs.xtb +++ b/chrome/app/resources/chromium_strings_cs.xtb
@@ -39,6 +39,7 @@ <translation id="2158734852934720349">Chromium OS – licence open source</translation> <translation id="2241627712206172106">Pokud počítač sdílíte s kamarády a členy rodiny, každý může web procházet samostatně a nastavit si Chromium podle svých požadavků.</translation> <translation id="225614027745146050">Vítejte</translation> +<translation id="2264142189334629813">Chromium OS tuto stránku nedokáže otevřít.</translation> <translation id="2316129865977710310">Ne, děkuji</translation> <translation id="2347108572062610441">Toto rozšíření změnilo stránku, která se zobrazí při spuštění prohlížeče Chromium.</translation> <translation id="2372704305038231957">32bitová verze prohlížeče Chromium nemusí fungovat správně, protože v tomto systému Linux již není podporována. Nainstalujte prosím 64bitovou verzi prohlížeče Chromium.</translation> @@ -77,6 +78,7 @@ <translation id="3258596308407688501">Chromium nemůže číst ani zapisovat do svého datového adresáře: <ph name="USER_DATA_DIRECTORY" /></translation> +<translation id="3264279740686075150">Vaším výchozím prohlížečem je Chromium. Paráda!</translation> <translation id="328888136576916638">Chybí klíče rozhraní Google API. Některé funkce Chromium nebudou k dispozici.</translation> <translation id="3289635842886789612">Prohlížeč Chromium je zastaralý.</translation> <translation id="3296368748942286671">Po ukončení prohlížeče Chromium nechat aplikace na pozadí spuštěné</translation>
diff --git a/chrome/app/resources/chromium_strings_da.xtb b/chrome/app/resources/chromium_strings_da.xtb index 298e9da..ece95d4 100644 --- a/chrome/app/resources/chromium_strings_da.xtb +++ b/chrome/app/resources/chromium_strings_da.xtb
@@ -37,6 +37,7 @@ <translation id="2158734852934720349">Chromium OS open source-licenser</translation> <translation id="2241627712206172106">Hvis du deler en computer, kan venner og familie browse individuelt og konfigurere Chromium, som de ønsker hver især.</translation> <translation id="225614027745146050">Velkommen</translation> +<translation id="2264142189334629813">Chromium OS kan ikke åbne denne side.</translation> <translation id="2316129865977710310">Nej tak</translation> <translation id="2347108572062610441">Denne udvidelse har ændret din startside i Chromium.</translation> <translation id="2372704305038231957">32-bit Chromium fungerer muligvis ikke korrekt på grund af manglende understøttelse i dette Linux-system. Opgrader til 64-bit Chromium.</translation> @@ -75,6 +76,7 @@ <translation id="3258596308407688501">Chromium kan ikke læse og skrive til sin datamappe: <ph name="USER_DATA_DIRECTORY" /></translation> +<translation id="3264279740686075150">Chromium er din standardbrowser.</translation> <translation id="328888136576916638">Der mangler Google API-nøgler. Nogle funktioner i Chromium deaktiveres.</translation> <translation id="3289635842886789612">Chromium er forældet.</translation> <translation id="3296368748942286671">Fortsæt med at køre baggrundsapps, når Chromium er lukket</translation>
diff --git a/chrome/app/resources/chromium_strings_de.xtb b/chrome/app/resources/chromium_strings_de.xtb index 6eee010..4b761049 100644 --- a/chrome/app/resources/chromium_strings_de.xtb +++ b/chrome/app/resources/chromium_strings_de.xtb
@@ -37,6 +37,7 @@ <translation id="2158734852934720349">Open-Source-Lizenzen für Chromium OS</translation> <translation id="2241627712206172106">Bei gemeinsam genutzten Computern können die verschiedenen Personen separat surfen und Chromium jeweils nach ihren Wünschen einrichten.</translation> <translation id="225614027745146050">Willkommen</translation> +<translation id="2264142189334629813">Chromium OS kann diese Seite nicht öffnen.</translation> <translation id="2316129865977710310">Kein Interesse</translation> <translation id="2347108572062610441">Die beim Start von Chromium angezeigte Seite wurde durch diese Erweiterung geändert.</translation> <translation id="2372704305038231957">Die 32-Bit-Version von Chromium funktioniert unter Umständen nicht ordnungsgemäß, da sie unter diesem Linux-System nicht mehr unterstützt wird. Aktualisieren Sie bitte auf die 64-Bit-Version von Chromium.</translation> @@ -75,6 +76,7 @@ <translation id="3258596308407688501">Chromium kann im folgenden Datenverzeichnis weder lesen noch schreiben: <ph name="USER_DATA_DIRECTORY" /></translation> +<translation id="3264279740686075150">Chromium ist Ihr Standardbrowser. Super!</translation> <translation id="328888136576916638">Google API-Schlüssel fehlen. Einige Funktionen von Chromium sind deaktiviert.</translation> <translation id="3289635842886789612">Chromium ist veraltet.</translation> <translation id="3296368748942286671">Apps weiter im Hintergrund ausführen, wenn Chromium geschlossen wird</translation>
diff --git a/chrome/app/resources/chromium_strings_el.xtb b/chrome/app/resources/chromium_strings_el.xtb index 809a255..83103915 100644 --- a/chrome/app/resources/chromium_strings_el.xtb +++ b/chrome/app/resources/chromium_strings_el.xtb
@@ -37,6 +37,7 @@ <translation id="2158734852934720349">Άδειες λογισμικού ανοικτού κώδικα του Chromium OS</translation> <translation id="2241627712206172106">Αν χρησιμοποιείτε έναν υπολογιστή από κοινού με άλλα άτομα, οι φίλοι και τα μέλη της οικογένειάς σας μπορούν να περιηγούνται αυτόνομα και να ρυθμίζουν το Chromium ακριβώς όπως θέλουν.</translation> <translation id="225614027745146050">Καλώς ορίσατε</translation> +<translation id="2264142189334629813">Το Chromium OS δεν μπορεί να ανοίξει αυτήν τη σελίδα.</translation> <translation id="2316129865977710310">Όχι, ευχαριστώ</translation> <translation id="2347108572062610441">Αυτή η επέκταση άλλαξε τη σελίδα που εμφανίζεται κατά την εκκίνηση του Chromium.</translation> <translation id="2372704305038231957">Το Chromium 32 bit ενδέχεται να μη λειτουργεί σωστά, επειδή δεν υποστηρίζεται πλέον σε αυτό το σύστημα Linux. Αναβαθμίστε σε Chromium 64 bit.</translation> @@ -75,6 +76,7 @@ <translation id="3258596308407688501">Το Chromium δεν έχει δυνατότητα ανάγνωσης και εγγραφής στον κατάλογο δεδομένων του: <ph name="USER_DATA_DIRECTORY" /></translation> +<translation id="3264279740686075150">Το Chromium είναι το προεπιλεγμένο πρόγραμμα περιήγησής σας. Τέλεια!</translation> <translation id="328888136576916638">Λείπουν κλειδιά του Google API. Ορισμένες λειτουργίες του Google Chromium θα απενεργοποιηθούν.</translation> <translation id="3289635842886789612">Το Chromium δεν είναι ενημερωμένο.</translation> <translation id="3296368748942286671">Να συνεχίζεται η εκτέλεση εφαρμογών παρασκηνίου όταν το Chromium είναι κλειστό</translation>
diff --git a/chrome/app/resources/chromium_strings_en-GB.xtb b/chrome/app/resources/chromium_strings_en-GB.xtb index db02e9b1..1433292 100644 --- a/chrome/app/resources/chromium_strings_en-GB.xtb +++ b/chrome/app/resources/chromium_strings_en-GB.xtb
@@ -39,6 +39,7 @@ <translation id="2158734852934720349">Chromium OS open source licences</translation> <translation id="2241627712206172106">If you share a computer, friends and family can browse separately and set up Chromium just the way they want.</translation> <translation id="225614027745146050">Welcome</translation> +<translation id="2264142189334629813">Chromium OS cannot open this page.</translation> <translation id="2316129865977710310">No, thank you</translation> <translation id="2347108572062610441">This extension has changed the page that is shown when you start Chromium.</translation> <translation id="2372704305038231957">32-bit Chromium may not function correctly because it is no longer supported on this Linux system. Please upgrade to 64-bit Chromium.</translation> @@ -77,6 +78,7 @@ <translation id="3258596308407688501">Chromium cannot read and write to its data directory: <ph name="USER_DATA_DIRECTORY" /></translation> +<translation id="3264279740686075150">Chromium is your default browser. Cheers.</translation> <translation id="328888136576916638">Google API keys are missing. Some functionality of Chromium will be disabled.</translation> <translation id="3289635842886789612">Chromium is out of date.</translation> <translation id="3296368748942286671">Continue running background apps when Chromium is closed</translation>
diff --git a/chrome/app/resources/chromium_strings_es-419.xtb b/chrome/app/resources/chromium_strings_es-419.xtb index 0dd63f6..48ea74f 100644 --- a/chrome/app/resources/chromium_strings_es-419.xtb +++ b/chrome/app/resources/chromium_strings_es-419.xtb
@@ -37,6 +37,7 @@ <translation id="2158734852934720349">Licencias de código abierto del Sistema operativo Chromium</translation> <translation id="2241627712206172106">Si compartes una computadora, tus amigos y familiares pueden navegar de forma independiente y configurar Chromium según los gustos individuales.</translation> <translation id="225614027745146050">Bienvenido</translation> +<translation id="2264142189334629813">El Sistema operativo Chromium no puede abrir esta página.</translation> <translation id="2316129865977710310">No, gracias</translation> <translation id="2347108572062610441">Esta extensión cambió la página que se muestra al iniciar Chromium.</translation> <translation id="2372704305038231957">Es posible que Chromium de 32 bits no funcione correctamente porque ya no es compatible con este sistema Linux. Actualiza a Chromium de 64 bits.</translation> @@ -73,6 +74,7 @@ <translation id="3190315855212034486">¡Vaya! Se ha producido un bloqueo en Chromium. ¿Quieres reiniciar el navegador ahora?</translation> <translation id="3256316712990552818">Se copió en Chromium.</translation> <translation id="3258596308407688501">Chromium no puede leer y escribir en su directorio de datos: <ph name="USER_DATA_DIRECTORY" /></translation> +<translation id="3264279740686075150">Chromium es tu navegador predeterminado.</translation> <translation id="328888136576916638">Faltan las claves de la API de Google. Se inhabilitarán algunas funciones de Chromium.</translation> <translation id="3289635842886789612">Chromium no está actualizado.</translation> <translation id="3296368748942286671">Continuar ejecutando aplicaciones en segundo plano cuando Chromium esté cerrado.</translation> @@ -234,7 +236,7 @@ <translation id="8134284582177628525">Si compartes esta computadora con <ph name="PROFILE_NAME" />, agrégate a Chromium para navegar de manera independiente. De lo contrario, desconecta la cuenta de Google del otro usuario.</translation> <translation id="81770708095080097">Chromium bloqueó este archivo porque es peligroso.</translation> <translation id="8269379391216269538">Ayudar a mejorar Chromium</translation> -<translation id="8290862415967981663">Chromium bloqueó este archivo porque es posible que sea peligroso.</translation> +<translation id="8290862415967981663">Chromium bloqueó este archivo porque podría ser peligroso.</translation> <translation id="8453117565092476964">El instalador está dañado o no es válido. Descarga Chromium nuevamente.</translation> <translation id="8493179195440786826">Chromium no actualizado</translation> <translation id="85843667276690461">Obtener ayuda para usar Chromium</translation>
diff --git a/chrome/app/resources/chromium_strings_es.xtb b/chrome/app/resources/chromium_strings_es.xtb index b886bf79..72781dc 100644 --- a/chrome/app/resources/chromium_strings_es.xtb +++ b/chrome/app/resources/chromium_strings_es.xtb
@@ -39,6 +39,7 @@ <translation id="2158734852934720349">Licencias de código abierto de Chromium OS</translation> <translation id="2241627712206172106">Si compartes un ordenador, tus amigos y familiares pueden navegar de forma independiente y configurar Chromium a su gusto.</translation> <translation id="225614027745146050">Te damos la bienvenida</translation> +<translation id="2264142189334629813">Chromium OS no puede abrir esta página.</translation> <translation id="2316129865977710310">No, gracias</translation> <translation id="2347108572062610441">Esta extensión ha cambiado la página que se muestra al iniciar Chromium.</translation> <translation id="2372704305038231957">Es posible que Chromium (32 bits) no funcione correctamente porque ya no es compatible con este sistema Linux. Actualiza Chromium a la versión de 64 bits.</translation> @@ -77,6 +78,7 @@ <translation id="3258596308407688501">Chromium no puede leer el directorio de datos ni escribir en él: <ph name="USER_DATA_DIRECTORY" /></translation> +<translation id="3264279740686075150">Chromium es tu navegador predeterminado.</translation> <translation id="328888136576916638">Faltan las claves de la API de Google. Se inhabilitarán algunas funciones de Chromium.</translation> <translation id="3289635842886789612">Chromium no está actualizado.</translation> <translation id="3296368748942286671">Seguir ejecutando aplicaciones en segundo plano al cerrar Chromium</translation>
diff --git a/chrome/app/resources/chromium_strings_et.xtb b/chrome/app/resources/chromium_strings_et.xtb index bc099e01..8947839 100644 --- a/chrome/app/resources/chromium_strings_et.xtb +++ b/chrome/app/resources/chromium_strings_et.xtb
@@ -37,6 +37,7 @@ <translation id="2158734852934720349">Chromium OS-i avatud lähtekoodi litsentsid</translation> <translation id="2241627712206172106">Kui jagate arvutit, saavad sõbrad ja pereliikmed eraldi sirvida ning seadistada Chromiumi just nii, nagu neile meeldib.</translation> <translation id="225614027745146050">Tere tulemast</translation> +<translation id="2264142189334629813">Chromium OS ei saa lehte avada.</translation> <translation id="2316129865977710310">Ei, aitäh</translation> <translation id="2347108572062610441">See laiendus muutis seda, milline leht kuvatakse Chromiumi käivitamisel.</translation> <translation id="2372704305038231957">32-bitine Chromium ei pruugi õigesti töötada, kuna seda ei toetata enam selles Linuxi süsteemis. Viige Chromium üle 64-bitisele versioonile.</translation> @@ -75,6 +76,7 @@ <translation id="3258596308407688501">Chromium ei saa andmekataloogi lugeda ega sellesse kirjutada: <ph name="USER_DATA_DIRECTORY" /></translation> +<translation id="3264279740686075150">Chromium on teie vaikebrauser. Täname!</translation> <translation id="328888136576916638">Google API võtmed on puudu. Teatud Chromiumi funktsioonid keelatakse.</translation> <translation id="3289635842886789612">Chromium on aegunud.</translation> <translation id="3296368748942286671">Jätka taustarakenduste käitamist pärast Chromiumi sulgemist</translation>
diff --git a/chrome/app/resources/chromium_strings_fa.xtb b/chrome/app/resources/chromium_strings_fa.xtb index 2d959938..7572cbbc 100644 --- a/chrome/app/resources/chromium_strings_fa.xtb +++ b/chrome/app/resources/chromium_strings_fa.xtb
@@ -37,6 +37,7 @@ <translation id="2158734852934720349">مجوزهای منبع باز سیستم عامل Chromium</translation> <translation id="2241627712206172106">اگر رایانهای را به صورت مشترک استفاده میکنید، دوستان و خانواده میتوانند به صورت جداگانه مرور کنند و Chromium را به صورتی که مایلند تنظیم کنند.</translation> <translation id="225614027745146050">خوش آمدید</translation> +<translation id="2264142189334629813">سیستم عامل Chromium نمیتواند این صفحه را باز کند.</translation> <translation id="2316129865977710310">نه متشکرم</translation> <translation id="2347108572062610441">این افزونه، صفحهای را تغییر داده است که هنگام راهاندازی Chromium نشان داده میشود.</translation> <translation id="2372704305038231957">ممکن است Chromium ۳۲ بیتی عملکرد درستی نداشته باشد زیرا دیگر در این سیستم Linux پشتیبانی نمیشود. لطفاً به Chromium ۶۴ بیتی ارتقا دهید.</translation> @@ -74,6 +75,7 @@ <translation id="3256316712990552818">به Chromium کپی شد</translation> <translation id="3258596308407688501">Chromium نمیتواند مسیر دادههای خود را بخواند یا در آن بنویسد: <ph name="USER_DATA_DIRECTORY" /></translation> +<translation id="3264279740686075150">Chromium مرورگر پیشفرضتان است. هورا.</translation> <translation id="328888136576916638">کلیدهای Google API وجود ندارند. برخی از عملکردهای Chromium از کار خواهند افتاد.</translation> <translation id="3289635842886789612">نسخه Chromium قدیمی است.</translation> <translation id="3296368748942286671">ادامه اجرای برنامهها در پسزمینه هنگامیکه Chromium بسته میشود</translation>
diff --git a/chrome/app/resources/chromium_strings_fi.xtb b/chrome/app/resources/chromium_strings_fi.xtb index ebb4c7d..534026ac 100644 --- a/chrome/app/resources/chromium_strings_fi.xtb +++ b/chrome/app/resources/chromium_strings_fi.xtb
@@ -37,6 +37,7 @@ <translation id="2158734852934720349">Chromium-käyttöjärjestelmän avoimen lähdekoodin lisenssit</translation> <translation id="2241627712206172106">Jos käytät jaettua tietokonetta, kaverisi ja perheenjäsenesi voivat selata verkkoa omista profiileistaan käsin ja muokata Chromiumista juuri itselleen sopivan.</translation> <translation id="225614027745146050">Tervetuloa</translation> +<translation id="2264142189334629813">Chromium-käyttöjärjestelmä ei voi avata tätä sivua.</translation> <translation id="2316129865977710310">Ei kiitos</translation> <translation id="2347108572062610441">Tämä laajennus on vaihtanut Chromiumin aloitussivun.</translation> <translation id="2372704305038231957">32-bittinen Chromium ei ehkä toimi oikein, koska sen käyttöä tällä Linux-järjestelmällä ei enää tueta. Päivitä Chromium 64-bittiseen versioon.</translation> @@ -75,6 +76,7 @@ <translation id="3258596308407688501">Chromium ei voi lukea tietohakemistoaan ja kirjoittaa siihen: <ph name="USER_DATA_DIRECTORY" /></translation> +<translation id="3264279740686075150">Hienoa! Chromium on nyt oletusselaimesi.</translation> <translation id="328888136576916638">Googlen sovellusliittymän avaimet puuttuvat. Jotkin Chromiumin toiminnoista poistetaan käytöstä.</translation> <translation id="3289635842886789612">Chromium on vanhentunut.</translation> <translation id="3296368748942286671">Jätä taustasovellukset käyntiin, kun Chromium suljetaan</translation>
diff --git a/chrome/app/resources/chromium_strings_fil.xtb b/chrome/app/resources/chromium_strings_fil.xtb index 24dbc0d..631e6cf 100644 --- a/chrome/app/resources/chromium_strings_fil.xtb +++ b/chrome/app/resources/chromium_strings_fil.xtb
@@ -39,6 +39,7 @@ <translation id="2158734852934720349">Mga lisensya ng open source ng Chromium OS</translation> <translation id="2241627712206172106">Kung nagpapahiram ka ng computer, ang mga kaibigan at kapamilya ay maaaring mag-browse nang hiwalay at i-set up ang Chromium sa paraang gusto nila.</translation> <translation id="225614027745146050">Maligayang pagdating</translation> +<translation id="2264142189334629813">Hindi mabubuksan ng Chromium OS ang page na ito.</translation> <translation id="2316129865977710310">Hindi, salamat</translation> <translation id="2347108572062610441">Binago ng extension na ito ang ipinapakitang page kapag sinimulan mo ang Chronium.</translation> <translation id="2372704305038231957">Maaaring hindi gumana nang maayos ang 32-bit na Chromium dahil hindi na ito sinusuportahan sa Linux system na ito. Mangyaring mag-upgrade sa 64-bit na Chromium.</translation> @@ -77,6 +78,7 @@ <translation id="3258596308407688501">Hindi makakapag-read at makakapag-write ang Chromium sa direktoryo ng data nito: <ph name="USER_DATA_DIRECTORY" /></translation> +<translation id="3264279740686075150">Chromium ang iyong default na browser. Magsaya.</translation> <translation id="328888136576916638">Nawawala ang mga Google API key. Madi-disable ang ilang pagpapagana ng Chromium.</translation> <translation id="3289635842886789612">Luma na ang Chromium.</translation> <translation id="3296368748942286671">Patuloy na magpatakbo ng background na apps kapag nakasara ang Chromium</translation>
diff --git a/chrome/app/resources/chromium_strings_fr.xtb b/chrome/app/resources/chromium_strings_fr.xtb index 5a1cf42..3651770 100644 --- a/chrome/app/resources/chromium_strings_fr.xtb +++ b/chrome/app/resources/chromium_strings_fr.xtb
@@ -38,6 +38,7 @@ <translation id="2158734852934720349">Licences Chromium OS Open Source</translation> <translation id="2241627712206172106">Si vous partagez un ordinateur avec vos proches, ceux-ci peuvent configurer Chromium comme bon leur semble et naviguer sur le Web à leur manière.</translation> <translation id="225614027745146050">Bienvenue</translation> +<translation id="2264142189334629813">Impossible d'ouvrir cette page dans Chromium OS</translation> <translation id="2316129865977710310">Non merci</translation> <translation id="2347108572062610441">Cette extension a modifié la page qui s'affiche lorsque vous démarrez Chromium.</translation> <translation id="2372704305038231957">Chromium 32 bits risque de ne pas fonctionner correctement, car la compatibilité n'est plus assurée sur ce système Linux. Veuillez passer à Chromium 64 bits.</translation> @@ -76,6 +77,7 @@ <translation id="3258596308407688501">Chromium ne peut ni lire, ni écrire dans son répertoire de données : <ph name="USER_DATA_DIRECTORY" /></translation> +<translation id="3264279740686075150">Chromium est votre navigateur par défaut. Félicitations !</translation> <translation id="328888136576916638">Les clés d'API Google sont manquantes. Certaines fonctionnalités de Chromium vont être désactivées.</translation> <translation id="3289635842886789612">Version de Chromium obsolète.</translation> <translation id="3296368748942286671">Poursuivre l'exécution des applications en arrière-plan après la fermeture de Chromium</translation>
diff --git a/chrome/app/resources/chromium_strings_gu.xtb b/chrome/app/resources/chromium_strings_gu.xtb index 0ed0f402..da37732 100644 --- a/chrome/app/resources/chromium_strings_gu.xtb +++ b/chrome/app/resources/chromium_strings_gu.xtb
@@ -39,6 +39,7 @@ <translation id="2158734852934720349">Chromium OS ખુલ્લા સ્ત્રોત લાઇસેંસેસ</translation> <translation id="2241627712206172106">જો તમે કમ્પ્યુટરને શેર કરો છો, તો મિત્રો અને કુટુંબીજનો અલગ-અલગ બ્રાઉઝ કરી અને તેમને જોઇએ તેમ Chromium ને સેટ કરી શકે છે.</translation> <translation id="225614027745146050">સ્વાગત છે</translation> +<translation id="2264142189334629813">Chromium OS આ પૃષ્ઠને ખોલી શકતું નથી.</translation> <translation id="2316129865977710310">નહીં, આભાર</translation> <translation id="2347108572062610441">જ્યારે તમે Chromium શરૂ કરો છો ત્યારે જે પૃષ્ઠ દર્શાવવામાં આવે છે તે આ એક્સટેન્શને બદલ્યું છે.</translation> <translation id="2372704305038231957">32-બિટ Chromium યોગ્ય રીતે કાર્ય ન કરે તેવું બની શકે કારણ કે તે હવે આ Linux સિસ્ટમ પર સમર્થિત નથી. કૃપા કરીને 64-બિટ Chromium પર અપગ્રેડ કરો.</translation> @@ -78,6 +79,7 @@ <translation id="3258596308407688501">Chromium તેની ડેટા નિર્દેશિકા વાંચી અથવા લખી શકતુ નથી: <ph name="USER_DATA_DIRECTORY" /></translation> +<translation id="3264279740686075150">Chromium તમારું ડિફૉલ્ટ બ્રાઉઝર છે. વાહ.</translation> <translation id="328888136576916638">Google API કીઝ ખૂટે છે. Chromium ની કેટલીક કાર્યક્ષમતા અક્ષમ થશે.</translation> <translation id="3289635842886789612">Chromium જૂનું થઈ ગયું છે.</translation> <translation id="3296368748942286671">જ્યારે Chromium બંધ થાય ત્યારે પૃષ્ઠભૂમિ ઍપ્લિકેશનો ચલાવવાનું ચાલુ રાખો</translation>
diff --git a/chrome/app/resources/chromium_strings_hi.xtb b/chrome/app/resources/chromium_strings_hi.xtb index e9aa0f6..19f74bb 100644 --- a/chrome/app/resources/chromium_strings_hi.xtb +++ b/chrome/app/resources/chromium_strings_hi.xtb
@@ -37,6 +37,7 @@ <translation id="2158734852934720349">क्रोमियम OS ओपन सोर्स लाइसेंस</translation> <translation id="2241627712206172106">यदि आप किसी कंप्यूटर को साझा करते हैं, तो मित्र और परिवार अलग-अलग ब्राउज़ कर सकते हैं और क्रोमियम को जैसा चाहें सेट कर सकते हैं.</translation> <translation id="225614027745146050">आपका स्वागत है</translation> +<translation id="2264142189334629813">Chromium OS इस पृष्ठ को नहीं खोल सकता.</translation> <translation id="2316129865977710310">जी रहने दें</translation> <translation id="2347108572062610441">इस एक्सटेंशन ने यह बदल दिया है कि जब आप क्रोमियम प्रारंभ करते हैं तब कौन सा पृष्ठ दिखाया जाए.</translation> <translation id="2372704305038231957">हो सकता है 32-बिट क्रोमियम सही तरीके से काम ना करे क्योंकि अब वह इस Linux सिस्टम पर समर्थित नहीं है. कृपया 64-बिट क्रोमियम में अपग्रेड करें.</translation> @@ -75,6 +76,7 @@ <translation id="3258596308407688501">क्रोमियम इसकी डेटा निर्देशिका में पढ़ या लिख नहीं सकता: <ph name="USER_DATA_DIRECTORY" /></translation> +<translation id="3264279740686075150">Chromium आपका डिफ़ॉल्ट ब्राउज़र है. क्या बात है.</translation> <translation id="328888136576916638">Google API कुंजियां अनुपलब्ध हैं. क्रोमियम की कुछ कार्यक्षमता अक्षम कर दी जाएगी.</translation> <translation id="3289635842886789612">क्रोमियम पुराना हो गया है.</translation> <translation id="3296368748942286671">जब क्रोमियम बंद हो तब पृष्ठभूमि ऐप्लिकेशन चलाना जारी रखें</translation>
diff --git a/chrome/app/resources/chromium_strings_hr.xtb b/chrome/app/resources/chromium_strings_hr.xtb index 83ed0ec..56ddf5a5 100644 --- a/chrome/app/resources/chromium_strings_hr.xtb +++ b/chrome/app/resources/chromium_strings_hr.xtb
@@ -37,6 +37,7 @@ <translation id="2158734852934720349">Licence otvorenog izvornog koda OS-a Chromium</translation> <translation id="2241627712206172106">Ako dijelite računalo, prijatelji i članovi obitelji mogu zasebno pregledavati i postaviti Chromium prema svojim željama.</translation> <translation id="225614027745146050">Dobro došli</translation> +<translation id="2264142189334629813">OS Chromium ne može otvoriti ovu stranicu.</translation> <translation id="2316129865977710310">Ne, hvala</translation> <translation id="2347108572062610441">Ovo proširenje promijenilo je stranicu koja se prikazuje prilikom pokretanja Chromiuma.</translation> <translation id="2372704305038231957">32-bitni Chromium možda neće ispravno raditi jer više nije podržan na ovom sustavu Linuxa. Nadogradite na 64-bitni Chromium.</translation> @@ -75,6 +76,7 @@ <translation id="3258596308407688501">Chromium ne može čitati iz svojeg podatkovnog direktorija niti u njega pisati: <ph name="USER_DATA_DIRECTORY" /></translation> +<translation id="3264279740686075150">Chromium je vaš zadani preglednik. Živjeli.</translation> <translation id="328888136576916638">Nedostaju ključevi Google API-ja. Neke funkcije Chromiuma bit će onemogućene.</translation> <translation id="3289635842886789612">Chromium je zastario.</translation> <translation id="3296368748942286671">Nastavi izvršavati pozadinske aplikacije po zatvaranju preglednika Chromium</translation>
diff --git a/chrome/app/resources/chromium_strings_hu.xtb b/chrome/app/resources/chromium_strings_hu.xtb index d25901319..4849c1b 100644 --- a/chrome/app/resources/chromium_strings_hu.xtb +++ b/chrome/app/resources/chromium_strings_hu.xtb
@@ -37,6 +37,7 @@ <translation id="2158734852934720349">Chromium OS nyílt forráskódú licencek</translation> <translation id="2241627712206172106">Ha megoszt egy számítógépet, ismerősei és családtagjai külön fiókokban internetezve a saját kívánságaik szerint állíthatják be a Chromiumot.</translation> <translation id="225614027745146050">Üdvözöljük</translation> +<translation id="2264142189334629813">A Chromium OS nem tudja megnyitni ezt az oldalt.</translation> <translation id="2316129865977710310">Köszönöm, nem</translation> <translation id="2347108572062610441">Ez a bővítmény módosította, hogy melyik oldal jelenjen meg a Chromium indításakor.</translation> <translation id="2372704305038231957">Előfordulhat, hogy a 32 bites Chromium nem fog megfelelően működni, mert a továbbiakban már nem támogatja ezt a Linux rendszert. Kérjük, frissítsen a Chromium 64 bites változatára.</translation> @@ -75,6 +76,7 @@ <translation id="3258596308407688501">A Chromium nem tudja olvasni és írni az adatkönyvtárát: <ph name="USER_DATA_DIRECTORY" /></translation> +<translation id="3264279740686075150">A Chromium az alapértelmezett böngésző. Hurrá!</translation> <translation id="328888136576916638">Hiányoznak Google API-kulcsok. A Chromium egyes funkciói kikapcsolnak.</translation> <translation id="3289635842886789612">A Chromium elavult.</translation> <translation id="3296368748942286671">A háttéralkalmazások továbbfuttatása, ha a Chromiumot bezárják</translation>
diff --git a/chrome/app/resources/chromium_strings_id.xtb b/chrome/app/resources/chromium_strings_id.xtb index 13fb5bf..7725900 100644 --- a/chrome/app/resources/chromium_strings_id.xtb +++ b/chrome/app/resources/chromium_strings_id.xtb
@@ -37,6 +37,7 @@ <translation id="2158734852934720349">Lisensi sumber terbuka Chromium OS</translation> <translation id="2241627712206172106">Jika Anda berbagi komputer, teman dan keluarga bisa menjelajah secara terpisah dan menyiapkan Chromium sesuai keinginannya.</translation> <translation id="225614027745146050">Selamat Datang</translation> +<translation id="2264142189334629813">Chromium OS tidak dapat membuka laman ini.</translation> <translation id="2316129865977710310">Lain kali</translation> <translation id="2347108572062610441">Ekstensi ini telah mengubah apa yang ditampilkan oleh laman saat Anda memulai Chromium.</translation> <translation id="2372704305038231957">Chromium 32-bit mungkin tidak berfungsi dengan semestinya karena sudah tidak didukung di sistem Linux ini. Tingkatkan versi ke Chromium 64-bit.</translation> @@ -75,6 +76,7 @@ <translation id="3258596308407688501">Chromium tidak dapat membaca dan menulis ke direktori datanya: <ph name="USER_DATA_DIRECTORY" /></translation> +<translation id="3264279740686075150">Chromium adalah browser default Anda. Hore!</translation> <translation id="328888136576916638">Kunci API Google tidak ada. Beberapa fungsi Chromium tidak akan berfungsi.</translation> <translation id="3289635842886789612">Chromium sudah usang.</translation> <translation id="3296368748942286671">Lanjutkan aplikasi yang berjalan di latar belakang jika Chromium ditutup</translation>
diff --git a/chrome/app/resources/chromium_strings_it.xtb b/chrome/app/resources/chromium_strings_it.xtb index d166194..33597b0 100644 --- a/chrome/app/resources/chromium_strings_it.xtb +++ b/chrome/app/resources/chromium_strings_it.xtb
@@ -37,6 +37,7 @@ <translation id="2158734852934720349">Licenze open source di Chromium OS</translation> <translation id="2241627712206172106">Se condividi un computer, i tuoi amici e la tua famiglia possono navigare separatamente e configurare Chromium in base alle proprie esigenze.</translation> <translation id="225614027745146050">Benvenuto</translation> +<translation id="2264142189334629813">Impossibile aprire questa pagina in Chromium OS.</translation> <translation id="2316129865977710310">No, grazie</translation> <translation id="2347108572062610441">Questa estensione ha cambiato la pagina mostrata all'avvio di Chromium.</translation> <translation id="2372704305038231957">Chromium a 32 bit potrebbe non funzionare correttamente perché non è più supportato su questo sistema Linux. Esegui l'upgrade a Chromium a 64 bit.</translation> @@ -75,6 +76,7 @@ <translation id="3258596308407688501">Chromium non è in grado di leggere e scrivere nella directory dei dati: <ph name="USER_DATA_DIRECTORY" /></translation> +<translation id="3264279740686075150">Chromium è il tuo browser predefinito.</translation> <translation id="328888136576916638">Mancano le chiavi dell'API di Google. Alcune funzionalità di Chromium verranno disattivate.</translation> <translation id="3289635842886789612">Chromium non è aggiornato.</translation> <translation id="3296368748942286671">Continua a eseguire applicazioni in background dopo la chiusura di Chromium</translation>
diff --git a/chrome/app/resources/chromium_strings_iw.xtb b/chrome/app/resources/chromium_strings_iw.xtb index b03f650..5da1c9d 100644 --- a/chrome/app/resources/chromium_strings_iw.xtb +++ b/chrome/app/resources/chromium_strings_iw.xtb
@@ -37,6 +37,7 @@ <translation id="2158734852934720349">רישיונות קוד פתוח של מערכת ההפעלה של Chromium</translation> <translation id="2241627712206172106">אם אתה משתף מחשב, חברים ובני משפחה יכולים לגלוש בנפרד ולהגדיר את Chromium בדיוק כפי שהם רוצים.</translation> <translation id="225614027745146050">ברוכים הבאים</translation> +<translation id="2264142189334629813">לא ניתן לפתוח דף זה ב-Chromium OS.</translation> <translation id="2316129865977710310">לא, תודה</translation> <translation id="2347108572062610441">התוסף שינה את הדף שמוצג כשאתה מפעיל את Chromium.</translation> <translation id="2372704305038231957">ייתכן ש-Chromium ב-32 סיביות לא יפעל כראוי כי אינו נתמך יותר במערכת Linux זו. שדרג ל-Chromium ב-64 סיביות.</translation> @@ -73,6 +74,7 @@ <translation id="3190315855212034486">וואו! Chromium קרס. להפעיל מחדש עכשיו?</translation> <translation id="3256316712990552818">הועתק אל Chromium</translation> <translation id="3258596308407688501">Chromium אינו יכול לקרוא ולכתוב בספריית הנתונים שלו: <ph name="USER_DATA_DIRECTORY" /></translation> +<translation id="3264279740686075150">נהדר, Chromium הוגדר כדפדפן ברירת המחדל.</translation> <translation id="328888136576916638">המפתחות של Google API חסרים. פונקציונליות מסוימת של Chromium תהיה מושבתת.</translation> <translation id="3289635842886789612">Chromium אינו מעודכן.</translation> <translation id="3296368748942286671">המשך הפעלת יישומים ברקע כאשר Chromium סגור</translation>
diff --git a/chrome/app/resources/chromium_strings_ja.xtb b/chrome/app/resources/chromium_strings_ja.xtb index cd81302..13aa680b 100644 --- a/chrome/app/resources/chromium_strings_ja.xtb +++ b/chrome/app/resources/chromium_strings_ja.xtb
@@ -37,6 +37,7 @@ <translation id="2158734852934720349">Chromium OS オープンソース ライセンス</translation> <translation id="2241627712206172106">パソコンを共有している場合、友だちや家族はそれぞれ Chromium を自分専用のブラウザとして自分用の設定をして使うことができます。</translation> <translation id="225614027745146050">ようこそ</translation> +<translation id="2264142189334629813">Chromium OS ではこのページを開けません。</translation> <translation id="2316129865977710310">いいえ</translation> <translation id="2347108572062610441">この拡張機能により、Chromium の起動時に表示されるページが変更されました。</translation> <translation id="2372704305038231957">この Linux システムはサポートされなくなったため、32 ビットの Chromium は正常に機能しない可能性があります。64 ビットの Chromium にアップグレードしてください。</translation> @@ -75,6 +76,7 @@ <translation id="3258596308407688501">Chromium はこのデータ ディレクトリへの読み書きを実行できません: <ph name="USER_DATA_DIRECTORY" /></translation> +<translation id="3264279740686075150">Chromium は既定のブラウザです。</translation> <translation id="328888136576916638">Google API キーが欠落しています。Chromium の一部の機能は無効になります。</translation> <translation id="3289635842886789612">Chromium は古いバージョンです。</translation> <translation id="3296368748942286671">Chromium を閉じた際にバックグラウンド アプリの処理を続行する</translation>
diff --git a/chrome/app/resources/chromium_strings_kn.xtb b/chrome/app/resources/chromium_strings_kn.xtb index a62ea89d..9169842 100644 --- a/chrome/app/resources/chromium_strings_kn.xtb +++ b/chrome/app/resources/chromium_strings_kn.xtb
@@ -37,6 +37,7 @@ <translation id="2158734852934720349">Chromium OS ಮುಕ್ತ ಮೂಲ ಪರವಾನಗಿಗಳು</translation> <translation id="2241627712206172106">ನೀವು ಕಂಪ್ಯೂಟರ್ ಅನ್ನು ಹಂಚಿಕೊಂಡರೆ, ಸ್ನೇಹಿತರು ಮತ್ತು ಕುಟುಂಬದವರು ಪ್ರತ್ಯೇಕವಾಗಿ ಬ್ರೌಸ್ ಮಾಡಬಹುದು ಮತ್ತು Chromium ಅನ್ನು ಅವರಿಗೆ ಬೇಕಾದಂತೆ ಹೊಂದಿಸಿಕೊಳ್ಳಬಹುದು.</translation> <translation id="225614027745146050">ಸ್ವಾಗತ</translation> +<translation id="2264142189334629813">Chromium OS ಗೆ ಈ ಪುಟವನ್ನು ತೆರೆಯಲಾಗುವುದಿಲ್ಲ.</translation> <translation id="2316129865977710310">ಬೇಡ, ಧನ್ಯವಾದಗಳು</translation> <translation id="2347108572062610441">ನೀವು Chromium ಪ್ರಾರಂಭಿಸಿದಾಗ ಯಾವ ಪುಟ ತೋರಿಸಬೇಕೆಂಬುದನ್ನು ಈ ವಿಸ್ತರಣೆಯು ಬದಲಾಯಿಸಿದೆ.</translation> <translation id="2372704305038231957">ಈ Linux ಸಿಸ್ಟಂನಲ್ಲಿ ಇನ್ನು ಮುಂದೆ 32-ಬಿಟ್ Chromium ಬೆಂಬಲಿಸದಿರುವ ಕಾರಣದಿಂದ ಅದು ಸರಿಯಾಗಿ ಕಾರ್ಯನಿರ್ವಹಿಸದೇ ಇರಬಹುದು. 64-ಬಿಟ್ Chromium ಗೆ ಅಪ್ಗ್ರೇಡ್ ಮಾಡಿ.</translation> @@ -73,6 +74,7 @@ <translation id="3190315855212034486">ಓಹ್! Chromium ಕ್ರ್ಯಾಶ್ ಆಗಿದೆ. ಮತ್ತೊಮ್ಮೆ ಪ್ರಾರಂಭಿಸುವುದೇ?</translation> <translation id="3256316712990552818">Chromium ಗೆ ನಕಲಿಸಲಾಗಿದೆ</translation> <translation id="3258596308407688501">Chromium ಗೆ ಇದರ ಡೇಟಾ ಡೈರೆಕ್ಟರಿಯನ್ನು ಓದಲಾಗುವುದಿಲ್ಲ ಮತ್ತು ಬರೆಯಲಾಗುವುದಿಲ್ಲ: <ph name="USER_DATA_DIRECTORY" /></translation> +<translation id="3264279740686075150">Chromium ನಿಮ್ಮ ಡಿಫಾಲ್ಟ್ ಬ್ರೌಸರ್ ಆಗಿದೆ. ಚೀರ್ಸ್.</translation> <translation id="328888136576916638">Google API ಕೀಗಳು ಕಾಣೆಯಾಗಿವೆ. Chromium ನ ಕೆಲವು ಕಾರ್ಯವಿಧಾನಗಳನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗುತ್ತದೆ.</translation> <translation id="3289635842886789612">Chromium ನ ಅವಧಿ ಮುಗಿದಿದೆ.</translation> <translation id="3296368748942286671">Chromium ಮುಚ್ಚಿದಾಗ ರನ್ ಆಗುತ್ತಿರುವ ಹಿನ್ನೆಲೆ ಅಪ್ಲಿಕೇಶನ್ಗಳನ್ನು ಮುಂದುವರಿಸು</translation>
diff --git a/chrome/app/resources/chromium_strings_ko.xtb b/chrome/app/resources/chromium_strings_ko.xtb index 7ea68ba..4c57792 100644 --- a/chrome/app/resources/chromium_strings_ko.xtb +++ b/chrome/app/resources/chromium_strings_ko.xtb
@@ -39,6 +39,7 @@ <translation id="2158734852934720349">Chromium OS 오픈소스 라이선스</translation> <translation id="2241627712206172106">컴퓨터를 공유하는 경우 친구와 가족이 개별적으로 탐색하고 원하는 대로 Chromium을 설정할 수 있습니다.</translation> <translation id="225614027745146050">환영합니다.</translation> +<translation id="2264142189334629813">Chromium OS에서 이 페이지를 열 수 없음</translation> <translation id="2316129865977710310">아니요, 괜찮습니다.</translation> <translation id="2347108572062610441">Chromium을 시작하면 표시되는 페이지가 이 확장 프로그램으로 인해 변경되었습니다.</translation> <translation id="2372704305038231957">이 Linux 시스템에서 더 이상 32비트 Chromium이 지원되지 않으므로 Chromium이 올바르게 작동하지 않을 수 있습니다. 64비트 Chromium으로 업그레이드하세요.</translation> @@ -77,6 +78,7 @@ <translation id="3258596308407688501">Chromium에서 데이터 디렉토리를 읽고 쓸 수 없습니다. <ph name="USER_DATA_DIRECTORY" /></translation> +<translation id="3264279740686075150">Chromium이 기본 브라우저입니다.</translation> <translation id="328888136576916638">Google API 키가 누락되었습니다. Chromium의 일부 기능이 사용 중지됩니다.</translation> <translation id="3289635842886789612">Chromium이 이전 버전임</translation> <translation id="3296368748942286671">Chromium 종료 후에도 백그라운드 앱을 계속 실행</translation>
diff --git a/chrome/app/resources/chromium_strings_lt.xtb b/chrome/app/resources/chromium_strings_lt.xtb index 73393518..929d15ad 100644 --- a/chrome/app/resources/chromium_strings_lt.xtb +++ b/chrome/app/resources/chromium_strings_lt.xtb
@@ -39,6 +39,7 @@ <translation id="2158734852934720349">„Chromium“ OS atvirojo šaltinio licencijos</translation> <translation id="2241627712206172106">Jei bendrinate kompiuterį, šeimos nariai ir draugai gali naršyti atskirai ir nustatyti „Chromium“ pagal savo poreikius.</translation> <translation id="225614027745146050">Sveiki</translation> +<translation id="2264142189334629813">„Chromium“ OS negali atidaryti šio puslapio.</translation> <translation id="2316129865977710310">Ačiū, ne</translation> <translation id="2347108572062610441">Šis plėtinys pakeitė, kuris puslapis rodomas paleidus „Chromium“.</translation> <translation id="2372704305038231957">32 bitų „Chromium“ gali tinkamai neveikti, nes ji nebepalaikoma naudojant šią „Linux“ sistemą. Naujovinkite į 64 bitų „Chromium“.</translation> @@ -77,6 +78,7 @@ <translation id="3258596308407688501">„Chromium“ negali skaityti ir rašyti į duomenų katalogą: <ph name="USER_DATA_DIRECTORY" /></translation> +<translation id="3264279740686075150">„Chromium“ yra numatytoji naršyklė. Puiku!</translation> <translation id="328888136576916638">Trūksta „Google“ API raktų. Bus išjungtos kai kurios „Chromium“ funkcijos.</translation> <translation id="3289635842886789612">„Chromium“ versija pasenusi.</translation> <translation id="3296368748942286671">Toliau vykdyti fonines programas, kai „Chromium“ uždaroma</translation>
diff --git a/chrome/app/resources/chromium_strings_lv.xtb b/chrome/app/resources/chromium_strings_lv.xtb index 5964542..4f33618b 100644 --- a/chrome/app/resources/chromium_strings_lv.xtb +++ b/chrome/app/resources/chromium_strings_lv.xtb
@@ -37,6 +37,7 @@ <translation id="2158734852934720349">Chromium OS atklātā pirmkoda licences</translation> <translation id="2241627712206172106">Ja jūsu datoru izmanto arī jūsu draugi un ģimenes locekļi, viņi var iestatīt pārlūku Chromium atbilstoši savām vēlmēm un pārlūkot saturu atsevišķos kontos.</translation> <translation id="225614027745146050">Laipni lūdzam!</translation> +<translation id="2264142189334629813">Problēma ar lapas atvēršanu pārlūkā Chromium OS</translation> <translation id="2316129865977710310">Nē, paldies</translation> <translation id="2347108572062610441">Šis paplašinājums mainīja iestatījumu, kura lapa tiek parādīta, palaižot pārlūku Chromium.</translation> <translation id="2372704305038231957">Iespējams, Chromium 32 bitu versija nedarbosies pareizi, jo tā vairs netiek atbalstīta šajā Linux sistēmā. Lūdzu, jauniniet uz Chromium 64 bitu versiju.</translation> @@ -75,6 +76,7 @@ <translation id="3258596308407688501">Chromium nevar nolasīt savu datu direktoriju un ierakstīt tajā: <ph name="USER_DATA_DIRECTORY" /></translation> +<translation id="3264279740686075150">Chromium ir jūsu noklusējuma pārlūks.</translation> <translation id="328888136576916638">Trūkst Google API atslēgu. Tiks atspējotas dažas Chromium funkcijas.</translation> <translation id="3289635842886789612">Chromium versija ir novecojusi.</translation> <translation id="3296368748942286671">Turpināt lietotņu izpildi fonā, kad Chromium ir aizvērts</translation>
diff --git a/chrome/app/resources/chromium_strings_ml.xtb b/chrome/app/resources/chromium_strings_ml.xtb index 96e7d098..5ce049b 100644 --- a/chrome/app/resources/chromium_strings_ml.xtb +++ b/chrome/app/resources/chromium_strings_ml.xtb
@@ -39,6 +39,7 @@ <translation id="2158734852934720349">Chromium OS ഓപ്പൺ സോഴ്സ് ലൈസൻസുകൾ</translation> <translation id="2241627712206172106">നിങ്ങളൊരു കമ്പ്യൂട്ടർ പങ്കിടുകയാണെങ്കിൽ, സുഹൃത്തുക്കൾക്കും കുടുബാംഗങ്ങൾക്കും വെവ്വേറെ ബ്രൗസുചെയ്യാനും അവർക്ക് ആവശ്യമുള്ള രീതിയിൽ Chromium സജ്ജീകരിക്കാനുമാകും.</translation> <translation id="225614027745146050">സ്വാഗതം</translation> +<translation id="2264142189334629813">Chromium OS-ന് ഈ പേജ് തുറക്കാനാവില്ല.</translation> <translation id="2316129865977710310">വേണ്ട, നന്ദി</translation> <translation id="2347108572062610441">നിങ്ങൾ Chromium ആരംഭിക്കുമ്പോൾ ദൃശ്യമാകുന്ന പേജിനെ ഈ വിപുലീകരണം മാറ്റി.</translation> <translation id="2372704305038231957">32-ബിറ്റ് Chromium, ഈ Linux സിസ്റ്റത്തെ പിന്തുണയ്ക്കാത്തതിനാൽ അത് ശരിയായി പ്രവർത്തിക്കാനിടയില്ല. 64-ബിറ്റ് Chromium-ത്തിലേക്ക് അപ്ഗ്രേഡുചെയ്യുക.</translation> @@ -77,6 +78,7 @@ <translation id="3258596308407688501">Chromium-ത്തിന് ഇതിന്റെ ഡാറ്റാ ഡയറക്ടറി വായിക്കാനും അതിൽ എഴുതാനും കഴിയില്ല: <ph name="USER_DATA_DIRECTORY" /></translation> +<translation id="3264279740686075150">Chromium നിങ്ങളുടെ ഡിഫോൾട്ട് ബ്രൗസറാണ്. കൊള്ളാം.</translation> <translation id="328888136576916638">Google API കീകൾ നഷ്ടമായി. Chromium-ന്റെ ചില പ്രവർത്തനങ്ങൾ പ്രവർത്തനരഹിതമാകും.</translation> <translation id="3289635842886789612">Chromium കാലഹരണപ്പെട്ടു.</translation> <translation id="3296368748942286671">Chromium അടയ്ക്കുമ്പോൾ അപ്ലിക്കേഷനുകൾ പശ്ചാത്തലത്തിൽ പ്രവർത്തിക്കുന്നത് തുടരുക</translation>
diff --git a/chrome/app/resources/chromium_strings_mr.xtb b/chrome/app/resources/chromium_strings_mr.xtb index 9b24f0e8..d612580 100644 --- a/chrome/app/resources/chromium_strings_mr.xtb +++ b/chrome/app/resources/chromium_strings_mr.xtb
@@ -38,6 +38,7 @@ <translation id="2158734852934720349">Chromium OS खुला स्त्रोत परवाने</translation> <translation id="2241627712206172106">आपण संगणक सामायिक केल्यास, मित्र आणि कुटुंब स्वतंत्रपणे ब्राउझ करू शकतात आणि त्यांना पाहिजे तसे Chromium सेट अप करू शकतात.</translation> <translation id="225614027745146050">सुस्वागतम</translation> +<translation id="2264142189334629813">Chromium OS हे पृष्ठ उघडू शकत नाही.</translation> <translation id="2316129865977710310">नाही, धन्यवाद</translation> <translation id="2347108572062610441">आपण Chromium प्रारंभ करता तेव्हा कोणते पृष्ठ दर्शविले जाते हे या विस्ताराने बदलले आहे.</translation> <translation id="2372704305038231957">32-बिट Chromium यापुढे या Linux सिस्टीमवर समर्थित नसल्याने कदाचित तो योग्यरितीने कार्य करू शकत नाही. कृपया 64-बिट Chromium वर श्रेणीसुधारित करा.</translation> @@ -76,6 +77,7 @@ <translation id="3258596308407688501">Chromium त्याची डेटा निर्देशिका वाचू किंवा लिहू शकत नाही: <ph name="USER_DATA_DIRECTORY" /></translation> +<translation id="3264279740686075150">Chromium आपला डीफॉल्ट ब्राउझर आहे. आनंद घ्या.</translation> <translation id="328888136576916638">Google API की गहाळ आहेत. Chromium ची काही कार्यक्षमता अक्षम केली जाईल.</translation> <translation id="3289635842886789612">Chromium कालबाह्य झाले आहे.</translation> <translation id="3296368748942286671">Chromium बंद असताना पार्श्वभूमी अनुप्रयोग चालवणे सुरू ठेवा</translation>
diff --git a/chrome/app/resources/chromium_strings_ms.xtb b/chrome/app/resources/chromium_strings_ms.xtb index edf0606..ef00ac8a 100644 --- a/chrome/app/resources/chromium_strings_ms.xtb +++ b/chrome/app/resources/chromium_strings_ms.xtb
@@ -37,6 +37,7 @@ <translation id="2158734852934720349">Lesen sumber terbuka Chromium OS</translation> <translation id="2241627712206172106">Jika anda berkongsi komputer, rakan dan keluarga boleh menyemak imbas secara berasingan dan menyediakan Chromium sebagaimana yang mereka mahukan.</translation> <translation id="225614027745146050">Selamat datang</translation> +<translation id="2264142189334629813">OS Chromium tidak boleh membuka laman ini.</translation> <translation id="2316129865977710310">Tidak, terima kasih</translation> <translation id="2347108572062610441">Sambungan ini telah menukar halaman yang ditunjukkan apabila anda memulakan Chromium.</translation> <translation id="2372704305038231957">Chromium 32 bit mungkin tidak akan berfungsi dengan betul kerana tidak disokong pada sistem Linux ini lagi. Sila tingkatkan kepada Chromium 64 bit.</translation> @@ -75,6 +76,7 @@ <translation id="3258596308407688501">Chromium tidak dapat membaca atau menulis pada direktori datanya: <ph name="USER_DATA_DIRECTORY" /></translation> +<translation id="3264279740686075150">Kromium adalah penyemak imbas lalai anda. Bergembiralah!</translation> <translation id="328888136576916638">Kunci API Google tiada. Sesetengah fungsi Chromium akan dilumpuhkan.</translation> <translation id="3289635842886789612">Chromium sudah usang.</translation> <translation id="3296368748942286671">Terus menjalankan apl latar belakang apabila Chromium ditutup</translation>
diff --git a/chrome/app/resources/chromium_strings_nl.xtb b/chrome/app/resources/chromium_strings_nl.xtb index 8b43ba31..d3af245 100644 --- a/chrome/app/resources/chromium_strings_nl.xtb +++ b/chrome/app/resources/chromium_strings_nl.xtb
@@ -39,6 +39,7 @@ <translation id="2158734852934720349">Open-sourcelicenties van Chromium OS</translation> <translation id="2241627712206172106">Als je een computer deelt, kunnen vrienden en familie afzonderlijk surfen en Chromium configureren zoals zij dat willen.</translation> <translation id="225614027745146050">Welkom</translation> +<translation id="2264142189334629813">Chromium OS kan deze pagina niet openen.</translation> <translation id="2316129865977710310">Nee, bedankt</translation> <translation id="2347108572062610441">Deze extensie heeft gewijzigd welke pagina wordt weergegeven wanneer je Chromium start.</translation> <translation id="2372704305038231957">De 32-bits versie van Chromium werkt mogelijk niet correct omdat deze niet meer wordt ondersteund op dit Linux-systeem. Upgrade naar de 64-bits versie van Chromium.</translation> @@ -77,6 +78,7 @@ <translation id="3258596308407688501">Chrome kan niet lezen van en schrijven naar de eigen gegevensdirectory : <ph name="USER_DATA_DIRECTORY" /></translation> +<translation id="3264279740686075150">Chromium is je standaardbrowser.</translation> <translation id="328888136576916638">Google API-sleutels ontbreken. Sommige functies van Chromium worden uitgeschakeld.</translation> <translation id="3289635842886789612">Chromium is verouderd.</translation> <translation id="3296368748942286671">Achtergrondapps ingeschakeld houden als Chromium is gesloten</translation>
diff --git a/chrome/app/resources/chromium_strings_no.xtb b/chrome/app/resources/chromium_strings_no.xtb index b85cd86..145a590 100644 --- a/chrome/app/resources/chromium_strings_no.xtb +++ b/chrome/app/resources/chromium_strings_no.xtb
@@ -37,6 +37,7 @@ <translation id="2158734852934720349">Åpen kildekode-lisenser for Chromium OS</translation> <translation id="2241627712206172106">Hvis du deler en datamaskin med andre, kan venner og familie surfe hver for seg og konfigurere Chromium akkurat slik de vil.</translation> <translation id="225614027745146050">Velkommen</translation> +<translation id="2264142189334629813">Chromium OS kan ikke åpne denne siden.</translation> <translation id="2316129865977710310">Nei takk</translation> <translation id="2347108572062610441">Denne utvidelsen har endret hvilken side som vises når du starter Chromium.</translation> <translation id="2372704305038231957">Det kan hende 32-bit-versjonen av Chromium ikke fungerer skikkelig, fordi den ikke støttes på dette Linux-systemet lenger. Oppgrader til 64-bit-versjonen av Chromium.</translation> @@ -75,6 +76,7 @@ <translation id="3258596308407688501">Chromium kan ikke lese og skrive til egen datakatalog: <ph name="USER_DATA_DIRECTORY" /></translation> +<translation id="3264279740686075150">Chromium er standardnettleseren din. Hurra!</translation> <translation id="328888136576916638">API-nøkler for Google mangler. Noe funksjonalitet i Chromium blir deaktivert.</translation> <translation id="3289635842886789612">Chromium er utdatert.</translation> <translation id="3296368748942286671">Fortsett å kjøre bakgrunnsprogrammer når Chromium er lukket</translation>
diff --git a/chrome/app/resources/chromium_strings_pl.xtb b/chrome/app/resources/chromium_strings_pl.xtb index ac00e7e..562db418 100644 --- a/chrome/app/resources/chromium_strings_pl.xtb +++ b/chrome/app/resources/chromium_strings_pl.xtb
@@ -37,6 +37,7 @@ <translation id="2158734852934720349">Licencje oprogramowania typu open source w Chromium OS</translation> <translation id="2241627712206172106">Jeśli dzielisz się komputerem ze znajomymi lub rodziną, wszyscy możecie niezależnie przeglądać internet i po swojemu skonfigurować Chromium.</translation> <translation id="225614027745146050">Witamy</translation> +<translation id="2264142189334629813">System operacyjny Chromium nie może otworzyć tej strony.</translation> <translation id="2316129865977710310">Nie, dziękuję</translation> <translation id="2347108572062610441">To rozszerzenie ustawiło inną stronę wyświetlaną po uruchomieniu Chromium.</translation> <translation id="2372704305038231957">32-bitowy Chromium może działać nieprawidłowo, bo nie jest już obsługiwany w tym systemie Linux. Uaktualnij Chromium do wersji 64-bitowej.</translation> @@ -73,6 +74,7 @@ <translation id="3190315855212034486">O kurczę! Chromium uległ awarii. Uruchomić go teraz ponownie?</translation> <translation id="3256316712990552818">Skopiowana do Chromium</translation> <translation id="3258596308407688501">Chromium nie może odczytać ani zapisać danych w katalogu <ph name="USER_DATA_DIRECTORY" />.</translation> +<translation id="3264279740686075150">Chromium jest domyślną przeglądarką. Hura!</translation> <translation id="328888136576916638">Brakuje kluczy interfejsu Google API. Niektóre funkcje Chromium będą wyłączone.</translation> <translation id="3289635842886789612">Chromium jest nieaktualny.</translation> <translation id="3296368748942286671">Kontynuuj działanie aplikacji w tle po zamknięciu Chromium</translation>
diff --git a/chrome/app/resources/chromium_strings_pt-BR.xtb b/chrome/app/resources/chromium_strings_pt-BR.xtb index 1ca98eb0..58cc969 100644 --- a/chrome/app/resources/chromium_strings_pt-BR.xtb +++ b/chrome/app/resources/chromium_strings_pt-BR.xtb
@@ -37,6 +37,7 @@ <translation id="2158734852934720349">Licenças de código aberto do Chromium OS</translation> <translation id="2241627712206172106">Se você usa um computador compartilhado, seus amigos e familiares podem navegar separadamente e configurar o Chromium da maneira que desejarem.</translation> <translation id="225614027745146050">Bem-vindo</translation> +<translation id="2264142189334629813">O Chromium OS não pode abrir essa página.</translation> <translation id="2316129865977710310">Não.</translation> <translation id="2347108572062610441">Esta extensão alterou a página que é exibida quando você inicia o Chromium.</translation> <translation id="2372704305038231957">É possível que o Chromium de 32 bits não funcione corretamente, porque ele não é mais compatível com esse sistema Linux. Faça upgrade para o Chromium de 64 bits.</translation> @@ -73,6 +74,7 @@ <translation id="3190315855212034486">O Chromium travou. Reiniciar agora?</translation> <translation id="3256316712990552818">Copiado no Chromium</translation> <translation id="3258596308407688501">O Chromium não pode ler e gravar neste diretório de dados: <ph name="USER_DATA_DIRECTORY" /></translation> +<translation id="3264279740686075150">Parabéns! O Chromium é seu navegador padrão.</translation> <translation id="328888136576916638">As chaves da API do Google não foram encontradas. Algumas funcionalidades do Chromium serão desativadas.</translation> <translation id="3289635842886789612">O Chromium está desatualizado.</translation> <translation id="3296368748942286671">Continuar executando os aplicativos em segundo plano quando o Chromium for fechado</translation>
diff --git a/chrome/app/resources/chromium_strings_pt-PT.xtb b/chrome/app/resources/chromium_strings_pt-PT.xtb index 7ec4640b..666baed2 100644 --- a/chrome/app/resources/chromium_strings_pt-PT.xtb +++ b/chrome/app/resources/chromium_strings_pt-PT.xtb
@@ -37,6 +37,7 @@ <translation id="2158734852934720349">Licenças de código aberto do SO Chromium</translation> <translation id="2241627712206172106">Se partilhar um computador, os amigos e os familiares podem navegar separadamente e configurar o Chromium da forma que quiserem.</translation> <translation id="225614027745146050">Bem-vindo</translation> +<translation id="2264142189334629813">O SO Chromium não consegue abrir esta página.</translation> <translation id="2316129865977710310">Não, obrigado</translation> <translation id="2347108572062610441">Esta extensão alterou a página apresentada quando inicia o Chromium.</translation> <translation id="2372704305038231957">O Chromium de 32 bits pode não funcionar corretamente porque deixou de ser suportado neste sistema Linux. Atualize para o Chromium de 64 bits.</translation> @@ -75,6 +76,7 @@ <translation id="3258596308407688501">O Chromium não consegue ler e escrever no respetivo diretório de dados: <ph name="USER_DATA_DIRECTORY" /></translation> +<translation id="3264279740686075150">O Chromium é o seu navegador predefinido. Viva!</translation> <translation id="328888136576916638">As chaves da API do Google estão em falta. Algumas funcionalidades do Chromium serão desativadas.</translation> <translation id="3289635842886789612">O Chromium está desatualizado.</translation> <translation id="3296368748942286671">Continuar a executar aplicações em segundo plano quando o Chromium está fechado</translation>
diff --git a/chrome/app/resources/chromium_strings_ro.xtb b/chrome/app/resources/chromium_strings_ro.xtb index dbcea1a1..eef8d6247 100644 --- a/chrome/app/resources/chromium_strings_ro.xtb +++ b/chrome/app/resources/chromium_strings_ro.xtb
@@ -37,6 +37,7 @@ <translation id="2158734852934720349">Licențe open source pentru sistemul de operare Chromium</translation> <translation id="2241627712206172106">Dacă permiteți accesul la un computer, familia și prietenii pot să navigheze separat și să configureze Chromium cum doresc.</translation> <translation id="225614027745146050">Bun venit</translation> +<translation id="2264142189334629813">Sistemul de operare Chromium nu poate deschide pagina.</translation> <translation id="2316129865977710310">Nu, mulțumesc</translation> <translation id="2347108572062610441">Această extensie a modificat ce pagină se afișează când pornești Chromium.</translation> <translation id="2372704305038231957">Este posibil ca Chromium pe 32 de biți să nu funcționeze corespunzător, deoarece nu mai este acceptat pe acest sistem Linux. Fă upgrade la Chromium pe 64 de biți.</translation> @@ -75,6 +76,7 @@ <translation id="3258596308407688501">Chromium nu poate citi și scrie în directorul propriu de date: <ph name="USER_DATA_DIRECTORY" /></translation> +<translation id="3264279740686075150">Chromium este browserul prestabilit. Felicitări.</translation> <translation id="328888136576916638">Lipsesc chei pentru API-ul Google. Unele funcționalități Chromium vor fi dezactivate.</translation> <translation id="3289635842886789612">Chromium nu este actualizat.</translation> <translation id="3296368748942286671">Rulați în continuare aplicații de fundal când Chromium este închis</translation>
diff --git a/chrome/app/resources/chromium_strings_ru.xtb b/chrome/app/resources/chromium_strings_ru.xtb index 413c5d39..ca0a65c 100644 --- a/chrome/app/resources/chromium_strings_ru.xtb +++ b/chrome/app/resources/chromium_strings_ru.xtb
@@ -37,6 +37,7 @@ <translation id="2158734852934720349">Лицензии Chromium OS на ПО с открытым исходным кодом</translation> <translation id="2241627712206172106">Если, кроме вас, компьютером пользуется кто-то ещё, например родные или друзья, они тоже смогут настроить Chromium на свой вкус.</translation> <translation id="225614027745146050">Добро пожаловать!</translation> +<translation id="2264142189334629813">Не удалось открыть страницу</translation> <translation id="2316129865977710310">Спасибо, не надо</translation> <translation id="2347108572062610441">Расширение изменило стартовую страницу Chromium.</translation> <translation id="2372704305038231957">В работе 32-разрядной версии Chromium могут возникать сбои, поскольку она больше не поддерживается этой системой Linux. Установите 64-разрядную версию браузера.</translation> @@ -73,6 +74,7 @@ <translation id="3190315855212034486">Произошел сбой Chromium. Перезапустить?</translation> <translation id="3256316712990552818">Скопировано в Chromium</translation> <translation id="3258596308407688501">Chromium не может выполнять операции чтения и записи в своем каталоге: <ph name="USER_DATA_DIRECTORY" /></translation> +<translation id="3264279740686075150">Chromium используется как браузер по умолчанию</translation> <translation id="328888136576916638">Отсутствуют ключи API Google. Некоторые функции Chromium могут не работать.</translation> <translation id="3289635842886789612">Версия Chromium устарела.</translation> <translation id="3296368748942286671">Продолжить выполнение фоновых приложений после закрытия Chromium</translation>
diff --git a/chrome/app/resources/chromium_strings_sk.xtb b/chrome/app/resources/chromium_strings_sk.xtb index 31dd478..6f65acc 100644 --- a/chrome/app/resources/chromium_strings_sk.xtb +++ b/chrome/app/resources/chromium_strings_sk.xtb
@@ -39,6 +39,7 @@ <translation id="2158734852934720349">Licencie open source systému OS Chromium</translation> <translation id="2241627712206172106">Ak počítač zdieľate s rodinou a priateľmi, môžu v prehliadači Chromium prehliadať oddelene a tiež si ho nastaviť podľa vlastných požiadaviek.</translation> <translation id="225614027745146050">Vitajte</translation> +<translation id="2264142189334629813">Chromium OS nedokáže túto stránku otvoriť.</translation> <translation id="2316129865977710310">Nie, ďakujem</translation> <translation id="2347108572062610441">Toto rozšírenie zmenilo stránku, ktorá sa zobrazí pri spustení prehliadača Chromium.</translation> <translation id="2372704305038231957">32-bitová verzia prehliadača Chromium nemusí fungovať správne, pretože v tejto verzii systému Linux už nie je podporovaná. Inovujte Chromium na 64-bitovú verziu.</translation> @@ -77,6 +78,7 @@ <translation id="3258596308407688501">Prehliadač Chromium nemôže čítať ani zapisovať do adresára s údajmi: <ph name="USER_DATA_DIRECTORY" /></translation> +<translation id="3264279740686075150">Chromium je vaším predvoleným prehliadačom. Skvelé!</translation> <translation id="328888136576916638">Chýbajú kľúče rozhrania Google API. Niektoré funkcie prehliadača Google Chromium budú zakázané.</translation> <translation id="3289635842886789612">Prehliadač Chromium je zastaraný.</translation> <translation id="3296368748942286671">Po zatvorení prehliadača Chromium ponechať spustené aplikácie na pozadí</translation>
diff --git a/chrome/app/resources/chromium_strings_sl.xtb b/chrome/app/resources/chromium_strings_sl.xtb index cc708e7..27f59bee 100644 --- a/chrome/app/resources/chromium_strings_sl.xtb +++ b/chrome/app/resources/chromium_strings_sl.xtb
@@ -39,6 +39,7 @@ <translation id="2158734852934720349">Odprtokodne licence za Chromium OS</translation> <translation id="2241627712206172106">Če računalnik souporabljate z drugimi, lahko prijatelji in sorodniki ločeno brskajo ter nastavijo Chromium tako, kot ga želijo.</translation> <translation id="225614027745146050">Pozdravljeni</translation> +<translation id="2264142189334629813">OS Chromium ne more odpreti te strani.</translation> <translation id="2316129865977710310">Ne, hvala</translation> <translation id="2347108572062610441">Zaradi te razširitve se je spremenila stran, ki je prikazana, ko zaženete Chromium.</translation> <translation id="2372704305038231957">32-bitna različica Chromiuma morda ne bo delovala pravilno, ker ni več podprta v tem sistemu Linux. Nadgradite Chromium na 64-bitno različico.</translation> @@ -77,6 +78,7 @@ <translation id="3258596308407688501">Chromium ne more brati svojega imenika s podatki ali pisati vanj: <ph name="USER_DATA_DIRECTORY" /></translation> +<translation id="3264279740686075150">Chromium je privzeti brskalnik. Super.</translation> <translation id="328888136576916638">Manjkajo ključi za Google API. Nekatere funkcije Chromiuma bodo onemogočene.</translation> <translation id="3289635842886789612">Chromium je zastarel.</translation> <translation id="3296368748942286671">Nadaljuj izvajanje aplikacij v ozadju, ko je Chromium zaprt</translation>
diff --git a/chrome/app/resources/chromium_strings_sr.xtb b/chrome/app/resources/chromium_strings_sr.xtb index f59d5bd..6a86735 100644 --- a/chrome/app/resources/chromium_strings_sr.xtb +++ b/chrome/app/resources/chromium_strings_sr.xtb
@@ -39,6 +39,7 @@ <translation id="2158734852934720349">Лиценце отвореног кода за Chromium ОС</translation> <translation id="2241627712206172106">Ако делите рачунар, пријатељи и породица могу засебно да прегледају и да подесе Chromium баш онако како желе.</translation> <translation id="225614027745146050">Добро дошли</translation> +<translation id="2264142189334629813">Chromium ОС не може да отвори ову страницу.</translation> <translation id="2316129865977710310">Не, хвала</translation> <translation id="2347108572062610441">Овај додатак је променио страницу која се приказује када покренете Chromium.</translation> <translation id="2372704305038231957">32-битни Chromium неће исправно функционисати зато што више није подржан на овом Linux систему. Надоградите Chromium на 64-битну верзију.</translation> @@ -77,6 +78,7 @@ <translation id="3258596308407688501">Chromium не може да чита податке из директоријума са подацима нити да их уписује у њега: <ph name="USER_DATA_DIRECTORY" /></translation> +<translation id="3264279740686075150">Chromium је подразумевани прегледач. Сјајно.</translation> <translation id="328888136576916638">Недостају шифре за Google API. Неке функције Chromium-а ће бити онемогућене.</translation> <translation id="3289635842886789612">Chromium је застарео.</translation> <translation id="3296368748942286671">Настави са покретањем апликација у позадини када се Chromium затвори</translation> @@ -163,7 +165,7 @@ <translation id="6212496753309875659">Овај рачунар већ има новију верзију Chromium-а. Ако софтвер не функционише, деинсталирајте Chromium и покушајте поново.</translation> <translation id="6248213926982192922">Подеси Chromium за подразумевани прегледач</translation> <translation id="6309712487085796862">Chromium користи камеру.</translation> -<translation id="6333502561965082103">Друга радња у Chromium-у је у току. Покушајте поново касније.</translation> +<translation id="6333502561965082103">Друга радња у Chromium-у је у току. Пробајте поново касније.</translation> <translation id="6334986366598267305">Сада можете лакше да користите Chromium са Google налогом и на дељеним рачунарима.</translation> <translation id="6373523479360886564">Јесте ли сигурни да желите да деинсталирате Chromium?</translation> <translation id="6394232988457703198">Сада треба поново да покренете Chromium.</translation> @@ -257,7 +259,7 @@ <translation id="8821041990367117597">Chromium не може да синхронизује податке зато што су подаци за пријављивање на налог застарели.</translation> <translation id="8823523095753232532">Повежи моје Chromium податке са овим налогом</translation> <translation id="8851136666856101339">main</translation> -<translation id="8862326446509486874">Немате одговарајућа права за инсталацију на нивоу система. Покушајте поново да покренете програм за инсталацију, овога пута као администратор.</translation> +<translation id="8862326446509486874">Немате одговарајућа права за инсталацију на нивоу система. Пробајте поново да покренете програм за инсталацију, овога пута као администратор.</translation> <translation id="8897323336392112261">Контролише и страницу која се приказује када покренете Chromium или кликнете на дугме Почетна.</translation> <translation id="8907580949721785412">Chromium покушава да прикаже лозинке. Унесите лозинку за Windows да бисте то омогућили.</translation> <translation id="894903460958736500">Софтвер покренут на рачунару није компатибилан са Chromium-ом.</translation>
diff --git a/chrome/app/resources/chromium_strings_sv.xtb b/chrome/app/resources/chromium_strings_sv.xtb index aa871aa..c653969 100644 --- a/chrome/app/resources/chromium_strings_sv.xtb +++ b/chrome/app/resources/chromium_strings_sv.xtb
@@ -39,6 +39,7 @@ <translation id="2158734852934720349">Licenser för öppen källkod för Chromium OS</translation> <translation id="2241627712206172106">Om du delar en dator med vänner och familj kan de konfigurera Chromium precis som de vill och surfa separat.</translation> <translation id="225614027745146050">Välkommen</translation> +<translation id="2264142189334629813">Det går inte att öppna den här sidan i Chromium OS.</translation> <translation id="2316129865977710310">Nej tack</translation> <translation id="2347108572062610441">Det här tillägget har ändrat vilken sida som visas när du startar Chromium.</translation> <translation id="2372704305038231957">32-bitarsversionen av Chromium kanske inte fungerar ordentligt eftersom den inte längre stöds på det här Linux-systemet. Uppgradera till 64-bitarsversionen av Chromium.</translation> @@ -77,6 +78,7 @@ <translation id="3258596308407688501">Chromium kan inte läsa och skriva till datakatalogen: <ph name="USER_DATA_DIRECTORY" /></translation> +<translation id="3264279740686075150">Chromium är din standardwebbläsare.</translation> <translation id="328888136576916638">Googles API-nycklar saknas. Vissa funktioner i Google Chromium kommer att vara inaktiverade.</translation> <translation id="3289635842886789612">Den här versionen av Chromium är inaktuell.</translation> <translation id="3296368748942286671">Fortsätt köra bakgrundsappar när Chromium avslutas</translation>
diff --git a/chrome/app/resources/chromium_strings_sw.xtb b/chrome/app/resources/chromium_strings_sw.xtb index a39dea5..6229696 100644 --- a/chrome/app/resources/chromium_strings_sw.xtb +++ b/chrome/app/resources/chromium_strings_sw.xtb
@@ -39,6 +39,7 @@ <translation id="2158734852934720349">Leseni za programu huria kwenye Chromium OS</translation> <translation id="2241627712206172106">Kama unatumia kompyuta pamoja na wengine, marafiki na familia wanaweza kuvinjari tofauti na kusanidi Chromium jinsi wapendavyo.</translation> <translation id="225614027745146050">Karibu</translation> +<translation id="2264142189334629813">Mfumo wa Uendeshaji wa Chromium hauwezi kufungua ukurasa huu.</translation> <translation id="2316129865977710310">La, asante</translation> <translation id="2347108572062610441">Kiendelezi hiki kimebadilisha ukurasa unaoonyeshwa unapoanzisha Chromium.</translation> <translation id="2372704305038231957">Huenda Chromium ya 32-bit haitafanya kazi vizuri kwa sababu haitumiki tena kwenye mfumo wa Linux. Tafadhali pata toleo jipya la Chromium la 64-bit.</translation> @@ -77,6 +78,7 @@ <translation id="3258596308407688501">Chromium haiwezi kusoma na kuandika kwenye saraka yake ya data: <ph name="USER_DATA_DIRECTORY" /></translation> +<translation id="3264279740686075150">Chromium ni kivinjari chako chaguo-msingi. Furahia.</translation> <translation id="328888136576916638">Funguo za Google API zinakosekana. Utendaji fulani wa Chromium utazimwa.</translation> <translation id="3289635842886789612">Toleo hili la Chromium limepitwa na wakati.</translation> <translation id="3296368748942286671">Endelea kuendesha programu za mandharinyuma wakati Chromium imefungwa</translation>
diff --git a/chrome/app/resources/chromium_strings_ta.xtb b/chrome/app/resources/chromium_strings_ta.xtb index 10369a4..43c2ce5 100644 --- a/chrome/app/resources/chromium_strings_ta.xtb +++ b/chrome/app/resources/chromium_strings_ta.xtb
@@ -37,6 +37,7 @@ <translation id="2158734852934720349">Chromium OS ஓப்பன் சோர்ஸ் உரிமங்கள்</translation> <translation id="2241627712206172106">நீங்கள் கணினியைப் பகிர்ந்தால், நண்பர்களும் குடும்பத்தினரும் தனிப்பட்ட முறையில் உலாவலாம், மேலும் Chromium ஐ அவர்கள் விருப்பத்திற்கு ஏற்ப அமைத்துக்கொள்ளலாம்.</translation> <translation id="225614027745146050">நல்வரவு</translation> +<translation id="2264142189334629813">Chromium OS ஆல் இந்தப் பக்கத்தைத் திறக்க முடியாது.</translation> <translation id="2316129865977710310">வேண்டாம், நன்றி</translation> <translation id="2347108572062610441">Chromiumஐத் தொடங்கும் போது காண்பிக்கப்படும் பக்கத்தை இந்த நீட்டிப்பு மாற்றியுள்ளது.</translation> <translation id="2372704305038231957">இந்த Linux முறைமையில் 32-பிட் Chromium இனி ஆதரிக்கப்படாது என்பதால், அது சரியாகச் செயல்படாது. 64-பிட் Chromiumக்கு மேம்படுத்தவும்.</translation> @@ -75,6 +76,7 @@ <translation id="3258596308407688501">தன்னுடைய தரவுக் கோப்பகத்தில் Chromium படிக்கவும் எழுதவும் செய்யாது: <ph name="USER_DATA_DIRECTORY" /></translation> +<translation id="3264279740686075150">அருமை, உங்கள் இயல்புநிலை உலாவி Chromium ஆகும்.</translation> <translation id="328888136576916638">Google API விசைகள் காணப்படவில்லை. Chromium இன் சில செயல்பாடுகள் முடக்கப்படும்.</translation> <translation id="3289635842886789612">Chromium காலாவதியானது.</translation> <translation id="3296368748942286671">Chromium ஐ மூடியபிறகு, பின்புலப் பயன்பாடுகளைத் தொடர்ந்து இயக்கு</translation>
diff --git a/chrome/app/resources/chromium_strings_te.xtb b/chrome/app/resources/chromium_strings_te.xtb index b534ae5e..99126c4f 100644 --- a/chrome/app/resources/chromium_strings_te.xtb +++ b/chrome/app/resources/chromium_strings_te.xtb
@@ -37,6 +37,7 @@ <translation id="2158734852934720349">Chromium OS ఓపెన్ సోర్స్ లైసెన్స్లు</translation> <translation id="2241627712206172106">మీరు కంప్యూటర్ను భాగస్వామ్యం చేస్తే, స్నేహితులు మరియు కుటుంబ సభ్యులు విడివిడిగా బ్రౌజ్ చేయవచ్చు మరియు Chromiumను వారికి నచ్చిన రీతిలో సెటప్ చేసుకోవచ్చు.</translation> <translation id="225614027745146050">స్వాగతం</translation> +<translation id="2264142189334629813">Chromium OS ఈ పేజీని తెరవలేదు.</translation> <translation id="2316129865977710310">వద్దు, ధన్యవాదాలు</translation> <translation id="2347108572062610441">ఈ పొడిగింపు మీరు Chromiumని ప్రారంభించినప్పుడు చూపబడే పేజీని మార్చింది.</translation> <translation id="2372704305038231957">ఈ Linux సిస్టమ్లో 32-బిట్ Chromiumకి మద్దతు లేనందున ఇది సరిగ్గా పని చేయకపోవచ్చు. దయచేసి 64-బిట్ Chromiumకి అప్గ్రేడ్ చేయండి.</translation> @@ -73,6 +74,7 @@ <translation id="3190315855212034486">అయ్యో! Chromium క్రాష్ అయ్యింది. ఇప్పుడే మళ్లీ ప్రారంభించాలా?</translation> <translation id="3256316712990552818">Chromiumకి కాపీ చేయబడింది</translation> <translation id="3258596308407688501">Chromium దీని డేటా డైరెక్టరీని చదవలేదు మరియు దీనిలో వ్రాయలేదు: <ph name="USER_DATA_DIRECTORY" /></translation> +<translation id="3264279740686075150">Chromium మీ డిఫాల్ట్ బ్రౌజర్. ఆనందించండి.</translation> <translation id="328888136576916638">Google API కీలు లేవు. Chromium కార్యాచరణలో కొంత భాగం నిలిపివేయబడుతుంది.</translation> <translation id="3289635842886789612">Chromium కాలం చెల్లినది.</translation> <translation id="3296368748942286671">Chromium మూసివేయబడినప్పుడు నేపథ్య అనువర్తనాలను అమలు చేయడాన్ని కొనసాగించు</translation>
diff --git a/chrome/app/resources/chromium_strings_th.xtb b/chrome/app/resources/chromium_strings_th.xtb index 4749da1353..6f3384e 100644 --- a/chrome/app/resources/chromium_strings_th.xtb +++ b/chrome/app/resources/chromium_strings_th.xtb
@@ -37,6 +37,7 @@ <translation id="2158734852934720349">ใบอนุญาตโอเพนซอร์สของ Chromium OS</translation> <translation id="2241627712206172106">ถ้าคุณให้ผู้อื่นใช้คอมพิวเตอร์ร่วมด้วย เพื่อนๆ และครอบครัวของคุณสามารถท่องเว็บแยกกันได้และตั้งค่า Chromium ได้ตามที่พวกเขาต้องการ</translation> <translation id="225614027745146050">ยินดีต้อนรับ</translation> +<translation id="2264142189334629813">Chromium OS ไม่สามารถเปิดหน้านี้</translation> <translation id="2316129865977710310">ไม่ ขอบคุณ</translation> <translation id="2347108572062610441">ส่วนขยายนี้ได้เปลี่ยนหน้าที่จะแสดงเมื่อคุณเริ่มต้น Chromium</translation> <translation id="2372704305038231957">Chromium แบบ 32 บิตอาจทำงานได้ไม่ถูกต้องเนื่องจากระบบ Linux นี้ไม่รองรับอีกต่อไป โปรดอัปเกรดเป็น Chromium แบบ 64 บิต</translation> @@ -75,6 +76,7 @@ <translation id="3258596308407688501">Google Chrome ไม่สามารถอ่านและเขียนข้อมูลในไดเรกทอรีข้อมูล: <ph name="USER_DATA_DIRECTORY" /></translation> +<translation id="3264279740686075150">Chromium เป็นเบราว์เซอร์เริ่มต้นของคุณ ไชโย</translation> <translation id="328888136576916638">คีย์ API ของ Google หายไป การทำงานบางอย่างของ Chromium จะถูกปิดใช้งาน</translation> <translation id="3289635842886789612">Chromium ล้าสมัย</translation> <translation id="3296368748942286671">เรียกใช้แอปพลิเคชันพื้นหลังต่อไปเมื่อปิด Chromium</translation>
diff --git a/chrome/app/resources/chromium_strings_tr.xtb b/chrome/app/resources/chromium_strings_tr.xtb index 1e01054..b75e0f1f61 100644 --- a/chrome/app/resources/chromium_strings_tr.xtb +++ b/chrome/app/resources/chromium_strings_tr.xtb
@@ -37,6 +37,7 @@ <translation id="2158734852934720349">Chromium OS açık kaynak lisansları</translation> <translation id="2241627712206172106">Bir bilgisayarı paylaşıyorsanız arkadaşlarınız ve aileniz ayrı olarak göz atabilir ve Chromium'u tam olarak istedikleri şekilde ayarlayabilir.</translation> <translation id="225614027745146050">Hoş Geldiniz</translation> +<translation id="2264142189334629813">Chromium OS bu sayfayı açamıyor.</translation> <translation id="2316129865977710310">Hayır, teşekkürler</translation> <translation id="2347108572062610441">Bu uzantı, Chromium'u başlattığınızda gösterilen sayfayı değiştirdi.</translation> <translation id="2372704305038231957">32 bit Chromium artık bu Linux sisteminde desteklenmediği için doğru şekilde çalışmayabilir. Lütfen Chromium'un 64 bit sürümüne geçin.</translation> @@ -73,6 +74,7 @@ <translation id="3190315855212034486">Hata! Chromium kilitlendi. Yeniden başlatılsın mı?</translation> <translation id="3256316712990552818">Chromium'a kopyalandı</translation> <translation id="3258596308407688501">Chromium veri dizini üzerinde okuma ve yazma işlemi yapamıyor: <ph name="USER_DATA_DIRECTORY" /></translation> +<translation id="3264279740686075150">Chromium, varsayılan tarayıcınız oldu. Teşekkürler.</translation> <translation id="328888136576916638">Google API anahtarları eksik. Chromium'un bazı işlevleri devre dışı bırakılacak.</translation> <translation id="3289635842886789612">Chromium sürümü eski.</translation> <translation id="3296368748942286671">Chromium kapandığında arka plan uygulamaları çalıştırmaya devam et</translation>
diff --git a/chrome/app/resources/chromium_strings_uk.xtb b/chrome/app/resources/chromium_strings_uk.xtb index cb05092..44f2af3 100644 --- a/chrome/app/resources/chromium_strings_uk.xtb +++ b/chrome/app/resources/chromium_strings_uk.xtb
@@ -37,6 +37,7 @@ <translation id="2158734852934720349">Ліцензії ОС Chromium із відкритим кодом</translation> <translation id="2241627712206172106">Якщо вашим комп’ютером користуєтесь не лише ви, а й ваші друзі чи сім’я, вони можуть налаштувати Chromium на свій смак.</translation> <translation id="225614027745146050">Вітаємо!</translation> +<translation id="2264142189334629813">Неможливо відкрити цю сторінку в ОС Chromium.</translation> <translation id="2316129865977710310">Ні, дякую</translation> <translation id="2347108572062610441">Це розширення змінило сторінку, яка відкривається під час запуску Chromium.</translation> <translation id="2372704305038231957">32-розрядна версія Chromium може працювати неналежним чином, оскільки ця система Linux більше не підтримується. Установіть 64-розрядну версію Chromium.</translation> @@ -75,6 +76,7 @@ <translation id="3258596308407688501">Chromium не може читати та писати дані у свій каталог даних: <ph name="USER_DATA_DIRECTORY" /></translation> +<translation id="3264279740686075150">Chromium установлено веб-переглядачем за умовчанням.</translation> <translation id="328888136576916638">Ключі API Google відсутні. Деякі функції Chromium буде вимкнено.</translation> <translation id="3289635842886789612">Версія Chromium застаріла.</translation> <translation id="3296368748942286671">Продовжувати роботу фонових програм, коли Chromium закрито</translation>
diff --git a/chrome/app/resources/chromium_strings_vi.xtb b/chrome/app/resources/chromium_strings_vi.xtb index de818405..dc046ab4 100644 --- a/chrome/app/resources/chromium_strings_vi.xtb +++ b/chrome/app/resources/chromium_strings_vi.xtb
@@ -37,6 +37,7 @@ <translation id="2158734852934720349">Giấy phép nguồn mở Chromium OS</translation> <translation id="2241627712206172106">Nếu bạn chia sẻ máy tính, bạn bè và gia đình có thể duyệt web một cách riêng biệt và thiết lập Chromium theo ý của họ.</translation> <translation id="225614027745146050">Chào mừng</translation> +<translation id="2264142189334629813">Chromium OS không mở được trang này.</translation> <translation id="2316129865977710310">Không, cảm ơn</translation> <translation id="2347108572062610441">Tiện ích này đã thay đổi trang nào được hiển thị khi bạn khởi động Chromium.</translation> <translation id="2372704305038231957">Chromium 32 bit có thể không hoạt động đúng do không được hỗ trợ trên hệ thống Linux này nữa. Vui lòng nâng cấp lên Chromium 64 bit.</translation> @@ -75,6 +76,7 @@ <translation id="3258596308407688501">Chromium không thể đọc và ghi vào thư mục dữ liệu: <ph name="USER_DATA_DIRECTORY" /></translation> +<translation id="3264279740686075150">Chromium là trình duyệt mặc định của bạn. Xin chúc mừng!</translation> <translation id="328888136576916638">Khóa API của Google bị thiếu. Một số chức năng của Chromium sẽ bị tắt.</translation> <translation id="3289635842886789612">Chromium đã lỗi thời.</translation> <translation id="3296368748942286671">Tiếp tục chạy các ứng dụng dưới nền khi Chromium bị đóng</translation>
diff --git a/chrome/app/resources/chromium_strings_zh-CN.xtb b/chrome/app/resources/chromium_strings_zh-CN.xtb index f216e1d..18b63627 100644 --- a/chrome/app/resources/chromium_strings_zh-CN.xtb +++ b/chrome/app/resources/chromium_strings_zh-CN.xtb
@@ -37,6 +37,7 @@ <translation id="2158734852934720349">Chromium操作系统开放源代码许可</translation> <translation id="2241627712206172106">如果您与亲朋好友共用计算机,他们将能够使用单独的帐户进行浏览,并可随心所欲地设置Chromium。</translation> <translation id="225614027745146050">欢迎</translation> +<translation id="2264142189334629813">Chromium 操作系统无法打开此网页。</translation> <translation id="2316129865977710310">不用了,谢谢</translation> <translation id="2347108572062610441">此扩展程序更改了 Chromium 启动后系统显示的页面。</translation> <translation id="2372704305038231957">32 位 Chromium 已不再适用于此 Linux 系统,因此可能无法正常运行。请升级到 64 位 Chromium。</translation> @@ -75,6 +76,7 @@ <translation id="3258596308407688501">Chromium 无法读写其数据目录: <ph name="USER_DATA_DIRECTORY" /></translation> +<translation id="3264279740686075150">太棒了!Chromium 已设为您的默认浏览器。</translation> <translation id="328888136576916638">缺少 Google API 密钥,因此 Chromium 的部分功能将无法使用。</translation> <translation id="3289635842886789612">Chromium 版本太旧。</translation> <translation id="3296368748942286671">关闭 Chromium 后继续运行后台应用</translation>
diff --git a/chrome/app/resources/chromium_strings_zh-TW.xtb b/chrome/app/resources/chromium_strings_zh-TW.xtb index e307829f..f7d8ffe 100644 --- a/chrome/app/resources/chromium_strings_zh-TW.xtb +++ b/chrome/app/resources/chromium_strings_zh-TW.xtb
@@ -37,6 +37,7 @@ <translation id="2158734852934720349">Chromium 作業系統開放原始碼授權</translation> <translation id="2241627712206172106">如果您與親朋好友共用電腦,人人皆可享有獨立的瀏覽空間,依照自己的偏好設定 Chromium。</translation> <translation id="225614027745146050">歡迎使用</translation> +<translation id="2264142189334629813">Chromium 作業系統無法開啟這個網頁。</translation> <translation id="2316129865977710310">不,謝謝</translation> <translation id="2347108572062610441">這個擴充功能已變更 Chromium 啟動時所顯示的網頁。</translation> <translation id="2372704305038231957">32 位元的 Chromium 已不適用於這種 Linux 系統,因此可能無法正常運作。請升級至 64 位元的 Chromium。</translation> @@ -75,6 +76,7 @@ <translation id="3258596308407688501">Chromium 無法讀取及寫入資料目錄: <ph name="USER_DATA_DIRECTORY" /></translation> +<translation id="3264279740686075150">太好了!Chromium 現已成為你的預設瀏覽器。</translation> <translation id="328888136576916638">缺少 Google API 金鑰,系統將停用 Chromium 的部分功能。</translation> <translation id="3289635842886789612">Chromium 版本過舊。</translation> <translation id="3296368748942286671">在 Chromium 關閉時繼續執行背景應用程式</translation>
diff --git a/chrome/app/resources/generated_resources_am.xtb b/chrome/app/resources/generated_resources_am.xtb index 75905e1..1376933 100644 --- a/chrome/app/resources/generated_resources_am.xtb +++ b/chrome/app/resources/generated_resources_am.xtb
@@ -18,7 +18,6 @@ <translation id="1029317248976101138">ማጉሊያ</translation> <translation id="1029595648591494741">«<ph name="EXTENSION_NAME" />»ን ይሞክሩ?</translation> <translation id="1031362278801463162">ቅድመ-እይታን በመጫን ላይ</translation> -<translation id="1031460590482534116">የደንበኛው እውቅና ማረጋገጫ ለማከማቸት በመሞከር ላይ ሳለ አንድ ስህተት ነበር። ስህተት <ph name="ERROR_NUMBER" /> (<ph name="ERROR_NAME" />)።</translation> <translation id="1031573127485938293">ጠይቅ (በመመሪያ)</translation> <translation id="103279545524624934">የAndroid መተግበሪያዎችን ለማስጀመር የዲስክ ቦታ ያስለቅቁ።</translation> <translation id="1033780634303702874">ተከታታይ መሣሪያዎችዎን ይደርሳል</translation> @@ -101,6 +100,7 @@ <translation id="1128591060186966949">የፍለጋ ፕሮግራምን ያርትዑ</translation> <translation id="1128987120443782698">የማከማቻ መሣሪያው <ph name="DEVICE_CAPACITY" /> መጠን አለው። እባክዎ ቢያንስ 4 ጊባ መጠን ያለው የSD ካርድ ወይም የUSB ማህደረ ትውስታ መሰኪያ ያስገቡ።</translation> <translation id="1137135726305341424">domContentLoaded እና ሁሉም የግብዓቶች ጭነቶች ከdomContentLoaded በፊት ጀምረዋል (ዋና ክፈፍ እና ተመሳሳይ ምንጭ ያላቸው iframes)።</translation> +<translation id="1138663153846032155">ኤችቲኤምኤል በFlash ላይ ይምረጡ</translation> <translation id="1140351953533677694">የእርስዎን የብሉቱዝ እና ተከታታይ መሣሪያዎች ይደርሳል</translation> <translation id="114140604515785785">የቅጥያ ስርወ ማውጫ፦</translation> <translation id="1143142264369994168">ሰርቲፊኬት ፈራሚ</translation> @@ -252,6 +252,7 @@ <translation id="1351692861129622852"><ph name="FILE_COUNT" /> ፋይሎችን በማስመጣት ላይ...</translation> <translation id="1352103415082130575">የታይ ቁልፍ ሰሌዳ (ፓታቾት)</translation> <translation id="1353686479385938207"><ph name="PROVIDER_NAME" />፦ <ph name="NETWORK_NAME" /></translation> +<translation id="1353946958707294039">የቁሳዊ ንድፍ ማከማቻ አስተዳዳሪ</translation> <translation id="1353966721814789986">የመነሻ ገጾች</translation> <translation id="1354868058853714482">የAdobe Reader ጊዜው ያለፈበት እና ደህንነቱ ያልተጠበቀ ሊሆን ይችላል።</translation> <translation id="1355408554203439639">የ3ል ሶፍትዌር የህትመት አመቻቺ</translation> @@ -423,7 +424,6 @@ <translation id="1533920822694388968">የቲቪ አሰላለፍ</translation> <translation id="15373452373711364">ትልቅ የመዳፊት ጠቋሚ</translation> <translation id="1543284117603151572">ከEdge ላይ የመጣ</translation> -<translation id="1544350195767834591">{NUM_COOKIES,plural, =1{1 ከሌሎች ጣቢያዎች የመጣ}one{# ከሌሎች ጣቢያዎች የመጡ}other{# ከሌሎች ጣቢያዎች የመጡ}}</translation> <translation id="1545177026077493356">ራስ-ሰር የኪዮስክ ሁነታ</translation> <translation id="1545786162090505744">ከመጠይቅ ይልቅ %s ያለው ዩአርኤል</translation> <translation id="1546280085599573572">ይህ ቅጥያ የመነሻ አዝራሩን ጠቅ ሲያደርጉ የሚታየውን ገጽ ቀይሮታል።</translation> @@ -447,7 +447,6 @@ <translation id="1559235587769913376">የዩኒኮድ ቁምፊዎችን ያስገባል</translation> <translation id="1561092721008294962">HarfBuzz ለዩአይ ጽሑፍ</translation> <translation id="1566049601598938765">ድር ጣቢያ</translation> -<translation id="1566958206723629112">ፍላሽ እና ፒዲኤፍ</translation> <translation id="1567723158593978621">በሚነቃበት ጊዜ ወደ አሳሹ መግባት አዲስ የgaia በይለፍ ቃል የተለያየ መግባት ፍሰትን ይጠቀማል።</translation> <translation id="1567993339577891801">ጃቫስክሪፕት ኮንሶል</translation> <translation id="1568323446248056064">የማሳያ የመሣሪያ ቅንብሮችን ክፈት</translation> @@ -576,7 +575,6 @@ <translation id="1723940674997333416">ደህንነታቸው ያልተጠበቀ WebSocket ከ https መነሻዎች ይፍቀዱ</translation> <translation id="1725149567830788547">&ቁጥጥሮችን አሳይ</translation> <translation id="172612876728038702">TPM እየተዋቀረ ነው። እባክዎ ይታገሱ፤ ይሄ ጥቂት ደቂቃዎች ሊወስድ ይችላል።</translation> -<translation id="1727135806684246609">የቁሳዊ ደህንነት ቃላት</translation> <translation id="1729533290416704613">እንዲሁም ከኦምኒቦክሱ ሆነው ሲፈልጉ የሚታየውን ገጽ ይቆጣጠራል።</translation> <translation id="1731346223650886555">ሴሚ ኮሎን</translation> <translation id="1731589410171062430">አጠቃላይ፦ <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /> (<ph name="NUMBER_OF_PAGES" /> <ph name="PAGE_OR_PAGES_LABEL" />)</translation> @@ -873,6 +871,7 @@ <translation id="218492098606937156">የንክኪ ክስተቶችን ያንቁ</translation> <translation id="2187317261103489799">አግኝ (ነባሪ)</translation> <translation id="2187895286714876935">የአገልጋይ ዕውቅና ማረጋገጫ ስህተት</translation> +<translation id="2188881192257509750"><ph name="APPLICATION" /> ክፈት</translation> <translation id="2190069059097339078">WiFi አሳማኝ ምስክርነቶችን አግኝ</translation> <translation id="219008588003277019">የውስጥ ተገልጋይ ሞዱል፦ <ph name="NEXE_NAME" /></translation> <translation id="2190355936436201913">(ባዶ)</translation> @@ -991,6 +990,7 @@ <translation id="2326606747676847821">ማንነት ወደማያሳውቅ ሁነታ ሂድ</translation> <translation id="2326931316514688470">&መተግበሪያን ዳግም ጫን</translation> <translation id="2327492829706409234">መተግበሪያን አንቃ</translation> +<translation id="2328054044222305089">ይህ ማናቸውም በእርስዎ መሣሪያ ላይ የተከማቸ <ph name="SITE" /> ውሂብን ይሰርዛል እና እንዲሠሩ የሰጡዋቸውን ማናቸውም ፈቃዶች ዳግም ያስጀምራል። ለመቀጠል ይፈልጋሉ?</translation> <translation id="2329597144923131178">የእርስዎን ዕልባቶች፣ ታሪክ፣ የይለፍ ቃላት እና ሌሎች ቅንብሮች በሁሉም መሣሪያዎችዎ ላይ ለማግኘት ወደ መለያ ይግቡ።</translation> <translation id="2332131598580221120">በመደብር ውስጥ ይመልከቱ</translation> <translation id="2332742915001411729">ወደ ነባሪ ዳግም አስጀምር</translation> @@ -1266,7 +1266,6 @@ <translation id="2675358154061544447">በከፍተኛ ደረጃ የሙከራ ተላላፊ-ጣቢያ iframes ምስል በተለያዩ ሂደቶች ውስጥ የመሥራት ድጋፍ። በዚህ ሁነታ ላይ ሰነዶች ከተመሳሳዩ ድር ጣቢያ ከሆኑ ብቻ ነው የምስል ሥራ ሂደት የሚጋሩት።</translation> <translation id="2676946222714718093">እየተጫወተ ያለው በ፦</translation> <translation id="2678063897982469759">እንደገና አንቃ</translation> -<translation id="2678246812096664977">ሁሉም ተሰኪዎች</translation> <translation id="2679385451463308372">የስርዓት መልዕክቱን ተጠቅመው ያትሙ…</translation> <translation id="2680208403056680091">የበይነመረብ ግንኙነትዎ ቁጥጥር እየተደረገበት ነው</translation> <translation id="268053382412112343">&ታሪክ</translation> @@ -1440,7 +1439,6 @@ <translation id="287286579981869940"><ph name="PROVIDER_NAME" /> አክል...</translation> <translation id="2872961005593481000">ዝጋ</translation> <translation id="2875698561019555027">(Chrome ስህተት ገጾች)</translation> -<translation id="2879560882721503072">በ<ph name="ISSUER" /> የተሰጠ የደንበኛ እውቅና ማረጋገጫ በተሳካ ሁኔታ ተከማችቷል።</translation> <translation id="288024221176729610">ቼክኛ</translation> <translation id="288042212351694283">ሁለገብ 2ኛ ደረጃ መሣሪያዎችዎን ይደርስባቸዋል</translation> <translation id="2881966438216424900">ለመጨረሻ ጊዜ የተደረሰው፦</translation> @@ -1589,6 +1587,7 @@ <translation id="3057861065630527966">የእርስዎን ፎቶዎች እና ቪዲዮዎች በምትኬ ያስቀምጡ</translation> <translation id="3058212636943679650">የኮምፒውተርዎን ስርዓተ ክወና ማስመለስ ያስፈለገዎት እንደሆነ የዳግም ማግኛ SD ካርድ ወይም የUSB ማህደረ ትውስታ ያስፈልገዎታል።</translation> <translation id="305932878998873762">የኤች ቲ ቲ ፒ ቀላል መሸጎጫ አዲስ መሸጎጫ ነው። የዲስክ ቦታ ምደባ በስርዓተ ፋይሉ ነው የሚወሰነው።</translation> +<translation id="3060251871394327123">ይህ በእርስዎ መሣሪያ የተከማቸ <ph name="SITE" /> ውሂብን ይሰርዛል። ለመቀጠል ይፈልጋሉ?</translation> <translation id="3061650404498811439">ከመርጦ መግቢያ የአይኤምኢ ምናሌው ሆነው የስሜት ገላጭ ምስል፣ እጅ ጽሑፍ እና የድምጽ ግቤትን ይድረሱ።</translation> <translation id="3062606427884046423">የAndroid MediaStyle ማሳወቂያዎችን ለChrome ማህደረ መረጃ ማሳወቂያዎች ይጠቀሙ።</translation> <translation id="3063844757726132584">ሁሉንም የእርስዎ መተግበሪያዎች ከዚህ ምቹ አስጀማሪ ሆነው ይድረሱባቸው። ጨዋታዎችን ይጫወቱ፣ በቪዲዮ ይወያዩ፣ ሙዚቃን ያዳምጡ፣ ሰነዶችን ያርትዑ ወይም ተጨማሪ መተግበሪያዎችን ያግኙ።</translation> @@ -1638,6 +1637,7 @@ <translation id="3123569374670379335">(ክትትል የሚደረግበት)</translation> <translation id="3124111068741548686">የተጠቃሚ መያዣዎች</translation> <translation id="3126026824346185272">Ctrl</translation> +<translation id="3127156390846601284">ይህ ለሁሉም ለሚታዩት ጣቢያዎች በእርስዎ መሣሪያ ላይ የተክማቸ ማናቸውንም ውሂብ ይሰርዛል። ለመቀጠል ይፈልጋሉ?</translation> <translation id="312759608736432009">የመሣሪያ አምራች፦</translation> <translation id="3127919023693423797">በማረጋገጥ ላይ...</translation> <translation id="3128230619496333808">ትር 6</translation> @@ -1736,7 +1736,6 @@ <translation id="3264544094376351444">Sans-Serif ቅርጸ ቁምፊ፦</translation> <translation id="3264547943200567728">የእርስዎን የChromebox አውታረ መረብ ማቀናበር አልተሳካም</translation> <translation id="3265459715026181080">መስኮት ዝጋ</translation> -<translation id="3267271790328635957">ፒዲኤፍ ብቻ</translation> <translation id="3267726687589094446">በርካታ ፋይሎችን በራስ ሰር ማውረድን መፍቀድ ቀጥል</translation> <translation id="3267998849713137817">የተሻሻለበት ጊዜ</translation> <translation id="3268451620468152448">ክፍት ትሮች</translation> @@ -1982,6 +1981,7 @@ <translation id="3574210789297084292">ግባ</translation> <translation id="3574305903863751447"><ph name="CITY" />፣ <ph name="STATE" /> <ph name="COUNTRY" /></translation> <translation id="357479282490346887">ሊቱአኒያን</translation> +<translation id="3575927481544652747">በWindows 10 ወይም ከዛ በኋላ ባሉት ላይ በነባሪ የገበረውን Windows Runtime MIDI ኤፒአይን ለWebMIDI ያሰናክሉ።</translation> <translation id="3576324189521867626">በተሳካ ሁኔታ ተጭኗል</translation> <translation id="3578331450833904042">ነባሪ (ሁሉንም ነገር አንሳ)</translation> <translation id="3578594933904494462">የዚህ ትር ይዘት በመጋራት ላይ ነው።</translation> @@ -2035,8 +2035,6 @@ <translation id="3627320433825461852">ከ1 ደቂቃ በታች ይቀራል</translation> <translation id="3627588569887975815">አገናኙን ማን&ነትን በማያሳውቅ መስኮት ክፈት</translation> <translation id="3627671146180677314">የNetscape ሰርቲፊኬት የእድሳት ጊዜ</translation> -<translation id="3629326610814700057">የማከማቻ አስተዳዳሪን አካባቢያዊ ማከማቻን እንዲያስተዳድር ያስችላል።</translation> -<translation id="3630337581925712713"><ph name="PERMISSION_TYPE_LABEL" />፦</translation> <translation id="3631337165634322335">ከታች ያሉት የማይካተቱት የአሁኑ የማንነትን የማያሳውቅ ክፍለ-ጊዜ ብቻ ነው የሚመለከታቸው።</translation> <translation id="3633586230741134985">የመተግበሪያ ማስጀመሪያ ቅንብሮች</translation> <translation id="3633997706330212530">እነዚህን አገልግሎቶች በአማራጭነት ሊያሰናክሉም ይችላሉ።</translation> @@ -2059,7 +2057,8 @@ <translation id="3654045516529121250">የተደራሽነት ቅንብሮችዎን ያነብባል</translation> <translation id="3654092442379740616">የማመሳሰል ስህተት፦ <ph name="PRODUCT_NAME" /> ጊዜው ያለፈበትና መዘመን የሚያስፈልገው ነው።</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{ወደ አንድ ፋይል ቋሚ መዳረሻ አለው።}one{ወደ # ፋይሎች ቋሚ መዳረሻ አለው።}other{ወደ # ፋይሎች ቋሚ መዳረሻ አለው።}}</translation> -<translation id="3657468915905674858">PPAPI Win32k መቆለፊያን አንቃ።</translation> +<translation id="365793796291733849"><ph name="BEGIN_PARAGRAPH1" />ራስ-ሰር ምትኬን ሲያበሩ የመሣሪያ እና የመተግበሪያ ውሂብ በየጊዜው Google Drive ላይ ወዳለ የግል አቃፊ ይቀመጣል። የመተግበሪያ ውሂብ እንደ እውቂያዎች፣ መልእክቶች፣ እና ፎቶዎች ያሉ ሚስጥራዊነት ሊኖራቸው የሚችል ውሂብም ጨምሮ አንድ መተግበሪያ የሚያስቀምጠው ማንኛውም ውሂብ ሊሆን ይችላል (በገንቢው ቅንብሮች ላይ የሚወሰን)።<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />የምትኬ ውሂብ በእርስዎ የDrive ማከማቻ ኮታ ላይ አይቆጠርም። ትላልቅ ፋይሎች፣ ወይም ገንቢዎች ከአገልግሎቱ ሊያስቀሯቸው የመረጧቸው ፋይሎች ምትኬ አይቀመጥላቸውም።<ph name="END_PARAGRAPH2" /></translation> <translation id="3660234220361471169">የማይታመን</translation> <translation id="3665589677786828986">Chrome አንዳንድ ቅንብሮችዎ በሌላ ፕሮግራም መበላሸቱን አስተውሏል፣ እና ወደ የመጀመሪያዎቹ ነባሪዎቻቸው መልሷቸዋል።</translation> <translation id="3665842570601375360">ደህንነት፦</translation> @@ -2114,6 +2113,7 @@ <translation id="3733127536501031542">SSL አገልጋይ ከነ ማሳደጊያው</translation> <translation id="3736520371357197498">ደህንነትዎ ላይ የሚያመጣቸውን ስጋቶች ከተረዱ አደገኛ ፕሮግራሞቹ ከመወገዳቸው በፊት <ph name="BEGIN_LINK" />ይህን ደህንነቱ ያልተጠበቀ ጣቢያ ሊጎብኙ<ph name="END_LINK" /> ይችላሉ።</translation> <translation id="3738924763801731196"><ph name="OID" />፦</translation> +<translation id="3739254215541673094"><ph name="APPLICATION" /> ይከፈት?</translation> <translation id="3739798227959604811">ከመድገም በፊት አዘግይ፦</translation> <translation id="3741158646617793859"><ph name="DEVICE_NAME" /> አሁን በአስተዳዳሪ መሥሪያው ውስጥ ይታያል</translation> <translation id="3741243925913727067">የእርስዎን ሚዲያ መሣሪያ ፎቶዎች እና ቪዲዮዎች ወደ Google Drive በምትኬ ያስቀምጡ።</translation> @@ -2352,7 +2352,6 @@ <translation id="4058793769387728514">ሰነዱን አሁን አረጋግጥ</translation> <translation id="4059285154003114015">&ፍሬም አትም…</translation> <translation id="406070391919917862">የጀርባ መተግበሪያዎች</translation> -<translation id="4061502419206152498">ደህንነታቸው ያልተጠበቀ፣ ያልታነሙትን ብቻ አሳይ</translation> <translation id="4062251648694601778">በ<ph name="SHORT_PRODUCT_NAME" /> መሣሪያዎ ይደሰቱ። ጥያቄዎች አሉዎት? በሁኔታ ትሪው ላይ ያለውን «?» ጠቅ በማድረግ በማንኛውም ጊዜ እገዛ ማግኘት ይችላሉ።</translation> <translation id="4065876735068446555">እየተጠቀሙ ያሉት (<ph name="NETWORK_ID" />) አውታረ መረብ በመለያ መግቢያ ገጹን እንዲጎበኙ ይጠይቅዎ ይሆናል።</translation> <translation id="4068506536726151626">ይህ ገጽ አካባቢዎን እየተከታተሉ ካሉት የሚከተሉት ጣቢያዎች አባላትን ይዟል፦</translation> @@ -2389,7 +2388,6 @@ <translation id="4101878899871018532">የይለፍ ቃል አስተዳዳሪው ለማመሳሰል ጥቅም ላይ የዋለውን የምስክር ወረቀት ማስቀመጥን አያቀርብም።</translation> <translation id="410351446219883937">ራስ-አጫውት</translation> <translation id="4104163789986725820">ወደ &ውጪ ላክ...</translation> -<translation id="4105523032910086267">የእነማ እና የደህንነት ቃላትን ታይነት በቁሳዊ ዲዛይን ውስጥ ያዘጋጃል።</translation> <translation id="4105563239298244027">ከGoogle Drive ጋር 1 ቴባ ነጻ ያግኙ</translation> <translation id="4109135793348361820">መስኮት ወደ <ph name="USER_NAME" /> (<ph name="USER_EMAIL" />) ውሰድ</translation> <translation id="4110342520124362335">ከ<ph name="DOMAIN" /> የሚመጡ ኩኪዎች ታግደዋል።</translation> @@ -2440,6 +2438,7 @@ <translation id="418179967336296930">የሩሲያ የድምፅ አነባበብ (YaZHert) ቁልፍ ሰሌዳ</translation> <translation id="4181841719683918333">ቋንቋዎች</translation> <translation id="4187248015940562149">ድር ጣቢያዎች በእርስዎ ዙሪያ ካሉ የብሉቱዝ መሣሪያዎች ጋር እንዲገናኙና እነሱን እንዲቆጣጠር ሊያስችል የሚችለውን የድር ብሉቱዝን ያነቃል።</translation> +<translation id="4188447344915957833">በቁሳዊ ንድፍ ቅንብሮች ውስጥ የማከማቻ አስተዳዳሪን ያነቃል።</translation> <translation id="4189406272289638749">አንድ ቅጥያ <b><ph name="EXTENSION_NAME" /></b> ይህን ቅንብር እየተቆጣጠረ ነው።</translation> <translation id="4193154014135846272">Google ሰነድ</translation> <translation id="4193182321948161343">የቁሳዊ ንድፍ ተጠቃሚ አስተዳደርን አንቃ</translation> @@ -2647,6 +2646,7 @@ <translation id="4508765956121923607">ም&ንጭ አሳይ</translation> <translation id="4509017836361568632">ፎቶ ያስወግዱ</translation> <translation id="4509345063551561634">አካባቢ፦</translation> +<translation id="4513946894732546136">ግብረ መልስ</translation> <translation id="4514542542275172126">አዲስ ክትትል የሚደረግበት ተጠቃሚ ያዋቅሩ</translation> <translation id="4514914692061505365">ለሁሉም pexe ፋይሎች የPNaCl ፈጣን Subzero ተርጓሚን መጠቀም ያስገድዳል።</translation> <translation id="451515744433878153">አስወግድ</translation> @@ -2745,6 +2745,7 @@ <translation id="4656293982926141856">ይህ ኮምፒውተር</translation> <translation id="4656631038341342120">ለዚህ መሣሪያ የሚገኝ ሲሆን የምናባዊ እውነታ ቀፎን አንቃ።</translation> <translation id="4657031070957997341">ሁልጊዜ በ<ph name="HOST" /> ላይ ተሰኪዎች ፍቀድ</translation> +<translation id="466008749075469935">የበስተጀርባ ጊዜ ቆጣሪዎችን የCPU አጠቃቀም ወደ 1% ለመገደብ ማስታረቂያ እርምጃን ያነቃል።</translation> <translation id="4663254525753315077">ሲቻል ተርፎ የሚፈስ የሽብለላ ክፍል ይበልጥ ለፈጠነ ማሸብለል ወደ የተጠናከረ ንብርብር ያስቀምጣቸዋል።</translation> <translation id="4664482161435122549">PKCS #12 የመላክ ስህተት</translation> <translation id="4665014895760275686">አምራች</translation> @@ -2813,6 +2814,7 @@ <translation id="4749157430980974800">የጂዩርጂያ ቁልፍ ሰሌዳ</translation> <translation id="4750394297954878236">የአስተያየት ጥቆማዎች</translation> <translation id="475088594373173692">የመጀመሪያ ተጠቃሚ</translation> +<translation id="4750892496809949692">ከተሰኪዎች ዝርዝሩ ላይ Flashን በመደበቅ የኤችቲኤምኤል ይዘትን ይምረጡ።</translation> <translation id="4750917950439032686">የእርስዎ መረጃ (ለምሳሌ፦ የይለፍ ቃሎች ወይም የክሬዲት ካርድ ቁጥሮች) ወደዚህ ጣቢያ በሚላክበት ጊዜ የግል ነው።</translation> <translation id="4753602155423695878">የAndroid ስልክ ገጽ መጫን ሂደት አሞሌ እነማ</translation> <translation id="4755240240651974342">የፊኒሽ ቁልፍ ሰሌዳ</translation> @@ -3087,6 +3089,7 @@ <translation id="5119450342834678097">በቅንብሮች ምናሌ ውስጥ የጡባዊ ጣቢያ ጠይቅ አማራጭ</translation> <translation id="5120068803556741301">የሶስተኛ ወገን የግቤት ስልት</translation> <translation id="5120421890733714118">ድር ጣቢያዎችን ለመለየት ይህን የእውቅና ማረጋገጫ ይመኑ።</translation> +<translation id="5120516977819314347">ፒን ወይም የይለፍ ቃል ትክክል አይደለም።</translation> <translation id="5121130586824819730">ደረቅ አንጻፊዎ ሙሉ ነው። እባክዎ ሌላ ቦታ ላይ ያስቀምጡ ወይም ደረቅ አንጻፊው ላይ ቦታ ያስለቅቁ።</translation> <translation id="5125751979347152379">ልክ ያልሆነ URL።</translation> <translation id="5127881134400491887">የአውታረ መረብ ግንኙነቶች አቀናብር</translation> @@ -3094,6 +3097,7 @@ <translation id="512903556749061217">ተያያዟል</translation> <translation id="5129301143853688736">አጥቂዎች የእርስዎን መረጃ (ለምሳሌ፣ ፎቶዎች፣ የይለፍ ቃሎች፣ መልዕክቶች እና የብድር ካርዶች) ከ<ph name="DOMAIN" /> ላይ ለመስረቅ እየሞከሩ ሊሆን ይችላል።</translation> <translation id="5129662217315786329">ፖሊሽ</translation> +<translation id="5131347545782851480">ተሰቅ ሰነዶች</translation> <translation id="5134856901811723984">በChrome OS ስርዓት በይነገጽ ውስጥ ቁሳዊ ንድፍ</translation> <translation id="5135533361271311778">የዕልባት ንጥል መፍጠር አልተቻለም።</translation> <translation id="5136529877787728692">F7</translation> @@ -3262,6 +3266,7 @@ <translation id="5328031682234198929">8</translation> <translation id="5329858601952122676">&ሠርዝ</translation> <translation id="5330145655348521461">እነዚህ ፋይሎች በተለየ ዴስክቶፕ ላይ ተከፍተዋል። ለማየት ወደ <ph name="USER_NAME" /> (<ph name="MAIL_ADDRESS" />) ይውሰዱት።</translation> +<translation id="5330512191124428349">መረጃ ያግኙ</translation> <translation id="5332624210073556029">የሰዓት ሰቅ፦</translation> <translation id="5333807720589685258">ትክክለኛውን የመክፈቻ ፒን ቁልፍ ማስገባት ካልቻሉ የእርስዎ ሲም ካርድ በቋሚነት ይሰናከላል።</translation> @@ -3693,7 +3698,6 @@ <translation id="5892507820957994680">አብሮ የተሰራውን የሶፍትዌር ማሳያ ዝርዝሩን የሚሽርና ባልተደገፉ የስርዓት ውቅሮች ላይ በጂፒዩ ማጣደፍን የሚያነቃ ነው።</translation> <translation id="5895138241574237353">እንደገና ጀምር</translation> <translation id="5895187275912066135">በዚህ ቀን ቀርቧል</translation> -<translation id="5898154795085152510">አገልጋዩ ልክ ያልሆነ የደንበኛ እውቅና ማረጋገጫ መልሷል። ስህተት <ph name="ERROR_NUMBER" /> (<ph name="ERROR_NAME" />)።</translation> <translation id="5900302528761731119">Google የመገለጫ ፎቶ</translation> <translation id="590253956165195626">በሚያነብቡት ቋንቋ ያልሆኑ ገፆችን እንዲተረጎሙ ያቅርቡ።</translation> <translation id="5904093760909470684">የተኪ ውቅር</translation> @@ -3748,6 +3752,8 @@ <translation id="5984222099446776634">በቅርብ ጊዜ የተጎበኙ</translation> <translation id="5984814259619230127">የSmart Lock Bluetooth Low Energy Discovery</translation> <translation id="5986245990306121338">ከነቃ፣ የትር ቀያያሪው በቅንብሮች ውስጥ «የአዋህድ ትሮች እና መተግበሪያዎች» አማራጭ በሚበራ ጊዜም ይታያል።</translation> +<translation id="5989712527536636369"><ph name="BEGIN_PARAGRAPH1" />ይህ ስለ የእርስዎ መሣሪያ እና እንደ የባትሪ ደረጃ፣ በምን ያክል ጊዜ ድግምግሞሽ የእርስዎን መተግበሪያዎች እንደሚጠቀሙ፣ የእርስዎ አውታረ መረብ ግንኙነቶች የጥራት ደረጃ እና ቆይታ ጊዜ (እንደ Wi-Fi እና ብሉቱዝ)፣ እና ነገሮች መሥራት ባለባቸው መንገዶች ሳይሠሩ ሲቀሩ የሳንካ ሪፖርቶችን የመሳሰሉ እንዴት መሣሪያዎን እንደሚጠቀሙበት የተመለከተ አጠቃላይ መረጃ ነው። ለሁሉም ሰው የGoogle ምርቶችን እና አገልግሎቶችን ለማሻሻል ጥቅም ላይ ይውላሉ። አንዳንድ ድምር መረጃ እንደ Android ገንቢዎች የመሳሰሉ አጋሮች መተግበሪያዎቻቸውን እና ምርቶቻቸውን የተሻሉ እንዲሆኑ እንዲያደጉ ጭምር ያግዛል።<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />ይህንን በማናቸውም ጊዜ በAndroid መተግበሪያዎች ቅንብሮች ውስጥ ሊያበሩት ወይም ሊያጠፉት ይችላሉ። ይህ እንደ የሥርዓት ዝማኔዎች እና ደኅንነት የመሳሰሉ አስፈላጊ አገልግሎቶችን ለመቀበል እንዲችል የሚያስፈልገውን የመሣሪያዎ ብቃት ላይ ተጽዕኖ አያሳርፍም።<ph name="END_PARAGRAPH2" /></translation> <translation id="5990198433782424697">chrome:// ዩ አር ኤሎች ላይ ያሉ ቅጥያዎች</translation> <translation id="5990814808592353318">በራስ የይለፍ ቃልን ማመንጨት።</translation> <translation id="5991049340509704927">አጉላ</translation> @@ -3761,6 +3767,7 @@ <translation id="6005695835120147974">ሚዲያ ራውተር</translation> <translation id="6007237601604674381">መውሰድ አልተሳካም። <ph name="ERROR_MESSAGE" /></translation> <translation id="6008241731410823808">የገጽ አገናኝ መቆጣጠሪያ ፒንግ ይልካል</translation> +<translation id="6011449291337289699">የጣቢያ ውሂብን አጽዳ</translation> <translation id="6015796118275082299">ዓመት</translation> <translation id="6016551720757758985">ወደ ቀድሞው ስሪት ከመመለስ ጋር Powerwashን ያረጋግጡ</translation> <translation id="6016809788585079594">ለመጨረሻ ጊዜ አንዴ «Ok Google» ይበሉ</translation> @@ -3950,7 +3957,6 @@ <translation id="6276301056778294989">መሣሪያው ተመሳሳዩን ኮድ እያሳየ እንደሆነ ያረጋግጡ።</translation> <translation id="6277105963844135994">የአውታረ መረብ ጊዜ ማብቂያ</translation> <translation id="6277518330158259200">ቅጽበታዊ ገጽ እይታ ፎቶ አን&ሳ</translation> -<translation id="6278428485366576908">ገጽታ</translation> <translation id="6279183038361895380">የእርስዎን ጠቋሚ ለማሳየት |<ph name="ACCELERATOR" />| ይጫኑ</translation> <translation id="6280215091796946657">በተለየ መለያ ይግቡ</translation> <translation id="6280912520669706465">ኤአርሲ</translation> @@ -4202,6 +4208,7 @@ <translation id="6607272825297743757">የፋይል መረጃ</translation> <translation id="6607831829715835317">&ተጨማሪ መሣሪያዎች</translation> <translation id="6608140561353073361">ሁሉም ኩኪዎች እና የጣቢያ ውሂብ...</translation> +<translation id="6610183966322615106">አታሚ ማከል ላይ ስህተት</translation> <translation id="6610610633807698299">ዩአርኤል ያስገቡ...</translation> <translation id="6612358246767739896">ጥበቃ የሚደረግለት ይዘት</translation> <translation id="6615455863669487791">አሳየኝ</translation> @@ -4265,7 +4272,6 @@ <translation id="6708242697268981054">መነሻ፦</translation> <translation id="6709357832553498500"><ph name="EXTENSIONNAME" />ን በመጠቀም አገናኝ</translation> <translation id="6710213216561001401">ቀዳሚ</translation> -<translation id="6712158998835983046">ሁሉንም አሳይ፣ የታነመ</translation> <translation id="6718273304615422081">በማጨቅ ላይ...</translation> <translation id="671928215901716392">ማያ ገጽ ይቆልፉ</translation> <translation id="6721972322305477112">&ፋይል</translation> @@ -4538,7 +4544,6 @@ <translation id="7088434364990739311">የዝማኔ ፍተሻ መጀመር አልተሳካም (የስህተት ኮድ <ph name="ERROR" />)።</translation> <translation id="708856090370082727">የOSK አልፎ መሸብለያ ድጋፍ ያንቁ። ይህ ጥቆማ ሲበራ OSK የምስላዊ መመልከቻው መጠኑን ብቻ ነው የሚቀይረው።</translation> <translation id="7088674813905715446">ይህ መሳሪያ በአስተዳዳሪው ወዳልተከፋፈለ ሁኔታ ተቀምጧል። ለምዝገባ ለማንቃት፣ እባክዎ አስተዳዳሪዎ እየተካሄደ ወዳለ ሁኔታ እንዲለውጠው ያድርጉ።</translation> -<translation id="7089609847854449639">የማከማቻ አቀናባሪ</translation> <translation id="708969677220991657">የማይሰራ የምስክር ወረቀት ቢቀርብለትም ጥያቄዎችን በኤችቲቲፒኤስ በኩል ወደ አካባቢያዊ አስተናጋጅ ይፈቅዳል።</translation> <translation id="7092106376816104">የማይካተቱ ብቅ-ባዮች</translation> <translation id="7093866338626856921">ስማቸው እንደሚከተለው ከሆኑ መሣሪያዎች ጋር ውሂብ ተለዋወጥ፦ <ph name="HOSTNAMES" /></translation> @@ -4578,7 +4583,7 @@ <translation id="715118844758971915">አይነታቸው የሚታወቁ አታሚዎች</translation> <translation id="7154130902455071009">የመጀመሪያ ገጽዎን ወደሚከተለው ይቀይሩ፦ <ph name="START_PAGE" /></translation> <translation id="7155171745945906037">ነባር ፎቶ ከካሜራ ወይም ከፋይል</translation> -<translation id="715568033737470079">በWin32k መቆለፊያ ማጠሪያ መመሪያ ውስጥ የሚያሄዱት የPPAPI ተሰኪዎችን ይግለጹ (Windows 10 እና ከዚያ በላይ ብቻ)።</translation> +<translation id="7155226869555939647">ለ<ph name="APPLICATION" /> ሁልጊዜ አገናኞችን ክፈት</translation> <translation id="7156235233373189579">ይህ ፋይል የWindows ሶፍትዌር ለሚጠቀም ተኮ ነው የተቀየሰው። ይሄ Chrome OSን ከሚያሄደው መሣሪያዎ ጋር ተኳሃኝ አይደለም። ተገቢ የሆነ ምትክ መተግበሪያ ለማግኘት እባክዎ <ph name="BEGIN_LINK" />የChrome ድር መደብሩን<ph name="END_LINK" /> ይፈልጉ።<ph name="BEGIN_LINK_HELP" />ተጨማሪ ለመረዳት<ph name="END_LINK_HELP" /></translation> <translation id="7157063064925785854">ቀጥልን ጠቅ በማድረግ በ<ph name="LEGAL_DOC_LINK_TEXT_1" />፣ <ph name="LEGAL_DOC_LINK_TEXT_2" />፣ <ph name="LEGAL_DOC_LINK_TEXT_3" /> እና <ph name="LEGAL_DOC_LINK_TEXT_4" /> ይስማማሉ።</translation> <translation id="7158238151765743968">ከ«<ph name="DEVICE_NAME" />» ጋር የሚደረገው ግንኙነት አሁንም በሂደት ላይ ነው።</translation> @@ -4593,6 +4598,7 @@ <translation id="7175353351958621980">የተጫነው ከ፦</translation> <translation id="7180611975245234373">አድስ</translation> <translation id="7180865173735832675">አብጅ</translation> +<translation id="7181387261278441780">አጽዳ እና ጣቢያን ዳግም አስጀምር</translation> <translation id="7185078796915954712">TLS 1.3</translation> <translation id="7185690883425432021">tabstrip በቁልል ሁነታ ውስጥ በሚሆንበት ጊዜ ንቁ ያልሆኑ ትሮችን የዝጋ አዝራሮች ይደብቃል።</translation> <translation id="7186088072322679094">በመሣሪያ አሞሌ ውስጥ አቆይ</translation> @@ -4625,7 +4631,6 @@ <translation id="7223775956298141902">አቦ ባክዎ... ምንም ቅጥያዎች የለዎትም :-(</translation> <translation id="7224023051066864079">ሰብኔት ማስክ፦</translation> <translation id="7225179976675429563">የአውታረ መረብ አይነት ይጎድላል</translation> -<translation id="7230191962699768124">ሁሉንም አሳይ፣ ያልታነሙ</translation> <translation id="7230787553283372882">የእርስዎን የጽሑፍ መጠን ያብጁ</translation> <translation id="7231224339346098802">ስንት ቅጂዎች መታተም እንዳለባቸው ለማመላከት ቁጥር ይጠቀሙ (1 ወይም ተጨማሪ)።</translation> <translation id="7238585580608191973">SHA-256 የጣት አሻራ</translation> @@ -4757,7 +4762,6 @@ <translation id="7409233648990234464">ዳግም አስጀምር እና Powerwash</translation> <translation id="7409836189476010449">Flash አሂድ</translation> <translation id="7410344089573941623"><ph name="HOST" /> ካሜራዎን እና ማይክሮፎንዎን መድረስ ይፈልግ እንደሆነ ይጠይቁ</translation> -<translation id="7411343637221933631">{NUM_COOKIES,plural, =1{1 ከዚህ ጣቢያ}one{# ከዚህ ጣቢያ}other{# ከዚህ ጣቢያ}}</translation> <translation id="7412226954991670867">የጂፒዩ ማህደረ ትውስታ</translation> <translation id="7416362041876611053">ያልታወቀ የአውታረ መረብ ስህተት።</translation> <translation id="7417453074306512035">የግዕዝ ቁልፍ ሰሌዳ</translation> @@ -4879,6 +4883,7 @@ <translation id="756445078718366910">የአሳሻ መስኮት ክፈት</translation> <translation id="7564847347806291057">ሂደቱን ግታ</translation> <translation id="7566723889363720618">F12</translation> +<translation id="7567314848159753396">ኩኪ፦ <ph name="NAME" /></translation> <translation id="756809126120519699">የChrome ውሂብ ጸድቷል</translation> <translation id="7568790562536448087">በማዘመን ላይ</translation> <translation id="7573172247376861652">የባትሪ ሙሌት</translation> @@ -4919,6 +4924,7 @@ <translation id="7626009897377900107">የይለፍ ቃል ማመንጨት</translation> <translation id="7627262197844840899">ይህ ጣቢያ MasterCardን አይቀበልም።</translation> <translation id="7627790789328695202">ውይ፣ <ph name="FILE_NAME" /> አስቀድሞ አለ። ዳግም ይሰይሙትና እንደገና ይሞክሩ።</translation> +<translation id="7628127343934101653">ተሰቅ ፋይሎችን በነባሪው የተሰቅ መመልከቻ መተግበሪያ ክፈት።</translation> <translation id="762917759028004464">በአሁኑ ጊዜ መነሻ አሳሹ <ph name="BROWSER_NAME" /> ነው።</translation> <translation id="7629536005696009600">ለAndroid መተግበሪያዎች የተከማቹ ምስክርነቶች ወደ ተጓዳኝ ድር ጣቢያዎች እንዲሞሉ ይፍቀዱ።</translation> <translation id="7629827748548208700">ትር፦ <ph name="TAB_NAME" /></translation> @@ -5147,6 +5153,7 @@ <translation id="7957513156576779045">ማጣመርን ለመፍቀድ ብሉቱዝን ይፍቀዱ</translation> <translation id="7957615753207896812">የሰሌዳ ቁልፍ የመሣሪያ ቅንብሮችን ክፈት</translation> <translation id="7959074893852789871">ፋይሉ አንዳንዶቹ እንዲገቡ ያልተደረጉ በርካታ የእውቅና ማረጋገጫዎችን ይዟል፦</translation> +<translation id="7959700692661109221"><ph name="BEGIN_PARAGRAPH" />የGoogle አካባቢ አገልግሎት የመሣሪያዎ አካባቢ በበለጠ ፍጥነት እና ትክክለኝነት እንዲገምት ለማገዝ እንደ የWi‑Fi የመሳሰሉ ምንጮችን ይጠቀማል። የGoogle አካባቢ አገልግሎቶችን ሲያበሩ መሣሪያዎ የአካባቢ መረጃ ለማቅረብ ወደ Wi‑Fi የሚጠቀም ሁነታ ይገባል። ይህንን በማናቸውም ጊዜ በአካባቢ ቅንብሮች ውስጥ ማጥፋት ይችላሉ።<ph name="END_PARAGRAPH" /></translation> <translation id="7961015016161918242">በፍጹም</translation> <translation id="7964089325405904043">የይለፍ ቃላትን ማስመጣት እና ወደ ውጭ መላክ</translation> <translation id="7965010376480416255">የጋራ ማህደረ ትውስታ</translation> @@ -5302,6 +5309,7 @@ <translation id="8146793085009540321">መግባት አልተሳካም። እባክዎ አስተዳዳሪዎን ያነጋግሩ ወይም እንደገና ይሞክሩ።</translation> <translation id="8148264977957212129">የፒንዪን ግቤት ስልት</translation> <translation id="8148913456785123871">በአስጀማሪ ውስጥ የGoogle Now ካርዶችን አሳይ</translation> +<translation id="8150391391298684512">የWindows Runtime MIDI ኤፒአይን አሰናክል</translation> <translation id="8151185429379586178">የገንቢ መሳሪያዎች</translation> <translation id="8151638057146502721">አዋቅር</translation> <translation id="8151639108075998630">የእንግዳ አሰሳን ያንቁ</translation> @@ -5584,6 +5592,7 @@ <translation id="8532294913309524834">ቋንቋዎችን በእርስዎ ፍላጎት መሠረት ይደርድሩ።</translation> <translation id="8535005006684281994">የNetscape ሰርቲፊኬት የእድሳት ጊዜ URL</translation> <translation id="8539727552378197395">አይ (ኤችቲቲፒ ብቻ)</translation> +<translation id="8541084862688000575">የAndroid መተግበሪያዎችን በራስ-ሰር ጫን</translation> <translation id="8543181531796978784"><ph name="BEGIN_ERROR_LINK" />የፈልጎ ማግኘት ችግርን ሪፖርት ማድረግ<ph name="END_ERROR_LINK" />፣ ወይም ደግሞ በእርስዎ ደህንነት ላይ ሊያስከትል የሚችለውን አደጋ ከተረዱ <ph name="BEGIN_LINK" />ይህን ደህንነቱ ያልተጠበቀ ጣቢያ መጎብኘት<ph name="END_LINK" /> ይችላሉ።</translation> <translation id="8545107379349809705">መረጃ ደብቅ...</translation> <translation id="8545211332741562162">ድረ-ገጾች የሙከራ ጃቫስክሪፕት ባህሪያትን እንዲጠቀሙ ያነቃል።</translation> @@ -5611,7 +5620,6 @@ <translation id="8569764466147087991">የሚከፈት ፋይል ይምረጡ</translation> <translation id="8571032220281885258">«Ok Google» ሲሉ Chrome ቀጥሎ የሚሉትን ነገር ይፈልጋል።</translation> <translation id="8571108619753148184">አገልጋይ 4</translation> -<translation id="8572832761467613633">ፍላሽ ብቻ</translation> <translation id="8572981282494768930">ጣቢያዎች ካሜራዎን እና ማይክሮፎንዎን እንዲደርሱባቸው አይፍቀዱ</translation> <translation id="8574234089711453001">የሚዲያ ዩአርኤል ያለው ገጽ ሲከፈት የውርድ አዝራር እንዲታይ ይፍቀዱ።</translation> <translation id="857779305329188634">የሙከራ የQUIC ፕሮቶኮል ድጋፍ ያንቁ።</translation> @@ -5633,6 +5641,7 @@ <translation id="8600929685092827187">በጥቅሎች ላይ ቀስቅስ</translation> <translation id="8601206103050338563">TLS WWW የተገልጋይ ማረጋገጫ</translation> <translation id="8602851771975208551">በኮምፒውተርዎ ላይ ያለ ሌላ ፕሮግራም Chrome የሚሰራበት መንገድ ሊቀይር የሚችል አንድ መተግበሪያ አክሏል።</translation> +<translation id="8603912787021349466">የAndroid መተግበሪያዎች በመለያ ከተገባ በኋላ በራስ-ሰር እንዲጀምሩ ፍቀድ።</translation> <translation id="8605428685123651449">የSQLite ማህደረ ትውስታ</translation> <translation id="8605503133013456784">ከ«<ph name="DEVICE_NAME" />» ማላቀቅ እና አለማጣመር አልተሳካም።</translation> <translation id="8606726445206553943">የእርስዎን የ MIDI መሣሪያዎች ይጠቀሙ</translation> @@ -5985,6 +5994,7 @@ <translation id="9053965862400494292">ማመሳሰያን ለማዋቀር በሚሞከርበት ጊዜ ስህተት ተፈጥሯል።</translation> <translation id="9056034633062863292">Chromeboxን በማዘመን ላይ</translation> <translation id="9056810968620647706">ምንም ተዛማጆች አልተገኙም።</translation> +<translation id="9057119625587205566">በአቅራቢያ ምንም አታሚዎች የሉም</translation> <translation id="9059868303873565140">የሁኔታ ምናሌ</translation> <translation id="9064142312330104323">Google የመገለጫ ፎቶ (በመጫን ላይ)</translation> <translation id="9064275926664971810">በአንዲት ጠቅታ ራስ-ሙላ ቅጾችን እንዲሞላ ራስ-ሙላን ያንቁ</translation> @@ -5995,6 +6005,7 @@ <translation id="9067401056540256169">ይህ ጠቋሚ Chromeን ደህንነቱ ያልተጠበቀ ያደርገዋል። የሚያደርገውን ነገር የሚያውቁ ከሆነ ብቻ ይጠቀሙት። ይህ ጠቋሚ ያለምንም ማስታወሻ ሊወገድ እንደሚችል ያስተውሉ። ነቅቶ ከሆነ የhttps መነሻ ያላቸው ማእቀፎች ደህንነቱ ያልተጠበቀ ዩአርኤል ያለው WebSockets (ws://) ይጠቀማሉ።</translation> <translation id="9068931793451030927">ዱካ፦</translation> <translation id="9070219033670098627">ሰው ቀይር</translation> +<translation id="9070940116164932228">Throttle ውድ የበስተጀርባ ጊዜ ቆጣሪዎች</translation> <translation id="907148966137935206">የትኛውም ጣቢያ ብቅ-ባዮችን እንዲያሳይ አትፍቀድ (የሚደገፍ)</translation> <translation id="9072550133391925347"><ph name="PASSWORD_MANAGER_BRAND" /> እርስዎን ባስቀመጧቸው ይለፍ ቃላት ወደ ብቁ ጣቢያዎች እና መተግበሪያዎች ያስገባዎታል።</translation> <translation id="9073281213608662541">PAP</translation> @@ -6029,6 +6040,7 @@ <translation id="9112614144067920641">እባክዎ አዲስ ፒን ይምረጡ።</translation> <translation id="9112748030372401671">የእርስዎን ግድግዳ ወረቀት ይቀይራል</translation> <translation id="9112987648460918699">አግኝ…</translation> +<translation id="9114663181201435112">በቀላሉ በመለያ ይግቡ</translation> <translation id="9115487443206954631">የCast መሣሪያዎችን ያስተዳድሩ</translation> <translation id="9115675100829699941">&እልባቶች</translation> <translation id="9121814364785106365">እንደተሰካ ትር ክፈት</translation> @@ -6123,7 +6135,6 @@ <translation id="952992212772159698">አልገበረም</translation> <translation id="960719561871045870">የከዋኝ ኮድ</translation> <translation id="960987915827980018">1 ሰዓት አካባቢ ቀርቷል</translation> -<translation id="962778376131245616">ደህንነታቸው ያልተጠበቀ፣ የታነሙትን ብቻ አሳይ</translation> <translation id="96421021576709873">የWi-Fi አውታረ መረብ</translation> <translation id="965490406356730238">የተቀረጸ ክፍለ ገጸ ድር የሚገኝ ሲሆን በሃርድዌር የፈጠነ የmjpeg ምስጠራ መፍታትን ያንቁ።</translation> <translation id="968174221497644223">የመተግበሪያ መሸጎጫ</translation>
diff --git a/chrome/app/resources/generated_resources_ar.xtb b/chrome/app/resources/generated_resources_ar.xtb index eecc45e..b6a1e64 100644 --- a/chrome/app/resources/generated_resources_ar.xtb +++ b/chrome/app/resources/generated_resources_ar.xtb
@@ -18,7 +18,6 @@ <translation id="1029317248976101138">تكبير/تصغير</translation> <translation id="1029595648591494741">هل تريد تجربة "<ph name="EXTENSION_NAME" />"؟</translation> <translation id="1031362278801463162">تحميل المعاينة</translation> -<translation id="1031460590482534116">حدث خطأ أثناء محاولة تخزين شهادة العميل. خطأ <ph name="ERROR_NUMBER" /> (<ph name="ERROR_NAME" />).</translation> <translation id="1031573127485938293">الطلب (وفقًا للسياسة)</translation> <translation id="103279545524624934">احرص على تفريغ مساحة على القرص لتشغيل تطبيقات Android.</translation> <translation id="1033780634303702874">الوصول إلى الأجهزة التسلسلية</translation> @@ -101,6 +100,7 @@ <translation id="1128591060186966949">تعديل محرّك البحث</translation> <translation id="1128987120443782698">تبلغ سعة جهاز التخزين <ph name="DEVICE_CAPACITY" />. الرجاء إدخال بطاقة SD أو رقاقة ذاكرة USB بسعة 4 غيغابايت.</translation> <translation id="1137135726305341424">domContentLoaded وعمليات تحميل كل الموارد بدأت قبل domContentLoaded (الإطار الرئيسي ونفس إطارات iframe الأصلية).</translation> +<translation id="1138663153846032155">تفضيل HTML على Flash</translation> <translation id="1140351953533677694">الوصول إلى بلوتوث والأجهزة التسلسلية</translation> <translation id="114140604515785785">الدليل الجذر للإضافة:</translation> <translation id="1143142264369994168">الموقّع على الشهادات</translation> @@ -252,6 +252,7 @@ <translation id="1351692861129622852">جار استيراد ملفات <ph name="FILE_COUNT" /> ...</translation> <translation id="1352103415082130575">لوحة المفاتيح التايلاندية (Pattachote)</translation> <translation id="1353686479385938207"><ph name="PROVIDER_NAME" />: <ph name="NETWORK_NAME" /></translation> +<translation id="1353946958707294039">مدير سعة تخزين التصميم متعدد الأبعاد</translation> <translation id="1353966721814789986">صفحات بدء التشغيل</translation> <translation id="1354868058853714482">برنامج Adobe Reader غير محدث وقد يكون غير آمن.</translation> <translation id="1355408554203439639">أداة تحويل البرنامج ثلاثي الأبعاد</translation> @@ -424,7 +425,6 @@ <translation id="1533920822694388968">محاذاة التليفزيون</translation> <translation id="15373452373711364">مؤشر الماوس الكبير</translation> <translation id="1543284117603151572">تم الاستيراد من شبكة Edge</translation> -<translation id="1544350195767834591">{NUM_COOKIES,plural, =1{1 من المواقع الأخرى}zero{# من المواقع الأخرى}two{# من المواقع الأخرى}few{# من المواقع الأخرى}many{# من المواقع الأخرى}other{# من المواقع الأخرى}}</translation> <translation id="1545177026077493356">وضع الكشك التلقائي</translation> <translation id="1545786162090505744">عنوان URL الذي يحتوي على % بدلاً من طلب البحث</translation> <translation id="1546280085599573572">غيّرت هذه الإضافة الصفحة التي تظهر عند النقر على زر الصفحة الرئيسية.</translation> @@ -448,7 +448,6 @@ <translation id="1559235587769913376">إدخال أحرف Unicode</translation> <translation id="1561092721008294962">HarfBuzz لنص واجهة المستخدم</translation> <translation id="1566049601598938765">موقع ويب</translation> -<translation id="1566958206723629112">Flash وPDF</translation> <translation id="1567723158593978621">في حالة التمكين، سيستخدم تسجيل الدخول إلى المتصفح تدفق تسجيل الدخول الجديد المفصول بكلمة مرور GAIA.</translation> <translation id="1567993339577891801">وحدة تحكم جافا سكريبت</translation> <translation id="1568323446248056064">فتح إعدادات الجهاز للعرض</translation> @@ -577,7 +576,6 @@ <translation id="1723940674997333416">السماح بـ WebSocket غير آمن من أصل https</translation> <translation id="1725149567830788547">إظهار &عناصر التحكم</translation> <translation id="172612876728038702">يتم حاليًا إعداد TPM. الرجاء الانتظار؛ حيث قد يستغرق ذلك بضع دقائق.</translation> -<translation id="1727135806684246609">تفاصيل الأمان المادي</translation> <translation id="1729533290416704613">كما أنها تتحكم في الصفحة التي تظهر عند إجراء بحث من المربع متعدد الاستخدامات.</translation> <translation id="1731346223650886555">فاصلة منقوطة</translation> <translation id="1731589410171062430">الإجمالي: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /> (<ph name="NUMBER_OF_PAGES" /> <ph name="PAGE_OR_PAGES_LABEL" />)</translation> @@ -873,6 +871,7 @@ <translation id="218492098606937156">تمكين أحداث اللمس</translation> <translation id="2187317261103489799">اكتشاف (افتراضي)</translation> <translation id="2187895286714876935">خط استيراد شهادة الخادم</translation> +<translation id="2188881192257509750">فتح <ph name="APPLICATION" /></translation> <translation id="2190069059097339078">أداة الحصول على بيانات اعتماد WiFi</translation> <translation id="219008588003277019">وحدة البرنامج العميل الأصلي: <ph name="NEXE_NAME" /></translation> <translation id="2190355936436201913">(فارغ)</translation> @@ -991,6 +990,7 @@ <translation id="2326606747676847821">الانتقال إلى وضع التصفُّح المتخفّي</translation> <translation id="2326931316514688470">&إعادة تحميل التطبيق</translation> <translation id="2327492829706409234">تمكين التطبيق</translation> +<translation id="2328054044222305089">سيؤدي هذا إلى حذف أي بيانات لـ <ph name="SITE" /> مخزنة على الجهاز وإعادة تعيين أي أذونات منحتها للتشغيل. هل ترغب في المتابعة؟</translation> <translation id="2329597144923131178">سجّل الدخول للحصول على الإشارات المرجعية، والسجل، وكلمات المرور، والإعدادات الأخرى على كل أجهزتك.</translation> <translation id="2332131598580221120">عرض في المتجر</translation> <translation id="2332742915001411729">إعادة تعيين على الإعدادات الافتراضية</translation> @@ -1265,7 +1265,6 @@ <translation id="2675358154061544447">دعم تجريبي ممتاز لعرض نوافذ الأطر المدمجة عبر المواقع من خلال عمليات معالجة منفصلة. في هذا الوضع، سوف تشترك المستندات في عملية معالجة العارض إذا كانت تنتمي إلى نفس موقع الويب فقط.</translation> <translation id="2676946222714718093">التشغيل بواسطة</translation> <translation id="2678063897982469759">إعادة تمكين</translation> -<translation id="2678246812096664977">جميع المكونات الإضافية</translation> <translation id="2679385451463308372">مربع حوار الطباعة باستخدام النظام…</translation> <translation id="2680208403056680091">يتم التحكم في اتصال الإنترنت التابع لك</translation> <translation id="268053382412112343">ال&سجل</translation> @@ -1439,7 +1438,6 @@ <translation id="287286579981869940">جارٍ إضافة <ph name="PROVIDER_NAME" />...</translation> <translation id="2872961005593481000">إيقاف التشغيل</translation> <translation id="2875698561019555027">(صفحات الخطأ في Chrome)</translation> -<translation id="2879560882721503072">تم تخزين شهادة العميل الصادرة من <ph name="ISSUER" /> بنجاح.</translation> <translation id="288024221176729610">التشيكية</translation> <translation id="288042212351694283">الوصول إلى أجهزة العامل الثاني العالمي</translation> <translation id="2881966438216424900">تاريخ آخر دخول:</translation> @@ -1588,6 +1586,7 @@ <translation id="3057861065630527966">نسخ الصور ومقاطع الفيديو احتياطيًا</translation> <translation id="3058212636943679650">إذا احتجت يومًا لاسترداد نظام تشغيل الكمبيوتر، فسيتطلب ذلك توفر إما بطاقة SD أو رقاقة ذاكرة USB للاستعادة.</translation> <translation id="305932878998873762">ذاكرة التخزين المؤقت البسيطة لبروتوكول HTTP هي ذاكرة تخزين مؤقتة جديدة، حيث تعتمد على نظام الملفات لتوزيع مساحة القرص.</translation> +<translation id="3060251871394327123">سيؤدي هذا إلى حذف أي بيانات لـ <ph name="SITE" /> مخزنة على الجهاز. هل ترغب في المتابعة؟</translation> <translation id="3061650404498811439">يمكنك تمكين الوصول إلى الرموز التعبيرية والكتابة اليدوية ونموذج الإدخال الصوتي في قائمة تمكين محرِّر أسلوب الإدخال (IME).</translation> <translation id="3062606427884046423">استخدام إشعارات نمط الوسائط لنظام التشغيل Android لإشعارات الوسائط لمتصفح Chrome.</translation> <translation id="3063844757726132584">يمكنك الدخول إلى جميع تطبيقاتك من هذا المشغِّل المفيد. كما يمكنك تشغيل الألعاب ودردشة الفيديو والاستماع إلى الموسيقى وتعديل المستندات والحصول على مزيد من التطبيقات.</translation> @@ -1637,6 +1636,7 @@ <translation id="3123569374670379335">(خاضع للإشراف)</translation> <translation id="3124111068741548686">معالجات المستخدم</translation> <translation id="3126026824346185272">Ctrl</translation> +<translation id="3127156390846601284">سيؤدي هذا إلى حذف أي بيانات مخزنة على الجهاز لجميع المواقع المعروضة. هل ترغب في المتابعة؟</translation> <translation id="312759608736432009">مصنّع الجهاز:</translation> <translation id="3127919023693423797">جارٍ المصادقة...</translation> <translation id="3128230619496333808">علامة التبويب 6</translation> @@ -1735,7 +1735,6 @@ <translation id="3264544094376351444">خط Sans-serif</translation> <translation id="3264547943200567728">أخفق إعداد شبكة Chromebox</translation> <translation id="3265459715026181080">إغلاق الإطار</translation> -<translation id="3267271790328635957">PDF فقط</translation> <translation id="3267726687589094446">متابعة السماح بالتنزيلات التلقائية لعدة ملفات</translation> <translation id="3267998849713137817">الوقت المُعدل</translation> <translation id="3268451620468152448">علامات التبويب المفتوحة</translation> @@ -1979,6 +1978,7 @@ <translation id="3574210789297084292">تسجيل الدخول</translation> <translation id="3574305903863751447"><ph name="CITY" />, <ph name="STATE" /> <ph name="COUNTRY" /></translation> <translation id="357479282490346887">الليتوانية</translation> +<translation id="3575927481544652747">تعطيل واجهة برمجة تطبيقات MIDI لوقت التشغيل في نظام التشغيل Windows لـ WebMIDI، التي يتم تمكينها افتراضيًا على نظام التشغيل Windows الإصدار 10 أو الأحدث.</translation> <translation id="3576324189521867626">تم التثبيت بنجاح</translation> <translation id="3578331450833904042">افتراضي (اختيار كل شيء)</translation> <translation id="3578594933904494462">تجري مشاركة محتوى علامة التبويب هذه.</translation> @@ -2032,8 +2032,6 @@ <translation id="3627320433825461852">تتبقى أقل من دقيقة واحدة</translation> <translation id="3627588569887975815">فتح الرّابط في نافذة للتصفّح المتخ&فّي</translation> <translation id="3627671146180677314">وقت تجديد شهادة Netscape</translation> -<translation id="3629326610814700057">تُمكّن مدير سعة التخزين لإدارة سعة التخزين المحلية.</translation> -<translation id="3630337581925712713"><ph name="PERMISSION_TYPE_LABEL" />:</translation> <translation id="3631337165634322335">تنطبق الاستثناءات الواردة أدناه على جلسة التصفح المتخفي الحالية فقط.</translation> <translation id="3633586230741134985">إعدادات مشغّل التطبيقات</translation> <translation id="3633997706330212530">يمكنك تعطيل هذه الخدمات بشكل اختياري.</translation> @@ -2056,7 +2054,8 @@ <translation id="3654045516529121250">الاطلاع على إعدادات إمكانية الوصول</translation> <translation id="3654092442379740616">خطأ في المزامنة: <ph name="PRODUCT_NAME" /> قديم ويجب تحديثه.</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{لديه حق الوصول الدائم إلى ملف واحد.}zero{لديه حق الوصول الدائم إلى # من الملفات.}two{لديه حق الوصول الدائم إلى ملفين (#).}few{ لديه حق الوصول الدائم إلى # ملفات.}many{لديه حق الوصول الدائم إلى # ملفًا.}other{لديه حق الوصول الدائم إلى # من الملفات.}}</translation> -<translation id="3657468915905674858">تمكين إغلاق PPAPI Win32k.</translation> +<translation id="365793796291733849"><ph name="BEGIN_PARAGRAPH1" />عند تشغيل خدمة النسْخ الاحتياطي التلقائي، يتم حفظ بيانات الجهاز والتطبيق بشكل دوري في مجلد خاص في Google Drive. ويمكن أن تكون بيانات التطبيق هي أي بيانات حفظها هذا التطبيق (استنادًا إلى إعدادات مطوّر البرامج)، بما في ذلك البيانات التي يمكن أن تكون حساسة مثل جهات الاتصال والرسائل والصور.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />لن تحتسب بيانات النسْخ الاحتياطي ضمن حصتك في تخزين Drive. ولن يتم الاحتفاظ بنُسخ احتياطية من الملفات كبيرة الحجم أو الملفات التي اختار مطوّرو البرامج استبعادها من الخدمة.<ph name="END_PARAGRAPH2" /></translation> <translation id="3660234220361471169">غير موثوق بها</translation> <translation id="3665589677786828986">اكتشف Chrome أن بعض إعداداتك تم إتلافها من قبل برنامج آخر وإعادة تعيينها للحالة الافتراضية الأصلية.</translation> <translation id="3665842570601375360">الأمان:</translation> @@ -2111,6 +2110,7 @@ <translation id="3733127536501031542">خادم بروتوكول SSL (طبقة المقابس الآمنة) مع الترقية</translation> <translation id="3736520371357197498">إذا كنت على دراية بالمخاطر على أمنك، يمكنك <ph name="BEGIN_LINK" />زيارة هذا الموقع غير الآمن<ph name="END_LINK" /> قبل أن تتم إزالة البرامج الخطيرة.</translation> <translation id="3738924763801731196"><ph name="OID" />:</translation> +<translation id="3739254215541673094">هل ترغب في فتح <ph name="APPLICATION" />؟</translation> <translation id="3739798227959604811">التأخير قبل التكرار:</translation> <translation id="3741158646617793859">سيظهر <ph name="DEVICE_NAME" /> الآن في وحدة تحكم المشرف</translation> <translation id="3741243925913727067">يمكنك نسخ الصور ومقاطع الفيديو بجهاز الوسائط احتياطيًا على Google Drive.</translation> @@ -2346,7 +2346,6 @@ <translation id="4058793769387728514">فحص المستند الآن</translation> <translation id="4059285154003114015">&طباعة الإطار...</translation> <translation id="406070391919917862">تطبيقات الخلفية</translation> -<translation id="4061502419206152498">عرض غير الآمنة، غير المتحركة فقط</translation> <translation id="4062251648694601778">نتمنى لك الاستمتاع بجهاز <ph name="SHORT_PRODUCT_NAME" />. وإذا كانت لديك أسئلة، فيمكنك دائمًا الحصول على المساعدة من خلال النقر على الرمز "؟" في شريط الحالة.</translation> <translation id="4065876735068446555">قد تتطلب الشبكة التي تستخدمها <ph name="NETWORK_ID" /> زيارة صفحة تسجيل الدخول التابعة لها.</translation> <translation id="4068506536726151626">تحتوي هذه الصفحة على عناصر من المواقع التالية والتي تتتبع موقعك:</translation> @@ -2385,7 +2384,6 @@ <translation id="4101878899871018532">لن يوفر مدير كلمات المرور إمكانية حفظ بيانات الاعتماد المستخدمة في المزامنة.</translation> <translation id="410351446219883937">تشغيل تلقائي</translation> <translation id="4104163789986725820">ت&صدير...</translation> -<translation id="4105523032910086267">تُعين الصور المتحركة ومستوى الرؤية لتفاصيل الأمان في التصميم متعدد الأبعاد.</translation> <translation id="4105563239298244027">احصل على 1 تيرابايت مجانًا مع Google Drive</translation> <translation id="4109135793348361820">نقل النافذة إلى <ph name="USER_NAME" /> (<ph name="USER_EMAIL" />)</translation> <translation id="4110342520124362335">تم منع ملفات تعريف الارتباط الواردة من <ph name="DOMAIN" />.</translation> @@ -2436,6 +2434,7 @@ <translation id="418179967336296930">لوحة المفاتيح الروسية الصوتية (YaZHert)</translation> <translation id="4181841719683918333">اللغات</translation> <translation id="4187248015940562149">تمكين بلوتوث الويب الذي يمكن أن يسمح لمواقع الويب بالاتصال بأجهزة البلوتوث الموجودة حولك والتحكم بها.</translation> +<translation id="4188447344915957833">تمكين مدير سعة التخزين في إعدادات التصميم متعدد الأبعاد.</translation> <translation id="4189406272289638749">هناك إضافة، <b><ph name="EXTENSION_NAME" /></b>، تتحكم في هذا الإعداد.</translation> <translation id="4193154014135846272">مستند Google</translation> <translation id="4193182321948161343">تمكين مدير مستخدم "تصميم المادة"</translation> @@ -2643,6 +2642,7 @@ <translation id="4508765956121923607">عرض الم&صدر</translation> <translation id="4509017836361568632">إلغاء الصورة</translation> <translation id="4509345063551561634">المجلد:</translation> +<translation id="4513946894732546136">تعليقات</translation> <translation id="4514542542275172126">إعداد مستخدم جديد تحت الإشراف</translation> <translation id="4514914692061505365">فرض استخدام أداة الترجمة السريعة Subzero لـ PNaCl لجميع ملفات pexe.</translation> <translation id="451515744433878153">إزالة</translation> @@ -2741,6 +2741,7 @@ <translation id="4656293982926141856">هذا الكمبيوتر</translation> <translation id="4656631038341342120">تمكين VR shell إذا كان متوفرًا لهذا الجهاز.</translation> <translation id="4657031070957997341">السماح باستخدام المكونات الإضافية على <ph name="HOST" /> دومًا</translation> +<translation id="466008749075469935">تمكين التدخل لتقييد استخدام وحدة المعالجة المركزية (CPU) لمؤقتات الخلفية إلى 1%.</translation> <translation id="4663254525753315077">إن أمكن، تعمل هذه الميزة الاختبارية على وضع محتويات التمرير لعنصر تمرير في نص متجاوز لسعة الشاشة على طبقة مركّبة للتمرير الأسرع.</translation> <translation id="4664482161435122549">خطأ في تصدير PKCS #12</translation> <translation id="4665014895760275686">جهة التصنيع</translation> @@ -2809,6 +2810,7 @@ <translation id="4749157430980974800">لوحة المفاتيح الجورجية</translation> <translation id="4750394297954878236">الاقتراحات</translation> <translation id="475088594373173692">المستخدم الأول</translation> +<translation id="4750892496809949692">تفضيل محتوى HTML بإخفاء Flash من قائمة المكوّنات الإضافية.</translation> <translation id="4750917950439032686">إن معلوماتك (على سبيل المثال، كلمات المرور أو أرقام بطاقة الائتمان) تكون خاصة عندما يتم إرسالها إلى هذا الموقع.</translation> <translation id="4753602155423695878">الصور المتحركة لشريط تقدم تحميل الصفحة للهاتف الذي يعمل بنظام Android</translation> <translation id="4755240240651974342">لوحة المفاتيح الفنلندية</translation> @@ -3082,6 +3084,7 @@ <translation id="5119450342834678097">خيار طلب موقع الجهاز اللوحي في قائمة الإعدادات</translation> <translation id="5120068803556741301">طريقة إدخال من جهة خارجية</translation> <translation id="5120421890733714118">الوثوق بهذه الشهادة لتحديد هوية مواقع الويب.</translation> +<translation id="5120516977819314347">رقم التعريف الشخصي أو كلمة المرور غير صحيحة.</translation> <translation id="5121130586824819730">القرص الصلب ممتلئ. الرجاء الحفظ في مكان آخر أو توفير مساحة أكبر على القرص الصلب.</translation> <translation id="5125751979347152379">عنوان URL غير صالح.</translation> <translation id="5127881134400491887">إدارة اتصالات الشبكة</translation> @@ -3089,6 +3092,7 @@ <translation id="512903556749061217">متصل</translation> <translation id="5129301143853688736">اتصالك بهذا الموقع ليس له خصوصية. قد يحاول المهاجمون سرقة معلوماتك (على سبيل المثال، الصور وكلمات المرور والرسائل وبطاقات الائتمان) من <ph name="DOMAIN" />.</translation> <translation id="5129662217315786329">البولندية</translation> +<translation id="5131347545782851480">مستندات PDF</translation> <translation id="5134856901811723984">التصميم متعدد الأبعاد في واجهة المستخدم لنظام التشغيل Chrome</translation> <translation id="5135533361271311778">تعذر إنشاء عنصر إشارة.</translation> <translation id="5136529877787728692">F7</translation> @@ -3257,6 +3261,7 @@ <translation id="5328031682234198929">8</translation> <translation id="5329858601952122676">&حذف</translation> <translation id="5330145655348521461">تم فتح هذه الملفات على جهاز سطح مكتب آخر. يمكنك الانتقال إلى <ph name="USER_NAME" /> (<ph name="MAIL_ADDRESS" />) للاطلاع عليها.</translation> +<translation id="5330512191124428349">الحصول على معلومات</translation> <translation id="5332624210073556029">المنطقة الزمنية:</translation> <translation id="5333807720589685258">سيتم تعطيل شريحة SIM نهائيًا إذا لم تتمكن من إدخال مفتاح إلغاء تأمين رقم التعريف الشخصي الصحيح.</translation> @@ -3689,7 +3694,6 @@ <translation id="5892507820957994680">لتجاوز قائمة عرض البرامج المضمنة وتمكين التسارع عبر وحدة معالجة الرسومات في تهيئات غير متوافقة.</translation> <translation id="5895138241574237353">إعادة التشغيل</translation> <translation id="5895187275912066135">تاريخ الإصدار</translation> -<translation id="5898154795085152510">عرض الخادم شهادة عميل غير صالحة. خطأ <ph name="ERROR_NUMBER" /> (<ph name="ERROR_NAME" />).</translation> <translation id="5900302528761731119">صورة الملف الشخصي في Google</translation> <translation id="590253956165195626">عرض ترجمة الصفحات المكتوبة بلغة بخلاف لغتك.</translation> <translation id="5904093760909470684">تهيئة الخادم الوكيل</translation> @@ -3744,6 +3748,8 @@ <translation id="5984222099446776634">تم الانتقال إليها مؤخرًا</translation> <translation id="5984814259619230127">Smart Lock لاكتشاف الهواتف عبر بلوتوث منخفض الطاقة</translation> <translation id="5986245990306121338">في حالة التمكين، سيظهر مبدّل علامات التبويب حتى عند تشغيل خيار "دمج علامات التبويب والتطبيقات" في الإعدادات.</translation> +<translation id="5989712527536636369"><ph name="BEGIN_PARAGRAPH1" />هذه معلومات عامة حول جهازك وكيفية استخدامه، مثل مستوى البطارية وعدد المرات التي تستخدم فيها التطبيقات وجودة اتصالات الشبكة ومدتها (مثل Wi-Fi والبلوتوث) وتقارير الأعطال عندما لا تسير الأمور كما ينبغي. وسوف يتم استخدام هذه المعلومات لتحسين منتجات Google وخدماتها للجميع. كما ستساعد بعض المعلومات المجمّعة الشركاء، مثل مطوّري برامج Android على تحسين تطبيقاتهم ومنتجاتهم أيضًا.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />يمكنك تشغيل هذا أو إيقاف تشغيله في أي وقت في إعدادات تطبيقات Android. ولن يؤثر ذلك في قدرة الجهاز على إرسال المعلومات اللازمة له لتلقّي الخدمات الضرورية مثل تحديثات النظام والأمان.<ph name="END_PARAGRAPH2" /></translation> <translation id="5990198433782424697">الإضافات في عناوين chrome:// URL</translation> <translation id="5990814808592353318">إنشاء كلمات المرور اليدوي.</translation> <translation id="5991049340509704927">تكبير</translation> @@ -3757,6 +3763,7 @@ <translation id="6005695835120147974">موجّه الوسائط</translation> <translation id="6007237601604674381">أخفق النقل. <ph name="ERROR_MESSAGE" /></translation> <translation id="6008241731410823808">يرسل أدوات فحص الاتصال لتدقيق الروابط التشعبية.</translation> +<translation id="6011449291337289699">محو بيانات الموقع</translation> <translation id="6015796118275082299">عام</translation> <translation id="6016551720757758985">تأكيد Powerwash بالعودة إلى الإصدار السابق</translation> <translation id="6016809788585079594">قل "Ok Google" للمرة الأخيرة</translation> @@ -3947,7 +3954,6 @@ <translation id="6276301056778294989">تأكد أن الجهاز يعرض الرمز نفسه.</translation> <translation id="6277105963844135994">انتهاء مهلة الشبكة</translation> <translation id="6277518330158259200">الت&قاط لقطة شاشة</translation> -<translation id="6278428485366576908">مظهر</translation> <translation id="6279183038361895380">اضغط على |<ph name="ACCELERATOR" />| لعرض المؤشر</translation> <translation id="6280215091796946657">تسجيل الدخول باستخدام حساب مختلف</translation> <translation id="6280912520669706465">ARC</translation> @@ -4199,6 +4205,7 @@ <translation id="6607272825297743757">معلومات الملف</translation> <translation id="6607831829715835317">المزيد من &الأدوات</translation> <translation id="6608140561353073361">جميع ملفات تعريف الارتباط وبيانات الموقع...</translation> +<translation id="6610183966322615106">حدث خطأ أثناء إضافة طابعة</translation> <translation id="6610610633807698299">إدخال عنوان URL...</translation> <translation id="6612358246767739896">محتوى محمي</translation> <translation id="6615455863669487791">عرضه</translation> @@ -4262,7 +4269,6 @@ <translation id="6708242697268981054">المصدر:</translation> <translation id="6709357832553498500">الاتصال باستخدام <ph name="EXTENSIONNAME" /></translation> <translation id="6710213216561001401">السابق</translation> -<translation id="6712158998835983046">عرض الكل، المتحركة</translation> <translation id="6718273304615422081">جارٍ الضغط...</translation> <translation id="671928215901716392">قفل الشاشة</translation> <translation id="6721972322305477112">&ملف</translation> @@ -4535,7 +4541,6 @@ <translation id="7088434364990739311">أخفق بدء التحقق من التحديثات (رمز الخطأ <ph name="ERROR" />).</translation> <translation id="708856090370082727">تمكين دعم التمرير الزائد OSK. عند تشغيل هذه العلامة، سيغيّر OSK حجم إطار العرض المرئي فقط.</translation> <translation id="7088674813905715446">ألغى المشرف إدارة الحسابات لهذا الجهاز. لتمكينه من التسجيل، يُرجى أن تطلب من المشرف وضع الجهاز في حالة في انتظار المراجعة.</translation> -<translation id="7089609847854449639">مدير سعة التخزين</translation> <translation id="708969677220991657">السماح بإرسال الطلبات إلى المضيف المحلي عبر HTTP حتى في حالة تقديم شهادة غير صالحة.</translation> <translation id="7092106376816104">استثناءات النوافذ المنبثقة</translation> <translation id="7093866338626856921">تبادل البيانات مع الأجهزة المسماه: <ph name="HOSTNAMES" /></translation> @@ -4575,7 +4580,7 @@ <translation id="715118844758971915">الطابعات التقليدية</translation> <translation id="7154130902455071009">تغيير الصفحة الرئيسية إلى: <ph name="START_PAGE" /></translation> <translation id="7155171745945906037">صورة حالية من الكاميرا أو الملف</translation> -<translation id="715568033737470079">تحديد المكونات الإضافية لـ PPAPI التي سيتم تشغيلها بموجب سياسة وضع الحماية لإغلاق Win32k (إصدار Windows 10 والإصدارات الأحدث فقط).</translation> +<translation id="7155226869555939647">فتح الروابط دائمًا لـ <ph name="APPLICATION" /></translation> <translation id="7156235233373189579">تم تصميم هذا الملف لجهاز كمبيوتر يستخدم برنامج Windows. وهذا البرنامج غير متوافق مع جهازك الذي يعمل بنظام تشغيل Chrome. يُرجى البحث في <ph name="BEGIN_LINK" />سوق Chrome الإلكتروني<ph name="END_LINK" /> للحصول على تطبيق بديل مناسب.<ph name="BEGIN_LINK_HELP" />مزيد من المعلومات<ph name="END_LINK_HELP" /></translation> <translation id="7157063064925785854">يُعد النقر على "متابعة" بمثابة موافقة منك على <ph name="LEGAL_DOC_LINK_TEXT_1" />، و<ph name="LEGAL_DOC_LINK_TEXT_2" />، و<ph name="LEGAL_DOC_LINK_TEXT_3" />، و<ph name="LEGAL_DOC_LINK_TEXT_4" />.</translation> <translation id="7158238151765743968">لا يزال الاتصال بالجهاز "<ph name="DEVICE_NAME" />" قيد التقدم.</translation> @@ -4590,6 +4595,7 @@ <translation id="7175353351958621980">تم التحميل من:</translation> <translation id="7180611975245234373">تحديث</translation> <translation id="7180865173735832675">تخصيص</translation> +<translation id="7181387261278441780">محو الموقع وإعادة تعيينه</translation> <translation id="7185078796915954712">طبقة النقل الآمنة 1.3</translation> <translation id="7185690883425432021">يخفي أزرار الإغلاق لعلامات التبويب غير النشطة عندما يكون شريط علامات التبويب في وضع الحزمة.</translation> <translation id="7186088072322679094">البقاء مثبتًا في شريط الأدوات</translation> @@ -4622,7 +4628,6 @@ <translation id="7223775956298141902">عفوًا... ليست لديك أية إضافات :-(</translation> <translation id="7224023051066864079">قناع الشبكة الفرعية:</translation> <translation id="7225179976675429563">نوع الشبكة مفقود</translation> -<translation id="7230191962699768124">عرض الكل، غير المتحركة</translation> <translation id="7230787553283372882">تخصيص حجم النَّص</translation> <translation id="7231224339346098802">استخدم رقمًا للإشارة إلى عدد النُسخ المطلوب طباعتها (1 أو أكثر).</translation> <translation id="7238585580608191973">بصمة أصبع SHA-256</translation> @@ -4754,7 +4759,6 @@ <translation id="7409233648990234464">إعادة تشغيل وإجراء Powerwash</translation> <translation id="7409836189476010449">تشغيل Flash</translation> <translation id="7410344089573941623">السؤال عند رغبة <ph name="HOST" /> في الدخول إلى الكاميرا والميكروفون التابعين لك</translation> -<translation id="7411343637221933631">{NUM_COOKIES,plural, =1{1 من هذا الموقع}zero{# من هذا الموقع}two{# من هذا الموقع}few{# من هذا الموقع}many{# من هذا الموقع}other{# من هذا الموقع}}</translation> <translation id="7412226954991670867">ذاكرة GPU</translation> <translation id="7416362041876611053">خطأ غير معروف في الشبكة.</translation> <translation id="7417453074306512035">لوحة المفاتيح الإثيوبية</translation> @@ -4876,6 +4880,7 @@ <translation id="756445078718366910">فتح نافذة المتصفح</translation> <translation id="7564847347806291057">إنهاء العملية</translation> <translation id="7566723889363720618">F12</translation> +<translation id="7567314848159753396">ملف تعريف الارتباط: <ph name="NAME" /></translation> <translation id="756809126120519699">بيانات Chrome التي تم محوها</translation> <translation id="7568790562536448087">تحديث</translation> <translation id="7573172247376861652">شحن البطارية</translation> @@ -4916,6 +4921,7 @@ <translation id="7626009897377900107">إنشاء كلمات المرور</translation> <translation id="7627262197844840899">هذا الموقع لا يقبل بطاقة MasterCard.</translation> <translation id="7627790789328695202">عذرًا، <ph name="FILE_NAME" /> موجود من قبل. يمكنك إعادة تسميته وإعادة المحاولة.</translation> +<translation id="7628127343934101653">فتح ملفات PDF في تطبيق عارض PDF الافتراضي.</translation> <translation id="762917759028004464">المتصفح الافتراضي هو حاليًا <ph name="BROWSER_NAME" />.</translation> <translation id="7629536005696009600">السماح بملء بيانات الاعتماد المخزنة لتطبيقات Android في مواقع الويب المقابلة</translation> <translation id="7629827748548208700">علامة التبويب: <ph name="TAB_NAME" /></translation> @@ -5144,6 +5150,7 @@ <translation id="7957513156576779045">تشغيل بلوتوث للسماح بالإقران</translation> <translation id="7957615753207896812">فتح إعدادات الجهاز للوحة المفاتيح</translation> <translation id="7959074893852789871">احتوى الملف على شهادات متعددة، لم يتم استيراد بعضها:</translation> +<translation id="7959700692661109221"><ph name="BEGIN_PARAGRAPH" />تستخدم خدمة الموقع من Google مصادر مثل شبكة Wi‑Fi للمساعدة في تقدير موقع جهازك بشكلٍ أسرع وأكثر دقة. عند تشغيل خدمات الموقع من Google، يدخل الجهاز إلى وضع يتم فيه استخدام شبكة Wi‑Fi لتقديم معلومات الموقع. ويمكنك إيقاف تشغيل هذا في إعدادات الموقع في أي وقت.<ph name="END_PARAGRAPH" /></translation> <translation id="7961015016161918242">مطلقًا</translation> <translation id="7964089325405904043">استيراد كلمات المرور وتصديرها</translation> <translation id="7965010376480416255">الذاكرة المشتركة</translation> @@ -5294,6 +5301,7 @@ <translation id="8146793085009540321">أخفق تسجيل الدخول، يُرجى الاتصال بالمشرف أو إعادة المحاولة.</translation> <translation id="8148264977957212129">أسلوب الإدخال لنظام Pinyin</translation> <translation id="8148913456785123871">إظهار بطاقات المساعد الفوري من Google في launcher</translation> +<translation id="8150391391298684512">تعطيل واجهة برمجة تطبيقات MIDI لوقت التشغيل في نظام التشغيل Windows</translation> <translation id="8151185429379586178">أدوات مطوري البرامج</translation> <translation id="8151638057146502721">تهيئة</translation> <translation id="8151639108075998630">تمكين تصفح الضيف</translation> @@ -5575,6 +5583,7 @@ <translation id="8532294913309524834">ترتيب اللغات حسب تفضيلك.</translation> <translation id="8535005006684281994">عنوان URL لتجديد شهادة Netscape</translation> <translation id="8539727552378197395">لا (HttpOnly)</translation> +<translation id="8541084862688000575">تحميل تطبيقات Android تلقائيًا</translation> <translation id="8543181531796978784">يمكنك <ph name="BEGIN_ERROR_LINK" />الإبلاغ عن اكتشاف مشكلة<ph name="END_ERROR_LINK" /> أو، إذا كنت تدرك المخاطر المتعلقة بالأمان، يمكنك <ph name="BEGIN_LINK" />زيارة هذا الموقع غير الآمن<ph name="END_LINK" />.</translation> <translation id="8545107379349809705">إخفاء المعلومات...</translation> <translation id="8545211332741562162">تمكين صفحات الويب من استخدام ميزات جافا سكريبت التجريبية.</translation> @@ -5602,7 +5611,6 @@ <translation id="8569764466147087991">تحديد ملف لفتحه</translation> <translation id="8571032220281885258">عندما تقول "Ok Google" سيبحث Chrome عن ما تقوله بعد ذلك.</translation> <translation id="8571108619753148184">Server 4</translation> -<translation id="8572832761467613633">Flash فقط</translation> <translation id="8572981282494768930">عدم السماح بدخول مواقع الويب إلى الكاميرا والميكروفون</translation> <translation id="8574234089711453001">السماح بعرض زر التنزيل عند فتح صفحة باستخدام عنوان URL للوسائط.</translation> <translation id="857779305329188634">تمكين التوافق مع بروتوكول QUIC التجريبي.</translation> @@ -5624,6 +5632,7 @@ <translation id="8600929685092827187">تنشيط لدى وصول الحزم</translation> <translation id="8601206103050338563">مصادقة TLS (بروتوكول أمان طبقة النقل) لشبكة الإنترنت العالمية (WWW)</translation> <translation id="8602851771975208551">أضاف برنامج آخر بجهاز الكمبيوتر تطبيقًا قد يؤدي إلى تغيير طريقة عمل Chrome.</translation> +<translation id="8603912787021349466">السماح لتطبيقات Android بالبدء تلقائيًا بعد تسجيل الدخول.</translation> <translation id="8605428685123651449">ذاكرة SQLite</translation> <translation id="8605503133013456784">أخفق قطع الاتصال وإلغاء الاقتران بـ "<ph name="DEVICE_NAME" />".</translation> <translation id="8606726445206553943">استخدام أجهزة MIDI</translation> @@ -5976,6 +5985,7 @@ <translation id="9053965862400494292">حدث خطأ أثناء محاولة إعداد المزامنة.</translation> <translation id="9056034633062863292">جارٍ تحديث جهاز Chromebox...</translation> <translation id="9056810968620647706">لم يتم العثور على نتائج مطابقة.</translation> +<translation id="9057119625587205566">لم يتم العثور على طابعات مجاورة</translation> <translation id="9059868303873565140">قائمة الحالة</translation> <translation id="9064142312330104323">صورة الملف الشخصي في Google (جارٍ التحميل)</translation> <translation id="9064275926664971810">تمكين الملء التلقائي لملء النماذج بنقرة واحدة</translation> @@ -5986,6 +5996,7 @@ <translation id="9067401056540256169">هذا العلم يجعل Chrome غير آمن، استخدمه فقط عند معرفة استخداماته. لاحظ أنه قد تتم إزالة هذا العلم دون أية إشعارات. إذا تم تمكينه، فقد تتمكن إطارات ذات أصل https من استخدام WebSockets بعنوان URL غير آمن (ws://).</translation> <translation id="9068931793451030927">المسار:</translation> <translation id="9070219033670098627">تبديل شخص</translation> +<translation id="9070940116164932228">تعطيل مؤقتات الخلفية غالية الثمن</translation> <translation id="907148966137935206">عدم السماح لأي موقع بعرض النوافذ المنبثقة (مستحسن)</translation> <translation id="9072550133391925347">يعمل <ph name="PASSWORD_MANAGER_BRAND" /> على تسجيل دخولك تلقائيًا إلى المواقع والتطبيقات المؤهلة باستخدام كلمات المرور التي حفظتها.</translation> <translation id="9073281213608662541">بروتوكول مصادقة كلمات المرور (PAP)</translation> @@ -6020,6 +6031,7 @@ <translation id="9112614144067920641">الرجاء اختيار رقم تعريف شخصي جديد.</translation> <translation id="9112748030372401671">تغيير الخلفية</translation> <translation id="9112987648460918699">بحث...</translation> +<translation id="9114663181201435112">تسجيل الدخول بسهولة</translation> <translation id="9115487443206954631">إدارة أجهزة الإرسال</translation> <translation id="9115675100829699941">إ&شارات مرجعية</translation> <translation id="9121814364785106365">فتح كعلامة تبويب مثبتة</translation> @@ -6114,7 +6126,6 @@ <translation id="952992212772159698">غير نشطة</translation> <translation id="960719561871045870">رمز مشغل شبكة الجوال</translation> <translation id="960987915827980018">تتبقى ساعة واحدة تقريبًا</translation> -<translation id="962778376131245616">عرض غير الآمنة، المتحركة فقط</translation> <translation id="96421021576709873">شبكة Wi-Fi</translation> <translation id="965490406356730238">تمكين فك تشفير mjpeg للأجهزة المسرّعة وذلك للإطار الذي تم التقاطه حيثما توفر ذلك.</translation> <translation id="968174221497644223">ذاكرة التخزين المؤقت للتطبيق</translation>
diff --git a/chrome/app/resources/generated_resources_bg.xtb b/chrome/app/resources/generated_resources_bg.xtb index 73a2e3d..889d4df 100644 --- a/chrome/app/resources/generated_resources_bg.xtb +++ b/chrome/app/resources/generated_resources_bg.xtb
@@ -18,7 +18,6 @@ <translation id="1029317248976101138">Промяна на мащаба</translation> <translation id="1029595648591494741">Искате ли да изпробвате <ph name="EXTENSION_NAME" />?</translation> <translation id="1031362278801463162">Визуализацията се зарежда</translation> -<translation id="1031460590482534116">Възникна грешка при опита за съхраняване на сертификата за клиентската програма. Грешка <ph name="ERROR_NUMBER" /> (<ph name="ERROR_NAME" />).</translation> <translation id="1031573127485938293">Извеждане на запитване (чрез правило)</translation> <translation id="103279545524624934">Освободете място на диска, за да стартирате приложения за Android.</translation> <translation id="1033780634303702874">Достъп до серийните ви устройства</translation> @@ -101,6 +100,7 @@ <translation id="1128591060186966949">Редактиране на търсещата машина</translation> <translation id="1128987120443782698">Устройството за съхранение е с капацитет <ph name="DEVICE_CAPACITY" />. Моля, поставете SD карта или USB памет с обем поне 4 ГБ.</translation> <translation id="1137135726305341424">domContentLoaded и всички зареждания на ресурси, започнати преди domContentLoaded (основната рамка и вложените рамки от същия източник).</translation> +<translation id="1138663153846032155">Предпочитане на HTML пред Flash</translation> <translation id="1140351953533677694">Достъп до серийните и устройствата ви с Bluetooth</translation> <translation id="114140604515785785">Основна директория на разширението:</translation> <translation id="1143142264369994168">Подписващ сертификата</translation> @@ -252,6 +252,7 @@ <translation id="1351692861129622852">Импортират се <ph name="FILE_COUNT" /> файла...</translation> <translation id="1352103415082130575">Тайландска клавиатура (паташот)</translation> <translation id="1353686479385938207"><ph name="PROVIDER_NAME" />: „<ph name="NETWORK_NAME" />“</translation> +<translation id="1353946958707294039">Мениджър на хранилището с material design</translation> <translation id="1353966721814789986">Страници при стартиране</translation> <translation id="1354868058853714482">Програмата Adobe Reader не е актуална и може да е незащитена.</translation> <translation id="1355408554203439639">Софтуерен триизмерен растеризатор</translation> @@ -420,7 +421,6 @@ <translation id="1533920822694388968">Подравняване на телевизора</translation> <translation id="15373452373711364">Голям курсор на мишката</translation> <translation id="1543284117603151572">Импортирани от Edge</translation> -<translation id="1544350195767834591">{NUM_COOKIES,plural, =1{1 от други сайтове}other{# от други сайтове}}</translation> <translation id="1545177026077493356">Автоматичен павилионен режим</translation> <translation id="1545786162090505744">URL адрес с %s вместо заявка</translation> <translation id="1546280085599573572">Това разширение промени страницата, която се показва при кликване върху бутона „Начална страница“.</translation> @@ -444,7 +444,6 @@ <translation id="1559235587769913376">Въвеждане на знаци от Уникод</translation> <translation id="1561092721008294962">HarfBuzz за текста в потребителския интерфейс</translation> <translation id="1566049601598938765">Уебсайт</translation> -<translation id="1566958206723629112">Flash и PDF</translation> <translation id="1567723158593978621">Когато настройката е активирана, за влизането в браузъра ще се използва нова процедура на GAIA със задължително въвеждане на парола.</translation> <translation id="1567993339577891801">Конзола на JavaScript</translation> <translation id="1568323446248056064">Отваряне на настройките за дисплея</translation> @@ -573,7 +572,6 @@ <translation id="1723940674997333416">Разрешаване на незащитен WebSocket при източник от https</translation> <translation id="1725149567830788547">Показване на &контролите</translation> <translation id="172612876728038702">Модулът TPM се настройва. Моля, имайте търпение, това може да отнеме няколко минути.</translation> -<translation id="1727135806684246609">Подробности за сигурността в material design</translation> <translation id="1729533290416704613">То също контролира коя страница се показва при търсене от полето за всичко.</translation> <translation id="1731346223650886555">Точка и запетая</translation> <translation id="1731589410171062430">Общо: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /> (<ph name="NUMBER_OF_PAGES" /> <ph name="PAGE_OR_PAGES_LABEL" />)</translation> @@ -869,6 +867,7 @@ <translation id="218492098606937156">Активиране на събитията за докосвания</translation> <translation id="2187317261103489799">Откриване (по подразбиране)</translation> <translation id="2187895286714876935">Грешка при импортирането на сертификат на сървър</translation> +<translation id="2188881192257509750">Отваряне на <ph name="APPLICATION" /></translation> <translation id="2190069059097339078">Получаване на идентификационни данни за Wi-Fi</translation> <translation id="219008588003277019">Модул в клиента за директно изпълнение: <ph name="NEXE_NAME" /></translation> <translation id="2190355936436201913">(празно)</translation> @@ -987,6 +986,7 @@ <translation id="2326606747676847821">„Инкогнито“</translation> <translation id="2326931316514688470">&Презареждане на приложението</translation> <translation id="2327492829706409234">Активиране на приложението</translation> +<translation id="2328054044222305089">Това ще изтрие всички данни, съхранени от <ph name="SITE" /> на устройството ви, и ще нулира всички разрешения, които сте предоставили с цел изпълнение. Искате ли да продължите?</translation> <translation id="2329597144923131178">Влезте в профила си и получете своите отметки, история, пароли и др. настройки на всички у-ва.</translation> <translation id="2332131598580221120">Преглед в магазина</translation> <translation id="2332742915001411729">Възстановяване на настройката по подразбиране</translation> @@ -1262,7 +1262,6 @@ <translation id="2675358154061544447">Силно експериментална поддръжка за изобразяване на вложените рамки от различни сайтове чрез отделни процеси. В този режим за документите ще се използва един и същ процес на програмата за визуализация само ако са от един и същ уебсайт.</translation> <translation id="2676946222714718093">Възпроизвежда се на</translation> <translation id="2678063897982469759">Повторно активиране</translation> -<translation id="2678246812096664977">Всички приставки</translation> <translation id="2679385451463308372">Отпечатване чрез системния диалогов прозорец...</translation> <translation id="2680208403056680091">Връзката ви с интернет се контролира</translation> <translation id="268053382412112343">&Хронология</translation> @@ -1436,7 +1435,6 @@ <translation id="287286579981869940">Добавяне на <ph name="PROVIDER_NAME" />...</translation> <translation id="2872961005593481000">Изключване</translation> <translation id="2875698561019555027">(Страници с грешки в Chrome)</translation> -<translation id="2879560882721503072">Сертификатът за клиентската програма, издаден от <ph name="ISSUER" /> бе съхранен успешно.</translation> <translation id="288024221176729610">чешки</translation> <translation id="288042212351694283">Да осъществява достъп до устройствата ви, използвани като универсален втори фактор за удостоверяване.</translation> <translation id="2881966438216424900">Последен достъп:</translation> @@ -1585,6 +1583,7 @@ <translation id="3057861065630527966">Създаване на резервни копия на снимките и видеоклиповете ви</translation> <translation id="3058212636943679650">Ако се наложи да възстановите операционната система на компютъра си, ще ви е необходима SD карта или USB памет за възстановяване.</translation> <translation id="305932878998873762">Опростената кеш памет за HTTP е нова. За разпределянето на мястото на диска тя разчита на файловата система.</translation> +<translation id="3060251871394327123">Това ще изтрие всички данни, съхранени от <ph name="SITE" /> на устройството ви. Искате ли да продължите?</translation> <translation id="3061650404498811439">Активиране на достъпа до емотикони, ръкописно и гласово въвеждане от допълнително включваното меню за редактора за метод на въвеждане (IME)</translation> <translation id="3062606427884046423">Използвайте MediaStyle на Android за мултимедийните известия в Chrome.</translation> <translation id="3063844757726132584">Осъществявайте достъп до всичките си приложения от този удобен стартов панел. Играйте игри, водете видеоразговори, слушайте музика, редактирайте документи или изтегляйте още приложения.</translation> @@ -1634,6 +1633,7 @@ <translation id="3123569374670379335">(Контролиран)</translation> <translation id="3124111068741548686">Манипулатори за потребителски обекти</translation> <translation id="3126026824346185272">Ctrl</translation> +<translation id="3127156390846601284">Това ще изтрие всички данни, съхранени на устройството ви, за всички показани сайтове. Искате ли да продължите?</translation> <translation id="312759608736432009">Производител на устройството:</translation> <translation id="3127919023693423797">Удостоверява се...</translation> <translation id="3128230619496333808">Раздел 6</translation> @@ -1732,7 +1732,6 @@ <translation id="3264544094376351444">Безсерифен шрифт</translation> <translation id="3264547943200567728">Настройването на мрежата на вашия Chromebox не бе успешно</translation> <translation id="3265459715026181080">Затваряне на прозореца</translation> -<translation id="3267271790328635957">Само PDF</translation> <translation id="3267726687589094446">Автоматичното изтегляне на няколко файла да остане разрешено</translation> <translation id="3267998849713137817">Час на промяна</translation> <translation id="3268451620468152448">Отворени раздели</translation> @@ -1978,6 +1977,7 @@ <translation id="3574210789297084292">вход</translation> <translation id="3574305903863751447"><ph name="CITY" />, <ph name="STATE" /> <ph name="COUNTRY" /></translation> <translation id="357479282490346887">литовски</translation> +<translation id="3575927481544652747">За WebMIDI да се деактивира приложният програмен интерфейс (API) за MIDI на Windows Runtime, който по подразбиране е активиран в Windows 10 и по-новите версии.</translation> <translation id="3576324189521867626">Инсталирането бе успешно</translation> <translation id="3578331450833904042">По подразбиране (улавяне на всички звуци)</translation> <translation id="3578594933904494462">Съдържанието на този раздел се споделя.</translation> @@ -2031,8 +2031,6 @@ <translation id="3627320433825461852">Остава по-малко от 1 минута</translation> <translation id="3627588569887975815">О&тваряне на връзката в прозореца „инкогнито“</translation> <translation id="3627671146180677314">Време на подновяване на сертификат на Netscape</translation> -<translation id="3629326610814700057">Позволява на мениджъра на хранилището да управлява локалното хранилище.</translation> -<translation id="3630337581925712713"><ph name="PERMISSION_TYPE_LABEL" />:</translation> <translation id="3631337165634322335">Изключенията по-долу важат само за текущата сесия в режим „инкогнито“.</translation> <translation id="3633586230741134985">Настройки на стартовия панел</translation> <translation id="3633997706330212530">По свой избор може да деактивирате тези услуги.</translation> @@ -2055,7 +2053,7 @@ <translation id="3654045516529121250">Четене на настройките ви за достъпност</translation> <translation id="3654092442379740616">Грешка при синхронизирането: <ph name="PRODUCT_NAME" /> е стара версия и трябва да се актуализира.</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{Има постоянен достъп до един файл.}other{Има постоянен достъп до # файла.}}</translation> -<translation id="3657468915905674858">Активиране на заключването на Win32k с поддръжка за приставки с PPAPI.</translation> +<translation id="365793796291733849"><ph name="BEGIN_PARAGRAPH1" />Когато включите автоматичното създаване на резервно копие, данните на устройството и на приложенията периодично се запазват в частна папка в Google Диск. Данните на приложенията могат да бъдат всяка запазена от тях информация (въз основа на настройките на програмиста), включително потенциално поверителната, като например контакти, съобщения и снимки.<ph name="END_PARAGRAPH1" /><ph name="BEGIN_PARAGRAPH2" />Данните в резервното копие няма да заемат от квотата на хранилището ви в Диск. Няма да се създава резервно копие на големите файлове, нито на тези, които програмистите са избрали да не включат в услугата.<ph name="END_PARAGRAPH2" /></translation> <translation id="3660234220361471169">Ненадеждни</translation> <translation id="3665589677786828986">Chrome установи, че някои от настройките ви са повредени от друга програма, и възстанови първоначалните им стандартни стойности.</translation> <translation id="3665842570601375360">Сигурност:</translation> @@ -2110,6 +2108,7 @@ <translation id="3733127536501031542">SSL сървър с повишаване на сигурността</translation> <translation id="3736520371357197498">Ако разбирате рисковете за сигурността си, може <ph name="BEGIN_LINK" />да посетите този ненадежден сайт<ph name="END_LINK" /> преди премахването на опасните програми.</translation> <translation id="3738924763801731196"><ph name="OID" />:</translation> +<translation id="3739254215541673094">Да се отвори ли <ph name="APPLICATION" />?</translation> <translation id="3739798227959604811">Забавяне преди повторението:</translation> <translation id="3741158646617793859">„<ph name="DEVICE_NAME" />“ вече ще се показва в Admin console</translation> <translation id="3741243925913727067">Създавайте в Google Диск резервни копия на снимките и видеоклиповете от мултимедийното си устройство.</translation> @@ -2348,7 +2347,6 @@ <translation id="4058793769387728514">Проверка на документа сега</translation> <translation id="4059285154003114015">&Печат на карето...</translation> <translation id="406070391919917862">Приложения на заден план</translation> -<translation id="4061502419206152498">Показване без анимация, само при незащитена връзка</translation> <translation id="4062251648694601778">Наслаждавайте се на устройството си с <ph name="SHORT_PRODUCT_NAME" />. Имате въпроси? Винаги можете да получите помощ, като кликнете върху „?“ в лентата на състоянието.</translation> <translation id="4065876735068446555">Използваната от вас мрежа (<ph name="NETWORK_ID" />) може да изисква да посетите страницата й за вход.</translation> <translation id="4068506536726151626">Тази страница съдържа елементи от следните сайтове, които проследяват местоположението ви:</translation> @@ -2387,7 +2385,6 @@ <translation id="4101878899871018532">Диспечерът на паролите няма да предлага запазване на използваните за синхронизиране идентификационни данни.</translation> <translation id="410351446219883937">Автоматично възпроизвеждане</translation> <translation id="4104163789986725820">Екс&портиране...</translation> -<translation id="4105523032910086267">Задава анимацията и видимостта на подробностите за сигурността в material design.</translation> <translation id="4105563239298244027">Получете 1 ТБ безплатно с Google Диск</translation> <translation id="4109135793348361820">Преместване на прозореца към <ph name="USER_NAME" /> (<ph name="USER_EMAIL" />)</translation> <translation id="4110342520124362335">„Бисквитките“ от <ph name="DOMAIN" /> са блокирани.</translation> @@ -2438,6 +2435,7 @@ <translation id="418179967336296930">Руска фонетична клавиатура (YaZHert)</translation> <translation id="4181841719683918333">Езици</translation> <translation id="4187248015940562149">Активира технологията Web Bluetooth, която дава възможност на уебсайтовете да се свързват с устройства с Bluetooth в близост до вас и да ги контролират.</translation> +<translation id="4188447344915957833">Активира мениджъра на хранилището с настройки с material design.</translation> <translation id="4189406272289638749">Разширението <b><ph name="EXTENSION_NAME" /></b> контролира тази настройка.</translation> <translation id="4193154014135846272">Документ в Google</translation> <translation id="4193182321948161343">Активиране на основаната на material design функция за управление на потребителите</translation> @@ -2645,6 +2643,7 @@ <translation id="4508765956121923607">Преглед на изходн&ия код</translation> <translation id="4509017836361568632">Отхвърляне на снимката</translation> <translation id="4509345063551561634">Местоположение:</translation> +<translation id="4513946894732546136">Отзиви</translation> <translation id="4514542542275172126">Настройване на нов контролиран потребител</translation> <translation id="4514914692061505365">Принудително използване на бързия преобразувател Subzero на PNaCl за всички преносими изпълними файлове.</translation> <translation id="451515744433878153">Премахване</translation> @@ -2743,6 +2742,7 @@ <translation id="4656293982926141856">Този компютър</translation> <translation id="4656631038341342120">Активиране на обвивката за виртуална реалност, ако е налице за това устройство.</translation> <translation id="4657031070957997341">Разрешаване на <ph name="HOST" /> винаги да използва приставки</translation> +<translation id="466008749075469935">Активира намеса за ограничаване до 1% на натоварването на процесора от страна на таймерите на заден план.</translation> <translation id="4663254525753315077">Когато е възможно, с цел по-бързо превъртане поставя върху комбиниран слой съдържанието на препълнен превъртащ се елемент.</translation> <translation id="4664482161435122549">Грешка при експортиране на PKCS #12</translation> <translation id="4665014895760275686">Производител</translation> @@ -2811,6 +2811,7 @@ <translation id="4749157430980974800">Грузинска клавиатура</translation> <translation id="4750394297954878236">Предложения</translation> <translation id="475088594373173692">Първи потребител</translation> +<translation id="4750892496809949692">Дава се предпочитание на HTML съдържанието, като Flash се скрива от списъка с приставки.</translation> <translation id="4750917950439032686">Информацията ви (например пароли или номера на кредитни карти) е частна, когато се изпраща до този сайт.</translation> <translation id="4753602155423695878">Анимация на лентата за хода при зареждане на страници на телефони с Android</translation> <translation id="4755240240651974342">Финландска клавиатура</translation> @@ -3085,6 +3086,7 @@ <translation id="5119450342834678097">Опция за заявка за сайтa за таблети в менюто „Настройки“</translation> <translation id="5120068803556741301">Метод на въвеждане на трета страна</translation> <translation id="5120421890733714118">Да се има доверие на този сертификат за идентифициране на уебсайтове.</translation> +<translation id="5120516977819314347">ПИН кодът или паролата са неправилни.</translation> <translation id="5121130586824819730">Твърдият ви диск е пълен. Моля, запазете на друго място или освободете още пространство на диска.</translation> <translation id="5125751979347152379">Невалиден URL адрес.</translation> <translation id="5127881134400491887">Управление на мрежовите връзки</translation> @@ -3092,6 +3094,7 @@ <translation id="512903556749061217">свързано</translation> <translation id="5129301143853688736">Връзката ви с този сайт не е поверителна. Извършители на атаки може да опитат да откраднат информацията ви (например снимки, пароли, съобщения и номера на кредитни карти) от <ph name="DOMAIN" />.</translation> <translation id="5129662217315786329">полски</translation> +<translation id="5131347545782851480">PDF документи</translation> <translation id="5134856901811723984">Material design в системния потребителски интерфейс на Chrome OS</translation> <translation id="5135533361271311778">Елементът за отметки не можа да се създаде.</translation> <translation id="5136529877787728692">F7</translation> @@ -3260,6 +3263,7 @@ <translation id="5328031682234198929">8</translation> <translation id="5329858601952122676">&Изтриване</translation> <translation id="5330145655348521461">Тези файлове се отвориха на друг работен плот. Преминете към <ph name="USER_NAME" /> (<ph name="MAIL_ADDRESS" />), за да ги прегледате.</translation> +<translation id="5330512191124428349">Получаване на информация</translation> <translation id="5332624210073556029">Часова зона:</translation> <translation id="5333807720589685258">SIM картата ви ще бъде деактивирана за постоянно, ако не успеете да въведете правилния PUK код.</translation> @@ -3693,7 +3697,6 @@ <translation id="5892507820957994680">Отменя вградения списък за софтуерно изобразяване и активира графичното ускорение на неподдържаните системни конфигурации.</translation> <translation id="5895138241574237353">Рестартиране</translation> <translation id="5895187275912066135">Издаден на</translation> -<translation id="5898154795085152510">Сървърът върна невалиден сертификат за клиентската програма <ph name="ERROR_NUMBER" />. Грешка (<ph name="ERROR_NAME" />).</translation> <translation id="5900302528761731119">Снимка на потребителския профил в Google</translation> <translation id="590253956165195626">Извеждане на предложение за превод на страниците, които не са на четим от вас език.</translation> <translation id="5904093760909470684">Конфигурация на прокси сървър</translation> @@ -3748,6 +3751,8 @@ <translation id="5984222099446776634">Наскоро посетени</translation> <translation id="5984814259619230127">Откриване на устройства от Smart Lock през Bluetooth с нисък разход на енергия</translation> <translation id="5986245990306121338">Ако функцията е активирана, ще се показва превключвател на разделите дори когато опцията „Обединяване на разделите и приложенията“ е включена от настройките.</translation> +<translation id="5989712527536636369"><ph name="BEGIN_PARAGRAPH1" />Това е обща информация за устройството ви и употребата му от ваша страна, като например заряд на батерията, колко често използвате приложенията, качеството и продължителността на мрежовите ви връзки (напр. Wi-Fi и Bluetooth), както и сигнали за сривове, когато нещо не работи правилно. Тя ще се използва за подобряване на продуктите и услугите на Google за всички. Част от обобщената информация ще помогне и на партньорите, като например програмисти за Android, да усъвършенстват приложенията и продуктите си.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Можете да включите или изключите това по всяко време в настройките на приложенията за Android. Това не се отразява върху способността на устройството ви да изпраща нужната информация, за да може да получава основни услуги, като системни актуализации и такива за сигурност.<ph name="END_PARAGRAPH2" /></translation> <translation id="5990198433782424697">Разширения в започващи с chrome:// URL адреси</translation> <translation id="5990814808592353318">Ръчно генериране на пароли.</translation> <translation id="5991049340509704927">Увеличаване</translation> @@ -3761,6 +3766,7 @@ <translation id="6005695835120147974">Медиен маршрутизатор</translation> <translation id="6007237601604674381">Преместването не бе успешно. <ph name="ERROR_MESSAGE" /></translation> <translation id="6008241731410823808">Изпраща сигнали за проверка на хипервръзки.</translation> +<translation id="6011449291337289699">Изчистване на данните за сайтовете</translation> <translation id="6015796118275082299">Година</translation> <translation id="6016551720757758985">Потвърждаване на извършването на Powerwash и връщането към предишната версия</translation> <translation id="6016809788585079594">Кажете „Ok Google“ за последен път</translation> @@ -3950,7 +3956,6 @@ <translation id="6276301056778294989">Уверете се, че същият код се показва на устройството.</translation> <translation id="6277105963844135994">Времето за изчакване на мрежата изтече</translation> <translation id="6277518330158259200">Създаване на &екранна снимка</translation> -<translation id="6278428485366576908">Тема</translation> <translation id="6279183038361895380">Натиснете |<ph name="ACCELERATOR" />|, за да се покаже курсорът</translation> <translation id="6280215091796946657">Влизане с друг профил</translation> <translation id="6280912520669706465">ARC</translation> @@ -4202,6 +4207,7 @@ <translation id="6607272825297743757">Информация за файла</translation> <translation id="6607831829715835317">Още инструме&нти</translation> <translation id="6608140561353073361">Всички „бисквитки“ и данни за сайтове...</translation> +<translation id="6610183966322615106">Грешка при добавянето на принтера</translation> <translation id="6610610633807698299">Въведете URL адрес...</translation> <translation id="6612358246767739896">Защитено съдържание</translation> <translation id="6615455863669487791">Покажете ми</translation> @@ -4265,7 +4271,6 @@ <translation id="6708242697268981054">Източник:</translation> <translation id="6709357832553498500">Свързване посредством <ph name="EXTENSIONNAME" /></translation> <translation id="6710213216561001401">Предишна</translation> -<translation id="6712158998835983046">Показване на всички, с анимация</translation> <translation id="6718273304615422081">Компресира се...</translation> <translation id="671928215901716392">Заключване на екрана</translation> <translation id="6721972322305477112">&Файл</translation> @@ -4537,7 +4542,6 @@ <translation id="7088434364990739311">Стартирането на проверката за актуализации не бе успешно (код на грешката <ph name="ERROR" />).</translation> <translation id="708856090370082727">Активиране на поддръжката за продължаващо превъртане за екранната клавиатура. Когато този флаг е включен, екранната клавиатура ще преоразмерява само видимата част на прозоречния изглед.</translation> <translation id="7088674813905715446">Администраторът е поставил това устройство в необезпечено състояние. За да го активирате за регистрация, моля, накарайте администратора да промени състоянието му на изчакващо.</translation> -<translation id="7089609847854449639">Мениджър на хранилището</translation> <translation id="708969677220991657">Разрешаване на заявките през HTTPS към localhost дори когато се предоставя невалиден сертификат.</translation> <translation id="7092106376816104">Изключения за изскачащи прозорци</translation> <translation id="7093866338626856921">Обмен на данни с устройствата със следните имена: <ph name="HOSTNAMES" /></translation> @@ -4577,7 +4581,7 @@ <translation id="715118844758971915">Традиционни принтери</translation> <translation id="7154130902455071009">Промяна на началната ви страница на <ph name="START_PAGE" /></translation> <translation id="7155171745945906037">Съществуваща снимка от камерата или от файл</translation> -<translation id="715568033737470079">Посочете кои приставки с PPAPI да се изпълняват съобразно с правилото за тестова среда със заключване на Win32k (само за Windows 10 и по-нови версии).</translation> +<translation id="7155226869555939647">Връзките за <ph name="APPLICATION" /> да се отварят винаги</translation> <translation id="7156235233373189579">Този файл е предназначен за компютри със софтуер Windows и не е съвместим с устройството ви с Chrome OS. Моля, потърсете в <ph name="BEGIN_LINK" />уеб магазина на Chrome<ph name="END_LINK" /> подходящо приложение със същата функционалност. <ph name="BEGIN_LINK_HELP" />Научете повече<ph name="END_LINK_HELP" /></translation> <translation id="7157063064925785854">С кликването си върху „Напред“ приемате <ph name="LEGAL_DOC_LINK_TEXT_1" />, <ph name="LEGAL_DOC_LINK_TEXT_2" />, <ph name="LEGAL_DOC_LINK_TEXT_3" /> и <ph name="LEGAL_DOC_LINK_TEXT_4" />.</translation> <translation id="7158238151765743968">Все още има връзка с/ъс <ph name="DEVICE_NAME" />.</translation> @@ -4592,6 +4596,7 @@ <translation id="7175353351958621980">Заредено от:</translation> <translation id="7180611975245234373">Опресняване</translation> <translation id="7180865173735832675">Персонализиране</translation> +<translation id="7181387261278441780">Изчистване и нулиране на сайта</translation> <translation id="7185078796915954712">TLS 1.3</translation> <translation id="7185690883425432021">Скрива бутоните за затваряне на неактивните раздели, когато лентата с раздели е в режим на наслагване.</translation> <translation id="7186088072322679094">Запазване в лентата с инструменти</translation> @@ -4624,7 +4629,6 @@ <translation id="7223775956298141902">Ама че работа! Нямате разширения :-(</translation> <translation id="7224023051066864079">Подмрежова маска:</translation> <translation id="7225179976675429563">Липсва типът мрежа</translation> -<translation id="7230191962699768124">Показване на всички, без анимация</translation> <translation id="7230787553283372882">Персонализирайте размера на текста</translation> <translation id="7231224339346098802">Използвайте число, за да укажете колко копия да се отпечатат (1 или повече).</translation> <translation id="7238585580608191973">Пръстов отпечатък SHA-256</translation> @@ -4756,7 +4760,6 @@ <translation id="7409233648990234464">Повторно стартиране и Powerwash</translation> <translation id="7409836189476010449">Изпълни Flash</translation> <translation id="7410344089573941623">Да се получава запитване, ако <ph name="HOST" /> иска достъп до камерата и микрофона ви</translation> -<translation id="7411343637221933631">{NUM_COOKIES,plural, =1{1 от този сайт}other{# от този сайт}}</translation> <translation id="7412226954991670867">Памет на графичния процесор</translation> <translation id="7416362041876611053">Неизвестна грешка в мрежата.</translation> <translation id="7417453074306512035">Етиопска клавиатура</translation> @@ -4878,6 +4881,7 @@ <translation id="756445078718366910">Отваряне на прозореца на браузъра</translation> <translation id="7564847347806291057">Прекратяване на процеса</translation> <translation id="7566723889363720618">F12</translation> +<translation id="7567314848159753396">„Бисквитка“: <ph name="NAME" /></translation> <translation id="756809126120519699">Данните в Chrome са изчистени</translation> <translation id="7568790562536448087">Актуализира се</translation> <translation id="7573172247376861652">Заряд на батерията</translation> @@ -4918,6 +4922,7 @@ <translation id="7626009897377900107">Генериране на пароли</translation> <translation id="7627262197844840899">Този сайт не приема MasterCard.</translation> <translation id="7627790789328695202">Ами сега! Файлът „<ph name="FILE_NAME" />“ вече съществува. Преименувайте го и опитайте отново.</translation> +<translation id="7628127343934101653">Отваряне на PDF файловете в стандартното приложение за визуализирането им.</translation> <translation id="762917759028004464">Понастоящем браузърът по подразбиране е <ph name="BROWSER_NAME" />.</translation> <translation id="7629536005696009600">Дава възможност идентификационните данни, съхранявани за приложения за Android, да се попълват в съответните уебсайтове.</translation> <translation id="7629827748548208700">Раздел: <ph name="TAB_NAME" /></translation> @@ -5146,6 +5151,7 @@ <translation id="7957513156576779045">Включете Bluetooth, за да разрешите сдвояването</translation> <translation id="7957615753207896812">Отваряне на настройките за клавиатурата</translation> <translation id="7959074893852789871">Файлът съдържаше няколко сертификата, някои от които не бяха импортирани:</translation> +<translation id="7959700692661109221"><ph name="BEGIN_PARAGRAPH" />Услугата на Google за местоположението използва източници като Wi‑Fi с цел определяне на местоположението на устройството ви по-бързо и по-точно. Когато включите тези услуги, устройството ви влиза в режим, който използва Wi‑Fi, за да предостави информация за местоположението. Можете по всяко време да изключите това от съответните настройки.<ph name="END_PARAGRAPH" /></translation> <translation id="7961015016161918242">Никога</translation> <translation id="7964089325405904043">Импортиране и експортиране на пароли</translation> <translation id="7965010376480416255">Споделена памет</translation> @@ -5296,6 +5302,7 @@ <translation id="8146793085009540321">Влизането не бе успешно. Моля, свържете се с администратора си или опитайте отново.</translation> <translation id="8148264977957212129">Метод за въвеждане на пинин</translation> <translation id="8148913456785123871">Показване на карти от Google Now в стартовия панел</translation> +<translation id="8150391391298684512">Изключване на API за MIDI на Windows Runtime</translation> <translation id="8151185429379586178">Инстр. за програмисти</translation> <translation id="8151638057146502721">Конфигуриране</translation> <translation id="8151639108075998630">Активиране на сърфирането като гост</translation> @@ -5577,6 +5584,7 @@ <translation id="8532294913309524834">Подредете езиците според предпочитанието си.</translation> <translation id="8535005006684281994">URL адрес за подновяване на сертификат на Netscape</translation> <translation id="8539727552378197395">Не (HttpOnly)</translation> +<translation id="8541084862688000575">Автоматично зареждане на приложенията за Android</translation> <translation id="8543181531796978784">Можете да <ph name="BEGIN_ERROR_LINK" />подадете сигнал за проблем при откриването<ph name="END_ERROR_LINK" /> или, ако разбирате рисковете за сигурността си, да <ph name="BEGIN_LINK" />посетите този небезопасен сайт<ph name="END_LINK" />.</translation> <translation id="8545107379349809705">Скриване на информацията...</translation> <translation id="8545211332741562162">Активирайте използването от уеб страниците на експерименталните функции на JavaScript.</translation> @@ -5604,7 +5612,6 @@ <translation id="8569764466147087991">Изберете файл за отваряне</translation> <translation id="8571032220281885258">Когато кажете „OK Google“, Chrome ще потърси следващото нещо, което произнесете.</translation> <translation id="8571108619753148184">Сървър 4</translation> -<translation id="8572832761467613633">Само Flash</translation> <translation id="8572981282494768930">Забраняване на достъпа на сайтовете до камерата и микрофона ви</translation> <translation id="8574234089711453001">Разрешете показването на бутон за изтегляне при отваряне на страница с URL адрес на мултимедийно съдържание.</translation> <translation id="857779305329188634">Активиране на експериментална поддръжка на протокола QUIC.</translation> @@ -5626,6 +5633,7 @@ <translation id="8600929685092827187">Излизане от спящ режим при получаване на пакети</translation> <translation id="8601206103050338563">Удостоверяване на TLS WWW клиент</translation> <translation id="8602851771975208551">Друга програма на компютъра ви добави приложение, което може да промени начина на работа на Chrome.</translation> +<translation id="8603912787021349466">Позволява на приложенията за Android да се стартират автоматично след влизането.</translation> <translation id="8605428685123651449">Памет за SQLite</translation> <translation id="8605503133013456784">Прекъсването на връзката и на сдвояването с „<ph name="DEVICE_NAME" />“ не бе успешно.</translation> <translation id="8606726445206553943">Да използва MIDI устройствата ви.</translation> @@ -5978,6 +5986,7 @@ <translation id="9053965862400494292">При опита за настройване на синхронизирането възникна грешка.</translation> <translation id="9056034633062863292">Актуализиране на Chromebox</translation> <translation id="9056810968620647706">Няма намерени съответствия.</translation> +<translation id="9057119625587205566">Няма принтери в близост</translation> <translation id="9059868303873565140">Меню за състоянието</translation> <translation id="9064142312330104323">Снимка на потребителския профил в Google (зарежда се)</translation> <translation id="9064275926664971810">Активиране на автоматичното попълване на формуляри с едно кликване</translation> @@ -5988,6 +5997,7 @@ <translation id="9067401056540256169">Този флаг влошава безопасността на Chrome. Използвайте го само ако разбирате каква е функцията му. Обърнете внимание, че може да бъде премахнат без предупреждение. Ако е активиран, рамките с източник от https могат да използват WebSockets с незащитен URL адрес (ws://).</translation> <translation id="9068931793451030927">Път:</translation> <translation id="9070219033670098627">Превключване към друг човек</translation> +<translation id="9070940116164932228">Ограничаване на ресурсоемките таймери на заден план</translation> <translation id="907148966137935206">Забраняване на всички сайтове да показват изскачащи прозорци (препоръчително)</translation> <translation id="9072550133391925347">С помощта на <ph name="PASSWORD_MANAGER_BRAND" /> автоматично влизате в отговарящи на условията сайтове и приложения с паролите, които сте запазили.</translation> <translation id="9073281213608662541">PAP</translation> @@ -6022,6 +6032,7 @@ <translation id="9112614144067920641">Моля, изберете нов ПИН.</translation> <translation id="9112748030372401671">Промяна на тапета ви</translation> <translation id="9112987648460918699">Търсене...</translation> +<translation id="9114663181201435112">Лесно влизане в профила ви</translation> <translation id="9115487443206954631">Управление на устройства Cast</translation> <translation id="9115675100829699941">&Отметки</translation> <translation id="9121814364785106365">Отваряне като фиксиран раздел</translation> @@ -6116,7 +6127,6 @@ <translation id="952992212772159698">Не е активиран</translation> <translation id="960719561871045870">Код на оператора</translation> <translation id="960987915827980018">Остава около 1 час</translation> -<translation id="962778376131245616">Показване с анимация, само при незащитена връзка</translation> <translation id="96421021576709873">Wi-Fi мрежа</translation> <translation id="965490406356730238">Активирайте хардуерно ускореното декодиране на mjpeg за заснетите кадри, където е налице.</translation> <translation id="968174221497644223">Кеш на приложение</translation>
diff --git a/chrome/app/resources/generated_resources_bn.xtb b/chrome/app/resources/generated_resources_bn.xtb index b7234bf1..90fa9f3 100644 --- a/chrome/app/resources/generated_resources_bn.xtb +++ b/chrome/app/resources/generated_resources_bn.xtb
@@ -18,7 +18,6 @@ <translation id="1029317248976101138">জুম</translation> <translation id="1029595648591494741">"<ph name="EXTENSION_NAME" />" ব্যবহার করতে চান?</translation> <translation id="1031362278801463162">পূর্বরূপ লোড হচ্ছে</translation> -<translation id="1031460590482534116">ক্লায়েন্ট শংসাপত্র জমা করার চেষ্টা করার সময় একটি সমস্যা হয়েছে৷ ত্রুটি <ph name="ERROR_NUMBER" /> (<ph name="ERROR_NAME" />)</translation> <translation id="1031573127485938293">জিজ্ঞাসা করুন (নীতি দ্বারা)</translation> <translation id="103279545524624934">Android অ্যাপ্লিকেশান লঞ্চ করার জন্য ডিস্কে জায়গা খালি করুন।</translation> <translation id="1033780634303702874">আপনার সিরিয়াল ডিভাইসগুলি অ্যাক্সেস করুন</translation> @@ -101,6 +100,7 @@ <translation id="1128591060186966949">সার্চ ইঞ্জিন সম্পাদনা করুন</translation> <translation id="1128987120443782698">সঞ্চয় ডিভাইসের <ph name="DEVICE_CAPACITY" /> ক্ষমতা আছে৷ দয়া করে কমপক্ষে 4GB ক্ষমতাসম্পন্ন কোন SD কার্ড অথবা USB মেমোরি স্টিক ঢোকান৷</translation> <translation id="1137135726305341424">domContentLoaded এবং সকল সম্পদগুলির লোড domContentLoaded এর আগে শুরু হয়েছে (প্রধান ফ্রেম এবং একই উৎসের আইফ্রেমগুলি)।</translation> +<translation id="1138663153846032155">Flash এর পরিবর্তে HTML পছন্দ করুন</translation> <translation id="1140351953533677694">আপনার ব্লুটুথ এবং সিরিয়াল ডিভাইসগুলি অ্যাক্সেস করুন</translation> <translation id="114140604515785785">এক্সটেনশন রুট ডিরেক্টরি:</translation> <translation id="1143142264369994168">শংসাপত্র স্বাক্ষরকারী</translation> @@ -252,6 +252,7 @@ <translation id="1351692861129622852"><ph name="FILE_COUNT" />টি ফাইল আমদানি করা হচ্ছে...</translation> <translation id="1352103415082130575">থাই কীবোর্ড (পাট্টাচোটে)</translation> <translation id="1353686479385938207"><ph name="PROVIDER_NAME" /> : <ph name="NETWORK_NAME" /></translation> +<translation id="1353946958707294039">মেটারিয়াল ডিজাইন সঞ্চয়স্থান পরিচালক</translation> <translation id="1353966721814789986">প্রারম্ভ পৃষ্ঠা</translation> <translation id="1354868058853714482">Adobe Reader তারিখ সীমার বাইরে এবং অসুরক্ষিত হতে পারে৷</translation> <translation id="1355408554203439639">3D সফ্টওয়্যার রাস্টারাইজার</translation> @@ -424,7 +425,6 @@ <translation id="1533920822694388968">TV সারিবদ্ধকরণ</translation> <translation id="15373452373711364">বড় মাউস কার্সার</translation> <translation id="1543284117603151572">Edge থেকে আমদানি করা</translation> -<translation id="1544350195767834591">{NUM_COOKIES,plural, =1{অন্যান্য সাইট থেকে ১টি}one{অন্যান্য সাইট থেকে #টি}other{অন্যান্য সাইট থেকে #টি}}</translation> <translation id="1545177026077493356">স্বয়ংক্রিয় Kiosk মোড</translation> <translation id="1545786162090505744">কোয়্যারীর স্থানে %s সহ URL</translation> <translation id="1546280085599573572">আপনি হোম বোতাম ক্লিক করলে কোন পৃষ্ঠা দেখানো হবে তা এই এক্সটেনশানটি দ্বারা পরিবর্তন করা করেছে।</translation> @@ -448,7 +448,6 @@ <translation id="1559235587769913376">ইউনিকোড অক্ষর ইনপুট করুন</translation> <translation id="1561092721008294962">UI পাঠ্যের জন্য HarfBuzz</translation> <translation id="1566049601598938765">ওয়েবসাইট</translation> -<translation id="1566958206723629112">ফ্ল্যাশ এবং PDF</translation> <translation id="1567723158593978621">সক্ষম করা হলে, ব্রাউজারে প্রবেশ করুন করতে একটি নতুন GAIA পাসওয়ার্ড-বিভাজিত প্রবেশ করুন প্রবাহ ব্যবহার করবে।</translation> <translation id="1567993339577891801">JavaScript কনসোল</translation> <translation id="1568323446248056064">প্রদর্শন ডিভাইস সেটিংস খুলুন</translation> @@ -576,7 +575,6 @@ <translation id="1723940674997333416">httpsউৎপত্তি থেকে অনিরাপদ WebSocket এর অনুমতি দিন</translation> <translation id="1725149567830788547">&নিয়ন্ত্রণগুলি দেখান</translation> <translation id="172612876728038702">TPMটি সেট আপ হচ্ছে৷ দয়া করে ধৈর্য ধরুন; এটি কয়েক মিনিট সময় নিতে পারে৷</translation> -<translation id="1727135806684246609">মেটারিয়াল নিরাপত্তা ভারবোস</translation> <translation id="1729533290416704613">আপনি Omnibox থেকে অনুসন্ধান করলে কোন পৃষ্ঠাটি দেখানো হবে তাও এটি নিয়ন্ত্রণ করে।</translation> <translation id="1731346223650886555">সেমিকোলন</translation> <translation id="1731589410171062430">মোট: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /> (<ph name="NUMBER_OF_PAGES" /> <ph name="PAGE_OR_PAGES_LABEL" />)</translation> @@ -872,6 +870,7 @@ <translation id="218492098606937156">স্পর্শ ঘটনা সক্ষম করুন</translation> <translation id="2187317261103489799">সনাক্ত করুন (ডিফল্ট)</translation> <translation id="2187895286714876935">সার্ভার শংসাপত্র আমদানি ত্রুটি</translation> +<translation id="2188881192257509750"><ph name="APPLICATION" /> খুলুন</translation> <translation id="2190069059097339078">WiFi শংসাপত্র সংগ্রহকারী</translation> <translation id="219008588003277019">স্থানীয় গ্রাহক মডিউল: <ph name="NEXE_NAME" /></translation> <translation id="2190355936436201913">(খালি)</translation> @@ -990,6 +989,7 @@ <translation id="2326606747676847821">ছদ্মবেশে যান</translation> <translation id="2326931316514688470">&অ্যাপ্লিকেশান পুনরায় লোড করুন</translation> <translation id="2327492829706409234">অ্যাপ্লিকেশন সক্ষম করুন</translation> +<translation id="2328054044222305089">এটি আপনার ডিভাইসে সঞ্চিত যেকোনো ডেটা <ph name="SITE" /> মুছে ফেলবে এবং আপনি চলার মঞ্জুরি দিয়েছেন এমন যেকোনো অনুমতি পুনরায় সেট করবে। আপনি কি চালিয়ে যেতে চান?</translation> <translation id="2329597144923131178">আপনার সকল ডিভাইসে আপনার বুকমার্ক, ইতিহাস, পাসওয়ার্ড এবং অন্যান্য সেটিংস পেতে প্রবেশ করুন।</translation> <translation id="2332131598580221120">দোকানে দেখুন</translation> <translation id="2332742915001411729">ডিফল্টে পুনরায় সেট করুন</translation> @@ -1266,7 +1266,6 @@ <translation id="2675358154061544447">পৃথক প্রক্রিয়াতে ক্রস সাইট আইফ্রেমগুলি রেন্ডারিংয়ের জন্য উচ্চ পরীক্ষামূলক সমর্থন। এই মোডে, দস্তাবেজ একটি রেন্ডারার প্রক্রিয়া শেয়ার করবে শুধুমাত্র যদি তারা একই ওয়েব সাইট থেকে আসে।</translation> <translation id="2676946222714718093">এতে প্লে হচ্ছে</translation> <translation id="2678063897982469759">পুনঃ সক্ষম</translation> -<translation id="2678246812096664977">সকল প্লাগ ইনগুলি</translation> <translation id="2679385451463308372">সিস্টেম কথোপকথন ব্যবহার করে প্রিন্ট করুন...</translation> <translation id="2680208403056680091">আপনার ইন্টারনেট সংযোগ নিয়ন্ত্রিত হচ্ছে</translation> <translation id="268053382412112343">Hi&story</translation> @@ -1440,7 +1439,6 @@ <translation id="287286579981869940">যোগ করুন <ph name="PROVIDER_NAME" />...</translation> <translation id="2872961005593481000">বন্ধ করুন</translation> <translation id="2875698561019555027">(Chrome এর ত্রুটি পৃষ্ঠাগুলি)</translation> -<translation id="2879560882721503072"><ph name="ISSUER" />-এর ইস্যু করা ক্লায়েন্ট শংসাপত্র সফলভাবে সঞ্চিত হয়েছে৷</translation> <translation id="288024221176729610">চেক</translation> <translation id="288042212351694283">আপনার ইউনিভার্সাল ২য় ফ্যাক্টর ডিভাইসগুলির অ্যাক্সেস রয়েছে</translation> <translation id="2881966438216424900">অন্তিমবার অ্যক্সেস করা হয়েছে:</translation> @@ -1588,6 +1586,7 @@ <translation id="3057861065630527966">আপনার ফটো ও ভিডিওগুলির ব্যাকআপ নিন</translation> <translation id="3058212636943679650">আপনার যদি কখনও নিজের কম্পিউটারের অপারেটিং সিস্টেম পুনরুদ্ধারের দরকার হয় তাহলে আপনার একটি পুনরুদ্ধার SD কার্ড অথবা USB মেমোরি স্টিকের দরকার হবে৷</translation> <translation id="305932878998873762">HTTP এর জন্য সরল ক্যাশে হল একটি নতুন ক্যাশে ডিস্কের স্থান বরাদ্দকরণের জন্য এটি ফাইলসিস্টেমের ওপর নির্ভর করে৷</translation> +<translation id="3060251871394327123">এটি আপনার ডিভাইসে সঞ্চিত যেকোনো ডেটা <ph name="SITE" /> মুছে ফেলবে। আপনি কি চালিয়ে যেতে চান?</translation> <translation id="3061650404498811439">নির্বাচন করার IME মেনু থেকে ইমোজি, হাতের লেখা এবং ভয়েস ইনপুট ফর্ম অ্যাক্সেস সক্ষম করে।</translation> <translation id="3062606427884046423">Chrome মিডিয়া বিজ্ঞপ্তির জন্য Android মিডিয়া-শৈলী বিজ্ঞপ্তিগুলি ব্যবহার করে।</translation> <translation id="3063844757726132584">এই সহজে ব্যবহারযোগ্য লঞ্চারটির মাধ্যমে আপনার সমস্ত অ্যাপ্লিকেশান অ্যাক্সেস করুন৷ গেম খেলুন, ভিডিও চ্যাট করুন, সংগীত শুনুন, দস্তাবেজ সম্পাদনা করুন, অথবা আরো অ্যাপ্লিকেশান পান৷</translation> @@ -1637,6 +1636,7 @@ <translation id="3123569374670379335">(তত্ত্বাবধানে থাকা)</translation> <translation id="3124111068741548686">ব্যবহারকারীর হ্যান্ডলগুলি</translation> <translation id="3126026824346185272">Ctrl</translation> +<translation id="3127156390846601284">এটি প্রদর্শিত সমস্ত সাইটের জন্য আপনার ডিভাইসে সঞ্চিত যেকোনো ডেটা মুছে ফেলবে। আপনি কি চালিয়ে যেতে চান?</translation> <translation id="312759608736432009">ডিভাইস উত্পদনকারী:</translation> <translation id="3127919023693423797">প্রমাণ করা হচ্ছে...</translation> <translation id="3128230619496333808">ট্যাব ৬</translation> @@ -1735,7 +1735,6 @@ <translation id="3264544094376351444">Sans-Serif হরফ</translation> <translation id="3264547943200567728">আপনার Chromebox এর নেটওয়ার্ক স্থাপন করতে ব্যর্থ হয়েছে</translation> <translation id="3265459715026181080">উইন্ডো বন্ধ করুন</translation> -<translation id="3267271790328635957">শুধুমাত্র PDF</translation> <translation id="3267726687589094446">একাধিক ফাইলের স্বয়ংক্রিয় ডাউনলোডগুলির মঞ্জুরি দেওয়া অবিরত রাখুন</translation> <translation id="3267998849713137817">সংশোধিত সময়</translation> <translation id="3268451620468152448">ওপেন ট্যাব</translation> @@ -1977,6 +1976,7 @@ <translation id="3574210789297084292">প্রবেশ করুন</translation> <translation id="3574305903863751447"><ph name="CITY" />, <ph name="STATE" /> <ph name="COUNTRY" /></translation> <translation id="357479282490346887">লিথুয়ানিয়ান</translation> +<translation id="3575927481544652747">WebMIDI এর জন্য Windows রানটাইম MIDI API অক্ষম করুন, যা Windows 10 বা পরবর্তী সংস্করণে ডিফল্টভাবে সক্ষমিত থাকে।</translation> <translation id="3576324189521867626">সফলভাবে ইনস্টল হয়েছে</translation> <translation id="3578331450833904042">ডিফল্ট (সবকিছু টেনে নেয়)</translation> <translation id="3578594933904494462">এই ট্যাবের সামগ্রী শেয়ার করা হচ্ছে৷</translation> @@ -2030,8 +2030,6 @@ <translation id="3627320433825461852">1 মিনিটেরও কম সময় বাকি আছে</translation> <translation id="3627588569887975815">লিঙ্কটি ছ&দ্মবেশী উইন্ডোতে খুলুন</translation> <translation id="3627671146180677314">Netscape শংসাপত্র পুনর্নবীকরণ সময়</translation> -<translation id="3629326610814700057">স্থানীয় সঞ্চয়স্থান পরিচালনা করতে সঞ্চয়স্থান পরিচালককে সক্ষম করে।</translation> -<translation id="3630337581925712713"><ph name="PERMISSION_TYPE_LABEL" />:</translation> <translation id="3631337165634322335">বর্তমান ছদদ্মবেশী সেশনের ক্ষেত্রে কেবল নীচের ব্যতিক্রমটি প্রযোজ্য হবে৷</translation> <translation id="3633586230741134985">অ্যাপ্লিকেশান লঞ্চার সেটিংস</translation> <translation id="3633997706330212530">আপনি ঐচ্ছিকভাবে এই পরিষেবাগুলি অক্ষম করতে পারেন</translation> @@ -2054,7 +2052,8 @@ <translation id="3654045516529121250">আপনার অ্যাক্সেসযোগ্যতার সেটিংস পড়ুন</translation> <translation id="3654092442379740616">সিঙ্ক ত্রুটি: <ph name="PRODUCT_NAME" /> তারিখ সীমার বাইরে এবং আপডেট করা প্রয়োজন৷</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{একটি ফাইলে এটার স্থায়ী অ্যাক্সেস আছে৷}one{#টি ফাইলে এটার স্থায়ী অ্যাক্সেস আছে৷}other{#টি ফাইলে এটার স্থায়ী অ্যাক্সেস আছে৷}}</translation> -<translation id="3657468915905674858">PPAPI Win32k লকডাউন সক্ষম করুন।</translation> +<translation id="365793796291733849"><ph name="BEGIN_PARAGRAPH1" />আপনি যখন স্বয়ংক্রিয় ব্যাক আপ চালু করেন, তখন Google ড্রাইভের মধ্যে একটি ব্যক্তিগত ফোল্ডারে ডিভাইস এবং অ্যাপ্লিকেশান ডেটা পর্যায়ক্রমে সংরক্ষিত হয়। অ্যাপ্লিকেশান ডেটা যেকোনো ডেটা হতে পারে যা কোনো অ্যাপ্লিকেশান সংরক্ষণ করে (বিকাশকারীর সেটিংসের উপর ভিত্তি করে), এর সঙ্গে পরিচিতি, বার্তা এবং ফটোগুলির মত সম্ভাব্য সংবেদনশীল ডেটাও হতে পারে।<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />ব্যাক আপ নেওয়া ডেটা আপনার Drive storage কোটা ব্যবহার করবে না। বড় ফাইলগুলি বা বিকাশকারীরা যেগুলি পরিষেবা থেকে বাদ দেওয়ার জন্য বেছেছেন সেসব ফাইলগুলির ব্যাক আপ নেওয়া হবে না।<ph name="END_PARAGRAPH2" /></translation> <translation id="3660234220361471169">অবিশ্বস্থ</translation> <translation id="3665589677786828986">Chrome সনাক্ত করেছে যে অন্য কোনো প্রোগ্রাম আপনার কিছু সেটিংস ক্ষতিগ্রস্ত করেছে এবং সেগুলিকে তাদের মূল ডিফল্টে পুনরায় সেট করেছে।</translation> <translation id="3665842570601375360">নিরাপত্তা:</translation> @@ -2109,6 +2108,7 @@ <translation id="3733127536501031542">স্টেপ-আপ সহ SSL সার্ভার</translation> <translation id="3736520371357197498">আপনি যদি আপনার নিরাপত্তার ঝুঁকিগুলি বুঝতে পারেন, তাহলে ক্ষতিকারক প্রোগ্রাম সরানোর আগে আপনি <ph name="BEGIN_LINK" />অসুরক্ষিত সাইটে যেতে পারেন<ph name="END_LINK" />।</translation> <translation id="3738924763801731196"><ph name="OID" />:</translation> +<translation id="3739254215541673094"><ph name="APPLICATION" /> খুলবেন?</translation> <translation id="3739798227959604811">পুনরাবৃত্তির আগের বিলম্ব:</translation> <translation id="3741158646617793859"><ph name="DEVICE_NAME" /> এখন অ্যাডমিন কনসোলে প্রদর্শিত হবে</translation> <translation id="3741243925913727067">Google ড্রাইভে আপনার মিডিয়া ডিভাইসের ফটো এবং ভিডিওগুলির ব্যকআপ নিন৷</translation> @@ -2346,7 +2346,6 @@ <translation id="4058793769387728514">এখন দস্তাবেজ চেক করুন</translation> <translation id="4059285154003114015">&মুদ্রণ ফ্রেম...</translation> <translation id="406070391919917862">পৃষ্ঠভূমি অ্যাপ্লিকেশান</translation> -<translation id="4061502419206152498">শুধুমাত্র অ-সুরক্ষিত, অ্যানিমেশান-বিহীন দেখান</translation> <translation id="4062251648694601778">আপনার <ph name="SHORT_PRODUCT_NAME" /> এর মজা নিন৷ কোনো প্রশ্ন আছে? আপনি যখন খুশি স্থিতি ট্রেতে থাকা "?" এ ক্লিক করে সহায়তা নিতে পারেন৷</translation> <translation id="4065876735068446555">আপনি যে নেটওয়ার্কটি <ph name="NETWORK_ID" /> ব্যবহার করছেন সেটির জন্য অপনাকে এটির লগ ইন পৃষ্ঠাতে যেতে হতে পরে৷</translation> <translation id="4068506536726151626">এই পৃষ্ঠাতে নিম্নলিখিত সাইটগুলি থেকে এমন উপাদান রয়েছে যা আপনার অবস্থান নির্ধারণ করে:</translation> @@ -2385,7 +2384,6 @@ <translation id="4101878899871018532">পাসওয়ার্ড পরিচালক সিঙ্ক করার জন্য ব্যবহৃত প্রমাণপত্র সংরক্ষণ করার অফার করবে না৷</translation> <translation id="410351446219883937">স্বতঃচালানো</translation> <translation id="4104163789986725820">র&প্তানি...</translation> -<translation id="4105523032910086267">মেটারিয়াল ডিজাইনে নিরাপত্তা ভারবোসের অ্যানিমেশান এবং দৃশ্যমানতা সেট করে।</translation> <translation id="4105563239298244027">Google ড্রাইভের সাথে বিনামূল্যে ১ TB পান</translation> <translation id="4109135793348361820"><ph name="USER_NAME" /> (<ph name="USER_EMAIL" />) এ উইন্ডো সরান</translation> <translation id="4110342520124362335"><ph name="DOMAIN" />-এর থেকে কুকিজ অবরুদ্ধ৷</translation> @@ -2436,6 +2434,7 @@ <translation id="418179967336296930">রাশিয়ান ফোনেটিক (YaZHert) কীবোর্ড</translation> <translation id="4181841719683918333">ভাষাসমূহ</translation> <translation id="4187248015940562149">ওয়েবসাইটগুলিকে আপনার চারপাশের ব্লুটুথ ডিভাইসগুলির সাথে সংযোগ এবং সেগুলি নিয়ন্ত্রণ করতে ওয়েব ব্লুটুথ সক্ষম করে।</translation> +<translation id="4188447344915957833">মেটারিয়াল ডিজাইন সেটিংসে সঞ্চয়স্থান পরিচালক সক্ষম করে।</translation> <translation id="4189406272289638749">একটি এক্সটেনশান, <b> <ph name="EXTENSION_NAME" /> </ b>, এই সেটিংটিকে নিয়ন্ত্রণ করছে৷</translation> <translation id="4193154014135846272">Google দস্তাবেজ</translation> <translation id="4193182321948161343">মেটারিয়াল ডিজাইন ব্যবহারকারী পরিচালক সক্ষম করে</translation> @@ -2642,6 +2641,7 @@ <translation id="4508765956121923607">উ&ত্স দেখুন</translation> <translation id="4509017836361568632">ফটো বাতিল করুন</translation> <translation id="4509345063551561634">অবস্থান:</translation> +<translation id="4513946894732546136">প্রতিক্রিয়া</translation> <translation id="4514542542275172126">তত্ত্বাবধানে থাকা ব্যবহারকারী সেট করুন</translation> <translation id="4514914692061505365">সব pexe ফাইলের জন্য PNaCl এর দ্রুত Subzero অনুবাদকের ব্যবহার বলবৎ করে।</translation> <translation id="451515744433878153">সরান</translation> @@ -2740,6 +2740,7 @@ <translation id="4656293982926141856">এই কম্পিউটার</translation> <translation id="4656631038341342120">এই ডিভাইসের জন্য VR শেল উপলব্ধ থাকলে তা সক্ষম করে।</translation> <translation id="4657031070957997341">সর্বদা <ph name="HOST" />-এ প্ল্যাগ ইনগুলি মঞ্জুর করুন</translation> +<translation id="466008749075469935">পটভূমি টাইমারগুলির দ্বারা CPU এর ব্যবহার হওয়া ১% এ সীমিত করতে হস্তক্ষেপ সক্ষম করে।</translation> <translation id="4663254525753315077">যখন সম্ভব, দ্রুততর স্ক্রোলিংয়ের জন্য একটি যৌগিক স্তরের সম্মুখে একটি ওভারফ্লো স্ক্রোলিং উপাদানের স্ক্রোলিং সামগ্রীগুলি রাখে৷</translation> <translation id="4664482161435122549">PKCS #12 রপ্তানি ত্রুটি</translation> <translation id="4665014895760275686">প্রস্তুতকর্তা</translation> @@ -2808,6 +2809,7 @@ <translation id="4749157430980974800">জর্জিয়ান কীবোর্ড</translation> <translation id="4750394297954878236">প্রস্তাবনা</translation> <translation id="475088594373173692">প্রথম ব্যবহারকারী</translation> +<translation id="4750892496809949692">প্লাগ ইনগুলির তালিকা থেকে Flash গোপন করে HTML সামগ্রী পছন্দ করুন।</translation> <translation id="4750917950439032686">আপনার তথ্য (উদাহরণস্বরূপ, পাসওয়ার্ড বা ক্রেডিট কার্ড নম্বর) যখন এই সাইটে পাঠানো হয় তখন সেটি ব্যক্তিগত থাকে।</translation> <translation id="4753602155423695878">Android ফোনের পৃষ্ঠা লোড হওয়ার অগ্রগতি দণ্ডের অ্যানিমেশান</translation> <translation id="4755240240651974342">ফিনিশ কীবোর্ড</translation> @@ -3080,6 +3082,7 @@ <translation id="5119450342834678097">সেটিংস মেনুতে ট্যাবলেট সাইট বিকল্পর অনুরোধ</translation> <translation id="5120068803556741301">তৃতীয় পক্ষের ইনপুট পদ্ধতি</translation> <translation id="5120421890733714118">ওয়েবসাইট শনাক্ত করার জন্য এই শংসপত্রটিকে বিশ্বাস করুন৷</translation> +<translation id="5120516977819314347">PIN বা পাসওয়ার্ড ভুল।</translation> <translation id="5121130586824819730">আপনার হার্ড ডিস্ক পূর্ণ৷ দয়া করে অন্য কোনো স্থানে সংরক্ষণ করুন অথবা হার্ড ডিস্কে আরো জায়গা তৈরী করুন৷</translation> <translation id="5125751979347152379">অকার্যকর URL৷</translation> <translation id="5127881134400491887">নেটওয়ার্ক সংযোগগুলি পরিচালনা করুন</translation> @@ -3087,6 +3090,7 @@ <translation id="512903556749061217">সংযুক্ত</translation> <translation id="5129301143853688736">এই সাইটে আপনার সংযোগটি ব্যক্তিগত নয়৷ আক্রমণকারীরা <ph name="DOMAIN" /> থেকে আপনার তথ্য (উদাহরণস্বরূপ, ফটো, পাসওয়ার্ড, বার্তা ও ক্রেডিট কার্ডসমূহ) চুরি করার চেষ্টা করতে পারে৷</translation> <translation id="5129662217315786329">পোলিশ</translation> +<translation id="5131347545782851480">PDF দস্তাবেজগুলি</translation> <translation id="5134856901811723984">Chrome OS সিস্টেম UI এ মেটারিয়াল ডিজাইন</translation> <translation id="5135533361271311778">বুকমার্ক আইটেম তৈরী করা যায়নি৷</translation> <translation id="5136529877787728692">F7</translation> @@ -3254,6 +3258,7 @@ <translation id="5328031682234198929">৮</translation> <translation id="5329858601952122676">&মুছুন</translation> <translation id="5330145655348521461">এই ফাইলগুলি একটি আলাদা ডেস্কটপে খোলা রয়েছে৷ এটিকে দেখতে <ph name="USER_NAME" /> (<ph name="MAIL_ADDRESS" />) এ সরান৷</translation> +<translation id="5330512191124428349">তথ্য পান</translation> <translation id="5332624210073556029">সময় অঞ্চল:</translation> <translation id="5333807720589685258">আপনি পিন আনলক করার সঠিক কী না লিখলে আপনার সিম কার্ড স্থায়ীভাবে অক্ষম হয়ে যাবে।</translation> @@ -3687,7 +3692,6 @@ <translation id="5892507820957994680">বিল্ট-ইন সফ্টওয়্যার উপস্থাপন তালিকা ওভাররাইড করে ও অসমর্থিত সিস্টেম কনফিগারেশনে GPU-ত্বরণ সক্ষম করে৷</translation> <translation id="5895138241574237353">পুনর্সূচনা</translation> <translation id="5895187275912066135">এই তারিখে ইস্যু করা</translation> -<translation id="5898154795085152510">সার্ভারটি একটি অবৈধ ক্লায়েন্ট শংসাপত্র ফিরিয়ে দিয়েছে৷ ত্রুটি <ph name="ERROR_NUMBER" /> (<ph name="ERROR_NAME" />)৷</translation> <translation id="5900302528761731119">Google প্রোফাইল ফটো </translation> <translation id="590253956165195626">আপনি যে ভাষাতে পড়েন সেই ভাষাতে না থাকা পৃষ্ঠাগুলি অনুবাদ করার প্রস্তব দিন৷</translation> <translation id="5904093760909470684">পক্সি কনফিগারেশন</translation> @@ -3742,6 +3746,8 @@ <translation id="5984222099446776634">সাম্প্রতিককালে দেখা</translation> <translation id="5984814259619230127">Smart Lock ব্লুটুথ কম শক্তি আবিষ্কার</translation> <translation id="5986245990306121338">সক্ষম করা হলে, সেটিংসে 'ট্যাব ও অ্যাপ্লিকেশান মার্জ করুন' বিকল্প চালু থাকলেও একটি ট্যাব পরিবর্তনকারী দেখাবে।</translation> +<translation id="5989712527536636369"><ph name="BEGIN_PARAGRAPH1" />এটি আপনার ডিভাইস সম্পর্কিত সাধারণ তথ্য এবং আপনি কীভাবে এটি ব্যবহার করেন সে বিষয়ের তথ্য হতে পারে যেমন, যখন ঠিক যেমনটি কাজ করা দরকার তেমনভাবে জিনিসপত্র কাজ না করে সে সময়ের ব্যাটারির স্তর, আপনি কত ঘনঘন আপনার অ্যাপ্লিকেশান ব্যবহার করেন, আপনার নেটওয়ার্ক সংযোগ (যেমন Wi-Fi ও Bluetooth) এর গুণমান ও স্থায়িত্ব এবং ক্র্যাশ প্রতিবেদনগুলি। সবার জন্য Google এর পণ্য ও পরিষেবাগুলি উন্নত করার কাজে এটি ব্যবহার করা হবে। কিছু সমষ্টিভূত তথ্য অংশীদারদের যেমন, Android বিকাশকারীদেরকে তাদের অ্যাপ্লিকেশান ও পণ্যগুলি আরো উন্নত করতেও সহায়তা করবে।<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />আপনি যে কোনো সময় Android অ্যাপ্লিকেশান সেটিংস থেকে এটি চালু বা বন্ধ করতে পারেন। এর ফলে প্রয়োজনীয় পরিষেবা যেমন, সিস্টেম আপডেট ও নিরাপত্তা গ্রহণের জন্য আপনার ডিভাইসটির প্রয়োজনীয় ডেটা পাঠানোর সক্ষমতা প্রভাবিত হবে না।<ph name="END_PARAGRAPH2" /></translation> <translation id="5990198433782424697">chrome:// URLগুলিতে এক্সটেনশানগুলি</translation> <translation id="5990814808592353318">ম্যানুয়াল পাসওয়ার্ড তৈরি।</translation> <translation id="5991049340509704927">বিবর্ধিত করুন</translation> @@ -3755,6 +3761,7 @@ <translation id="6005695835120147974">মিডিয়া রাউটার</translation> <translation id="6007237601604674381">স্থানান্তরণ ব্যর্থ হয়েছে৷ <ph name="ERROR_MESSAGE" /></translation> <translation id="6008241731410823808">হাইপারলিঙ্ক অডিটিং পিংগুলি পাঠায়।</translation> +<translation id="6011449291337289699">সাইট ডেটা সাফ করুন</translation> <translation id="6015796118275082299">বছর</translation> <translation id="6016551720757758985">পূর্ববর্তী সংস্করণে ফিরে যাওয়া সহ পাওয়ারওয়াশ নিশ্চিত করুন</translation> <translation id="6016809788585079594">শেষবারের জন্য একবার "Ok Google" বলুন</translation> @@ -3945,7 +3952,6 @@ <translation id="6276301056778294989">ডিভাইসটি অনুরুপ কোডটি দেখাচ্ছে কিনা নিশ্চিত করুন৷</translation> <translation id="6277105963844135994">নেটওয়ার্কের সময় শেষ হয়েছে</translation> <translation id="6277518330158259200">স্ক্রীনশট নি&ন</translation> -<translation id="6278428485366576908">থীম</translation> <translation id="6279183038361895380">আপনার কার্সার দেখাতে |<ph name="ACCELERATOR" />| চাপুন</translation> <translation id="6280215091796946657">অন্য একটি অ্যাকাউন্ট দিয়ে প্রবেশ করুন</translation> <translation id="6280912520669706465">ARC</translation> @@ -4196,6 +4202,7 @@ <translation id="6607272825297743757">ফাইলের তথ্য</translation> <translation id="6607831829715835317">আরো সরঞ্জা&ম</translation> <translation id="6608140561353073361">সমস্ত কুকি এবং সাইট ডেটা...</translation> +<translation id="6610183966322615106">প্রিন্টার যোগ করার সময় ত্রুটি</translation> <translation id="6610610633807698299">URL লিখুন...</translation> <translation id="6612358246767739896">সুরক্ষিত সামগ্রী</translation> <translation id="6615455863669487791">আমাকে দেখান</translation> @@ -4259,7 +4266,6 @@ <translation id="6708242697268981054">উৎস:</translation> <translation id="6709357832553498500"><ph name="EXTENSIONNAME" /> ব্যবহার করে সংযোগ করুন</translation> <translation id="6710213216561001401">পূর্ববর্তী</translation> -<translation id="6712158998835983046">সব দেখান, অ্যানিমেশানযুক্ত</translation> <translation id="6718273304615422081">জিপ করা হচ্ছে...</translation> <translation id="671928215901716392">স্ক্রিন লক করুন</translation> <translation id="6721972322305477112">&File</translation> @@ -4533,7 +4539,6 @@ <translation id="7088434364990739311">আপডেট যাচাই সূচনা হতে ব্যর্থ হয়েছে (ত্রুটি কোড <ph name="ERROR" />)৷</translation> <translation id="708856090370082727">OSK ওভারস্ক্রোল সমর্থন সক্ষম করে। এই ফ্ল্যাগ চালু থাকলে, OSK শুধুমাত্র ভিজুয়াল ভিউপোর্ট ছোট বড় করবে।</translation> <translation id="7088674813905715446">প্রশাসকের দ্বারা এই ডিভাইসটি অ্যাক্সেসহীন অবস্থায় রাখা হয়েছে। নথীভুক্তের জন্য এটি সক্ষম করতে, দয়া করে একটি মুলতুবি স্থিতিতে আপনার প্রশাসককে ডিভাইসটি রাখতে দিন।</translation> -<translation id="7089609847854449639">সঞ্চয়স্থান পরিচালক</translation> <translation id="708969677220991657">HTTPS মারফত স্থানীয় হোস্টে অনুরোধের অনুমোদন দেয় এমনকি অবৈধ শংসাপত্র থাকলেও৷</translation> <translation id="7092106376816104">পপ-আও ব্যতিক্রম</translation> <translation id="7093866338626856921"><ph name="HOSTNAMES" />: নামের্ ডিভাইসসমূহের সাথে ডেটা বিনিময় করুন</translation> @@ -4573,7 +4578,7 @@ <translation id="715118844758971915">ক্লাসিক মুদ্রকগুলি</translation> <translation id="7154130902455071009">আপনার সূচনা পৃষ্ঠাকে এতে পরিবর্তন করুন: <ph name="START_PAGE" /></translation> <translation id="7155171745945906037">ক্যামেরা বা ফাইল থেকে বিদ্যমান ফটো</translation> -<translation id="715568033737470079">Win32k লকডাউন স্যান্ডবক্স নীতির মধ্যে চালু করা হবে এমন PPAPI প্লাগ ইনগুলি সুনির্দিষ্ট করে (কেবলমাত্র Windows 10 এবং তার পরবর্তী সংস্করণের জন্য)।</translation> +<translation id="7155226869555939647"><ph name="APPLICATION" /> এর জন্য লিঙ্কগুলি সর্বদা খুলুন</translation> <translation id="7156235233373189579">Windows সফ্টওয়্যার ব্যবহার করে এমন একটি পিসির জন্য এই ফাইলটি ডিজাইন করা হয়েছে৷ Chrome OS দ্বারা চালিত আপনার ডিভাইসটির সাথে এটি সামঞ্জস্যপূর্ণ নয়৷ একটি উপযুক্ত প্রতিস্থাপনযোগ্য অ্যাপ্লিকেশানের জন্য দয়া করে <ph name="BEGIN_LINK" />Chrome ওয়েব স্টোর<ph name="END_LINK" /> এ অনুসন্ধান করুন৷<ph name="BEGIN_LINK_HELP" />আরো জানুন<ph name="END_LINK_HELP" /></translation> <translation id="7157063064925785854">চালিয়ে যান এ ক্লিক করার মাধ্যমে আপনি <ph name="LEGAL_DOC_LINK_TEXT_1" />, <ph name="LEGAL_DOC_LINK_TEXT_2" />, <ph name="LEGAL_DOC_LINK_TEXT_3" />, এবং <ph name="LEGAL_DOC_LINK_TEXT_4" /> এ সম্মত হচ্ছেন৷</translation> <translation id="7158238151765743968">"<ph name="DEVICE_NAME" />" এর সাথে সংযোগ এখনো অব্যাহত রয়েছে৷</translation> @@ -4588,6 +4593,7 @@ <translation id="7175353351958621980">এখান থেকে লোড হয়েছে:</translation> <translation id="7180611975245234373">রিফ্রেশ করুন</translation> <translation id="7180865173735832675">কাস্টমাইজ করুন</translation> +<translation id="7181387261278441780">সাইট সাফ করে পুনরায় সেট করুন</translation> <translation id="7185078796915954712">TLS 1.3</translation> <translation id="7185690883425432021">ট্র্যাবস্ট্রিপ যখন স্ট্যাক করা মোডে থাকে তখন নিষ্ক্রিয় ট্যাবগুলির বন্ধ বোতামগুলি গোপন করে।</translation> <translation id="7186088072322679094">সরঞ্জাম দণ্ডের মধ্যে রাখুন</translation> @@ -4620,7 +4626,6 @@ <translation id="7223775956298141902">উু... আপনার কাছে কোনো এক্সটেনশান নেই :-(</translation> <translation id="7224023051066864079">সাবনেট মুখোশ:</translation> <translation id="7225179976675429563">নেটওয়ার্কের প্রকার হারিয়ে গেছে</translation> -<translation id="7230191962699768124">সব দেখান, অ্যানিমেশান-বিহীন</translation> <translation id="7230787553283372882">আপনার পাঠ্যের আকার কাস্টমাইজ করুন</translation> <translation id="7231224339346098802">কতগুলি অনুলিপি প্রিন্ট করতে চান (1 বা বেশি) তার নির্দেশ দিতে একটি সংখ্যা ব্যবহার করুন৷</translation> <translation id="7238585580608191973">SHA-256 আঙুলের ছাপ</translation> @@ -4751,7 +4756,6 @@ <translation id="7409233648990234464">পুনরায় লঞ্চ করুন এবং পাওয়ারওয়াশ করুন</translation> <translation id="7409836189476010449">Flash চালান</translation> <translation id="7410344089573941623"><ph name="HOST" /> আপনার ক্যামেরা এবং মাইক্রোফোন অ্যাক্সেস করতে চায় কিনা জিজ্ঞাসা করুন</translation> -<translation id="7411343637221933631">{NUM_COOKIES,plural, =1{এই সাইট থেকে ১টি}one{এই সাইট থেকে #টি }other{এই সাইট থেকে #টি }}</translation> <translation id="7412226954991670867">GPU মেমোরি</translation> <translation id="7416362041876611053">অজানা নেটওয়ার্ক ত্রুটি৷</translation> <translation id="7417453074306512035">ইথিওপিক কীবোর্ড</translation> @@ -4873,6 +4877,7 @@ <translation id="756445078718366910">ব্রাউজার উইন্ডো খুলুন</translation> <translation id="7564847347806291057">সমাপ্তি প্রক্রিয়া</translation> <translation id="7566723889363720618">F12</translation> +<translation id="7567314848159753396">কুকি: <ph name="NAME" /></translation> <translation id="756809126120519699">Chrome ডেটা সাফ হয়েছে</translation> <translation id="7568790562536448087">আপডেট হচ্ছে</translation> <translation id="7573172247376861652">ব্যাটারি চার্জ</translation> @@ -4913,6 +4918,7 @@ <translation id="7626009897377900107">পাসওয়ার্ড সৃষ্টি করা</translation> <translation id="7627262197844840899">এই সাইটটি MasterCard গ্রহণ করে না।</translation> <translation id="7627790789328695202">ওহো, <ph name="FILE_NAME" /> ইতিমধ্যেই বিদ্যমান রয়েছে৷ এটির পুনঃনামকরণ করুন এবং আবার চেষ্টা করুন৷</translation> +<translation id="7628127343934101653">PDF ফাইলগুলিকে ডিফল্ট PDF ভিউয়ার অ্যাপ্লিকেশানে খুলুন।</translation> <translation id="762917759028004464">বর্তমানে ডিফল্ট ব্রাউজারটি হল <ph name="BROWSER_NAME" />৷</translation> <translation id="7629536005696009600">Android অ্যাপ্লিকেশানের জন্য সংরক্ষিত শংসাপত্রকে সংশ্লিষ্ট ওয়েবসাইটের মধ্যে পূরণ করতে দেয়।</translation> <translation id="7629827748548208700">ট্যাব: <ph name="TAB_NAME" /></translation> @@ -5141,6 +5147,7 @@ <translation id="7957513156576779045">যুক্ত করার মঞ্জুরি দিতে Bluetooth চালু করুন</translation> <translation id="7957615753207896812">কীবোর্ড ডিভাইস সেটিংস খুলুন</translation> <translation id="7959074893852789871">ফাইলটিতে একাধিক শংসাপত্র রয়েছে, এর মধ্যে কয়েকটি আমদানি করা হয়নি:</translation> +<translation id="7959700692661109221"><ph name="BEGIN_PARAGRAPH" />Google এর অবস্থান পরিষেবা আপনার ডিভাইসের অবস্থান দ্রুততর ও আরো নির্ভুলভাবে নির্ণয় করার জন্য Wi-Fi এর মতো উৎসগুলি ব্যবহার করে। আপনি Google এর অবস্থান পরিষেবাগুলি চালু করলে আপনার ডিভাইসটি এমন মোডে চলে যায় যা অবস্থানের তথ্য সরবরাহের জন্য Wi-Fi ব্যবহার করে। আপনি যেকোনো সময় অবস্থান সেটিংস থেকে এটি বন্ধ করতে পারেন।<ph name="END_PARAGRAPH" /></translation> <translation id="7961015016161918242">কখনই নয়</translation> <translation id="7964089325405904043">পাসওয়ার্ড আমদানি ও রপ্তানি</translation> <translation id="7965010376480416255">ভাগকরা স্মৃতি</translation> @@ -5291,6 +5298,7 @@ <translation id="8146793085009540321">প্রবেশ করুন ব্যর্থ হয়েছে। দয়া করে আপনার প্রশাসকের সাথে যোগাযোগ করুন অথবা আবার চেষ্টা করুন।</translation> <translation id="8148264977957212129">পিনইন ইনপুট পদ্ধতি</translation> <translation id="8148913456785123871">লঞ্চারে Google Now কার্ডগুলি দেখান</translation> +<translation id="8150391391298684512">Windows রানটাইম MIDI API অক্ষমকরণ</translation> <translation id="8151185429379586178">বিকাশকারী সরঞ্জামগুলি</translation> <translation id="8151638057146502721">কনফিগার করুন</translation> <translation id="8151639108075998630">অতিথি ব্রাউজিং সক্ষম করুন</translation> @@ -5573,6 +5581,7 @@ <translation id="8532294913309524834">আপনার পছন্দের উপর ভিত্তি করে ভাষাগুলি সাজান</translation> <translation id="8535005006684281994">Netscape শংসাপত্র পুনর্নবীকরণ URL</translation> <translation id="8539727552378197395">না (কেবলমাত্র Http)</translation> +<translation id="8541084862688000575">Android অ্যাপ্লিকেশানগুলিকে স্বয়ংক্রিয়ভাবে লোডকরণ</translation> <translation id="8543181531796978784">আপনি <ph name="BEGIN_ERROR_LINK" />একটি সনাক্তকরণ সমস্যা প্রতিবেদন করতে পারেন<ph name="END_ERROR_LINK" /> অথবা, আপনি আপনার নিরাপত্তা ঝুঁকি বুঝতে পারলে, <ph name="BEGIN_LINK" />এই অনিরাপদ সাইটটি ঘুরে দেখুন<ph name="END_LINK" />।</translation> <translation id="8545107379349809705">তথ্য লুকান ...</translation> <translation id="8545211332741562162">পরীক্ষামূলক JavaScript বৈশিষ্ট্যাবলী ব্যবহার করার জন্য ওয়েব পৃষ্ঠাগুলিকে সক্ষম করুন৷</translation> @@ -5600,7 +5609,6 @@ <translation id="8569764466147087991">খুলতে একটি স্ক্রিপ্ট নির্বাচন করুন</translation> <translation id="8571032220281885258">আপনি যখন বলবেন "Ok Google," তখন আপনি এর পর কি বলতে চাচ্ছেন Chrome তার অনুসন্ধান করবে।</translation> <translation id="8571108619753148184">সার্ভার ৪</translation> -<translation id="8572832761467613633">শুধুমাত্র ফ্ল্যাশ</translation> <translation id="8572981282494768930">আপনার ক্যামেরা ও মাইক্রোফোন অ্যাক্সেস করার জন্য সাইটগুলিকে মঞ্জুরি দেবেন না</translation> <translation id="8574234089711453001">মিডিয়া URL সহ কোনো পৃষ্ঠা খোলার সময় একটি ডাউনলোড বোতাম প্রদর্শিত হওয়ার অনুমতি দেয়।</translation> <translation id="857779305329188634">পরীক্ষামূলক QUIC প্রোটোকল সমর্থন সক্ষম করে৷</translation> @@ -5622,6 +5630,7 @@ <translation id="8600929685092827187">প্যাকেটগুলি এলে জেগে ওঠা</translation> <translation id="8601206103050338563">TLS WWW ক্লায়েন্ট প্রমাণীকরণ</translation> <translation id="8602851771975208551">আপনার কম্পিউটারের অন্য একটি প্রোগ্রাম একটি অ্যাপ্লিকেশন জুড়েছে যা Chrome এর কাজ করার পদ্ধতিকে পাল্টে দিতে পারে৷</translation> +<translation id="8603912787021349466">সাইন ইন করার পর Android অ্যাপ্লিকেশানগুলিকে স্বয়ংক্রিয়ভাবে চালু হওয়ার অনুমতি দিন।</translation> <translation id="8605428685123651449">SQLite মেমোরি</translation> <translation id="8605503133013456784">"<ph name="DEVICE_NAME" />" থেকে সংযোগ বিচ্ছিন্ন করতে ব্যর্থ৷</translation> <translation id="8606726445206553943">আপনার MIDI ডিভাইসসমূহ ব্যবহার করুন</translation> @@ -5974,6 +5983,7 @@ <translation id="9053965862400494292">সিঙ্ক সেট আপের চেষ্টা করার সময় একটি ত্রুটি ঘটেছে৷</translation> <translation id="9056034633062863292">Chromebox আপডেট করা হচ্ছে</translation> <translation id="9056810968620647706">কোন মিল খুঁজে পাওয়া যায় নি৷</translation> +<translation id="9057119625587205566">আশেপাশে কোনো প্রিন্টার নেই</translation> <translation id="9059868303873565140">স্থিতি মেনু</translation> <translation id="9064142312330104323">Google প্রোফাইল ফটো (লোড হচ্ছে)</translation> <translation id="9064275926664971810">এক ক্লিকে ফর্মগুলি পূরণ করার জন্য স্বতঃপূর্ণ সক্ষম করুন</translation> @@ -5984,6 +5994,7 @@ <translation id="9067401056540256169">এই ফ্ল্যাগটি Chrome কে অনিরাপদ করেছে। এটি কি কাজ করে যদি আপনি তা বুঝতে পারেন তাহলে কেবল তখনই এটি ব্যবহার করুন। মনে রাখবেন যে বিনা বিজ্ঞপ্তিতে এই ফ্ল্যাগটি সরানো হতে পারে। যদি সক্ষম করা থাকে, তাহলে একটি অনিরাপদ URL (ws://) এর মাধ্যমে https উৎপত্তি সহ ফ্রেম WebSocket ব্যবহার করতে পারবে।</translation> <translation id="9068931793451030927">পথ:</translation> <translation id="9070219033670098627">ব্যক্তি পরিবর্তন করুন</translation> +<translation id="9070940116164932228">ব্যয়বহুল পটভূমি টাইমারের গতি নিয়ন্ত্রণ</translation> <translation id="907148966137935206">পপ-আপগুলি দেখানোর জন্য কোনও সাইটকে মঞ্জুরি দেবেন না (প্রস্তাবিত)</translation> <translation id="9072550133391925347"><ph name="PASSWORD_MANAGER_BRAND" /> স্বয়ংক্রিয়ভাবে আপনার সংরক্ষণ করা পাসওয়ার্ড দিয়ে উপযুক্ত সাইট এবং অ্যাপ্লিকেশানগুলিতে আপনাকে প্রবেশ করুন করায়।</translation> <translation id="9073281213608662541">PAP</translation> @@ -6018,6 +6029,7 @@ <translation id="9112614144067920641">দয়া করে একটি নতুন পিন চয়ন করুন৷</translation> <translation id="9112748030372401671">আপনার ওয়ালপেপার পরিবর্তন করুন</translation> <translation id="9112987648460918699">খুঁজুন...</translation> +<translation id="9114663181201435112">সহজেই সাইন ইন করুন</translation> <translation id="9115487443206954631">Cast ডিভাইসগুলি পরিচালনা করুন</translation> <translation id="9115675100829699941">&বুকমার্কস</translation> <translation id="9121814364785106365">পিনযুক্ত ট্যাব রূপে খুলুন</translation> @@ -6112,7 +6124,6 @@ <translation id="952992212772159698">সক্রিয় নেই</translation> <translation id="960719561871045870">অপারেটরের কোড</translation> <translation id="960987915827980018">প্রায় 1 ঘণ্টা বাকি</translation> -<translation id="962778376131245616">শুধুমাত্র অ-সুরক্ষিত, অ্যানিমেশান-বিহীন দেখান</translation> <translation id="96421021576709873">ওয়াই-ফাই নেটওয়ার্ক</translation> <translation id="965490406356730238">উপলব্ধ থাকলে, ক্যাপচার করা ফ্রেমের জন্য হার্ডওয়্যার অ্যাক্সিলারেশন সমৃদ্ধ MPEG ডিকোড সক্ষম করুন।</translation> <translation id="968174221497644223">অ্যাপ্লিকেশন ক্যাশে</translation>
diff --git a/chrome/app/resources/generated_resources_ca.xtb b/chrome/app/resources/generated_resources_ca.xtb index 9f8e1ae..8d7a1a34 100644 --- a/chrome/app/resources/generated_resources_ca.xtb +++ b/chrome/app/resources/generated_resources_ca.xtb
@@ -18,7 +18,6 @@ <translation id="1029317248976101138">Zoom</translation> <translation id="1029595648591494741">Voleu provar <ph name="EXTENSION_NAME" />?</translation> <translation id="1031362278801463162">S'està carregant la previsualització</translation> -<translation id="1031460590482534116">S'ha produït un error en provar d'emmagatzemar el certificat de client. Error <ph name="ERROR_NUMBER" /> (<ph name="ERROR_NAME" />).</translation> <translation id="1031573127485938293">Pregunta (per política)</translation> <translation id="103279545524624934">Allibera espai al disc per poder iniciar aplicacions d'Android.</translation> <translation id="1033780634303702874">Accedeix als dispositius en sèrie</translation> @@ -46,7 +45,7 @@ <translation id="1058325955712687476">Activa el servei d'interacció del lloc, amb què s'enregistra la interacció amb els llocs i es gestionen els recursos en conseqüència.</translation> <translation id="1058418043520174283"><ph name="INDEX" /> de <ph name="COUNT" /></translation> <translation id="1062407476771304334">Substitueix</translation> -<translation id="1062866675591297858">Gestiona els usuaris supervisats mitjançant el <ph name="BEGIN_LINK" />Tauler d'usuaris supervisats<ph name="END_LINK" />.</translation> +<translation id="1062866675591297858">Gestiona els usuaris supervisats mitjançant el <ph name="BEGIN_LINK" />tauler d'usuaris supervisats<ph name="END_LINK" />.</translation> <translation id="1064662184364304002">Comprovador de fitxers de la biblioteca multimèdia</translation> <translation id="1064835277883315402">Unió a la xarxa privada</translation> <translation id="1064912851688322329">Desconnexió del vostre compte de Google</translation> @@ -101,6 +100,7 @@ <translation id="1128591060186966949">Edita el motor de cerca</translation> <translation id="1128987120443782698">El dispositiu d'emmagatzematge té una capacitat de <ph name="DEVICE_CAPACITY" />. Inseriu una targeta SD o un llapis de memòria USB amb una capacitat mínima de 4 GB.</translation> <translation id="1137135726305341424">domContentLoaded i totes les càrregues de recursos iniciades abans de domContentLoaded (marc principal i iframes del mateix origen).</translation> +<translation id="1138663153846032155">Prefereix HTML a Flash</translation> <translation id="1140351953533677694">Accedeix als dispositius en sèrie i Bluetooth</translation> <translation id="114140604515785785">Directori arrel: </translation> <translation id="1143142264369994168">Signant del certificat</translation> @@ -252,6 +252,7 @@ <translation id="1351692861129622852">S'estan important <ph name="FILE_COUNT" /> fitxers...</translation> <translation id="1352103415082130575">Teclat tailandès (pattachote)</translation> <translation id="1353686479385938207"><ph name="PROVIDER_NAME" />: <ph name="NETWORK_NAME" /></translation> +<translation id="1353946958707294039">Gestor d'emmagatzematge de Material Design</translation> <translation id="1353966721814789986">Pàgines d'inici</translation> <translation id="1354868058853714482">Adobe Reader no està actualitzat i pot ser insegur.</translation> <translation id="1355408554203439639">Rasteritzador de programari 3D</translation> @@ -423,7 +424,6 @@ <translation id="1533920822694388968">Alineació de TV</translation> <translation id="15373452373711364">Cursor del ratolí gran</translation> <translation id="1543284117603151572">Importades d'Edge</translation> -<translation id="1544350195767834591">{NUM_COOKIES,plural, =1{1 d'altres llocs}other{# d'altres llocs}}</translation> <translation id="1545177026077493356">Mode quiosc automàtic</translation> <translation id="1545786162090505744">URL amb %s en el lloc de la consulta</translation> <translation id="1546280085599573572">Aquesta extensió ha canviat la pàgina que es mostra quan feu clic al botó d'inici.</translation> @@ -447,7 +447,6 @@ <translation id="1559235587769913376">Entrada de caràcters Unicode</translation> <translation id="1561092721008294962">HarfBuzz per al text de la interfície d'usuari</translation> <translation id="1566049601598938765">Lloc web</translation> -<translation id="1566958206723629112">Flash i PDF</translation> <translation id="1567723158593978621">Quan s'activi, l'inici de sessió al navegador utilitzarà un nou flux gaia d'inici de sessió separat per contrasenyes.</translation> <translation id="1567993339577891801">Consola de JavaScript</translation> <translation id="1568323446248056064">Obre la configuració de la pantalla</translation> @@ -576,7 +575,6 @@ <translation id="1723940674997333416">Permet WebSocket no segur des de l'origen https</translation> <translation id="1725149567830788547">Mostra els &controls</translation> <translation id="172612876728038702">S'està instal·lant TPM. Tingueu paciència; el procés pot trigar uns minuts.</translation> -<translation id="1727135806684246609">Dades detallades de seguretat a Material Design</translation> <translation id="1729533290416704613">També controla la pàgina que es mostra quan feu una cerca des de l'omnibox.</translation> <translation id="1731346223650886555">Punt i coma</translation> <translation id="1731589410171062430">Total: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /> (<ph name="NUMBER_OF_PAGES" /> <ph name="PAGE_OR_PAGES_LABEL" />)</translation> @@ -872,6 +870,7 @@ <translation id="218492098606937156">Activa els esdeveniments tàctils</translation> <translation id="2187317261103489799">Detecta (opció predeterminada)</translation> <translation id="2187895286714876935">Error d'importació del certificat del servidor</translation> +<translation id="2188881192257509750">Obre <ph name="APPLICATION" /></translation> <translation id="2190069059097339078">Obtenidor de credencials de la Wi-Fi</translation> <translation id="219008588003277019">Mòdul de client nadiu: <ph name="NEXE_NAME" /></translation> <translation id="2190355936436201913">(buit)</translation> @@ -990,6 +989,7 @@ <translation id="2326606747676847821">Passa al mode d'incògnit</translation> <translation id="2326931316514688470">&Tornar a carregar l'aplicació</translation> <translation id="2327492829706409234">Activa l'aplicació</translation> +<translation id="2328054044222305089">Se suprimiran totes les dades que <ph name="SITE" /> hagi emmagatzemat al dispositiu i es restabliran els permisos que hagis concedit. Vols continuar?</translation> <translation id="2329597144923131178">Inicieu la sessió per tenir adreces d'interès, historial, contrasenyes i altres opcions de configuració en tots els dispositius.</translation> <translation id="2332131598580221120">Mostra a la botiga</translation> <translation id="2332742915001411729">Restableix als valors predeterminats</translation> @@ -1245,7 +1245,7 @@ <translation id="2653659639078652383">Envia</translation> <translation id="265390580714150011">Valor del camp</translation> <translation id="2655386581175833247">Certificat d'usuari:</translation> -<translation id="265673355620330510">Obre el Tauler d'usuaris supervisats</translation> +<translation id="265673355620330510">Obre el tauler d'usuaris supervisats</translation> <translation id="2660779039299703961">Esdeveniment</translation> <translation id="2661146741306740526">16 x 9</translation> <translation id="2662876636500006917">Chrome Web Store</translation> @@ -1264,7 +1264,6 @@ <translation id="2675358154061544447">Compatibilitat molt experimental amb la renderització d'iframes entre llocs en processos separats. En aquest mode, els documents només comparteixen un procés de renderització si són del mateix lloc web.</translation> <translation id="2676946222714718093">En reproducció</translation> <translation id="2678063897982469759">Torna a activar</translation> -<translation id="2678246812096664977">Tots els connectors</translation> <translation id="2679385451463308372">Imprimeix des de la finestra de diàleg del sistema…</translation> <translation id="2680208403056680091">La vostra connexió a Internet s'està controlant</translation> <translation id="268053382412112343">Hi&storial</translation> @@ -1438,7 +1437,6 @@ <translation id="287286579981869940">Afegeix <ph name="PROVIDER_NAME" />...</translation> <translation id="2872961005593481000">Apaga</translation> <translation id="2875698561019555027">(Pàgines d'error de Chrome)</translation> -<translation id="2879560882721503072">S'ha emmagatzemant correctament el certificat del client emès per <ph name="ISSUER" />.</translation> <translation id="288024221176729610">Txec</translation> <translation id="288042212351694283">Accés als dispositius Universal 2nd Factor</translation> <translation id="2881966438216424900">Darrer accés:</translation> @@ -1587,6 +1585,7 @@ <translation id="3057861065630527966">Crea una còpia de seguretat de les fotos i dels vídeos</translation> <translation id="3058212636943679650">Si mai necessiteu recuperar el sistema operatiu del vostre equip, necessitareu una targeta SD o un llapis de memòria USB de recuperació.</translation> <translation id="305932878998873762">La memòria cau senzilla per a HTTP és una memòria cau nova que utilitza el sistema de fitxers per assignar l'espai en disc.</translation> +<translation id="3060251871394327123">Se suprimiran totes les dades que <ph name="SITE" /> hagi emmagatzemat al dispositiu. Vols continuar?</translation> <translation id="3061650404498811439">Activa l'accés a emoji, a l'escriptura a mà i a l'entrada de veu des del menú d'activació d'IME.</translation> <translation id="3062606427884046423">Utilitza les notificacions de l'estil multimèdia d'Android a les notificacions multimèdia de Chrome.</translation> <translation id="3063844757726132584">Accediu a totes les vostres aplicacions des d'aquest pràctic menú. Jugueu, participeu en xats de vídeo, escolteu música, editeu documents o baixeu més aplicacions.</translation> @@ -1636,6 +1635,7 @@ <translation id="3123569374670379335">(supervisat)</translation> <translation id="3124111068741548686">Controls d'USUARI</translation> <translation id="3126026824346185272">Ctrl</translation> +<translation id="3127156390846601284">Se suprimiran totes les dades emmagatzemades al dispositiu per a tots els llocs mostrats. Vols continuar?</translation> <translation id="312759608736432009">Fabricant del dispositiu:</translation> <translation id="3127919023693423797">S'està autenticant...</translation> <translation id="3128230619496333808">Pestanya 6</translation> @@ -1734,7 +1734,6 @@ <translation id="3264544094376351444">Tipus de lletra Sans-serif</translation> <translation id="3264547943200567728">No s'ha pogut configurar la xarxa de Chromebox</translation> <translation id="3265459715026181080">Tanca la finestra</translation> -<translation id="3267271790328635957">Només PDF</translation> <translation id="3267726687589094446">Continua permetent la baixada automàtica de diversos fitxers</translation> <translation id="3267998849713137817">Hora de modificació</translation> <translation id="3268451620468152448">Pestanyes obertes</translation> @@ -1979,6 +1978,7 @@ <translation id="3574210789297084292">inicia la sessió</translation> <translation id="3574305903863751447"><ph name="CITY" />, <ph name="STATE" /> <ph name="COUNTRY" /></translation> <translation id="357479282490346887">Lituà</translation> +<translation id="3575927481544652747">Desactiva l'API Windows Runtime MIDI per a WebMIDI, que està activada de manera predeterminada a Windows 10 o versions posteriors.</translation> <translation id="3576324189521867626">S'ha instal·lat correctament</translation> <translation id="3578331450833904042">Opció predeterminada (ho capta tot)</translation> <translation id="3578594933904494462">El contingut d'aquesta pestanya es comparteix.</translation> @@ -2032,8 +2032,6 @@ <translation id="3627320433825461852">Queda menys d'un minut</translation> <translation id="3627588569887975815">Obre l'enllaç en una finestra d'inco&gnito</translation> <translation id="3627671146180677314">Data i hora de renovació de certificat de Netscape</translation> -<translation id="3629326610814700057">Permet que el gestor d'emmagatzematge gestioni l'emmagatzematge local.</translation> -<translation id="3630337581925712713"><ph name="PERMISSION_TYPE_LABEL" />:</translation> <translation id="3631337165634322335">Les excepcions següents només s'apliquen a la sessió d'incògnit actual.</translation> <translation id="3633586230741134985">Configuració del menú d'aplicacions</translation> <translation id="3633997706330212530">De manera opcional, podeu desactivar aquests serveis.</translation> @@ -2056,7 +2054,8 @@ <translation id="3654045516529121250">Consultar la configuració d'accessibilitat</translation> <translation id="3654092442379740616">Error de sincronització: <ph name="PRODUCT_NAME" /> no està actualitzat i necessita una actualització.</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{Té accés permanent a un fitxer.}other{Té accés permanent a # fitxers.}}</translation> -<translation id="3657468915905674858">Activa el bloqueig de Win32k per a PPAPI.</translation> +<translation id="365793796291733849"><ph name="BEGIN_PARAGRAPH1" />Quan s'activa la còpia de seguretat automàtica, les dades del dispositiu i de les aplicacions es desen de manera periòdica en una carpeta privada de Google Drive. S'entén per dades de les aplicacions qualsevol dada que hagi desat una aplicació (segons la configuració del desenvolupador), incloses dades que puguin ser confidencials, com ara els contactes, els missatges i les fotos.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Les dades de la còpia de seguretat no ocupen espai de la quota d'emmagatzematge de Drive. No es farà cap còpia de seguretat dels fitxers grans ni dels que els desenvolupadors hagin exclòs del servei.<ph name="END_PARAGRAPH2" /></translation> <translation id="3660234220361471169">No és de confiança</translation> <translation id="3665589677786828986">Chrome ha detectat que un altre programa ha malmès alguns dels paràmetres de configuració i els ha restablert als valors predeterminats originals.</translation> <translation id="3665842570601375360">Seguretat:</translation> @@ -2111,6 +2110,7 @@ <translation id="3733127536501031542">Servidor SSL amb entrada progressiva</translation> <translation id="3736520371357197498">Si enteneu el risc que suposa per a la vostra seguretat, podeu <ph name="BEGIN_LINK" />visitar aquest lloc no segur<ph name="END_LINK" /> abans que no s'hagin suprimit els programes perillosos.</translation> <translation id="3738924763801731196"><ph name="OID" />:</translation> +<translation id="3739254215541673094">Vols obrir <ph name="APPLICATION" />?</translation> <translation id="3739798227959604811">Retard abans de la repetició:</translation> <translation id="3741158646617793859"><ph name="DEVICE_NAME" /> ara es mostrarà a la Consola d'administració.</translation> <translation id="3741243925913727067">Crea còpies de seguretat de les fotos i dels vídeos del dispositiu multimèdia a Google Drive.</translation> @@ -2348,7 +2348,6 @@ <translation id="4058793769387728514">Comprova el document ara</translation> <translation id="4059285154003114015">&Imprimir el marc...</translation> <translation id="406070391919917862">Aplicacions de fons</translation> -<translation id="4061502419206152498">Mostra només els elements no segurs, sense animació</translation> <translation id="4062251648694601778">Gaudiu del vostre dispositiu <ph name="SHORT_PRODUCT_NAME" />. Teniu cap pregunta? Podeu obtenir ajuda en qualsevol moment fent clic al símbol ? de la safata d'estat.</translation> <translation id="4065876735068446555">És possible que la xarxa que esteu fent servir (<ph name="NETWORK_ID" />) sol·liciti que en visiteu la pàgina d'inici de sessió.</translation> <translation id="4068506536726151626">Aquesta pàgina conté elements dels llocs següents que fan un seguiment de la teva ubicació:</translation> @@ -2387,7 +2386,6 @@ <translation id="4101878899871018532">El gestor de contrasenyes no oferirà la possibilitat de desar les credencials utilitzades per a la sincronització.</translation> <translation id="410351446219883937">Reproducció automàtica</translation> <translation id="4104163789986725820">E&xporta...</translation> -<translation id="4105523032910086267">Defineix l'animació i la visibilitat de les dades detallades de seguretat a Material Design.</translation> <translation id="4105563239298244027">Obteniu 1 TB gratis amb Google Drive</translation> <translation id="4109135793348361820">Mou la finestra a <ph name="USER_NAME" /> (<ph name="USER_EMAIL" />)</translation> <translation id="4110342520124362335">S'han bloquejat les galetes de <ph name="DOMAIN" />.</translation> @@ -2438,6 +2436,7 @@ <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="4188447344915957833">Activa el gestor d'emmagatzematge a la configuració de Material Design.</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> <translation id="4193182321948161343">Activa l'administrador d'usuaris de Material Design</translation> @@ -2645,6 +2644,7 @@ <translation id="4508765956121923607">Visualitza l'&origen</translation> <translation id="4509017836361568632">Descarta la foto</translation> <translation id="4509345063551561634">Ubicació:</translation> +<translation id="4513946894732546136">Comentaris</translation> <translation id="4514542542275172126">Configura un usuari supervisat nou</translation> <translation id="4514914692061505365">Força l'ús del traductor ràpid Subzero del PNaCl en tots els fitxers executables portables.</translation> <translation id="451515744433878153">Suprimeix</translation> @@ -2743,6 +2743,7 @@ <translation id="4656293982926141856">Aquest ordinador</translation> <translation id="4656631038341342120">Activeu el shell de RV si està disponible per a aquest dispositiu.</translation> <translation id="4657031070957997341">Permet sempre els connectors a <ph name="HOST" /></translation> +<translation id="466008749075469935">Permet intervenir per limitar a l'1% l'ús de temporitzadors en segon pla a la CPU.</translation> <translation id="4663254525753315077">Quan sigui possible, situa el contingut de desplaçament d'un element de desplaçament de desbordament en una capa composta perquè el desplaçament sigui més ràpid.</translation> <translation id="4664482161435122549">Error d'exportació PKCS #12</translation> <translation id="4665014895760275686">Fabricant</translation> @@ -2809,6 +2810,7 @@ <translation id="4749157430980974800">Teclat georgià</translation> <translation id="4750394297954878236">Suggeriments</translation> <translation id="475088594373173692">Primer usuari</translation> +<translation id="4750892496809949692">Dóna preferència al contingut HTML amagant Flash de la llista de connectors.</translation> <translation id="4750917950439032686">La teva informació (com ara les contrasenyes o els números de targeta de crèdit) es considera privada quan s'envia a aquest lloc.</translation> <translation id="4753602155423695878">Animació de la barra de progrés de la càrrega de pàgines en telèfons Android</translation> <translation id="4755240240651974342">Teclat finès</translation> @@ -2891,7 +2893,7 @@ <translation id="4850458635498951714">Afegeix un dispositiu</translation> <translation id="4850669014075537160">Desplaçament</translation> <translation id="4850886885716139402">Visualització</translation> -<translation id="4851858059374029925">Vols instal·lar <ph name="PLUGIN_NAME" />? Instal·la només connectors fiables.</translation> +<translation id="4851858059374029925">Vols instal·lar <ph name="PLUGIN_NAME" />? Instal·la només connectors de confiança.</translation> <translation id="4853020600495124913">Obre en una &finestra nova</translation> <translation id="485316830061041779">Alemany</translation> <translation id="4856478137399998590">El servei de dades mòbil està activat i a punt per fer servir</translation> @@ -3083,6 +3085,7 @@ <translation id="5119450342834678097">Opció de sol·licitud del lloc per a tauletes al menú de configuració</translation> <translation id="5120068803556741301">Mètode d'introducció de text de tercers</translation> <translation id="5120421890733714118">Confia en aquest certificat per identificar llocs web.</translation> +<translation id="5120516977819314347">El PIN o la contrasenya són incorrectes.</translation> <translation id="5121130586824819730">El vostre disc dur és ple. Deseu-ho en una altra ubicació o allibereu espai del disc dur.</translation> <translation id="5125751979347152379">URL no vàlid.</translation> <translation id="5127881134400491887">Gestioneu les connexions de xarxa</translation> @@ -3090,6 +3093,7 @@ <translation id="512903556749061217">connectat</translation> <translation id="5129301143853688736">La vostra connexió amb aquest lloc no és privada. És possible que alguns atacants estiguin provant de robar-vos informació (per exemple, fotos, contrasenyes, missatges i dades de targetes de crèdit) del domini <ph name="DOMAIN" />.</translation> <translation id="5129662217315786329">Polonès</translation> +<translation id="5131347545782851480">Documents PDF</translation> <translation id="5134856901811723984">Material Design a la interfície d'usuari del sistema Chrome OS</translation> <translation id="5135533361271311778">No s'ha pogut crear l'element d'adreça d'interès.</translation> <translation id="5136529877787728692">F7</translation> @@ -3257,6 +3261,7 @@ <translation id="5328031682234198929">8</translation> <translation id="5329858601952122676">&Suprimeix</translation> <translation id="5330145655348521461">Aquests fitxers s'han obert en un altre escriptori. Aneu a <ph name="USER_NAME" /> (<ph name="MAIL_ADDRESS" />) per veure'l.</translation> +<translation id="5330512191124428349">Mostra la informació</translation> <translation id="5332624210073556029">Zona horària:</translation> <translation id="5333807720589685258">Si no introdueixes el número PUK correcte, la targeta SIM es desactivarà de manera definitiva.</translation> <translation id="5333958554630697967">Activa les funcions de la plataforma web experimental que s'estan desenvolupant.</translation> @@ -3690,7 +3695,6 @@ <translation id="5892507820957994680">Sobreescriu la llista de renderització de programari integrat i activa l'acceleració de la GPU en configuracions de sistema no admeses.</translation> <translation id="5895138241574237353">Reinicia</translation> <translation id="5895187275912066135">Emès el</translation> -<translation id="5898154795085152510">El servidor ha retornat un certificat de client no vàlid. Error <ph name="ERROR_NUMBER" /> (<ph name="ERROR_NAME" />).</translation> <translation id="5900302528761731119">Foto del perfil de Google</translation> <translation id="590253956165195626">Proposa'm de traduir les pàgines escrites en un idioma que no entenc.</translation> <translation id="5904093760909470684">Configuració del servidor intermediari</translation> @@ -3745,6 +3749,8 @@ <translation id="5984222099446776634">Visitats recentment</translation> <translation id="5984814259619230127">Detecció de dispositius Bluetooth de baix consum de Smart Lock</translation> <translation id="5986245990306121338">Si s'activa, es mostrarà un selector de pestanyes encara que l'opció Combineu pestanyes i aplicacions estigui activada a la configuració.</translation> +<translation id="5989712527536636369"><ph name="BEGIN_PARAGRAPH1" />Es tracta d'informació general sobre el dispositiu i sobre com l'utilitzes, com ara el nivell de bateria, la freqüència amb què utilitzes les aplicacions, la qualitat i la durada de les connexions de xarxa (per exemple, la Wi-Fi i el Bluetooth) i informes d'error quan el funcionament no és el previst. S'utilitzarà per millorar els productes i els serveis de Google per al públic en general. Part de la informació agregada també ajudarà els nostres partners, com ara els desenvolupadors d'Android, a millorar les seves aplicacions i els seus productes.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Pots activar o desactivar aquesta opció en qualsevol moment a la configuració de les aplicacions per a Android. No afectarà la capacitat del dispositiu d'enviar la informació necessària per rebre serveis bàsics, com ara actualitzacions del sistema i funcions de seguretat.<ph name="END_PARAGRAPH2" /></translation> <translation id="5990198433782424697">Extensions en URL chrome://</translation> <translation id="5990814808592353318">Generació manual de contrasenyes</translation> <translation id="5991049340509704927">Amplia</translation> @@ -3758,6 +3764,7 @@ <translation id="6005695835120147974">Encaminador multimèdia</translation> <translation id="6007237601604674381">El trasllat ha fallat. <ph name="ERROR_MESSAGE" /></translation> <translation id="6008241731410823808">Envia pings per fer auditories d'enllaços.</translation> +<translation id="6011449291337289699">Esborra les dades dels llocs</translation> <translation id="6015796118275082299">Any</translation> <translation id="6016551720757758985">Confirmació de Powerwash amb retorn a la versió anterior</translation> <translation id="6016809788585079594">Digueu "Ok Google" per última vegada</translation> @@ -3947,7 +3954,6 @@ <translation id="6276301056778294989">Assegureu-vos que figuri el mateix codi al dispositiu.</translation> <translation id="6277105963844135994">Temps d'espera de la xarxa</translation> <translation id="6277518330158259200">Fes una c&aptura de pantalla</translation> -<translation id="6278428485366576908">Tema</translation> <translation id="6279183038361895380">Premeu |<ph name="ACCELERATOR" />| per veure el cursor</translation> <translation id="6280215091796946657">Inicia la sessió amb un altre compte</translation> <translation id="6280912520669706465">ARC</translation> @@ -4198,6 +4204,7 @@ <translation id="6607272825297743757">Informació del fitxer</translation> <translation id="6607831829715835317">Més eine&s</translation> <translation id="6608140561353073361">Totes les galetes i dades del lloc...</translation> +<translation id="6610183966322615106">S'ha produït un error en afegir la impressora</translation> <translation id="6610610633807698299">Introduïu l'URL...</translation> <translation id="6612358246767739896">Contingut protegit</translation> <translation id="6615455863669487791">Mostra-m'ho</translation> @@ -4261,7 +4268,6 @@ <translation id="6708242697268981054">Origen:</translation> <translation id="6709357832553498500">Connecta mitjançant <ph name="EXTENSIONNAME" /></translation> <translation id="6710213216561001401">Anterior</translation> -<translation id="6712158998835983046">Mostra tots els elements, amb animació</translation> <translation id="6718273304615422081">S'està comprimint...</translation> <translation id="671928215901716392">Bloqueja la pantalla</translation> <translation id="6721972322305477112">&Fitxer</translation> @@ -4468,7 +4474,7 @@ <translation id="7010160495478792664">Descodificació de vídeo accelerada mitjançant maquinari on estigui disponible.</translation> <translation id="7010400591230614821">Estratègia agressiva d'alliberament de pestanyes</translation> <translation id="701080569351381435">Visualitza l'origen</translation> -<translation id="7012372675181957985">És possible que el teu compte de Google tingui altres formes de l'historial de navegació a <ph name="BEGIN_LINK" />history.google.com<ph name="END_LINK" />.</translation> +<translation id="7012372675181957985">És possible que el teu compte de Google tingui altres formes de l'historial de navegació a <ph name="BEGIN_LINK" />history.google.com<ph name="END_LINK" /></translation> <translation id="7012435537548305893">Activa la llista d'aplicacions en pantalla completa en mode tocar i visualitzar.</translation> <translation id="7013485839273047434">Baixa més extensions</translation> <translation id="7014174261166285193">La instal·lació ha fallat.</translation> @@ -4534,7 +4540,6 @@ <translation id="7088434364990739311">La comprovació d'actualització no s'ha pogut iniciar (codi d'error <ph name="ERROR" />).</translation> <translation id="708856090370082727">Activa la compatibilitat amb el desplaçament del teclat en pantalla. Amb aquesta opció activada, el teclat de pantalla només canviarà la mida de la finestra gràfica visual.</translation> <translation id="7088674813905715446">L'administrador ha canviat l'estat d'aquest dispositiu perquè no es pugui utilitzar. Per permetre que us hi pugueu registrar, demaneu a l'administrador que en defineixi l'estat com a pendent.</translation> -<translation id="7089609847854449639">Gestor d'emmagatzematge</translation> <translation id="708969677220991657">Permet realitzar sol·licituds al localhost a través d'HTTPS, fins i tot quan es presenta un certificat no vàlid.</translation> <translation id="7092106376816104">Excepcions de finestres emergents</translation> <translation id="7093866338626856921">Intercanviar dades amb els dispositius <ph name="HOSTNAMES" /></translation> @@ -4574,7 +4579,7 @@ <translation id="715118844758971915">Impressores clàssiques</translation> <translation id="7154130902455071009">Canvia la pàgina d'inici per: <ph name="START_PAGE" /></translation> <translation id="7155171745945906037">Foto existent de la càmera o d'un fitxer</translation> -<translation id="715568033737470079">Especifica els connectors PPAPI que s'executaran amb la política de proves de bloqueig de Win32k (només per a Windows 10 i versions superiors).</translation> +<translation id="7155226869555939647">Obre sempre els enllaços de l'aplicació <ph name="APPLICATION" /></translation> <translation id="7156235233373189579">Aquest fitxer està dissenyat per a un ordinador que faci servir programari de Windows. No és compatible amb el vostre dispositiu, que funciona amb Chrome OS. Cerqueu una aplicació adequada equivalent a <ph name="BEGIN_LINK" />Chrome Web Store<ph name="END_LINK" />. <ph name="BEGIN_LINK_HELP" />Més informació<ph name="END_LINK_HELP" /></translation> <translation id="7157063064925785854">En fer clic a Continua, accepteu les <ph name="LEGAL_DOC_LINK_TEXT_1" />, les <ph name="LEGAL_DOC_LINK_TEXT_2" />, les <ph name="LEGAL_DOC_LINK_TEXT_3" /> i la <ph name="LEGAL_DOC_LINK_TEXT_4" />.</translation> <translation id="7158238151765743968">La connexió a "<ph name="DEVICE_NAME" />" encara està en curs.</translation> @@ -4589,6 +4594,7 @@ <translation id="7175353351958621980">Carregat des de:</translation> <translation id="7180611975245234373">Actualitza</translation> <translation id="7180865173735832675">Personalitza</translation> +<translation id="7181387261278441780">Esborra i restableix les dades del lloc</translation> <translation id="7185078796915954712">TLS 1.3</translation> <translation id="7185690883425432021">Amaga els botons per tancar en pestanyes inactives quan les pestanyes estan en mode apilat.</translation> <translation id="7186088072322679094">Conserva a la barra d'eines</translation> @@ -4621,7 +4627,6 @@ <translation id="7223775956298141902">No teniu cap extensió :-(</translation> <translation id="7224023051066864079">Màscara de subxarxa:</translation> <translation id="7225179976675429563">Falta el tipus de xarxa</translation> -<translation id="7230191962699768124">Mostra tots els elements, sense animació</translation> <translation id="7230787553283372882">Personalitza la mida del text</translation> <translation id="7231224339346098802">Utilitzeu un número per indicar el nombre de còpies que voleu imprimir (una o més).</translation> <translation id="7238585580608191973">Empremta SHA-256</translation> @@ -4747,7 +4752,6 @@ <translation id="7409233648990234464">Torna a iniciar i fes powerwash</translation> <translation id="7409836189476010449">Executar Flash</translation> <translation id="7410344089573941623">Pregunta si <ph name="HOST" /> vol accedir a la càmera i al micròfon</translation> -<translation id="7411343637221933631">{NUM_COOKIES,plural, =1{1 d'aquest lloc}other{# d'aquest lloc}}</translation> <translation id="7412226954991670867">Memòria de la GPU</translation> <translation id="7416362041876611053">Error de xarxa desconegut.</translation> <translation id="7417453074306512035">Teclat etíop</translation> @@ -4867,6 +4871,7 @@ <translation id="756445078718366910">Obre una finestra del navegador</translation> <translation id="7564847347806291057">Finalitza el procés</translation> <translation id="7566723889363720618">F12</translation> +<translation id="7567314848159753396">Galeta: <ph name="NAME" /></translation> <translation id="756809126120519699">S'han esborrat les dades de Chrome</translation> <translation id="7568790562536448087">Actualització</translation> <translation id="7573172247376861652">Càrrega de la bateria</translation> @@ -4907,6 +4912,7 @@ <translation id="7626009897377900107">Generació de contrasenyes</translation> <translation id="7627262197844840899">Aquest lloc no accepta MasterCard.</translation> <translation id="7627790789328695202"><ph name="FILE_NAME" /> ja existeix. Canvieu-ne el nom i torneu-ho a provar.</translation> +<translation id="7628127343934101653">Obre els fitxers PDF a l'aplicació predeterminada de lector de PDF.</translation> <translation id="762917759028004464">El navegador predeterminat és <ph name="BROWSER_NAME" />.</translation> <translation id="7629536005696009600">Permet que les credencials desades a les aplicacions d'Android s'introdueixin als llocs web corresponents.</translation> <translation id="7629827748548208700">Pestanya: <ph name="TAB_NAME" /></translation> @@ -5135,6 +5141,7 @@ <translation id="7957513156576779045">Activa el Bluetooth per permetre la vinculació</translation> <translation id="7957615753207896812">Obre la configuració del teclat</translation> <translation id="7959074893852789871">El fitxer contenia certificats múltiples, però alguns no s'han importat:</translation> +<translation id="7959700692661109221"><ph name="BEGIN_PARAGRAPH" />El servei d'ubicació de Google utilitza fonts com ara les xarxes Wi‑Fi per calcular la ubicació del dispositiu de manera més ràpida i precisa. Quan actives els serveis d'ubicació de Google, el dispositiu activa un mode que utilitza xarxes Wi-Fi per proporcionar la informació d'ubicació. Pots desactivar aquesta opció a la configuració d'ubicació en qualsevol moment.<ph name="END_PARAGRAPH" /></translation> <translation id="7961015016161918242">Mai</translation> <translation id="7964089325405904043">Importació i exportació de contrasenyes</translation> <translation id="7965010376480416255">Memòria compartida</translation> @@ -5285,6 +5292,7 @@ <translation id="8146793085009540321">No s'ha pogut iniciar la sessió. Contacteu amb l'administrador o torneu-ho a provar.</translation> <translation id="8148264977957212129">Mètode d'entrada de pinyin</translation> <translation id="8148913456785123871">Mostra les targetes de Google Now al menú d'aplicacions</translation> +<translation id="8150391391298684512">Desactiva l'API Windows Runtime MIDI</translation> <translation id="8151185429379586178">Eines per a desenvolupadors</translation> <translation id="8151638057146502721">Configura</translation> <translation id="8151639108075998630">Activa la navegació de convidats</translation> @@ -5465,7 +5473,7 @@ <translation id="8393700583063109961">Envia el missatge</translation> <translation id="8396532978067103567">Contrasenya incorrecta.</translation> <translation id="839736845446313156">Registra</translation> -<translation id="8398790343843005537">Cerca el telèfon</translation> +<translation id="8398790343843005537">Cerca el teu telèfon</translation> <translation id="8398877366907290961">Continua igualment</translation> <translation id="8399276228600040370">Inicieu la sessió amb el compte desat a <ph name="PASSWORD_MANAGER_BRAND" /></translation> <translation id="8400146488506985033">Gestiona persones</translation> @@ -5565,6 +5573,7 @@ <translation id="8532294913309524834">Ordena els idiomes segons les teves preferències.</translation> <translation id="8535005006684281994">URL de renovació de certificat de Netscape</translation> <translation id="8539727552378197395">No (Només HTTP)</translation> +<translation id="8541084862688000575">Carrega les aplicacions per a Android automàticament</translation> <translation id="8543181531796978784">Podeu <ph name="BEGIN_ERROR_LINK" />informar d'un problema de detecció<ph name="END_ERROR_LINK" /> o, si enteneu els riscos que això comporta per a la vostra seguretat, <ph name="BEGIN_LINK" />visiteu aquest lloc no segur<ph name="END_LINK" />.</translation> <translation id="8545107379349809705">Amaga la informació...</translation> <translation id="8545211332741562162">Permet que les pàgines web facin servir funcions JavaScript experimentals.</translation> @@ -5592,7 +5601,6 @@ <translation id="8569764466147087991">Seleccioneu el fitxer que vulgueu obrir</translation> <translation id="8571032220281885258">Si dieu "Ok Google", Chrome cercarà el que digueu a continuació.</translation> <translation id="8571108619753148184">Servidor 4</translation> -<translation id="8572832761467613633">Només Flash</translation> <translation id="8572981282494768930">No permetis que els llocs accedeixin a la càmera i al micròfon</translation> <translation id="8574234089711453001">Permet que es mostri un botó de baixada en obrir una pàgina amb un URL multimèdia.</translation> <translation id="857779305329188634">Activeu la compatibilitat del protocol QUIC experimental.</translation> @@ -5614,6 +5622,7 @@ <translation id="8600929685092827187">Paquets d'activació</translation> <translation id="8601206103050338563">Autenticació de client WWW de TLS</translation> <translation id="8602851771975208551">Un altre programa de l'ordinador ha afegit una aplicació que pot canviar el funcionament de Chrome.</translation> +<translation id="8603912787021349466">Permet que les aplicacions per a Android s'iniciïn automàticament després d'iniciar la sessió.</translation> <translation id="8605428685123651449">Memòria SQLite</translation> <translation id="8605503133013456784">No s'ha pogut desconnectar i dessincronitzar de: "<ph name="DEVICE_NAME" />".</translation> <translation id="8606726445206553943">Utilitzar els dispositius MIDI</translation> @@ -5909,7 +5918,7 @@ <translation id="8994845581478641365">Creador de memòria cau de tipus de lletra DirectWrite</translation> <translation id="8995603266996330174">Gestionat per <ph name="DOMAIN" /></translation> <translation id="8996526648899750015">Afegeix un compte...</translation> -<translation id="8996941253935762404">El lloc al qual accediu conté programes perjudicials</translation> +<translation id="8996941253935762404">Aquest lloc conté programes perjudicials</translation> <translation id="8997135628821231"><ph name="ISSUED_BY" /> [<ph name="ISSUED_TO" />] (<ph name="DEVICE" />)</translation> <translation id="9000649589621199759">No trobem el telèfon. Comproveu que estigueu utilitzant un telèfon Android compatible, que estigui activat i que el tingueu a mà. <a>Més informació</a></translation> <translation id="9001035236599590379">Tipus de MIME</translation> @@ -5966,6 +5975,7 @@ <translation id="9053965862400494292">S'ha produït un error en intentar configurar la sincronització.</translation> <translation id="9056034633062863292">S'està actualitzant Chromebox</translation> <translation id="9056810968620647706">No s'ha trobat cap coincidència.</translation> +<translation id="9057119625587205566">No hi ha cap impressora a prop</translation> <translation id="9059868303873565140">Menú d'estat</translation> <translation id="9064142312330104323">Foto del perfil de Google (s'està carregant)</translation> <translation id="9064275926664971810">Activa l'emplenament automàtic per emplenar els formularis amb un sol clic</translation> @@ -5976,6 +5986,7 @@ <translation id="9067401056540256169">Aquesta marca fa que Chrome no sigui segur. Utilitzeu-la només si en teniu clar el funcionament. Tingueu en compte que la marca es pot suprimir sense avís previ. Si estan activats, els marcs amb un origen https poden utilitzar WebSockets amb un URL no segur (ws://).</translation> <translation id="9068931793451030927">Camí:</translation> <translation id="9070219033670098627">Canvia de persona</translation> +<translation id="9070940116164932228">Accelera els temporitzadors en segon pla que consumeixen molta CPU</translation> <translation id="907148966137935206">No permetis que cap lloc mostri finestres emergents (recomanat)</translation> <translation id="9072550133391925347"><ph name="PASSWORD_MANAGER_BRAND" /> us inicia la sessió automàticament als llocs i a les aplicacions que compleixen els requisits amb les contrasenyes que heu desat.</translation> <translation id="9073281213608662541">PAP</translation> @@ -6009,6 +6020,7 @@ <translation id="9112614144067920641">Trieu un PIN nou.</translation> <translation id="9112748030372401671">Canviar el fons de pantalla</translation> <translation id="9112987648460918699">Cerca...</translation> +<translation id="9114663181201435112">Inicia la sessió fàcilment</translation> <translation id="9115487443206954631">Gestiona els dispositius d'emissió</translation> <translation id="9115675100829699941">&Adreces d'interès</translation> <translation id="9121814364785106365">Obre-ho com a pestanya reduïda</translation> @@ -6103,7 +6115,6 @@ <translation id="952992212772159698">No activat</translation> <translation id="960719561871045870">Codi d'operador</translation> <translation id="960987915827980018">Queda cosa d'una hora</translation> -<translation id="962778376131245616">Mostra només els elements no segurs, amb animació</translation> <translation id="96421021576709873">Xarxa Wi-Fi</translation> <translation id="965490406356730238">Si està disponible, activeu la descodificació de mjpeg accelerada amb maquinari per als fotogrames capturats.</translation> <translation id="968174221497644223">Memòria cau de l'aplicació</translation>
diff --git a/chrome/app/resources/generated_resources_cs.xtb b/chrome/app/resources/generated_resources_cs.xtb index 88c6dda..c638f70b 100644 --- a/chrome/app/resources/generated_resources_cs.xtb +++ b/chrome/app/resources/generated_resources_cs.xtb
@@ -18,7 +18,6 @@ <translation id="1029317248976101138">Lupa</translation> <translation id="1029595648591494741">Chcete vyzkoušet rozšíření <ph name="EXTENSION_NAME" />?</translation> <translation id="1031362278801463162">Načítání náhledu</translation> -<translation id="1031460590482534116">Při pokusu o uložení klientského certifikátu došlo k chybě <ph name="ERROR_NUMBER" /> (<ph name="ERROR_NAME" />).</translation> <translation id="1031573127485938293">Zeptat se (podle zásad)</translation> <translation id="103279545524624934">Chcete-li spouštět aplikace pro Android, uvolněte místo na disku.</translation> <translation id="1033780634303702874">Přistupovat k zařízením připojeným pomocí sériového portu</translation> @@ -101,6 +100,7 @@ <translation id="1128591060186966949">Úprava vyhledávače</translation> <translation id="1128987120443782698">Kapacita úložného zařízení je <ph name="DEVICE_CAPACITY" />. Vložte kartu SD nebo paměťovou jednotku USB s kapacitou nejméně 4 GB.</translation> <translation id="1137135726305341424">domContentLoaded a zahájeno načítání všech zdrojů před událostí domContentLoaded (hlavní rámec a prvky iframe ze stejného zdroje).</translation> +<translation id="1138663153846032155">Preferovat před obsahem Flash obsah HTML</translation> <translation id="1140351953533677694">Přistupovat k zařízením připojeným přes Bluetooth a sériový port</translation> <translation id="114140604515785785">Kořenový adresář rozšíření:</translation> <translation id="1143142264369994168">Autor podpisu certifikátu</translation> @@ -252,6 +252,7 @@ <translation id="1351692861129622852">Importování <ph name="FILE_COUNT" /> souborů...</translation> <translation id="1352103415082130575">Thajská klávesnice (Pattachote)</translation> <translation id="1353686479385938207"><ph name="PROVIDER_NAME" />: <ph name="NETWORK_NAME" /></translation> +<translation id="1353946958707294039">Správce úložiště se vzhledem Material Design</translation> <translation id="1353966721814789986">Stránky otevírané při spuštění</translation> <translation id="1354868058853714482">Program Adobe Reader je zastaralý a nemusí být zabezpečený.</translation> <translation id="1355408554203439639">3D softwarový rasterizér</translation> @@ -424,7 +425,6 @@ <translation id="1533920822694388968">Zarovnání televize</translation> <translation id="15373452373711364">Velký kurzor myši</translation> <translation id="1543284117603151572">Importováno z aplikace Edge</translation> -<translation id="1544350195767834591">{NUM_COOKIES,plural, =1{1 z jiných webů}few{# z jiných webů}many{# z jiných webů}other{# z jiných webů}}</translation> <translation id="1545177026077493356">Automatický režim veřejného terminálu</translation> <translation id="1545786162090505744">URL se značkou %s místo dotazu</translation> <translation id="1546280085599573572">Toto rozšíření změnilo stránku, která se zobrazí po kliknutí na tlačítko Domovská stránka.</translation> @@ -448,7 +448,6 @@ <translation id="1559235587769913376">Zadat znaky Unicode</translation> <translation id="1561092721008294962">HarfBuzz pro text uživatelského rozhraní</translation> <translation id="1566049601598938765">Web</translation> -<translation id="1566958206723629112">Flash a PDF</translation> <translation id="1567723158593978621">Je-li tato zásada aktivována, přihlášení do prohlížeče bude používat nový, heslem oddělený proces přihlášení pomocí účtu GAIA.</translation> <translation id="1567993339577891801">Konzole JavaScriptu</translation> <translation id="1568323446248056064">Otevřít nastavení displeje</translation> @@ -577,7 +576,6 @@ <translation id="1723940674997333416">Povolit nezabezpečené připojení WebSocket z adresy se schématem https</translation> <translation id="1725149567830788547">Zobrazit &ovládací prvky</translation> <translation id="172612876728038702">Nastavování modulu TPM. Buďte prosím trpěliví, proces může trvat několik minut.</translation> -<translation id="1727135806684246609">Podrobné informace o zabezpečení vzhledu Material</translation> <translation id="1729533290416704613">Také řídí, která stránka se zobrazí, když budete vyhledávat v omniboxu.</translation> <translation id="1731346223650886555">Středník</translation> <translation id="1731589410171062430">Celkem: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /> (<ph name="NUMBER_OF_PAGES" /> <ph name="PAGE_OR_PAGES_LABEL" />)</translation> @@ -874,6 +872,7 @@ <translation id="218492098606937156">Aktivovat události dotyku</translation> <translation id="2187317261103489799">Rozpoznat (výchozí)</translation> <translation id="2187895286714876935">Chyba při importu certifikátu serveru</translation> +<translation id="2188881192257509750">Spustit aplikaci <ph name="APPLICATION" /></translation> <translation id="2190069059097339078">Nástroj na získávání identifikačních údajů sítí Wi-Fi</translation> <translation id="219008588003277019">Modul nativního klienta: <ph name="NEXE_NAME" /></translation> <translation id="2190355936436201913">(prázdné)</translation> @@ -991,6 +990,7 @@ <translation id="2326606747676847821">Anonymní režim</translation> <translation id="2326931316514688470">Znovu načíst &aplikaci</translation> <translation id="2327492829706409234">Aktivovat aplikaci</translation> +<translation id="2328054044222305089">Touto akcí vymažete veškerá data, která web <ph name="SITE" /> uložil do zařízení, a resetujete veškerá oprávnění, která jste mu udělili. Chcete pokračovat?</translation> <translation id="2329597144923131178">Přihlaste se a synchronizujte záložky, historii, hesla a další nastavení do všech svých zařízení.</translation> <translation id="2332131598580221120">Zobrazit v obchodu</translation> <translation id="2332742915001411729">Výchozí nastavení</translation> @@ -1266,7 +1266,6 @@ <translation id="2675358154061544447">Vysoce experimentální podpora vykreslování prvků iframe napříč weby v samostatných procesech. V tomto režimu budou dokumenty sdílet stejný proces modulu vykreslení jen v případě, že pocházejí ze stejné webové stránky.</translation> <translation id="2676946222714718093">Přehrávání v zařízení</translation> <translation id="2678063897982469759">Znovu aktivovat</translation> -<translation id="2678246812096664977">Všechny pluginy</translation> <translation id="2679385451463308372">Vytisknout prostřednictvím dialogového okna systému...</translation> <translation id="2680208403056680091">Vaše připojení k internetu je ovládáno</translation> <translation id="268053382412112343">&Historie</translation> @@ -1440,7 +1439,6 @@ <translation id="287286579981869940">Přidat <ph name="PROVIDER_NAME" />...</translation> <translation id="2872961005593481000">Vypnout</translation> <translation id="2875698561019555027">(Chybové stránky Chromu)</translation> -<translation id="2879560882721503072">Klientský certifikát od vydavatele <ph name="ISSUER" /> byl úspěšně uložen.</translation> <translation id="288024221176729610">čeština</translation> <translation id="288042212351694283">Přístup k zařízením s univerzálním druhým faktorem</translation> <translation id="2881966438216424900">Poslední přístup:</translation> @@ -1589,6 +1587,7 @@ <translation id="3057861065630527966">Zálohovat fotky a videa</translation> <translation id="3058212636943679650">K obnovení operačního systému počítače budete potřebovat kartu SD nebo paměťovou jednotku USB pro obnovení.</translation> <translation id="305932878998873762">Modul Simple Cache pro protokol HTTP je nová mezipaměť. Při alokaci místa na disku spoléhá na systém souborů.</translation> +<translation id="3060251871394327123">Touto akcí vymažete veškerá data, která web <ph name="SITE" /> uložil do zařízení. Chcete pokračovat?</translation> <translation id="3061650404498811439">Povolit přístup k emodži, psaní rukou a hlasovému zadávání z volitelné nabídky editorů IME.</translation> <translation id="3062606427884046423">Používat pro oznámení médií v Chromu oznámení ve stylu Android MediaStyle.</translation> <translation id="3063844757726132584">Všechny své aplikace můžete snadno otevřít pomocí tohoto šikovného spouštěče. Hrajte hry, videochatujte, poslouchejte hudbu, upravujte dokumenty nebo si stáhněte další aplikace.</translation> @@ -1638,6 +1637,7 @@ <translation id="3123569374670379335">(Dozorovaný)</translation> <translation id="3124111068741548686">Popisovače – UŽIVATEL</translation> <translation id="3126026824346185272">Ctrl</translation> +<translation id="3127156390846601284">Touto akcí vymažete všechna data uložená v zařízení pro všechny zobrazené weby. Chcete pokračovat?</translation> <translation id="312759608736432009">Výrobce zařízení:</translation> <translation id="3127919023693423797">Ověřování...</translation> <translation id="3128230619496333808">Karta 6</translation> @@ -1736,7 +1736,6 @@ <translation id="3264544094376351444">Bezpatkové písmo</translation> <translation id="3264547943200567728">Nastavení sítě v Chromeboxu se nezdařilo</translation> <translation id="3265459715026181080">Zavřít okno</translation> -<translation id="3267271790328635957">Pouze PDF</translation> <translation id="3267726687589094446">I nadále povolovat automatické stahování několika souborů</translation> <translation id="3267998849713137817">Čas změny</translation> <translation id="3268451620468152448">Otevřené karty</translation> @@ -1980,6 +1979,7 @@ <translation id="3574210789297084292">Přihlaste se</translation> <translation id="3574305903863751447"><ph name="CITY" />, <ph name="STATE" /> <ph name="COUNTRY" /></translation> <translation id="357479282490346887">litevština</translation> +<translation id="3575927481544652747">Deaktivovat pro WebMIDI rozhraní Windows Runtime MIDI API, které je v systému Windows 10 a novějších systémech ve výchozím nastavení aktivováno.</translation> <translation id="3576324189521867626">Úspěšně nainstalováno</translation> <translation id="3578331450833904042">Výchozí (zaznamenat vše)</translation> <translation id="3578594933904494462">Obsah této karty je sdílen.</translation> @@ -2033,8 +2033,6 @@ <translation id="3627320433825461852">Zbývá méně než minuta</translation> <translation id="3627588569887975815">Otevřít odkaz v &anonymním okně</translation> <translation id="3627671146180677314">Čas obnovení certifikátu Netscape</translation> -<translation id="3629326610814700057">Umožní správci úložiště spravovat místní úložiště.</translation> -<translation id="3630337581925712713"><ph name="PERMISSION_TYPE_LABEL" />:</translation> <translation id="3631337165634322335">Níže uvedené výjimky platí pouze pro aktuální anonymní relaci.</translation> <translation id="3633586230741134985">Nastavení spouštěče aplikací</translation> <translation id="3633997706330212530">Tyto služby můžete případně zakázat.</translation> @@ -2057,7 +2055,8 @@ <translation id="3654045516529121250">Čtení nastavení usnadnění přístupu</translation> <translation id="3654092442379740616">Chyba synchronizace: Prohlížeč <ph name="PRODUCT_NAME" /> je zastaralý a potřebuje aktualizovat.</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{Má trvalý přístup k jednomu souboru.}few{Má trvalý přístup ke # souborům.}many{Má trvalý přístup k # souboru.}other{Má trvalý přístup k # souborům.}}</translation> -<translation id="3657468915905674858">Aktivovat uzamknutí pluginů PPAPI podle zásady Win32k</translation> +<translation id="365793796291733849"><ph name="BEGIN_PARAGRAPH1" />Když zapnete automatické zálohování, budou data zařízení a aplikací pravidelně ukládána do soukromé složky na Disku Google. Data aplikací mohou být jakákoli data, která aplikace uložila (v závislosti na nastavení vývojáře), včetně potenciálně citlivých dat, jako jsou kontakty, zprávy a fotky.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Zálohovaná data se nezapočítávají do kvóty úložiště Disku. Velké soubory nebo soubory, které vývojáři ze služby vyloučili, zálohovány nebudou.<ph name="END_PARAGRAPH2" /></translation> <translation id="3660234220361471169">Nedůvěryhodný</translation> <translation id="3665589677786828986">Prohlížeč Chrome zjistil, že některá z vašich nastavení byla upravena jiným programem, a obnovil je na původní výchozí hodnoty.</translation> <translation id="3665842570601375360">Zabezpečení:</translation> @@ -2112,6 +2111,7 @@ <translation id="3733127536501031542">Server SSL s technologií Step-up</translation> <translation id="3736520371357197498">Pokud bezpečnostní rizika chápete, můžete <ph name="BEGIN_LINK" />tento nespolehlivý web navštívit<ph name="END_LINK" /> ještě před tím, než budou nebezpečné programy odstraněny.</translation> <translation id="3738924763801731196"><ph name="OID" />:</translation> +<translation id="3739254215541673094">Spustit aplikaci <ph name="APPLICATION" />?</translation> <translation id="3739798227959604811">Prodleva před opakováním:</translation> <translation id="3741158646617793859">Zařízení <ph name="DEVICE_NAME" /> se nyní bude zobrazovat v administrátorské konzoli</translation> <translation id="3741243925913727067">Zálohujte fotky a videa ze svého mediálního zařízení na Disk Google.</translation> @@ -2349,7 +2349,6 @@ <translation id="4058793769387728514">Zkontrolovat dokument</translation> <translation id="4059285154003114015">Vy&tisknout rám...</translation> <translation id="406070391919917862">Aplikace na pozadí</translation> -<translation id="4061502419206152498">Zobrazit pouze nezabezpečené, neanimované</translation> <translation id="4062251648694601778">Užijte si své zařízení <ph name="SHORT_PRODUCT_NAME" />. Máte nějaké dotazy? Kdykoliv můžete zobrazit nápovědu kliknutím na tlačítko „?“ na stavovém panelu.</translation> <translation id="4065876735068446555">Síť, kterou používáte (<ph name="NETWORK_ID" />), může vyžadovat, abyste navštívili její přihlašovací stránku.</translation> <translation id="4068506536726151626">Tato stránka obsahuje prvky z následujících webů, které sledují vaši polohu:</translation> @@ -2388,7 +2387,6 @@ <translation id="4101878899871018532">Správce hesel nebude nabízet uložení identifikačních údajů používaných k synchronizaci.</translation> <translation id="410351446219883937">Automatické přehrávání</translation> <translation id="4104163789986725820">E&xport...</translation> -<translation id="4105523032910086267">Nastavuje animaci a viditelnost podrobných informací o zabezpečení ve vzhledu Material Design.</translation> <translation id="4105563239298244027">Získejte 1 TB volného úložiště na Disku Google zdarma</translation> <translation id="4109135793348361820">Přesunout okno k uživateli <ph name="USER_NAME" /> (<ph name="USER_EMAIL" />)</translation> <translation id="4110342520124362335">Soubory cookie z webu <ph name="DOMAIN" /> byly zablokovány.</translation> @@ -2439,6 +2437,7 @@ <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="4188447344915957833">Aktivuje nastavení správce úložiště se vzhledem Material Design.</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> <translation id="4193182321948161343">Povolit správce uživatelů se vzhledem Material Design</translation> @@ -2646,6 +2645,7 @@ <translation id="4508765956121923607">Z&obrazit zdrojový kód</translation> <translation id="4509017836361568632">Smazat fotku</translation> <translation id="4509345063551561634">Umístění:</translation> +<translation id="4513946894732546136">Zpětná vazba</translation> <translation id="4514542542275172126">Nastavení nového dozorovaného uživatele</translation> <translation id="4514914692061505365">Vynutit použití rychlého překladače Subzero klienta PNaCl pro všechny soubory pexe.</translation> <translation id="451515744433878153">Odstranit</translation> @@ -2744,6 +2744,7 @@ <translation id="4656293982926141856">Tento počítač</translation> <translation id="4656631038341342120">Aktivuje prostředí virtuální reality (pokud je pro toto zařízení k dispozici).</translation> <translation id="4657031070957997341">Vždy povolovat pluginy na webu <ph name="HOST" /></translation> +<translation id="466008749075469935">Povolí intervenci, která zajistí, aby časovače na pozadí nevyužívaly více než 1 % kapacity procesoru.</translation> <translation id="4663254525753315077">Pokud je to možné, bude posunovatelný obsah prvku umístěn do překryvné vrstvy, aby bylo posouvání rychlejší.</translation> <translation id="4664482161435122549">Chyba exportu souboru PKCS #12</translation> <translation id="4665014895760275686">Výrobce</translation> @@ -2811,6 +2812,7 @@ <translation id="4749157430980974800">Gruzínská klávesnice</translation> <translation id="4750394297954878236">Návrhy</translation> <translation id="475088594373173692">První uživatel</translation> +<translation id="4750892496809949692">Preferovat obsah HTML tím, že v seznamu pluginů bude skryt Flash.</translation> <translation id="4750917950439032686">Vaše údaje (například hesla nebo čísla platebních karet) jsou při odesílání na tento web soukromé.</translation> <translation id="4753602155423695878">Animace ukazatele postupu načítání stránky v telefonu Android</translation> <translation id="4755240240651974342">Finská klávesnice</translation> @@ -3085,6 +3087,7 @@ <translation id="5119450342834678097">Možnost vyžádání stránek pro tablety v nabídce nastavení</translation> <translation id="5120068803556741301">Metoda zadávání třetí strany</translation> <translation id="5120421890733714118">Důvěřovat tomuto certifikátu k identifikaci webových stránek.</translation> +<translation id="5120516977819314347">Zadali jste nesprávný PIN nebo heslo.</translation> <translation id="5121130586824819730">Pevný disk je plný. Uložte prosím soubor do jiného umístění nebo uvolněte místo na disku.</translation> <translation id="5125751979347152379">Neplatná adresa URL.</translation> <translation id="5127881134400491887">Správa síťových připojení</translation> @@ -3092,6 +3095,7 @@ <translation id="512903556749061217">připojeno</translation> <translation id="5129301143853688736">Připojení k tomuto webu není soukromé. Útočníci se mohou pokusit ukrást vaše údaje na webu <ph name="DOMAIN" /> (například fotky, hesla, zprávy nebo informace o platebních kartách).</translation> <translation id="5129662217315786329">polština</translation> +<translation id="5131347545782851480">Dokumenty PDF</translation> <translation id="5134856901811723984">Material Design v uživatelském rozhraní systému Chrome OS</translation> <translation id="5135533361271311778">Záložku nelze vytvořit.</translation> <translation id="5136529877787728692">F7</translation> @@ -3257,6 +3261,7 @@ <translation id="5328031682234198929">8</translation> <translation id="5329858601952122676">&Smazat</translation> <translation id="5330145655348521461">Tyto soubory jsou otevřeny na jiné ploše. Chcete-li je zobrazit, přejděte do profilu <ph name="USER_NAME" /> (<ph name="MAIL_ADDRESS" />).</translation> +<translation id="5330512191124428349">Zobrazit informace</translation> <translation id="5332624210073556029">Časové pásmo:</translation> <translation id="5333807720589685258">Pokud správně nezadáte klíč k odemknutí kódu PIN, bude SIM karta natrvalo deaktivována.</translation> <translation id="5333958554630697967">Experimentální funkce Web Platform, které jsou ve vývoji.</translation> @@ -3688,7 +3693,6 @@ <translation id="5892507820957994680">Přepíše seznam softwarového vykreslování a zapne urychlení pomocí grafické karty v systémech s nepodporovanými konfiguracemi.</translation> <translation id="5895138241574237353">Restartovat</translation> <translation id="5895187275912066135">Datum vydání</translation> -<translation id="5898154795085152510">Server vrátil neplatný klientský certifikát. Chyba <ph name="ERROR_NUMBER" /> (<ph name="ERROR_NAME" />).</translation> <translation id="5900302528761731119">Profilová fotka Google</translation> <translation id="590253956165195626">Nabízet překlad stránek v jazycích, kterým byste nemuseli rozumět.</translation> <translation id="5904093760909470684">Nastavení proxy serveru</translation> @@ -3743,6 +3747,8 @@ <translation id="5984222099446776634">Nedávno navštívené</translation> <translation id="5984814259619230127">Vyhledávání zařízení pomocí rozhraní Bluetooth Low Energy pro Smart Lock</translation> <translation id="5986245990306121338">Je-li tento příznak aktivován, zobrazí se přepínač karet i v případě, že v nastavení bude zapnuta možnost Sloučit karty a aplikace.</translation> +<translation id="5989712527536636369"><ph name="BEGIN_PARAGRAPH1" />Jedná se o obecné údaje o zařízení a způsobu jeho využívání, jako jsou úroveň nabití baterie, četnost používání aplikací, kvalita a trvání síťových připojení (jako Wi-Fi a Bluetooth) a zprávy o selhání, když se něco pokazí. Tato data využijeme ke zlepšování aplikací a služeb Google pro všechny. Některé souhrnné informace pomohou ve zlepšování aplikací a služeb také našim partnerům, například vývojářům aplikací pro Android.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Tuto možnost můžete kdykoli zapnout nebo vypnout v nastavení aplikací pro Android. Nemá to vliv na schopnost zařízení odesílat informace, které potřebuje pro základní služby, jako jsou aktualizace systému a zabezpečení.<ph name="END_PARAGRAPH2" /></translation> <translation id="5990198433782424697">Rozšíření na adresách URL typu chrome://</translation> <translation id="5990814808592353318">Ruční generování hesla</translation> <translation id="5991049340509704927">Zvětšit</translation> @@ -3756,6 +3762,7 @@ <translation id="6005695835120147974">Směrovač médií</translation> <translation id="6007237601604674381">Přesun se nezdařil. <ph name="ERROR_MESSAGE" /></translation> <translation id="6008241731410823808">Odesílá pingy auditování hypertextových odkazů.</translation> +<translation id="6011449291337289699">Vymazání dat webu</translation> <translation id="6015796118275082299">Rok</translation> <translation id="6016551720757758985">Potvrďte obnovení pomocí funkce Powerwash a návrat k předchozí verzi aplikace</translation> <translation id="6016809788585079594">Ještě jednou a naposledy řekněte „Ok Google“</translation> @@ -3945,7 +3952,6 @@ <translation id="6276301056778294989">Zkontrolujte, zda se na zařízení zobrazuje stejný kód.</translation> <translation id="6277105963844135994">Vypršel časový limit sítě</translation> <translation id="6277518330158259200">&Pořídit snímek obrazovky</translation> -<translation id="6278428485366576908">Motiv</translation> <translation id="6279183038361895380">Kurzor zobrazíte stisknutím klávesy |<ph name="ACCELERATOR" />|</translation> <translation id="6280215091796946657">Přihlásit se pomocí jiného účtu</translation> <translation id="6280912520669706465">ARC</translation> @@ -4197,6 +4203,7 @@ <translation id="6607272825297743757">Informace o souboru</translation> <translation id="6607831829715835317">Další nástro&je</translation> <translation id="6608140561353073361">Všechny soubory cookie a data webu...</translation> +<translation id="6610183966322615106">Při přidávání tiskárny došlo k chybě</translation> <translation id="6610610633807698299">Zadat adresu URL...</translation> <translation id="6612358246767739896">Chráněný obsah</translation> <translation id="6615455863669487791">Ukázat</translation> @@ -4260,7 +4267,6 @@ <translation id="6708242697268981054">Původ:</translation> <translation id="6709357832553498500">Připojit pomocí rozšíření <ph name="EXTENSIONNAME" /></translation> <translation id="6710213216561001401">Předchozí</translation> -<translation id="6712158998835983046">Zobrazit vše, animované</translation> <translation id="6718273304615422081">Komprimování...</translation> <translation id="671928215901716392">Zamknout obrazovku</translation> <translation id="6721972322305477112">&Soubor</translation> @@ -4532,7 +4538,6 @@ <translation id="7088434364990739311">Kontrolu aktualizace se nepodařilo spustit (kód chyby <ph name="ERROR" />).</translation> <translation id="708856090370082727">Aktivuje podporu posouvání softwarové klávesnice. Pokud je tato možnost zapnuta, softwarová klávesnice změní pouze velikost vizuálního viewportu.</translation> <translation id="7088674813905715446">Zařízení bylo vyřazeno administrátorem. Chcete-li zařízení zaregistrovat, požádejte administrátora, aby jeho registraci umožnil.</translation> -<translation id="7089609847854449639">Správce úložiště</translation> <translation id="708969677220991657">Povoluje požadavky na hostitele localhost prostřednictvím protokolu HTTPS i v případě, že je poskytnut neplatný certifikát.</translation> <translation id="7092106376816104">Výjimky vyskakovacích oken</translation> <translation id="7093866338626856921">Výměna dat s následujícími zařízeními: <ph name="HOSTNAMES" /></translation> @@ -4572,7 +4577,7 @@ <translation id="715118844758971915">Klasické tiskárny</translation> <translation id="7154130902455071009">Změnit úvodní stránku na: <ph name="START_PAGE" /></translation> <translation id="7155171745945906037">Stávající fotka z fotoaparátu nebo souboru</translation> -<translation id="715568033737470079">Určuje pluginy PPAPI, které budou spuštěny v rámci zásady uzamknutí izolovaného prostoru Win32k (pouze systém Windows 10 nebo novější).</translation> +<translation id="7155226869555939647">Odkazy pro aplikaci <ph name="APPLICATION" /> vždy otevírat</translation> <translation id="7156235233373189579">Tento soubor je určen pro počítač se softwarem Windows. Není kompatibilní s vaším zařízením se systémem Chrome OS. Vyhledejte v <ph name="BEGIN_LINK" />Internetovém obchodě Chrome<ph name="END_LINK" /> vhodnou náhradní aplikaci. <ph name="BEGIN_LINK_HELP" />Další informace<ph name="END_LINK_HELP" /></translation> <translation id="7157063064925785854">Kliknutím na Pokračovat potvrzujete, že souhlasíte s následujícími dokumenty: <ph name="LEGAL_DOC_LINK_TEXT_1" />, <ph name="LEGAL_DOC_LINK_TEXT_2" />, <ph name="LEGAL_DOC_LINK_TEXT_3" /> a <ph name="LEGAL_DOC_LINK_TEXT_4" />.</translation> <translation id="7158238151765743968">Stále probíhá připojení k zařízení <ph name="DEVICE_NAME" />.</translation> @@ -4587,6 +4592,7 @@ <translation id="7175353351958621980">Načteno z:</translation> <translation id="7180611975245234373">Obnovit</translation> <translation id="7180865173735832675">Personalizovat</translation> +<translation id="7181387261278441780">Vymazání a resetování webu</translation> <translation id="7185078796915954712">TLS 1.3</translation> <translation id="7185690883425432021">Skryje tlačítka k zavření neaktivních karet, když je lišta karet v režimu shromáždění nad sebou.</translation> <translation id="7186088072322679094">Ponechat na liště</translation> @@ -4619,7 +4625,6 @@ <translation id="7223775956298141902">Hrůza... Nemáte žádná rozšíření :-(</translation> <translation id="7224023051066864079">Maska podsítě:</translation> <translation id="7225179976675429563">Typ sítě není k dispozici.</translation> -<translation id="7230191962699768124">Zobrazit vše, neanimované</translation> <translation id="7230787553283372882">Přizpůsobení velikosti textu</translation> <translation id="7231224339346098802">Počet kopií, které chcete vytisknout, je třeba zadat číslovkou (1 nebo vyšší).</translation> <translation id="7238585580608191973">Digitální otisk SHA-256</translation> @@ -4749,7 +4754,6 @@ <translation id="7409233648990234464">Znovu spustit a použít funkci Powerwash</translation> <translation id="7409836189476010449">Spustit Flash</translation> <translation id="7410344089573941623">Zobrazit dotaz, pokud bude chtít web <ph name="HOST" /> používat webovou kameru a mikrofon</translation> -<translation id="7411343637221933631">{NUM_COOKIES,plural, =1{1 z tohoto webu}few{# z tohoto webu}many{# z tohoto webu}other{# z tohoto webu}}</translation> <translation id="7412226954991670867">Paměť GPU</translation> <translation id="7416362041876611053">Neznámá chyba sítě.</translation> <translation id="7417453074306512035">Etiopská klávesnice</translation> @@ -4869,6 +4873,7 @@ <translation id="756445078718366910">Otevřít okno prohlížeče</translation> <translation id="7564847347806291057">Ukončit proces</translation> <translation id="7566723889363720618">F12</translation> +<translation id="7567314848159753396">Cookie: <ph name="NAME" /></translation> <translation id="756809126120519699">Vymazání údajů Chromu</translation> <translation id="7568790562536448087">Aktualizace</translation> <translation id="7573172247376861652">Nabití baterie</translation> @@ -4909,6 +4914,7 @@ <translation id="7626009897377900107">Generování hesla</translation> <translation id="7627262197844840899">Tento web nepřijímá karty MasterCard.</translation> <translation id="7627790789328695202">Jejda, soubor <ph name="FILE_NAME" /> již existuje. Přejmenujte jej a zkuste to znovu.</translation> +<translation id="7628127343934101653">Otevírat soubory PDF ve výchozí aplikaci na prohlížení souborů PDF.</translation> <translation id="762917759028004464">Výchozím prohlížečem je v tuto chvíli <ph name="BROWSER_NAME" />.</translation> <translation id="7629536005696009600">Povolit vyplnění identifikačních údajů uložených pro aplikace Android na odpovídajících webových stránkách.</translation> <translation id="7629827748548208700">Karta: <ph name="TAB_NAME" /></translation> @@ -5137,6 +5143,7 @@ <translation id="7957513156576779045">Chcete-li povolit párování, zapněte Bluetooth</translation> <translation id="7957615753207896812">Otevřít nastavení klávesnice</translation> <translation id="7959074893852789871">Soubor obsahoval více certifikátů, z nichž některé nebyly importovány:</translation> +<translation id="7959700692661109221"><ph name="BEGIN_PARAGRAPH" />Služby určování polohy Google k rychlejšímu a přesnějšímu odhadu polohy zařízení využívají zdroje, jako jsou sítě Wi-Fi. Když zapnete služby určování polohy Google, zařízení přejde do režimu, ve kterém se sítě Wi-Fi využívají k poskytování údajů o poloze. Tuto funkci můžete v nastavení polohy kdykoliv vypnout.<ph name="END_PARAGRAPH" /></translation> <translation id="7961015016161918242">Nikdy</translation> <translation id="7964089325405904043">Import a export hesel</translation> <translation id="7965010376480416255">Sdílená paměť</translation> @@ -5287,6 +5294,7 @@ <translation id="8146793085009540321">Přihlášení se nezdařilo. Kontaktujte administrátora nebo to zkuste znovu.</translation> <translation id="8148264977957212129">Metoda zadávání textu Pinyin</translation> <translation id="8148913456785123871">Zobrazovat ve spouštěči Chytré karty Google</translation> +<translation id="8150391391298684512">Zakázat Windows Runtime MIDI API</translation> <translation id="8151185429379586178">Nástroje pro vývojáře</translation> <translation id="8151638057146502721">Konfigurovat</translation> <translation id="8151639108075998630">Povolit prohlížení jako host</translation> @@ -5569,6 +5577,7 @@ <translation id="8532294913309524834">Další jazyky podle vašich požadavků</translation> <translation id="8535005006684281994">Adresa URL pro obnovu certifikátu Netscape</translation> <translation id="8539727552378197395">Ne (HttpOnly)</translation> +<translation id="8541084862688000575">Automaticky načítat aplikace Android</translation> <translation id="8543181531796978784">Můžete <ph name="BEGIN_ERROR_LINK" />nahlásit problém se zjištěným webem<ph name="END_ERROR_LINK" />. Pokud bezpečnostní rizika chápete, můžete <ph name="BEGIN_LINK" />tento nespolehlivý web navštívit<ph name="END_LINK" />.</translation> <translation id="8545107379349809705">Skrýt informace...</translation> <translation id="8545211332741562162">Povolí webovým stránkám používat experimentální funkce jazyka JavaScript</translation> @@ -5596,7 +5605,6 @@ <translation id="8569764466147087991">Vyberte soubor, který chcete otevřít</translation> <translation id="8571032220281885258">Když řeknete „Ok Google,“ Chrome vyhledá výraz, který vyslovíte následně.</translation> <translation id="8571108619753148184">Server 4</translation> -<translation id="8572832761467613633">Pouze Flash</translation> <translation id="8572981282494768930">Nedovolit webům používat vaši kameru a mikrofon</translation> <translation id="8574234089711453001">Povolit zobrazení tlačítka ke stažení při otevření stránky s adresou URL média.</translation> <translation id="857779305329188634">Aktivuje podporu experimentálního protokolu QUIC.</translation> @@ -5618,6 +5626,7 @@ <translation id="8600929685092827187">Probudit se při přijetí paketů</translation> <translation id="8601206103050338563">Ověření TLS webového klienta</translation> <translation id="8602851771975208551">Jiný program ve vašem počítači nainstaloval aplikaci, která může měnit funkce Chromu.</translation> +<translation id="8603912787021349466">Povolit automatické spuštění aplikací Android po přihlášení.</translation> <translation id="8605428685123651449">Paměť SQLite</translation> <translation id="8605503133013456784">Nepodařilo se zrušit připojení a párování se zařízením <ph name="DEVICE_NAME" />.</translation> <translation id="8606726445206553943">Používat vaše zařízení MIDI</translation> @@ -5970,6 +5979,7 @@ <translation id="9053965862400494292">Při nastavování synchronizace došlo k chybě.</translation> <translation id="9056034633062863292">Aktualizace zařízení Chromebox</translation> <translation id="9056810968620647706">Nebyly nalezeny žádné shody.</translation> +<translation id="9057119625587205566">V okolí nebyly nalezeny žádné tiskárny</translation> <translation id="9059868303873565140">Stavová nabídka</translation> <translation id="9064142312330104323">Profilová fotografie Google (načítá se)</translation> <translation id="9064275926664971810">Aktivujte automatické vyplňování a vyplňujte webové formuláře jedním kliknutím.</translation> @@ -5980,6 +5990,7 @@ <translation id="9067401056540256169">Při použití tohoto příznaku Chrome není bezpečný. Použijte jej pouze v případě, že rozumíte tomu, co dělá. Upozorňujeme, že tento příznak může být bez ohlášení odebrán. Pokud je tento příznak aktivován, rámce s adresou se schématem https mohou používat připojení WebSocket s nezabezpečenými adresami URL (ws://).</translation> <translation id="9068931793451030927">Cesta:</translation> <translation id="9070219033670098627">Přepnout uživatele</translation> +<translation id="9070940116164932228">Omezovat náročné časovače na pozadí</translation> <translation id="907148966137935206">Nepovolovat žádnému webu zobrazovat vyskakovací okna (doporučeno)</translation> <translation id="9072550133391925347"><ph name="PASSWORD_MANAGER_BRAND" /> vás automaticky přihlásí na vhodných webech a v aplikacích, ke kterým máte uložená hesla.</translation> <translation id="9073281213608662541">PAP</translation> @@ -6014,6 +6025,7 @@ <translation id="9112614144067920641">Vyberte prosím nový kód PIN.</translation> <translation id="9112748030372401671">Změňte tapetu</translation> <translation id="9112987648460918699">Najít...</translation> +<translation id="9114663181201435112">Snadné přihlášení</translation> <translation id="9115487443206954631">Spravovat zařízení Cast</translation> <translation id="9115675100829699941">&Záložky</translation> <translation id="9121814364785106365">Otevřít jako připnutou kartu</translation> @@ -6108,7 +6120,6 @@ <translation id="952992212772159698">Není aktivováno</translation> <translation id="960719561871045870">Kód operátora</translation> <translation id="960987915827980018">Zbývá přibližně hodina</translation> -<translation id="962778376131245616">Zobrazit pouze nezabezpečené, animované</translation> <translation id="96421021576709873">Síť Wi-Fi</translation> <translation id="965490406356730238">Umožňuje aktivovat hardwarově akcelerované dekódování souborů mjpeg pro zachycené rámce, jsou-li k dispozici.</translation> <translation id="968174221497644223">Mezipaměť aplikace</translation>
diff --git a/chrome/app/resources/generated_resources_da.xtb b/chrome/app/resources/generated_resources_da.xtb index 691c985..d4f81d1f 100644 --- a/chrome/app/resources/generated_resources_da.xtb +++ b/chrome/app/resources/generated_resources_da.xtb
@@ -18,7 +18,6 @@ <translation id="1029317248976101138">Zoom</translation> <translation id="1029595648591494741">Vil du prøve "<ph name="EXTENSION_NAME" />"?</translation> <translation id="1031362278801463162">Indlæser eksempel</translation> -<translation id="1031460590482534116">Der opstod en fejl under forsøg på at gemme klientcertifikatet. Fejl <ph name="ERROR_NUMBER" /> (<ph name="ERROR_NAME" />).</translation> <translation id="1031573127485938293">Spørg (i henhold til politik)</translation> <translation id="103279545524624934">Frigør diskplads for at starte Android-apps.</translation> <translation id="1033780634303702874">Få adgang til dine serieenheder</translation> @@ -101,6 +100,7 @@ <translation id="1128591060186966949">Rediger søgemaskine</translation> <translation id="1128987120443782698">Lagringsenheden har en kapacitet på <ph name="DEVICE_CAPACITY" />. Indsæt et SD-kort eller en USB-nøgle med en kapacitet på mindst 4 GB.</translation> <translation id="1137135726305341424">domContentLoaded og alle ressourcer, der blev hentet, begyndte før domContentLoaded (hovedframe og samme originale iframes).</translation> +<translation id="1138663153846032155">Foretræk HTML frem for Flash</translation> <translation id="1140351953533677694">Få adgang til dine Bluetooth- og serieenheder</translation> <translation id="114140604515785785">Udvidelsens rodmappe:</translation> <translation id="1143142264369994168">Certifikatunderskriver</translation> @@ -252,6 +252,7 @@ <translation id="1351692861129622852">Importerer <ph name="FILE_COUNT" /> filer...</translation> <translation id="1352103415082130575">Thailandsk tastatur (Pattachote)</translation> <translation id="1353686479385938207"><ph name="PROVIDER_NAME" />: <ph name="NETWORK_NAME" /></translation> +<translation id="1353946958707294039">Lageradministrator for material design</translation> <translation id="1353966721814789986">Startsider</translation> <translation id="1354868058853714482">Adobe Reader er forældet og er muligvis ikke sikkert.</translation> <translation id="1355408554203439639">3D-softwarerasterisering</translation> @@ -423,7 +424,6 @@ <translation id="1533920822694388968">Tv-tilpasning</translation> <translation id="15373452373711364">Stor musemarkør</translation> <translation id="1543284117603151572">Importeret fra Edge</translation> -<translation id="1544350195767834591">{NUM_COOKIES,plural, =1{1 fra andre websites}one{# fra andre websites}other{# fra andre websites}}</translation> <translation id="1545177026077493356">Automatisk terminaltilstand</translation> <translation id="1545786162090505744">URL med %s i stedet for forespørgsel</translation> <translation id="1546280085599573572">Denne udvidelse har ændret, hvilken side der vises, når du klikker på knappen Startside.</translation> @@ -447,7 +447,6 @@ <translation id="1559235587769913376">Input af Unicode-tegn</translation> <translation id="1561092721008294962">HarfBuzz til grænsefladetekst</translation> <translation id="1566049601598938765">Website</translation> -<translation id="1566958206723629112">Flash og PDF</translation> <translation id="1567723158593978621">Når denne indstilling er aktiveret, anvendes der et nyt adgangskodesepareret loginflow til GAIA, når der logges ind på browseren.</translation> <translation id="1567993339577891801">JavaScript-konsol</translation> <translation id="1568323446248056064">Åbn enhedens skærmindstillinger</translation> @@ -573,7 +572,6 @@ <translation id="1723940674997333416">Tillad usikker WebSocket fra oprindelig https</translation> <translation id="1725149567830788547">Vis &kontroller</translation> <translation id="172612876728038702">TPM konfigureres. Vær tålmodig, det kan tage et par minutter.</translation> -<translation id="1727135806684246609">Sikkerhedsoplysninger for Material</translation> <translation id="1729533290416704613">Den styrer også, hvilken side der vises, når du søger via omnifeltet.</translation> <translation id="1731346223650886555">Semikolon</translation> <translation id="1731589410171062430">I alt: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /> (<ph name="NUMBER_OF_PAGES" /> <ph name="PAGE_OR_PAGES_LABEL" />)</translation> @@ -869,6 +867,7 @@ <translation id="218492098606937156">Aktivér berøringshændelser</translation> <translation id="2187317261103489799">Registrer (standardindstilling)</translation> <translation id="2187895286714876935">Fejl ved import af servercertifikat</translation> +<translation id="2188881192257509750">Åbn <ph name="APPLICATION" /></translation> <translation id="2190069059097339078">Hentning af Wi-Fi-loginoplysninger</translation> <translation id="219008588003277019">Native Client-modul: <ph name="NEXE_NAME" /></translation> <translation id="2190355936436201913">(tom)</translation> @@ -987,6 +986,7 @@ <translation id="2326606747676847821">Vær inkognito</translation> <translation id="2326931316514688470">&Genindlæs app</translation> <translation id="2327492829706409234">Aktivér app</translation> +<translation id="2328054044222305089">Dette sletter data, som <ph name="SITE" /> har gemt på din enhed, og nulstiller tilladelser, du har givet, til kørsel. Vil du fortsætte?</translation> <translation id="2329597144923131178">Log ind for at hente bogmærker, historik, adgangskoder og andre indstillinger på alle dine enheder.</translation> <translation id="2332131598580221120">Vis i Webshop</translation> <translation id="2332742915001411729">Nulstil til standard</translation> @@ -1263,7 +1263,6 @@ <translation id="2675358154061544447">Meget eksperimentel understøttelse af gengivelse af iframes på flere websites i særskilte processer. Dokumenter deler i denne tilstand kun gengivelsesprocessen, hvis de er fra samme website.</translation> <translation id="2676946222714718093">Afspilles i</translation> <translation id="2678063897982469759">Genaktiver</translation> -<translation id="2678246812096664977">Alle plugins</translation> <translation id="2679385451463308372">Dialogboks til Udskriv via system...</translation> <translation id="2680208403056680091">Din internetforbindelse bliver kontrolleret</translation> <translation id="268053382412112343">Over&sigt</translation> @@ -1437,7 +1436,6 @@ <translation id="287286579981869940">Tilføj <ph name="PROVIDER_NAME" />...</translation> <translation id="2872961005593481000">Sluk</translation> <translation id="2875698561019555027">(Chrome-fejlsider)</translation> -<translation id="2879560882721503072">Klientcertifikat udstedt af <ph name="ISSUER" /> blev gemt.</translation> <translation id="288024221176729610">Tjekkisk</translation> <translation id="288042212351694283">Får adgang til dine Universal 2nd Factor-enheder</translation> <translation id="2881966438216424900">Sidst åbnet:</translation> @@ -1588,6 +1586,7 @@ <translation id="3057861065630527966">Sikkerhedskopiér dine billeder og videoer</translation> <translation id="3058212636943679650">Hvis du skulle få brug for at genoprette din computers operativsystem, skal du bruge et SD-kort til genoprettelse eller en USB-nøgle.</translation> <translation id="305932878998873762">Simple Cache til HTTP er en ny cache. Den kræver tildeling af diskplads af filsystemet.</translation> +<translation id="3060251871394327123">Dette sletter data, som <ph name="SITE" /> har gemt på din enhed. Vil du fortsætte?</translation> <translation id="3061650404498811439">Aktivér adgang til emoji, håndskrift og taleinput fra IME-tilvalgsmenuen.</translation> <translation id="3062606427884046423">Brug underretninger om Android MediaStyle til Chrome-medieunderretninger.</translation> <translation id="3063844757726132584">Få adgang til alle dine apps via denne smarte appliste. Du kan spille spil, videochatte, lytte til musik, redigere dokumenter eller hente flere apps.</translation> @@ -1637,6 +1636,7 @@ <translation id="3123569374670379335">(Administreret)</translation> <translation id="3124111068741548686">BRUGER-håndtag</translation> <translation id="3126026824346185272">Ctrl</translation> +<translation id="3127156390846601284">Dette sletter data, der er gemt på din enhed, for alle de viste websites. Vil du fortsætte?</translation> <translation id="312759608736432009">Enhedsproducent:</translation> <translation id="3127919023693423797">Godkender...</translation> <translation id="3128230619496333808">Fane 6</translation> @@ -1735,7 +1735,6 @@ <translation id="3264544094376351444">Sans-serif-skrifttype</translation> <translation id="3264547943200567728">Netværket for din Chromebox kunne ikke konfigureres</translation> <translation id="3265459715026181080">Luk vindue</translation> -<translation id="3267271790328635957">Kun PDF</translation> <translation id="3267726687589094446">Fortsæt med at tillade automatiske downloads af flere filer</translation> <translation id="3267998849713137817">Ændringstidspunkt</translation> <translation id="3268451620468152448">Åbne faner</translation> @@ -1981,6 +1980,7 @@ <translation id="3574210789297084292">log ind</translation> <translation id="3574305903863751447"><ph name="CITY" />, <ph name="STATE" /> <ph name="COUNTRY" /></translation> <translation id="357479282490346887">Litauisk</translation> +<translation id="3575927481544652747">Deaktiver Windows Runtime MIDI API til WebMIDI, der som standard er aktiveret i Windows 10 eller nyere.</translation> <translation id="3576324189521867626">Appen blev installeret</translation> <translation id="3578331450833904042">Standard (opfanger alt)</translation> <translation id="3578594933904494462">Indholdet på denne fane deles.</translation> @@ -2034,8 +2034,6 @@ <translation id="3627320433825461852">Mindre end ét minut tilbage</translation> <translation id="3627588569887975815">Åbn link i inkognitovindue</translation> <translation id="3627671146180677314">Tidspunkt for fornyelse af Netscape-certifikat</translation> -<translation id="3629326610814700057">Aktiverer lageradministrator til administration af lokal lagerplads.</translation> -<translation id="3630337581925712713"><ph name="PERMISSION_TYPE_LABEL" />:</translation> <translation id="3631337165634322335">Undtagelserne nedenfor gælder kun for den aktuelle inkognitosession.</translation> <translation id="3633586230741134985">Indstillinger for applikationsliste</translation> <translation id="3633997706330212530">Du kan vælge at deaktivere disse tjenester.</translation> @@ -2058,7 +2056,8 @@ <translation id="3654045516529121250">Læse dine indstillinger for hjælpefunktioner</translation> <translation id="3654092442379740616">Synkroniseringsfejl: <ph name="PRODUCT_NAME" /> er forældet og skal opdateres.</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{Den har permanent adgang til én fil.}one{Den har permanent adgang til # filer.}other{Den har permanent adgang til # filer.}}</translation> -<translation id="3657468915905674858">Aktivér PPAPI-Win32k-lukning.</translation> +<translation id="365793796291733849"><ph name="BEGIN_PARAGRAPH1" />Når du slår automatisk sikkerhedskopiering til, gemmes enheds- og appdata med jævne mellemrum i en privat mappe i Google Drev. Appdata kan være alle slags data, som en app har gemt (baseret på udviklerindstillinger), herunder potentielt følsomme data, som f.eks. kontaktpersoner, meddelelser og billeder.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Sikkerhedskopierede data tæller ikke med i din kvote for Drev-lagerplads. Store filer eller filer, som udviklerne har valgt at udelukke fra tjenesten, sikkerhedskopieres ikke.<ph name="END_PARAGRAPH2" /></translation> <translation id="3660234220361471169">Ikke pålidelig</translation> <translation id="3665589677786828986">Chrome har registreret, at nogle af dine indstillinger er blevet ændret af et andet program, og har derfor gendannet standardindstillingerne.</translation> <translation id="3665842570601375360">Sikkerhed:</translation> @@ -2069,7 +2068,7 @@ <translation id="367645871420407123">lad feltet være tomt, hvis du vil angive adgangskoderoden til standardværdien for testbilledet</translation> <translation id="3678156199662914018">Udvidelse: <ph name="EXTENSION_NAME" /></translation> <translation id="3678559383040232393">Maltesisk tastatur</translation> -<translation id="3680971994624836905">Konfiguration af cloudprintere</translation> +<translation id="3680971994624836905">Konfigurer cloudprintere</translation> <translation id="3681311097828166361">Tak for din feedback. Du er offline nu, og din rapport sendes senere.</translation> <translation id="3683524264665795342"><ph name="APP_NAME" /> anmoder om at dele din skærm</translation> <translation id="3685122418104378273">Synkronisering af Google Drev er som standard deaktiveret, når du bruger mobildata.</translation> @@ -2113,6 +2112,7 @@ <translation id="3733127536501031542">SSL-server med optrapning</translation> <translation id="3736520371357197498">Hvis du forstår den sikkerhedsrisiko, du udsætter dig for, kan du <ph name="BEGIN_LINK" />gå til dette usikre website<ph name="END_LINK" />, inden de farlige programmer er fjernet.</translation> <translation id="3738924763801731196"><ph name="OID" />:</translation> +<translation id="3739254215541673094">Vil du åbne <ph name="APPLICATION" />?</translation> <translation id="3739798227959604811">Forsinkelse før gentagelse:</translation> <translation id="3741158646617793859"><ph name="DEVICE_NAME" /> vises nu i administrationskonsollen</translation> <translation id="3741243925913727067">Sikkerhedskopiér billeder og videoer på din medieenhed til Google Drev.</translation> @@ -2351,7 +2351,6 @@ <translation id="4058793769387728514">Kontroller dokument nu</translation> <translation id="4059285154003114015">&Udskriv ramme...</translation> <translation id="406070391919917862">Apps i baggrunden</translation> -<translation id="4061502419206152498">Vis kun usikre, ikke-animerede</translation> <translation id="4062251648694601778">God fornøjelse med din <ph name="SHORT_PRODUCT_NAME" />-enhed. Hvis du har spørgsmål, kan du altid få hjælp ved at klikke på "?" i statusbakken.</translation> <translation id="4065876735068446555">Det netværk, du bruger (<ph name="NETWORK_ID" />), kan kræve, at du går til netværkets loginside.</translation> <translation id="4068506536726151626">Denne side indeholder elementer fra følgende websites, som sporer din placering:</translation> @@ -2390,7 +2389,6 @@ <translation id="4101878899871018532">Adgangskodeadministratoren tilbyder ikke at gemme de loginoplysninger, som bruges til synkronisering.</translation> <translation id="410351446219883937">Autoplay</translation> <translation id="4104163789986725820">E&ksporter...</translation> -<translation id="4105523032910086267">Indstiller animation og synlighed for sikkerhedsoplysninger i Material Design</translation> <translation id="4105563239298244027">Få 1 TB gratis plads med Google Drev</translation> <translation id="4109135793348361820">Flyt vindue til <ph name="USER_NAME" /> (<ph name="USER_EMAIL" />)</translation> <translation id="4110342520124362335">Cookies fra <ph name="DOMAIN" /> er blokeret.</translation> @@ -2440,6 +2438,7 @@ <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="4188447344915957833">Aktiverer lageradministrator i indstillingerne for material design.</translation> <translation id="4189406272289638749">Udvidelsen <b><ph name="EXTENSION_NAME" /></b> styrer denne indstilling.</translation> <translation id="4193154014135846272">Google-dokument</translation> <translation id="4193182321948161343">Aktivér Brugeradministration af Material Design</translation> @@ -2647,6 +2646,7 @@ <translation id="4508765956121923607">Vis k&ilde</translation> <translation id="4509017836361568632">Kassér foto</translation> <translation id="4509345063551561634">Mappeplacering:</translation> +<translation id="4513946894732546136">Feedback</translation> <translation id="4514542542275172126">Konfigurer ny administreret bruger</translation> <translation id="4514914692061505365">Gennemtving brugen af PNaCl's hurtige Subzero-oversætter for alle pexe-filer.</translation> <translation id="451515744433878153">Fjern</translation> @@ -2745,6 +2745,7 @@ <translation id="4656293982926141856">Denne computer</translation> <translation id="4656631038341342120">Aktivér VR-shell, hvis den er tilgængelig for denne enhed.</translation> <translation id="4657031070957997341">Tillad altid plugins på <ph name="HOST" /></translation> +<translation id="466008749075469935">Aktiverer indgriben for at begrænse CPU-forbrug for timere i baggrunden til 1 %.</translation> <translation id="4663254525753315077">Når det er muligt, kommes rulleindholdet fra et overløbsrulleelement over på et sammensat lag for at gøre rulningen hurtigere.</translation> <translation id="4664482161435122549">PKCS #12-eksportfejl</translation> <translation id="4665014895760275686">Producent</translation> @@ -2813,6 +2814,7 @@ <translation id="4749157430980974800">Georgisk tastatur</translation> <translation id="4750394297954878236">Forslag</translation> <translation id="475088594373173692">Første bruger</translation> +<translation id="4750892496809949692">Foretræk HTML-indhold ved at skjule Flash på listen over plugins.</translation> <translation id="4750917950439032686">Dine oplysninger (f.eks. adgangskoder eller kreditkortnumre) er private, når de sendes til dette website.</translation> <translation id="4753602155423695878">Animation af statuslinjen for sideindlæsning på Android-telefoner</translation> <translation id="4755240240651974342">Finsk tastatur</translation> @@ -3087,6 +3089,7 @@ <translation id="5119450342834678097">Anmod om website til tablet i menuen Indstillinger</translation> <translation id="5120068803556741301">Inputmetode fra tredjepart</translation> <translation id="5120421890733714118">Hav tillid til, at dette certifikat kan identificere websites.</translation> +<translation id="5120516977819314347">Pinkoden eller adgangskoden er forkert.</translation> <translation id="5121130586824819730">Din harddisk er fuld. Gem på en anden placering, eller frigør mere plads på harddisken.</translation> <translation id="5125751979347152379">Ugyldig webadresse.</translation> <translation id="5127881134400491887">Administrere netværksforbindelser</translation> @@ -3094,6 +3097,7 @@ <translation id="512903556749061217">tilknyttet</translation> <translation id="5129301143853688736">Din forbindelse til dette website er ikke privat. Angribere kan forsøge at stjæle dine oplysninger (f.eks. billeder, adgangskoder, beskeder og kreditkort) fra <ph name="DOMAIN" />.</translation> <translation id="5129662217315786329">Polsk</translation> +<translation id="5131347545782851480">PDF-dokumenter</translation> <translation id="5134856901811723984">Material design i Chrome OS-systemets brugerflade</translation> <translation id="5135533361271311778">Bogmærkeelementet blev ikke oprettet.</translation> <translation id="5136529877787728692">F7</translation> @@ -3261,6 +3265,7 @@ <translation id="5328031682234198929">8</translation> <translation id="5329858601952122676">&Slet</translation> <translation id="5330145655348521461">Disse filer blev åbnet på en anden computer. Skift til <ph name="USER_NAME" /> (<ph name="MAIL_ADDRESS" />) for at se dem.</translation> +<translation id="5330512191124428349">Hent oplysninger</translation> <translation id="5332624210073556029">Tidszone:</translation> <translation id="5333807720589685258">Dit SIM-kort deaktiveres permanent, hvis du ikke kan angive den korrekte nøgle til oplåsning af pinkode.</translation> @@ -3693,7 +3698,6 @@ <translation id="5892507820957994680">Tilsidesætter listen over indbygget softwaregengivelse og aktiverer GPU-acceleration på systemkonfigurationer, der ikke understøttes.</translation> <translation id="5895138241574237353">Genstart</translation> <translation id="5895187275912066135">Udstedt den</translation> -<translation id="5898154795085152510">Serveren returnerede et ugyldigt klientcertifikat. Fejl <ph name="ERROR_NUMBER" /> (<ph name="ERROR_NAME" />).</translation> <translation id="5900302528761731119">Google-profilbillede</translation> <translation id="590253956165195626">Tilbyd at oversætte sider, der ikke er på et sprog, du kan læse.</translation> <translation id="5904093760909470684">Proxykonfiguration</translation> @@ -3748,6 +3752,8 @@ <translation id="5984222099446776634">Besøgt for nylig</translation> <translation id="5984814259619230127">Registrering via Bluetooth Low Energy for Smart Lock.</translation> <translation id="5986245990306121338">Når dette er aktiveret, vises faneskift, selv når muligheden "flet faner og apps" er slået til i indstillingerne.</translation> +<translation id="5989712527536636369"><ph name="BEGIN_PARAGRAPH1" />Dette er generelle oplysninger om din enhed og din brug af den, som f.eks. batteriniveau, hvor ofte du bruger dine apps, kvaliteten og varigheden af dine netværksforbindelser (som f.eks. Wi-Fi og Bluetooth) samt nedbrudsrapporter, når tingene ikke fungerer optimalt. Oplysningerne bruges til at forbedre Googles produkter og tjenester for alle. Nogle samlede oplysninger gør det også lettere for partnere, som f.eks. Android-udviklere, at forbedre deres apps og produkter.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Du kan til enhver tid slå dette til eller fra i indstillingerne for Android-apps. Dette påvirker ikke enhedens mulighed for at sende de oplysninger, den har brug for for at modtage vigtige tjenester, som f.eks. systemopdateringer og sikkerhed.<ph name="END_PARAGRAPH2" /></translation> <translation id="5990198433782424697">Udvidelser på webadresser med chrome://</translation> <translation id="5990814808592353318">Manuel generering af adgangskode.</translation> <translation id="5991049340509704927">Forstør</translation> @@ -3761,6 +3767,7 @@ <translation id="6005695835120147974">Medierouter</translation> <translation id="6007237601604674381">Flytningen mislykkedes. <ph name="ERROR_MESSAGE" /></translation> <translation id="6008241731410823808">Sender revisionspings for hyperlink.</translation> +<translation id="6011449291337289699">Ryd websitedata</translation> <translation id="6015796118275082299">År</translation> <translation id="6016551720757758985">Bekræft Powerwash med nulstilling til forrige version</translation> <translation id="6016809788585079594">Sig "Ok Google" en sidste gang</translation> @@ -3931,7 +3938,7 @@ <translation id="6256079118265363670">Aktivér Google Play Butik på din Chromebook.</translation> <translation id="625755898061068298">Du har valgt at deaktivere sikkerhedsadvarsler for dette website.</translation> <translation id="6259104249628300056">Find enheder på dit lokale netværk</translation> -<translation id="6260721129502317187"><ph name="PLUGIN_NAME" /> er deaktiveret. Gå til <ph name="CHROME_PLUGINS_LINK" />for at aktivere det igen.</translation> +<translation id="6260721129502317187"><ph name="PLUGIN_NAME" /> er deaktiveret. Gå til <ph name="CHROME_PLUGINS_LINK" /> for at aktivere det igen.</translation> <translation id="6263082573641595914">Version af Microsoft-nøglecenter</translation> <translation id="6263284346895336537">Ikke kritisk</translation> <translation id="6263541650532042179">nulstil synkronisering</translation> @@ -3951,7 +3958,6 @@ <translation id="6276301056778294989">Kontrollér, at enheden viser den samme kode.</translation> <translation id="6277105963844135994">Netværkstimeout</translation> <translation id="6277518330158259200">T&ag skærmbillede</translation> -<translation id="6278428485366576908">Tema</translation> <translation id="6279183038361895380">Tryk på |<ph name="ACCELERATOR" />| at se markøren</translation> <translation id="6280215091796946657">Log ind med en anden konto</translation> <translation id="6280912520669706465">ARC</translation> @@ -4203,6 +4209,7 @@ <translation id="6607272825297743757">Filoplysninger</translation> <translation id="6607831829715835317">F&lere værktøjer</translation> <translation id="6608140561353073361">Alle cookies og websitedata...</translation> +<translation id="6610183966322615106">Der opstod en fejl ved tilføjelse af printeren</translation> <translation id="6610610633807698299">Angiv webadresse...</translation> <translation id="6612358246767739896">Beskyttet indhold</translation> <translation id="6615455863669487791">Vis mig</translation> @@ -4266,7 +4273,6 @@ <translation id="6708242697268981054">Oprindelse:</translation> <translation id="6709357832553498500">Opret forbindelse ved hjælp af <ph name="EXTENSIONNAME" /></translation> <translation id="6710213216561001401">Forrige</translation> -<translation id="6712158998835983046">Vis alle, animeret</translation> <translation id="6718273304615422081">Komprimerer...</translation> <translation id="671928215901716392">Lås skærmen</translation> <translation id="6721972322305477112">&Fil</translation> @@ -4538,7 +4544,6 @@ <translation id="7088434364990739311">Der kunne ikke søges efter opdateringer (fejlkode <ph name="ERROR" />).</translation> <translation id="708856090370082727">Aktivér understøttelse af overrulning for skærmtastatur. Når dette flag er sat, ændrer skærmtastaturet kun størrelsen på den synlige visning.</translation> <translation id="7088674813905715446">Denne enhed er blevet sat i tilstanden Fjernet af administratoren. Hvis du vil have, at den aktiveres med henblik på tilmelding, skal du bede administratoren om at sætte enheden i tilstanden Afventer.</translation> -<translation id="7089609847854449639">Lageradministrator</translation> <translation id="708969677220991657">Tillader anmodninger til localhost via HTTPS, selv når der vises et ugyldigt certifikat.</translation> <translation id="7092106376816104">Undtagelser for pop op-vinduer</translation> <translation id="7093866338626856921">Udveksle data med enhederne ved navn: <ph name="HOSTNAMES" /></translation> @@ -4578,7 +4583,7 @@ <translation id="715118844758971915">Klassiske printere</translation> <translation id="7154130902455071009">Skifte din startside til: <ph name="START_PAGE" /></translation> <translation id="7155171745945906037">Eksisterende billede fra kamera eller fil</translation> -<translation id="715568033737470079">Angiv PPAPI-plugins, der skal køres i sandbox-politikken for Win32k-lukning (kun Windows 10 og nyere).</translation> +<translation id="7155226869555939647">Åbn altid links til <ph name="APPLICATION" /></translation> <translation id="7156235233373189579">Denne fil er designet til en pc, som bruger Windows-software. Den er ikke kompatibel med din enhed, som kører Chrome OS. Find en tilsvarende app i <ph name="BEGIN_LINK" />Chrome Webshop<ph name="END_LINK" /> i stedet.<ph name="BEGIN_LINK_HELP" />Få flere oplysninger<ph name="END_LINK_HELP" /></translation> <translation id="7157063064925785854">Ved at klikke på Fortsæt accepterer du <ph name="LEGAL_DOC_LINK_TEXT_1" />, <ph name="LEGAL_DOC_LINK_TEXT_2" />, <ph name="LEGAL_DOC_LINK_TEXT_3" /> og <ph name="LEGAL_DOC_LINK_TEXT_4" />.</translation> <translation id="7158238151765743968">Forbindelsen til "<ph name="DEVICE_NAME" />" er stadig aktiv.</translation> @@ -4593,6 +4598,7 @@ <translation id="7175353351958621980">Indlæst fra:</translation> <translation id="7180611975245234373">Opdater</translation> <translation id="7180865173735832675">Tilpas</translation> +<translation id="7181387261278441780">Ryd og nulstil website</translation> <translation id="7185078796915954712">TLS 1.3</translation> <translation id="7185690883425432021">Skjuler knapper til lukning af inaktive faner, når fanelinjen er i staktilstand.</translation> <translation id="7186088072322679094">Behold på værktøjslinjen</translation> @@ -4625,7 +4631,6 @@ <translation id="7223775956298141902">Øv... Du har ingen udvidelser :-(</translation> <translation id="7224023051066864079">Undernetmaske:</translation> <translation id="7225179976675429563">Netværkstype mangler</translation> -<translation id="7230191962699768124">Vis alle, ikke-animeret</translation> <translation id="7230787553283372882">Tilpas din tekststørrelse</translation> <translation id="7231224339346098802">Brug et tal til at angive, hvor mange kopier der skal udskrives (én eller flere).</translation> <translation id="7238585580608191973">SHA-256-fingeraftryk</translation> @@ -4757,7 +4762,6 @@ <translation id="7409233648990234464">Genstart og powerwash</translation> <translation id="7409836189476010449">Kør Flash</translation> <translation id="7410344089573941623">Spørg, hvis <ph name="HOST" /> vil have adgang til dit kamera og din mikrofon</translation> -<translation id="7411343637221933631">{NUM_COOKIES,plural, =1{1 fra dette website}one{# fra dette website}other{# fra dette website}}</translation> <translation id="7412226954991670867">GPU-hukommelse</translation> <translation id="7416362041876611053">Ukendt netværksfejl.</translation> <translation id="7417453074306512035">Etiopisk tastatur</translation> @@ -4879,6 +4883,7 @@ <translation id="756445078718366910">Åbn browservindue</translation> <translation id="7564847347806291057">Afslut proces</translation> <translation id="7566723889363720618">F12</translation> +<translation id="7567314848159753396">Cookie: <ph name="NAME" /></translation> <translation id="756809126120519699">Chrome-dataene blev ryddet</translation> <translation id="7568790562536448087">Opdatering</translation> <translation id="7573172247376861652">Batteriopladning</translation> @@ -4919,6 +4924,7 @@ <translation id="7626009897377900107">Generering af adgangskode</translation> <translation id="7627262197844840899">Dette website accepterer ikke MasterCard.</translation> <translation id="7627790789328695202"><ph name="FILE_NAME" /> findes allerede. Giv filen et nyt navn, og prøv igen.</translation> +<translation id="7628127343934101653">Åbn PDF-filer i standardapplikationen til visning af PDF-filer.</translation> <translation id="762917759028004464"><ph name="BROWSER_NAME" /> er i øjeblikket din standardbrowser.</translation> <translation id="7629536005696009600">Tillad, at loginoplysninger, der gemmes i Android-applikationer, udfyldes på de tilknyttede websites.</translation> <translation id="7629827748548208700">Fane: <ph name="TAB_NAME" /></translation> @@ -5147,6 +5153,7 @@ <translation id="7957513156576779045">Aktivér Bluetooth for at tillade parring</translation> <translation id="7957615753207896812">Åbn enhedens tastaturindstillinger</translation> <translation id="7959074893852789871">Filen indeholdt flere certifikater, hvoraf nogle af dem ikke blev importeret:</translation> +<translation id="7959700692661109221"><ph name="BEGIN_PARAGRAPH" />Googles placeringstjeneste anvender kilder, som f.eks. Wi-Fi, til at hjælpe med at anslå din enheds placering hurtigere og mere nøjagtigt. Når du aktiverer Googles placeringstjenester, skifter din enhed til en tilstand, der bruger Wi-Fi til at levere placeringsoplysninger. Du kan til enhver tid deaktivere denne tilstand i placeringsindstillingerne.<ph name="END_PARAGRAPH" /></translation> <translation id="7961015016161918242">Aldrig</translation> <translation id="7964089325405904043">Import og eksport af adgangskoder</translation> <translation id="7965010376480416255">Delt hukommelse</translation> @@ -5297,6 +5304,7 @@ <translation id="8146793085009540321">Login mislykkedes. Kontakt din administrator, eller prøv igen.</translation> <translation id="8148264977957212129">Pinyin indtastningsmetode</translation> <translation id="8148913456785123871">Vis Google Nu-kort i Starter</translation> +<translation id="8150391391298684512">Deaktiver Windows Runtime MIDI API</translation> <translation id="8151185429379586178">Udviklerværktøjer</translation> <translation id="8151638057146502721">Konfigurer</translation> <translation id="8151639108075998630">Aktivér gæstesession</translation> @@ -5578,6 +5586,7 @@ <translation id="8532294913309524834">Sortér sprog efter dine præferencer.</translation> <translation id="8535005006684281994">Webadresse for fornyelse af Netscape-certifikat</translation> <translation id="8539727552378197395">Nej (HttpOnly)</translation> +<translation id="8541084862688000575">Indlæs Android-apps automatisk</translation> <translation id="8543181531796978784">Du kan <ph name="BEGIN_ERROR_LINK" />rapportere et registreringsproblem<ph name="END_ERROR_LINK" /> eller, hvis du forstår den sikkerhedsrisiko, du udsætter dig for, <ph name="BEGIN_LINK" />kan du gå til dette usikre website<ph name="END_LINK" />.</translation> <translation id="8545107379349809705">Skjul oplysninger...</translation> <translation id="8545211332741562162">Aktivér, at websider kan anvende eksperimentelle JavaScript-funktioner.</translation> @@ -5605,7 +5614,6 @@ <translation id="8569764466147087991">Vælg den fil, der skal åbnes</translation> <translation id="8571032220281885258">Når du siger "Ok Google," søger Chrome efter det næste, du siger.</translation> <translation id="8571108619753148184">Server 4</translation> -<translation id="8572832761467613633">Kun Flash</translation> <translation id="8572981282494768930">Tillad ikke, at websites får adgang til dit kamera og din mikrofon</translation> <translation id="8574234089711453001">Tillad, at en downloadknap vises, når du åbner en side via mediewebadresse.</translation> <translation id="857779305329188634">Aktivér eksperimenterende QUIC-protokolsupport.</translation> @@ -5627,6 +5635,7 @@ <translation id="8600929685092827187">Enheden vågner, når den modtager pakker</translation> <translation id="8601206103050338563">TLS WWW-klientgodkendelse</translation> <translation id="8602851771975208551">Et andet program på din computer tilføjede en app, der kan ændre den måde, hvorpå Chrome fungerer.</translation> +<translation id="8603912787021349466">Giv Android-apps tilladelse til at starte automatisk, når du er logget ind.</translation> <translation id="8605428685123651449">SQLite-hukommelse</translation> <translation id="8605503133013456784">Kunne ikke afbryde forbindelsen og ophæve parringen fra "<ph name="DEVICE_NAME" />".</translation> <translation id="8606726445206553943">Brug dine MIDI-enheder</translation> @@ -5635,7 +5644,7 @@ <translation id="8615618338313291042">Inkognitoprogram: <ph name="APP_NAME" /></translation> <translation id="8619892228487928601"><ph name="CERTIFICATE_NAME" />: <ph name="ERROR" /></translation> <translation id="8620617069779373398">Roamingstatus</translation> -<translation id="8620765578342452535">Konfigurer netværksforbindelser</translation> +<translation id="8620765578342452535">Konfigurere netværksforbindelser</translation> <translation id="8623004009673949077">App med manifestattributen "kiosk_only" skal være installeret i terminaltilstand i Chrome OS.</translation> <translation id="862542460444371744">&Udvidelser</translation> <translation id="8627151598708688654">Vælg kilde</translation> @@ -5980,6 +5989,7 @@ <translation id="9053965862400494292">Der opstod en fejl under konfiguration af synkroniseringen.</translation> <translation id="9056034633062863292">Chromebox opdateres...</translation> <translation id="9056810968620647706">Der blev ikke fundet resultater.</translation> +<translation id="9057119625587205566">Der blev ikke fundet nogen printere i nærheden</translation> <translation id="9059868303873565140">Statusmenu</translation> <translation id="9064142312330104323">Google-profilbillede (indlæser)</translation> <translation id="9064275926664971810">Aktivér AutoFyld for at udfylde formularer med et enkelt klik</translation> @@ -5990,6 +6000,7 @@ <translation id="9067401056540256169">Dette flag gør Chrome usikker. Du bør kun bruge det, hvis du har begreb om, hvad det forårsager. Bemærk, at dette flag kan blive fjernet uden varsel. Hvis det er aktiveret, kan rammer med en oprindelig https bruge WebSockets med en usikker webadresse (ws://).</translation> <translation id="9068931793451030927">Sti:</translation> <translation id="9070219033670098627">Skift person</translation> +<translation id="9070940116164932228">Reguler dyre timere i baggrunden</translation> <translation id="907148966137935206">Tillad ikke, at websites viser pop op-vinduer (anbefales)</translation> <translation id="9072550133391925347"><ph name="PASSWORD_MANAGER_BRAND" /> logger dig automatisk ind på kvalificerede websites og apps med adgangskoder, du har gemt.</translation> <translation id="9073281213608662541">PAP</translation> @@ -6024,6 +6035,7 @@ <translation id="9112614144067920641">Vælg en ny pinkode.</translation> <translation id="9112748030372401671">Skifte baggrund</translation> <translation id="9112987648460918699">Find...</translation> +<translation id="9114663181201435112">Log nemt ind</translation> <translation id="9115487443206954631">Administrer Cast-enheder</translation> <translation id="9115675100829699941">&Bogmærker</translation> <translation id="9121814364785106365">Åbn som fastgjort fane</translation> @@ -6118,7 +6130,6 @@ <translation id="952992212772159698">Ikke aktiveret</translation> <translation id="960719561871045870">Operatørkode</translation> <translation id="960987915827980018">Omkring én time tilbage</translation> -<translation id="962778376131245616">Vis kun usikre, animeret</translation> <translation id="96421021576709873">Wi-Fi-netværk</translation> <translation id="965490406356730238">Aktivér hardwareaccelereret MJPEG-afkodning for billeder, hvis muligt.</translation> <translation id="968174221497644223">Applikationscache</translation>
diff --git a/chrome/app/resources/generated_resources_de.xtb b/chrome/app/resources/generated_resources_de.xtb index d100d00..2dc40a7 100644 --- a/chrome/app/resources/generated_resources_de.xtb +++ b/chrome/app/resources/generated_resources_de.xtb
@@ -18,7 +18,6 @@ <translation id="1029317248976101138">Zoom</translation> <translation id="1029595648591494741">"<ph name="EXTENSION_NAME" />" testen?</translation> <translation id="1031362278801463162">Vorschau wird geladen...</translation> -<translation id="1031460590482534116">Beim Speichern des Clientzertifikats ist ein Fehler aufgetreten. Fehler <ph name="ERROR_NUMBER" /> (<ph name="ERROR_NAME" />).</translation> <translation id="1031573127485938293">Nachfragen (gemäß Richtlinien)</translation> <translation id="103279545524624934">Geben Sie Speicherplatz frei, um Android-Apps starten zu können.</translation> <translation id="1033780634303702874">Auf Ihre seriellen Geräte zugreifen</translation> @@ -101,6 +100,7 @@ <translation id="1128591060186966949">Suchmaschine bearbeiten</translation> <translation id="1128987120443782698">Die Kapazität des Speichergeräts beträgt <ph name="DEVICE_CAPACITY" />. Legen Sie eine SD-Karte ein bzw. schließen Sie einen USB-Speicherstick an (mit einer Mindestkapazität von 4 GB).</translation> <translation id="1137135726305341424">domContentLoaded und alle Ressourcen-Ladevorgänge vor domContentLoaded gestartet (Hauptframe und iframes mit demselben Ursprung).</translation> +<translation id="1138663153846032155">HTML gegenüber Flash bevorzugen</translation> <translation id="1140351953533677694">Auf Ihre Bluetooth- und seriellen Geräte zugreifen</translation> <translation id="114140604515785785">Stammverzeichnis der Erweiterung:</translation> <translation id="1143142264369994168">Signaturgeber des Zertifikats</translation> @@ -208,7 +208,7 @@ <translation id="1277908057200820621">Geräteliste aufrufen</translation> <translation id="1278049586634282054">Ansichten prüfen:</translation> <translation id="1278813325885878377">Ungarische QWERTY-Tastatur</translation> -<translation id="1284355409890639046">Pairing mit Bluetooth-Gerät durchführen</translation> +<translation id="1284355409890639046">Mit Bluetooth-Gerät koppeln</translation> <translation id="1285320974508926690">Diese Website nie übersetzen</translation> <translation id="1285484354230578868">Daten in meinem Google Drive-Konto speichern</translation> <translation id="1290223615328246825">Fehler bei der automatischen Anmeldung</translation> @@ -252,6 +252,7 @@ <translation id="1351692861129622852"><ph name="FILE_COUNT" /> Dateien werden importiert...</translation> <translation id="1352103415082130575">Thailändische Tastatur (Pattachote)</translation> <translation id="1353686479385938207"><ph name="PROVIDER_NAME" />: <ph name="NETWORK_NAME" /></translation> +<translation id="1353946958707294039">Material Design-Speichermanager</translation> <translation id="1353966721814789986">"Beim Start"-Seiten</translation> <translation id="1354868058853714482">Adobe Reader ist veraltet und somit möglicherweise unsicher.</translation> <translation id="1355408554203439639">3D-Softwareraster</translation> @@ -420,7 +421,6 @@ <translation id="1533920822694388968">Ausrichtung von TV-Gerät</translation> <translation id="15373452373711364">Großer Cursor</translation> <translation id="1543284117603151572">Aus Edge importiert</translation> -<translation id="1544350195767834591">{NUM_COOKIES,plural, =1{1 von anderen Websites}other{# von anderen Websites}}</translation> <translation id="1545177026077493356">Automatischer Kioskmodus</translation> <translation id="1545786162090505744">URL mit %s statt der Suchanfrage</translation> <translation id="1546280085599573572">Durch diese Erweiterung wurde die Seite geändert, die beim Klicken auf die Schaltfläche "Startseite" erscheint.</translation> @@ -444,7 +444,6 @@ <translation id="1559235587769913376">Unicode-Zeichen eingeben</translation> <translation id="1561092721008294962">HarfBuzz für Benutzeroberflächen-Text</translation> <translation id="1566049601598938765">Website</translation> -<translation id="1566958206723629112">Flash und PDF</translation> <translation id="1567723158593978621">Wenn die Option ausgewählt ist, wird zur Anmeldung im Browser die neue GAIA-Anmeldung mit separatem Passwort verwendet.</translation> <translation id="1567993339577891801">JavaScript-Konsole</translation> <translation id="1568323446248056064">Einstellungen für Anzeigegerät öffnen</translation> @@ -573,7 +572,6 @@ <translation id="1723940674997333416">Unsichere WebSocket-Verbindung mit HTTPS-Ursprung zulassen</translation> <translation id="1725149567830788547">&Steuerelemente anzeigen</translation> <translation id="172612876728038702">Das TPM wird eingerichtet. Bitte haben Sie einen Moment Geduld, dies kann ein paar Minuten dauern.</translation> -<translation id="1727135806684246609">Material-Design-Sicherheitsindikator</translation> <translation id="1729533290416704613">Die Erweiterung legt auch fest, welche Seite bei der Suche über die Omnibox angezeigt wird.</translation> <translation id="1731346223650886555">Semikolon</translation> <translation id="1731589410171062430">Gesamt: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /> (<ph name="NUMBER_OF_PAGES" /> <ph name="PAGE_OR_PAGES_LABEL" />)</translation> @@ -705,7 +703,7 @@ <translation id="1932098463447129402">Nicht vor</translation> <translation id="1932240834133965471">Inhaber dieser Einstellungen ist <ph name="OWNER_EMAIL" />.</translation> <translation id="1933634360065765365">Erweitert die Einstellung "--top-chrome-md" auf die sekundäre Benutzeroberfläche (Infofelder, Dialogfelder usw.).</translation> -<translation id="1933809209549026293">Verbinden Sie eine Maus oder Tastatur. Vergewissern Sie sich bei Verwendung eines Bluetooth-Geräts, dass Sie ein Pairing durchführen können.</translation> +<translation id="1933809209549026293">Verbinden Sie eine Maus oder Tastatur. Vergewissern Sie sich bei Verwendung eines Bluetooth-Geräts, ob es bereit zur Kopplung ist.</translation> <translation id="1934636348456381428">Aktiviert die Implementierung der experimentellen Overlay-Bildlaufleisten. Für die Animation der Bildlaufleisten muss auch der Aufbau durch Threads aktiviert werden.</translation> <translation id="1936157145127842922">In Ordner anzeigen</translation> <translation id="1936717151811561466">Finnisch</translation> @@ -869,6 +867,7 @@ <translation id="218492098606937156">Touch-Ereignisse aktivieren</translation> <translation id="2187317261103489799">Erkennen (Standardeinstellung)</translation> <translation id="2187895286714876935">Fehler beim Importieren des Serverzertifikats</translation> +<translation id="2188881192257509750"><ph name="APPLICATION" /> öffnen</translation> <translation id="2190069059097339078">WLAN-Anmeldedaten-Abruf</translation> <translation id="219008588003277019">Natives Client-Modul: <ph name="NEXE_NAME" /></translation> <translation id="2190355936436201913">(leer)</translation> @@ -987,6 +986,7 @@ <translation id="2326606747676847821">Zum Inkognitomodus wechseln</translation> <translation id="2326931316514688470">App &neu laden</translation> <translation id="2327492829706409234">App aktivieren</translation> +<translation id="2328054044222305089">Dadurch werden alle von <ph name="SITE" /> auf Ihrem Gerät gespeicherten Daten gelöscht und erteilte Ausführungsberechtigungen zurückgesetzt. Möchten Sie fortfahren?</translation> <translation id="2329597144923131178">Melden Sie sich an, um Ihre Lesezeichen, Ihren Verlauf, Ihre Passwörter und andere Einstellungen auf allen Ihren Geräten aufzurufen.</translation> <translation id="2332131598580221120">Im Store ansehen</translation> <translation id="2332742915001411729">Auf Standardeinstellungen zurücksetzen</translation> @@ -1261,7 +1261,6 @@ <translation id="2675358154061544447">Sehr experimentelle Unterstützung des Renderings von websiteübergreifenden iFrames in separaten Prozessen. In diesem Modus werden nur für Dokumente, die von derselben Website stammen, Renderer-Prozesse durchgeführt.</translation> <translation id="2676946222714718093">Läuft gerade auf:</translation> <translation id="2678063897982469759">Wieder aktivieren</translation> -<translation id="2678246812096664977">Alle Plug-ins</translation> <translation id="2679385451463308372">Über den Systemdialog drucken...</translation> <translation id="2680208403056680091">Internetverbindung wird kontrolliert</translation> <translation id="268053382412112343">Ve&rlauf</translation> @@ -1435,7 +1434,6 @@ <translation id="287286579981869940"><ph name="PROVIDER_NAME" /> hinzufügen...</translation> <translation id="2872961005593481000">Herunterfahren</translation> <translation id="2875698561019555027">(Chrome-Fehlerseiten)</translation> -<translation id="2879560882721503072">Das von <ph name="ISSUER" /> ausgestellte Clientzertifikat wurde erfolgreich gespeichert.</translation> <translation id="288024221176729610">Tschechisch</translation> <translation id="288042212351694283">Auf Ihre Universal 2nd Factor-Geräte zugreifen</translation> <translation id="2881966438216424900">Letzter Zugriff am:</translation> @@ -1584,6 +1582,7 @@ <translation id="3057861065630527966">Fotos und Videos sichern</translation> <translation id="3058212636943679650">Falls Sie das Betriebssystem Ihres Computers einmal wiederherstellen müssen, benötigen Sie eine Wiederherstellungs-SD-Karte oder einen Wiederherstellungs-USB-Speicherstick.</translation> <translation id="305932878998873762">Der einfache Cache für HTTP ist eine neue Art von Zwischenspeicher, bei dem die Zuweisung von Festplattenspeicherplatz vom Dateisystem übernommen wird.</translation> +<translation id="3060251871394327123">Dadurch werden alle von <ph name="SITE" /> auf dem Gerät gespeicherten Daten gelöscht. Möchten Sie fortfahren?</translation> <translation id="3061650404498811439">Zugriff auf Emojis, Handschriften und Spracheingabe über IME-Aktivierungsmenü aktivieren</translation> <translation id="3062606427884046423">Android-MediaStyle-Benachrichtigungen für Chrome-Medienbenachrichtigungen verwenden.</translation> <translation id="3063844757726132584">Greifen Sie über diesen praktischen Launcher auf alle Ihre Apps zu. Spielen Sie Spiele, führen Sie Videochats, hören Sie Musik, bearbeiten Sie Dokumente oder laden Sie weitere Apps herunter.</translation> @@ -1612,7 +1611,7 @@ <translation id="308903551226753393">Automatisch konfigurieren</translation> <translation id="3089231390674410424">Bei Ihren Anmeldedaten ist ein Problem aufgetreten. Bitte melden Sie sich mit den korrekten Daten an und versuchen Sie es noch einmal.</translation> <translation id="3090819949319990166">Externe CRX-Datei konnte nicht als <ph name="TEMP_CRX_FILE" /> kopiert werden.</translation> -<translation id="3090871774332213558">Pairing mit "<ph name="DEVICE_NAME" />" durchgeführt</translation> +<translation id="3090871774332213558">"<ph name="DEVICE_NAME" />" ist gekoppelt</translation> <translation id="3092279154632090732">Option zur MHTML-Generierung</translation> <translation id="3095995014811312755">Version</translation> <translation id="3097628171361913691">ZIP-Datei-Installationsprogramm</translation> @@ -1633,6 +1632,7 @@ <translation id="3123569374670379335">(Betreut)</translation> <translation id="3124111068741548686">NUTZER-Handles</translation> <translation id="3126026824346185272">Strg</translation> +<translation id="3127156390846601284">Dadurch werden sämtliche für alle angezeigten Websites auf dem Gerät gespeicherten Daten gelöscht. Möchten Sie fortfahren?</translation> <translation id="312759608736432009">Gerätehersteller:</translation> <translation id="3127919023693423797">Authentifizierung wird durchgeführt...</translation> <translation id="3128230619496333808">Tab 6</translation> @@ -1731,7 +1731,6 @@ <translation id="3264544094376351444">Schriftart Sans-Serif</translation> <translation id="3264547943200567728">Fehler bei der Einrichtung des Chromebox-Netzwerks</translation> <translation id="3265459715026181080">Fenster schließen</translation> -<translation id="3267271790328635957">Nur PDF</translation> <translation id="3267726687589094446">Weiterhin automatisches Herunterladen mehrerer Dateien zulassen</translation> <translation id="3267998849713137817">Änderungszeitpunkt</translation> <translation id="3268451620468152448">Geöffnete Tabs</translation> @@ -1977,6 +1976,7 @@ <translation id="3574210789297084292">Anmelden</translation> <translation id="3574305903863751447"><ph name="CITY" />, <ph name="STATE" /> <ph name="COUNTRY" /></translation> <translation id="357479282490346887">Litauisch</translation> +<translation id="3575927481544652747">Deaktivieren Sie die Windows Runtime MIDI API für WebMIDI. Diese ist standardmäßig unter Windows 10 oder höher aktiviert.</translation> <translation id="3576324189521867626">Installation war erfolgreich</translation> <translation id="3578331450833904042">Standard – alles aufnehmen</translation> <translation id="3578594933904494462">Der Inhalt dieses Tabs wird geteilt.</translation> @@ -1991,7 +1991,7 @@ <translation id="3586479556961486060">Farbkalibrierung des Bildschirms</translation> <translation id="3586931643579894722">Details ausblenden</translation> <translation id="3587482841069643663">Alle</translation> -<translation id="358796204584394954">Geben Sie diesen Code auf "<ph name="DEVICE_NAME" />" ein, um ein Pairing durchzuführen:</translation> +<translation id="358796204584394954">Geben Sie zur Kopplung diesen Code auf "<ph name="DEVICE_NAME" />" ein:</translation> <translation id="3588662957555259973">* Google Profile-Foto</translation> <translation id="3590194807845837023">Profil entsperren und Chrome neu starten</translation> <translation id="3590559774363307859">Das Passwort wurde gespeichert. <ph name="SAVED_PASSWORDS_LINK" /> können Sie von jedem Browser aus aufrufen.</translation> @@ -2030,8 +2030,6 @@ <translation id="3627320433825461852">Noch weniger als 1 Minute</translation> <translation id="3627588569887975815">Link in Inko&gnito-Fenster öffnen</translation> <translation id="3627671146180677314">Verlängerungszeit für Netscape-Zertifikate</translation> -<translation id="3629326610814700057">Aktiviert den Speichermanager zur Verwaltung des lokalen Speichers.</translation> -<translation id="3630337581925712713"><ph name="PERMISSION_TYPE_LABEL" />:</translation> <translation id="3631337165634322335">Die unten genannten Ausnahmen gelten nur für die aktuelle anonyme Sitzung.</translation> <translation id="3633586230741134985">App Launcher-Einstellungen</translation> <translation id="3633997706330212530">Sie können diese Dienste deaktivieren.</translation> @@ -2054,7 +2052,8 @@ <translation id="3654045516529121250">Einstellungen für Bedienungshilfen lesen</translation> <translation id="3654092442379740616">Synchronisierungsfehler: <ph name="PRODUCT_NAME" /> ist veraltet und muss aktualisiert werden.</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{Dauerhafter Zugriff auf eine Datei}other{Dauerhafter Zugriff auf # Dateien}}</translation> -<translation id="3657468915905674858">PPAPI-Win32k-Sperrung aktivieren</translation> +<translation id="365793796291733849"><ph name="BEGIN_PARAGRAPH1" />Wenn Sie die automatische Sicherung aktivieren, werden Geräte- und App-Daten regelmäßig in einem privaten Ordner in Google Drive gespeichert. Bei App-Daten kann es sich um alle von einer App basierend auf Entwicklereinstellungen gespeicherten Daten einschließlich potentiell vertraulicher Daten wie Kontakte, Nachrichten und Fotos handeln.<ph name="END_PARAGRAPH1" /> +<ph name="BEGIN_PARAGRAPH2" />Sicherungsdaten werden nicht auf Ihr Drive-Speicherplatzkontingent angerechnet. Große Dateien oder Dateien, die Entwickler aus dem Dienst ausgeschlossen haben, werden nicht gesichert.<ph name="END_PARAGRAPH2" /></translation> <translation id="3660234220361471169">Nicht vertrauenswürdig</translation> <translation id="3665589677786828986">Chrome hat festgestellt, dass einige Ihrer Einstellungen von einem anderen Programm manipuliert wurden, und hat sie auf die ursprünglichen Standardwerte zurückgesetzt.</translation> <translation id="3665842570601375360">Sicherheit:</translation> @@ -2109,6 +2108,7 @@ <translation id="3733127536501031542">SSL-Server mit Step-up</translation> <translation id="3736520371357197498">Wenn Sie die Sicherheitsrisiken kennen, können Sie <ph name="BEGIN_LINK" />diese unsichere Website aufrufen<ph name="END_LINK" />, bevor die gefährlichen Programme entfernt wurden.</translation> <translation id="3738924763801731196"><ph name="OID" />:</translation> +<translation id="3739254215541673094"><ph name="APPLICATION" /> öffnen?</translation> <translation id="3739798227959604811">Verzögerung vor Wiederholung:</translation> <translation id="3741158646617793859"><ph name="DEVICE_NAME" /> erscheint nun in der Admin-Konsole.</translation> <translation id="3741243925913727067">Fotos und Videos des Mediengeräts auf Google Drive sichern</translation> @@ -2347,7 +2347,6 @@ <translation id="4058793769387728514">Dokument jetzt prüfen</translation> <translation id="4059285154003114015">Frame &drucken...</translation> <translation id="406070391919917862">Apps im Hintergrund</translation> -<translation id="4061502419206152498">Nur nicht sicher, nicht animiert anzeigen</translation> <translation id="4062251648694601778">Viel Spaß mit Ihrem <ph name="SHORT_PRODUCT_NAME" />-Gerät. Sie haben Fragen? Hilfe erhalten Sie ganz einfach durch Klicken auf "?" in der Statusleiste.</translation> <translation id="4065876735068446555">Eventuell müssen Sie die Anmeldeseite des verwendeten Netzwerks (<ph name="NETWORK_ID" />) aufrufen.</translation> <translation id="4068506536726151626">Diese Seite enthält Elemente von folgenden Websites, die Ihren Standort nachverfolgen:</translation> @@ -2386,7 +2385,6 @@ <translation id="4101878899871018532">Der Passwortmanager bietet nicht an, die Anmeldedaten für die Synchronisierung zu speichern.</translation> <translation id="410351446219883937">Autoplay</translation> <translation id="4104163789986725820">E&xportieren...</translation> -<translation id="4105523032910086267">Legt Animation und Sichtbarkeit des Sicherheitsindikators in Material Design fest.</translation> <translation id="4105563239298244027">Nutzen Sie 1 TB kostenlosen Speicher bei Google Drive.</translation> <translation id="4109135793348361820">Fenster zu <ph name="USER_NAME" /> (<ph name="USER_EMAIL" />) verschieben</translation> <translation id="4110342520124362335">Cookies von <ph name="DOMAIN" /> gesperrt</translation> @@ -2437,6 +2435,7 @@ <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="4188447344915957833">Aktiviert den Speichermanager in Material Design-Einstellungen.</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> <translation id="4193182321948161343">Nutzermanager im Material Design anzeigen</translation> @@ -2555,7 +2554,7 @@ <translation id="4358697938732213860">Adresse hinzufügen</translation> <translation id="4359408040881008151">Wurde aufgrund der abhängigen Erweiterungen installiert</translation> <translation id="4361190688154226069">Zielbestimmung in Ansichten mithilfe von Rechtecken</translation> -<translation id="4361765875689149937"><ph name="ORIGIN" /> möchte ein Pairing durchführen mit:</translation> +<translation id="4361765875689149937"><ph name="ORIGIN" /> möchte eine Kopplung durchführen mit:</translation> <translation id="4363771538994847871">Kein Cast-Empfänger gefunden. Benötigen Sie Hilfe?</translation> <translation id="4364444725319685468"><ph name="FILE_NAME" /> heruntergeladen</translation> <translation id="4364567974334641491"><ph name="APP_NAME" /> hat ein Fenster freigegeben.</translation> @@ -2644,6 +2643,7 @@ <translation id="4508765956121923607">Q&uelle anzeigen</translation> <translation id="4509017836361568632">Foto verwerfen</translation> <translation id="4509345063551561634">Speicherort:</translation> +<translation id="4513946894732546136">Google Feedback</translation> <translation id="4514542542275172126">Neuen betreuten Nutzer einrichten</translation> <translation id="4514914692061505365">Die Verwendung des schnellen Subzero-Übersetzers von PNaCl für alle Portable Executable-Dateien erzwingen.</translation> <translation id="451515744433878153">Entfernen</translation> @@ -2742,6 +2742,7 @@ <translation id="4656293982926141856">Auf diesem Computer</translation> <translation id="4656631038341342120">VR-Shell aktivieren, sofern für dieses Gerät verfügbar.</translation> <translation id="4657031070957997341">Plug-ins auf <ph name="HOST" /> immer zulassen</translation> +<translation id="466008749075469935">Ermöglicht den Eingriff zum Begrenzen der CPU-Nutzung von Hintergrund-Timern auf 1 %.</translation> <translation id="4663254525753315077">Fügt die Inhalte eines scrollbaren Überlaufelements falls möglich in eine zusammengesetzte Ebene ein, um schnelleres Scrollen zu ermöglichen</translation> <translation id="4664482161435122549">PKCS #12 - Fehler beim Export</translation> <translation id="4665014895760275686">Hersteller</translation> @@ -2807,6 +2808,7 @@ <translation id="4749157430980974800">Georgische Tastatur</translation> <translation id="4750394297954878236">Vorschläge</translation> <translation id="475088594373173692">Erster Nutzer</translation> +<translation id="4750892496809949692">HTML-Inhalte durch Ausblenden von Flash aus der Liste der Plug-ins bevorzugen.</translation> <translation id="4750917950439032686">Ihre Daten wie Passwörter oder Kreditkartennummern sind privat, wenn Sie sie an diese Website senden.</translation> <translation id="4753602155423695878">Animation der Statusanzeige für den Seitenaufbau auf dem Android-Smartphone</translation> <translation id="4755240240651974342">Finnische Tastatur</translation> @@ -2910,7 +2912,7 @@ <translation id="4874539263382920044">Titel muss mindestens ein Zeichen enthalten</translation> <translation id="4875622588773761625">Soll <ph name="PASSWORD_MANAGER_BRAND" /> Ihr Passwort für diese Website aktualisieren?</translation> <translation id="4876895919560854374">Bildschirm sperren und entsperren</translation> -<translation id="4877017884043316611">Pairing mit Chromebox durchführen</translation> +<translation id="4877017884043316611">Mit Chromebox koppeln</translation> <translation id="4880214202172289027">Schieberegler für die Lautstärke</translation> <translation id="4880328057631981605">Name des Zugangspunkts</translation> <translation id="4880520557730313061">Autom. Korrektur</translation> @@ -3081,6 +3083,7 @@ <translation id="5119450342834678097">Option zur Anforderung der Tablet-Website im Einstellungsmenü</translation> <translation id="5120068803556741301">Eingabemethode von Drittanbieter</translation> <translation id="5120421890733714118">Diesem Zertifikat zur Identifizierung von Websites vertrauen</translation> +<translation id="5120516977819314347">Falsche PIN oder falsches Passwort.</translation> <translation id="5121130586824819730">Ihre Festplatte ist voll. Wählen Sie bitte einen anderen Speicherort aus oder geben Sie Speicherplatz auf der Festplatte frei.</translation> <translation id="5125751979347152379">Ungültige URL</translation> <translation id="5127881134400491887">Netzwerkverbindungen verwalten</translation> @@ -3088,6 +3091,7 @@ <translation id="512903556749061217">angeschlossen</translation> <translation id="5129301143853688736">Ihre Verbindung zu dieser Website ist nicht sicher. Unbefugte Dritte könnten versuchen, Ihre Informationen von <ph name="DOMAIN" /> zu stehlen, etwa Fotos, Passwörter, Nachrichten oder Kreditkartendaten.</translation> <translation id="5129662217315786329">Polnisch</translation> +<translation id="5131347545782851480">PDF-Dokumente</translation> <translation id="5134856901811723984">Material Design in der System-Benutzeroberfläche von Chrome OS</translation> <translation id="5135533361271311778">Lesezeichenelement konnte nicht erstellt werden.</translation> <translation id="5136529877787728692">F7</translation> @@ -3254,6 +3258,7 @@ <translation id="5328031682234198929">8</translation> <translation id="5329858601952122676">&Löschen</translation> <translation id="5330145655348521461">Diese Dateien wurden auf einem anderen Desktop geöffnet. Wechseln Sie zu <ph name="USER_NAME" /> (<ph name="MAIL_ADDRESS" />), um sie anzusehen.</translation> +<translation id="5330512191124428349">Informationen abrufen</translation> <translation id="5332624210073556029">Zeitzone:</translation> <translation id="5333807720589685258">Ihre SIM-Karte wird dauerhaft deaktiviert, wenn Sie nicht den korrekten PUK eingeben.</translation> <translation id="5333958554630697967">Aktiviert experimentelle Webplattform-Funktionen, die sich im Entwicklungsstadium befinden.</translation> @@ -3613,7 +3618,7 @@ <translation id="5814126672212206791">Verbindungstyp</translation> <translation id="5815645614496570556">X.400-Adresse</translation> <translation id="5817397429773072584">Chinesisch (traditionell)</translation> -<translation id="5817918615728894473">Pairing durchführen</translation> +<translation id="5817918615728894473">Koppeln</translation> <translation id="5818003990515275822">Koreanisch</translation> <translation id="5819442873484330149">Hangul 3 Set (Final)</translation> <translation id="5819484510464120153">App-Verknüpfungen er&stellen...</translation> @@ -3685,7 +3690,6 @@ <translation id="5892507820957994680">Überschreibt die integrierte Software-Rendering-Liste und aktiviert GPU Acceleration auf nicht unterstützten Systemkonfigurationen</translation> <translation id="5895138241574237353">Neu starten</translation> <translation id="5895187275912066135">Ausgestellt am</translation> -<translation id="5898154795085152510">Der Server hat ein ungültiges Clientzertifikat zurückgegeben. Fehler <ph name="ERROR_NUMBER" /> (<ph name="ERROR_NAME" />).</translation> <translation id="5900302528761731119">Google Profile-Foto</translation> <translation id="590253956165195626">Übersetzung von fremdsprachigen Seiten anbieten</translation> <translation id="5904093760909470684">Konfiguration</translation> @@ -3726,7 +3730,7 @@ <translation id="5963453369025043595"><ph name="NUM_HANDLES" /> (Spitzenwert <ph name="NUM_KILOBYTES_LIVE" />)</translation> <translation id="5965403572731919803">Zu Ablage hinzufügen...</translation> <translation id="5965661248935608907">Die Erweiterung legt auch fest, welche Seite bei der Suche über die Omnibox angezeigt wird oder wenn Sie auf die Schaltfläche "Startseite" klicken.</translation> -<translation id="5971037678316050792">Bluetooth-Adapterstatus und -Pairing steuern</translation> +<translation id="5971037678316050792">Bluetooth-Adapterstatus und -Kopplung steuern</translation> <translation id="5972017421290582825">MIDI-Einstellungen verwalten...</translation> <translation id="5972708806901999743">An den Anfang verschieben</translation> <translation id="5972826969634861500"><ph name="PRODUCT_NAME" /> starten</translation> @@ -3740,6 +3744,8 @@ <translation id="5984222099446776634">Kürzlich besucht</translation> <translation id="5984814259619230127">Bluetooth Low Energy-Erkennung für Smart Lock</translation> <translation id="5986245990306121338">Ist dies aktiviert, wird auch dann ein Tab-Wechsler angezeigt, wenn in den Einstellungen die Option "Tabs und Apps zusammen anzeigen" aktiviert ist.</translation> +<translation id="5989712527536636369"><ph name="BEGIN_PARAGRAPH1" />Hierbei handelt es sich um allgemeine Informationen über das Gerät und dessen Nutzung, z. B. Akkuladezustand, Häufigkeit der App-Nutzung, Qualität und Dauer von Netzwerkverbindungen (z. B. WLAN und Bluetooth) und Absturzberichte, wenn etwas nicht so funktioniert wie es sollte. Sie werden genutzt, um die Produkte und Dienste von Google für alle zu verbessern. Einige zusammengefasste Informationen werden ebenfalls von Partnern, wie Android-Entwicklern, genutzt, um ihre Apps und Produkte zu verbessern.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Sie können diese Funktion jederzeit in den Einstellungen für Android-Apps aktivieren oder deaktivieren. Dies hat keine Auswirkungen auf die Fähigkeit des Geräts, Daten für notwendige Dienste wie Systemupdates und Sicherheitsfunktionen zu senden.<ph name="END_PARAGRAPH2" /></translation> <translation id="5990198433782424697">Erweiterungen unter URLs, die mit chrome:// beginnen</translation> <translation id="5990814808592353318">Manuelle Passwortgenerierung.</translation> <translation id="5991049340509704927">Vergrößern</translation> @@ -3753,6 +3759,7 @@ <translation id="6005695835120147974">Media Router</translation> <translation id="6007237601604674381">Fehler beim Verschieben. <ph name="ERROR_MESSAGE" /></translation> <translation id="6008241731410823808">Sendet Pings zur Hyperlinküberprüfung.</translation> +<translation id="6011449291337289699">Websitedaten löschen</translation> <translation id="6015796118275082299">Jahr</translation> <translation id="6016551720757758985">Powerwash und Zurücksetzen auf vorherige Version bestätigen</translation> <translation id="6016809788585079594">Sagen Sie noch ein letztes Mal "Ok Google".</translation> @@ -3905,7 +3912,7 @@ <translation id="6232017090690406397">Akku</translation> <translation id="6237816943013845465">Ermöglicht die Anpassung der Bildschirmauflösung</translation> <translation id="6239558157302047471">&Frame neu laden</translation> -<translation id="6241530762627360640">Auf Informationen zu Bluetooth-Geräten mit Pairing mit Ihrem System zugreifen und Bluetooth-Geräte in der Nähe finden</translation> +<translation id="6241530762627360640">Informationen zu mit ihrem System gekoppelten Bluetooth-Geräten abrufen und Bluetooth-Geräte in der Nähe finden</translation> <translation id="6243774244933267674">Server nicht verfügbar</translation> <translation id="6245220622116401744">Ausführen von Flash für Websites zulassen</translation> <translation id="6246413617632217567">Der betreute Nutzer konnte nicht importiert werden. Bitte überprüfen Sie Ihren Festplattenspeicherplatz und Ihre Berechtigungen und versuchen Sie es noch einmal.</translation> @@ -3942,7 +3949,6 @@ <translation id="6276301056778294989">Vergewissern Sie sich, dass auf dem Gerät derselbe Code angezeigt wird.</translation> <translation id="6277105963844135994">Zeitüberschreitung im Netzwerk</translation> <translation id="6277518330158259200">Screenshot &erstellen</translation> -<translation id="6278428485366576908">Design</translation> <translation id="6279183038361895380">Zum Einblenden des Cursors |<ph name="ACCELERATOR" />| drücken</translation> <translation id="6280215091796946657">Mit einem anderen Konto anmelden</translation> <translation id="6280912520669706465">ARC</translation> @@ -4194,6 +4200,7 @@ <translation id="6607272825297743757">Dateiinformationen</translation> <translation id="6607831829715835317">Weitere Too&ls</translation> <translation id="6608140561353073361">Alle Cookies und Websitedaten...</translation> +<translation id="6610183966322615106">Fehler beim Hinzufügen des Druckers</translation> <translation id="6610610633807698299">URL eingeben...</translation> <translation id="6612358246767739896">Geschützte Inhalte</translation> <translation id="6615455863669487791">Zeigen</translation> @@ -4257,7 +4264,6 @@ <translation id="6708242697268981054">Ursprung:</translation> <translation id="6709357832553498500">Über <ph name="EXTENSIONNAME" /> verbinden</translation> <translation id="6710213216561001401">Zurück</translation> -<translation id="6712158998835983046">Alle anzeigen, animiert</translation> <translation id="6718273304615422081">Wird gezippt...</translation> <translation id="671928215901716392">Bildschirm sperren</translation> <translation id="6721972322305477112">&Ablage</translation> @@ -4528,7 +4534,6 @@ <translation id="7088434364990739311">Update-Prüfung konnte nicht gestartet werden. Fehlercode: <ph name="ERROR" /></translation> <translation id="708856090370082727">Overscroll-Unterstützung für Bildschirmtastatur aktivieren. Wenn dieses Kästchen angeklickt ist, passt die Bildschirmtastatur nur die Größe des visuellen Darstellungsbereichs an.</translation> <translation id="7088674813905715446">Die Bereitstellung dieses Geräts wurde vom Administrator aufgehoben. Bitten Sie Ihren Administrator, es als ausstehend zu kennzeichnen, um es für die Registrierung zu aktivieren.</translation> -<translation id="7089609847854449639">Speichermanager</translation> <translation id="708969677220991657">Anfragen an localhost über HTTPS sind zulässig, auch wenn ein ungültiges Zertifikat übermittelt wird.</translation> <translation id="7092106376816104">Ausnahmen für Pop-ups</translation> <translation id="7093866338626856921">Daten mit den Geräten mit folgenden Namen austauschen: <ph name="HOSTNAMES" /></translation> @@ -4568,7 +4573,7 @@ <translation id="715118844758971915">Klassische Drucker</translation> <translation id="7154130902455071009">Startseite in <ph name="START_PAGE" /> ändern</translation> <translation id="7155171745945906037">Vorhandenes Foto von der Kamera oder als Datei</translation> -<translation id="715568033737470079">PPAPI-Plug-ins angeben, die gemäß der Richtlinie zur Win32k-Sperrung in der Sandbox ausgeführt werden (nur Windows 10 und höher).</translation> +<translation id="7155226869555939647">Links für <ph name="APPLICATION" /> immer öffnen</translation> <translation id="7156235233373189579">Diese Datei wurde für einen PC mit Windows-Software entwickelt und ist nicht mit Ihrem Chrome OS-Gerät kompatibel. Suchen Sie im <ph name="BEGIN_LINK" />Chrome Web Store<ph name="END_LINK" /> nach einer geeigneten Ersatz-App. <ph name="BEGIN_LINK_HELP" />Weitere Informationen<ph name="END_LINK_HELP" /></translation> <translation id="7157063064925785854">Durch Klicken auf "Weiter" stimmen Sie den <ph name="LEGAL_DOC_LINK_TEXT_1" />, <ph name="LEGAL_DOC_LINK_TEXT_2" />, <ph name="LEGAL_DOC_LINK_TEXT_3" /> und der <ph name="LEGAL_DOC_LINK_TEXT_4" /> zu.</translation> <translation id="7158238151765743968">Es wird weiterhin versucht, eine Verbindung zu "<ph name="DEVICE_NAME" />" herzustellen.</translation> @@ -4583,6 +4588,7 @@ <translation id="7175353351958621980">Geladen von:</translation> <translation id="7180611975245234373">Aktualisieren</translation> <translation id="7180865173735832675">Anpassen</translation> +<translation id="7181387261278441780">Löschen und Zurücksetzen für Website</translation> <translation id="7185078796915954712">TLS 1.3</translation> <translation id="7185690883425432021">Blendet die Schaltflächen zum Schließen inaktiver Tabs aus, wenn die Tab-Leiste gestapelt ist.</translation> <translation id="7186088072322679094">In Symbolleiste behalten</translation> @@ -4615,7 +4621,6 @@ <translation id="7223775956298141902">Es sind keine Erweiterungen vorhanden :-(.</translation> <translation id="7224023051066864079">Subnetzmaske:</translation> <translation id="7225179976675429563">Netzwerktyp fehlt.</translation> -<translation id="7230191962699768124">Alle anzeigen, nicht animiert</translation> <translation id="7230787553283372882">Textgröße anpassen</translation> <translation id="7231224339346098802">Geben Sie eine Zahl ein, um die Anzahl der zu druckenden Exemplare festzulegen (1 oder mehr).</translation> <translation id="7238585580608191973">SHA-256-Fingerabdruck</translation> @@ -4750,7 +4755,6 @@ <translation id="7409233648990234464">Neustart und Powerwash</translation> <translation id="7409836189476010449">Flash ausführen</translation> <translation id="7410344089573941623">Nachfragen, wenn <ph name="HOST" /> auf Kamera und Mikrofon zugreifen möchte</translation> -<translation id="7411343637221933631">{NUM_COOKIES,plural, =1{1 von dieser Website}other{# von dieser Website}}</translation> <translation id="7412226954991670867">GPU-Speicher</translation> <translation id="7416362041876611053">Unbekannter Netzwerkfehler</translation> <translation id="7417453074306512035">Äthiopische Tastatur</translation> @@ -4788,7 +4792,7 @@ <translation id="7463006580194749499">Person hinzufügen</translation> <translation id="7464490149090366184">Fehler beim Zippen, Element bereits vorhanden: "$1"</translation> <translation id="7465778193084373987">URL zum Zurückrufen von Netscape-Zertifikaten</translation> -<translation id="7469206789121791392"><ph name="CHROME_EXTENSION_NAME" /> möchte ein Pairing durchführen mit:</translation> +<translation id="7469206789121791392"><ph name="CHROME_EXTENSION_NAME" /> möchte sich koppeln mit:</translation> <translation id="7469894403370665791">Verbindung zu diesem Netzwerk automatisch herstellen</translation> <translation id="747114903913869239">Fehler: Erweiterung kann nicht entschlüsselt werden.</translation> <translation id="7472639616520044048">MIME-Typen:</translation> @@ -4872,6 +4876,7 @@ <translation id="756445078718366910">Browserfenster öffnen</translation> <translation id="7564847347806291057">Prozess beenden</translation> <translation id="7566723889363720618">F12</translation> +<translation id="7567314848159753396">Cookie <ph name="NAME" /></translation> <translation id="756809126120519699">Gelöschte Chrome-Daten</translation> <translation id="7568790562536448087">Aktualisierung läuft</translation> <translation id="7573172247376861652">Akkustand</translation> @@ -4912,6 +4917,7 @@ <translation id="7626009897377900107">Passwortgenerierung</translation> <translation id="7627262197844840899">MasterCard wird von dieser Website nicht akzeptiert.</translation> <translation id="7627790789328695202">Hoppla, <ph name="FILE_NAME" /> existiert bereits. Geben Sie einen anderen Namen ein und versuchen Sie es erneut.</translation> +<translation id="7628127343934101653">PDF-Dateien im Standard-PDF-Viewer öffnen.</translation> <translation id="762917759028004464">Der Standardbrowser ist momentan <ph name="BROWSER_NAME" />.</translation> <translation id="7629536005696009600">Zulassen, dass für Android-Apps gespeicherte Anmeldedaten auf den entsprechenden Websites eingegeben werden</translation> <translation id="7629827748548208700">Tab: <ph name="TAB_NAME" /></translation> @@ -5078,7 +5084,7 @@ <translation id="786073089922909430">Dienst: <ph name="ARC_PROCESS_NAME" /></translation> <translation id="7861215335140947162">&Downloads</translation> <translation id="7864539943188674973">Bluetooth deaktivieren</translation> -<translation id="786957569166715433">Pairing mit <ph name="DEVICE_NAME" /> durchgeführt</translation> +<translation id="786957569166715433"><ph name="DEVICE_NAME" /> – gekoppelt</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> @@ -5092,7 +5098,7 @@ <translation id="7885253890047913815">Letzte Ziele</translation> <translation id="7887192723714330082">Auf "Ok Google" reagieren, wenn das Display eingeschaltet und entsperrt ist</translation> <translation id="7887334752153342268">Duplizieren</translation> -<translation id="7887864092952184874">Pairing mit Bluetooth-Maus durchgeführt</translation> +<translation id="7887864092952184874">Bluetooth-Maus ist gekoppelt</translation> <translation id="7892100671754994880">Nächster Nutzer</translation> <translation id="7892500982332576204">Unterkontoerkennung</translation> <translation id="7893008570150657497">Auf Fotos, Musik und andere Medien auf Ihrem Computer zugreifen</translation> @@ -5140,6 +5146,7 @@ <translation id="7957513156576779045">Aktivieren Sie Bluetooth, um das Pairing zuzulassen</translation> <translation id="7957615753207896812">Einstellungen für Tastaturgerät öffnen</translation> <translation id="7959074893852789871">Die Datei enthielt mehrere Zertifikate, von denen einige nicht importiert wurden:</translation> +<translation id="7959700692661109221"><ph name="BEGIN_PARAGRAPH" />Der Google-Standortdienst nutzt Quellen wie WLAN, um den Standort Ihres Geräts schneller und genauer einschätzen zu können. Wenn Sie Google-Standortdienste aktivieren, schaltet das Gerät in einen Modus, in dem WLAN verwendet wird, um Standortinformationen bereitzustellen. Sie können dies jederzeit in den Standorteinstellungen deaktivieren.<ph name="END_PARAGRAPH" /></translation> <translation id="7961015016161918242">Nie</translation> <translation id="7964089325405904043">Import und Export von Passwörtern</translation> <translation id="7965010376480416255">Gemeinsamer Speicher</translation> @@ -5290,6 +5297,7 @@ <translation id="8146793085009540321">Fehler bei der Anmeldung. Bitte wenden Sie sich an Ihren Administrator oder versuchen Sie es noch einmal.</translation> <translation id="8148264977957212129">Pinyin-Eingabemethode</translation> <translation id="8148913456785123871">Google Now-Karten im Launcher anzeigen</translation> +<translation id="8150391391298684512">Windows Runtime MIDI API deaktivieren</translation> <translation id="8151185429379586178">Entwickler-Tools</translation> <translation id="8151638057146502721">Konfigurieren</translation> <translation id="8151639108075998630">Gastmodus aktivieren</translation> @@ -5570,6 +5578,7 @@ <translation id="8532294913309524834">Bestellen Sie Sprachen auf Grundlage Ihrer Einstellung.</translation> <translation id="8535005006684281994">Verlängerungs-URL für Netscape-Zertifikate</translation> <translation id="8539727552378197395">Nein (nur HTTP)</translation> +<translation id="8541084862688000575">Android-Apps automatisch laden</translation> <translation id="8543181531796978784">Sie können ein <ph name="BEGIN_ERROR_LINK" />Erkennungsproblem melden<ph name="END_ERROR_LINK" /> oder, wenn Sie die Sicherheitsrisiken kennen, <ph name="BEGIN_LINK" />diese unsichere Website aufrufen<ph name="END_LINK" />.</translation> <translation id="8545107379349809705">Infos ausblenden...</translation> <translation id="8545211332741562162">Webseiten können experimentelle JavaScript-Funktionen nutzen.</translation> @@ -5597,7 +5606,6 @@ <translation id="8569764466147087991">Zu öffnende Datei auswählen</translation> <translation id="8571032220281885258">Wenn Sie "Ok Google" sagen, sucht Chrome nach den Begriffen, die Sie danach sagen.</translation> <translation id="8571108619753148184">Server 4</translation> -<translation id="8572832761467613633">Nur Flash</translation> <translation id="8572981282494768930">Websites dürfen nicht auf Ihre Kamera und Ihr Mikrofon zugreifen.</translation> <translation id="8574234089711453001">Zulassen, dass beim Öffnen einer Seite mit einer Medien-URL eine Schaltfläche "Herunterladen" eingeblendet wird.</translation> <translation id="857779305329188634">Aktivierung der Unterstützung des experimentellen QUIC-Protokolls</translation> @@ -5619,8 +5627,9 @@ <translation id="8600929685092827187">Bei Paketempfang Ruhemodus beenden</translation> <translation id="8601206103050338563">TLS-WWW-Client-Authentifizierung</translation> <translation id="8602851771975208551">Ein anderes Programm auf Ihrem Computer hat eine App hinzugefügt, die sich möglicherweise auf die Funktionsweise von Chrome auswirkt.</translation> +<translation id="8603912787021349466">Android-Apps nach dem Anmelden automatisch starten lassen</translation> <translation id="8605428685123651449">SQLite-Speicher</translation> -<translation id="8605503133013456784">Das Pairing mit "<ph name="DEVICE_NAME" />" konnte nicht aufgehoben und die Verbindung nicht getrennt werden.</translation> +<translation id="8605503133013456784">"<ph name="DEVICE_NAME" />" konnte nicht entkoppelt und die Verbindung nicht getrennt werden.</translation> <translation id="8606726445206553943">Ihre MIDI-Geräte verwenden</translation> <translation id="8609465669617005112">Nach oben</translation> <translation id="8610892630019863050">Nachfragen, wenn eine Website Benachrichtigungen anzeigen möchte (empfohlen)</translation> @@ -5971,6 +5980,7 @@ <translation id="9053965862400494292">Bei der Einrichtung der Synchronisierung ist ein Fehler aufgetreten.</translation> <translation id="9056034633062863292">Chromebox aktualisieren</translation> <translation id="9056810968620647706">Keine Übereinstimmungen gefunden.</translation> +<translation id="9057119625587205566">Keine Drucker in der Nähe</translation> <translation id="9059868303873565140">Statusmenü</translation> <translation id="9064142312330104323">Google Profile-Foto (wird geladen)</translation> <translation id="9064275926664971810">AutoFill aktivieren, um Webformulare mit nur einem Klick auszufüllen</translation> @@ -5981,6 +5991,7 @@ <translation id="9067401056540256169">Dieser Parameter macht Chrome unsicher und sollte nur verwendet werden, wenn Sie mit seiner Funktionsweise vertraut sind. Beachten Sie, dass diese Option ohne Vorankündigung entfernt werden kann. Solange die Option aktiviert ist, können Frames mit HTTPS-Ursprung WebSockets mit einer unsicheren URL wie ws:// verwenden.</translation> <translation id="9068931793451030927">Pfad:</translation> <translation id="9070219033670098627">Person wechseln</translation> +<translation id="9070940116164932228">Teure Hintergrund-Timer drosseln</translation> <translation id="907148966137935206">Anzeige von Pop-ups für keine Website zulassen (empfohlen)</translation> <translation id="9072550133391925347">Mit <ph name="PASSWORD_MANAGER_BRAND" /> werden Sie mit Ihren gespeicherten Passwörtern automatisch auf allen entsprechenden Websites und Apps angemeldet.</translation> <translation id="9073281213608662541">PAP</translation> @@ -6014,6 +6025,7 @@ <translation id="9112614144067920641">Wählen Sie eine neue PIN.</translation> <translation id="9112748030372401671">Hintergrundbild ändern</translation> <translation id="9112987648460918699">Suchen...</translation> +<translation id="9114663181201435112">Einfach anmelden</translation> <translation id="9115487443206954631">Cast-Geräte verwalten</translation> <translation id="9115675100829699941">&Lesezeichen</translation> <translation id="9121814364785106365">In angeheftetem Tab öffnen</translation> @@ -6108,7 +6120,6 @@ <translation id="952992212772159698">Nicht aktiviert</translation> <translation id="960719561871045870">Betreibercode</translation> <translation id="960987915827980018">Noch etwa 1 Stunde</translation> -<translation id="962778376131245616">Nur nicht sicher, animiert anzeigen</translation> <translation id="96421021576709873">WLAN-Netzwerk</translation> <translation id="965490406356730238">Aktiviert die hardwarebeschleunigte MJPEG-Decodierung für erfasste Frames, falls verfügbar</translation> <translation id="968174221497644223">Cache</translation>
diff --git a/chrome/app/resources/generated_resources_el.xtb b/chrome/app/resources/generated_resources_el.xtb index 396770b..83494088 100644 --- a/chrome/app/resources/generated_resources_el.xtb +++ b/chrome/app/resources/generated_resources_el.xtb
@@ -18,7 +18,6 @@ <translation id="1029317248976101138">Μεγέθυνση</translation> <translation id="1029595648591494741">Δοκιμή της επέκτασης "<ph name="EXTENSION_NAME" />";</translation> <translation id="1031362278801463162">Φόρτωση προεπισκόπησης</translation> -<translation id="1031460590482534116">Παρουσιάστηκε σφάλμα κατά την αποθήκευση του πιστοποιητικού πελάτη. Σφάλμα <ph name="ERROR_NUMBER" /> (<ph name="ERROR_NAME" />).</translation> <translation id="1031573127485938293">Να γίνεται ερώτηση (από την πολιτική)</translation> <translation id="103279545524624934">Ελευθερώστε χώρο στον δίσκο, για την εκκίνηση εφαρμογών Android.</translation> <translation id="1033780634303702874">Πρόσβαση στις σειριακές συσκευές</translation> @@ -101,6 +100,7 @@ <translation id="1128591060186966949">Επεξεργασία μηχανής αναζήτησης</translation> <translation id="1128987120443782698">Η συσκευή αποθήκευσης έχει χωρητικότητα <ph name="DEVICE_CAPACITY" />. Εισαγάγετε μια κάρτα SD ή μια συσκευή αποθήκευσης USB με χωρητικότητα 4GB ή μεγαλύτερη.</translation> <translation id="1137135726305341424">Το domContentLoaded και όλες οι φορτώσεις πόρων που ξεκίνησαν πριν από το domContentLoaded (κύριο πλαίσιο και iframe ίδιας προέλευσης).</translation> +<translation id="1138663153846032155">Να προτιμάται HTML αντί του Flash</translation> <translation id="1140351953533677694">Πρόσβαση στις συσκευές Bluetooth και τις σειριακές συσκευές</translation> <translation id="114140604515785785">Κατάλογος ρίζας επέκτασης: </translation> <translation id="1143142264369994168">Υπηρεσία υπογραφής πιστοποιητικού</translation> @@ -253,6 +253,7 @@ <translation id="1351692861129622852">Εισαγωγή <ph name="FILE_COUNT" /> αρχείων…</translation> <translation id="1352103415082130575">Πληκτρολόγιο Ταϊλανδικών (Pattachote)</translation> <translation id="1353686479385938207"><ph name="PROVIDER_NAME" />: <ph name="NETWORK_NAME" /></translation> +<translation id="1353946958707294039">Διαχείριση αποθηκευτικού χώρου Material Design</translation> <translation id="1353966721814789986">Σελίδες εκκίνησης</translation> <translation id="1354868058853714482">Το Adobe Reader έχει λήξει και ενδέχεται να μην είναι ασφαλές.</translation> <translation id="1355408554203439639">Πρόγραμμα επεξεργασίας ράστερ τρισδιάστατου λογισμικού</translation> @@ -425,7 +426,6 @@ <translation id="1533920822694388968">Ευθυγράμμιση τηλεόρασης</translation> <translation id="15373452373711364">Μεγάλος δείκτης ποντικιού</translation> <translation id="1543284117603151572">Εισαγωγή από το Edge</translation> -<translation id="1544350195767834591">{NUM_COOKIES,plural, =1{1 από άλλους ιστότοπους}other{# από άλλους ιστότοπους}}</translation> <translation id="1545177026077493356">Αυτόματη λειτουργία kiosk</translation> <translation id="1545786162090505744">URL με % στη θέση του ερωτήματος</translation> <translation id="1546280085599573572">Αυτή η επέκταση άλλαξε τη σελίδα που εμφανίζεται όταν κάνετε κλικ στο κουμπί αρχικής σελίδας.</translation> @@ -449,7 +449,6 @@ <translation id="1559235587769913376">Εισαγωγή χαρακτήρων Unicode</translation> <translation id="1561092721008294962">HarfBuzz για κείμενο διεπαφής χρήστη</translation> <translation id="1566049601598938765">Ιστότοπος</translation> -<translation id="1566958206723629112">Flash και PDF</translation> <translation id="1567723158593978621">Όταν είναι ενεργό, η σύνδεση στο πρόγραμμα περιήγησης θα κάνει χρήση μιας νέας ροής σύνδεσης που είναι διαχωρισμένη με κωδικό πρόσβασης gaia.</translation> <translation id="1567993339577891801">Κονσόλα JavaScript</translation> <translation id="1568323446248056064">Άνοιγμα των ρυθμίσεων οθόνης της συσκευής</translation> @@ -578,7 +577,6 @@ <translation id="1723940674997333416">Να επιτρέπονται μη ασφαλή πρωτόκολλα WebSocket με προέλευση https</translation> <translation id="1725149567830788547">Εμφάνιση &στοιχείων ελέγχου</translation> <translation id="172612876728038702">Ρυθμίζεται το TPM. Αυτό μπορεί να διαρκέσει λίγα λεπτά.</translation> -<translation id="1727135806684246609">Λεπτομερείς πληροφορίες υλικού ασφάλειας</translation> <translation id="1729533290416704613">Επίσης, ελέγχει τη σελίδα που εμφανίζεται όταν κάνετε αναζήτηση από το κύριο πλαίσιο.</translation> <translation id="1731346223650886555">Ερωτηματικό</translation> <translation id="1731589410171062430">Σύνολο: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /> (<ph name="NUMBER_OF_PAGES" /> <ph name="PAGE_OR_PAGES_LABEL" />)</translation> @@ -876,6 +874,7 @@ <translation id="218492098606937156">Ενεργοποίηση συμβάντων αφής</translation> <translation id="2187317261103489799">Εντοπισμός (προεπιλογή)</translation> <translation id="2187895286714876935">Σφάλμα εισαγωγής του πιστοποιητικού διακομιστή </translation> +<translation id="2188881192257509750">Άνοιγμα <ph name="APPLICATION" /></translation> <translation id="2190069059097339078">Εργαλείο λήψης διαπιστευτηρίων Wi-Fi</translation> <translation id="219008588003277019">Λειτουργική μονάδα Native Client: <ph name="NEXE_NAME" /></translation> <translation id="2190355936436201913">(κενό)</translation> @@ -994,6 +993,7 @@ <translation id="2326606747676847821">Ανώνυμη περιήγηση</translation> <translation id="2326931316514688470">Ε&πανάληψη φόρτωσης εφαρμογής</translation> <translation id="2327492829706409234">Ενεργοποίηση εφαρμογής</translation> +<translation id="2328054044222305089">Με αυτόν τον τρόπο, θα διαγραφούν όλα τα δεδομένα που αποθηκεύτηκαν στη συσκευή σας από τον ιστότοπο <ph name="SITE" /> και θα γίνει επαναφορά όλων των δικαιωμάτων εκτέλεσης που έχετε εκχωρήσει. Θέλετε να συνεχίσετε;</translation> <translation id="2329597144923131178">Συνδεθείτε για χρήση σελιδοδεικτών, ιστορικού, κωδ.πρόσβ. κ.λπ. σε όλες τις συσκευές.</translation> <translation id="2332131598580221120">Προβολή στο Web Store</translation> <translation id="2332742915001411729">Επαναφορά προεπιλογής</translation> @@ -1269,7 +1269,6 @@ <translation id="2675358154061544447">Άκρως πειραματική υποστήριξη για την απόδοση iframe σε ολόκληρο τον ιστότοπο σε ξεχωριστές διαδικασίες. Σε αυτήν τη λειτουργία, τα έγγραφα μοιράζονται μια διαδικασία λειτουργίας απόδοσης, μόνο αν προέρχονται από τον ίδιο ιστότοπο.</translation> <translation id="2676946222714718093">Αναπαραγωγή σε</translation> <translation id="2678063897982469759">Εκ νέου ενεργοποίηση</translation> -<translation id="2678246812096664977">Όλες οι προσθήκες</translation> <translation id="2679385451463308372">Εκτυπώστε χρησιμοποιώντας το παράθυρο διαλόγου του συστήματος...</translation> <translation id="2680208403056680091">Η σύνδεσή σας στο διαδίκτυο βρίσκεται υπό παρακολούθηση</translation> <translation id="268053382412112343">Ιστορικό</translation> @@ -1443,7 +1442,6 @@ <translation id="287286579981869940">Προσθήκη <ph name="PROVIDER_NAME" />…</translation> <translation id="2872961005593481000">Τερματισμός λειτουργίας</translation> <translation id="2875698561019555027">(Σελίδες σφαλμάτων Chrome)</translation> -<translation id="2879560882721503072">Η αποθήκευση του πιστοποιητικού πελάτη που εκδόθηκε από τον εκδότη <ph name="ISSUER" /> έγινε με επιτυχία.</translation> <translation id="288024221176729610">Τσεχικά </translation> <translation id="288042212351694283">Πρόσβαση στις συσκευές με Universal 2nd Factor</translation> @@ -1594,6 +1592,7 @@ <translation id="3057861065630527966">Δημιουργία αντιγράφων ασφαλείας για τις φωτογραφίες και τα βίντεό σας</translation> <translation id="3058212636943679650">Αν χρειαστεί κάποια στιγμή να επαναφέρετε το λειτουργικό σύστημα του υπολογιστή σας, θα χρειαστείτε μια κάρτα SD ή μια συσκευή αποθήκευσης USB.</translation> <translation id="305932878998873762">Η Simple Cache για HTTP είναι μια νέα προσωρινή μνήμη. Βασίζεται στο σύστημα αρχείων για την κατανομή χώρου στο δίσκο.</translation> +<translation id="3060251871394327123">Με αυτόν τον τρόπο, θα διαγραφούν όλα τα δεδομένα που αποθηκεύτηκαν στη συσκευή σας από τον ιστότοπο <ph name="SITE" />. Θέλετε να συνεχίσετε;</translation> <translation id="3061650404498811439">Ενεργοποιήστε την πρόσβαση σε emoji, χειρόγραφο και φωνητικές εντολές από το μενού IME συμμετοχής.</translation> <translation id="3062606427884046423">Να χρησιμοποιείτε τις ειδοποιήσεις Android MediaStyle για τις ειδοποιήσεις μέσων του Chrome.</translation> <translation id="3063844757726132584">Αποκτήστε πρόσβαση σε όλες τις εφαρμογές σας από αυτήν την πρακτική εφαρμογή εκκίνησης. Παίξτε παιχνίδια, συνομιλήστε μέσω βίντεο, ακούστε μουσική, επεξεργαστείτε έγγραφα ή αποκτήστε περισσότερες εφαρμογές.</translation> @@ -1643,6 +1642,7 @@ <translation id="3123569374670379335">(Εποπτευόμενο)</translation> <translation id="3124111068741548686">Χειρισμοί ΧΡΗΣΤΗ</translation> <translation id="3126026824346185272">Ctrl</translation> +<translation id="3127156390846601284">Με αυτόν τον τρόπο, θα διαγραφούν όλα τα δεδομένα που έχουν αποθηκευτεί στη συσκευή σας για όλους τους εμφανιζόμενους ιστότοπους. Θέλετε να συνεχίσετε;</translation> <translation id="312759608736432009">Κατασκευαστής συσκευής:</translation> <translation id="3127919023693423797">Έλεγχος ταυτότητας...</translation> <translation id="3128230619496333808">Καρτέλα 6</translation> @@ -1742,7 +1742,6 @@ <translation id="3264544094376351444">Γραμματοσειρά Sans-serif</translation> <translation id="3264547943200567728">Η ρύθμιση του δικτύου του Chromebox σας απέτυχε</translation> <translation id="3265459715026181080">Κλείσιμο παραθύρου</translation> -<translation id="3267271790328635957">Μόνο PDF</translation> <translation id="3267726687589094446">Να συνεχίσει να επιτρέπεται η αυτόματη λήψη πολλών αρχείων</translation> <translation id="3267998849713137817">Τροποποιημένη ώρα</translation> <translation id="3268451620468152448">Ανοικτές καρτέλες</translation> @@ -1990,6 +1989,7 @@ <translation id="3574305903863751447"><ph name="CITY" />, <ph name="STATE" /> <ph name="COUNTRY" /></translation> <translation id="357479282490346887">Λιθουανικά </translation> +<translation id="3575927481544652747">Απενεργοποίηση του API Windows Runtime MIDI για WebMIDI, το οποίο είναι ενεργοποιημένο από προεπιλογή στα Windows 10 ή σε μεταγενέστερες εκδόσεις.</translation> <translation id="3576324189521867626">Εγκαταστάθηκε επιτυχώς</translation> <translation id="3578331450833904042">Προεπιλογή (επιλογή όλων)</translation> <translation id="3578594933904494462">Το περιεχόμενο αυτής της ετικέτας είναι κοινόχρηστο.</translation> @@ -2043,8 +2043,6 @@ <translation id="3627320433825461852">Απομένει λιγότερο από 1 λεπτό</translation> <translation id="3627588569887975815">Άνοιγμα συνδέσμου σε παράθυρο inco&gnito</translation> <translation id="3627671146180677314">Χρόνος ανανέωσης πιστοποιητικού Netscape</translation> -<translation id="3629326610814700057">Επιτρέπει στη διαχείριση αποθηκευτικού χώρου να διαχειρίζεται τον τοπικό αποθηκευτικό χώρο.</translation> -<translation id="3630337581925712713"><ph name="PERMISSION_TYPE_LABEL" />:</translation> <translation id="3631337165634322335">Οι παρακάτω εξαιρέσεις ισχύουν μόνο για την τρέχουσα συνεδρία ανώνυμης περιήγησης.</translation> <translation id="3633586230741134985">Ρυθμίσεις λειτουργίας εκκίνησης εφαρμογών</translation> <translation id="3633997706330212530">Μπορείτε προαιρετικά να απενεργοποιήσετε αυτές τις υπηρεσίες.</translation> @@ -2067,7 +2065,8 @@ <translation id="3654045516529121250">Ανάγνωση των ρυθμίσεων προσβασιμότητας</translation> <translation id="3654092442379740616">Σφάλμα συγχρονισμού: Το <ph name="PRODUCT_NAME" /> πρέπει να ενημερωθεί.</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{Έχει μόνιμη πρόσβαση σε ένα αρχείο.}other{Έχει μόνιμη πρόσβαση σε # αρχεία.}}</translation> -<translation id="3657468915905674858">Ενεργοποίηση του κλειδώματος PPAPI Win32k.</translation> +<translation id="365793796291733849"><ph name="BEGIN_PARAGRAPH1" />Όταν ενεργοποιείτε την αυτόματη δημιουργία αντιγράφων ασφαλείας, τα δεδομένα συσκευής και εφαρμογών αποθηκεύονται ανά τακτά χρονικά διαστήματα σε έναν ιδιωτικό φάκελο στο Google Drive. Τα δεδομένα εφαρμογών ενδέχεται να είναι οποιαδήποτε δεδομένα έχει αποθηκεύσει μια εφαρμογή (βάσει των ρυθμίσεων προγραμματιστή), συμπεριλαμβανομένων δυνητικά ευαίσθητων δεδομένων όπως οι επαφές, τα μηνύματα και οι φωτογραφίες.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Τα δεδομένα αντιγράφων ασφαλείας δεν υπολογίζονται στο όριο του αποθηκευτικού σας χώρου στο Drive. Δεν θα δημιουργούνται αντίγραφα ασφαλείας για μεγάλα αρχεία ή για αρχεία που έχουν επιλέξει οι προγραμματιστές για εξαίρεση από την υπηρεσία.<ph name="END_PARAGRAPH2" /></translation> <translation id="3660234220361471169">Μη αξιόπιστα</translation> <translation id="3665589677786828986">Το Chrome διαπιστώσαμε ότι ορισμένες από τις ρυθμίσεις σας καταστράφηκαν από άλλο πρόγραμμα και τις επανέφερε στις αρχικές τους προεπιλογές.</translation> <translation id="3665842570601375360">Ασφάλεια:</translation> @@ -2122,6 +2121,7 @@ <translation id="3733127536501031542">Διακομιστής SSL με αναβάθμιση</translation> <translation id="3736520371357197498">Εάν κατανοείτε τους κινδύνους για την ασφάλειά σας, μπορείτε να <ph name="BEGIN_LINK" />επισκεφτείτε αυτόν τον μη ασφαλή ιστότοπο<ph name="END_LINK" /> πριν από την κατάργηση των επικίνδυνων προγραμμάτων.</translation> <translation id="3738924763801731196"><ph name="OID" />:</translation> +<translation id="3739254215541673094">Άνοιγμα <ph name="APPLICATION" />;</translation> <translation id="3739798227959604811">Καθυστέρηση πριν την επανάληψη:</translation> <translation id="3741158646617793859">Το <ph name="DEVICE_NAME" /> θα εμφανίζεται πλέον στην Κονσόλα διαχειριστή</translation> <translation id="3741243925913727067">Δημιουργία αντιγράφων ασφαλείας για τις φωτογραφίες και τα βίντεο της συσκευής μέσων στο Google Drive.</translation> @@ -2361,7 +2361,6 @@ <translation id="4058793769387728514">Άμεσος Έλεγχος του Εγγράφου</translation> <translation id="4059285154003114015">Ε&κτύπωση πλαισίου…</translation> <translation id="406070391919917862">Εφαρμογές στο παρασκήνιο</translation> -<translation id="4061502419206152498">Να εμφανίζονται μόνο τα μη ασφαλή, μη κινούμενα στοιχεία</translation> <translation id="4062251648694601778">Απολαύστε τη χρήση της συσκευής <ph name="SHORT_PRODUCT_NAME" />. Έχετε απορίες. Μπορείτε να λαμβάνετε βοήθεια ανά πάσα στιγμή κάνοντας κλικ στο κουμπί "?" στην περιοχή κατάστασης.</translation> <translation id="4065876735068446555">Το δίκτυο που χρησιμοποιείτε (<ph name="NETWORK_ID" />) ενδέχεται να σας ζητήσει να επισκεφτείτε τη σελίδα σύνδεσής του.</translation> <translation id="4068506536726151626">Η σελίδα περιέχει στοιχεία από τους ακόλουθους ιστότοπους που παρακολουθούν τη θέση σας:</translation> @@ -2400,7 +2399,6 @@ <translation id="4101878899871018532">Η διαχείριση κωδικών πρόσβασης δεν θα σας προσφέρει την επιλογή αποθήκευσης των διαπιστευτηρίων που χρησιμοποιήθηκαν για το συγχρονισμό.</translation> <translation id="410351446219883937">Αυτόματη αναπαραγωγή</translation> <translation id="4104163789986725820">Ε&ξαγωγή...</translation> -<translation id="4105523032910086267">Ορίζει την κίνηση και την ορατότητα των αναλυτικών πληροφοριών ασφάλειας στο Material Design.</translation> <translation id="4105563239298244027">Αποκτήστε δωρεάν 1 TB με το Google Drive</translation> <translation id="4109135793348361820">Μετακίνηση παραθύρου στο χρήστη <ph name="USER_NAME" /> (<ph name="USER_EMAIL" />)</translation> <translation id="4110342520124362335">Τα cookie από τη διεύθυνση <ph name="DOMAIN" /> έχουν αποκλειστεί.</translation> @@ -2451,6 +2449,7 @@ <translation id="418179967336296930">Ρωσικό φωνητικό πληκτρολόγιο (YaZHert)</translation> <translation id="4181841719683918333">Γλώσσες</translation> <translation id="4187248015940562149">Ενεργοποιεί το Bluetooth ιστού, το οποίο ενδέχεται να επιτρέψει στους ιστότοπους να συνδέονται και να ελέγχουν τις κοντινές συσκευές Bluetooth.</translation> +<translation id="4188447344915957833">Ενεργοποιεί τη διαχείριση αποθηκευτικού χώρου στις ρυθμίσεις του Material Design.</translation> <translation id="4189406272289638749">Η επέκταση <b><ph name="EXTENSION_NAME" /></b>, ελέγχει αυτήν τη ρύθμιση.</translation> <translation id="4193154014135846272">Έγγραφο Google</translation> <translation id="4193182321948161343">Ενεργοποίηση Εργαλείου διαχείρισης χρηστών Material Design</translation> @@ -2658,6 +2657,7 @@ <translation id="4508765956121923607">Προβολή Πηγαίου Κώ&δικα</translation> <translation id="4509017836361568632">Απόρριψη φωτογραφίας</translation> <translation id="4509345063551561634">Τοποθεσία:</translation> +<translation id="4513946894732546136">Σχόλια</translation> <translation id="4514542542275172126">Ρύθμιση νέου εποπτευόμενου χρήστη</translation> <translation id="4514914692061505365">Υποχρεωτική χρήση του γρήγορου συστήματος μετάφρασης Subzero της PNaCl για όλα τα αρχεία pexe.</translation> <translation id="451515744433878153">Κατάργηση</translation> @@ -2756,6 +2756,7 @@ <translation id="4656293982926141856">Αυτός ο υπολογιστής</translation> <translation id="4656631038341342120">Ενεργοποίηση κελύφους VR εάν διατίθεται για αυτήν τη συσκευή.</translation> <translation id="4657031070957997341">Να επιτρέπονται πάντα οι προσθήκες στο <ph name="HOST" /></translation> +<translation id="466008749075469935">Ενεργοποιεί την παρέμβαση για τον περιορισμό της χρήσης των χρονιστών παρασκηνίου από τη CPU στο 1%.</translation> <translation id="4663254525753315077">Όταν είναι δυνατό, τοποθετεί τα περιεχόμενα κύλισης ενός στοιχείου κύλισης υπερχείλισης σε ένα σύνθετο επίπεδο για ταχύτερη κύλιση.</translation> <translation id="4664482161435122549">Σφάλμα εξαγωγής PKCS #12</translation> <translation id="4665014895760275686">Κατασκευαστής</translation> @@ -2825,6 +2826,7 @@ <translation id="4749157430980974800">Γεωργιανό πληκτρολόγιο</translation> <translation id="4750394297954878236">Προτάσεις</translation> <translation id="475088594373173692">Πρώτος χρήστης</translation> +<translation id="4750892496809949692">Να προτιμάται περιεχόμενο HTML μέσω της απόκρυψης του Flash από τη λίστα προσθηκών.</translation> <translation id="4750917950439032686">Οι πληροφορίες σας (για παράδειγμα, οι κωδικοί πρόσβασης ή οι αριθμοί πιστωτικών καρτών) είναι ιδιωτικές κατά την αποστολή σε αυτόν τον ιστότοπο.</translation> <translation id="4753602155423695878">Κινούμενη εικόνα γραμμής προόδου φόρτωσης σελίδας κινητού Android</translation> <translation id="4755240240651974342">Πληκτρολόγιο με φινλανδικούς χαρακτήρες</translation> @@ -3101,6 +3103,7 @@ <translation id="5119450342834678097">Επιλογή "Αίτημα τοποθεσίας tablet" στο μενού ρυθμίσεων</translation> <translation id="5120068803556741301">Μέθοδος εισόδου τρίτου μέρους</translation> <translation id="5120421890733714118">Να γίνεται αξιόπιστο αυτό το πιστοποιητικό για τον προσδιορισμό ιστοτόπων.</translation> +<translation id="5120516977819314347">Λανθασμένος αριθμός PIN ή κωδικός πρόσβασης.</translation> <translation id="5121130586824819730">Ο σκληρός σας δίσκος είναι πλήρης. Αποθηκεύστε σε άλλη τοποθεσία ή αδειάστε τον σκληρό δίσκο.</translation> <translation id="5125751979347152379">Μη έγκυρη διεύθυνση URL.</translation> <translation id="5127881134400491887">Διαχείριση συνδέσεων δικτύου</translation> @@ -3109,6 +3112,7 @@ <translation id="5129301143853688736">Η σύνδεσή σας με αυτόν τον ιστότοπο δεν είναι ιδιωτική. Ο τομέας <ph name="DOMAIN" /> ενδέχεται να δέχεται επίθεση από εισβολείς που προσπαθούν να υποκλέψουν τις πληροφορίες σας (για παράδειγμα, φωτογραφίες, κωδικούς πρόσβασης, μηνύματα και πιστωτικές κάρτες).</translation> <translation id="5129662217315786329">Πολωνικά </translation> +<translation id="5131347545782851480">Έγγραφα PDF</translation> <translation id="5134856901811723984">Material Design στη διεπαφή συστήματος του Chrome OS</translation> <translation id="5135533361271311778">Δεν ήταν δυνατή η δημιουργία αντικειμένου σελιδοδείκτη.</translation> <translation id="5136529877787728692">F7</translation> @@ -3277,6 +3281,7 @@ <translation id="5328031682234198929">8</translation> <translation id="5329858601952122676">&Διαγραφή</translation> <translation id="5330145655348521461">Αυτά τα αρχεία άνοιξαν σε διαφορετικό προφίλ. Μεταφερθείτε στο προφίλ <ph name="USER_NAME" /> (<ph name="MAIL_ADDRESS" />) για να τα δείτε.</translation> +<translation id="5330512191124428349">Λήψη πληροφοριών</translation> <translation id="5332624210073556029">Ζώνη ώρας:</translation> <translation id="5333807720589685258">Η κάρτα SIM θα απενεργοποιηθεί οριστικά αν δεν καταφέρετε να πληκτρολογήσετε το σωστό κλειδί ξεκλειδώματος PIN.</translation> @@ -3711,7 +3716,6 @@ <translation id="5892507820957994680">Παρακάμπτει τη λίστα απόδοσης ενσωματωμένου λογισμικού και επιτρέπει την επιτάχυνση GPU σε μη υποστηριζόμενες διαμορφώσεις συστημάτων.</translation> <translation id="5895138241574237353">Επανεκκίνηση</translation> <translation id="5895187275912066135">Εκδόθηκε την</translation> -<translation id="5898154795085152510">Ο διακομιστής επέστρεψε ένα μη έγκυρο πιστοποιητικό πελάτη. Σφάλμα <ph name="ERROR_NUMBER" /> (<ph name="ERROR_NAME" />).</translation> <translation id="5900302528761731119">Φωτογραφία προφίλ Google</translation> <translation id="590253956165195626">Να προτείνεται να μεταφράζονται οι σελίδες που δεν εμφανίζονται στη γλώσσα ανάγνωσής σας.</translation> <translation id="5904093760909470684">Διαμόρφωση διακομιστή μεσολάβησης</translation> @@ -3766,6 +3770,8 @@ <translation id="5984222099446776634">Πραγματοποιήθηκε επίσκεψη πρόσφατα</translation> <translation id="5984814259619230127">Smart Lock για εντοπισμό μέσω Bluetooth χαμηλής κατανάλωσης ενέργειας</translation> <translation id="5986245990306121338">Η λειτουργία εναλλαγής καρτελών, εάν έχει ενεργοποιηθεί, θα εμφανίζεται ακόμα και όταν η επιλογή "συγχώνευση καρτελών και εφαρμογών" είναι ενεργοποιημένη στις ρυθμίσεις.</translation> +<translation id="5989712527536636369"><ph name="BEGIN_PARAGRAPH1" />Αυτές είναι γενικές πληροφορίες σχετικά με τη συσκευή σας και τον τρόπο με τον οποίο τη χρησιμοποιείτε, όπως το επίπεδο της μπαταρίας, τη συχνότητα με την οποία χρησιμοποιείτε τις εφαρμογές σας, την ποιότητα και τη διάρκεια των συνδέσεων δικτύου (όπως Wi-Fi και Bluetooth), καθώς και αναφορές σφαλμάτων για τις περιπτώσεις όπου παρουσιάζονται προβλήματα. Αυτές οι πληροφορίες θα χρησιμοποιούνται για τη βελτίωση των προϊόντων και των υπηρεσιών της Google για όλους. Επιπλέον, ορισμένες συγκεντρωτικές πληροφορίες θα βοηθήσουν τους συνεργάτες μας, όπως τους προγραμματιστές Android, να βελτιώσουν τις εφαρμογές και τα προϊόντα τους.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Μπορείτε να ενεργοποιήσετε ή να απενεργοποιήσετε αυτήν την επιλογή ανά πάσα στιγμή από τις ρυθμίσεις εφαρμογών Android. Αυτό δεν επηρεάζει τη δυνατότητα της συσκευής να αποστέλλει τις πληροφορίες που χρειάζεται για τη λήψη σημαντικών υπηρεσιών όπως οι ενημερώσεις συστήματος και ασφαλείας.<ph name="END_PARAGRAPH2" /></translation> <translation id="5990198433782424697">Επεκτάσεις στο chrome:// Διευθύνσεις URL</translation> <translation id="5990814808592353318">Μη αυτόματη δημιουργία κωδικού πρόσβασης.</translation> <translation id="5991049340509704927">Μεγέθυνση</translation> @@ -3779,6 +3785,7 @@ <translation id="6005695835120147974">Δρομολογητής μέσων</translation> <translation id="6007237601604674381">Αποτυχία μετακίνησης. <ph name="ERROR_MESSAGE" /></translation> <translation id="6008241731410823808">Αποστέλλει ping ελέγχου υπερσυνδέσμου.</translation> +<translation id="6011449291337289699">Εκκαθάριση δεδομένων ιστότοπου</translation> <translation id="6015796118275082299">Έτος</translation> <translation id="6016551720757758985">Επιβεβαιώστε τη λειτουργία Powerwash με επιστροφή σε προηγούμενη έκδοση</translation> <translation id="6016809788585079594">Εκφωνήστε "Ok Google" για μία τελευταία φορά</translation> @@ -3968,7 +3975,6 @@ <translation id="6276301056778294989">Βεβαιωθείτε πως η συσκευή εμφανίζει τον ίδιο κωδικό.</translation> <translation id="6277105963844135994">Χρονικό όριο δικτύου</translation> <translation id="6277518330158259200">Λήψη στιγμιότυπου οθόνης</translation> -<translation id="6278428485366576908">Θέμα</translation> <translation id="6279183038361895380">Πιέστε |<ph name="ACCELERATOR" />| για να εμφανιστεί ο δρομέας</translation> <translation id="6280215091796946657">Συνδεθείτε με διαφορετικό λογαριασμό</translation> <translation id="6280912520669706465">ARC</translation> @@ -4220,6 +4226,7 @@ <translation id="6607272825297743757">Πληροφορίες αρχείου</translation> <translation id="6607831829715835317">Περισσότερα εργαλεία</translation> <translation id="6608140561353073361">Όλα τα cookie και τα δεδομένα ιστοτόπων...</translation> +<translation id="6610183966322615106">Σφάλμα κατά την προσθήκη εκτυπωτή</translation> <translation id="6610610633807698299">Εισαγωγή διεύθυνσης URL:</translation> <translation id="6612358246767739896">Προστατευμένο περιεχόμενο</translation> <translation id="6615455863669487791">Εμφάνιση</translation> @@ -4283,7 +4290,6 @@ <translation id="6708242697268981054">Προέλευση:</translation> <translation id="6709357832553498500">Σύνδεση με χρήση <ph name="EXTENSIONNAME" /></translation> <translation id="6710213216561001401">Προηγούμενο</translation> -<translation id="6712158998835983046">Εμφάνιση όλων, κινούμενων στοιχείων</translation> <translation id="6718273304615422081">Συμπίεση…</translation> <translation id="671928215901716392">Κλείδωμα οθόνης</translation> <translation id="6721972322305477112">&Αρχείο</translation> @@ -4557,7 +4563,6 @@ <translation id="7088434364990739311">O έλεγχος ενημερώσεων απέτυχε να ξεκινήσει (κωδικός σφάλματος <ph name="ERROR" />).</translation> <translation id="708856090370082727">Ενεργοποίηση υποστήριξης OSK. Όταν είναι ενεργοποιημένη αυτή η ετικέτα, το OSK αλλάζει το μέγεθος μόνο της οπτικής θύρας προβολής.</translation> <translation id="7088674813905715446">Αυτή η συσκευή έχει τεθεί σε ανενεργή κατάσταση από το διαχειριστή. Για να την ενεργοποιήσετε για εγγραφή, ζητήστε από το διαχειριστή σας να τη θέσει σε κατάσταση εκκρεμότητας.</translation> -<translation id="7089609847854449639">Διαχείριση αποθηκευτικού χώρου</translation> <translation id="708969677220991657">Επιτρέπει αιτήματα σε έναν τοπικό κεντρικό υπολογιστή μέσω HTTPS ακόμα και όταν παρουσιάζεται μη έγκυρο πιστοποιητικό.</translation> <translation id="7092106376816104">Εξαιρέσεις αναδυόμενων παραθύρων</translation> <translation id="7093866338626856921">Ανταλλαγή δεδομένων με συσκευές με την ονομασία: <ph name="HOSTNAMES" /></translation> @@ -4597,7 +4602,7 @@ <translation id="715118844758971915">Συμβατικοί εκτυπωτές</translation> <translation id="7154130902455071009">Αλλαγή της σελίδας έναρξης σε: <ph name="START_PAGE" /></translation> <translation id="7155171745945906037">Υπάρχουσα φωτογραφία από την κάμερα ή το αρχείο</translation> -<translation id="715568033737470079">Καθορισμός των προσθηκών PPAPI που θα εκτελούνται εντός της πολιτικής κλειδώματος περιβάλλοντος δοκιμών (sandbox) Win32k (μόνο Windows 10 και νεότερη έκδοση).</translation> +<translation id="7155226869555939647">Να ανοίγουν πάντα οι σύνδεσμοι για την εφαρμογή <ph name="APPLICATION" /></translation> <translation id="7156235233373189579">Αυτό το αρχείο έχει σχεδιαστεί για υπολογιστές που χρησιμοποιούν λογισμικό Windows. Δεν είναι συμβατό με τη συσκευή σας η οποία εκτελεί Chrome OS. Αναζητήστε μια εφαρμογή κατάλληλη για να το αντικαταστήσει στο <ph name="BEGIN_LINK" />Chrome Web Store<ph name="END_LINK" />.<ph name="BEGIN_LINK_HELP" />Μάθετε περισσότερα<ph name="END_LINK_HELP" /></translation> <translation id="7157063064925785854">Εάν κάνετε κλικ στο κουμπί "Συνέχεια", δηλώνετε ότι αποδέχεστε τους όρους των νομικών εγγράφων <ph name="LEGAL_DOC_LINK_TEXT_1" />, <ph name="LEGAL_DOC_LINK_TEXT_2" />, <ph name="LEGAL_DOC_LINK_TEXT_3" /> και <ph name="LEGAL_DOC_LINK_TEXT_4" />.</translation> <translation id="7158238151765743968">Η σύνδεση με τη συσκευή "<ph name="DEVICE_NAME" />" εξακολουθεί να βρίσκεται σε εξέλιξη.</translation> @@ -4612,6 +4617,7 @@ <translation id="7175353351958621980">Έγινε φόρτωση από:</translation> <translation id="7180611975245234373">Ανανέωση</translation> <translation id="7180865173735832675">Προσαρμογή</translation> +<translation id="7181387261278441780">Εκκαθάριση και επαναφορά ιστότοπου</translation> <translation id="7185078796915954712">TLS 1.3</translation> <translation id="7185690883425432021">Αποκρύπτει τα κουμπιά κλεισίματος των ανενεργών καρτελών, όταν η γραμμή καρτελών είναι στη λειτουργία στοίβας.</translation> <translation id="7186088072322679094">Διατήρηση στη γραμμή εργαλείων</translation> @@ -4644,7 +4650,6 @@ <translation id="7223775956298141902">Μπουου... Δεν έχετε επεκτάσεις :-(</translation> <translation id="7224023051066864079">Μάσκα υποδικτύου:</translation> <translation id="7225179976675429563">Ο τύπος δικτύου λείπει</translation> -<translation id="7230191962699768124">Εμφάνιση όλων, μη κινούμενων στοιχείων</translation> <translation id="7230787553283372882">Προσαρμόστε το μέγεθος του κειμένου σας</translation> <translation id="7231224339346098802">Χρησιμοποιήστε έναν αριθμό για να υποδείξετε πόσα αντίγραφα θα εκτυπωθούν (1 ή περισσότερα).</translation> <translation id="7238585580608191973">Αποτύπωμα SHA-256</translation> @@ -4776,7 +4781,6 @@ <translation id="7409233648990234464">Επανεκκίνηση και Powerwash</translation> <translation id="7409836189476010449">Εκτέλεση Flash</translation> <translation id="7410344089573941623">Ερώτηση εάν το <ph name="HOST" /> θέλει να αποκτήσει πρόσβαση στην κάμερα και στο μικρόφωνό σας</translation> -<translation id="7411343637221933631">{NUM_COOKIES,plural, =1{1 από αυτόν τον ιστότοπο}other{# από αυτόν τον ιστότοπο}}</translation> <translation id="7412226954991670867">Μνήμη GPU</translation> <translation id="7416362041876611053">Άγνωστο σφάλμα δικτύου.</translation> <translation id="7417453074306512035">Πληκτρολόγιο Αιθιοπικών</translation> @@ -4901,6 +4905,7 @@ <translation id="756445078718366910">Άνοιγμα παραθύρου προγράμματος περιήγησης</translation> <translation id="7564847347806291057">Τερματισμός διαδικασίας</translation> <translation id="7566723889363720618">F12</translation> +<translation id="7567314848159753396">Cookie: <ph name="NAME" /></translation> <translation id="756809126120519699">Τα δεδομένα του Chrome διαγράφηκαν</translation> <translation id="7568790562536448087">Ενημέρωση</translation> <translation id="7573172247376861652">Φόρτιση μπαταρίας</translation> @@ -4941,6 +4946,7 @@ <translation id="7626009897377900107">Δημιουργία κωδικού πρόσβασης</translation> <translation id="7627262197844840899">Αυτός ο ιστότοπος δεν αποδέχεται κάρτες MasterCard.</translation> <translation id="7627790789328695202">Ωχ! Το αρχείο <ph name="FILE_NAME" /> υπάρχει ήδη. Μετονομάστε το και δοκιμάστε ξανά.</translation> +<translation id="7628127343934101653">Άνοιγμα αρχείων PDF στο προεπιλεγμένο πρόγραμμα προβολής PDF.</translation> <translation id="762917759028004464">Το προεπιλεγμένο πρόγραμμα περιήγησης είναι το <ph name="BROWSER_NAME" />.</translation> <translation id="7629536005696009600">Να επιτρέπεται η συμπλήρωση των αποθηκευμένων διαπιστευτηρίων για τις εφαρμογές Android στους αντίστοιχους ιστότοπους.</translation> <translation id="7629827748548208700">Καρτέλα: <ph name="TAB_NAME" /></translation> @@ -5169,6 +5175,7 @@ <translation id="7957513156576779045">Ενεργοποιήστε το Bluetooth για να επιτρέψετε τη σύζευξη</translation> <translation id="7957615753207896812">Άνοιγμα των ρυθμίσεων πληκτρολογίου της συσκευής</translation> <translation id="7959074893852789871">Το αρχείο περιείχε πολλαπλά πιστοποιητικά, κάποια από τα οποία δεν εισάχθηκαν:</translation> +<translation id="7959700692661109221"><ph name="BEGIN_PARAGRAPH" />Η υπηρεσία τοποθεσίας της Google χρησιμοποιεί πηγές όπως το Wi-Fi ώστε ο υπολογισμός της τοποθεσίας της συσκευής σας να γίνεται με μεγαλύτερη ταχύτητα και ακρίβεια. Όταν ενεργοποιείτε τις υπηρεσίες τοποθεσίας της Google, η συσκευή σας εισέρχεται σε μια λειτουργία η οποία χρησιμοποιεί το Wi-Fi για να παρέχει πληροφορίες τοποθεσίας. Μπορείτε να απενεργοποιήσετε αυτήν τη λειτουργία στις ρυθμίσεις τοποθεσίας ανά πάσα στιγμή.<ph name="END_PARAGRAPH" /></translation> <translation id="7961015016161918242">Ποτέ</translation> <translation id="7964089325405904043">Εισαγωγή και εξαγωγή κωδικών πρόσβασης</translation> <translation id="7965010376480416255">Κοινόχρηστη μνήμη</translation> @@ -5320,6 +5327,7 @@ <translation id="8146793085009540321">Αποτυχία σύνδεσης. Επικοινωνήστε με τον διαχειριστή σας ή δοκιμάστε ξανά.</translation> <translation id="8148264977957212129">Μέθοδος εισαγωγής Pinyin</translation> <translation id="8148913456785123871">Εμφάνιση καρτών του Google Now στην εφαρμογή εκκίνησης</translation> +<translation id="8150391391298684512">Απενεργοποίηση του API Windows Runtime MIDI</translation> <translation id="8151185429379586178">Εργαλεία για προγραμματιστές</translation> <translation id="8151638057146502721">Διαμόρφωση</translation> <translation id="8151639108075998630">Ενεργοποίηση περιήγησης επισκέπτη</translation> @@ -5603,6 +5611,7 @@ <translation id="8532294913309524834">Γλώσσες παραγγελίας με βάση τις προτιμήσεις σας.</translation> <translation id="8535005006684281994">URL ανανέωσης πιστοποιητικού Netscape</translation> <translation id="8539727552378197395">Όχι (HttpOnly)</translation> +<translation id="8541084862688000575">Αυτόματη φόρτωση εφαρμογών Android</translation> <translation id="8543181531796978784">Μπορείτε να <ph name="BEGIN_ERROR_LINK" />αναφέρετε ένα πρόβλημα εντοπισμού<ph name="END_ERROR_LINK" /> ή, εάν κατανοείτε τους κινδύνους ασφαλείας, να <ph name="BEGIN_LINK" />επισκεφτείτε αυτόν τον μη ασφαλή ιστότοπο<ph name="END_LINK" />.</translation> <translation id="8545107379349809705">Απόκρυψη πληροφοριών…</translation> <translation id="8545211332741562162">Ενεργοποίηση ιστοσελίδων για χρήση πειραματικών λειτουργιών JavaScript.</translation> @@ -5631,7 +5640,6 @@ <translation id="8569764466147087991">Επιλέξτε αρχείο για άνοιγμα</translation> <translation id="8571032220281885258">Όταν λέτε "OΚ Google", το Chrome αναζητά αυτό που θα πείτε στη συνέχεια.</translation> <translation id="8571108619753148184">Διακομιστής 4</translation> -<translation id="8572832761467613633">Μόνο Flash</translation> <translation id="8572981282494768930">Να μην επιτρέπεται η πρόσβαση των ιστότοπων στην κάμερα και το μικρόφωνό σας</translation> <translation id="8574234089711453001">Επιτρέψτε την εμφανιση ενός κουμπιού λήψης κατά το άνοιγμα μιας σελίδας με το url μέσου.</translation> <translation id="857779305329188634">Ενεργοποίηση πειραματικής υποστήριξης πρωτοκόλλου QUIC.</translation> @@ -5653,6 +5661,7 @@ <translation id="8600929685092827187">Αφύπνιση σε Πακέτα</translation> <translation id="8601206103050338563">Έλεγχος ταυτότητας πελάτη TLS WWW</translation> <translation id="8602851771975208551">Κάποιο άλλο πρόγραμμα στον υπολογιστή σας πρόσθεσε μια εφαρμογή, η οποία ενδέχεται να αλλάξει τον τρόπο λειτουργίας του Chrome.</translation> +<translation id="8603912787021349466">Να επιτρέπεται η αυτόματη εκκίνηση των εφαρμογών Android μετά τη σύνδεση.</translation> <translation id="8605428685123651449">Μνήμη SQLite</translation> <translation id="8605503133013456784">Αποτυχία αποσύνδεσης και κατάργησης ζεύξης από τη συσκευή "<ph name="DEVICE_NAME" />".</translation> <translation id="8606726445206553943">Χρήση των συσκευών σας MIDI</translation> @@ -6006,6 +6015,7 @@ <translation id="9053965862400494292">Προέκυψε ένα σφάλμα κατά την απόπειρα ρύθμισης του συγχρονισμού.</translation> <translation id="9056034633062863292">Ενημέρωση του Chromebox</translation> <translation id="9056810968620647706">Δεν βρέθηκαν αντιστοιχίες.</translation> +<translation id="9057119625587205566">Δεν υπάρχουν εκτυπωτές κοντά σας</translation> <translation id="9059868303873565140">Μενού κατάστασης</translation> <translation id="9064142312330104323">Φωτογραφία προφίλ Google (φόρτωση)</translation> <translation id="9064275926664971810">Ενεργοποίηση Αυτόματης συμπλήρωσης για τη συμπλήρωση φορμών με ένα μόνο κλικ</translation> @@ -6016,6 +6026,7 @@ <translation id="9067401056540256169">Αυτή η επισήμανση καθιστά το Chrome μη ασφαλές. Χρησιμοποιήστε την μόνο σε περίπτωση που κατανοείτε τη λειτουργία της. Λάβετε υπόψη ότι αυτή η επισήμανση μπορεί να καταργηθεί χωρίς προειδοποίηση. Εάν είναι ενεργή, τα πλαίσια δεδομένων με προέλευση https μπορούν να χρησιμοποιούν πρωτόκολλα WebSocket με μη ασφαλή διεύθυνση URL (ws://).</translation> <translation id="9068931793451030927">Διαδρομή:</translation> <translation id="9070219033670098627">Αλλαγή ατόμου</translation> +<translation id="9070940116164932228">Περιορισμός απαιτητικών χρονιστών παρασκηνίου</translation> <translation id="907148966137935206">Να μην επιτρέπεται σε κανέναν ιστότοπο η εμφάνιση αναδυόμενων παραθύρων (συνιστάται)</translation> <translation id="9072550133391925347">Το <ph name="PASSWORD_MANAGER_BRAND" /> σάς συνδέει αυτόματα σε κατάλληλους ιστότοπους και εφαρμογές, χρησιμοποιώντας του κωδικούς πρόσβασης που έχετε αποθηκεύσει.</translation> <translation id="9073281213608662541">PAP</translation> @@ -6049,6 +6060,7 @@ <translation id="9112614144067920641">Επιλέξτε νέο PIN.</translation> <translation id="9112748030372401671">Αλλάξτε την ταπετσαρία σας</translation> <translation id="9112987648460918699">Εύρεση...</translation> +<translation id="9114663181201435112">Εύκολη σύνδεση</translation> <translation id="9115487443206954631">Διαχείριση συσκευών μετάδοσης</translation> <translation id="9115675100829699941">&Σελιδοδείκτες</translation> <translation id="9121814364785106365">Άνοιγμα ως καρφιτσωμένης καρτέλας</translation> @@ -6143,7 +6155,6 @@ <translation id="952992212772159698">Μη ενεργοποιημένο</translation> <translation id="960719561871045870">Κωδικός τελεστή</translation> <translation id="960987915827980018">Απομένει περίπου 1 ώρα</translation> -<translation id="962778376131245616">Εμφάνιση μόνο μη ασφαλών, κινούμενων στοιχείων</translation> <translation id="96421021576709873">Δίκτυο Wi-Fi</translation> <translation id="965490406356730238">Ενεργοποίηση αποκωδικοποίησης mjpeg με επιτάχυνση εξοπλισμού για καρέ που έχουν ληφθεί, όπου είναι διαθέσιμα.</translation> <translation id="968174221497644223">Προσωρινή μνήμη εφαρμογής</translation>
diff --git a/chrome/app/resources/generated_resources_en-GB.xtb b/chrome/app/resources/generated_resources_en-GB.xtb index d27a094..bd59304 100644 --- a/chrome/app/resources/generated_resources_en-GB.xtb +++ b/chrome/app/resources/generated_resources_en-GB.xtb
@@ -18,7 +18,6 @@ <translation id="1029317248976101138">Zoom</translation> <translation id="1029595648591494741">Try "<ph name="EXTENSION_NAME" />"?</translation> <translation id="1031362278801463162">Loading preview</translation> -<translation id="1031460590482534116">There was an error while trying to store the client certificate. Error <ph name="ERROR_NUMBER" /> (<ph name="ERROR_NAME" />).</translation> <translation id="1031573127485938293">Ask (by policy)</translation> <translation id="103279545524624934">Free up disk space to launch Android apps.</translation> <translation id="1033780634303702874">Access your serial devices</translation> @@ -101,6 +100,7 @@ <translation id="1128591060186966949">Edit search engine</translation> <translation id="1128987120443782698">The storage device has a capacity of <ph name="DEVICE_CAPACITY" />. Please insert an SD card or USB memory stick with at least 4 GB of capacity.</translation> <translation id="1137135726305341424">domContentLoaded and all resources loads started before domContentLoaded (main frame and same origin iframes).</translation> +<translation id="1138663153846032155">Prefer HTML over Flash</translation> <translation id="1140351953533677694">Access your Bluetooth and Serial devices</translation> <translation id="114140604515785785">Extension root directory:</translation> <translation id="1143142264369994168">Certificate Signer</translation> @@ -252,6 +252,7 @@ <translation id="1351692861129622852">Importing <ph name="FILE_COUNT" /> files...</translation> <translation id="1352103415082130575">Thai keyboard (Pattachote)</translation> <translation id="1353686479385938207"><ph name="PROVIDER_NAME" />: <ph name="NETWORK_NAME" /></translation> +<translation id="1353946958707294039">Material Design storage manager</translation> <translation id="1353966721814789986">Startup pages:</translation> <translation id="1354868058853714482">Adobe Reader is out of date and may be insecure.</translation> <translation id="1355408554203439639">3D software rasteriser</translation> @@ -424,7 +425,6 @@ <translation id="1533920822694388968">TV alignment</translation> <translation id="15373452373711364">Large mouse cursor</translation> <translation id="1543284117603151572">Imported From Edge</translation> -<translation id="1544350195767834591">{NUM_COOKIES,plural, =1{1 from other sites}other{# from other sites}}</translation> <translation id="1545177026077493356">Automatic Kiosk Mode</translation> <translation id="1545786162090505744">URL with %s in place of query</translation> <translation id="1546280085599573572">This extension has changed the page that is shown when you click the Home button.</translation> @@ -448,7 +448,6 @@ <translation id="1559235587769913376">Input Unicode characters</translation> <translation id="1561092721008294962">HarfBuzz for UI text</translation> <translation id="1566049601598938765">Website</translation> -<translation id="1566958206723629112">Flash and PDF</translation> <translation id="1567723158593978621">When enabled, signing in to the browser will use a new GAIA password-separated sign-in flow.</translation> <translation id="1567993339577891801">JavaScript Console</translation> <translation id="1568323446248056064">Open display device settings</translation> @@ -577,7 +576,6 @@ <translation id="1723940674997333416">Allow insecure WebSocket from https origin</translation> <translation id="1725149567830788547">Show &Controls</translation> <translation id="172612876728038702">The TPM is being set up. Please be patient; this may take a few minutes.</translation> -<translation id="1727135806684246609">Material Security Verbose</translation> <translation id="1729533290416704613">It also controls what page is shown when you search from the Omnibox.</translation> <translation id="1731346223650886555">Semi-colon</translation> <translation id="1731589410171062430">Total: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /> (<ph name="NUMBER_OF_PAGES" /> <ph name="PAGE_OR_PAGES_LABEL" />)</translation> @@ -874,6 +872,7 @@ <translation id="218492098606937156">Enable touch events</translation> <translation id="2187317261103489799">Detect (default)</translation> <translation id="2187895286714876935">Server Certificate Import Error</translation> +<translation id="2188881192257509750">Open <ph name="APPLICATION" /></translation> <translation id="2190069059097339078">Wi-Fi Credentials Getter</translation> <translation id="219008588003277019">Native Client module: <ph name="NEXE_NAME" /></translation> <translation id="2190355936436201913">(empty)</translation> @@ -992,6 +991,7 @@ <translation id="2326606747676847821">Go incognito</translation> <translation id="2326931316514688470">&Reload app</translation> <translation id="2327492829706409234">Enable app</translation> +<translation id="2328054044222305089">This will delete any data <ph name="SITE" /> stored on your device, and reset any permissions that you granted to run. Do you want to continue?</translation> <translation id="2329597144923131178">Sign in to get your bookmarks, history, passwords and other settings on all your devices</translation> <translation id="2332131598580221120">View in store</translation> <translation id="2332742915001411729">Reset to default</translation> @@ -1266,7 +1266,6 @@ <translation id="2675358154061544447">Highly experimental support for rendering cross-site iframes in separate processes. In this mode, documents will share a render process only if they are from the same web site.</translation> <translation id="2676946222714718093">Playing on</translation> <translation id="2678063897982469759">Re-enable</translation> -<translation id="2678246812096664977">All plugins</translation> <translation id="2679385451463308372">Print using system dialogue…</translation> <translation id="2680208403056680091">Your Internet Connection is Being Controlled</translation> <translation id="268053382412112343">Hi&story</translation> @@ -1440,7 +1439,6 @@ <translation id="287286579981869940">Add <ph name="PROVIDER_NAME" />...</translation> <translation id="2872961005593481000">Shut down</translation> <translation id="2875698561019555027">(Chrome error pages)</translation> -<translation id="2879560882721503072">Successfully stored client certificate issued by <ph name="ISSUER" />.</translation> <translation id="288024221176729610">Czech</translation> <translation id="288042212351694283">Access your Universal 2nd Factor devices</translation> <translation id="2881966438216424900">Last accessed:</translation> @@ -1589,6 +1587,7 @@ <translation id="3057861065630527966">Backup your photos and videos</translation> <translation id="3058212636943679650">If you ever need to restore your computer's operating system, you'll need a recovery SD card or USB memory stick.</translation> <translation id="305932878998873762">The Simple Cache for HTTP is a new cache. It relies on the file system for disk space allocation.</translation> +<translation id="3060251871394327123">This will delete any data <ph name="SITE" /> stored on your device. Do you want to continue?</translation> <translation id="3061650404498811439">Enable access to emoji, handwriting and voice input form opt-in IME menu.</translation> <translation id="3062606427884046423">Use Android MediaStyle notifications for Chrome media notifications.</translation> <translation id="3063844757726132584">Access all of your apps from this handy launcher. Play games, video chat, listen to music, edit documents or get more apps.</translation> @@ -1638,6 +1637,7 @@ <translation id="3123569374670379335">(Supervised)</translation> <translation id="3124111068741548686">USER handles</translation> <translation id="3126026824346185272">Ctrl</translation> +<translation id="3127156390846601284">This will delete any data stored on your device for all the sites shown. Do you want to continue?</translation> <translation id="312759608736432009">Device manufacturer:</translation> <translation id="3127919023693423797">Authenticating...</translation> <translation id="3128230619496333808">Tab 6</translation> @@ -1736,7 +1736,6 @@ <translation id="3264544094376351444">Sans-serif font</translation> <translation id="3264547943200567728">Failed to set up your Chromebox's network</translation> <translation id="3265459715026181080">Close Window</translation> -<translation id="3267271790328635957">PDF only</translation> <translation id="3267726687589094446">Continue allowing automatic downloads of multiple files</translation> <translation id="3267998849713137817">Modified Time</translation> <translation id="3268451620468152448">Open Tabs</translation> @@ -1982,6 +1981,7 @@ <translation id="3574210789297084292">sign in</translation> <translation id="3574305903863751447"><ph name="CITY" />, <ph name="STATE" /> <ph name="COUNTRY" /></translation> <translation id="357479282490346887">Lithuanian</translation> +<translation id="3575927481544652747">Disable Windows Runtime MIDI API for WebMIDI, which is enabled by default on Windows 10 or later.</translation> <translation id="3576324189521867626">Successfully installed</translation> <translation id="3578331450833904042">Default (pick up everything)</translation> <translation id="3578594933904494462">This tab's content is being shared.</translation> @@ -2035,8 +2035,6 @@ <translation id="3627320433825461852">Less than 1 minute left</translation> <translation id="3627588569887975815">Open link in inco&gnito window</translation> <translation id="3627671146180677314">Netscape Certificate Renewal Time</translation> -<translation id="3629326610814700057">Enables storage manager to manage local storage.</translation> -<translation id="3630337581925712713"><ph name="PERMISSION_TYPE_LABEL" />:</translation> <translation id="3631337165634322335">Exceptions below only apply to the current incognito session.</translation> <translation id="3633586230741134985">App Launcher Settings</translation> <translation id="3633997706330212530">You may optionally disable these services.</translation> @@ -2059,7 +2057,8 @@ <translation id="3654045516529121250">Read your accessibility settings</translation> <translation id="3654092442379740616">Sync Error: <ph name="PRODUCT_NAME" /> is out of date and needs to be updated.</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{It has permanent access to one file.}other{It has permanent access to # files.}}</translation> -<translation id="3657468915905674858">Enable PPAPI Win32k Lockdown.</translation> +<translation id="365793796291733849"><ph name="BEGIN_PARAGRAPH1" />When you turn on automatic backup, device and app data is periodically saved to a private folder in Google Drive. App data can be any data that an app has saved (based on developer settings), including potentially sensitive data such as contacts, messages and photos.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Backup data will not count towards your Drive storage quota. Large files, or files developers have chosen to exclude from the service, will not be backed up.<ph name="END_PARAGRAPH2" /></translation> <translation id="3660234220361471169">Untrusted</translation> <translation id="3665589677786828986">Chrome detected that some of your settings were corrupted by another program and reset them to their original defaults.</translation> <translation id="3665842570601375360">Security:</translation> @@ -2114,6 +2113,7 @@ <translation id="3733127536501031542">SSL Server with Step-up</translation> <translation id="3736520371357197498">If you understand the risks to your security, you may <ph name="BEGIN_LINK" />visit this unsafe site<ph name="END_LINK" /> before the dangerous programs have been removed.</translation> <translation id="3738924763801731196"><ph name="OID" />:</translation> +<translation id="3739254215541673094">Open <ph name="APPLICATION" />?</translation> <translation id="3739798227959604811">Delay before repeat:</translation> <translation id="3741158646617793859"><ph name="DEVICE_NAME" /> will now appear in the Admin Console</translation> <translation id="3741243925913727067">Back up your media device’s photos and videos to Google Drive.</translation> @@ -2352,7 +2352,6 @@ <translation id="4058793769387728514">Check Document Now</translation> <translation id="4059285154003114015">&Print Frame...</translation> <translation id="406070391919917862">Background Apps</translation> -<translation id="4061502419206152498">Show only non-secure, non-animated</translation> <translation id="4062251648694601778">Enjoy your <ph name="SHORT_PRODUCT_NAME" /> device. Questions? You can always get help by clicking the "?" in the status tray.</translation> <translation id="4065876735068446555">The network you are using (<ph name="NETWORK_ID" />) may require you to visit its login page.</translation> <translation id="4068506536726151626">This page contains elements from the following sites that are tracking your location:</translation> @@ -2391,7 +2390,6 @@ <translation id="4101878899871018532">The password manager will not offer to save the credential used to sync.</translation> <translation id="410351446219883937">Autoplay</translation> <translation id="4104163789986725820">E&xport...</translation> -<translation id="4105523032910086267">Sets the animation and visibility of the security verbose in Material Design.</translation> <translation id="4105563239298244027">Get 1 TB free with Google Drive</translation> <translation id="4109135793348361820">Move window to <ph name="USER_NAME" /> (<ph name="USER_EMAIL" />)</translation> <translation id="4110342520124362335">Cookies from <ph name="DOMAIN" /> blocked.</translation> @@ -2442,6 +2440,7 @@ <translation id="418179967336296930">Russian Phonetic (YaZHert) keyboard</translation> <translation id="4181841719683918333">Languages</translation> <translation id="4187248015940562149">Enables Web Bluetooth which could allow websites to connect to and control Bluetooth devices around you.</translation> +<translation id="4188447344915957833">Enables storage manager in Material Design Settings.</translation> <translation id="4189406272289638749">An extension, <b><ph name="EXTENSION_NAME" /></b>, is controlling this setting.</translation> <translation id="4193154014135846272">Google document</translation> <translation id="4193182321948161343">Enable Material Design User Manager</translation> @@ -2649,6 +2648,7 @@ <translation id="4508765956121923607">View S&ource</translation> <translation id="4509017836361568632">Discard photo</translation> <translation id="4509345063551561634">Location:</translation> +<translation id="4513946894732546136">Feedback</translation> <translation id="4514542542275172126">Set up new supervised user</translation> <translation id="4514914692061505365">Force the use of PNaCl's fast Subzero translator for all pexe files.</translation> <translation id="451515744433878153">Remove</translation> @@ -2747,6 +2747,7 @@ <translation id="4656293982926141856">This computer</translation> <translation id="4656631038341342120">Enable VR shell if available for this device.</translation> <translation id="4657031070957997341">Always allow plug-ins on <ph name="HOST" /></translation> +<translation id="466008749075469935">Enables intervention to limit CPU usage of background timers to 1%.</translation> <translation id="4663254525753315077">When possible, puts the scrolling contents of an overflow scrolling element onto a composited layer for faster scrolling.</translation> <translation id="4664482161435122549">PKCS No.12 Export Error</translation> <translation id="4665014895760275686">Manufacturer</translation> @@ -2815,6 +2816,7 @@ <translation id="4749157430980974800">Georgian keyboard</translation> <translation id="4750394297954878236">Suggestions</translation> <translation id="475088594373173692">First user</translation> +<translation id="4750892496809949692">Prefer HTML content by hiding Flash from the list of plug-ins.</translation> <translation id="4750917950439032686">Your information (for example, passwords or credit card numbers) is private when it is sent to this site.</translation> <translation id="4753602155423695878">Android phone page loading progress bar animation</translation> <translation id="4755240240651974342">Finnish keyboard</translation> @@ -3089,6 +3091,7 @@ <translation id="5119450342834678097">Request tablet site option in the settings menu</translation> <translation id="5120068803556741301">Third-party input method</translation> <translation id="5120421890733714118">Trust this certificate for identifying websites.</translation> +<translation id="5120516977819314347">PIN or password incorrect.</translation> <translation id="5121130586824819730">Your hard disk is full. Please save to another location or make more room on the hard disk.</translation> <translation id="5125751979347152379">Invalid URL.</translation> <translation id="5127881134400491887">Manage network connections</translation> @@ -3096,6 +3099,7 @@ <translation id="512903556749061217">attached</translation> <translation id="5129301143853688736">Your connection to this site is not private. Attackers might be trying to steal your information (for example, photos, passwords, messages and credit cards) from <ph name="DOMAIN" />.</translation> <translation id="5129662217315786329">Polish</translation> +<translation id="5131347545782851480">PDF Documents</translation> <translation id="5134856901811723984">Material Design in Chrome OS system UI</translation> <translation id="5135533361271311778">Could not create bookmark item.</translation> <translation id="5136529877787728692">F7</translation> @@ -3264,6 +3268,7 @@ <translation id="5328031682234198929">8</translation> <translation id="5329858601952122676">&Delete</translation> <translation id="5330145655348521461">These files opened on a different desktop. Move to <ph name="USER_NAME" /> (<ph name="MAIL_ADDRESS" />) to view it.</translation> +<translation id="5330512191124428349">Get info</translation> <translation id="5332624210073556029">Time zone:</translation> <translation id="5333807720589685258">Your SIM card will be permanently disabled if you cannot enter the correct PIN Unlock Key.</translation> <translation id="5333958554630697967">Enables experimental Web Platform features that are in development.</translation> @@ -3695,7 +3700,6 @@ <translation id="5892507820957994680">Overrides the built-in software rendering list and enables GPU acceleration on unsupported system configurations.</translation> <translation id="5895138241574237353">Restart</translation> <translation id="5895187275912066135">Issued On</translation> -<translation id="5898154795085152510">The server returned an invalid client certificate. Error <ph name="ERROR_NUMBER" /> (<ph name="ERROR_NAME" />).</translation> <translation id="5900302528761731119">Google Profile photo</translation> <translation id="590253956165195626">Offer to translate pages that aren't in a language you read.</translation> <translation id="5904093760909470684">Proxy Configuration</translation> @@ -3750,6 +3754,8 @@ <translation id="5984222099446776634">Recently Visited</translation> <translation id="5984814259619230127">Smart Lock Bluetooth Low Energy Discovery</translation> <translation id="5986245990306121338">If enabled, a tab switcher will show even when 'merge tabs and apps' option is on in the settings.</translation> +<translation id="5989712527536636369"><ph name="BEGIN_PARAGRAPH1" />This is general information about your device and how you use it, such as battery level, how often you use your apps, the quality and duration of your network connections (like Wi-Fi and Bluetooth) and crash reports when things aren’t working the way they should. It will be used to improve Google’s products and services for everyone. Some aggregated information will help partners, such as Android developers, make their apps and products better too.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />You can turn this on or off at any time in the Android apps Settings. This doesn’t affect your device’s ability to send the information it needs to receive essential services such as system updates and security.<ph name="END_PARAGRAPH2" /></translation> <translation id="5990198433782424697">Extensions on chrome:// URLs</translation> <translation id="5990814808592353318">Manual password generation.</translation> <translation id="5991049340509704927">Magnify</translation> @@ -3763,6 +3769,7 @@ <translation id="6005695835120147974">Media Router</translation> <translation id="6007237601604674381">Move failed. <ph name="ERROR_MESSAGE" /></translation> <translation id="6008241731410823808">Sends hyperlink auditing pings.</translation> +<translation id="6011449291337289699">Clear site data</translation> <translation id="6015796118275082299">Year</translation> <translation id="6016551720757758985">Confirm Powerwash with return to previous version</translation> <translation id="6016809788585079594">Say "OK Google" one last time</translation> @@ -3952,7 +3959,6 @@ <translation id="6276301056778294989">Make sure that the device is showing the same code.</translation> <translation id="6277105963844135994">Network timeout</translation> <translation id="6277518330158259200">T&ake Screenshot</translation> -<translation id="6278428485366576908">Theme</translation> <translation id="6279183038361895380">Press |<ph name="ACCELERATOR" />| to show your cursor</translation> <translation id="6280215091796946657">Sign in with a different account</translation> <translation id="6280912520669706465">ARC</translation> @@ -4204,6 +4210,7 @@ <translation id="6607272825297743757">File info</translation> <translation id="6607831829715835317">More too&ls</translation> <translation id="6608140561353073361">All cookies and site data...</translation> +<translation id="6610183966322615106">Error adding printer</translation> <translation id="6610610633807698299">Enter URL...</translation> <translation id="6612358246767739896">Protected content</translation> <translation id="6615455863669487791">Show me</translation> @@ -4267,7 +4274,6 @@ <translation id="6708242697268981054">Origin:</translation> <translation id="6709357832553498500">Connect using <ph name="EXTENSIONNAME" /></translation> <translation id="6710213216561001401">Previous</translation> -<translation id="6712158998835983046">Show all, animated</translation> <translation id="6718273304615422081">Zipping...</translation> <translation id="671928215901716392">Lock screen</translation> <translation id="6721972322305477112">&File</translation> @@ -4540,7 +4546,6 @@ <translation id="7088434364990739311">Update check failed to start (error code <ph name="ERROR" />).</translation> <translation id="708856090370082727">Enable OSK overscroll support. With this flag on, the OSK will only resize the visual viewport.</translation> <translation id="7088674813905715446">This device has been placed into a deprovisioned state by the administrator. To enable it for enrolment, please have your administrator place the device into a pending state.</translation> -<translation id="7089609847854449639">Storage manager</translation> <translation id="708969677220991657">Allows requests to localhost over HTTPS even when an invalid certificate is presented.</translation> <translation id="7092106376816104">Pop-up exceptions</translation> <translation id="7093866338626856921">Exchange data with the devices named: <ph name="HOSTNAMES" /></translation> @@ -4580,7 +4585,7 @@ <translation id="715118844758971915">Classic printers</translation> <translation id="7154130902455071009">Change your start page to: <ph name="START_PAGE" /></translation> <translation id="7155171745945906037">Existing photo from camera or file</translation> -<translation id="715568033737470079">Specify the PPAPI plug-ins which will be run within the Win32k lockdown sandbox policy (Windows 10 and above only).</translation> +<translation id="7155226869555939647">Always open links for <ph name="APPLICATION" /></translation> <translation id="7156235233373189579">This file is designed for a PC using Windows software. This is not compatible with your device which runs Chrome OS. Please search the <ph name="BEGIN_LINK" />Chrome Web Store<ph name="END_LINK" /> for a suitable replacement app.<ph name="BEGIN_LINK_HELP" />Learn More<ph name="END_LINK_HELP" /></translation> <translation id="7157063064925785854">By clicking Continue you agree to the <ph name="LEGAL_DOC_LINK_TEXT_1" />, <ph name="LEGAL_DOC_LINK_TEXT_2" />, <ph name="LEGAL_DOC_LINK_TEXT_3" /> and <ph name="LEGAL_DOC_LINK_TEXT_4" />.</translation> <translation id="7158238151765743968">Connection to "<ph name="DEVICE_NAME" />" still in progress.</translation> @@ -4595,6 +4600,7 @@ <translation id="7175353351958621980">Loaded from:</translation> <translation id="7180611975245234373">Refresh</translation> <translation id="7180865173735832675">Customise</translation> +<translation id="7181387261278441780">Clear and reset site</translation> <translation id="7185078796915954712">TLS 1.3</translation> <translation id="7185690883425432021">Hides the close buttons of inactive tabs when the tabstrip is in stacked mode.</translation> <translation id="7186088072322679094">Keep in Toolbar</translation> @@ -4627,7 +4633,6 @@ <translation id="7223775956298141902">Oh dear... You have no extensions :-(</translation> <translation id="7224023051066864079">Subnet mask:</translation> <translation id="7225179976675429563">Network type missing</translation> -<translation id="7230191962699768124">Show all, non-animated</translation> <translation id="7230787553283372882">Customise your text size</translation> <translation id="7231224339346098802">Use a number to indicate how many copies to print (1 or more).</translation> <translation id="7238585580608191973">SHA-256 Fingerprint</translation> @@ -4759,7 +4764,6 @@ <translation id="7409233648990234464">Relaunch and Powerwash</translation> <translation id="7409836189476010449">Run Flash</translation> <translation id="7410344089573941623">Ask if <ph name="HOST" /> wants to access your camera and microphone</translation> -<translation id="7411343637221933631">{NUM_COOKIES,plural, =1{1 from this site}other{# from this site}}</translation> <translation id="7412226954991670867">GPU Memory</translation> <translation id="7416362041876611053">Unknown network error</translation> <translation id="7417453074306512035">Ethiopic keyboard</translation> @@ -4881,6 +4885,7 @@ <translation id="756445078718366910">Open Browser Window</translation> <translation id="7564847347806291057">End process</translation> <translation id="7566723889363720618">F12</translation> +<translation id="7567314848159753396">Cookie: <ph name="NAME" /></translation> <translation id="756809126120519699">Cleared Chrome data</translation> <translation id="7568790562536448087">Updating</translation> <translation id="7573172247376861652">Battery Charge</translation> @@ -4921,6 +4926,7 @@ <translation id="7626009897377900107">Password generation</translation> <translation id="7627262197844840899">This site doesn't accept MasterCard.</translation> <translation id="7627790789328695202">Whoops, <ph name="FILE_NAME" /> already exists. Rename it and try again.</translation> +<translation id="7628127343934101653">Open PDF files in the default PDF viewer application.</translation> <translation id="762917759028004464">The default browser is currently <ph name="BROWSER_NAME" />.</translation> <translation id="7629536005696009600">Allow credentials stored for Android applications to be filled into corresponding websites.</translation> <translation id="7629827748548208700">Tab: <ph name="TAB_NAME" /></translation> @@ -5149,6 +5155,7 @@ <translation id="7957513156576779045">Turn on Bluetooth to allow pairing</translation> <translation id="7957615753207896812">Open keyboard device settings</translation> <translation id="7959074893852789871">The file contained multiple certificates, some of which were not imported:</translation> +<translation id="7959700692661109221"><ph name="BEGIN_PARAGRAPH" />Google’s location service uses sources like Wi-Fi to help estimate your device’s location faster and more accurately. When you turn on Google’s location services, your device enters a mode that uses Wi-Fi to provide location information. You can turn this off in location settings at any time.<ph name="END_PARAGRAPH" /></translation> <translation id="7961015016161918242">Never</translation> <translation id="7964089325405904043">Password import and export</translation> <translation id="7965010376480416255">Shared Memory</translation> @@ -5299,6 +5306,7 @@ <translation id="8146793085009540321">Sign-in failed. Please contact your administrator or try again.</translation> <translation id="8148264977957212129">Pinyin input method</translation> <translation id="8148913456785123871">Show Google Now cards in the launcher</translation> +<translation id="8150391391298684512">Disable Windows Runtime MIDI API</translation> <translation id="8151185429379586178">Developer tools</translation> <translation id="8151638057146502721">Configure</translation> <translation id="8151639108075998630">Enable guest browsing</translation> @@ -5581,6 +5589,7 @@ <translation id="8532294913309524834">Order languages based on your preference.</translation> <translation id="8535005006684281994">Netscape Certificate Renewal URL</translation> <translation id="8539727552378197395">No (HttpOnly)</translation> +<translation id="8541084862688000575">Load Android apps automatically</translation> <translation id="8543181531796978784">You can <ph name="BEGIN_ERROR_LINK" />report a detection problem<ph name="END_ERROR_LINK" /> or, if you understand the risks to your security, <ph name="BEGIN_LINK" />visit this unsafe site<ph name="END_LINK" />.</translation> <translation id="8545107379349809705">Hide info ...</translation> <translation id="8545211332741562162">Enable web pages to use experimental JavaScript features.</translation> @@ -5608,7 +5617,6 @@ <translation id="8569764466147087991">Select a file to open</translation> <translation id="8571032220281885258">When you say "Ok Google", Chrome will search for what you say next.</translation> <translation id="8571108619753148184">Server 4</translation> -<translation id="8572832761467613633">Flash only</translation> <translation id="8572981282494768930">Do not allow sites to access your camera and microphone</translation> <translation id="8574234089711453001">Allow a download button to show up when opening a page with media URL.</translation> <translation id="857779305329188634">Enable experimental QUIC protocol support.</translation> @@ -5630,6 +5638,7 @@ <translation id="8600929685092827187">Wake On Packets</translation> <translation id="8601206103050338563">TLS WWW Client Authentication</translation> <translation id="8602851771975208551">Another programme on your computer added an app that may change the way Chrome works.</translation> +<translation id="8603912787021349466">Allow Android apps to start automatically after signing in.</translation> <translation id="8605428685123651449">SQLite Memory</translation> <translation id="8605503133013456784">Failed to disconnect and unpair from "<ph name="DEVICE_NAME" />".</translation> <translation id="8606726445206553943">Use your MIDI devices</translation> @@ -5982,6 +5991,7 @@ <translation id="9053965862400494292">An error occurred while trying to set up sync.</translation> <translation id="9056034633062863292">Updating Chromebox</translation> <translation id="9056810968620647706">No matches were found.</translation> +<translation id="9057119625587205566">No printers nearby</translation> <translation id="9059868303873565140">Status menu</translation> <translation id="9064142312330104323">Google Profile photo (loading)</translation> <translation id="9064275926664971810">Enable Autofill to fill out forms in a single click</translation> @@ -5992,6 +6002,7 @@ <translation id="9067401056540256169">This flag makes Chrome unsafe. Use this only if you understand what this does. Note that this flag may be removed without any notice. If enabled, frames with an https origin can use WebSockets with an insecure URL (ws://).</translation> <translation id="9068931793451030927">Path:</translation> <translation id="9070219033670098627">Switch person</translation> +<translation id="9070940116164932228">Throttle expensive background timers</translation> <translation id="907148966137935206">Do not allow any site to show pop-ups (recommended)</translation> <translation id="9072550133391925347"><ph name="PASSWORD_MANAGER_BRAND" /> automatically signs you in to eligible sites and apps with passwords that you saved.</translation> <translation id="9073281213608662541">PAP</translation> @@ -6026,6 +6037,7 @@ <translation id="9112614144067920641">Please choose a new PIN.</translation> <translation id="9112748030372401671">Change your wallpaper</translation> <translation id="9112987648460918699">Find...</translation> +<translation id="9114663181201435112">Sign in easily</translation> <translation id="9115487443206954631">Manage Cast devices</translation> <translation id="9115675100829699941">&Bookmarks</translation> <translation id="9121814364785106365">Open as pinned tab</translation> @@ -6120,7 +6132,6 @@ <translation id="952992212772159698">Not activated</translation> <translation id="960719561871045870">Operator code</translation> <translation id="960987915827980018">About 1 hour left</translation> -<translation id="962778376131245616">Show only non-secure, animated</translation> <translation id="96421021576709873">Wi-Fi network</translation> <translation id="965490406356730238">Enable hardware-accelerated mjpeg decode for captured frame where available.</translation> <translation id="968174221497644223">Application cache</translation>
diff --git a/chrome/app/resources/generated_resources_es-419.xtb b/chrome/app/resources/generated_resources_es-419.xtb index 0b5b3c6d..417d019 100644 --- a/chrome/app/resources/generated_resources_es-419.xtb +++ b/chrome/app/resources/generated_resources_es-419.xtb
@@ -18,7 +18,6 @@ <translation id="1029317248976101138">Zoom</translation> <translation id="1029595648591494741">¿Deseas probar "<ph name="EXTENSION_NAME" />"?</translation> <translation id="1031362278801463162">Cargando vista previa</translation> -<translation id="1031460590482534116">Se produjo un error al intentar almacenar el certificado de cliente. Error <ph name="ERROR_NUMBER" /> (<ph name="ERROR_NAME" />).</translation> <translation id="1031573127485938293">Preguntar (por política)</translation> <translation id="103279545524624934">Libera espacio en el disco para ejecutar apps de Android.</translation> <translation id="1033780634303702874">Acceder a tus dispositivos en serie</translation> @@ -101,6 +100,7 @@ <translation id="1128591060186966949">Editar el motor de búsqueda</translation> <translation id="1128987120443782698">El dispositivo de almacenamiento tiene una capacidad de <ph name="DEVICE_CAPACITY" />. Inserta una tarjeta SD o una tarjeta de memoria USB con al menos 4GB de capacidad.</translation> <translation id="1137135726305341424">domContentLoaded y todas las cargas de recursos que comenzaron antes de domContentLoaded (marco principal y los mismos marcos incorporados de origen)</translation> +<translation id="1138663153846032155">Prefiero HTML en lugar de Flash</translation> <translation id="1140351953533677694">Acceder a los dispositivos en serie y Bluetooth</translation> <translation id="114140604515785785">Directorio de raíz de la extensión:</translation> <translation id="1143142264369994168">Firmante del certificado</translation> @@ -137,7 +137,7 @@ <translation id="1181037720776840403">Eliminar</translation> <translation id="1183083053288481515">Se está utilizando un certificado proporcionado por el administrador</translation> <translation id="1183237619868651138">No se puede instalar <ph name="EXTERNAL_CRX_FILE" /> en la memoria caché local.</translation> -<translation id="1184214524891303587"><ph name="BEGIN_WHITEPAPER_LINK" />Informar de forma automática<ph name="END_WHITEPAPER_LINK" /> los detalles de posibles incidentes de seguridad a Google. <ph name="PRIVACY_PAGE_LINK" /></translation> +<translation id="1184214524891303587"><ph name="BEGIN_WHITEPAPER_LINK" />Informar automáticamente<ph name="END_WHITEPAPER_LINK" /> los detalles de posibles incidentes de seguridad a Google. <ph name="PRIVACY_PAGE_LINK" /></translation> <translation id="1185924365081634987">También puedes intentar <ph name="GUEST_SIGNIN_LINK_START" />navegar como invitado<ph name="GUEST_SIGNIN_LINK_END" /> para solucionar este error de red.</translation> <translation id="1187550858834764592">muy corto (800 ms)</translation> <translation id="1187722533808055681">Reactivaciones</translation> @@ -252,6 +252,7 @@ <translation id="1351692861129622852">Importando <ph name="FILE_COUNT" /> archivos…</translation> <translation id="1352103415082130575">Teclado tailandés (Pattachote)</translation> <translation id="1353686479385938207"><ph name="PROVIDER_NAME" />: <ph name="NETWORK_NAME" /></translation> +<translation id="1353946958707294039">Administrador de almacenamiento de material design</translation> <translation id="1353966721814789986">Páginas de inicio</translation> <translation id="1354868058853714482">Adobe Reader está desactualizado y puede no ser seguro.</translation> <translation id="1355408554203439639">Rasterizador de software 3D</translation> @@ -420,7 +421,6 @@ <translation id="1533920822694388968">Alineación del televisor</translation> <translation id="15373452373711364">Cursor del mouse grande</translation> <translation id="1543284117603151572">Importados desde Edge</translation> -<translation id="1544350195767834591">{NUM_COOKIES,plural, =1{1 de otros sitios}other{# de otros sitios}}</translation> <translation id="1545177026077493356">Modo kiosco automático</translation> <translation id="1545786162090505744">URL con %s en el lugar de la consulta</translation> <translation id="1546280085599573572">Esta extensión cambió la página que se muestra al hacer clic en el botón Página principal.</translation> @@ -444,7 +444,6 @@ <translation id="1559235587769913376">Introducir caracteres Unicode</translation> <translation id="1561092721008294962">HarfBuzz para el texto de la interfaz de usuario</translation> <translation id="1566049601598938765">Sitio web</translation> -<translation id="1566958206723629112">Flash y PDF</translation> <translation id="1567723158593978621">Cuando se habilita, se usa un nuevo flujo de acceso separado de la contraseña de GAIA para acceder al navegador.</translation> <translation id="1567993339577891801">Consola de JavaScript</translation> <translation id="1568323446248056064">Abrir configuración de pantalla</translation> @@ -573,7 +572,6 @@ <translation id="1723940674997333416">Permitir WebSocket no seguro de origen https</translation> <translation id="1725149567830788547">Mostrar &controles</translation> <translation id="172612876728038702">Se está configurando el TPM. Ten paciencia; esto puede tardar unos minutos.</translation> -<translation id="1727135806684246609">Funciones detalladas de seguridad en material design</translation> <translation id="1729533290416704613">También controla qué página se muestra al realizar búsquedas desde el cuadro multifunción.</translation> <translation id="1731346223650886555">Punto y coma</translation> <translation id="1731589410171062430">Total: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /> (<ph name="NUMBER_OF_PAGES" /> <ph name="PAGE_OR_PAGES_LABEL" />)</translation> @@ -869,6 +867,7 @@ <translation id="218492098606937156">Habilitar eventos de toque</translation> <translation id="2187317261103489799">Detectar (predeterminado)</translation> <translation id="2187895286714876935">Error en el servidor de importación de certificado</translation> +<translation id="2188881192257509750">Abrir <ph name="APPLICATION" /></translation> <translation id="2190069059097339078">Captador de credenciales de Wi-Fi</translation> <translation id="219008588003277019">Módulo Native Client: <ph name="NEXE_NAME" /></translation> <translation id="2190355936436201913">(vacío)</translation> @@ -987,6 +986,7 @@ <translation id="2326606747676847821">Modo de navegación de incógnito</translation> <translation id="2326931316514688470">&Volver a cargar la aplicación</translation> <translation id="2327492829706409234">Habilitar aplicación</translation> +<translation id="2328054044222305089">Se borrarán todos los datos que <ph name="SITE" /> almacenó en tu dispositivo y se restablecerán los permisos que hayas otorgado para su ejecución. ¿Deseas continuar?</translation> <translation id="2329597144923131178">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="2332131598580221120">Ver en Chrome Web Store</translation> <translation id="2332742915001411729">Restablecer configuración de zoom predeterminada</translation> @@ -1172,7 +1172,7 @@ <translation id="2565828445440744174">WebAssembly experimental</translation> <translation id="2566124945717127842">Usa la función Powerwash para restablecer el dispositivo <ph name="IDS_SHORT_PRODUCT_NAME" /> y que quede como nuevo.</translation> <translation id="2568774940984945469">Contenedor de la barra de información</translation> -<translation id="2570000010887652771">Se guardaron los datos.</translation> +<translation id="2570000010887652771">Datos guardados.</translation> <translation id="2570648609346224037">Se produjo un error durante la descarga de la imagen de recuperación.</translation> <translation id="257088987046510401">Temas</translation> <translation id="2572032849266859634">Se concedió acceso de solo lectura a <ph name="VOLUME_NAME" />.</translation> @@ -1262,7 +1262,6 @@ <translation id="2675358154061544447">Compatibilidad muy experimental para procesar iframes entre sitios en procesos separados. En este modo, los documentos comparten una instancia de procesamiento solo si pertenecen al mismo sitio web.</translation> <translation id="2676946222714718093">Reproduciendo en</translation> <translation id="2678063897982469759">Permitir nuevamente</translation> -<translation id="2678246812096664977">Todos los complementos</translation> <translation id="2679385451463308372">Imprimir utilizando el diálogo del sistema…</translation> <translation id="2680208403056680091">Se está controlando tu conexión a Internet</translation> <translation id="268053382412112343">Hi&storial</translation> @@ -1436,7 +1435,6 @@ <translation id="287286579981869940">Agregar <ph name="PROVIDER_NAME" />...</translation> <translation id="2872961005593481000">Cerrar</translation> <translation id="2875698561019555027">(Páginas de error de Chrome)</translation> -<translation id="2879560882721503072">Se almacenó correctamente el certificado de cliente emitido por <ph name="ISSUER" />.</translation> <translation id="288024221176729610">Checo</translation> <translation id="288042212351694283">Accede a tus dispositivos U2F (Universal 2nd Factor).</translation> <translation id="2881966438216424900">Último acceso:</translation> @@ -1585,6 +1583,7 @@ <translation id="3057861065630527966">Crea una copia de seguridad de tus fotos y videos.</translation> <translation id="3058212636943679650">Si alguna vez el sistema operativo de tu computadora requiere una restauración, necesitarás una tarjeta SD de recuperación o una tarjeta de memoria USB.</translation> <translation id="305932878998873762">La caché simple para HTTP es una nueva caché. Depende del sistema de archivos para la asignación de espacio en disco.</translation> +<translation id="3060251871394327123">Se borrarán todos los datos que <ph name="SITE" /> almacenó en tu dispositivo. ¿Deseas continuar?</translation> <translation id="3061650404498811439">Permite el acceso a emoji, escritura a mano y entrada de voz desde el menú de IME de habilitación.</translation> <translation id="3062606427884046423">Usar las notificaciones de Android MediaStyle para las notificaciones de medios de Chrome</translation> <translation id="3063844757726132584">Accede a tus apps con este menú práctico. Juega, participa de videochats, escucha música, edita documentos o consigue más apps.</translation> @@ -1634,6 +1633,7 @@ <translation id="3123569374670379335">(Supervisado)</translation> <translation id="3124111068741548686">A cargo del USUARIO</translation> <translation id="3126026824346185272">Ctrl</translation> +<translation id="3127156390846601284">Se borrarán todos los datos que se almacenan en tu dispositivo y se restablecerán los permisos para todos los sitios que se mostraron. ¿Deseas continuar?</translation> <translation id="312759608736432009">Fabricante del dispositivo:</translation> <translation id="3127919023693423797">Autenticando...</translation> <translation id="3128230619496333808">Pestaña 6</translation> @@ -1732,7 +1732,6 @@ <translation id="3264544094376351444">Fuente Sans-serif</translation> <translation id="3264547943200567728">Error al configurar la red de Chromebox</translation> <translation id="3265459715026181080">Cerrar ventana</translation> -<translation id="3267271790328635957">Solo PDF</translation> <translation id="3267726687589094446">Seguir permitiendo las descargas automáticas de varios archivos</translation> <translation id="3267998849713137817">Hora de modificación</translation> <translation id="3268451620468152448">Pestañas abiertas</translation> @@ -1978,6 +1977,7 @@ <translation id="3574210789297084292">acceder</translation> <translation id="3574305903863751447"><ph name="CITY" />, <ph name="STATE" /> <ph name="COUNTRY" /></translation> <translation id="357479282490346887">Lituano</translation> +<translation id="3575927481544652747">Inhabilita Windows Runtime MIDI API para WebMIDI, que está habilitada de forma predeterminada en Windows 10 y versiones posteriores.</translation> <translation id="3576324189521867626">Se instaló correctamente</translation> <translation id="3578331450833904042">Predeterminado (escuchar todo)</translation> <translation id="3578594933904494462">Se está compartiendo el contenido de esta pestaña.</translation> @@ -2031,8 +2031,6 @@ <translation id="3627320433825461852">Falta menos de un minuto.</translation> <translation id="3627588569887975815">Abrir el enlace en una ventana de navegación de incó&gnito</translation> <translation id="3627671146180677314">Tiempo de renovación del certificado Netscape</translation> -<translation id="3629326610814700057">Permite que el administrador de almacenamiento administre el almacenamiento local.</translation> -<translation id="3630337581925712713"><ph name="PERMISSION_TYPE_LABEL" />:</translation> <translation id="3631337165634322335">Las siguientes excepciones sólo aplican a la sesión incógnito actual.</translation> <translation id="3633586230741134985">Configuración del selector de aplicaciones</translation> <translation id="3633997706330212530">Tienes la opción de desactivar estos servicios.</translation> @@ -2055,7 +2053,8 @@ <translation id="3654045516529121250">Leer la configuración de accesibilidad</translation> <translation id="3654092442379740616">Error de sincronización: <ph name="PRODUCT_NAME" /> caducó y necesita que lo actualices.</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{Tiene acceso permanente a un archivo.}other{Tiene acceso permanente a # archivos.}}</translation> -<translation id="3657468915905674858">Habilitar bloqueo de Win32k para PPAPI</translation> +<translation id="365793796291733849"><ph name="BEGIN_PARAGRAPH1" />Al activar la copia de seguridad automática, los datos del dispositivo y de las apps se guardan de forma periódica en una carpeta privada en Google Drive. Los datos de las apps pueden incluir cualquier información que una app haya guardado (en función de la configuración del programador), p. ej., datos potencialmente confidenciales, como contactos, mensajes y fotos.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />La copia de seguridad de los datos no incide en la cuota de Drive storage. No se creará una copia de seguridad de los archivos de gran tamaño o que los programadores hayan decidido excluir del servicio.<ph name="END_PARAGRAPH2" /></translation> <translation id="3660234220361471169">No es de confianza</translation> <translation id="3665589677786828986">Chrome detectó que otro programa dañó algunas opciones de configuración, por lo que la restableció a los valores predeterminados.</translation> <translation id="3665842570601375360">Seguridad:</translation> @@ -2110,6 +2109,7 @@ <translation id="3733127536501031542">Servidor SLL con suplemento especial</translation> <translation id="3736520371357197498">Si comprendes los riesgos para tu seguridad, puedes <ph name="BEGIN_LINK" />visitar este sitio no seguro<ph name="END_LINK" /> antes de que se hayan eliminado los programas peligrosos.</translation> <translation id="3738924763801731196"><ph name="OID" />:</translation> +<translation id="3739254215541673094">¿Abrir <ph name="APPLICATION" />?</translation> <translation id="3739798227959604811">Tiempo para repetición:</translation> <translation id="3741158646617793859"><ph name="DEVICE_NAME" /> aparecerá ahora en la Consola del administrador.</translation> <translation id="3741243925913727067">Crea una copia de seguridad de las fotos y los videos del dispositivo de medios en Google Drive.</translation> @@ -2348,7 +2348,6 @@ <translation id="4058793769387728514">Controlar documento ahora</translation> <translation id="4059285154003114015">&Imprimir marco…</translation> <translation id="406070391919917862">Aplicaciones de fondo</translation> -<translation id="4061502419206152498">Mostrar solo no seguros y no animados</translation> <translation id="4062251648694601778">Disfruta tu dispositivo <ph name="SHORT_PRODUCT_NAME" />. Si tienes alguna pregunta, puedes hacer clic en el signo "?" de la bandeja de estado en cualquier momento para obtener ayuda.</translation> <translation id="4065876735068446555">Es posible que la red que estás usando (<ph name="NETWORK_ID" />) requiera que visites la página de acceso.</translation> <translation id="4068506536726151626">Esta página contiene elementos de los siguientes sitios que están rastreando tu ubicación:</translation> @@ -2387,7 +2386,6 @@ <translation id="4101878899871018532">El administrador de contraseñas no ofrecerá guardar la credencial que se utilizó en la sincronización.</translation> <translation id="410351446219883937">Reproducción automática</translation> <translation id="4104163789986725820">E&xportar...</translation> -<translation id="4105523032910086267">Establece la animación y visibilidad de las funciones detalladas de seguridad en material design.</translation> <translation id="4105563239298244027">Obtén 1 TB gratuito con Google Drive</translation> <translation id="4109135793348361820">Mover ventana a <ph name="USER_NAME" /> (<ph name="USER_EMAIL" />)</translation> <translation id="4110342520124362335">Las cookies de <ph name="DOMAIN" /> están bloqueadas.</translation> @@ -2438,6 +2436,7 @@ <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="4188447344915957833">Habilita el administrador de almacenamiento en la configuración de material design.</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> <translation id="4193182321948161343">Habilitar el administrador de usuarios de material design</translation> @@ -2645,6 +2644,7 @@ <translation id="4508765956121923607">Ver códig&o fuente</translation> <translation id="4509017836361568632">Descartar foto</translation> <translation id="4509345063551561634">Ubicación:</translation> +<translation id="4513946894732546136">Comentario</translation> <translation id="4514542542275172126">Configurar un nuevo usuario supervisado</translation> <translation id="4514914692061505365">Fuerza el uso del traductor rápido Subzero de PNaCl para todos los archivos pexe.</translation> <translation id="451515744433878153">Quitar</translation> @@ -2743,6 +2743,7 @@ <translation id="4656293982926141856">Esta computadora</translation> <translation id="4656631038341342120">Habilita el shell de RV si está disponible para este dispositivo.</translation> <translation id="4657031070957997341">Siempre permitir complementos en <ph name="HOST" /></translation> +<translation id="466008749075469935">Habilita la intervención para limitar el uso de la CPU en timers en segundo plano a 1%.</translation> <translation id="4663254525753315077">Si es posible, permite colocar el contenido de un elemento de desplazamiento de sobreflujo en una capa compuesta para lograr un desplazamiento más rápido.</translation> <translation id="4664482161435122549">Error en la exportación de PKCS #12</translation> <translation id="4665014895760275686">Fabricante</translation> @@ -2811,6 +2812,7 @@ <translation id="4749157430980974800">Teclado georgiano</translation> <translation id="4750394297954878236">Sugerencias</translation> <translation id="475088594373173692">Primer usuario</translation> +<translation id="4750892496809949692">Prefiero ocultar Flash de la lista de complementos y usar contenido HTML.</translation> <translation id="4750917950439032686">Tu información (p. ej., contraseñas o números de tarjetas de crédito) es privada cuando se envía a este sitio.</translation> <translation id="4753602155423695878">Animación de la barra de progreso de carga de página del teléfono Android</translation> <translation id="4755240240651974342">Teclado finlandés</translation> @@ -2940,7 +2942,7 @@ <translation id="490305855972338124">Configura el tiempo de finalización en la barra de progreso de carga de la página del teléfono Android.</translation> <translation id="4903369323166982260">Ejecutar la Herramienta para limpiar Chrome</translation> <translation id="4906679076183257864">Restablecer valores predeterminados</translation> -<translation id="4907161631261076876">Este archivo no se descarga con frecuencia y es posible que sea peligroso.</translation> +<translation id="4907161631261076876">Este archivo no se descarga con frecuencia y podría ser peligroso.</translation> <translation id="4907306957610201395">Categoría de permiso</translation> <translation id="49088176676474409">Oculta los valores de VPD.</translation> <translation id="4910021444507283344">WebGL</translation> @@ -3085,6 +3087,7 @@ <translation id="5119450342834678097">Opción de solicitud de sitio de tablet en el menú de configuración</translation> <translation id="5120068803556741301">Método de entrada externo</translation> <translation id="5120421890733714118">Confiar en este certificado para identificar sitios web</translation> +<translation id="5120516977819314347">El PIN o la contraseña son incorrectos.</translation> <translation id="5121130586824819730">Tu disco duro está lleno. Guarda en otra ubicación o libera espacio en el disco duro.</translation> <translation id="5125751979347152379">URL no válido.</translation> <translation id="5127881134400491887">Administrar conexiones de red</translation> @@ -3092,6 +3095,7 @@ <translation id="512903556749061217">conectado</translation> <translation id="5129301143853688736">Tu conexión al sitio no es privada. Es posible que los atacantes estén intentando robarte información (p. ej., fotos, contraseñas, mensajes y tarjetas de crédito) de <ph name="DOMAIN" />.</translation> <translation id="5129662217315786329">Polaco</translation> +<translation id="5131347545782851480">Documentos PDF</translation> <translation id="5134856901811723984">Material design en la interfaz de usuario del Sistema operativo Chrome</translation> <translation id="5135533361271311778">No se pudo crear el elemento de marcador.</translation> <translation id="5136529877787728692">F7</translation> @@ -3260,6 +3264,7 @@ <translation id="5328031682234198929">8</translation> <translation id="5329858601952122676">&Suprimir</translation> <translation id="5330145655348521461">Estos archivos están abiertos en otro escritorio. Ve a <ph name="USER_NAME" /> (<ph name="MAIL_ADDRESS" />) para visualizarlos.</translation> +<translation id="5330512191124428349">Obtener información</translation> <translation id="5332624210073556029">Zona horaria:</translation> <translation id="5333807720589685258">Tu tarjeta SIM quedará inhabilitada de forma permanente si no ingresas la clave de desbloqueo de PIN correcta.</translation> @@ -3692,7 +3697,6 @@ <translation id="5892507820957994680">Cancela la lista de renderización de software integrado y habilita la aceleración por GPU en configuraciones de sistemas admitidos.</translation> <translation id="5895138241574237353">Reiniciar</translation> <translation id="5895187275912066135">Emitido el</translation> -<translation id="5898154795085152510">El servidor arrojó un certificado de cliente no válido. Error <ph name="ERROR_NUMBER" /> (<ph name="ERROR_NAME" />).</translation> <translation id="5900302528761731119">Foto de perfil de Google</translation> <translation id="590253956165195626">Preguntarme si quiero traducir páginas que no estén en un idioma que puedo leer</translation> <translation id="5904093760909470684">Configuración de proxy</translation> @@ -3747,6 +3751,8 @@ <translation id="5984222099446776634">Visitados recientemente</translation> <translation id="5984814259619230127">Detección de Bluetooth de baja energía con Smart Lock</translation> <translation id="5986245990306121338">Si se habilita, un selector de pestañas se mostrará incluso cuando la opción "Combinar pestañas y aplicaciones" esté habilitada en la configuración.</translation> +<translation id="5989712527536636369"><ph name="BEGIN_PARAGRAPH1" />Se muestra información general sobre tu dispositivo y su uso, como el nivel de batería, la frecuencia con la que usas tus apps, la calidad y duración de tus conexiones de red (como Wi-Fi y Bluetooth) y los informes de fallos que se crean cuando ocurren errores. Se usará para mejorar los productos y servicios de Google para todos los usuarios. Además, cierta información global permitirá que los socios, como los desarrolladores de Android, mejoren sus apps y productos.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Puedes activarlo o desactivarlo en cualquier momento en la configuración de las apps de Android. No afecta la capacidad de tu dispositivo para enviar la información que necesita para recibir servicios esenciales como seguridad y actualizaciones del sistema.<ph name="END_PARAGRAPH2" /></translation> <translation id="5990198433782424697">Extensiones para las URL chrome://</translation> <translation id="5990814808592353318">Generación manual de contraseñas</translation> <translation id="5991049340509704927">Ampliar</translation> @@ -3760,6 +3766,7 @@ <translation id="6005695835120147974">Router multimedia</translation> <translation id="6007237601604674381">Se produjo un error en al mover el archivo (<ph name="ERROR_MESSAGE" />).</translation> <translation id="6008241731410823808">Envía pings de auditoría de hipervínculos.</translation> +<translation id="6011449291337289699">Borrar los datos del sitio</translation> <translation id="6015796118275082299">Año</translation> <translation id="6016551720757758985">Confirmar Powerwash con retorno a la versión anterior</translation> <translation id="6016809788585079594">Di "OK Google" por última vez.</translation> @@ -3949,7 +3956,6 @@ <translation id="6276301056778294989">Asegúrate de que el dispositivo muestre el mismo código.</translation> <translation id="6277105963844135994">Tiempo de espera de red agotado</translation> <translation id="6277518330158259200">Tomar captura de pantalla</translation> -<translation id="6278428485366576908">Tema</translation> <translation id="6279183038361895380">Presiona |<ph name="ACCELERATOR" />| para mostrar tu cursor</translation> <translation id="6280215091796946657">Acceder con otra cuenta</translation> <translation id="6280912520669706465">ARC</translation> @@ -4201,6 +4207,7 @@ <translation id="6607272825297743757">Información del archivo</translation> <translation id="6607831829715835317">Más herramientas</translation> <translation id="6608140561353073361">Todas las cookies y todos los datos de sitios...</translation> +<translation id="6610183966322615106">Se produjo un error al agregar la impresora</translation> <translation id="6610610633807698299">Ingresar URL...</translation> <translation id="6612358246767739896">Contenido protegido</translation> <translation id="6615455863669487791">Mostrarme</translation> @@ -4264,7 +4271,6 @@ <translation id="6708242697268981054">Origen:</translation> <translation id="6709357832553498500">Conectar a través de <ph name="EXTENSIONNAME" /></translation> <translation id="6710213216561001401">Anterior</translation> -<translation id="6712158998835983046">Mostrar todo, animado</translation> <translation id="6718273304615422081">Comprimiendo…</translation> <translation id="671928215901716392">Bloquear pantalla</translation> <translation id="6721972322305477112">&Archivo</translation> @@ -4536,7 +4542,6 @@ <translation id="7088434364990739311">Error al iniciar la verificación de actualizaciones (código de error <ph name="ERROR" />).</translation> <translation id="708856090370082727">Habilita la compatibilidad con el sobredesplazamiento del teclado en pantalla. Al activar esta opción, el teclado en pantalla solo cambiará el tamaño de la ventana gráfica visual.</translation> <translation id="7088674813905715446">El administrador estableció el estado de desaprovisionamiento para este dispositivo. Para poder utilizarlo en el registro, el administrador debe actualizar el estado del dispositivo a pendiente.</translation> -<translation id="7089609847854449639">Administrador de almacenamiento</translation> <translation id="708969677220991657">Permite el envío de solicitudes al host local por HTTPS aunque se presente un certificado no válido.</translation> <translation id="7092106376816104">Excepciones de ventanas emergentes</translation> <translation id="7093866338626856921">Intercambiar datos con los siguientes dispositivos: <ph name="HOSTNAMES" /></translation> @@ -4576,7 +4581,7 @@ <translation id="715118844758971915">Impresoras clásicas</translation> <translation id="7154130902455071009">Cambiar la página de inicio por <ph name="START_PAGE" /></translation> <translation id="7155171745945906037">Foto existente de la cámara o archivo</translation> -<translation id="715568033737470079">Especifica los complementos de PPAPI que se ejecutarán en la política de zona de pruebas de bloqueo Win32k (solo en Windows 10 y versiones posteriores).</translation> +<translation id="7155226869555939647">Siempre abrir los vínculos para <ph name="APPLICATION" /></translation> <translation id="7156235233373189579">Este archivo se diseñó para una PC con software Windows. No es compatible con tu dispositivo que ejecuta el Sistema operativo Chrome. Busca en <ph name="BEGIN_LINK" />Chrome Web Store<ph name="END_LINK" /> para encontrar una aplicación equivalente. <ph name="BEGIN_LINK_HELP" />Más información<ph name="END_LINK_HELP" /></translation> <translation id="7157063064925785854">Al hacer clic en Continuar, aceptas los siguientes documentos legales: <ph name="LEGAL_DOC_LINK_TEXT_1" />, <ph name="LEGAL_DOC_LINK_TEXT_2" />, <ph name="LEGAL_DOC_LINK_TEXT_3" /> y <ph name="LEGAL_DOC_LINK_TEXT_4" />.</translation> <translation id="7158238151765743968">La conexión a "<ph name="DEVICE_NAME" />" sigue en curso.</translation> @@ -4591,6 +4596,7 @@ <translation id="7175353351958621980">Cargados desde:</translation> <translation id="7180611975245234373">Actualizar</translation> <translation id="7180865173735832675">Personalizar</translation> +<translation id="7181387261278441780">Borrar los datos del sitio y restablecer los permisos</translation> <translation id="7185078796915954712">TLS 1.3</translation> <translation id="7185690883425432021">Oculta los botones de cierre de las pestañas inactivas en la barra de pestañas cuando están apiladas.</translation> <translation id="7186088072322679094">Mantener en la barra de herramientas</translation> @@ -4623,7 +4629,6 @@ <translation id="7223775956298141902">Vaya, no tienes ninguna extensión. :-(</translation> <translation id="7224023051066864079">Máscara de subred:</translation> <translation id="7225179976675429563">Falta el tipo de red.</translation> -<translation id="7230191962699768124">Mostrar todo, no animado</translation> <translation id="7230787553283372882">Personaliza el tamaño del texto</translation> <translation id="7231224339346098802">Utiliza un número para indicar la cantidad de copias que quieres imprimir (1 o más).</translation> <translation id="7238585580608191973">Huella digital SHA-256</translation> @@ -4755,7 +4760,6 @@ <translation id="7409233648990234464">Reiniciar y Powerwash</translation> <translation id="7409836189476010449">Ejecutar Flash</translation> <translation id="7410344089573941623">Preguntar si <ph name="HOST" /> quiere acceder a la cámara y al micrófono</translation> -<translation id="7411343637221933631">{NUM_COOKIES,plural, =1{1 desde este sitio}other{# desde este sitio}}</translation> <translation id="7412226954991670867">Memoria de GPU</translation> <translation id="7416362041876611053">Error de red desconocido</translation> <translation id="7417453074306512035">Teclado etíope</translation> @@ -4877,6 +4881,7 @@ <translation id="756445078718366910">Abrir la ventana del navegador</translation> <translation id="7564847347806291057">Finalizar proceso</translation> <translation id="7566723889363720618">F12</translation> +<translation id="7567314848159753396">Cookie: <ph name="NAME" /></translation> <translation id="756809126120519699">Datos de Chrome borrados</translation> <translation id="7568790562536448087">Actualizando</translation> <translation id="7573172247376861652">Carga de batería</translation> @@ -4917,6 +4922,7 @@ <translation id="7626009897377900107">Generación de contraseñas</translation> <translation id="7627262197844840899">Este sitio no acepta MasterCard.</translation> <translation id="7627790789328695202">El archivo <ph name="FILE_NAME" /> ya existe. Cambia el nombre y vuelve a intentarlo.</translation> +<translation id="7628127343934101653">Abrir archivos PDF en la aplicación predeterminada para ver archivos PDF.</translation> <translation id="762917759028004464">El navegador predeterminado es <ph name="BROWSER_NAME" />.</translation> <translation id="7629536005696009600">Permite que las credenciales almacenadas de las aplicaciones de Android se completen en los sitios web correspondientes.</translation> <translation id="7629827748548208700">Pestaña: <ph name="TAB_NAME" /></translation> @@ -5145,6 +5151,7 @@ <translation id="7957513156576779045">Activar Bluetooth para permitir la sincronización</translation> <translation id="7957615753207896812">Abrir configuración del teclado</translation> <translation id="7959074893852789871">El archivo contenía múltiples certificados. Algunos fueron importados:</translation> +<translation id="7959700692661109221"><ph name="BEGIN_PARAGRAPH" />El servicio de ubicación de Google usa ciertas fuentes, como redes Wi-Fi, para calcular la ubicación de tu dispositivo con más rapidez y precisión. Al activar los servicios de ubicación de Google, el dispositivo entrará en un modo que usa las redes Wi-Fi para proporcionar información sobre la ubicación. Puedes desactivar esta configuración de la ubicación en cualquier momento.<ph name="END_PARAGRAPH" /></translation> <translation id="7961015016161918242">Nunca</translation> <translation id="7964089325405904043">Importación y exportación de contraseñas</translation> <translation id="7965010376480416255">Memoria compartida</translation> @@ -5295,6 +5302,7 @@ <translation id="8146793085009540321">Se produjo un error en el acceso. Comunícate con el administrador o vuelve a intentarlo.</translation> <translation id="8148264977957212129">Método de entrada pinyin</translation> <translation id="8148913456785123871">Mostrar tarjetas de Google Now en el selector</translation> +<translation id="8150391391298684512">Inhabilitar Windows Runtime MIDI API</translation> <translation id="8151185429379586178">Herramientas del programador</translation> <translation id="8151638057146502721">Configurar</translation> <translation id="8151639108075998630">Habilitar navegación para invitados</translation> @@ -5575,6 +5583,7 @@ <translation id="8532294913309524834">Ordena los idiomas según tus preferencias.</translation> <translation id="8535005006684281994">URL de renovación del certificado Netscape</translation> <translation id="8539727552378197395">No (HttpOnly)</translation> +<translation id="8541084862688000575">Cargar las apps de Android de forma automática</translation> <translation id="8543181531796978784">Puedes <ph name="BEGIN_ERROR_LINK" />informar un problema de detección<ph name="END_ERROR_LINK" /> o, si comprendes los riesgos de seguridad, puedes <ph name="BEGIN_LINK" />visitar el sitio no seguro<ph name="END_LINK" />.</translation> <translation id="8545107379349809705">Ocultar información...</translation> <translation id="8545211332741562162">Permite habilitar las páginas que utilizan funciones de JavaScript experimentales.</translation> @@ -5602,7 +5611,6 @@ <translation id="8569764466147087991">Seleccionar un archivo para abrir</translation> <translation id="8571032220281885258">Cuando digas "OK Google", Chrome buscará lo que digas a continuación.</translation> <translation id="8571108619753148184">Servidor 4</translation> -<translation id="8572832761467613633">Solo Flash</translation> <translation id="8572981282494768930">No permitir que ningún sitio acceda a la cámara ni al micrófono</translation> <translation id="8574234089711453001">Permite que se muestre un botón de descarga cuando se abre una página con la URL de medios.</translation> <translation id="857779305329188634">Permite habilitar la admisión del protocolo QUIC experimental.</translation> @@ -5624,6 +5632,7 @@ <translation id="8600929685092827187">Paquetes de reactivación</translation> <translation id="8601206103050338563">Autenticación de cliente TLS WWW</translation> <translation id="8602851771975208551">Otro programa en tu computadora agregó una aplicación que puede cambiar el funcionamiento de Chrome.</translation> +<translation id="8603912787021349466">Permite que las apps de Android se ejecuten de forma automática después de acceder.</translation> <translation id="8605428685123651449">Memoria SQLite</translation> <translation id="8605503133013456784">Error al desconectar y al desincronizar con "<ph name="DEVICE_NAME" />".</translation> <translation id="8606726445206553943">Usar tus dispositivos MIDI</translation> @@ -5976,6 +5985,7 @@ <translation id="9053965862400494292">Se produjo un error al intentar configurar la sincronización.</translation> <translation id="9056034633062863292">Actualizando la Chromebox</translation> <translation id="9056810968620647706">No se encontraron coincidencias.</translation> +<translation id="9057119625587205566">No hay impresoras cerca</translation> <translation id="9059868303873565140">Menú de estado</translation> <translation id="9064142312330104323">Cargando foto de perfil de Google</translation> <translation id="9064275926664971810">Habilita Autocompletar para llenar formularios con un solo clic</translation> @@ -5986,6 +5996,7 @@ <translation id="9067401056540256169">Esta marca pone en riesgo la seguridad de Chrome; utilízala solamente si entiendes lo que hace. Ten en cuenta que esta marca puede eliminarse sin previo aviso. Si está habilitada, los marcos con origen https pueden utilizar WebSockets con una URL no segura (ws://).</translation> <translation id="9068931793451030927">Ruta:</translation> <translation id="9070219033670098627">Cambiar de persona</translation> +<translation id="9070940116164932228">Acelerar timers en segundo plano con gasto alto</translation> <translation id="907148966137935206">No permitir que los sitios muestren ventanas emergentes (recomendado)</translation> <translation id="9072550133391925347"><ph name="PASSWORD_MANAGER_BRAND" /> te permite acceder automáticamente a las apps y los sitios aptos con las contraseñas que guardaste.</translation> <translation id="9073281213608662541">PAP</translation> @@ -6019,6 +6030,7 @@ <translation id="9112614144067920641">Elige un nuevo PIN.</translation> <translation id="9112748030372401671">Cambiar el fondo de pantalla</translation> <translation id="9112987648460918699">Buscar...</translation> +<translation id="9114663181201435112">Acceder de forma fácil</translation> <translation id="9115487443206954631">Administrar dispositivos de transmisión</translation> <translation id="9115675100829699941">&Favoritos</translation> <translation id="9121814364785106365">Abrir como pestaña anclada</translation> @@ -6113,7 +6125,6 @@ <translation id="952992212772159698">No activado</translation> <translation id="960719561871045870">Código del operador</translation> <translation id="960987915827980018">Falta aproximadamente una hora.</translation> -<translation id="962778376131245616">Mostrar solo no seguros, animados</translation> <translation id="96421021576709873">Red Wi-Fi</translation> <translation id="965490406356730238">Habilita la decodificación de MJPEG con aceleración de hardware para fotograma capturado cuando esté disponible.</translation> <translation id="968174221497644223">Caché de aplicación</translation>
diff --git a/chrome/app/resources/generated_resources_es.xtb b/chrome/app/resources/generated_resources_es.xtb index 704c740..5080284 100644 --- a/chrome/app/resources/generated_resources_es.xtb +++ b/chrome/app/resources/generated_resources_es.xtb
@@ -18,7 +18,6 @@ <translation id="1029317248976101138">Acercar</translation> <translation id="1029595648591494741">¿Quieres probar "<ph name="EXTENSION_NAME" />"?</translation> <translation id="1031362278801463162">Cargando vista previa</translation> -<translation id="1031460590482534116">Se ha producido un error al intentar almacenar el certificado de cliente. Error <ph name="ERROR_NUMBER" /> (<ph name="ERROR_NAME" />)</translation> <translation id="1031573127485938293">Preguntar (por política)</translation> <translation id="103279545524624934">Libera espacio del disco para iniciar aplicaciones de Android.</translation> <translation id="1033780634303702874">Acceder a tus dispositivos en serie</translation> @@ -101,6 +100,7 @@ <translation id="1128591060186966949">Editar motor de búsqueda</translation> <translation id="1128987120443782698">El dispositivo de almacenamiento tiene una capacidad de <ph name="DEVICE_CAPACITY" />. Inserta una tarjeta SD o una memoria USB con una capacidad mínima de 4 GB.</translation> <translation id="1137135726305341424">El evento domContentLoaded y todas las cargas de recursos iniciadas antes que este evento (marco principal y mismos iframes de origen).</translation> +<translation id="1138663153846032155">Preferir HTML en lugar de Flash</translation> <translation id="1140351953533677694">Acceder a tus dispositivos en serie y Bluetooth</translation> <translation id="114140604515785785">Directorio raíz:</translation> <translation id="1143142264369994168">Titular del certificado</translation> @@ -252,6 +252,7 @@ <translation id="1351692861129622852">Importando <ph name="FILE_COUNT" /> archivos...</translation> <translation id="1352103415082130575">Teclado tailandés (pattachote)</translation> <translation id="1353686479385938207"><ph name="PROVIDER_NAME" />: <ph name="NETWORK_NAME" /></translation> +<translation id="1353946958707294039">Gestor de almacenamiento de Material Design</translation> <translation id="1353966721814789986">Páginas de inicio</translation> <translation id="1354868058853714482">Adobe Reader no está actualizado y puede que no sea seguro.</translation> <translation id="1355408554203439639">Rasterizador de software 3D</translation> @@ -423,7 +424,6 @@ <translation id="1533920822694388968">Alineación de TV</translation> <translation id="15373452373711364">Cursor del ratón grande</translation> <translation id="1543284117603151572">Importados desde Edge</translation> -<translation id="1544350195767834591">{NUM_COOKIES,plural, =1{1 de otros sitios web}other{# de otros sitios web}}</translation> <translation id="1545177026077493356">Modo kiosco automático</translation> <translation id="1545786162090505744">URL con %s en el lugar de la consulta</translation> <translation id="1546280085599573572">Esta extensión ha cambiado la página que se muestra al hacer clic en el botón Página de inicio.</translation> @@ -447,7 +447,6 @@ <translation id="1559235587769913376">Introducir caracteres Unicode</translation> <translation id="1561092721008294962">HarfBuzz para texto de interfaz de usuario</translation> <translation id="1566049601598938765">Sitio web</translation> -<translation id="1566958206723629112">Flash y PDF</translation> <translation id="1567723158593978621">Cuando la opción está habilitada, al iniciar sesión en el navegador se utilizará el nuevo flujo de inicio de sesión de separación de contraseñas de GAIA.</translation> <translation id="1567993339577891801">Consola JavaScript</translation> <translation id="1568323446248056064">Abrir la configuración de la pantalla</translation> @@ -576,7 +575,6 @@ <translation id="1723940674997333416">Permitir WebSocket no seguro desde un origen https</translation> <translation id="1725149567830788547">Mostrar &controles</translation> <translation id="172612876728038702">Se está configurando el TPM. Ten paciencia, ya que este proceso puede tardar algunos minutos.</translation> -<translation id="1727135806684246609">Información detallada de seguridad de Material Design</translation> <translation id="1729533290416704613">También controla qué página se muestra al hacer búsquedas desde el omnibox.</translation> <translation id="1731346223650886555">Punto y coma</translation> <translation id="1731589410171062430">Total: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /> (<ph name="NUMBER_OF_PAGES" /> <ph name="PAGE_OR_PAGES_LABEL" />)</translation> @@ -873,6 +871,7 @@ <translation id="218492098606937156">Habilitar eventos de toque</translation> <translation id="2187317261103489799">Detectar (predeterminado)</translation> <translation id="2187895286714876935">Error de importación del certificado de servidor</translation> +<translation id="2188881192257509750">Abrir <ph name="APPLICATION" /></translation> <translation id="2190069059097339078">Aplicación para obtener credenciales Wi-Fi</translation> <translation id="219008588003277019">Módulo cliente nativo: <ph name="NEXE_NAME" /></translation> <translation id="2190355936436201913">(vacío)</translation> @@ -991,6 +990,7 @@ <translation id="2326606747676847821">Navegar de incógnito</translation> <translation id="2326931316514688470">&Volver a cargar aplicación</translation> <translation id="2327492829706409234">Habilitar aplicación</translation> +<translation id="2328054044222305089">Esta acción eliminará los datos que <ph name="SITE" /> ha almacenado en tu dispositivo y restablecerá los permisos que hayas concedido. ¿Quieres continuar?</translation> <translation id="2329597144923131178">Accede para ver marcadores, historial, contraseñas y otros en dispos.</translation> <translation id="2332131598580221120">Ver en Chrome Web Store</translation> <translation id="2332742915001411729">Restablecer nivel de zoom predeterminado</translation> @@ -1266,7 +1266,6 @@ <translation id="2675358154061544447">Compatibilidad altamente experimental para representar marcos flotantes entre sitios en procesos distintos. En este modo, los documentos compartirán un proceso de renderización únicamente si pertenecen al mismo sitio web.</translation> <translation id="2676946222714718093">Reproduciendo en</translation> <translation id="2678063897982469759">Volver a habilitar</translation> -<translation id="2678246812096664977">Todos los complementos</translation> <translation id="2679385451463308372">Imprimir usando el diálogo del sistema...</translation> <translation id="2680208403056680091">Tu conexión a Internet está siendo controlada</translation> <translation id="268053382412112343">Hi&storial</translation> @@ -1442,7 +1441,6 @@ <translation id="287286579981869940">Añadir <ph name="PROVIDER_NAME" />...</translation> <translation id="2872961005593481000">Apagar</translation> <translation id="2875698561019555027">(Páginas de error de Chrome)</translation> -<translation id="2879560882721503072">El certificado de cliente emitido por <ph name="ISSUER" /> se ha almacenado correctamente.</translation> <translation id="288024221176729610">Checo</translation> <translation id="288042212351694283">Acceso a tus dispositivos U2F (Universal 2nd Factor)</translation> <translation id="2881966438216424900">Último acceso:</translation> @@ -1478,7 +1476,7 @@ <translation id="2918322085844739869">4</translation> <translation id="2918583523892407401">Utilizar zona de pruebas de Sincronización de Chrome</translation> <translation id="291886813706048071">Puedes buscar desde aquí con <ph name="SEARCH_ENGINE" /></translation> -<translation id="2921081876747860777">Crea una contraseña para proteger tus datos locales.</translation> +<translation id="2921081876747860777">Crea una contraseña para proteger tus datos locales</translation> <translation id="2923240520113693977">Estonio</translation> <translation id="29232676912973978">Administrar conexiones...</translation> <translation id="2924296707677495905">Transliteración (namaskaram → ನಮಸ್ಕಾರ)</translation> @@ -1591,6 +1589,7 @@ <translation id="3057861065630527966">Realiza copias de seguridad de tus fotos y vídeos</translation> <translation id="3058212636943679650">Si en algún momento necesitas restaurar el sistema operativo de tu ordenador, necesitarás una tarjeta SD de recuperación o una memoria USB.</translation> <translation id="305932878998873762">La caché simple para HTTP es una nueva caché que utiliza el sistema de archivos para la asignación de espacio de disco.</translation> +<translation id="3060251871394327123">Esta acción eliminará los datos que <ph name="SITE" /> ha almacenado en tu dispositivo. ¿Quieres continuar?</translation> <translation id="3061650404498811439">Habilita el acceso a emojis, escritura a mano y entrada de voz desde el menú de selección de IME</translation> <translation id="3062606427884046423">Utiliza las notificaciones MediaStyle de Android para las notificaciones multimedia de Chrome.</translation> <translation id="3063844757726132584">Accede a todas tus aplicaciones desde este práctico menú. Juega, participa en chats de vídeo, escucha música, edita documentos o descarga más aplicaciones.</translation> @@ -1640,6 +1639,7 @@ <translation id="3123569374670379335">(Supervisado)</translation> <translation id="3124111068741548686">EL USUARIO administra</translation> <translation id="3126026824346185272">Ctrl</translation> +<translation id="3127156390846601284">Esta acción eliminará de tu dispositivo los datos almacenados de todos los sitios web que se muestran. ¿Quieres continuar?</translation> <translation id="312759608736432009">Fabricante del dispositivo:</translation> <translation id="3127919023693423797">Autenticando...</translation> <translation id="3128230619496333808">Pestaña 6</translation> @@ -1738,7 +1738,6 @@ <translation id="3264544094376351444">Fuente Sans-serif</translation> <translation id="3264547943200567728">Error al configurar la red del Chromebox</translation> <translation id="3265459715026181080">Cerrar ventana</translation> -<translation id="3267271790328635957">Solo PDF</translation> <translation id="3267726687589094446">Seguir permitiendo las descargas automáticas de varios archivos</translation> <translation id="3267998849713137817">Hora de modificación</translation> <translation id="3268451620468152448">Pestañas abiertas</translation> @@ -1982,6 +1981,7 @@ <translation id="3574210789297084292">iniciar sesión</translation> <translation id="3574305903863751447"><ph name="CITY" />, <ph name="STATE" /> <ph name="COUNTRY" /></translation> <translation id="357479282490346887">Lituano</translation> +<translation id="3575927481544652747">Inhabilita la API de Windows Runtime MIDI para WebMIDI (habilitada de forma predeterminada en Windows 10 y versiones posteriores).</translation> <translation id="3576324189521867626">Se ha instalado correctamente</translation> <translation id="3578331450833904042">Predeterminado (registra todos los sonidos)</translation> <translation id="3578594933904494462">Se está compartiendo el contenido de esta pestaña.</translation> @@ -2035,8 +2035,6 @@ <translation id="3627320433825461852">Menos de 1 minuto</translation> <translation id="3627588569887975815">Abrir el enlace en una ventana de incó&gnito</translation> <translation id="3627671146180677314">Tiempo de renovación de certificado de Netscape</translation> -<translation id="3629326610814700057">Permite que el gestor de almacenamiento administre el almacenamiento local.</translation> -<translation id="3630337581925712713"><ph name="PERMISSION_TYPE_LABEL" />:</translation> <translation id="3631337165634322335">Las excepciones que se indican a continuación solo se aplican a la sesión de incógnito actual</translation> <translation id="3633586230741134985">Configuración del menú de aplicaciones</translation> <translation id="3633997706330212530">Puedes inhabilitar estos servicios si quieres.</translation> @@ -2059,7 +2057,8 @@ <translation id="3654045516529121250">Leer tu configuración de accesibilidad</translation> <translation id="3654092442379740616">Error de sincronización: <ph name="PRODUCT_NAME" /> está obsoleto y debe actualizarse.</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{Tiene acceso permanente a un archivo.}other{Tiene acceso permanente a # archivos.}}</translation> -<translation id="3657468915905674858">Habilitar bloqueo de Win32k para PPAPI.</translation> +<translation id="365793796291733849"><ph name="BEGIN_PARAGRAPH1" />Al activar la copia de seguridad automática, los datos del dispositivo y de las aplicaciones se guardan de forma periódica en una carpeta privada de Google Drive. Los datos de aplicaciones pueden ser cualquier tipo de información que guarden las aplicaciones (en función de la configuración de los desarrolladores), como datos que pueden ser confidenciales (por ejemplo, contactos, mensajes y fotos).<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Los datos de la copia de seguridad no se tienen en cuenta para calcular tu espacio de almacenamiento de Google Drive. Los archivos grandes, o aquellos que los desarrolladores hayan excluido del servicio, no se incluirán en la copia de seguridad.<ph name="END_PARAGRAPH2" /></translation> <translation id="3660234220361471169">No es de confianza</translation> <translation id="3665589677786828986">Chrome ha detectado que otro programa ha dañado algunas opciones de configuración y ha restablecido la configuración predeterminada original.</translation> <translation id="3665842570601375360">Seguridad:</translation> @@ -2114,6 +2113,7 @@ <translation id="3733127536501031542">Servidor SSL con certificado Step-Up</translation> <translation id="3736520371357197498">Si entiendes los riesgos para tu seguridad, puedes <ph name="BEGIN_LINK" />acceder a este sitio no seguro<ph name="END_LINK" /> antes de que se hayan eliminado los programas peligrosos.</translation> <translation id="3738924763801731196"><ph name="OID" />:</translation> +<translation id="3739254215541673094">¿Abrir <ph name="APPLICATION" />?</translation> <translation id="3739798227959604811">Tiempo para repetición:</translation> <translation id="3741158646617793859"><ph name="DEVICE_NAME" /> aparecerá ahora en la Consola del administrador</translation> <translation id="3741243925913727067">Realiza una copia de seguridad en Google Drive de los vídeos y de las fotos de tu dispositivo multimedia.</translation> @@ -2351,7 +2351,6 @@ <translation id="4058793769387728514">Comprobar el documento ahora</translation> <translation id="4059285154003114015">&Imprimir marco...</translation> <translation id="406070391919917862">Aplicaciones en segundo plano</translation> -<translation id="4061502419206152498">Mostrar solo contenido no seguro como no animado</translation> <translation id="4062251648694601778">Disfruta de tu dispositivo <ph name="SHORT_PRODUCT_NAME" />. Si tienes alguna pregunta, puedes hacer clic en el signo "?" de la bandeja de estado en cualquier momento para obtener ayuda.</translation> <translation id="4065876735068446555">La red que estás utilizando (<ph name="NETWORK_ID" />) puede requerir el acceso a su página de inicio de sesión.</translation> <translation id="4068506536726151626">Esta página contiene elementos de los siguientes sitios que hacen un seguimiento de tu ubicación:</translation> @@ -2390,7 +2389,6 @@ <translation id="4101878899871018532">El administrador de contraseñas no ofrecerá la posibilidad de guardar las credenciales utilizadas para la sincronización.</translation> <translation id="410351446219883937">Reproducción automática</translation> <translation id="4104163789986725820">E&xportar...</translation> -<translation id="4105523032910086267">Configura la animación y visibilidad de la información sobre seguridad detallada en Material Design.</translation> <translation id="4105563239298244027">Consigue 1 TB gratis con Google Drive</translation> <translation id="4109135793348361820">Mover ventana a <ph name="USER_NAME" /> (<ph name="USER_EMAIL" />)</translation> <translation id="4110342520124362335">Se han bloqueado las cookies de <ph name="DOMAIN" />.</translation> @@ -2441,6 +2439,7 @@ <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="4188447344915957833">Habilita el gestor de almacenamiento en la configuración de Material Design.</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> <translation id="4193182321948161343">Habilitar el administrador de usuarios de Material Design</translation> @@ -2539,7 +2538,7 @@ <translation id="4322394346347055525">Cerrar las demás pestañas</translation> <translation id="4325378361067528777">Habilitar el modo en segundo plano de la API de Push</translation> <translation id="4330387663455830245">No traducir nunca del <ph name="LANGUAGE" /></translation> -<translation id="4330437798887640816">Habilita el modo de contraste alto</translation> +<translation id="4330437798887640816">Habilita o inhabilita el modo de contraste alto</translation> <translation id="4333854382783149454">PKCS #1 SHA-1 con cifrado RSA</translation> <translation id="4335713051520279344">Este ordenador se reiniciará en un segundo. Pulsa cualquier tecla para seguir con la exploración.</translation> @@ -2648,6 +2647,7 @@ <translation id="4508765956121923607">Ver código f&uente</translation> <translation id="4509017836361568632">Descartar foto</translation> <translation id="4509345063551561634">Ubicación:</translation> +<translation id="4513946894732546136">Comentarios</translation> <translation id="4514542542275172126">Configurar nuevo usuario supervisado</translation> <translation id="4514914692061505365">Fuerza el uso del rápido traductor Subzero de PNaCl para todos los archivos de formato Portable Executable.</translation> <translation id="451515744433878153">Quitar</translation> @@ -2746,6 +2746,7 @@ <translation id="4656293982926141856">Este ordenador</translation> <translation id="4656631038341342120">Habilita VR Shell si está disponible para este dispositivo.</translation> <translation id="4657031070957997341">Permitir siempre complementos en <ph name="HOST" /></translation> +<translation id="466008749075469935">Permite que la intervención limite el uso de la CPU de los temporizadores en segundo plano al 1%.</translation> <translation id="4663254525753315077">Si es posible, coloca el contenido de desplazamiento de un elemento de desplazamiento de flujo excesivo en una capa compuesta para lograr un desplazamiento más rápido.</translation> <translation id="4664482161435122549">Error de exportación de archivos PKCS #12</translation> <translation id="4665014895760275686">Fabricante</translation> @@ -2814,6 +2815,7 @@ <translation id="4749157430980974800">Teclado georgiano</translation> <translation id="4750394297954878236">Sugerencias</translation> <translation id="475088594373173692">Primer usuario</translation> +<translation id="4750892496809949692">Prefiere contenido HTML ocultando Flash de la lista de complementos.</translation> <translation id="4750917950439032686">Tu información (por ejemplo, las contraseñas o los números de las tarjetas de crédito) es privada cuando se envía a este sitio web.</translation> <translation id="4753602155423695878">Animación de la barra de progreso de carga de página de teléfonos Android</translation> <translation id="4755240240651974342">Teclado finlandés</translation> @@ -3087,6 +3089,7 @@ <translation id="5119450342834678097">Opción de solicitud de sitio web de tablet en el menú de configuración</translation> <translation id="5120068803556741301">Método de entrada externo</translation> <translation id="5120421890733714118">Confiar en este certificado para identificar sitios web</translation> +<translation id="5120516977819314347">El PIN o la contraseña son incorrectos.</translation> <translation id="5121130586824819730">Tu disco duro está lleno. Guarda el archivo en otra ubicación o libera espacio en el disco duro.</translation> <translation id="5125751979347152379">La URL no es válida.</translation> <translation id="5127881134400491887">Administrar conexiones de red</translation> @@ -3094,6 +3097,7 @@ <translation id="512903556749061217">conectado</translation> <translation id="5129301143853688736">Tu conexión al sitio no es privada. Los atacantes podrían intentar robar tu información (por ejemplo, fotos, contraseñas, mensajes y tarjetas de crédito) de <ph name="DOMAIN" />.</translation> <translation id="5129662217315786329">Polaco</translation> +<translation id="5131347545782851480">Documentos PDF</translation> <translation id="5134856901811723984">Material Design en la interfaz de usuario del sistema de Chrome OS</translation> <translation id="5135533361271311778">No se ha podido crear un elemento de marcador.</translation> <translation id="5136529877787728692">F7</translation> @@ -3260,6 +3264,7 @@ <translation id="5328031682234198929">8</translation> <translation id="5329858601952122676">&Suprimir</translation> <translation id="5330145655348521461">Estos archivos se han abierto en un escritorio diferente. Ve a <ph name="USER_NAME" /> (<ph name="MAIL_ADDRESS" />) para verlo.</translation> +<translation id="5330512191124428349">Obtener información</translation> <translation id="5332624210073556029">Zona horaria:</translation> <translation id="5333807720589685258">La tarjeta SIM se inhabilitará de forma permanente si no introduces el código PUK correcto.</translation> @@ -3692,7 +3697,6 @@ <translation id="5892507820957994680">Ignora la lista de renderización por software y habilita la aceleración por GPU si el sistema lo permite.</translation> <translation id="5895138241574237353">Reiniciar</translation> <translation id="5895187275912066135">Emitido el</translation> -<translation id="5898154795085152510">El servidor ha devuelto un certificado de cliente no válido. Error <ph name="ERROR_NUMBER" /> (<ph name="ERROR_NAME" />)</translation> <translation id="5900302528761731119">Foto de perfil de Google</translation> <translation id="590253956165195626">Preguntar si quieres traducir páginas que no estén escritas en un idioma que entiendas.</translation> <translation id="5904093760909470684">Configuración de proxy</translation> @@ -3747,6 +3751,8 @@ <translation id="5984222099446776634">Visitados recientemente</translation> <translation id="5984814259619230127">Descubrimiento del Bluetooth de bajo consumo de Smart Lock</translation> <translation id="5986245990306121338">Si se habilita, la función de cambio de pestaña aparecerá incluso si la opción Combinar pestañas y aplicaciones está activada.</translation> +<translation id="5989712527536636369"><ph name="BEGIN_PARAGRAPH1" />Esta opción permite el envío de información general sobre tu dispositivo y su uso, como el nivel de la batería, la frecuencia con la que se usan las aplicaciones, la calidad y duración de las conexiones de red (por ejemplo, Wi-Fi y Bluetooth) y los informes sobre fallos cuando el dispositivo no funciona como debería. Esta información se usará para mejorar los productos y servicios de Google para todo el mundo. Parte de los datos recopilados también ayudarán a nuestros partners, como los desarrolladores de Android, a mejorar sus aplicaciones y productos.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Puedes activar o desactivar esta opción en cualquier momento en los ajustes de las aplicaciones de Android sin que esto afecte a la capacidad de tu dispositivo de enviar la información necesaria para recibir servicios esenciales, como actualizaciones del sistema y funciones de seguridad.<ph name="END_PARAGRAPH2" /></translation> <translation id="5990198433782424697">Extensiones en las URL chrome://</translation> <translation id="5990814808592353318">Generación de contraseñas manual.</translation> <translation id="5991049340509704927">Ampliar</translation> @@ -3760,6 +3766,7 @@ <translation id="6005695835120147974">Router multimedia</translation> <translation id="6007237601604674381">Se ha producido un error al mover el archivo (<ph name="ERROR_MESSAGE" />).</translation> <translation id="6008241731410823808">Envía pings de auditoría de hiperenlaces.</translation> +<translation id="6011449291337289699">Borrar datos de sitios web</translation> <translation id="6015796118275082299">Año</translation> <translation id="6016551720757758985">Confirmar Powerwash para volver a la versión anterior</translation> <translation id="6016809788585079594">Di "Ok Google" una última vez</translation> @@ -3949,7 +3956,6 @@ <translation id="6276301056778294989">Asegúrate de que se muestre el mismo código en el dispositivo.</translation> <translation id="6277105963844135994">Tiempo de espera de red agotado</translation> <translation id="6277518330158259200">H&acer captura de pantalla</translation> -<translation id="6278428485366576908">Tema</translation> <translation id="6279183038361895380">Pulsa |<ph name="ACCELERATOR" />| para mostrar el cursor</translation> <translation id="6280215091796946657">Iniciar sesión con otra cuenta</translation> <translation id="6280912520669706465">ARC</translation> @@ -4200,6 +4206,7 @@ <translation id="6607272825297743757">Información del archivo</translation> <translation id="6607831829715835317">Más herramientas</translation> <translation id="6608140561353073361">Todas las cookies y los datos de sitios...</translation> +<translation id="6610183966322615106">No se ha podido añadir la impresora</translation> <translation id="6610610633807698299">Introducir URL...</translation> <translation id="6612358246767739896">Contenido protegido</translation> <translation id="6615455863669487791">Ver</translation> @@ -4263,7 +4270,6 @@ <translation id="6708242697268981054">Origen:</translation> <translation id="6709357832553498500">Conectar con <ph name="EXTENSIONNAME" /></translation> <translation id="6710213216561001401">Anterior</translation> -<translation id="6712158998835983046">Mostrar todo el contenido como animado</translation> <translation id="6718273304615422081">Comprimiendo...</translation> <translation id="671928215901716392">Bloquear pantalla</translation> <translation id="6721972322305477112">&Archivo</translation> @@ -4398,7 +4404,7 @@ <translation id="6918340160281024199">Estilo Workman (EE. UU.)</translation> <translation id="6920569915859786172">Activar siempre la intervención de user-agent para cargar WebFonts.</translation> <translation id="6920989436227028121">Abrir como pestaña normal</translation> -<translation id="6922128026973287222">Ahorra datos y navega más rápido con el Economizador de datos de Google. Haz clic para obtener más información.</translation> +<translation id="6922128026973287222">Ahorra datos y navega más rápido con Ahorro de Datos de Google. Haz clic para obtener más información.</translation> <translation id="6929555043669117778">Seguir bloqueando pop-ups</translation> <translation id="6930242544192836755">Duración</translation> <translation id="6934265752871836553">Utiliza el código bleeding-edge para que Chrome obtenga contenido de forma más rápida. Es muy probable que los cambios en esta ruta impidan que diferentes tipos de contenido funcionen correctamente.</translation> @@ -4468,7 +4474,7 @@ <translation id="7010160495478792664">Decodificación de vídeo acelerada por hardware si está disponible</translation> <translation id="7010400591230614821">Estrategia de liberación de pestañas agresiva</translation> <translation id="701080569351381435">Ver código fuente</translation> -<translation id="7012372675181957985">Es posible que tu cuenta de Google tenga otras formas del historial de navegación en la página <ph name="BEGIN_LINK" />history.google.com<ph name="END_LINK" /></translation> +<translation id="7012372675181957985">Es posible que en tu cuenta de Google haya otros datos de navegación registrados, que puedes consultar en la página <ph name="BEGIN_LINK" />history.google.com<ph name="END_LINK" /></translation> <translation id="7012435537548305893">Habilita la lista de aplicaciones en pantalla completa en modo de vista táctil.</translation> <translation id="7013485839273047434">Obtener más extensiones</translation> <translation id="7014174261166285193">Error de instalación</translation> @@ -4534,7 +4540,6 @@ <translation id="7088434364990739311">No se ha podido iniciar la comprobación de actualizaciones (código de error <ph name="ERROR" />).</translation> <translation id="708856090370082727">Permite habilitar la compatibilidad del desplazamiento con rebote en el teclado en pantalla. Con esta marca activada, el teclado en pantalla solo modifica el tamaño de la ventana gráfica visual.</translation> <translation id="7088674813905715446">El administrador ha puesto este dispositivo en estado de desaprovisionado. Para poder utilizarlo en el registro, el administrador debe actualizar el estado del dispositivo a pendiente.</translation> -<translation id="7089609847854449639">Gestor de almacenamiento</translation> <translation id="708969677220991657">Permite enviar solicitudes a localhost mediante HTTPS incluso cuando se presenta un certificado no válido.</translation> <translation id="7092106376816104">Excepciones de ventanas emergentes</translation> <translation id="7093866338626856921">Intercambiar datos con los dispositivos denominados <ph name="HOSTNAMES" /></translation> @@ -4574,7 +4579,7 @@ <translation id="715118844758971915">Impresoras clásicas</translation> <translation id="7154130902455071009">Cambiar página de inicio por: <ph name="START_PAGE" /></translation> <translation id="7155171745945906037">Foto de la cámara o archivo</translation> -<translation id="715568033737470079">Especifica los complementos PPAPI que se ejecutarán en la política de zona de pruebas de bloqueo de Win32k (solo Windows 10 y versiones superiores).</translation> +<translation id="7155226869555939647">Abrir siempre los enlaces de <ph name="APPLICATION" /></translation> <translation id="7156235233373189579">Este archivo está diseñado para un ordenador que utilice software de Windows. No es compatible con tu dispositivo, que utiliza Chrome OS. Puedes buscar una aplicación equivalente adecuada en <ph name="BEGIN_LINK" />Chrome Web Store<ph name="END_LINK" />.<ph name="BEGIN_LINK_HELP" />Más información<ph name="END_LINK_HELP" /></translation> <translation id="7157063064925785854">Al hacer clic en Continuar, aceptas las disposiciones de los siguientes documentos legales: <ph name="LEGAL_DOC_LINK_TEXT_1" />, <ph name="LEGAL_DOC_LINK_TEXT_2" />, <ph name="LEGAL_DOC_LINK_TEXT_3" /> y <ph name="LEGAL_DOC_LINK_TEXT_4" />.</translation> <translation id="7158238151765743968">La conexión con <ph name="DEVICE_NAME" /> sigue en curso.</translation> @@ -4589,6 +4594,7 @@ <translation id="7175353351958621980">Cargado desde:</translation> <translation id="7180611975245234373">Actualizar</translation> <translation id="7180865173735832675">Personalizar</translation> +<translation id="7181387261278441780">Borrar y restablecer sitio web</translation> <translation id="7185078796915954712">TLS 1.3</translation> <translation id="7185690883425432021">Oculta botones de cierre de pestañas inactivas cuando la barra de pestañas está en modo apilado.</translation> <translation id="7186088072322679094">Mantener en la barra de herramientas</translation> @@ -4621,7 +4627,6 @@ <translation id="7223775956298141902">Vaya, no tienes ninguna extensión :-(</translation> <translation id="7224023051066864079">Máscara de subred:</translation> <translation id="7225179976675429563">Falta el tipo de red.</translation> -<translation id="7230191962699768124">Mostrar todo el contenido como no animado</translation> <translation id="7230787553283372882">Personalizar el tamaño del texto</translation> <translation id="7231224339346098802">Escribe un número para indicar el número de copias que quieres imprimir (una copia o varias).</translation> <translation id="7238585580608191973">Huella digital SHA-256</translation> @@ -4752,7 +4757,6 @@ <translation id="7409233648990234464">Reiniciar y Powerwash</translation> <translation id="7409836189476010449">Ejecutar Flash</translation> <translation id="7410344089573941623">Preguntar si <ph name="HOST" /> quiere acceder a la cámara y al micrófono</translation> -<translation id="7411343637221933631">{NUM_COOKIES,plural, =1{1 de este sitio web}other{# de este sitio web}}</translation> <translation id="7412226954991670867">Memoria de la GPU</translation> <translation id="7416362041876611053">Error de red desconocido</translation> <translation id="7417453074306512035">Teclado etíope</translation> @@ -4874,6 +4878,7 @@ <translation id="756445078718366910">Abrir ventana del navegador</translation> <translation id="7564847347806291057">Finalizar proceso</translation> <translation id="7566723889363720618">F12</translation> +<translation id="7567314848159753396">Cookie: <ph name="NAME" /></translation> <translation id="756809126120519699">Datos de Chrome borrados</translation> <translation id="7568790562536448087">Actualización</translation> <translation id="7573172247376861652">Carga de batería</translation> @@ -4914,6 +4919,7 @@ <translation id="7626009897377900107">Generación de contraseñas</translation> <translation id="7627262197844840899">Este sitio no acepta MasterCard.</translation> <translation id="7627790789328695202">¡Vaya! <ph name="FILE_NAME" /> ya existe. Elige otro nombre y vuelve a intentarlo.</translation> +<translation id="7628127343934101653">Abrir archivos PDF en la aplicación de visor de PDF predeterminada.</translation> <translation id="762917759028004464">El navegador predeterminado es <ph name="BROWSER_NAME" />.</translation> <translation id="7629536005696009600">Permite que las credenciales almacenadas de las aplicaciones de Android se completen en los sitios web correspondientes.</translation> <translation id="7629827748548208700">Pestaña: <ph name="TAB_NAME" /></translation> @@ -5142,6 +5148,7 @@ <translation id="7957513156576779045">Activar el Bluetooth para permitir la vinculación</translation> <translation id="7957615753207896812">Abrir la configuración del teclado</translation> <translation id="7959074893852789871">El archivo contenía varios certificados, pero algunos de ellos no se han importado:</translation> +<translation id="7959700692661109221"><ph name="BEGIN_PARAGRAPH" />El servicio de ubicación de Google usa fuentes (por ejemplo, redes Wi-Fi) para calcular la ubicación del dispositivo de forma más rápida y precisa. Si activas los servicios de ubicación de Google, se activará un modo en el dispositivo que usa las redes Wi-Fi para proporcionar información sobre tu ubicación. Puedes acceder a los ajustes de ubicación para desactivar esta función en cualquier momento.<ph name="END_PARAGRAPH" /></translation> <translation id="7961015016161918242">Nunca</translation> <translation id="7964089325405904043">Importar y exportar contraseñas</translation> <translation id="7965010376480416255">Memoria compartida</translation> @@ -5292,6 +5299,7 @@ <translation id="8146793085009540321">Se ha producido un error al iniciar sesión. Ponte en contacto con el administrador o vuelve a intentarlo.</translation> <translation id="8148264977957212129">Método de entrada de pinyin</translation> <translation id="8148913456785123871">Mostrar tarjetas de Google Now en el menú de aplicaciones</translation> +<translation id="8150391391298684512">Inhabilitar la API de Windows Runtime MIDI</translation> <translation id="8151185429379586178">Herramientas para desarrolladores</translation> <translation id="8151638057146502721">Configurar</translation> <translation id="8151639108075998630">Habilitar navegación como invitado</translation> @@ -5574,6 +5582,7 @@ <translation id="8532294913309524834">Ordenar idiomas según tus preferencias.</translation> <translation id="8535005006684281994">URL de renovación de certificado de Netscape</translation> <translation id="8539727552378197395">No (HttpOnly)</translation> +<translation id="8541084862688000575">Cargar aplicaciones de Android automáticamente</translation> <translation id="8543181531796978784">Puedes <ph name="BEGIN_ERROR_LINK" />informar de un problema de detección<ph name="END_ERROR_LINK" /> o, si comprendes los riesgos que conlleva esta acción para tu seguridad, <ph name="BEGIN_LINK" />accede a este sitio web no seguro<ph name="END_LINK" />.</translation> <translation id="8545107379349809705">Ocultar información...</translation> <translation id="8545211332741562162">Permite que las páginas web utilicen funciones experimentales de JavaScript.</translation> @@ -5601,7 +5610,6 @@ <translation id="8569764466147087991">Selecciona un archivo para abrir</translation> <translation id="8571032220281885258">Cuando digas "OK Google", Chrome buscará lo que digas a continuación.</translation> <translation id="8571108619753148184">Servidor 4</translation> -<translation id="8572832761467613633">Solo Flash</translation> <translation id="8572981282494768930">No permitir que los sitios accedan a tu cámara ni a tu micrófono</translation> <translation id="8574234089711453001">Permite que se muestre un botón de descarga al abrir una página con una URL multimedia.</translation> <translation id="857779305329188634">Habilita la admisión del protocolo QUIC experimental.</translation> @@ -5623,6 +5631,7 @@ <translation id="8600929685092827187">Activar al recibir paquetes</translation> <translation id="8601206103050338563">Autenticación de cliente WWW TLS</translation> <translation id="8602851771975208551">Otro programa de tu ordenador ha añadido una aplicación que puede cambiar el funcionamiento de Chrome.</translation> +<translation id="8603912787021349466">Permite que las aplicaciones de Android se inicien automáticamente después de iniciar sesión.</translation> <translation id="8605428685123651449">Memoria SQLite</translation> <translation id="8605503133013456784">No se pudo desconectar ni desincronizar de "<ph name="DEVICE_NAME" />".</translation> <translation id="8606726445206553943">Utilizar tus dispositivos MIDI</translation> @@ -5975,6 +5984,7 @@ <translation id="9053965862400494292">Se ha producido un error al intentar configurar la sincronización.</translation> <translation id="9056034633062863292">Actualizando Chromebox</translation> <translation id="9056810968620647706">No se ha encontrado ningún resultado coincidente.</translation> +<translation id="9057119625587205566">No hay impresoras cercanas</translation> <translation id="9059868303873565140">Menú de estado</translation> <translation id="9064142312330104323">Cargando la foto de perfil de Google</translation> <translation id="9064275926664971810">Habilita Autocompletar para rellenar formularios web con un solo clic</translation> @@ -5985,6 +5995,7 @@ <translation id="9067401056540256169">Esta opción hace que Chrome no sea seguro. Utilízala únicamente si entiendes su función. Ten en cuenta que esta opción se puede eliminar sin previo aviso. Si se habilita, los marcos con un origen https pueden utilizar WebSockets con una URL no segura (ws://).</translation> <translation id="9068931793451030927">Ruta:</translation> <translation id="9070219033670098627">Cambiar de persona</translation> +<translation id="9070940116164932228">Acelerar los temporizadores en segundo plano de las tareas que consumen una gran cantidad de recursos</translation> <translation id="907148966137935206">No permitir que ningún sitio muestre ventanas emergentes (recomendado)</translation> <translation id="9072550133391925347"><ph name="PASSWORD_MANAGER_BRAND" /> inicia sesión automáticamente en aplicaciones y sitios web aptos con las contraseñas que has guardado.</translation> <translation id="9073281213608662541">PAP</translation> @@ -6019,6 +6030,7 @@ <translation id="9112614144067920641">Selecciona un nuevo PIN.</translation> <translation id="9112748030372401671">Cambia tu fondo de pantalla</translation> <translation id="9112987648460918699">Buscar...</translation> +<translation id="9114663181201435112">Iniciar sesión fácilmente</translation> <translation id="9115487443206954631">Administrar dispositivos Google Cast</translation> <translation id="9115675100829699941">&Marcadores</translation> <translation id="9121814364785106365">Abrir como pestaña fija</translation> @@ -6113,7 +6125,6 @@ <translation id="952992212772159698">Sin activar</translation> <translation id="960719561871045870">Código del operador</translation> <translation id="960987915827980018">Aproximadamente 1 hora</translation> -<translation id="962778376131245616">Mostrar solo contenido no seguro como animado</translation> <translation id="96421021576709873">Red Wi-Fi</translation> <translation id="965490406356730238">Permite habilitar la opción de decodificación de mjpeg acelerada por hardware para el fotograma capturado si está disponible.</translation> <translation id="968174221497644223">Caché de aplicación</translation>
diff --git a/chrome/app/resources/generated_resources_et.xtb b/chrome/app/resources/generated_resources_et.xtb index c42a29d3..8d3750a 100644 --- a/chrome/app/resources/generated_resources_et.xtb +++ b/chrome/app/resources/generated_resources_et.xtb
@@ -18,7 +18,6 @@ <translation id="1029317248976101138">Suumi</translation> <translation id="1029595648591494741">Kas proovida laiendust „<ph name="EXTENSION_NAME" />”?</translation> <translation id="1031362278801463162">Eelvaate laadimine</translation> -<translation id="1031460590482534116">Kliendi sertifikaadi salvestamisel ilmnes viga. Viga <ph name="ERROR_NUMBER" /> (<ph name="ERROR_NAME" />).</translation> <translation id="1031573127485938293">Küsi (reegliga)</translation> <translation id="103279545524624934">Vabastage Androidi rakenduste käivitamiseks kettaruumi.</translation> <translation id="1033780634303702874">Juurdepääs jadaseadmetele</translation> @@ -101,6 +100,7 @@ <translation id="1128591060186966949">Otsingumootori muutmine</translation> <translation id="1128987120443782698">Salvestusseadme maht on <ph name="DEVICE_CAPACITY" />. Sisestage SD-kaart või USB-mälupulk, mille maht on vähemalt 4 GB.</translation> <translation id="1137135726305341424">domContentLoaded ja kõikide ressursside laadimine algas enne kui domContentLoaded (põhiraam ja sama päritoluga iframe'id).</translation> +<translation id="1138663153846032155">Eelista HTML-i Flashile</translation> <translation id="1140351953533677694">Juurdepääs Bluetoothi ja jadaseadmetele</translation> <translation id="114140604515785785">Laienduse juurkaust: </translation> <translation id="1143142264369994168">Sertifikaadi allkirjastaja</translation> @@ -252,6 +252,7 @@ <translation id="1351692861129622852"><ph name="FILE_COUNT" /> faili importimine ...</translation> <translation id="1352103415082130575">Tai klaviatuur (Pattachote)</translation> <translation id="1353686479385938207"><ph name="PROVIDER_NAME" />: <ph name="NETWORK_NAME" /></translation> +<translation id="1353946958707294039">Materiaalse disaini salvestusruumi haldur</translation> <translation id="1353966721814789986">Käivitamisel avatavad lehed</translation> <translation id="1354868058853714482">Adobe Reader on aegunud ega pruugi olla turvaline.</translation> <translation id="1355408554203439639">3D-tarkvararasterdaja</translation> @@ -423,7 +424,6 @@ <translation id="1533920822694388968">Teleri joondamine</translation> <translation id="15373452373711364">Suur hiirekursor</translation> <translation id="1543284117603151572">Imporditud teenusest Edge</translation> -<translation id="1544350195767834591">{NUM_COOKIES,plural, =1{1 muudelt saitidelt}other{# muudelt saitidelt}}</translation> <translation id="1545177026077493356">Automaatne kioskirežiim</translation> <translation id="1545786162090505744">URL, kus päringu kohal on %s</translation> <translation id="1546280085599573572">See laiendus muutis seda, milline leht kuvatakse avalehe nupul klõpsamisel.</translation> @@ -447,7 +447,6 @@ <translation id="1559235587769913376">Input Unicode'i märgid</translation> <translation id="1561092721008294962">HarfBuzz kasutajaliidese teksti jaoks</translation> <translation id="1566049601598938765">Veebisait</translation> -<translation id="1566958206723629112">Flash ja PDF</translation> <translation id="1567723158593978621">Kui see on lubatud, kasutatakse brauserisse sisselogimisel uut GAIA paroolieraldusega sisselogimisvoogu.</translation> <translation id="1567993339577891801">JavaScripti konsool</translation> <translation id="1568323446248056064">Kuvaseadme seadete avamine</translation> @@ -576,7 +575,6 @@ <translation id="1723940674997333416">Luba https-päritolu ebaturvaline WebSocket</translation> <translation id="1725149567830788547">Kuva &juhtelemente</translation> <translation id="172612876728038702">TPM-i seadistatakse. Olge kannatlik, selleks võib kuluda mitu minutit.</translation> -<translation id="1727135806684246609">Materiaalne disain – turvalisuse teade</translation> <translation id="1729533290416704613">Lisaks juhib omnikastikeses otsingu tegemise lehte.</translation> <translation id="1731346223650886555">Semikoolon</translation> <translation id="1731589410171062430">Kokku: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /> (<ph name="NUMBER_OF_PAGES" /> <ph name="PAGE_OR_PAGES_LABEL" />)</translation> @@ -873,6 +871,7 @@ <translation id="218492098606937156">Luba puutesündmused</translation> <translation id="2187317261103489799">Tuvasta (vaikimisi)</translation> <translation id="2187895286714876935">Serveri sertifikaadi impordi viga</translation> +<translation id="2188881192257509750">Ava <ph name="APPLICATION" /></translation> <translation id="2190069059097339078">WiFi mandaadi hankija</translation> <translation id="219008588003277019">Omakliendi moodul: <ph name="NEXE_NAME" /></translation> <translation id="2190355936436201913">(tühi)</translation> @@ -991,6 +990,7 @@ <translation id="2326606747676847821">Ava inkognito režiim</translation> <translation id="2326931316514688470">&Laadi rakendus uuesti</translation> <translation id="2327492829706409234">Luba rakendus</translation> +<translation id="2328054044222305089">See kustutab kõik andmed, mille sait <ph name="SITE" /> teie seadmesse salvestas, ja lähtestab teie antud load. Kas soovite jätkata?</translation> <translation id="2329597144923131178">Logige sisse, et tuua kõikidesse seadmetesse järjehoidjad, ajalugu, paroolid ja muud seaded.</translation> <translation id="2332131598580221120">Poes kuvamine</translation> <translation id="2332742915001411729">Lähtesta vaikeseadetele</translation> @@ -1266,7 +1266,6 @@ <translation id="2675358154061544447">Algses katsejärgus olev tugi saitidevaheliste iframe'ide renderdamiseks eraldi protsessides. Selles režiimis jagavad dokumendid renderdaja protsessi ainult siis, kui need pärinevad samalt veebisaidilt.</translation> <translation id="2676946222714718093">Mängib seadmes</translation> <translation id="2678063897982469759">Luba uuesti</translation> -<translation id="2678246812096664977">Kõik pistikprogrammid</translation> <translation id="2679385451463308372">Prindi süsteemidialoogi abil ...</translation> <translation id="2680208403056680091">Interneti-ühendust juhitakse</translation> <translation id="268053382412112343">&Ajalugu</translation> @@ -1440,7 +1439,6 @@ <translation id="287286579981869940">Lisa <ph name="PROVIDER_NAME" />...</translation> <translation id="2872961005593481000">Lülita välja</translation> <translation id="2875698561019555027">(Chrome'i vealehed)</translation> -<translation id="2879560882721503072">Kliendi sertifikaadi, mille väljastas <ph name="ISSUER" />, salvestamine õnnestus.</translation> <translation id="288024221176729610">tšehhi keel</translation> <translation id="288042212351694283">Juurdepääs teie Universal 2nd Factori seadmetele</translation> <translation id="2881966438216424900">Viimati kasutatud:</translation> @@ -1589,6 +1587,7 @@ <translation id="3057861065630527966">Fotode ja videote varundamine</translation> <translation id="3058212636943679650">Kui teil on vaja arvuti operatsioonisüsteem taastada, vajate taaste SD-kaarti või USB-mälupulka.</translation> <translation id="305932878998873762">HTTP lihtne vahemälu on uus vahemälu. See kasutab kettaruumi jaotamiseks failisüsteemi.</translation> +<translation id="3060251871394327123">See kustutab kõik andmed, mille sait <ph name="SITE" /> seadmesse salvestas. Kas soovite jätkata?</translation> <translation id="3061650404498811439">Lubatakse juurdepääs emotikonidele, käsitsi kirjutamisele ja häälsisendile IME lubamise menüüst.</translation> <translation id="3062606427884046423">Chrome'i meediamärguannete puhul kasutatakse Android MediaStyle'i märguandeid.</translation> <translation id="3063844757726132584">Selles mugavas käivitusprogrammis saate juurdepääsu oma kõikidele rakendustele. Mängige mänge, pidage videovestlusi, kuulake muusikat, muutke dokumente või hankige rohkem rakendusi.</translation> @@ -1638,6 +1637,7 @@ <translation id="3123569374670379335">(Jälgitav)</translation> <translation id="3124111068741548686">USER nimed</translation> <translation id="3126026824346185272">Ctrl</translation> +<translation id="3127156390846601284">See kustutab kõik seadmes olevad andmed, mille loetletud saidid salvestasid. Kas soovite jätkata?</translation> <translation id="312759608736432009">Seadme tootja:</translation> <translation id="3127919023693423797">Autentimine...</translation> <translation id="3128230619496333808">Vahekaart 6</translation> @@ -1736,7 +1736,6 @@ <translation id="3264544094376351444">Seriifideta font</translation> <translation id="3264547943200567728">Chromeboxi võrgu seadistamine ebaõnnestus</translation> <translation id="3265459715026181080">Sulge aken</translation> -<translation id="3267271790328635957">Ainult PDF</translation> <translation id="3267726687589094446">Luba ka edaspidi mitme faili automaatset allalaadimist</translation> <translation id="3267998849713137817">Muudetud aeg</translation> <translation id="3268451620468152448">Avatud vahelehed</translation> @@ -1982,6 +1981,7 @@ <translation id="3574210789297084292">logi sisse</translation> <translation id="3574305903863751447"><ph name="CITY" />, <ph name="STATE" /> <ph name="COUNTRY" /></translation> <translation id="357479282490346887">leedu keel</translation> +<translation id="3575927481544652747">WebMIDI jaoks keelatakse Windowsi käitusaja MIDI API, mis on Windows 10-s ja uuemates versioonides vaikimisi lubatud.</translation> <translation id="3576324189521867626">Installimine õnnestus</translation> <translation id="3578331450833904042">Vaikimisi (kõige vastuvõtmine)</translation> <translation id="3578594933904494462">Selle vahekaardi sisu jagatakse.</translation> @@ -2035,8 +2035,6 @@ <translation id="3627320433825461852">Jäänud on vähem kui 1 minut</translation> <translation id="3627588569887975815">Ava link inko&gnito aknas</translation> <translation id="3627671146180677314">Netscape'i sertifikaadi uuendusaeg</translation> -<translation id="3629326610814700057">Lubab salvestusruumi halduril kohalikku salvestusruumi hallata.</translation> -<translation id="3630337581925712713"><ph name="PERMISSION_TYPE_LABEL" />:</translation> <translation id="3631337165634322335">Alljärgnevad erandid kohaldatakse ainult praegusele inkognito-seansile.</translation> <translation id="3633586230741134985">Rakenduste käivitaja seaded</translation> <translation id="3633997706330212530">Võite soovi korral need teenused välja lülitada.</translation> @@ -2059,7 +2057,8 @@ <translation id="3654045516529121250">Juurdepääsetavuse seadete lugemine</translation> <translation id="3654092442379740616">Sünkroonimisviga: <ph name="PRODUCT_NAME" /> on aegunud ja vajab värskendamist.</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{Sellel on püsiv juurdepääs ühele failile.}other{Sellel on püsiv juurdepääs # failile.}}</translation> -<translation id="3657468915905674858">PPAPI Win32k lukustamise lubamine.</translation> +<translation id="365793796291733849"><ph name="BEGIN_PARAGRAPH1" />Kui lülitate automaatse varundamise sisse, salvestatakse seadme ja rakenduse andmed perioodiliselt privaatsesse kausta Google Drive'is. Rakenduse andmed võivad olla mis tahes andmed, mille rakendus on salvestanud (arendajaseadete põhjal), sh potentsiaalselt tundlikud andmed, nagu kontaktid, sõnumid ja fotod.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Varundatud andmeid ei loeta teie Drive'i salvestuskvoodi hulka. Suuri faile ja faile, mille arendajad on otsustanud teenusest välja jätta, ei varundata.<ph name="END_PARAGRAPH2" /></translation> <translation id="3660234220361471169">Mitteusaldusväärne</translation> <translation id="3665589677786828986">Chrome tuvastas, et teine programm rikkus teie seadeid, ja lähtestas need algsetele vaikevalikutele.</translation> <translation id="3665842570601375360">Turvalisus:</translation> @@ -2114,6 +2113,7 @@ <translation id="3733127536501031542">SSL-server koos seadistamisega</translation> <translation id="3736520371357197498">Kui mõistate, kuidas teie turvalisust ohustatakse, siis võite <ph name="BEGIN_LINK" />seda ebaturvalist saiti külastada<ph name="END_LINK" /> enne, kui ohtlikud programmid on eemaldatud.</translation> <translation id="3738924763801731196"><ph name="OID" />:</translation> +<translation id="3739254215541673094">Kas soovite avada rakenduse <ph name="APPLICATION" />?</translation> <translation id="3739798227959604811">Viivitus enne kordamist:</translation> <translation id="3741158646617793859"><ph name="DEVICE_NAME" /> kuvatakse nüüd administraatorikonsoolis</translation> <translation id="3741243925913727067">Meediaseadmel olevate fotode ja videote varundamine Google Drive'i.</translation> @@ -2352,7 +2352,6 @@ <translation id="4058793769387728514">Kontrolli dokumenti kohe</translation> <translation id="4059285154003114015">&Prindi raam ...</translation> <translation id="406070391919917862">Taustarakendused</translation> -<translation id="4061502419206152498">Kuva ainult ebaturvaline, animeerimata</translation> <translation id="4062251648694601778">Head <ph name="SHORT_PRODUCT_NAME" />'i seadme kasutamist. Kas teil on küsimusi? Leiate alati abi, kui klõpsate olekualal nupul „?”.</translation> <translation id="4065876735068446555">Teie kasutatav võrk (<ph name="NETWORK_ID" />) võib nõuda sisselogimislehe külastamist.</translation> <translation id="4068506536726151626">See leht sisaldab järgmiste saitide elemente, mis jälgivad teie asukohta:</translation> @@ -2391,7 +2390,6 @@ <translation id="4101878899871018532">Paroolihaldur ei paku sünkroonimiseks kasutatava mandaadi salvestamist.</translation> <translation id="410351446219883937">Automaatesitus</translation> <translation id="4104163789986725820">&Ekspordi...</translation> -<translation id="4105523032910086267">Määrab materiaalse disaini turvalisuse teabe animatsiooni ja nähtavuse.</translation> <translation id="4105563239298244027">Saate Google Drive'is tasuta 1 TB vaba ruumi</translation> <translation id="4109135793348361820">Teisalda aken kasutaja <ph name="USER_NAME" /> töölauale (<ph name="USER_EMAIL" />)</translation> <translation id="4110342520124362335">Saidi <ph name="DOMAIN" /> küpsisefailid on blokeeritud.</translation> @@ -2442,6 +2440,7 @@ <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="4188447344915957833">Lubab salvestusruumi halduri materiaalse disaini seadetes.</translation> <translation id="4189406272289638749">Laiendus <b><ph name="EXTENSION_NAME" /></b> juhib seda seadet.</translation> <translation id="4193154014135846272">Google'i dokument</translation> <translation id="4193182321948161343">Materiaalse disaini kasutajahalduri lubamine</translation> @@ -2648,6 +2647,7 @@ <translation id="4508765956121923607">Vaata a&llikat</translation> <translation id="4509017836361568632">Loobu fotost</translation> <translation id="4509345063551561634">Asukoht:</translation> +<translation id="4513946894732546136">Tagasiside</translation> <translation id="4514542542275172126">Uue jälgitava kasutaja seadistamine</translation> <translation id="4514914692061505365">Kõikide pexe-failide puhul jõustatakse PNaCl-i kiire Subzero tõlkija kasutamine.</translation> <translation id="451515744433878153">Eemalda</translation> @@ -2746,6 +2746,7 @@ <translation id="4656293982926141856">See arvuti</translation> <translation id="4656631038341342120">Lubage VR-kest, kui see on selle seadme jaoks saadaval.</translation> <translation id="4657031070957997341">Luba alati pistikprogrammid aadressil <ph name="HOST" /></translation> +<translation id="466008749075469935">Lubab sekkumise, et määrata taustataimerite protsessori kasutuse piiranguks 1%.</translation> <translation id="4663254525753315077">Paneb võimaluse korral keritava elemendi piiridest välja jääva sisu küljendatavale kihile, et seda saaks kiiremini kerida.</translation> <translation id="4664482161435122549">PKCS #12 ekspordi viga</translation> <translation id="4665014895760275686">Tootja</translation> @@ -2814,6 +2815,7 @@ <translation id="4749157430980974800">Gruusia klaviatuur</translation> <translation id="4750394297954878236">Soovitused</translation> <translation id="475088594373173692">Esimene kasutaja</translation> +<translation id="4750892496809949692">Eelistatakse HTML-sisu, peites Flashi pistikprogrammide loendist.</translation> <translation id="4750917950439032686">Teie teave (nt paroolid või krediitkaardi numbrid) on sellele saidile saates privaatne.</translation> <translation id="4753602155423695878">Android-telefoni lehe laadimise edenemisriba animatsioon</translation> <translation id="4755240240651974342">Soome klaviatuur</translation> @@ -3088,6 +3090,7 @@ <translation id="5119450342834678097">Tahvelarvuti saidi taotlemise valik seadete menüüs</translation> <translation id="5120068803556741301">Kolmanda osapoole sisestusmeetod</translation> <translation id="5120421890733714118">Usalda seda sertifikaati veebisaitide tuvastamiseks.</translation> +<translation id="5120516977819314347">PIN-kood või parool on vale.</translation> <translation id="5121130586824819730">Teie kõvaketas on täis. Salvestage muusse asukohta või vabastage kõvakettaruumi.</translation> <translation id="5125751979347152379">Vale URL.</translation> <translation id="5127881134400491887">Võrguühenduste haldamine</translation> @@ -3095,6 +3098,7 @@ <translation id="512903556749061217">ühendatud</translation> <translation id="5129301143853688736">Teie ühendus saidiga ei ole privaatne. Ründajad võivad üritada varastada teie teavet (nt fotosid, paroole, sõnumeid ja krediitkaardiandmeid) domeenilt <ph name="DOMAIN" />.</translation> <translation id="5129662217315786329">poola keel</translation> +<translation id="5131347545782851480">PDF-dokumendid</translation> <translation id="5134856901811723984">Materiaalne disain Chrome OS-i süsteemi kasutajaliideses</translation> <translation id="5135533361271311778">Järjehoidja üksust ei õnnestunud luua.</translation> <translation id="5136529877787728692">F7</translation> @@ -3263,6 +3267,7 @@ <translation id="5328031682234198929">8</translation> <translation id="5329858601952122676">&Kustuta</translation> <translation id="5330145655348521461">Failid on avatud erinevatel töölaudadel. Faili vaatamiseks avage <ph name="USER_NAME" /> (<ph name="MAIL_ADDRESS" />).</translation> +<translation id="5330512191124428349">Hangi teavet</translation> <translation id="5332624210073556029">Ajavöönd:</translation> <translation id="5333807720589685258">Kui te ei sisesta õiget PUK-koodi, keelatakse teie SIM-kaart jäädavalt.</translation> @@ -3695,7 +3700,6 @@ <translation id="5892507820957994680">Alistab sisseehitatud tarkvara renderdusloendi ja võimaldab GPU-kiirendust toetamata süsteemikonfiguratsioonides.</translation> <translation id="5895138241574237353">Taaskäivitamine</translation> <translation id="5895187275912066135">Väljastamiskuupäev</translation> -<translation id="5898154795085152510">Server tagastas kehtetu kliendi sertifikaadi. Viga <ph name="ERROR_NUMBER" /> (<ph name="ERROR_NAME" />).</translation> <translation id="5900302528761731119">Google'i profiilifoto</translation> <translation id="590253956165195626">Paku lehtede tõlkimist, mis ei ole teie loetavas keeles.</translation> <translation id="5904093760909470684">Puhverserveri konfigureerimine</translation> @@ -3750,6 +3754,8 @@ <translation id="5984222099446776634">Viimati külastatud</translation> <translation id="5984814259619230127">Smart Lock Bluetooth Low Energy tuvastamiseks</translation> <translation id="5986245990306121338">Kui see on lubatud, kuvatakse vahelehtede vahetaja isegi juhul, kui valik „Liida vahelehed ja rakendused” on seadetes sisse lülitatud.</translation> +<translation id="5989712527536636369"><ph name="BEGIN_PARAGRAPH1" />See on teie seadme ja selle kasutamise üldine teave (nagu aku tase, rakenduste kasutamise sagedus, võrguühenduste (nt WiFi ning Bluetooth) kvaliteet ja kestus ning krahhiaruanded) juhul, kui asjad ei suju soovitud moel. Teabe alusel täiustatakse Google'i tooteid ja teenuseid kõigi jaoks. Teatud koondteave aitab ka meie partneritel, näiteks Androidi arendajatel, oma rakendusi ja tooteid täiustada.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Võite selle igal ajal Androidi rakenduste seadetes välja lülitada. See ei takista seadmel saata teavet, mis on vajalik põhiteenuste, näiteks süsteemivärskenduste ja turvafunktsioonide hankimiseks.<ph name="END_PARAGRAPH2" /></translation> <translation id="5990198433782424697">Laiendused üksuse chrome:// URL-idel</translation> <translation id="5990814808592353318">Käsitsi parooli loomine.</translation> <translation id="5991049340509704927">Suurenda</translation> @@ -3763,6 +3769,7 @@ <translation id="6005695835120147974">Meedia marsruuter</translation> <translation id="6007237601604674381">Teisaldamine ebaõnnestus. <ph name="ERROR_MESSAGE" /></translation> <translation id="6008241731410823808">Saadab hüperlinkide auditeerimise pingid.</translation> +<translation id="6011449291337289699">Saidi andmete kustutamine</translation> <translation id="6015796118275082299">Aasta</translation> <translation id="6016551720757758985">Kinnitage Powerwash eelmisele versioonile naasmisega</translation> <translation id="6016809788585079594">Öelge viimast korda: „Ok Google”</translation> @@ -3952,7 +3959,6 @@ <translation id="6276301056778294989">Veenduge, et seade näitaks sama koodi.</translation> <translation id="6277105963844135994">Võrgu ajalõpp</translation> <translation id="6277518330158259200">J&äädvusta ekraanipilt</translation> -<translation id="6278428485366576908">Teema</translation> <translation id="6279183038361895380">Kursori kuvamiseks vajutage klahvi |<ph name="ACCELERATOR" />|</translation> <translation id="6280215091796946657">Logige sisse teise kontoga</translation> <translation id="6280912520669706465">ARC</translation> @@ -4204,6 +4210,7 @@ <translation id="6607272825297743757">Faili teave</translation> <translation id="6607831829715835317">Rohkem töö&riistu</translation> <translation id="6608140561353073361">Kõik küpsised ja saidiandmed ...</translation> +<translation id="6610183966322615106">Viga printeri lisamisel</translation> <translation id="6610610633807698299">Sisestage URL ...</translation> <translation id="6612358246767739896">Kaitstud sisu</translation> <translation id="6615455863669487791">Kuva mulle</translation> @@ -4267,7 +4274,6 @@ <translation id="6708242697268981054">Päritolu:</translation> <translation id="6709357832553498500">Ühenda, kasutades laiendust <ph name="EXTENSIONNAME" /></translation> <translation id="6710213216561001401">Eelmine</translation> -<translation id="6712158998835983046">Kuva kõik, animeeritud</translation> <translation id="6718273304615422081">Pakkimine ...</translation> <translation id="671928215901716392">Lukusta ekraan</translation> <translation id="6721972322305477112">&Fail</translation> @@ -4539,7 +4545,6 @@ <translation id="7088434364990739311">Värskenduste otsimist ei õnnestunud käivitada (veakood <ph name="ERROR" />).</translation> <translation id="708856090370082727">Lubatakse OSK ülekerimise tugi. Kui see märgistus on sees, muudab OSK ainult visuaalse vaateava suurust.</translation> <translation id="7088674813905715446">Administraator on määranud seadme mittetoetatud olekusse. Liitumise lubamiseks paluge administraatoril määrata seade ootel olekusse.</translation> -<translation id="7089609847854449639">Salvestusruumi haldur</translation> <translation id="708969677220991657">Lubab taotlused kohalikule hostile HTTPS-i kaudu isegi juhul, kui esitatakse kehtetu sertifikaat.</translation> <translation id="7092106376816104">Hüpikute erandid</translation> <translation id="7093866338626856921">Vaheta andmeid seadmetega <ph name="HOSTNAMES" /></translation> @@ -4579,7 +4584,7 @@ <translation id="715118844758971915">Tavaprinterid</translation> <translation id="7154130902455071009">Määrake avaleheks <ph name="START_PAGE" /></translation> <translation id="7155171745945906037">Olemasolev foto kaamerast või failist</translation> -<translation id="715568033737470079">Määrake PPAPI pistikprogrammid, mida käitatakse Win32k lukustuse liivakastireeglis (ainult Windows 10 ja uuemad versioonid).</translation> +<translation id="7155226869555939647">Ava alati rakenduse <ph name="APPLICATION" /> lingid</translation> <translation id="7156235233373189579">See fail on loodud arvuti jaoks, mis kasutab Windowsi tarkvara. See ei ühildu teie seadmega, mis käitab Chrome OS-i. Otsige <ph name="BEGIN_LINK" />Chrome'i veebipoest<ph name="END_LINK" /> sobivat asendusrakendust. <ph name="BEGIN_LINK_HELP" />Lisateave<ph name="END_LINK_HELP" /></translation> <translation id="7157063064925785854">Klõpsates nupul Jätka, nõustute dokumentidega <ph name="LEGAL_DOC_LINK_TEXT_1" />, <ph name="LEGAL_DOC_LINK_TEXT_2" />, <ph name="LEGAL_DOC_LINK_TEXT_3" /> ja <ph name="LEGAL_DOC_LINK_TEXT_4" />.</translation> <translation id="7158238151765743968">Ühenduse loomine seadmega „<ph name="DEVICE_NAME" />” on pooleli.</translation> @@ -4594,6 +4599,7 @@ <translation id="7175353351958621980">Laaditud:</translation> <translation id="7180611975245234373">Värskenda</translation> <translation id="7180865173735832675">Kohandamine</translation> +<translation id="7181387261278441780">Saidi andmete kustutamine ja lähtestamine</translation> <translation id="7185078796915954712">TLS 1.3</translation> <translation id="7185690883425432021">Peidab passiivsete vahelehtede sulgemisnupud, kui vahelehe riba on virnastamisrežiimis.</translation> <translation id="7186088072322679094">Tööriistaribale jätmine</translation> @@ -4626,7 +4632,6 @@ <translation id="7223775956298141902">Teil ei ole kahjuks ühtki laiendust :-(</translation> <translation id="7224023051066864079">Alamvõrgumask:</translation> <translation id="7225179976675429563">Võrgu tüüp puudub</translation> -<translation id="7230191962699768124">Kuva kõik, animeerimata</translation> <translation id="7230787553283372882">Teksti suuruse kohandamine</translation> <translation id="7231224339346098802">Kasutage numbrit, mis näitab, kui palju koopiaid printida (1 või enam).</translation> <translation id="7238585580608191973">SHA-256 sõrmejälg</translation> @@ -4758,7 +4763,6 @@ <translation id="7409233648990234464">Taaskäivitus ja Powerwash</translation> <translation id="7409836189476010449">Flashi käitamine</translation> <translation id="7410344089573941623">Küsi, kui host <ph name="HOST" /> soovib juurdepääsu kaamerale ja mikrofonile</translation> -<translation id="7411343637221933631">{NUM_COOKIES,plural, =1{1 sellelt saidilt}other{# sellelt saidilt}}</translation> <translation id="7412226954991670867">GPU-mälu</translation> <translation id="7416362041876611053">Tundmatu võrguviga.</translation> <translation id="7417453074306512035">Etioopia klaviatuur</translation> @@ -4880,6 +4884,7 @@ <translation id="756445078718366910">Ava brauseri aken</translation> <translation id="7564847347806291057">Lõpeta toiming</translation> <translation id="7566723889363720618">F12</translation> +<translation id="7567314848159753396">Küpsisefail: <ph name="NAME" /></translation> <translation id="756809126120519699">Chrome'i andmed kustutati</translation> <translation id="7568790562536448087">Värskendamine</translation> <translation id="7573172247376861652">Aku laadimine</translation> @@ -4920,6 +4925,7 @@ <translation id="7626009897377900107">Parooli loomine</translation> <translation id="7627262197844840899">See sait ei aktsepteeri MasterCardi.</translation> <translation id="7627790789328695202"><ph name="FILE_NAME" /> on juba olemas. Nimetage see ümber ja proovige uuesti.</translation> +<translation id="7628127343934101653">Ava PDF-failid PDF-vaikevaaturi rakenduses.</translation> <translation id="762917759028004464">Vaikebrauser on praegu <ph name="BROWSER_NAME" />.</translation> <translation id="7629536005696009600">Androidi rakendustesse salvestatud mandaatide vastavatele veebisaitidele sisestamise lubamine.</translation> <translation id="7629827748548208700">Vaheleht: <ph name="TAB_NAME" /></translation> @@ -5148,6 +5154,7 @@ <translation id="7957513156576779045">Sidumise lubamiseks lülitage Bluetooth sisse</translation> <translation id="7957615753207896812">Klaviatuuriseadme seadete avamine</translation> <translation id="7959074893852789871">Fail sisaldas mitut sertifikaati, mõnda neist ei imporditud:</translation> +<translation id="7959700692661109221"><ph name="BEGIN_PARAGRAPH" />Google'i asukohateenused kasutavad muuhulgas WiFi-võrke, et seadme asukoht kiiremini ja täpsemalt tuvastada. Kui lülitate sisse Google'i asukohateenused, aktiveerib teie seade režiimi, mis edastab asukohateavet WiFi kaudu. Võite selle asukohaseadetes igal ajal välja lülitada.<ph name="END_PARAGRAPH" /></translation> <translation id="7961015016161918242">Mitte kunagi</translation> <translation id="7964089325405904043">Paroolide importimine ja eksportimine</translation> <translation id="7965010376480416255">Ühismälu</translation> @@ -5298,6 +5305,7 @@ <translation id="8146793085009540321">Sisselogimine ebaõnnestus. Võtke ühendust administraatoriga või proovige uuesti.</translation> <translation id="8148264977957212129">Pinyini sisestusmeetod</translation> <translation id="8148913456785123871">Kuva käivitusprogrammis teenuse Google Now kaardid</translation> +<translation id="8150391391298684512">Windowsi käitusaja MIDI API keelamine</translation> <translation id="8151185429379586178">Arendaja tööriistad</translation> <translation id="8151638057146502721">Seadista</translation> <translation id="8151639108075998630">Luba külalissirvimine</translation> @@ -5579,6 +5587,7 @@ <translation id="8532294913309524834">Keeled järjestatakse teie eelistuste põhjal.</translation> <translation id="8535005006684281994">Netscape'i sertifikaadi uuendus-URL</translation> <translation id="8539727552378197395">Ei (ainult HTTP)</translation> +<translation id="8541084862688000575">Androidi rakenduste automaatne laadimine</translation> <translation id="8543181531796978784">Võite <ph name="BEGIN_ERROR_LINK" />teavitada tuvastusprobleemist<ph name="END_ERROR_LINK" />. Kui mõistate ohtusid oma turvalisusele, võite <ph name="BEGIN_LINK" />seda ebaturvalist saiti külastada<ph name="END_LINK" />.</translation> <translation id="8545107379349809705">Peida teave ...</translation> <translation id="8545211332741562162">Lubab veebilehtedel kasutada JavaScripti katselisi funktsioone.</translation> @@ -5606,7 +5615,6 @@ <translation id="8569764466147087991">Valige avatav fail</translation> <translation id="8571032220281885258">Kui ütlete otsetee sõna „Ok Google”, otsib Google pärast seda öeldud teksti.</translation> <translation id="8571108619753148184">Server 4</translation> -<translation id="8572832761467613633">Ainult Flash</translation> <translation id="8572981282494768930">Ära luba saitidel kaamera ja mikrofoni juurde pääseda</translation> <translation id="8574234089711453001">Lubage meedia URL-iga lehe avamisel allalaadimisnupu kuvamine.</translation> <translation id="857779305329188634">Luba katselise QUIC-protokolli tugi.</translation> @@ -5628,6 +5636,7 @@ <translation id="8600929685092827187">Ärata pakettide põhjal</translation> <translation id="8601206103050338563">TLS WWW kliendi autentimine</translation> <translation id="8602851771975208551">Teine programm teie arvutis lisas rakenduse, mis võib muuta Chrome'i toimimist.</translation> +<translation id="8603912787021349466">Androidi rakendustel lubatakse pärast sisselogimist automaatselt käivituda.</translation> <translation id="8605428685123651449">SQLite'i mälu</translation> <translation id="8605503133013456784">Seadme „<ph name="DEVICE_NAME" />” ühendust ja linkimist ei õnnestunud katkestada.</translation> <translation id="8606726445206553943">Kasutada MIDI-seadmeid</translation> @@ -5980,6 +5989,7 @@ <translation id="9053965862400494292">Sünkroonimise seadistamise üritamisel ilmes viga.</translation> <translation id="9056034633062863292">Chromeboxi värskendamine</translation> <translation id="9056810968620647706">Vasteid ei leitud.</translation> +<translation id="9057119625587205566">Läheduses ei ole ühtki printerit</translation> <translation id="9059868303873565140">Olekumenüü</translation> <translation id="9064142312330104323">Google'i profiilifoto (laadimine)</translation> <translation id="9064275926664971810">Lubatakse automaattäide, et vorme ühe klikiga täita</translation> @@ -5990,6 +6000,7 @@ <translation id="9067401056540256169">See märgis muudab Chrome'i ebaturvaliseks. Kasutage seda ainult siis, kui mõistate, mida see teeb. Pange tähele, et märgis võidakse ette teatamata eemaldada. Kui see on lubatud, saavad https-päritolu raamid kasutada ebaturvalise URL-iga (ws://) WebSocketeid.</translation> <translation id="9068931793451030927">Tee:</translation> <translation id="9070219033670098627">Vaheta isikut</translation> +<translation id="9070940116164932228">Kulukate taustataimerite vähendamine</translation> <translation id="907148966137935206">Ära luba mis tahes saidil hüpikaknaid kuvada (soovitatav)</translation> <translation id="9072550133391925347">Teenus <ph name="PASSWORD_MANAGER_BRAND" /> logib teid salvestatud paroolidega automaatselt sisse sobilikele saitidele ja rakendustesse.</translation> <translation id="9073281213608662541">PAP</translation> @@ -6024,6 +6035,7 @@ <translation id="9112614144067920641">Valige uus PIN-kood.</translation> <translation id="9112748030372401671">Taustapildi muutmine</translation> <translation id="9112987648460918699">Otsi...</translation> +<translation id="9114663181201435112">Lihtne sisselogimine</translation> <translation id="9115487443206954631">Cast'i seadmete haldamine</translation> <translation id="9115675100829699941">&Järjehoidjad</translation> <translation id="9121814364785106365">Ava kinnitatud vahelehel</translation> @@ -6118,7 +6130,6 @@ <translation id="952992212772159698">Aktiveerimata</translation> <translation id="960719561871045870">Operaatori kood</translation> <translation id="960987915827980018">Jäänud on umbes 1 tund</translation> -<translation id="962778376131245616">Kuva ainult ebaturvalised, animeeritud</translation> <translation id="96421021576709873">WiFi-võrk</translation> <translation id="965490406356730238">Võimaluse korral lubatakse jäädvustatud kaadri puhul riistvarakiirendusega mjpeg-vormingu dekodeerimine.</translation> <translation id="968174221497644223">Rakenduse vahemälu</translation>
diff --git a/chrome/app/resources/generated_resources_fa.xtb b/chrome/app/resources/generated_resources_fa.xtb index 2f7a3d8..10597c34 100644 --- a/chrome/app/resources/generated_resources_fa.xtb +++ b/chrome/app/resources/generated_resources_fa.xtb
@@ -18,7 +18,6 @@ <translation id="1029317248976101138">بزرگنمایی</translation> <translation id="1029595648591494741">«<ph name="EXTENSION_NAME" />» را امتحان میکنید؟</translation> <translation id="1031362278801463162">بارگیری پیشنمایش</translation> -<translation id="1031460590482534116">هنگام تلاش برای ذخیره گواهی سرویس گیرنده خطایی رخ داد. خطای <ph name="ERROR_NUMBER" /> (<ph name="ERROR_NAME" />).</translation> <translation id="1031573127485938293">درخواست (توسط خطمشی)</translation> <translation id="103279545524624934">برای راهاندازی برنامههای Android فضای دیسک را خالی کنید.</translation> <translation id="1033780634303702874">دسترسی به دستگاههای سریال خودتان</translation> @@ -101,6 +100,7 @@ <translation id="1128591060186966949">ویرایش موتور جستجو</translation> <translation id="1128987120443782698">دستگاه ذخیرهسازی دارای ظرفیت <ph name="DEVICE_CAPACITY" /> است. لطفاً یک کارت SD یا کارت حافظهٔ USB دارای حداقل 4 گیگابایت ظرفیت را در دستگاه قرار دهید.</translation> <translation id="1137135726305341424">domContentLoaded و بارگیری همه منابع قبل از domContentLoaded شروع شد (قاب اصلی و iframeهای دارای خاستگاه یکسان).</translation> +<translation id="1138663153846032155">ارجحیت HTML بر Flash</translation> <translation id="1140351953533677694">دسترسی به بلوتوث و دستگاههای سریال خودتان</translation> <translation id="114140604515785785">دایرکتوری ریشه برنامهٔ افزودنی:</translation> <translation id="1143142264369994168">امضا کننده گواهی</translation> @@ -252,6 +252,7 @@ <translation id="1351692861129622852">وارد کردن <ph name="FILE_COUNT" /> فایل...</translation> <translation id="1352103415082130575">صفحهکلید تایلندی (پاتاشوت)</translation> <translation id="1353686479385938207"><ph name="PROVIDER_NAME" />: <ph name="NETWORK_NAME" /></translation> +<translation id="1353946958707294039">مدیر حافظه طراحی سهبعدی</translation> <translation id="1353966721814789986">صفحات شروع به کار</translation> <translation id="1354868058853714482">Adobe Reader قدیمی است و ممکن است ناامن باشد.</translation> <translation id="1355408554203439639">شطرنجیساز نرمافزاری سهبعدی</translation> @@ -421,7 +422,6 @@ <translation id="1533920822694388968">ترازبندی تلویزیون</translation> <translation id="15373452373711364">نشانگر موشواره بزرگ</translation> <translation id="1543284117603151572">وارد شده از Edge</translation> -<translation id="1544350195767834591">{NUM_COOKIES,plural, =1{۱ مورد از سایتهای دیگر}one{# مورد از سایتهای دیگر}other{# مورد از سایتهای دیگر}}</translation> <translation id="1545177026077493356">حالت کیوسک خودکار</translation> <translation id="1545786162090505744">نشانی وب با %s به جای پرسش</translation> <translation id="1546280085599573572">این افزونه، صفحهای را با کلیک روی دکمه صفحه اصلی نمایش داده میشود، تغییر داده است.</translation> @@ -445,7 +445,6 @@ <translation id="1559235587769913376">درج نویسههای یونیکد</translation> <translation id="1561092721008294962">HarfBuzz برای نوشتار واسط کاربری</translation> <translation id="1566049601598938765">وبسایت</translation> -<translation id="1566958206723629112">Flash و PDF</translation> <translation id="1567723158593978621">وقتی فعال است، ورود به سیستم مرورگر از یک جریان جدید ورود به سیستم gaia جداشده با گذرواژه استفاده میکند.</translation> <translation id="1567993339577891801">کنسول جاوا اسکریپت</translation> <translation id="1568323446248056064">باز کردن تنظیمات نمایشگر دستگاه</translation> @@ -574,7 +573,6 @@ <translation id="1723940674997333416">اجازه به WebSocket ناامن از منبع https</translation> <translation id="1725149567830788547">نمایش &کنترلها</translation> <translation id="172612876728038702">TPM در حال تنظیم است. لطفاً منتظر بمانید؛ این کار ممکن است چند دقیقه طول بکشد.</translation> -<translation id="1727135806684246609">درازنویس امنیتی طراحی سهبعدی</translation> <translation id="1729533290416704613">این برنامه صفحهای را که هنگام جستجو از Omnibox نشان داده میشود، کنترل میکند.</translation> <translation id="1731346223650886555">نقطه ویرگول</translation> <translation id="1731589410171062430">مجموع: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /> (<ph name="NUMBER_OF_PAGES" /> <ph name="PAGE_OR_PAGES_LABEL" />)</translation> @@ -870,6 +868,7 @@ <translation id="218492098606937156">فعال کردن رویدادهای لمسی</translation> <translation id="2187317261103489799">تشخیص (پیشفرض)</translation> <translation id="2187895286714876935">خطای وارد کردن مجوز سرور</translation> +<translation id="2188881192257509750">باز کردن <ph name="APPLICATION" /></translation> <translation id="2190069059097339078">گیرنده اعتبارنامههای WiFi</translation> <translation id="219008588003277019">ماژول Native Client: <ph name="NEXE_NAME" /></translation> <translation id="2190355936436201913">(خالی)</translation> @@ -988,6 +987,7 @@ <translation id="2326606747676847821">ناشناس شوید</translation> <translation id="2326931316514688470">&تازهسازی برنامه</translation> <translation id="2327492829706409234">فعال کردن برنامه</translation> +<translation id="2328054044222305089">این کار باعث حذف دادههای <ph name="SITE" /> ذخیرهشده در دستگاهتان و بازنشانی هر گونه مجوزی است که برای اجرا اعطا کردهاید. میخواهید ادامه دهید؟</translation> <translation id="2329597144923131178">برای دریافت نشانکها، سابقه، گذرواژهها و سایر تنظیماتتان در همه دستگاهها، وارد سیستم شوید.</translation> <translation id="2332131598580221120">مشاهده در فروشگاه</translation> <translation id="2332742915001411729">بازنشانی روی موارد پیشفرض</translation> @@ -1262,7 +1262,6 @@ <translation id="2675358154061544447">پشتیبانی کاملاً آزمایشی از پرداز زدن iframes بین سایتی در فرآیندهای جداگانه. در این حالت، اسناد فقط زمانی روندِ پردازی را به اشتراک میگذارند که از یک سایت مشابه باشند.</translation> <translation id="2676946222714718093">در حال پخش در</translation> <translation id="2678063897982469759">فعال کردن مجدد</translation> -<translation id="2678246812096664977">همه افزایهها</translation> <translation id="2679385451463308372">چاپ با استفاده از کادر گفتگوی سیستم...</translation> <translation id="2680208403056680091">اتصال اینترنت شما کنترل میشود</translation> <translation id="268053382412112343">&سابقه</translation> @@ -1436,7 +1435,6 @@ <translation id="287286579981869940">افزودن <ph name="PROVIDER_NAME" />...</translation> <translation id="2872961005593481000">خاموش کردن</translation> <translation id="2875698561019555027">(صفحههای خطای Chrome)</translation> -<translation id="2879560882721503072">گواهی سرویس گیرنده صادر شده توسط <ph name="ISSUER" /> با موفقیت ذخیره شد.</translation> <translation id="288024221176729610">چک</translation> <translation id="288042212351694283">دسترسی به دستگاههای Universal 2nd Factor شما</translation> <translation id="2881966438216424900">آخرین دسترسی:</translation> @@ -1585,6 +1583,7 @@ <translation id="3057861065630527966">از عکسها و ویدئوهایتان پشتیبان بگیرید</translation> <translation id="3058212636943679650">درصورتیکه لازم شود سیستم عامل رایانهٔ خود را بازیابی کنید، به یک کارت SD بازیابی یا کارت حافظهٔ USB نیاز خواهید داشت.</translation> <translation id="305932878998873762">حافظه داخلی ساده HTTP حافظه داخلی جدیدی است. این قابلیت برای تخصیص فضای دیسک به سیستم پروندهای تکیه میکند.</translation> +<translation id="3060251871394327123">این کار باعث حذف دادههای <ph name="SITE" /> ذخیرهشده روی دستگاهتان میشود. میخواهید ادامه دهید؟</translation> <translation id="3061650404498811439">فعال کردن دسترسی به صورتکها، ورودی دستنویس و گفتاری از منوی شرکت کردن در IME.</translation> <translation id="3062606427884046423">از اعلانهای Android MediaStyle برای اعلانهای رسانه Chrome استفاده میکند.</translation> <translation id="3063844757726132584">از این راهانداز راحت به تمام برنامههایتان دسترسی داشته باشید. بازی کنید، گپ ویدئویی بزنید، به موسیقی گوش دهید، اسناد را ویرایش کنید یا برنامههای بیشتری دریافت کنید.</translation> @@ -1634,6 +1633,7 @@ <translation id="3123569374670379335">(نظارت شده)</translation> <translation id="3124111068741548686">کنترلهای کاربر</translation> <translation id="3126026824346185272">Ctrl</translation> +<translation id="3127156390846601284">این کار باعث حذف دادههای ذخیرهشده روی دستگاهتان برای همه سایتهای نشاندادهشده میشود. میخواهید ادامه دهید؟</translation> <translation id="312759608736432009">سازنده دستگاه:</translation> <translation id="3127919023693423797">در حال راستیآزمایی...</translation> <translation id="3128230619496333808">برگه ۶</translation> @@ -1732,7 +1732,6 @@ <translation id="3264544094376351444">قلم Sans-Serif</translation> <translation id="3264547943200567728">راهاندازی شبکه Chromebox شما ناموفق بود</translation> <translation id="3265459715026181080">بستن پنجره</translation> -<translation id="3267271790328635957">فقط PDF</translation> <translation id="3267726687589094446">ادامه اجازه بارگیری خودکار چند فایل</translation> <translation id="3267998849713137817">زمان اصلاح</translation> <translation id="3268451620468152448">برگههای باز</translation> @@ -1978,6 +1977,7 @@ <translation id="3574210789297084292">ورود به سیستم</translation> <translation id="3574305903863751447"><ph name="CITY" />، <ph name="STATE" /> <ph name="COUNTRY" /></translation> <translation id="357479282490346887">لیتوانیایی</translation> +<translation id="3575927481544652747">رابط برنامهنویسی نرمافزار MIDI Windows Runtime برای WebMIDI (که بهطورپیشفرض در Windows 10 یا بالاتر فعال است) را غیرفعال کنید.</translation> <translation id="3576324189521867626">نصب موفقیتآمیز بود</translation> <translation id="3578331450833904042">پیشفرض (شنیدن همه چیز)</translation> <translation id="3578594933904494462">محتوای این برگه اشتراکگذاری میشود.</translation> @@ -2031,8 +2031,6 @@ <translation id="3627320433825461852">کمتر از ۱ دقیقه باقی مانده است</translation> <translation id="3627588569887975815">باز کردن پیوند در پنجره حالت &ناشناس</translation> <translation id="3627671146180677314">زمان تجدید گواهی Netscape</translation> -<translation id="3629326610814700057">به مدیر حافظه امکان میدهد فضای حافظه محلی را مدیریت کند.</translation> -<translation id="3630337581925712713"><ph name="PERMISSION_TYPE_LABEL" />:</translation> <translation id="3631337165634322335">استثناهای زیر فقط به جلسه کنونی ناشناس اعمال میشود.</translation> <translation id="3633586230741134985">تنظیمات راهانداز برنامه</translation> <translation id="3633997706330212530">میتوانید در صورت تمایل این سرویسها را غیرفعال کنید.</translation> @@ -2055,7 +2053,8 @@ <translation id="3654045516529121250">خواندن تنظیمات دسترسپذیری خودتان</translation> <translation id="3654092442379740616">خطای همگامسازی: <ph name="PRODUCT_NAME" /> بهروز نیست و باید بهروز شود.</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{به یک فایل دسترسی دائم دارد.}one{به # فایل دسترسی دائم دارد.}other{به # فایل دسترسی دائم دارد.}}</translation> -<translation id="3657468915905674858">فعال کردن PPAPI Win32k Lockdown.</translation> +<translation id="365793796291733849"><ph name="BEGIN_PARAGRAPH1" />وقتی پشتیبانگیری خودکار را روشن میکنید، دادههای دستگاه و برنامه بهصورت دورهای در پوشهای خصوصی در Google Drive ذخیره میشود. دادههای برنامه میتواند هر نوع دادهای باشد که برنامه (براساس تنظیمات برنامهنویس) ذخیره کرده است، از جمله دادههای بهطور بالقوه حساس (مثل مخاطبین، پیامها و عکسها) <ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />دادههای پشتیبانگیریشده موجود در سهمیه فضای ذخیرهسازی Drive شما، به حساب نمیآیند. فایلهای بزرگ یا فایلهایی که بهانتخاب برنامهنویسان از سرویس خارج میشوند، پشتیبانگیری نخواهند شد.<ph name="END_PARAGRAPH2" /></translation> <translation id="3660234220361471169">غیر قابل اطمینان</translation> <translation id="3665589677786828986">Chrome تشخیص داد که برنامه دیگری برخی از تنظیمات شما را خراب کرده است و این تنظیمات را به پیشفرضهای اولیه آنها بازنشانی کرد.</translation> <translation id="3665842570601375360">امنیت:</translation> @@ -2110,6 +2109,7 @@ <translation id="3733127536501031542">سرور SSL با ارتقا</translation> <translation id="3736520371357197498">اگر خطرات امنیتی که متوجه شما هستند را درک میکنید، میتوانید قبل از حذف شدن برنامههای خطرناک از <ph name="BEGIN_LINK" />این سایت غیرایمن بازدید کنید<ph name="END_LINK" />.</translation> <translation id="3738924763801731196"><ph name="OID" />:</translation> +<translation id="3739254215541673094"><ph name="APPLICATION" /> باز شود؟</translation> <translation id="3739798227959604811">تأخیر قبل از تکرار:</translation> <translation id="3741158646617793859"><ph name="DEVICE_NAME" /> اکنون در Admin Console نمایش داده خواهد شد</translation> <translation id="3741243925913727067">از عکسها و ویدیوهای دستگاه رسانهتان در Google Drive پشتیبان بگیرید.</translation> @@ -2348,7 +2348,6 @@ <translation id="4058793769387728514">اکنون سند بررسی شود</translation> <translation id="4059285154003114015">&چاپ قاب...</translation> <translation id="406070391919917862">برنامههای پسزمینه</translation> -<translation id="4061502419206152498">فقط نمایش غیرایمن، غیرمتحرک</translation> <translation id="4062251648694601778">از دستگاه <ph name="SHORT_PRODUCT_NAME" /> خودتان لذت ببرید. سؤال دارید؟ همیشه میتوانید با کلیک روی «؟» در سینی وضعیت راهنمایی دریافت کنید.</translation> <translation id="4065876735068446555">ممکن است شبکهای که استفاده میکنید (<ph name="NETWORK_ID" />)، بازدید از صفحه ورود به سیستم خود را برای شما ضروری کرده باشد.</translation> <translation id="4068506536726151626">این صفحه کنشگرهایی از سایتهای زیر دارد که مکان شما را ردیابی میکنند:</translation> @@ -2387,7 +2386,6 @@ <translation id="4101878899871018532">مدیر گذرواژه پیشنهاد نمیکند اعتبارنامه مورد استفاده برای همگامسازی ذخیره شود.</translation> <translation id="410351446219883937">پخش خودکار</translation> <translation id="4104163789986725820">&صادر کردن...</translation> -<translation id="4105523032910086267">پویانمایی و نمایان بودن درازنویس امنیتی را در «طراحی سهبعدی» تنظیم میکند</translation> <translation id="4105563239298244027">با Google Drive یک ترابایت فضای رایگان دریافت کنید</translation> <translation id="4109135793348361820">انتقال پنجره به <ph name="USER_NAME" /> (<ph name="USER_EMAIL" />)</translation> <translation id="4110342520124362335">کوکیهای <ph name="DOMAIN" /> مسدود شدند.</translation> @@ -2438,6 +2436,7 @@ <translation id="418179967336296930">صفحهکلید آوایی روسی (YaZHert)</translation> <translation id="4181841719683918333">زبانها</translation> <translation id="4187248015940562149">بلوتوث وب را فعال میکند که به وبسایتها امکان میدهد به دستگاههای بلوتوث اطراف شما متصل شوند و آنها را کنترل کند.</translation> +<translation id="4188447344915957833">مدیر حافظه را در «تنظیمات طراحی سه بعدی» فعال میکند.</translation> <translation id="4189406272289638749">یک برنامه افزودنی، <b><ph name="EXTENSION_NAME" /></b>، این تنظیم را کنترل میکند.</translation> <translation id="4193154014135846272">سند Google </translation> <translation id="4193182321948161343">فعال کردن مدیر کاربر طراحی سهبعدی</translation> @@ -2645,6 +2644,7 @@ <translation id="4508765956121923607">مشاهده م&نبع</translation> <translation id="4509017836361568632">رد کردن تصویر</translation> <translation id="4509345063551561634">مکان:</translation> +<translation id="4513946894732546136">بازخورد</translation> <translation id="4514542542275172126">تنظیم کاربر نظارت شده جدید</translation> <translation id="4514914692061505365">اجبار استفاده از مترجم Subzero سریع PNaCl برای همه فایلهای pexe.</translation> <translation id="451515744433878153">پاک کردن</translation> @@ -2743,6 +2743,7 @@ <translation id="4656293982926141856">این رایانه</translation> <translation id="4656631038341342120">اگر VR shell برای این دستگاه دردسترس باشد آن را فعال میکند.</translation> <translation id="4657031070957997341">افزایهها در <ph name="HOST" /> همیشه مجازند</translation> +<translation id="466008749075469935">مداخله را بهمنظور محدود کردن میزان استفاده CPU تایمرهای پسزمینه تا میزان ۱٪، فعال میکند.</translation> <translation id="4663254525753315077">برای پیمایش سریع، هر وقت ممکن باشد، محتواهای پیمایشی مورد پیمایشی ادامه موارد را در لایه ترکیبی قرار میدهد.</translation> <translation id="4664482161435122549">خطای صادر کردن PKCS #12</translation> <translation id="4665014895760275686">سازنده</translation> @@ -2810,6 +2811,7 @@ <translation id="4749157430980974800">صفحهکلید گرجی</translation> <translation id="4750394297954878236">پیشنهادات</translation> <translation id="475088594373173692">کاربر اول</translation> +<translation id="4750892496809949692">محتوای HTML (با پنهان کردن Flash از فهرست افزایهها) ارجحیت دارد.</translation> <translation id="4750917950439032686">اطلاعات شما (بهعنوان مثال، گذرواژهها یا شماره کارتهای اعتباری) وقتی به این سایت ارسال میشوند، خصوصی هستند.</translation> <translation id="4753602155423695878">پویانمایی نوار پیشرفت بارگیری صفحه تلفن Android</translation> <translation id="4755240240651974342">صفحهکلید فنلاندی</translation> @@ -3083,6 +3085,7 @@ <translation id="5119450342834678097">درخواست گزینه سایت رایانه لوحی در منوی تنظیمات</translation> <translation id="5120068803556741301">روش ورودی شخص ثالث</translation> <translation id="5120421890733714118">برای شناسایی وبسایتها به این گواهی اطمینان شود.</translation> +<translation id="5120516977819314347">پین یا گذرواژه نادرست است.</translation> <translation id="5121130586824819730">دیسک سخت پر است. لطفاً در محل دیگری ذخیره کنید یا فضای بیشتری در دیسک سخت ایجاد کنید.</translation> <translation id="5125751979347152379">نشانی وب نامعتبر است.</translation> <translation id="5127881134400491887">مدیریت اتصالات شبکه</translation> @@ -3090,6 +3093,7 @@ <translation id="512903556749061217">متصل</translation> <translation id="5129301143853688736">اتصال شما به این سایت خصوصی نیست. ممکن است حملهکنندهها در تلاش باشند اطلاعات شما (مثلاً عکسها، گذرواژهها، پیامها یا کارتهای اعتباری) را از <ph name="DOMAIN" /> سرقت کنند.</translation> <translation id="5129662217315786329">لهستانی</translation> +<translation id="5131347545782851480">اسناد PDF</translation> <translation id="5134856901811723984">طراحی سهبعدی در واسط کاربر سیستم عامل Chrome</translation> <translation id="5135533361271311778">ایجاد مورد نشانک ممکن نیست.</translation> <translation id="5136529877787728692">F7</translation> @@ -3259,6 +3263,7 @@ <translation id="5328031682234198929">۸</translation> <translation id="5329858601952122676">&حذف</translation> <translation id="5330145655348521461">این فایلها در میزکار دیگری باز شدهاند. به <ph name="USER_NAME" /> (<ph name="MAIL_ADDRESS" />) بروید تا آن را مشاهده کنید.</translation> +<translation id="5330512191124428349">دریافت اطلاعات</translation> <translation id="5332624210073556029">منطقهٔ زمانی:</translation> <translation id="5333807720589685258">اگر نتوانید کلید باز کردن قفل پین صحیح را وارد کنید، سیمکارت برای همیشه غیرفعال میشود.</translation> @@ -3691,7 +3696,6 @@ <translation id="5892507820957994680">فهرست تفسیر و اجرای نرمافزار داخلی را لغو میکند و شتاب دهنده GPU را در پیکربندی های سیستم پشتیبانی نشده فعال میکند.</translation> <translation id="5895138241574237353">راهاندازی مجدد</translation> <translation id="5895187275912066135">تاریخ صدور</translation> -<translation id="5898154795085152510">سرور گواهی سرویس گیرنده نامعتبری را بازگرداند. خطای <ph name="ERROR_NUMBER" /> (<ph name="ERROR_NAME" />).</translation> <translation id="5900302528761731119">عکس نمایهٔ Google</translation> <translation id="590253956165195626">پیشنهاد ترجمه برای صفحات (صفحاتی که به زبانی است که نمیدانم).</translation> <translation id="5904093760909470684">پیکربندی پراکسی</translation> @@ -3746,6 +3750,8 @@ <translation id="5984222099446776634">بهتازگی بازدیدشده</translation> <translation id="5984814259619230127">پیدا کردن از طریق بلوتوث کم مصرف Smart Lock</translation> <translation id="5986245990306121338">اگر فعال شود، تعویضکننده برگهای نمایش میدهد، حتی زمانی که گزینه «ادغام برگهها و برنامهها» در تنظیمات روشن باشد.</translation> +<translation id="5989712527536636369"><ph name="BEGIN_PARAGRAPH1" /> این اطلاعات، اطلاعاتی کلی درباره دستگاهتان و نحوه استفاده شما از آن است، از جمله، سطح شارژ باتری، چند وقت یکبار از برنامههایتان استفاده میکنید، کیفیت و مدتزمان اتصالهای شبکه (مانند Wi-Fi و بلوتوث) و گزارشهای خرابی وقتی چیزها آنطور که باید کار نمیکنند. بعضی از این اطلاعات به شرکای ما نیز (مانند برنامهنویسان Android) کمک خواهد کرد، برنامهها و محصولاتشان را بهبود ببخشند.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" /> میتوانید این قابلیت را در هر زمانی در «تنظیمات» برنامههای Android روشن یا خاموش کنید. این کار بر توانایی دستگاه در ارسال اطلاعاتی که برای دریافت سرویسهای ضروری (مانند بهروزرسانیهای سیستم و امنیت) نیاز دارد، تأثیری نمیگذارد.<ph name="END_PARAGRAPH2" /></translation> <translation id="5990198433782424697">افزونهها در نشانیهای وب chrome://</translation> <translation id="5990814808592353318">تولید دستی گذرواژه.</translation> <translation id="5991049340509704927">بزرگنمایی</translation> @@ -3759,6 +3765,7 @@ <translation id="6005695835120147974">مسیریاب رسانه</translation> <translation id="6007237601604674381">انتقال انجام نشد. <ph name="ERROR_MESSAGE" /></translation> <translation id="6008241731410823808">پینگهای بررسی پیوند ارسال میکند.</translation> +<translation id="6011449291337289699">پاک کردن دادههای سایت</translation> <translation id="6015796118275082299">سال</translation> <translation id="6016551720757758985">تأیید Powerwash به همراه بازگشت به نسخه قبلی</translation> <translation id="6016809788585079594">برای آخرین بار بگویید «Ok Google»</translation> @@ -3948,7 +3955,6 @@ <translation id="6276301056778294989">مطمئن شوید دستگاه همین کد را نشان میدهد.</translation> <translation id="6277105963844135994">مهلت زمانی شبکه</translation> <translation id="6277518330158259200">گرفتن عکس صفحهنمایش</translation> -<translation id="6278428485366576908">طرح زمینه</translation> <translation id="6279183038361895380">برای نمایش نشانگر |<ph name="ACCELERATOR" />| را فشار دهید</translation> <translation id="6280215091796946657">ورود به سیستم با حساب دیگر</translation> <translation id="6280912520669706465">ARC</translation> @@ -4200,6 +4206,7 @@ <translation id="6607272825297743757">اطلاعات فایل</translation> <translation id="6607831829715835317">ا&بزارهای بیشتر</translation> <translation id="6608140561353073361">همه کوکیها و دادههای سایت...</translation> +<translation id="6610183966322615106">خطا در افزودن چاپگر</translation> <translation id="6610610633807698299">نشانی وب را وارد کنید...</translation> <translation id="6612358246767739896">محتوای محافظتشده</translation> <translation id="6615455863669487791">به من نشان بده</translation> @@ -4263,7 +4270,6 @@ <translation id="6708242697268981054">مبدأ:</translation> <translation id="6709357832553498500">اتصال با استفاده از <ph name="EXTENSIONNAME" /></translation> <translation id="6710213216561001401">قبلی</translation> -<translation id="6712158998835983046">نمایش همه بهصورت پویانماییشده</translation> <translation id="6718273304615422081">در حال فشرده سازی ...</translation> <translation id="671928215901716392">قفل صفحه</translation> <translation id="6721972322305477112">&فایل</translation> @@ -4535,7 +4541,6 @@ <translation id="7088434364990739311">بررسی برای بهروزرسانی شروع نشد (کد خطا <ph name="ERROR" />).</translation> <translation id="708856090370082727">پشتیبانی از پیمایش کل OSK را فعال کنید. با فعال کردن این پرچم، OSK فقط اندازه دیدگاه تصویری را تغییر میدهد.</translation> <translation id="7088674813905715446">این دستگاه توسط سرپرست سیستم در وضعیت بدون دسترسی قرار گرفته است. برای فعال کردن آن جهت ثبتنام، لطفاً از سرپرستتان بخواهید که دستگاه را در وضعیت در حالت تعلیق قرار دهد.</translation> -<translation id="7089609847854449639">مدیر حافظه</translation> <translation id="708969677220991657">درخواستها به میزبان محلی را از طریق HTTPS ممکن میسازد، حتی وقتی گواهی نامعتبری ارائه شود.</translation> <translation id="7092106376816104">موارد استثنای پنجره بازشو</translation> <translation id="7093866338626856921">تبادل داده با دستگاههایی با نامهای: <ph name="HOSTNAMES" /></translation> @@ -4575,7 +4580,7 @@ <translation id="715118844758971915">چاپگرهای کلاسیک</translation> <translation id="7154130902455071009">تغییر صفحه شروعتان به: <ph name="START_PAGE" /></translation> <translation id="7155171745945906037">عکس موجود از دوربین یا فایل</translation> -<translation id="715568033737470079">مشخص کردن آن افزایههای PPAPI که مطابق با خطمشی جعبه ایمنی قفل Win32k اجرا میشود (فقط Windows 10 و بالاتر).</translation> +<translation id="7155226869555939647">پیوندها همیشه برای <ph name="APPLICATION" /> باز شوند</translation> <translation id="7156235233373189579">این فایل برای رایانهای است که از نرمافزار Windows استفاده میکند، این فایل با دستگاه شما که Chrome OS روی آن نصب است سازگار نیست. لطفاً <ph name="BEGIN_LINK" />فروشگاه وب Chrome<ph name="END_LINK" /> را برای برنامه مناسب جایگزین بررسی کنید.<ph name="BEGIN_LINK_HELP" />بیشتر بدانید<ph name="END_LINK_HELP" /></translation> <translation id="7157063064925785854">با کلیک کردن ادامه با <ph name="LEGAL_DOC_LINK_TEXT_1" />، <ph name="LEGAL_DOC_LINK_TEXT_2" />، <ph name="LEGAL_DOC_LINK_TEXT_3" /> و <ph name="LEGAL_DOC_LINK_TEXT_4" /> موافقت میکنید.</translation> <translation id="7158238151765743968">اتصال به «<ph name="DEVICE_NAME" />» همچنان در جریان است.</translation> @@ -4590,6 +4595,7 @@ <translation id="7175353351958621980">بارگیری شده از:</translation> <translation id="7180611975245234373">بازخوانی</translation> <translation id="7180865173735832675">سفارشی کردن</translation> +<translation id="7181387261278441780">پاک کردن و بازنشانی سایت</translation> <translation id="7185078796915954712">امنیت لایه انتقال ۱.۳</translation> <translation id="7185690883425432021">وقتی نوار برگه در حالت پشتهای است، دکمههای بستن را در برگههای غیرفعال پنهان میکند.</translation> <translation id="7186088072322679094">نگه داشتن در نوار ابزار</translation> @@ -4622,7 +4628,6 @@ <translation id="7223775956298141902">اوه... برنامهٔ افزودنی ندارید :-(</translation> <translation id="7224023051066864079">ماسک زیر شبکه:</translation> <translation id="7225179976675429563">نوع شبکه موجود نیست</translation> -<translation id="7230191962699768124">نمایش همه بهصورت غیرمتحرک</translation> <translation id="7230787553283372882">سفارشی کردن اندازه نوشتار</translation> <translation id="7231224339346098802">استفاده از شماره برای نشان دادن تعداد کپی های چاپ (1 یا بیشتر).</translation> <translation id="7238585580608191973">اثر انگشت SHA-256</translation> @@ -4756,7 +4761,6 @@ <translation id="7409233648990234464">راهاندازی مجدد و پاورواش</translation> <translation id="7409836189476010449">اجرای Flash</translation> <translation id="7410344089573941623">بپرسید که آیا <ph name="HOST" /> میخواهد به دوربین و میکرفون شما دسترسی داشته باشد</translation> -<translation id="7411343637221933631">{NUM_COOKIES,plural, =1{۱ مورد از این سایت}one{# مورد از این سایت}other{# مورد از این سایت}}</translation> <translation id="7412226954991670867">حافظه GPU</translation> <translation id="7416362041876611053">خطای شبکه ناشناس.</translation> <translation id="7417453074306512035">صفحهکلید اتیوپیایی</translation> @@ -4878,6 +4882,7 @@ <translation id="756445078718366910">باز کردن پنجرهٔ مرورگر</translation> <translation id="7564847347806291057">پایان دادن به فرایند</translation> <translation id="7566723889363720618">F12</translation> +<translation id="7567314848159753396">کوکی: <ph name="NAME" /></translation> <translation id="756809126120519699">دادههای Chrome پاک شد</translation> <translation id="7568790562536448087">در حال بهروزرسانی</translation> <translation id="7573172247376861652">شارژ باتری</translation> @@ -4917,6 +4922,7 @@ <translation id="7626009897377900107">تولید گذرواژه</translation> <translation id="7627262197844840899">این سایت MasterCard را نمیپذیرد.</translation> <translation id="7627790789328695202">اوه، <ph name="FILE_NAME" /> از قبل وجود دارد. نام آن را تغییر دهید و دوباره امتحان کنید.</translation> +<translation id="7628127343934101653">فایلهای PDF در برنامه نمایشگر پیشفرض PDF باز شوند.</translation> <translation id="762917759028004464">در حال حاضر مرورگر پیشفرض <ph name="BROWSER_NAME" /> است.</translation> <translation id="7629536005696009600">اجازه میدهد اعتبارنامههای ذخیره شده برای برنامههای Android، در وبسایتهای مرتبط استفاده شوند.</translation> <translation id="7629827748548208700">برگه: <ph name="TAB_NAME" /></translation> @@ -5145,6 +5151,7 @@ <translation id="7957513156576779045">بلوتوث را روشن کنید تا مرتبطسازی امکانپذیر شود</translation> <translation id="7957615753207896812">باز کردن تنظیمات دستگاه صفحه کلید</translation> <translation id="7959074893852789871">این فایل دارای چندین مجوز است، برخی از آنها وارد نشدهاند:</translation> +<translation id="7959700692661109221"><ph name="BEGIN_PARAGRAPH" />سرویسهای مکان Google از منابعی مانند Wi Fi استفاده میکنند تا در تخمین سریعتر و دقیقتر مکان دستگاهتان کمک کند. وقتی خدمات مکان Google را روشن میکنید، دستگاهتان وارد حالتی میشود که از Wi-Fi برای ارائه اطلاعات مکان استفاده میکند. میتوانید در هر زمانی در تنظیمات مکان این قابلیت را خاموش کنید.<ph name="END_PARAGRAPH" /></translation> <translation id="7961015016161918242">هرگز</translation> <translation id="7964089325405904043">صادر کردن و وارد کردن گذرواژه</translation> <translation id="7965010376480416255">حافظه مشترک</translation> @@ -5295,6 +5302,7 @@ <translation id="8146793085009540321">ورود به سیستم انجام نشد. لطفاً با سرپرستتان تماس بگیرید یا دوباره امتحان کنید.</translation> <translation id="8148264977957212129">روش ورودی Pinyin</translation> <translation id="8148913456785123871">نمایش کارتهای Google Now در راهانداز</translation> +<translation id="8150391391298684512">غیرفعال کردن رابط برنامهنویسی نرمافزار Windows Runtime MIDI</translation> <translation id="8151185429379586178">ابزارهای برنامهنویس</translation> <translation id="8151638057146502721">پیکربندی</translation> <translation id="8151639108075998630">فعال کردن مرور مهمان</translation> @@ -5575,6 +5583,7 @@ <translation id="8532294913309524834">زبانها را براساس ترجیحتان مرتب کنید.</translation> <translation id="8535005006684281994">نشانی وب تجدید گواهی Netscape</translation> <translation id="8539727552378197395">نه (فقط Http)</translation> +<translation id="8541084862688000575">بارگیری برنامههای Android بهطور خودکار</translation> <translation id="8543181531796978784">میتوانید <ph name="BEGIN_ERROR_LINK" />یک مشکل شناساییشده را گزارش کنید<ph name="END_ERROR_LINK" /> یا اگر از خطراتی که امنیت شما را تهدید میکنند مطلع شدید، <ph name="BEGIN_LINK" />از این سایت ناامن دیدن کنید<ph name="END_LINK" />.</translation> <translation id="8545107379349809705">پنهان کردن اطلاعات…</translation> <translation id="8545211332741562162">به صفحات وب امکان میدهد از ویژگیهای آزمایشی جاوا اسکریپت استفاده کنند.</translation> @@ -5602,7 +5611,6 @@ <translation id="8569764466147087991">انتخاب فایلی برای باز کردن</translation> <translation id="8571032220281885258">وقتی میگویید «Ok Google»، Chrome کلمه بعدی را که بازگو میکنید، جستجو میکند.</translation> <translation id="8571108619753148184">سرور ۴</translation> -<translation id="8572832761467613633">فقط Flash</translation> <translation id="8572981282494768930">به سایتها اجازه داده نشود به دوربین و میکروفن شما دسترسی داشته باشند</translation> <translation id="8574234089711453001">نمایش دکمه بارگیری را هنگام باز کردن صفحهای با نشانیوب رسانه مجاز میکند.</translation> <translation id="857779305329188634">پشتیبانی پروتکل QUIC آزمایشی را به کار بیندازید.</translation> @@ -5624,6 +5632,7 @@ <translation id="8600929685092827187">بستههای بیدارباش</translation> <translation id="8601206103050338563">راستیآزمایی سرویس گیرنده TLS WWW</translation> <translation id="8602851771975208551">برنامهای دیگر بر روی رایانه شما یک برنامه را اضافه کرده است که ممکن است نحوه کارکرد Chrome را تغییر دهد.</translation> +<translation id="8603912787021349466">به Android امکان دهید تا پس از ورود به سیستم، بهطور خودکار راهاندازی شود.</translation> <translation id="8605428685123651449">حافظه SQLite</translation> <translation id="8605503133013456784">لغو مرتبط سازی "<ph name="DEVICE_NAME" />" و قطع اتصال از آن ناموفق بود.</translation> <translation id="8606726445206553943">استفاده از دستگاههای MIDI شما</translation> @@ -5976,6 +5985,7 @@ <translation id="9053965862400494292">هنگام تلاش برای همگامسازی خطایی رخ داد.</translation> <translation id="9056034633062863292">در حال بهروزرسانی Chromebox</translation> <translation id="9056810968620647706">مورد منطبقی یافت نشد.</translation> +<translation id="9057119625587205566">هیچ چاپگری در این نزدیکی نیست</translation> <translation id="9059868303873565140">منوی وضعیت</translation> <translation id="9064142312330104323">عکس نمایهٔ Google (در حال بارگیری)</translation> <translation id="9064275926664971810">برای پر کردن فرمها با یک کلیک، «تکمیل خودکار» را فعال کنید</translation> @@ -5986,6 +5996,7 @@ <translation id="9067401056540256169">این پرچم Chrome را ناامن میکند. تنها درصورتیکه میدانید این چه کار میکند، از آن استفاده کنید. توجه داشته باشید که ممکن است این پرچم بدون اعلان قبلی حذف شود. در صورت فعال کردن این گزینه، فریمهای دارای ریشه https میتوانند از WebSocketهای با یک نشانی وب ناامن (ws://) استفاده کنند.</translation> <translation id="9068931793451030927">مسیر:</translation> <translation id="9070219033670098627">تغییر دادن شخص</translation> +<translation id="9070940116164932228">محدود کردن تایمرهای پسزمینه گران</translation> <translation id="907148966137935206">به هیچ سایتی برای نمایش پنجرههای بازشو اجازه داده نشود (توصیه میشود)</translation> <translation id="9072550133391925347"><ph name="PASSWORD_MANAGER_BRAND" /> شما را بهصورت خودکار در سایتها و برنامههای واجد شرایط با گذرواژههایی که ذخیره کردهاید ثبت ورود میکند.</translation> <translation id="9073281213608662541">PAP</translation> @@ -6020,6 +6031,7 @@ <translation id="9112614144067920641">لطفاً یک پین جدید انتخاب کنید.</translation> <translation id="9112748030372401671">تغییر کاغذدیواری</translation> <translation id="9112987648460918699">یافتن...</translation> +<translation id="9114663181201435112">ورود به سیستم آسان</translation> <translation id="9115487443206954631">مدیریت دستگاههای Cast</translation> <translation id="9115675100829699941">&نشانک ها</translation> <translation id="9121814364785106365">باز کردن بهعنوان برگه الصاق شده</translation> @@ -6114,7 +6126,6 @@ <translation id="952992212772159698">فعال نشد</translation> <translation id="960719561871045870">کد اپراتور</translation> <translation id="960987915827980018">حدود ۱ ساعت باقی مانده است</translation> -<translation id="962778376131245616">فقط نمایش غیرایمن، غیرمتحرک</translation> <translation id="96421021576709873">شبکه Wi-Fi</translation> <translation id="965490406356730238">رمزگشای mjpeg شتابداده شده برای سختافزار را برای قاب ضبط شده (در صورت وجود) فعال میکند.</translation> <translation id="968174221497644223">حافظه پنهان برنامه</translation>
diff --git a/chrome/app/resources/generated_resources_fi.xtb b/chrome/app/resources/generated_resources_fi.xtb index 3f15200..ac135b1 100644 --- a/chrome/app/resources/generated_resources_fi.xtb +++ b/chrome/app/resources/generated_resources_fi.xtb
@@ -18,7 +18,6 @@ <translation id="1029317248976101138">Lähennä</translation> <translation id="1029595648591494741">Haluatko kokeilla sovellusta <ph name="EXTENSION_NAME" />?</translation> <translation id="1031362278801463162">Ladataan esikatselua</translation> -<translation id="1031460590482534116">Asiakkaan varmenteen tallentamisessa tapahtui virhe <ph name="ERROR_NUMBER" /> (<ph name="ERROR_NAME" />).</translation> <translation id="1031573127485938293">Kysy (käytännön määrittämä)</translation> <translation id="103279545524624934">Vapauta levytilaa, jotta voit käynnistää Android-sovelluksia.</translation> <translation id="1033780634303702874">Käyttää sarjaporttilaitteitasi</translation> @@ -101,6 +100,7 @@ <translation id="1128591060186966949">Muokkaa hakukonetta</translation> <translation id="1128987120443782698">Tallennuslaitteella on <ph name="DEVICE_CAPACITY" /> tallennustilaa. Käytä SD-korttia tai USB-muistitikkua, jolla on vähintään 4 Gt tallennustilaa.</translation> <translation id="1137135726305341424">domContentLoaded-tapahtuma, kaikkien resurssien lataaminen alkoi ennen domContentLoaded-tapahtumaa (pääkehys ja saman alkuperän iframet).</translation> +<translation id="1138663153846032155">Suosi HTML:ää Flashin sijaan</translation> <translation id="1140351953533677694">Käyttää Bluetooth- ja sarjaporttilaitteitasi</translation> <translation id="114140604515785785">Laajennuksen juurihakemisto:</translation> <translation id="1143142264369994168">Varmenteen allekirjoittaja</translation> @@ -252,6 +252,7 @@ <translation id="1351692861129622852">Tuodaan <ph name="FILE_COUNT" /> tiedostoa…</translation> <translation id="1352103415082130575">Thainkielinen näppäimistö (pattachote)</translation> <translation id="1353686479385938207"><ph name="PROVIDER_NAME" />: <ph name="NETWORK_NAME" /></translation> +<translation id="1353946958707294039">Material Designin tallennustilan hallinta</translation> <translation id="1353966721814789986">Käynnistyssivut:</translation> <translation id="1354868058853714482">Adobe Reader on vanhentunut ja siinä voi olla tietosuoja-aukkoja.</translation> <translation id="1355408554203439639">Ohjelmistopohjainen 3D-rasterointi</translation> @@ -423,7 +424,6 @@ <translation id="1533920822694388968">TV-kuvan asettelu</translation> <translation id="15373452373711364">Suuri hiiren osoitin</translation> <translation id="1543284117603151572">Edgestä tuodut</translation> -<translation id="1544350195767834591">{NUM_COOKIES,plural, =1{1 muilta sivustoilta}other{# muilta sivustoilta}}</translation> <translation id="1545177026077493356">Automaattinen kioskitila</translation> <translation id="1545786162090505744">URL-osoite jonka %s käytössä ennen hakua</translation> <translation id="1546280085599573572">Tämä laajennus on vaihtanut Etusivu-painikkeella avattavan sivun.</translation> @@ -447,7 +447,6 @@ <translation id="1559235587769913376">Unicode-merkkien syöttö</translation> <translation id="1561092721008294962">HarfBuzz käyttöliittymän tekstille</translation> <translation id="1566049601598938765">Verkkosivusto</translation> -<translation id="1566958206723629112">Flash ja PDF</translation> <translation id="1567723158593978621">Jos toiminto on käytössä, selaimeen kirjaudutaan uudella salasanasta erillisellä GAIA-kirjautumisella.</translation> <translation id="1567993339577891801">JavaScript-konsoli</translation> <translation id="1568323446248056064">Avaa näytön laiteasetukset</translation> @@ -576,7 +575,6 @@ <translation id="1723940674997333416">Salli suojaamattomat WebSocketia käyttävät yhteydet https-osoitteista</translation> <translation id="1725149567830788547">Näytä &painikkeet</translation> <translation id="172612876728038702">TPM:ää asennetaan. Ole kärsivällinen, tämä voi kestää hetken.</translation> -<translation id="1727135806684246609">Material designin laajennettu suojaus</translation> <translation id="1729533290416704613">Määrittää myös omnibox-hakujen aloitussivun.</translation> <translation id="1731346223650886555">Puolipiste</translation> <translation id="1731589410171062430">Yhteensä: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /> (<ph name="NUMBER_OF_PAGES" /> <ph name="PAGE_OR_PAGES_LABEL" />)</translation> @@ -872,6 +870,7 @@ <translation id="218492098606937156">Ota kosketustapahtumat käyttöön</translation> <translation id="2187317261103489799">Tunnista (oletus)</translation> <translation id="2187895286714876935">Palvelimen varmenteen tuontivirhe</translation> +<translation id="2188881192257509750">Avaa <ph name="APPLICATION" /></translation> <translation id="2190069059097339078">Wi-Fi-tunnuksien hakija</translation> <translation id="219008588003277019">Asiakasmoduuli: <ph name="NEXE_NAME" /></translation> <translation id="2190355936436201913">(tyhjä)</translation> @@ -990,6 +989,7 @@ <translation id="2326606747676847821">Siirry incognito-tilaan</translation> <translation id="2326931316514688470">&Lataa sovellus uudelleen</translation> <translation id="2327492829706409234">Ota sovellus käyttöön</translation> +<translation id="2328054044222305089">Tämä poistaa kaikki tiedot, jotka <ph name="SITE" /> on tallentanut laitteellesi, ja nollaa antamasi suoritusoikeudet. Haluatko jatkaa?</translation> <translation id="2329597144923131178">Kirjaudu ja käytä kirjanm., historiaa, salasan. ja muita asetuksia kaikissa laitteissasi.</translation> <translation id="2332131598580221120">Näytä Web Storessa</translation> <translation id="2332742915001411729">Palauta oletusarvo</translation> @@ -1266,7 +1266,6 @@ <translation id="2675358154061544447">Hyvin kokeellinen tuki eri sivustoilla olevien iframe-kehysten hahmontamiselle erillisissä prosesseissa. Tässä tilassa dokumentit jakavat hahmontamisprosessin vain, jos ne ovat samalta verkkosivulta.</translation> <translation id="2676946222714718093">Toistetaan Chromecastilla</translation> <translation id="2678063897982469759">Ota uudelleen käyttöön</translation> -<translation id="2678246812096664977">Kaikki laajennukset</translation> <translation id="2679385451463308372">Tulosta järjestelmän ikkunan kautta...</translation> <translation id="2680208403056680091">Internetyhteyttäsi hallinnoidaan</translation> <translation id="268053382412112343">Hi&storia</translation> @@ -1440,7 +1439,6 @@ <translation id="287286579981869940">Lisää <ph name="PROVIDER_NAME" />…</translation> <translation id="2872961005593481000">Sammuta</translation> <translation id="2875698561019555027">(Chromen virhesivut)</translation> -<translation id="2879560882721503072">Tahon <ph name="ISSUER" /> myöntämä asiakasvarmenne tallennettu.</translation> <translation id="288024221176729610">tšekki</translation> <translation id="288042212351694283">Käytä Universal 2nd Factor -laitteita</translation> <translation id="2881966438216424900">Viimeksi käytetty:</translation> @@ -1589,6 +1587,7 @@ <translation id="3057861065630527966">Varmuuskopioi valokuvasi ja videosi.</translation> <translation id="3058212636943679650">Tietokoneen käyttöjärjestelmän palauttamiseen tarvitaan palautustiedot sisältävä SD-kortti tai USB-muistitikku.</translation> <translation id="305932878998873762">Simple Cache HTTP:lle on uusi välimuisti, joka käyttää levytilan varaamiseen tiedostojärjestelmää.</translation> +<translation id="3060251871394327123">Tämä poistaa kaikki tiedot, jotka <ph name="SITE" /> on tallentanut laitteellesi. Haluatko jatkaa?</translation> <translation id="3061650404498811439">Sallii emojien, käsinkirjoituksen ja äänisyötön käytön IME-käyttöönottovalikossa.</translation> <translation id="3062606427884046423">Näyttää Chromen mediailmoitukset Android MediaStyle -ilmoituksina.</translation> <translation id="3063844757726132584">Käytä kaikkia sovelluksiasi tällä kätevällä käynnistysohjelmalla. Pelaa pelejä, soita videopuheluita, kuuntele musiikkia, muokkaa dokumentteja tai hanki lisää sovelluksia.</translation> @@ -1638,6 +1637,7 @@ <translation id="3123569374670379335">(Valvottu)</translation> <translation id="3124111068741548686">KÄYTTÄJÄ-kahvat</translation> <translation id="3126026824346185272">Ctrl</translation> +<translation id="3127156390846601284">Tämä poistaa kaikki tiedot, jotka luettelossa olevat sivustot ovat tallentaneet laitteellesi. Haluatko jatkaa?</translation> <translation id="312759608736432009">Laitteen valmistaja:</translation> <translation id="3127919023693423797">Varmennetaan...</translation> <translation id="3128230619496333808">Välilehti 6</translation> @@ -1736,7 +1736,6 @@ <translation id="3264544094376351444">Sans-Serif-kirjasin</translation> <translation id="3264547943200567728">Chromeboxin verkkoyhteyden määrittäminen epäonnistui.</translation> <translation id="3265459715026181080">Sulje ikkuna</translation> -<translation id="3267271790328635957">Vain PDF</translation> <translation id="3267726687589094446">Salli edelleen useiden tiedostojen automaattinen lataaminen</translation> <translation id="3267998849713137817">Muokkauspäivä</translation> <translation id="3268451620468152448">Avoimet välilehdet</translation> @@ -1982,6 +1981,7 @@ <translation id="3574210789297084292">kirjaudu sisään</translation> <translation id="3574305903863751447"><ph name="CITY" />, <ph name="STATE" /> <ph name="COUNTRY" /></translation> <translation id="357479282490346887">liettua</translation> +<translation id="3575927481544652747">Poista käytöstä WebMIDIn Windows Runtime MIDI ‑sovellusliittymä, joka on oletuksena käytössä Windows 10:ssä ja uudemmissa versioissa.</translation> <translation id="3576324189521867626">Asennus onnistui.</translation> <translation id="3578331450833904042">Oletus (kuuntelee kaikkea)</translation> <translation id="3578594933904494462">Tämän välilehden sisältöä jaetaan.</translation> @@ -2035,8 +2035,6 @@ <translation id="3627320433825461852">Alle minuutti jäljellä</translation> <translation id="3627588569887975815">Avaa linkki inco&gnito-ikkunassa</translation> <translation id="3627671146180677314">Netscape-varmenteen uusimisaika</translation> -<translation id="3629326610814700057">Sallii paikallisen tallennustilan hallinnoinnin tallennustilan hallinnalle.</translation> -<translation id="3630337581925712713"><ph name="PERMISSION_TYPE_LABEL" />:</translation> <translation id="3631337165634322335">Alla olevat poikkeukset koskevat vain tätä incognito-käyttökertaa.</translation> <translation id="3633586230741134985">Sovellusten käynnistysohjelman asetukset</translation> <translation id="3633997706330212530">Voit poistaa nämä palvelut käytöstä halutessasi.</translation> @@ -2059,7 +2057,8 @@ <translation id="3654045516529121250">Lukea käytettävyysasetuksia.</translation> <translation id="3654092442379740616">Synkronointivirhe: <ph name="PRODUCT_NAME" /> on vanhentunut ja tulee päivittää.</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{Sillä on yhden tiedoston pysyvä käyttöoikeus.}other{Sillä on # tiedoston pysyvä käyttöoikeus.}}</translation> -<translation id="3657468915905674858">Ota PPAPI käyttöön Win32k-lukitusympäristössä.</translation> +<translation id="365793796291733849"><ph name="BEGIN_PARAGRAPH1" />Kun otat automaattisen varmuuskopioinnin käyttöön, laitteen ja sovelluksien tiedot tallennetaan säännöllisesti yksityiseen kansioon Google Drivessa. Sovelluksen tiedot voivat olla mitä tahansa (kehittäjän asetuksien perusteella määräytyviä) sovelluksen tallentamia tietoja, ja ne voivat sisältää mahdollisesti arkaluontoisia tietoja, kuten yhteystietoja, viestejä ja kuvia.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Varmuuskopioidut tiedot eivät kuluta Drivessa käytettävissä olevaa tallennustilaasi. Suuria tiedostoja tai tiedostoja, jotka kehittäjät ovat jättäneet palvelun ulkopuolelle, ei varmuuskopioida.<ph name="END_PARAGRAPH2" /></translation> <translation id="3660234220361471169">Ei-luotettu</translation> <translation id="3665589677786828986">Chrome havaitsi, että toinen ohjelma oli muokannut joitakin selainasetuksia, ja palautti asetukset alkuperäisiksi.</translation> <translation id="3665842570601375360">Turvallisuus:</translation> @@ -2114,6 +2113,7 @@ <translation id="3733127536501031542">SSL-palvelin ja Step-up</translation> <translation id="3736520371357197498">Jos ymmärrät käyntiä koskevat turvallisuusriskit, voit <ph name="BEGIN_LINK" />siirtyä vaarantuneeseen sivustoon<ph name="END_LINK" /> jo ennen haitallisten ohjelmien poistamista.</translation> <translation id="3738924763801731196"><ph name="OID" />:</translation> +<translation id="3739254215541673094">Avataanko <ph name="APPLICATION" />?</translation> <translation id="3739798227959604811">Viive ennen toistoa:</translation> <translation id="3741158646617793859"><ph name="DEVICE_NAME" /> näkyy nyt hallintakonsolissa</translation> <translation id="3741243925913727067">Varmuuskopioi medialaitteesi valokuvat ja videot Google Driveen.</translation> @@ -2349,7 +2349,6 @@ <translation id="4058793769387728514">Tarkista asiakirja nyt</translation> <translation id="4059285154003114015">&Tulosta kehys…</translation> <translation id="406070391919917862">Taustasovellukset</translation> -<translation id="4061502419206152498">Näytä vain suojaamattomat ja ei-animoidut</translation> <translation id="4062251648694601778">Nauti <ph name="SHORT_PRODUCT_NAME" />-laitteestasi. Jos sinulla on kysymyksiä, voit aina pyytää apua klikkaamalla tila-alueen ?-kuvaketta.</translation> <translation id="4065876735068446555">Käyttämäsi verkko (<ph name="NETWORK_ID" />) saattaa edellyttää kirjautumista.</translation> <translation id="4068506536726151626">Tämä sivu sisältää osia seuraavista sivuistoista, jotka käyttävät sijaintiasi:</translation> @@ -2388,7 +2387,6 @@ <translation id="4101878899871018532">Salasanojen hallinta ei ehdota synkronointitunnusten tallentamista.</translation> <translation id="410351446219883937">Automaattinen toisto</translation> <translation id="4104163789986725820">V&ie...</translation> -<translation id="4105523032910086267">Määrittää Material designin laajennetun suojauksen animaatio- ja näkyvyysasetukset.</translation> <translation id="4105563239298244027">1 Tt ilmaista tallennustilaa Google Drivessa</translation> <translation id="4109135793348361820">Siirrä ikkuna käyttäjälle <ph name="USER_NAME" /> (<ph name="USER_EMAIL" />)</translation> <translation id="4110342520124362335">Evästeet lähteestä <ph name="DOMAIN" /> estetty.</translation> @@ -2439,6 +2437,7 @@ <translation id="418179967336296930">Näppäimistö: venäjä (foneettinen YaZHert)</translation> <translation id="4181841719683918333">Kielet</translation> <translation id="4187248015940562149">Tämä merkintä ottaa käyttöön Web Bluetoothin, jonka avulla verkkosivustot voivat ehkä muodostaa yhteyden lähelläsi oleviin Bluetooth-laitteisiin ja hallinnoida niitä.</translation> +<translation id="4188447344915957833">Ota tallennustilan hallinta käyttöön Material Design ‑asetuksissa.</translation> <translation id="4189406272289638749">Laajennus <b><ph name="EXTENSION_NAME" /></b> hallinnoi tätä asetusta.</translation> <translation id="4193154014135846272">Google-dokumentti</translation> <translation id="4193182321948161343">Ota käyttöön Material Design ‑käyttäjänhallinta</translation> @@ -2645,6 +2644,7 @@ <translation id="4508765956121923607">Näytä lähdek&oodi</translation> <translation id="4509017836361568632">Hylkää kuva</translation> <translation id="4509345063551561634">Sijainti:</translation> +<translation id="4513946894732546136">Palaute</translation> <translation id="4514542542275172126">Luo uusi valvottu käyttäjä</translation> <translation id="4514914692061505365">Pakota PNaCl's fast Subzero ‑kääntäjän käyttö kaikille pexe-tiedostoille.</translation> <translation id="451515744433878153">Poista</translation> @@ -2743,6 +2743,7 @@ <translation id="4656293982926141856">Tällä tietokoneella</translation> <translation id="4656631038341342120">Ota virtuaalikomentotulkki käyttöön, jos laitteella on sellainen.</translation> <translation id="4657031070957997341">Salli aina laajennukset sivustossa <ph name="HOST" />.</translation> +<translation id="466008749075469935">Ota käyttöön mahdollisuus rajoittaa tausta-ajastimien suorittimien käyttö 1 %:iin.</translation> <translation id="4663254525753315077">Kun mahdollista, sijoittaa ylivuotavan vierityselementin vieritettävän sisällön yhdistettyyn tasoon, mikä nopeuttaa vieritystä.</translation> <translation id="4664482161435122549">PKCS #12 -vientivirhe</translation> <translation id="4665014895760275686">Valmistaja</translation> @@ -2808,6 +2809,7 @@ <translation id="4749157430980974800">Georgialainen näppäimistö</translation> <translation id="4750394297954878236">Ehdotukset</translation> <translation id="475088594373173692">Ensimmäinen käyttäjä</translation> +<translation id="4750892496809949692">Suosi HTML-sisältöä piilottamalla Flash laajennusluettelosta.</translation> <translation id="4750917950439032686">Salasanat, luottokorttinumerot ja muut tietosi pysyvät yksityisinä, kun ne lähetetään tälle sivustolle.</translation> <translation id="4753602155423695878">Android-puhelimen sivun lataamisen etenemispalkin animaatio</translation> <translation id="4755240240651974342">Näppäimistö: suomi</translation> @@ -3081,6 +3083,7 @@ <translation id="5119450342834678097">Tablettisivun pyytäminen asetusvalikossa</translation> <translation id="5120068803556741301">Kolmannen osapuolen syöttötapa</translation> <translation id="5120421890733714118">Luota tähän varmenteeseen verkkosivustojen tunnistamisessa.</translation> +<translation id="5120516977819314347">PIN-koodi tai salasana on virheellinen.</translation> <translation id="5121130586824819730">Kiintolevy on täynnä. Tallenna muuhun sijaintiin tai vapauta levytilaa.</translation> <translation id="5125751979347152379">Virheellinen URL-osoite.</translation> <translation id="5127881134400491887">hallinnoida verkkoyhteyksiä</translation> @@ -3088,6 +3091,7 @@ <translation id="512903556749061217">liitetty</translation> <translation id="5129301143853688736">Tämän sivuston yhteyttä ei ole suojattu. Hyökkääjät voivat yrittää varastaa tietojasi (kuten kuvia, salasanoja, viestejä ja luottokorttien tietoja) verkkotunnuksesta <ph name="DOMAIN" />.</translation> <translation id="5129662217315786329">puola</translation> +<translation id="5131347545782851480">PDF-dokumentit</translation> <translation id="5134856901811723984">Material Designin käyttö Chrome-käyttöjärjestelmän käyttöliittymässä</translation> <translation id="5135533361271311778">Kirjanmerkin luominen epäonnistui.</translation> <translation id="5136529877787728692">F7</translation> @@ -3254,6 +3258,7 @@ <translation id="5328031682234198929">8</translation> <translation id="5329858601952122676">&Poista</translation> <translation id="5330145655348521461">Nämä tiedostot avattiin toisella työpöydällä. Näet tiedostot siirtymällä profiiliin <ph name="USER_NAME" /> (<ph name="MAIL_ADDRESS" />).</translation> +<translation id="5330512191124428349">Näytä tiedot</translation> <translation id="5332624210073556029">Aikavyöhyke:</translation> <translation id="5333807720589685258">SIM-korttisi poistetaan käytöstä pysyvästi, jos et anna oikeaa PUK-koodia.</translation> @@ -3686,7 +3691,6 @@ <translation id="5892507820957994680">Ohittaa sisäänrakennetun ohjelmistohahmonnuksen luettelon ja ottaa GPU-kiihdytyksen käyttöön ei-tuetuissa järjestelmäkokoonpanoissa.</translation> <translation id="5895138241574237353">Käynnistä uudelleen</translation> <translation id="5895187275912066135">Myöntämispäivämäärä</translation> -<translation id="5898154795085152510">Palvelin palautti virheellisen asiakasvarmenteen <ph name="ERROR_NUMBER" /> (<ph name="ERROR_NAME" />).</translation> <translation id="5900302528761731119">Google-profiilin valokuva</translation> <translation id="590253956165195626">Tarjoa käännöstä muunkielisille sivuille.</translation> <translation id="5904093760909470684">Välityspalvelimen määritykset</translation> @@ -3741,6 +3745,8 @@ <translation id="5984222099446776634">Viimeksi vieraillut</translation> <translation id="5984814259619230127">Smart Lockin Bluetooth Low Energy -tunnistus</translation> <translation id="5986245990306121338">Jos tämä on käytössä, välilehden vaihtaja näkyy myös silloin, kun ”Yhdistä välilehdet ja sovellukset” on valittuna.</translation> +<translation id="5989712527536636369"><ph name="BEGIN_PARAGRAPH1" />Nämä ovat yleisiä tietoja laitteestasi ja sen käytöstä, kuten akun varaustaso, sovellusten käyttötiheys, verkkoyhteyksien (kuten Wi-Fi ja Bluetooth) kesto ja laatu sekä vikatilanteissa luotavat virheraportit. Tiedoilla parannetaan Googlen tuotteiden ja palvelujen kaikkien käyttäjien käyttökokemusta. Lisäksi kumppanimme, kuten Android-kehittäjät, voivat käyttää joitakin koottuja tietoja sovellustensa ja tuotteidensa parantamiseen.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Voit ottaa tämän asetuksen käyttöön tai poistaa sen käytöstä Androidin sovellusasetuksissa. Tästä asetuksesta riippumatta laitteesi voi lähettää tietoja, joita tarvitaan esimerkiksi järjestelmäpäivitysten, tietoturvaominaisuuksien ja muiden tärkeiden palvelujen käyttöön.<ph name="END_PARAGRAPH2" /></translation> <translation id="5990198433782424697">Laajennukset chrome://-alkuisissa URL-osoitteissa</translation> <translation id="5990814808592353318">Manuaalinen salasanan luonti</translation> <translation id="5991049340509704927">Suurenna</translation> @@ -3754,6 +3760,7 @@ <translation id="6005695835120147974">Mediareititin</translation> <translation id="6007237601604674381">Siirto epäonnistui. <ph name="ERROR_MESSAGE" /></translation> <translation id="6008241731410823808">Hyperlinkkien tarkistussignaalien lähettäminen.</translation> +<translation id="6011449291337289699">Tyhjennä sivustotiedot</translation> <translation id="6015796118275082299">Vuosi</translation> <translation id="6016551720757758985">Powerwashin vahvistaminen palauttaa käyttöön edellisen version</translation> <translation id="6016809788585079594">Sano ”Ok Google” vielä kerran.</translation> @@ -3945,7 +3952,6 @@ <translation id="6276301056778294989">Varmista, että laite näyttää samaa koodia.</translation> <translation id="6277105963844135994">Verkon aikakatkaisu</translation> <translation id="6277518330158259200">Ot&a kuvakaappaus</translation> -<translation id="6278428485366576908">Teema</translation> <translation id="6279183038361895380">Näytä kursori painamalla |<ph name="ACCELERATOR" />|.</translation> <translation id="6280215091796946657">Kirjaudu sisään toisella tilillä</translation> <translation id="6280912520669706465">ARC</translation> @@ -4197,6 +4203,7 @@ <translation id="6607272825297743757">Tiedoston tiedot</translation> <translation id="6607831829715835317">&Lisää työkaluja</translation> <translation id="6608140561353073361">Kaikki evästeet ja sivuston tiedot...</translation> +<translation id="6610183966322615106">Tulostinta lisättäessä tapahtui virhe.</translation> <translation id="6610610633807698299">Anna URL-osoite...</translation> <translation id="6612358246767739896">Suojattu sisältö</translation> <translation id="6615455863669487791">Näytä</translation> @@ -4260,7 +4267,6 @@ <translation id="6708242697268981054">Alkuperä:</translation> <translation id="6709357832553498500">Yhdistä laajennuksella <ph name="EXTENSIONNAME" /></translation> <translation id="6710213216561001401">Edellinen</translation> -<translation id="6712158998835983046">Näytä kaikki animoidut</translation> <translation id="6718273304615422081">Pakataan…</translation> <translation id="671928215901716392">Ruudunlukitus</translation> <translation id="6721972322305477112">&Tiedosto</translation> @@ -4531,7 +4537,6 @@ <translation id="7088434364990739311">Päivitystarkistuksen käynnistäminen epäonnistui (virhekoodi <ph name="ERROR" />).</translation> <translation id="708856090370082727">Salli näyttönäppäimistön ylivierityksen tuki. Kun se on käytössä, näyttönäppäimistö muuttaa vain visuaalisen näkymän kokoa.</translation> <translation id="7088674813905715446">Järjestelmänvalvoja on asettanut tämän laitteen poistotilaan. Voit asettaa sen käyttöönottotilaan pyytämällä järjestelmänvalvojaa asettamaan laitteen odottavaan tilaan.</translation> -<translation id="7089609847854449639">Tallennustilan hallinta</translation> <translation id="708969677220991657">Salli pyynnöt paikallisisännälle HTTPS-yhteydellä, vaikka virheellinen varmenne annettaisiin.</translation> <translation id="7092106376816104">Ponnahdusikkunapoikkeukset</translation> <translation id="7093866338626856921">Vaihtaa tietoja isäntää <ph name="HOSTNAMES" /> käyttävien laitteiden kanssa.</translation> @@ -4571,7 +4576,7 @@ <translation id="715118844758971915">Perinteiset tulostimet</translation> <translation id="7154130902455071009">Vaihda aloitussivuksi <ph name="START_PAGE" /></translation> <translation id="7155171745945906037">Olemassa oleva kuva kamerasta tai tiedostosta</translation> -<translation id="715568033737470079">Määrittää PPAPI-laajennukset, jotka suoritetaan Win32k-lukitusympäristökäytännön yhteydessä (vain Windows 10 tai uudempi versio).</translation> +<translation id="7155226869555939647">Avaa aina sovelluksen <ph name="APPLICATION" /> linkit</translation> <translation id="7156235233373189579">Tämä tiedosto on tarkoitettu Windows-ohjelmistoa käyttävälle tietokoneelle. Tämä ei ole yhteensopiva Chrome-käyttöjärjestelmää käyttävän laitteesi kanssa. Etsi sopiva korvaava sovellus <ph name="BEGIN_LINK" />Chrome Web Storesta<ph name="END_LINK" />. <ph name="BEGIN_LINK_HELP" />Lisätietoja<ph name="END_LINK_HELP" /></translation> <translation id="7157063064925785854">Klikkaamalla Jatka hyväksyt seuraavat ehdot ja käytännöt: <ph name="LEGAL_DOC_LINK_TEXT_1" />, <ph name="LEGAL_DOC_LINK_TEXT_2" />, <ph name="LEGAL_DOC_LINK_TEXT_3" /> ja <ph name="LEGAL_DOC_LINK_TEXT_4" />.</translation> <translation id="7158238151765743968">Yhteyden muodostaminen laitteeseen <ph name="DEVICE_NAME" /> on vielä kesken.</translation> @@ -4586,6 +4591,7 @@ <translation id="7175353351958621980">Ladattu kohteesta:</translation> <translation id="7180611975245234373">Päivitä</translation> <translation id="7180865173735832675">Muokkaa</translation> +<translation id="7181387261278441780">Tyhjennä ja nollaa sivustotiedot</translation> <translation id="7185078796915954712">TLS 1.3</translation> <translation id="7185690883425432021">Piilottaa ei-aktiivisten välilehtien sulkemispainikkeet välilehtipinosta.</translation> <translation id="7186088072322679094">Pidä yläpalkissa</translation> @@ -4618,7 +4624,6 @@ <translation id="7223775956298141902">Höh, sinulla ei ole laajennuksia :-(</translation> <translation id="7224023051066864079">Aliverkon peite:</translation> <translation id="7225179976675429563">Verkon tyyppi puuttuu</translation> -<translation id="7230191962699768124">Näytä kaikki ei-animoidut</translation> <translation id="7230787553283372882">Muokkaa tekstin kokoa</translation> <translation id="7231224339346098802">Määritä tulostettavien kappaleiden määrä numerolla (vähintään 1).</translation> <translation id="7238585580608191973">SHA-256-tunnistetiedosto</translation> @@ -4749,7 +4754,6 @@ <translation id="7409233648990234464">Käynnistä uudelleen ja tee Powerwash</translation> <translation id="7409836189476010449">suorittaa Flashin</translation> <translation id="7410344089573941623">Kysy, jos <ph name="HOST" /> haluaa käyttää kameraa ja mikrofonia</translation> -<translation id="7411343637221933631">{NUM_COOKIES,plural, =1{1 tältä sivustolta}other{# tältä sivustolta}}</translation> <translation id="7412226954991670867">Keskusyksikön muisti</translation> <translation id="7416362041876611053">Tuntematon verkkovirhe.</translation> <translation id="7417453074306512035">Etiopialainen näppäimistö</translation> @@ -4871,6 +4875,7 @@ <translation id="756445078718366910">Avaa selainikkuna</translation> <translation id="7564847347806291057">Lopeta prosessi</translation> <translation id="7566723889363720618">F12</translation> +<translation id="7567314848159753396">Eväste: <ph name="NAME" /></translation> <translation id="756809126120519699">Chrome-tiedot tyhjennetty</translation> <translation id="7568790562536448087">Päivitetään</translation> <translation id="7573172247376861652">Akun varaus</translation> @@ -4911,6 +4916,7 @@ <translation id="7626009897377900107">Salasanojen luominen</translation> <translation id="7627262197844840899">Tässä sivustossa ei voi käyttää MasterCardia.</translation> <translation id="7627790789328695202">Hups, <ph name="FILE_NAME" /> on jo olemassa. Anna kohteelle toinen nimi ja yritä uudelleen.</translation> +<translation id="7628127343934101653">Avaa PDF-tiedostot PDF:ien oletuskatselusovelluksessa</translation> <translation id="762917759028004464">Tällä hetkellä oletusselain on <ph name="BROWSER_NAME" />.</translation> <translation id="7629536005696009600">Salli Android-sovelluksia koskevien tallennettujen käyttöoikeustietojen täyttäminen sovelluksia vastaaviin sivustoihin.</translation> <translation id="7629827748548208700">Välilehti: <ph name="TAB_NAME" /></translation> @@ -5139,6 +5145,7 @@ <translation id="7957513156576779045">Salli laiteparin muodostus ottamalla ensin Bluetooth käyttöön.</translation> <translation id="7957615753207896812">Avaa näppäimistön laiteasetukset</translation> <translation id="7959074893852789871">Tiedostossa oli useita varmenteita, joista kaikkia ei tuotu:</translation> +<translation id="7959700692661109221"><ph name="BEGIN_PARAGRAPH" />Googlen sijaintipalvelut auttavat arvioimaan laitteesi sijainnin nopeammin ja tarkemmin käyttämällä Wi-Fi-verkkoja ja muita lähteitä. Kun otat Googlen sijaintipalvelut käyttöön, laitteesi siirtyy tilaan, jossa sijaintitietoja kerätään Wi-Fi-verkkojen avulla. Voit poistaa tämän toiminnon käytöstä milloin tahansa sijaintiasetuksissa.<ph name="END_PARAGRAPH" /></translation> <translation id="7961015016161918242">Ei koskaan</translation> <translation id="7964089325405904043">Salasanojen tuominen ja vieminen</translation> <translation id="7965010376480416255">Jaettu muisti</translation> @@ -5289,6 +5296,7 @@ <translation id="8146793085009540321">Sisäänkirjautuminen epäonnistui. Ota yhteyttä järjestelmänvalvojaan tai yritä uudelleen.</translation> <translation id="8148264977957212129">Pinyin-syöttötapa</translation> <translation id="8148913456785123871">Näytä Google Now -kortit käynnistysohjelmassa.</translation> +<translation id="8150391391298684512">Poista käytöstä Windows Runtime MIDI ‑sovellusliittymä</translation> <translation id="8151185429379586178">Kehittäjän työkalut</translation> <translation id="8151638057146502721">Määritä:</translation> <translation id="8151639108075998630">Ota vierailijaselaus käyttöön</translation> @@ -5569,6 +5577,7 @@ <translation id="8532294913309524834">Järjestä kielet haluamallasi tavalla.</translation> <translation id="8535005006684281994">Netscape-varmenteen uusimis-URL</translation> <translation id="8539727552378197395">Ei (HttpOnly)</translation> +<translation id="8541084862688000575">Lataa Android-sovellukset automaattisesti</translation> <translation id="8543181531796978784">Voit <ph name="BEGIN_ERROR_LINK" />ilmoittaa löytyneestä ongelmasta<ph name="END_ERROR_LINK" /> tai <ph name="BEGIN_LINK" />siirtyä mahdollisesti haitalliselle sivustolle<ph name="END_LINK" />, jos ymmärrät tietoturvariskit.</translation> <translation id="8545107379349809705">Piilota tiedot...</translation> <translation id="8545211332741562162">Anna verkkosivujen käyttää kokeellisia JavaScript-ominaisuuksia.</translation> @@ -5596,7 +5605,6 @@ <translation id="8569764466147087991">Valitse avattava tiedosto</translation> <translation id="8571032220281885258">Kun sanot Ok Google, Chrome tekee haun seuraavaksi sanomallasi kyselyllä.</translation> <translation id="8571108619753148184">Palvelin 4</translation> -<translation id="8572832761467613633">Vain Flash</translation> <translation id="8572981282494768930">Älä anna sivustojen käyttää kameraa ja mikrofonia</translation> <translation id="8574234089711453001">Sallii latauspainikkeen ilmestymisen, kun media-URL-osoitteen sisältävä sivu avataan.</translation> <translation id="857779305329188634">Ota käyttöön kokeellinen QUIC-protokollan tuki.</translation> @@ -5618,6 +5626,7 @@ <translation id="8600929685092827187">Herätä paketteja vastaanotettaessa</translation> <translation id="8601206103050338563">TLS WWW -palvelimen todennus</translation> <translation id="8602851771975208551">Toinen tietokoneellasi oleva ohjelma lisäsi sovelluksen, joka voi muuttaa Chromen toimintaa.</translation> +<translation id="8603912787021349466">Anna Android-sovellusten käynnistyä automaattisesti kirjautumisen jälkeen.</translation> <translation id="8605428685123651449">SQLiten käyttämä muisti</translation> <translation id="8605503133013456784">Laitteen <ph name="DEVICE_NAME" /> yhteyden katkaisu ja parin purkaminen epäonnistui.</translation> <translation id="8606726445206553943">Käyttää MIDI-laitteitasi.</translation> @@ -5970,6 +5979,7 @@ <translation id="9053965862400494292">Synkronoinnissa tapahtui virhe.</translation> <translation id="9056034633062863292">Päivitetään Chromeboxia</translation> <translation id="9056810968620647706">Yhtään osumaa ei löytynyt.</translation> +<translation id="9057119625587205566">Ei lähellä olevia tulostimia</translation> <translation id="9059868303873565140">Tilavalikko</translation> <translation id="9064142312330104323">Google-profiilin valokuva (ladataan)</translation> <translation id="9064275926664971810">Ottamalla automaattisen täytön käyttöön voit täyttää lomakkeet yhdellä klikkauksella.</translation> @@ -5980,6 +5990,7 @@ <translation id="9067401056540256169">Tämä valinta tekee Chromesta suojaamattoman. Ota valinta käyttöön vain, jos ymmärrät, miten ominaisuus toimii. Huomaa, että tämä valinta voidaan poistaa ilman etukäteisilmoitusta. Jos valinta on käytössä, https-protokollan kautta toimivat kehykset voivat käyttää WebSockets-yhteyksiä, joilla on suojaamaton URL-osoite (ws://).</translation> <translation id="9068931793451030927">Polku:</translation> <translation id="9070219033670098627">Vaihda henkilö</translation> +<translation id="9070940116164932228">Rajoita paljon tehoa kuluttavia tausta-ajastimia</translation> <translation id="907148966137935206">Älä salli sivustojen näyttää ponnahdusikkunoita (suositus)</translation> <translation id="9072550133391925347"><ph name="PASSWORD_MANAGER_BRAND" /> kirjaa sinut automaattisesti sovelluksiin ja sivustoille, jotka ovat kelvollisia ja joiden salasanat olet tallentanut.</translation> <translation id="9073281213608662541">PAP</translation> @@ -6013,6 +6024,7 @@ <translation id="9112614144067920641">Valitse uusi PIN-koodi.</translation> <translation id="9112748030372401671">Vaihda taustakuva</translation> <translation id="9112987648460918699">Haku...</translation> +<translation id="9114663181201435112">Kirjaudu sisään helposti</translation> <translation id="9115487443206954631">Hallinnoi Cast-laitteita</translation> <translation id="9115675100829699941">&Kirjanmerkit</translation> <translation id="9121814364785106365">Avaa kiinnitetyllä välilehdellä</translation> @@ -6107,7 +6119,6 @@ <translation id="952992212772159698">Ei aktivoitu</translation> <translation id="960719561871045870">Operaattorikoodi</translation> <translation id="960987915827980018">Noin tunti jäljellä</translation> -<translation id="962778376131245616">Näytä vain suojaamattomat animoidut</translation> <translation id="96421021576709873">Wi-Fi-verkko</translation> <translation id="965490406356730238">Ota käyttöön laitekiihdytetty mjpeg-tiedoston purkaminen kuvakaapatuille kehyksille aina kun mahdollista.</translation> <translation id="968174221497644223">Sovellusvälimuisti</translation>
diff --git a/chrome/app/resources/generated_resources_fil.xtb b/chrome/app/resources/generated_resources_fil.xtb index 443ae70..6e6e6f3 100644 --- a/chrome/app/resources/generated_resources_fil.xtb +++ b/chrome/app/resources/generated_resources_fil.xtb
@@ -18,7 +18,6 @@ <translation id="1029317248976101138">I-zoom</translation> <translation id="1029595648591494741">Subukan ang "<ph name="EXTENSION_NAME" />"?</translation> <translation id="1031362278801463162">Preview ng paglo-load</translation> -<translation id="1031460590482534116">Nagkaroon ng error habang sinusubukang iimbak ang certificate ng client. Error na<ph name="ERROR_NUMBER" /> (<ph name="ERROR_NAME" />).</translation> <translation id="1031573127485938293">Magtanong (ayon sa patakaran)</translation> <translation id="103279545524624934">Magbakante ng disk space upang mailunsad ang Android apps.</translation> <translation id="1033780634303702874">I-access ang iyong mga serial device</translation> @@ -101,6 +100,7 @@ <translation id="1128591060186966949">I-edit ang search engine</translation> <translation id="1128987120443782698">Ang storage device ay may kapasidad na <ph name="DEVICE_CAPACITY" />. Mangyaring maglagay ng SD card o USB memory stick na may hindi bababa sa kapasidad na 4GB.</translation> <translation id="1137135726305341424">Nagsimula ang domContentLoaded at ang lahat ng pinagkukunan ng mga load bago ang domContentLoaded (pangunahing frame at parehong orihinal na iframes).</translation> +<translation id="1138663153846032155">Prefer HTML over Flash</translation> <translation id="1140351953533677694">I-access ang iyong mga Bluetooth at Serial device</translation> <translation id="114140604515785785">Direktoryo ng ext. root:</translation> <translation id="1143142264369994168">Tagapaglagda ng Certificate</translation> @@ -252,6 +252,7 @@ <translation id="1351692861129622852">Nag-i-import ng <ph name="FILE_COUNT" /> (na) file...</translation> <translation id="1352103415082130575">Thai keyboard (Pattachote)</translation> <translation id="1353686479385938207"><ph name="PROVIDER_NAME" />: <ph name="NETWORK_NAME" /></translation> +<translation id="1353946958707294039">Storage manager ng Material Design</translation> <translation id="1353966721814789986">Mga page sa startup</translation> <translation id="1354868058853714482">Hindi napapanahon ang Adobe Reader na ito at maaaring hindi ligtas.</translation> <translation id="1355408554203439639">3D software rasterizer</translation> @@ -423,7 +424,6 @@ <translation id="1533920822694388968">Pag-align ng TV</translation> <translation id="15373452373711364">Malaking mouse cursor</translation> <translation id="1543284117603151572">Na-import Mula Sa Edge</translation> -<translation id="1544350195767834591">{NUM_COOKIES,plural, =1{1 mula sa iba pang mga site}one{# mula sa iba pang mga site}other{# mula sa iba pang mga site}}</translation> <translation id="1545177026077493356">Awtomatikong Kiosk Mode</translation> <translation id="1545786162090505744">URL na may mga % sa lugar ng query</translation> <translation id="1546280085599573572">Binago ng extension na ito ang ipinapakitang page kapag na-click mo ang button ng Home.</translation> @@ -447,7 +447,6 @@ <translation id="1559235587769913376">I-input ang mga Unicode na character</translation> <translation id="1561092721008294962">HarfBuzz para sa UI text</translation> <translation id="1566049601598938765">Website</translation> -<translation id="1566958206723629112">Flash at PDF</translation> <translation id="1567723158593978621">Kapag naka-enable, gagamit ang pagsa-sign in sa browser ng bagong flow sa pag-sign in na gaia password-separated.</translation> <translation id="1567993339577891801">Console ng JavaScript</translation> <translation id="1568323446248056064">Buksan ang mga setting ng display device</translation> @@ -576,7 +575,6 @@ <translation id="1723940674997333416">Payagan ang hindi secure na WebSocket mula sa https na pinagmulan</translation> <translation id="1725149567830788547">Ipakita at Mga Kontrol</translation> <translation id="172612876728038702">Sine-set up ang TPM. Mangyaring maging matiyaga; maaaring tumagal ito nang ilang minuto.</translation> -<translation id="1727135806684246609">Material Security Verbose</translation> <translation id="1729533290416704613">Kinokontrol din nito kung anong pahina ang ipinapakita kapag naghanap ka mula sa Omnibox.</translation> <translation id="1731346223650886555">Semicolon</translation> <translation id="1731589410171062430">Kabuuan: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /> (<ph name="NUMBER_OF_PAGES" /> <ph name="PAGE_OR_PAGES_LABEL" />)</translation> @@ -874,6 +872,7 @@ <translation id="218492098606937156">Pinapagana ang mga touch event</translation> <translation id="2187317261103489799">Tukuyin (default)</translation> <translation id="2187895286714876935">Error sa Pag-import ng Certificate ng Server</translation> +<translation id="2188881192257509750">Buksan ang <ph name="APPLICATION" /></translation> <translation id="2190069059097339078">Pangkuha ng mga Kredensyal ng WiFi</translation> <translation id="219008588003277019">Module ng Native Client: <ph name="NEXE_NAME" /></translation> <translation id="2190355936436201913">(walang laman)</translation> @@ -992,6 +991,7 @@ <translation id="2326606747676847821">Maging Incognito</translation> <translation id="2326931316514688470">I-&reload ang app</translation> <translation id="2327492829706409234">Paganahin ang app</translation> +<translation id="2328054044222305089">Ide-delete nito ang anumang data na naimbak ng <ph name="SITE" /> sa iyong device at ire-reset ang anumang mga pahintulot na pinayagan mong tumakbo. Gusto mo bang magpatuloy?</translation> <translation id="2329597144923131178">Mag-sign in upang makuha ang iyong mga bookmark, history, password at ibang mga setting sa lahat ng iyong device.</translation> <translation id="2332131598580221120">Tingnan sa store</translation> <translation id="2332742915001411729">I-reset sa default</translation> @@ -1267,7 +1267,6 @@ <translation id="2675358154061544447">Isa itong lubos na pang-eksperimentong suporta para sa pagre-render ng mga cross-site na iframe sa magkakahiwalay na proseso. Sa mode na ito, magsasabay lang ang mga dokumento sa iisang proseso ng pag-render kung nasa iisang web site ang mga ito.</translation> <translation id="2676946222714718093">Nagpe-play sa</translation> <translation id="2678063897982469759">Muling paganahin</translation> -<translation id="2678246812096664977">Lahat ng plugin</translation> <translation id="2679385451463308372">I-print gamit ang dialog ng system...</translation> <translation id="2680208403056680091">Kinokontrol ang Iyong Koneksyon sa Internet</translation> <translation id="268053382412112343">Ka&saysayan</translation> @@ -1441,7 +1440,6 @@ <translation id="287286579981869940">Magdagdag ng <ph name="PROVIDER_NAME" />...</translation> <translation id="2872961005593481000">Shut down</translation> <translation id="2875698561019555027">(Mga page ng error sa Chrome)</translation> -<translation id="2879560882721503072">Matagumpay na naimbak ang certificate ng client na ibinigay ni <ph name="ISSUER" />.</translation> <translation id="288024221176729610">Czech</translation> <translation id="288042212351694283">Ina-access ang iyong mga Universal 2nd Factor device</translation> <translation id="2881966438216424900">Huling na-access:</translation> @@ -1590,6 +1588,7 @@ <translation id="3057861065630527966">I-back up ang iyong mga larawan at video</translation> <translation id="3058212636943679650">Kung sakaling kailangan mong ibalik ang operating system ng iyong computer kakailanganin mo ng recovery SD card o USB memory stick.</translation> <translation id="305932878998873762">Ang Simpleng Cache para sa HTTP ay isang bagong cache. Umaasa ito sa filesystem para sa paglalaan ng espasyo sa disk.</translation> +<translation id="3060251871394327123">Ide-delete nito ang anumang data na naimbak ng <ph name="SITE" /> sa iyong device. Gusto mo bang magpatuloy?</translation> <translation id="3061650404498811439">I-enable ang access sa emoji, sulat-kamay at menu ng IME ng pag-opt in sa form ng pag-input ng boses.</translation> <translation id="3062606427884046423">Gamitin ang mga notification ng Android MediaStyle para sa mga notification ng media ng Chrome.</translation> <translation id="3063844757726132584">I-access ang lahat ng iyong app mula sa kapaki-pakinabang na launcher na ito. Maglaro, makipag-video chat, makinig sa musika, mag-edit ng mga dokumento o kumuha ng higit pang mga app.</translation> @@ -1639,6 +1638,7 @@ <translation id="3123569374670379335">(Pinangangasiwaan)</translation> <translation id="3124111068741548686">Mga USER handle</translation> <translation id="3126026824346185272">Ctrl</translation> +<translation id="3127156390846601284">Ide-delete nito ang anumang data na naimbak sa iyong device para sa lahat ng site na ipinakita. Gusto mo bang magpatuloy?</translation> <translation id="312759608736432009">Gumawa ng device:</translation> <translation id="3127919023693423797">Pinapapatotohanan...</translation> <translation id="3128230619496333808">Tab 6</translation> @@ -1737,7 +1737,6 @@ <translation id="3264544094376351444">Sans-serif font</translation> <translation id="3264547943200567728">Hindi na-set up ang network ng iyong Chromebox</translation> <translation id="3265459715026181080">Close Window</translation> -<translation id="3267271790328635957">PDF lang</translation> <translation id="3267726687589094446">Patuloy na payagan ang mga awtomatikong pagda-download ng maraming file</translation> <translation id="3267998849713137817">Binagong Oras</translation> <translation id="3268451620468152448">Mga Bukas na Tab</translation> @@ -1983,6 +1982,7 @@ <translation id="3574210789297084292">mag-sign in</translation> <translation id="3574305903863751447"><ph name="CITY" />, <ph name="STATE" /> <ph name="COUNTRY" /></translation> <translation id="357479282490346887">Lithuanian</translation> +<translation id="3575927481544652747">I-disable ang Windows Runtime MIDI API para sa WebMIDI, na naka-enable bilang default sa Windows 10 o mas bago.</translation> <translation id="3576324189521867626">Matagumpay na na-install</translation> <translation id="3578331450833904042">Default (pakinggan ang lahat)</translation> <translation id="3578594933904494462">Ibinabahagi ang nilalaman ng tab na ito.</translation> @@ -2036,8 +2036,6 @@ <translation id="3627320433825461852">Wala nang 1 minuto ang natitira</translation> <translation id="3627588569887975815">Buksan ang link sa inco&gnito window</translation> <translation id="3627671146180677314">Oras ng Pag-renew ng Netscape Certificate</translation> -<translation id="3629326610814700057">Ine-enable ang manager ng storage na pamahalaan ang lokal na storage.</translation> -<translation id="3630337581925712713"><ph name="PERMISSION_TYPE_LABEL" />:</translation> <translation id="3631337165634322335">Nalalapat lang ang mga pagbubukod sa ibaba sa kasalukuyang incognito session.</translation> <translation id="3633586230741134985">Mga Setting ng App Launcher</translation> <translation id="3633997706330212530">Maaari mong opsyonal na i-disable ang mga serbisyong ito.</translation> @@ -2060,7 +2058,8 @@ <translation id="3654045516529121250">Basahin ang iyong mga setting ng pagiging naa-access</translation> <translation id="3654092442379740616">Error sa Pag-sync: Ang <ph name="PRODUCT_NAME" /> ay hindi na napapanahon at kinakailangang ma-update.</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{May permanenteng access ito sa isang file.}one{May permanenteng access ito sa # file.}other{May permanenteng access ito sa # na file.}}</translation> -<translation id="3657468915905674858">I-enable ang Lockdown ng Win32k ng PPAPI.</translation> +<translation id="365793796291733849"><ph name="BEGIN_PARAGRAPH1" />Kapag na-on mo ang awtomatikong pag-back up, pana-panahong ise-save ang data ng device at app sa isang pribadong folder sa Google Drive. Ang data ng app ay maaaring anumang data na na-save ng isang app (batay sa mga setting ng developer), kasama na ang posibleng sensitibong data gaya ng mga contact, mensahe at larawan.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Hindi ibibilang ang backup na data sa quota ng iyong storage ng Drive. Hindi maba-back up ang malalaking file o ang mga file na piniling ibukod ng mga developer mula sa serbisyo.<ph name="END_PARAGRAPH2" /></translation> <translation id="3660234220361471169">Hindi pinagkakatiwalaan</translation> <translation id="3665589677786828986">Natunton ng Chrome na ilan sa iyong mga setting ay nasira ng isa pang program at ni-reset ang mga ito sa kanilang mga orihinal na default.</translation> <translation id="3665842570601375360">Seguridad:</translation> @@ -2116,6 +2115,7 @@ <translation id="3733127536501031542">SSL Server na may Step-up</translation> <translation id="3736520371357197498">Kung nauunawaan mo ang mga peligro sa iyong seguridad, maaari mong <ph name="BEGIN_LINK" />bisitahin ang hindi ligtas na site na ito<ph name="END_LINK" /> bago maalis ang mga mapanganib na program.</translation> <translation id="3738924763801731196"><ph name="OID" />:</translation> +<translation id="3739254215541673094">Buksan ang <ph name="APPLICATION" />?</translation> <translation id="3739798227959604811">Pagkaantala bago ang pag-uulit:</translation> <translation id="3741158646617793859">Lalabas na ngayon ang <ph name="DEVICE_NAME" /> sa Admin Console</translation> <translation id="3741243925913727067">I-back up ang mga larawan at video ng iyong media device sa Google Drive.</translation> @@ -2354,7 +2354,6 @@ <translation id="4058793769387728514">Check Document Now</translation> <translation id="4059285154003114015">I-&print ang Frame...</translation> <translation id="406070391919917862">Background na Apps</translation> -<translation id="4061502419206152498">Ipakita lang ang hindi ligtas at hindi animated</translation> <translation id="4062251648694601778">Masiyahan sa iyong <ph name="SHORT_PRODUCT_NAME" /> device. May mga tanong? Maaari kang makakuha ng tulong anumang oras sa pamamagitan ng pag-click sa "?" sa status tray.</translation> <translation id="4065876735068446555">Maaaring hilingin sa iyo ng network na ginagamit mo (<ph name="NETWORK_ID" />) na bisitahin ang page sa pag-log in nito.</translation> <translation id="4068506536726151626">Naglalaman ang page na ito ng mga elemento mula sa sumusunod na mga site na sumusubaybay sa lokasyon mo:</translation> @@ -2393,7 +2392,6 @@ <translation id="4101878899871018532">Hindi mag-aalok ang password manager na i-save ang kredensyal na ginamit upang mag-sync.</translation> <translation id="410351446219883937">I-autoplay</translation> <translation id="4104163789986725820">I-e&xport...</translation> -<translation id="4105523032910086267">Itinatakda ang animation at visibility ng security verbose sa Material Design.</translation> <translation id="4105563239298244027">Makakuha ng libreng 1 TB sa Google Drive</translation> <translation id="4109135793348361820">Ilipat ang window sa <ph name="USER_NAME" /> (<ph name="USER_EMAIL" />)</translation> <translation id="4110342520124362335">Na-block ang cookies mula sa <ph name="DOMAIN" />.</translation> @@ -2444,6 +2442,7 @@ <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="4188447344915957833">Ine-enable ang storage manager sa Mga Setting ng Material Design.</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> <translation id="4193182321948161343">I-enable ang User Manager ng Material Design</translation> @@ -2651,6 +2650,7 @@ <translation id="4508765956121923607">Tingnan ang P&inagmulan</translation> <translation id="4509017836361568632">Itapon ang larawan</translation> <translation id="4509345063551561634">Lokasyon:</translation> +<translation id="4513946894732546136">Feedback</translation> <translation id="4514542542275172126">Mag-set up ng bagong pinangangasiwaang user</translation> <translation id="4514914692061505365">Pinipilit ang paggamit ng mabilis na Subzero translator ng PNaCl para sa lahat ng pexe file.</translation> <translation id="451515744433878153">Alisin</translation> @@ -2749,6 +2749,7 @@ <translation id="4656293982926141856">Sa computer na ito</translation> <translation id="4656631038341342120">I-enable ang VR shell kung available para sa device na ito.</translation> <translation id="4657031070957997341">Palaging pahintulutan ang mga plugin sa <ph name="HOST" /></translation> +<translation id="466008749075469935">Ine-enable ang intervention upang limitahan sa 1% ang paggamit ng CPU ng mga orasan sa background.</translation> <translation id="4663254525753315077">Kapag posible, inilalagay ang mga naso-scroll na nilalaman ng isang elementong overflow na naso-scroll sa isang hati-hating layer para sa mas mabilis na pag-scroll.</translation> <translation id="4664482161435122549">Error sa Pag-export ng PKCS #12</translation> <translation id="4665014895760275686">Manufacturer</translation> @@ -2817,6 +2818,7 @@ <translation id="4749157430980974800">Georgian na keyboard</translation> <translation id="4750394297954878236">Mga Suhestyon</translation> <translation id="475088594373173692">Unang user</translation> +<translation id="4750892496809949692">Mas piliin ang HTML content sa pamamagitan ng pagtatago ng Flash sa listahan ng mga plugin.</translation> <translation id="4750917950439032686">Pribado ang iyong impormasyon (halimbawa, mga password o credit card number) kapag ipinadala ito sa site na ito.</translation> <translation id="4753602155423695878">Animation ng bar ng pag-usad para sa paglo-load ng page sa isang Android phone</translation> <translation id="4755240240651974342">Finnish na keyboard</translation> @@ -3091,6 +3093,7 @@ <translation id="5119450342834678097">Opsyon na humiling ng site ng tablet sa menu ng mga setting</translation> <translation id="5120068803556741301">Paraan ng pag-input ng third party</translation> <translation id="5120421890733714118">Pagkatiwalaan ang certificate na ito para sa pagtukoy ng mga website.</translation> +<translation id="5120516977819314347">Mali ang PIN o password.</translation> <translation id="5121130586824819730">Puno na ang iyong hard disk. Mangyaring i-save sa isa pang lokasyon o magbakante ng espasyo sa hard disk.</translation> <translation id="5125751979347152379">Di-wastong URL.</translation> <translation id="5127881134400491887">Pamahalaan ang mga koneksyon ng network</translation> @@ -3098,6 +3101,7 @@ <translation id="512903556749061217">naka-attach</translation> <translation id="5129301143853688736">Hindi pribado ang iyong koneksyon sa site na ito. Maaaring subukan ng mga attacker na nakawin ang iyong impormasyon (halimbawa, mga larawan, password, mensahe at credit card) sa <ph name="DOMAIN" />.</translation> <translation id="5129662217315786329">Polish</translation> +<translation id="5131347545782851480">Mga PDF na Dokumento</translation> <translation id="5134856901811723984">Material Design sa system UI ng Chrome OS</translation> <translation id="5135533361271311778">Hindi makalikha ng item ng bookmark.</translation> <translation id="5136529877787728692">F7</translation> @@ -3266,6 +3270,7 @@ <translation id="5328031682234198929">8</translation> <translation id="5329858601952122676">&Tanggalin</translation> <translation id="5330145655348521461">Ang mga file na ito na binuksan sa ibang desktop. Ilipat sa <ph name="USER_NAME" /> (<ph name="MAIL_ADDRESS" />) upang tingnan ito.</translation> +<translation id="5330512191124428349">Kumuha ng impormasyon</translation> <translation id="5332624210073556029">Time zone:</translation> <translation id="5333807720589685258">Permanenteng madi-disable ang SIM card kung hindi mo mailalagay ang tamang PIN Unlock Key.</translation> @@ -3698,7 +3703,6 @@ <translation id="5892507820957994680">Ino-override ang built-in na listahan ng pag-render ng software at pinapagana ang GPU-acceleration sa mga hindi sinusuportahang configuration ng system.</translation> <translation id="5895138241574237353">I-restart</translation> <translation id="5895187275912066135">Ibinigay Noong</translation> -<translation id="5898154795085152510">Nagbalik ang server ng di-wastong certificate ng client. Error <ph name="ERROR_NUMBER" /> (<ph name="ERROR_NAME" />).</translation> <translation id="5900302528761731119">Larawan sa Profile sa Google</translation> <translation id="590253956165195626">Mag-alok na isalin ang mga page na wala sa wikang nababasa mo.</translation> <translation id="5904093760909470684">Configuration ng Proxy</translation> @@ -3753,6 +3757,8 @@ <translation id="5984222099446776634">Kamakailang Binisita</translation> <translation id="5984814259619230127">Pagtukoy ng Bluetooth Low Energy ng Smart Lock</translation> <translation id="5986245990306121338">Kung ie-enable, may lalabas na tagalipat ng tab kahit na naka-on ang opsyong 'i-merge ang mga tab at app' sa mga setting.</translation> +<translation id="5989712527536636369"><ph name="BEGIN_PARAGRAPH1" />Ito ay pangkalahatang impormasyon tungkol sa iyong device at kung paano mo ito ginagamit, gaya ng antas ng baterya, kung gaano kadalas mo ginagamit ang iyong mga app, ang kalidad at tagal ng iyong mga koneksyon sa network (tulad ng Wi-Fi at Bluetooth) at mga ulat ng pag-crash kapag hindi gumana ang mga bagay-bagay ayon sa nararapat. Gagamitin ito upang mapahusay ang mga produkto at serbisyo ng Google para sa lahat. Makakatulong ang ilang pinagsama-samang impormasyon sa mga kasosyo, gaya ng mga Android developer, na gawin ding mas mahusay ang kanilang mga app at produkto.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Maaari mo itong i-on o i-off anumang oras sa Mga Setting ng mga Android app. Hindi ito makakaapekto sa kakayahan ng iyong device na ipadala ang impormasyong kinakailangan nito upang makatanggap ng mahahalagang serbisyo gaya ng mga pag-update at seguridad ng system.<ph name="END_PARAGRAPH2" /></translation> <translation id="5990198433782424697">Mga extension sa mga chrome:// URL</translation> <translation id="5990814808592353318">Manual na pagbuo ng password.</translation> <translation id="5991049340509704927">I-magnify</translation> @@ -3766,6 +3772,7 @@ <translation id="6005695835120147974">Router para sa Media</translation> <translation id="6007237601604674381">Nabigo ang paglipat. <ph name="ERROR_MESSAGE" /></translation> <translation id="6008241731410823808">Nagpapadala ng mga hyperlink auditing ping.</translation> +<translation id="6011449291337289699">I-clear ang data ng site</translation> <translation id="6015796118275082299">Taon</translation> <translation id="6016551720757758985">Kumpirmahin ang Powerwash na maaaring bumalik sa dating bersyon</translation> <translation id="6016809788585079594">Sabihin ang "Ok Google" nang isang beses na lang</translation> @@ -3955,7 +3962,6 @@ <translation id="6276301056778294989">Tiyaking ipinapakita ng device ang parehong code.</translation> <translation id="6277105963844135994">Nag-timeout ang network</translation> <translation id="6277518330158259200">Kumuha ng Screenshot</translation> -<translation id="6278428485366576908">Tema</translation> <translation id="6279183038361895380">Pindutin ang |<ph name="ACCELERATOR" />| upang ipakita ang iyong cursor</translation> <translation id="6280215091796946657">Mag-sign in gamit ang ibang account</translation> <translation id="6280912520669706465">ARC</translation> @@ -4207,6 +4213,7 @@ <translation id="6607272825297743757">Impormasyon ng file</translation> <translation id="6607831829715835317">Higit pang mga too&l</translation> <translation id="6608140561353073361">Lahat ng data ng cookies at site...</translation> +<translation id="6610183966322615106">Nagkaroon ng error sa pagdaragdag ng printer</translation> <translation id="6610610633807698299">Ilagay ang URL...</translation> <translation id="6612358246767739896">Pinoprotektahang content</translation> <translation id="6615455863669487791">Ipakita sa akin</translation> @@ -4270,7 +4277,6 @@ <translation id="6708242697268981054">Pinanggalingan:</translation> <translation id="6709357832553498500">Kumonekta sa pamamagitan ng <ph name="EXTENSIONNAME" /></translation> <translation id="6710213216561001401">Nakaraan</translation> -<translation id="6712158998835983046">Ipakita ang lahat ng animated</translation> <translation id="6718273304615422081">Nagzi-zip...</translation> <translation id="671928215901716392">I-lock ang screen</translation> <translation id="6721972322305477112">&File</translation> @@ -4544,7 +4550,6 @@ <translation id="7088434364990739311">Nabigong magsimula ang pagsusuri ng update (code ng error na <ph name="ERROR" />).</translation> <translation id="708856090370082727">I-enable ang suporta ng OSK overscroll. Kung naka-on ang flag na ito, ire-resize lang ng OSK ang visual na viewport.</translation> <translation id="7088674813905715446">Ang device na ito ay inilagay sa isang deprovisioned state ng administrator. Upang i-enable ito para sa pagpapatala, hayaang ilagay ng iyong administrator ang device sa nakabinbing estado.</translation> -<translation id="7089609847854449639">Manager ng storage</translation> <translation id="708969677220991657">Pinapayagan ang mga kahilingan na mag-localhost sa pamamagitan ng HTTPS kahit na di-wasto ang certificate na ibinigay.</translation> <translation id="7092106376816104">Mga pagbubukod ng pop-up</translation> <translation id="7093866338626856921">Makipagpalit ng data sa mga device na pinangalanang: <ph name="HOSTNAMES" /></translation> @@ -4584,7 +4589,7 @@ <translation id="715118844758971915">Mga classic na printer</translation> <translation id="7154130902455071009">Gawing ito ang iyong panimulang pahina: <ph name="START_PAGE" /></translation> <translation id="7155171745945906037">Kasalukuyang larawan mula sa camera o file</translation> -<translation id="715568033737470079">Tukuyin ang mga plugin na PPAPI na papatakbuhin sa patakaran sa sandbox ng lockdown ng Win32k (Windows 10 at mas bago lang).</translation> +<translation id="7155226869555939647">Palaging buksan ang mga link para sa <ph name="APPLICATION" /></translation> <translation id="7156235233373189579">Idinisenyo ang file na ito para sa PC na gumagamit ng Windows software. Hindi ito tugma sa iyong device na nagpapatakbo ng Chrome OS. Mangyaring maghanap sa <ph name="BEGIN_LINK" />Chrome Web Store<ph name="END_LINK" />para sa naaangkop na pamalit na app.<ph name="BEGIN_LINK_HELP" />Matuto nang Higit Pa<ph name="END_LINK_HELP" /></translation> <translation id="7157063064925785854">Sa pamamagitan ng pag-click sa Magpatuloy, sumasaang-ayon ka sa <ph name="LEGAL_DOC_LINK_TEXT_1" />, <ph name="LEGAL_DOC_LINK_TEXT_2" />, <ph name="LEGAL_DOC_LINK_TEXT_3" />, at <ph name="LEGAL_DOC_LINK_TEXT_4" />.</translation> <translation id="7158238151765743968">Kumokonekta pa rin sa "<ph name="DEVICE_NAME" />."</translation> @@ -4599,6 +4604,7 @@ <translation id="7175353351958621980">Nag-load mula sa:</translation> <translation id="7180611975245234373">I-refresh</translation> <translation id="7180865173735832675">I-customize</translation> +<translation id="7181387261278441780">I-clear at i-reset ang site</translation> <translation id="7185078796915954712">TLS 1.3</translation> <translation id="7185690883425432021">Itinatago ang mga button para sa pagsasara ng mga hindi aktibong window kapag nasa stacked mode ang tabstrip.</translation> <translation id="7186088072322679094">Panatilihin sa Toolbar</translation> @@ -4631,7 +4637,6 @@ <translation id="7223775956298141902">Boo... Wala kang mga extension :-(</translation> <translation id="7224023051066864079">Subnet mask:</translation> <translation id="7225179976675429563">Nawawala ang uri ng network</translation> -<translation id="7230191962699768124">Ipakita ang lahat ng hindi animated</translation> <translation id="7230787553283372882">I-customize ang laki ng iyong text</translation> <translation id="7231224339346098802">Gumamit ng numero upang tukuyin kung ilang kopya ang ipi-print (1 o higit pa).</translation> <translation id="7238585580608191973">SHA-256 Fingerprint</translation> @@ -4763,7 +4768,6 @@ <translation id="7409233648990234464">Ilunsad muli at I-powerwash</translation> <translation id="7409836189476010449">Patakbuhin ang Flash</translation> <translation id="7410344089573941623">Itanong kung gusto ng <ph name="HOST" /> na i-access ang iyong camera at mikropono</translation> -<translation id="7411343637221933631">{NUM_COOKIES,plural, =1{1 mula sa site na ito}one{# mula sa site na ito}other{# mula sa site na ito}}</translation> <translation id="7412226954991670867">GPU Memory</translation> <translation id="7416362041876611053">Hindi alam na error sa network.</translation> <translation id="7417453074306512035">Ethiopic keyboard</translation> @@ -4885,6 +4889,7 @@ <translation id="756445078718366910">Magbukas ng Window ng Browser</translation> <translation id="7564847347806291057">Tapusin ang proseso</translation> <translation id="7566723889363720618">F12</translation> +<translation id="7567314848159753396">Cookie: <ph name="NAME" /></translation> <translation id="756809126120519699">Na-clear ang data ng Chrome</translation> <translation id="7568790562536448087">Ina-update</translation> <translation id="7573172247376861652">Charge ng Baterya</translation> @@ -4925,6 +4930,7 @@ <translation id="7626009897377900107">Pagbuo ng password</translation> <translation id="7627262197844840899">Ang site na ito ay hindi tumatanggap ng MasterCard.</translation> <translation id="7627790789328695202">Whoops, umiiral na ang <ph name="FILE_NAME" />. Palitan ang pangalan nito at subukang muli.</translation> +<translation id="7628127343934101653">Buksan ang mga PDF na file sa default na PDF viewer application.</translation> <translation id="762917759028004464">Ang default na browser ay kasalukuyang <ph name="BROWSER_NAME" />.</translation> <translation id="7629536005696009600">Payagang mailagay sa mga akmang website ang mga kredensyal na naiimbak para sa mga Android application.</translation> <translation id="7629827748548208700">Tab: <ph name="TAB_NAME" /></translation> @@ -5153,6 +5159,7 @@ <translation id="7957513156576779045">I-on ang Bluetooth upang payagan ang pagpapares</translation> <translation id="7957615753207896812">Buksan ang mga setting ng keyboard device</translation> <translation id="7959074893852789871">Naglaman ang file ng maramihang certificate, ilan sa mga ito ang na-import:</translation> +<translation id="7959700692661109221"><ph name="BEGIN_PARAGRAPH" />Gumagamit ang serbisyo ng lokasyon ng Google ng mga pinagmulang tulad ng Wi-Fi upang makatulong na mas mabilis at mas tumpak na matantya ang lokasyon ng iyong device. Kapag na-on mo ang mga serbisyo ng lokasyon ng Google, mapupunta ang iyong device sa mode na gumagamit ng Wi-Fi upang maibigay ang impormasyon ng lokasyon. Maaari mo itong i-off sa mga setting ng lokasyon anumang oras.<ph name="END_PARAGRAPH" /></translation> <translation id="7961015016161918242">Hindi Kailanman</translation> <translation id="7964089325405904043">Mag-import at mag-export ng password</translation> <translation id="7965010376480416255">Pamamahagi ng Memorya</translation> @@ -5303,6 +5310,7 @@ <translation id="8146793085009540321">Hindi nakapag-sign in. Mangyaring makipag-ugnayan sa iyong administrator o subukang muli.</translation> <translation id="8148264977957212129">Paraan ng pag-input na Pinyin</translation> <translation id="8148913456785123871">Magpakita ng mga Google Now card sa launcher</translation> +<translation id="8150391391298684512">I-disable ang Windows Runtime MIDI API</translation> <translation id="8151185429379586178">Mga tool ng developer</translation> <translation id="8151638057146502721">I-configure</translation> <translation id="8151639108075998630">Paganahin ang pagba-browse ng bisita</translation> @@ -5587,6 +5595,7 @@ <translation id="8532294913309524834">Pagsunud-sunurin ang mga wika batay sa iyong kagustuhan.</translation> <translation id="8535005006684281994">URL ng Pag-renew ng Netscape Certificate</translation> <translation id="8539727552378197395">Hindi (HttpOnly)</translation> +<translation id="8541084862688000575">Awtomatikong i-load ang mga Android app</translation> <translation id="8543181531796978784">Maaari kang <ph name="BEGIN_ERROR_LINK" />mag-ulat ng problema sa pagtukoy<ph name="END_ERROR_LINK" /> o, kung nauunawaan mo ang mga panganib sa iyong seguridad, <ph name="BEGIN_LINK" />bisitahin ang hindi ligtas na site na ito<ph name="END_LINK" />.</translation> <translation id="8545107379349809705">Itago ang impormasyon...</translation> <translation id="8545211332741562162">Paganahin ang mga web page upang gumamit ng mga tampok ng pang-eksperimentong JavaScript.</translation> @@ -5614,7 +5623,6 @@ <translation id="8569764466147087991">Piliin ang isang file para buksan</translation> <translation id="8571032220281885258">Kapag sinabi mo ang "Ok Google," hahanapin ng Chrome ang susunod mong sasabihin.</translation> <translation id="8571108619753148184">Server 4</translation> -<translation id="8572832761467613633">Flash lang</translation> <translation id="8572981282494768930">Huwag payagan ang mga site na i-access ang iyong camera at mikropono</translation> <translation id="8574234089711453001">Pahintulutang lumabas ang button na i-download kapag nagbubukas ng page gamit ang media url.</translation> <translation id="857779305329188634">I-enable ang eksperimental na suporta sa QUIC protocol.</translation> @@ -5636,6 +5644,7 @@ <translation id="8600929685092827187">Buksan sa Mga Packet</translation> <translation id="8601206103050338563">Pagpapatotoo ng Client sa TLS WWW</translation> <translation id="8602851771975208551">Ang isa pang program sa iyong computer ay nagdagdag ng app na maaaring magpabago sa paraan ng paggana ng Chrome.</translation> +<translation id="8603912787021349466">Payagan ang mga Android app na awtomatikong magsimula pagkatapos mag-sign in.</translation> <translation id="8605428685123651449">Memory ng SQLite</translation> <translation id="8605503133013456784">Nabigong magdiskonekta at mag-unpair mula sa "<ph name="DEVICE_NAME" />".</translation> <translation id="8606726445206553943">Gamitin ang iyong mga MIDI device</translation> @@ -5989,6 +5998,7 @@ <translation id="9053965862400494292">May naganap na error habang sinusubukang i-set up ang sync.</translation> <translation id="9056034633062863292">Ina-update ang Chromebox</translation> <translation id="9056810968620647706">Walang nakitang tugma.</translation> +<translation id="9057119625587205566">Walang printer sa malapit</translation> <translation id="9059868303873565140">Menu ng status</translation> <translation id="9064142312330104323">Larawan sa Profile sa Google (naglo-load)</translation> <translation id="9064275926664971810">I-enable ang Autofill upang punan ang mga form sa isahang pag-click</translation> @@ -5999,6 +6009,7 @@ <translation id="9067401056540256169">Ginagawa ng flag na ito na hindi ligtas ang Chrome. Gamitin lang ito kung nauunawaan mo kung ano ang ginagawa nito. Tandaan na maaaring alisin ang flag na ito nang walang anumang paunawa. Kung naka-enable, magagamit ng mga frame na mayroong https na pinagmulan ang mga WebSocket na mayroong hindi secure na URL (ws://).</translation> <translation id="9068931793451030927">Landas:</translation> <translation id="9070219033670098627">Magpalit ng tao</translation> +<translation id="9070940116164932228">Limitahan ang mga mamahaling orasan sa background</translation> <translation id="907148966137935206">Huwag hayaan ang anumang site na magpakita ng mga pop-up (inirerekomenda)</translation> <translation id="9072550133391925347">Awtomatiko kang sina-sign in ng <ph name="PASSWORD_MANAGER_BRAND" /> sa mga karapat-dapat na site at app gamit ang mga password na na-save mo.</translation> <translation id="9073281213608662541">PAP</translation> @@ -6033,6 +6044,7 @@ <translation id="9112614144067920641">Mangyaring pumili ng bagong PIN.</translation> <translation id="9112748030372401671">Palitan ang iyong wallpaper</translation> <translation id="9112987648460918699">Find...</translation> +<translation id="9114663181201435112">Mag-sign in nang walang kahirap-hirap</translation> <translation id="9115487443206954631">Pamahalaan ang mga Cast device</translation> <translation id="9115675100829699941">&Mga Bookmark</translation> <translation id="9121814364785106365">Binuksan bilang na-pin na tab</translation> @@ -6128,7 +6140,6 @@ <translation id="952992212772159698">Hindi na-activate</translation> <translation id="960719561871045870">Operator code</translation> <translation id="960987915827980018">Mga 1 oras ang natitira</translation> -<translation id="962778376131245616">Ipakita lang ang hindi ligtas at animated</translation> <translation id="96421021576709873">Wi-Fi network</translation> <translation id="965490406356730238">I-enable ang mjpeg decode na pinabilis ng hardware para sa na-capture na frame kapag available.</translation> <translation id="968174221497644223">Cache ng application</translation>
diff --git a/chrome/app/resources/generated_resources_fr.xtb b/chrome/app/resources/generated_resources_fr.xtb index 229ecd4..286c8284 100644 --- a/chrome/app/resources/generated_resources_fr.xtb +++ b/chrome/app/resources/generated_resources_fr.xtb
@@ -18,7 +18,6 @@ <translation id="1029317248976101138">Zoom</translation> <translation id="1029595648591494741">Essayer "<ph name="EXTENSION_NAME" />" ?</translation> <translation id="1031362278801463162">Chargement de l'aperçu...</translation> -<translation id="1031460590482534116">Une erreur s'est produite lors de la tentative d'enregistrement du certificat client. Erreur <ph name="ERROR_NUMBER" /> (<ph name="ERROR_NAME" />)</translation> <translation id="1031573127485938293">Demander (via des règles)</translation> <translation id="103279545524624934">Libérez de l'espace disque pour lancer des applications Android.</translation> <translation id="1033780634303702874">Accéder à vos appareils reliés via le port série</translation> @@ -101,6 +100,7 @@ <translation id="1128591060186966949">Modifier le moteur de recherche</translation> <translation id="1128987120443782698">La capacité de ce périphérique de stockage est de <ph name="DEVICE_CAPACITY" />. Veuillez insérer une carte SD ou une clé USB d'au moins 4 Go.</translation> <translation id="1137135726305341424">domContentLoaded et tous les chargements de ressources qui ont commencé avant domContentLoaded (frame principal et iFrame d'origine identiques).</translation> +<translation id="1138663153846032155">Préférer HTML à Flash</translation> <translation id="1140351953533677694">Accéder à vos appareils reliés via le Bluetooth et le port série</translation> <translation id="114140604515785785">Répertoire racine de l'extension :</translation> <translation id="1143142264369994168">Signataire du certificat </translation> @@ -252,6 +252,7 @@ <translation id="1351692861129622852">Importation de <ph name="FILE_COUNT" /> fichiers en cours…</translation> <translation id="1352103415082130575">Clavier thaï (pattachote)</translation> <translation id="1353686479385938207">"<ph name="PROVIDER_NAME" />" : "<ph name="NETWORK_NAME" />"</translation> +<translation id="1353946958707294039">Gestionnaire d'espace de stockage Material Design</translation> <translation id="1353966721814789986">Pages d'accueil</translation> <translation id="1354868058853714482">Adobe Reader n'est pas à jour et risque de ne plus être sécurisé.</translation> <translation id="1355408554203439639">Rastériseur logiciel 3D</translation> @@ -423,7 +424,6 @@ <translation id="1533920822694388968">Alignement de la TV</translation> <translation id="15373452373711364">Grand curseur</translation> <translation id="1543284117603151572">Importés depuis Edge</translation> -<translation id="1544350195767834591">{NUM_COOKIES,plural, =1{1 provenant d'autres sites}one{# provenant d'autres sites}other{# provenant d'autres sites}}</translation> <translation id="1545177026077493356">Mode Kiosque automatique</translation> <translation id="1545786162090505744">URL avec %s à la place de la requête</translation> <translation id="1546280085599573572">Cette extension a modifié la page affichée lorsque vous cliquez sur le bouton Accueil.</translation> @@ -447,7 +447,6 @@ <translation id="1559235587769913376">Saisir des caractères Unicode</translation> <translation id="1561092721008294962">HarfBuzz pour le texte de l'interface utilisateur</translation> <translation id="1566049601598938765">Site Web</translation> -<translation id="1566958206723629112">Flash et PDF</translation> <translation id="1567723158593978621">Lorsque l'option sera activée, la connexion au navigateur sera effectuée à l'aide d'une nouvelle procédure de connexion séparée par mot de passe GAIA.</translation> <translation id="1567993339577891801">Console JavaScript</translation> <translation id="1568323446248056064">Ouvrir les paramètres de l'écran</translation> @@ -576,7 +575,6 @@ <translation id="1723940674997333416">Autoriser les connexions https WebSocket non sécurisées</translation> <translation id="1725149567830788547">Afficher les &commandes</translation> <translation id="172612876728038702">Configuration du module de plate-forme sécurisée (TPM) en cours. Veuillez patienter, cela peut prendre quelques minutes.</translation> -<translation id="1727135806684246609">Informations détaillées de sécurité relatives à Material Design</translation> <translation id="1729533290416704613">Elle contrôle également la page qui s'affiche lorsque vous effectuez une recherche dans l'omnibox.</translation> <translation id="1731346223650886555">Point-virgule</translation> <translation id="1731589410171062430">Total : <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /> (<ph name="NUMBER_OF_PAGES" /> <ph name="PAGE_OR_PAGES_LABEL" />)</translation> @@ -872,6 +870,7 @@ <translation id="218492098606937156">Activer les événements tactiles</translation> <translation id="2187317261103489799">Détecter (par défaut)</translation> <translation id="2187895286714876935">Erreur d'importation du certificat serveur</translation> +<translation id="2188881192257509750">Ouvrir <ph name="APPLICATION" /></translation> <translation id="2190069059097339078">Obtention des identifiants Wi-Fi</translation> <translation id="219008588003277019">Module Native Client : <ph name="NEXE_NAME" /></translation> <translation id="2190355936436201913">(vide)</translation> @@ -990,6 +989,7 @@ <translation id="2326606747676847821">Navigation privée</translation> <translation id="2326931316514688470">&Actualiser l'application</translation> <translation id="2327492829706409234">Activer l'application</translation> +<translation id="2328054044222305089">Toutes les données enregistrées par <ph name="SITE" /> sur votre appareil seront supprimées, et toutes les autorisations que vous avez accordées seront réinitialisées. Voulez-vous continuer ?</translation> <translation id="2329597144923131178">Connectez-vous pour synchroniser favoris, historique, mots de passe et autres sur vos appareils. </translation> <translation id="2332131598580221120">Afficher dans la boutique</translation> <translation id="2332742915001411729">Rétablir le niveau de zoom par défaut</translation> @@ -1265,7 +1265,6 @@ <translation id="2675358154061544447">Fonctionnalité hautement expérimentale de rendu des cadres iFrame inter-sites dans des processus distincts. Si ce mode est activé, seuls les documents venant d'un même site Web partageront le même processus du moteur de rendu.</translation> <translation id="2676946222714718093">Lecture en cours sur</translation> <translation id="2678063897982469759">Réactiver</translation> -<translation id="2678246812096664977">Tous les plug-ins</translation> <translation id="2679385451463308372">Imprimer depuis la boîte de dialogue système…</translation> <translation id="2680208403056680091">Une extension a pris le contrôle de votre connexion Internet</translation> <translation id="268053382412112343">&Historique</translation> @@ -1439,7 +1438,6 @@ <translation id="287286579981869940">Ajouter <ph name="PROVIDER_NAME" />…</translation> <translation id="2872961005593481000">Éteindre</translation> <translation id="2875698561019555027">(pages d'erreur Chrome)</translation> -<translation id="2879560882721503072">Le stockage du certificat client généré par <ph name="ISSUER" /> a réussi.</translation> <translation id="288024221176729610">Tchèque</translation> <translation id="288042212351694283">Accès aux appareils U2F</translation> <translation id="2881966438216424900">Dernier accès :</translation> @@ -1588,6 +1586,7 @@ <translation id="3057861065630527966">Sauvegarder vos photos et vos vidéos</translation> <translation id="3058212636943679650">Si la restauration du système d'exploitation de votre ordinateur s'avère nécessaire, une carte SD ou une clé USB de récupération vous sera demandée.</translation> <translation id="305932878998873762">Le cache simple pour HTTP est un nouveau cache. Il dépend du système de fichiers pour l'allocation d'espace disque.</translation> +<translation id="3060251871394327123">Toutes les données enregistrées par <ph name="SITE" /> sur votre appareil seront supprimées. Voulez-vous continuer ?</translation> <translation id="3061650404498811439">Activer l'accès aux emoji, à l'écriture manuscrite et à la saisie vocale depuis le menu d'acceptation IME</translation> <translation id="3062606427884046423">Utilise les notifications MediaStyle Android pour les notifications de média Chrome.</translation> <translation id="3063844757726132584">Accédez à toutes vos applications depuis ce lanceur bien pratique. Jouez, participez à des chats vidéo, écoutez de la musique, modifiez des documents ou téléchargez d'autres applications.</translation> @@ -1637,6 +1636,7 @@ <translation id="3123569374670379335">(supervisé)</translation> <translation id="3124111068741548686">Handles UTILISATEUR</translation> <translation id="3126026824346185272">Ctrl</translation> +<translation id="3127156390846601284">Toutes les données enregistrées sur votre appareil seront supprimées pour tous les sites affichés. Voulez-vous continuer ?</translation> <translation id="312759608736432009">Fabricant du périphérique :</translation> <translation id="3127919023693423797">Authentification en cours...</translation> <translation id="3128230619496333808">Tab 6</translation> @@ -1735,7 +1735,6 @@ <translation id="3264544094376351444">Police Sans-Serif</translation> <translation id="3264547943200567728">Échec de la configuration de votre réseau Chromebox</translation> <translation id="3265459715026181080">Fermer la fenêtre</translation> -<translation id="3267271790328635957">PDF uniquement</translation> <translation id="3267726687589094446">Continuer à autoriser le téléchargement automatique de plusieurs fichiers</translation> <translation id="3267998849713137817">Heure de modification</translation> <translation id="3268451620468152448">Onglets ouverts</translation> @@ -1931,7 +1930,7 @@ <translation id="3508920295779105875">Choisir un autre dossier...</translation> <translation id="3509527969829946096">Cette option active la compatibilité avec Cast Streaming pour l'encodage de flux vidéo à l'aide du matériel de la plate-forme.</translation> <translation id="3510797500218907545">WiMAX</translation> -<translation id="3511200754045804813">Nouvelle analyse</translation> +<translation id="3511200754045804813">Nouvelle recherche</translation> <translation id="3511307672085573050">Copier l'adr&esse du lien</translation> <translation id="3511399794969432965">Problèmes de connexion ?</translation> <translation id="351152300840026870">Police à largeur fixe</translation> @@ -1981,6 +1980,7 @@ <translation id="3574210789297084292">connexion</translation> <translation id="3574305903863751447"><ph name="CITY" />, <ph name="STATE" /> <ph name="COUNTRY" /></translation> <translation id="357479282490346887">Lituanien</translation> +<translation id="3575927481544652747">Désactivez l'API Windows Runtime MIDI pour WebMIDI, qui est activée par défaut sous Windows 10 (ou version ultérieure).</translation> <translation id="3576324189521867626">L'application a bien été installée.</translation> <translation id="3578331450833904042">Par défaut (tout détecter)</translation> <translation id="3578594933904494462">Le contenu de cet onglet est en cours de partage</translation> @@ -2034,8 +2034,6 @@ <translation id="3627320433825461852">Moins d'1 minute restante</translation> <translation id="3627588569887975815">Ouvrir le lien dans une fenêtre en navi&gation privée</translation> <translation id="3627671146180677314">Date de renouvellement du certificat Netscape</translation> -<translation id="3629326610814700057">Autorise le gestionnaire d'espace de stockage à gérer l'espace de stockage local.</translation> -<translation id="3630337581925712713"><ph name="PERMISSION_TYPE_LABEL" /> :</translation> <translation id="3631337165634322335">Les exceptions ci-dessous s'appliquent uniquement à la session de navigation privée actuelle.</translation> <translation id="3633586230741134985">Paramètres du lanceur d'applications</translation> <translation id="3633997706330212530">Vous avez la possibilité de désactiver ces services.</translation> @@ -2058,7 +2056,8 @@ <translation id="3654045516529121250">Lire vos paramètres d'accessibilité</translation> <translation id="3654092442379740616">Erreur de synchronisation. <ph name="PRODUCT_NAME" /> est obsolète et doit être mis à jour.</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{L'application possède un accès permanent à un fichier.}one{L'application possède un accès permanent à # fichier.}other{L'application possède un accès permanent à # fichiers.}}</translation> -<translation id="3657468915905674858">Activer le blocage PPAPI Win32k Lockdown</translation> +<translation id="365793796291733849"><ph name="BEGIN_PARAGRAPH1" />Lorsque vous activez la sauvegarde automatique, les données de l'appareil et des applications sont enregistrées régulièrement dans un dossier privé sur Google Drive. Les données d'applications correspondent à toutes les données enregistrées par une application (en fonction des paramètres que le développeur définit), y compris les données potentiellement confidentielles telles que les contacts, les messages et les photos.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Les données sauvegardées ne sont pas prises en compte dans le quota de stockage de Drive. Les fichiers volumineux ou ceux que les développeurs ont choisi d'exclure du service ne sont pas sauvegardés.<ph name="END_PARAGRAPH2" /></translation> <translation id="3660234220361471169">Non approuvé</translation> <translation id="3665589677786828986">Chrome a détecté que certains de vos paramètres ont été corrompus par un autre programme. Leurs valeurs par défaut ont été rétablies.</translation> <translation id="3665842570601375360">Sécurité :</translation> @@ -2113,6 +2112,7 @@ <translation id="3733127536501031542">Serveur SSL avec fonction d'optimisation</translation> <translation id="3736520371357197498">Si vous avez compris les risques auxquels vous vous exposez, vous pouvez <ph name="BEGIN_LINK" />consulter ce site dangereux<ph name="END_LINK" /> avant que les programmes malveillants n'aient été supprimés.</translation> <translation id="3738924763801731196"><ph name="OID" /> :</translation> +<translation id="3739254215541673094">Ouvrir <ph name="APPLICATION" /> ?</translation> <translation id="3739798227959604811">Durée avant répétition :</translation> <translation id="3741158646617793859"><ph name="DEVICE_NAME" /> va s'afficher dans la console d'administration.</translation> <translation id="3741243925913727067">Sauvegardez les photos et les vidéos de votre périphérique multimédia sur Google Drive.</translation> @@ -2351,7 +2351,6 @@ <translation id="4058793769387728514">Vérifier le document maintenant</translation> <translation id="4059285154003114015">&Imprimer le cadre…</translation> <translation id="406070391919917862">Applications en arrière-plan</translation> -<translation id="4061502419206152498">N'afficher que les éléments non sécurisés, sans animation</translation> <translation id="4062251648694601778">Profitez bien de votre appareil <ph name="SHORT_PRODUCT_NAME" />. Des questions ? Vous pouvez obtenir de l'aide à tout moment en cliquant sur le "?" dans la barre d'état.</translation> <translation id="4065876735068446555">Pour utiliser ce réseau (<ph name="NETWORK_ID" />), il est possible que vous deviez vous rendre sur la page de connexion correspondante.</translation> <translation id="4068506536726151626">Cette page contient des éléments des sites ci-dessous qui suivent votre position géographique :</translation> @@ -2390,7 +2389,6 @@ <translation id="4101878899871018532">Le gestionnaire de mots de passe ne proposera pas d'enregistrer les identifiants utilisés pour la synchronisation.</translation> <translation id="410351446219883937">Lecture automatique</translation> <translation id="4104163789986725820">E&xporter...</translation> -<translation id="4105523032910086267">Définit l'animation et la visibilité des informations détaillées de sécurité dans Material Design.</translation> <translation id="4105563239298244027">Profitez d'un téraoctet d'espace de stockage gratuit grâce à Google Drive</translation> <translation id="4109135793348361820">Déplacer la fenêtre vers <ph name="USER_NAME" /> (<ph name="USER_EMAIL" />)</translation> <translation id="4110342520124362335">Les cookies de <ph name="DOMAIN" /> ont été bloqués.</translation> @@ -2441,6 +2439,7 @@ <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="4188447344915957833">Active le gestionnaire d'espace de stockage dans les paramètres Material Design.</translation> <translation id="4189406272289638749">L'extension <b><ph name="EXTENSION_NAME" /></b> contrôle ce paramètre.</translation> <translation id="4193154014135846272">Document Google</translation> <translation id="4193182321948161343">Activer le gestionnaire d'utilisateurs Material Design</translation> @@ -2648,6 +2647,7 @@ <translation id="4508765956121923607">Afficher la s&ource</translation> <translation id="4509017836361568632">Supprimer la photo</translation> <translation id="4509345063551561634">Emplacement :</translation> +<translation id="4513946894732546136">Commentaires</translation> <translation id="4514542542275172126">Configurer un nouvel utilisateur supervisé</translation> <translation id="4514914692061505365">Forcer l'utilisation du traducteur rapide Subzero de PNaCl pour tous les fichiers .pexe.</translation> <translation id="451515744433878153">Supprimer</translation> @@ -2746,6 +2746,7 @@ <translation id="4656293982926141856">Cet ordinateur</translation> <translation id="4656631038341342120">Vous pouvez activer le shell de réalité virtuelle sur cet appareil.</translation> <translation id="4657031070957997341">Toujours autoriser les plug-ins sur <ph name="HOST" /></translation> +<translation id="466008749075469935">Permet d'intervenir pour limiter à 1 % l'utilisation du processeur par les minuteurs en arrière-plan.</translation> <translation id="4663254525753315077">Lorsque cela est possible, le contenu défilant d'un élément de défilement dont le contenu dépasse la taille du conteneur est placé sur une couche composée pour un défilement plus rapide.</translation> <translation id="4664482161435122549">Erreur d'exportation de fichier PKCS #12</translation> <translation id="4665014895760275686">Fabricant</translation> @@ -2813,6 +2814,7 @@ <translation id="4749157430980974800">Clavier géorgien</translation> <translation id="4750394297954878236">Suggestions</translation> <translation id="475088594373173692">Premier utilisateur</translation> +<translation id="4750892496809949692">Privilégiez le contenu HTML en masquant Flash dans la liste des plug-ins.</translation> <translation id="4750917950439032686">Vos informations, par exemple vos mots de passe ou vos numéros de carte de paiement, sont privées lorsqu'elles sont transmises à ce site.</translation> <translation id="4753602155423695878">Animation de la barre de progression correspondant au chargement de page sur un téléphone Android</translation> <translation id="4755240240651974342">Clavier finnois</translation> @@ -3087,6 +3089,7 @@ <translation id="5119450342834678097">Option de requête du site pour tablette dans le menu des paramètres</translation> <translation id="5120068803556741301">Mode de saisie tiers</translation> <translation id="5120421890733714118">Considérer ce certificat comme fiable pour identifier les sites Web</translation> +<translation id="5120516977819314347">Code ou mot de passe erronés.</translation> <translation id="5121130586824819730">Votre disque dur est saturé. Veuillez enregistrer à un autre emplacement ou libérer de l'espace sur le disque dur.</translation> <translation id="5125751979347152379">URL incorrecte</translation> <translation id="5127881134400491887">Gérer les connexions réseau</translation> @@ -3094,6 +3097,7 @@ <translation id="512903556749061217">connecté</translation> <translation id="5129301143853688736">Votre connexion à ce site n'est pas en mode privé. Il se peut que des individus malveillants tentent de voler vos informations (photos, mots de passe, messages, numéros de carte de paiement, etc.) à partir de "<ph name="DOMAIN" />".</translation> <translation id="5129662217315786329">Polonais</translation> +<translation id="5131347545782851480">Documents PDF</translation> <translation id="5134856901811723984">Material Design dans l'interface utilisateur du système Chrome OS</translation> <translation id="5135533361271311778">Impossible de créer le favori.</translation> <translation id="5136529877787728692">F7</translation> @@ -3262,6 +3266,7 @@ <translation id="5328031682234198929">8</translation> <translation id="5329858601952122676">&Supprimer</translation> <translation id="5330145655348521461">Ces fichiers sont ouverts sur un autre bureau. Utilisez le compte de <ph name="USER_NAME" /> (<ph name="MAIL_ADDRESS" />) pour les afficher.</translation> +<translation id="5330512191124428349">Lire les informations</translation> <translation id="5332624210073556029">Fuseau horaire :</translation> <translation id="5333807720589685258">Votre carte SIM sera définitivement désactivée si vous ne saisissez pas la clé de déblocage du code.</translation> @@ -3695,7 +3700,6 @@ <translation id="5892507820957994680">Remplace la liste intégrée de rendu logiciel et active l'accélération graphique pour les configurations système non compatibles.</translation> <translation id="5895138241574237353">Redémarrer</translation> <translation id="5895187275912066135">Émis le</translation> -<translation id="5898154795085152510">Le serveur a renvoyé un certificat client incorrect. Erreur <ph name="ERROR_NUMBER" /> (<ph name="ERROR_NAME" />)</translation> <translation id="5900302528761731119">Photo du profil Google</translation> <translation id="590253956165195626">Me proposer de traduire les pages qui sont écrites dans une langue que je ne connais pas</translation> <translation id="5904093760909470684">Configuration du proxy</translation> @@ -3750,6 +3754,8 @@ <translation id="5984222099446776634">Consultations récentes</translation> <translation id="5984814259619230127">Détection Smart Lock via Bluetooth Low Energy</translation> <translation id="5986245990306121338">Si cette option est activée, un sélecteur d'onglets s'affiche même lorsque l'option "Fusionner les onglets et les applications" est activée dans les paramètres.</translation> +<translation id="5989712527536636369"><ph name="BEGIN_PARAGRAPH1" />Ces informations d'ordre général portent sur votre appareil et l'utilisation que vous en faites, notamment le niveau de la batterie, la fréquence à laquelle vous utilisez les applications, la qualité et la durée de vos connexions réseau (Wi-Fi et Bluetooth), ainsi que les rapports d'erreur en cas de problème. Elles seront utilisées pour améliorer les produits et les services Google pour tous. Certaines informations agrégées aident également nos partenaires, comme les développeurs Android, à améliorer leurs produits et leurs applications.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Vous pouvez activer ou désactiver cette option à tout moment dans les paramètres des applications Android. Cela n'empêche pas votre appareil d'envoyer les informations nécessaires pour bénéficier de services essentiels tels que les mises à jour du système et la sécurité.<ph name="END_PARAGRAPH2" /></translation> <translation id="5990198433782424697">Extensions des URL chrome://</translation> <translation id="5990814808592353318">Génération manuelle de mots de passe</translation> <translation id="5991049340509704927">Agrandir</translation> @@ -3763,6 +3769,7 @@ <translation id="6005695835120147974">Routeur multimédia</translation> <translation id="6007237601604674381">Échec du transfert. <ph name="ERROR_MESSAGE" /></translation> <translation id="6008241731410823808">Cette option permet d'envoyer des pings de contrôle des liens hypertexte.</translation> +<translation id="6011449291337289699">Effacer les données de sites</translation> <translation id="6015796118275082299">Année</translation> <translation id="6016551720757758985">Confirmer la réinitialisation Powerwash et rétablir la version précédente</translation> <translation id="6016809788585079594">Dites "Ok Google" au moins une fois.</translation> @@ -3952,7 +3959,6 @@ <translation id="6276301056778294989">Assurez-vous que l'appareil affiche le même code.</translation> <translation id="6277105963844135994">Délai d'expiration du réseau dépassé.</translation> <translation id="6277518330158259200">F&aire une capture d'écran</translation> -<translation id="6278428485366576908">Thème</translation> <translation id="6279183038361895380">Appuyez sur |<ph name="ACCELERATOR" />| pour afficher le curseur.</translation> <translation id="6280215091796946657">Se connecter avec un autre compte</translation> <translation id="6280912520669706465">ARC</translation> @@ -4204,6 +4210,7 @@ <translation id="6607272825297743757">Informations sur le fichier</translation> <translation id="6607831829715835317">Plus d'outi&ls</translation> <translation id="6608140561353073361">Cookies et données de site...</translation> +<translation id="6610183966322615106">Erreur lors de l'ajout de l'imprimante</translation> <translation id="6610610633807698299">Saisissez l'URL…</translation> <translation id="6612358246767739896">Contenu protégé</translation> <translation id="6615455863669487791">Démonstration</translation> @@ -4267,7 +4274,6 @@ <translation id="6708242697268981054">Source :</translation> <translation id="6709357832553498500">Se connecter avec "<ph name="EXTENSIONNAME" />"</translation> <translation id="6710213216561001401">Précédent</translation> -<translation id="6712158998835983046">Tout afficher, avec animation</translation> <translation id="6718273304615422081">Compression en cours…</translation> <translation id="671928215901716392">Verrouillage d'écran</translation> <translation id="6721972322305477112">&Fichier</translation> @@ -4539,7 +4545,6 @@ <translation id="7088434364990739311">Échec du lancement de la vérification des mises à jour (code d'erreur <ph name="ERROR" />).</translation> <translation id="708856090370082727">Activer la compatibilité avec le défilement tactile OSK. Lorsque cet indicateur est activé, l'OSK ne redimensionnera que la fenêtre d'affichage.</translation> <translation id="7088674813905715446">Cet appareil a été mis en état "déprovisionné" par l'administrateur. Pour activer son inscription, veuillez demander à l'administrateur d'activer l'état "en attente" pour cet appareil.</translation> -<translation id="7089609847854449639">Gestionnaire d'espace de stockage</translation> <translation id="708969677220991657">Autorise les demandes auprès de l'hôte local via HTTPS même sur présentation d'un certificat non valide.</translation> <translation id="7092106376816104">Exceptions liées aux fenêtres pop-up</translation> <translation id="7093866338626856921">Échanger des données avec les appareils suivants : "<ph name="HOSTNAMES" />"</translation> @@ -4579,7 +4584,7 @@ <translation id="715118844758971915">Imprimantes standards</translation> <translation id="7154130902455071009">Utiliser l'adresse <ph name="START_PAGE" /> comme page de démarrage ?</translation> <translation id="7155171745945906037">Photo existante au niveau de l'appareil photo ou dans les fichiers</translation> -<translation id="715568033737470079">Spécifier les plug-ins PPAPI qui seront exécutés dans le cadre de la règle de bac à sable Win32k Lockdown (Windows 10 et version ultérieure uniquement).</translation> +<translation id="7155226869555939647">Toujours ouvrir les liens pour <ph name="APPLICATION" /></translation> <translation id="7156235233373189579">Ce fichier est destiné à un ordinateur utilisant un logiciel Windows. Il n'est pas compatible avec votre appareil qui exécute Chrome OS. Veuillez effectuer une recherche sur le <ph name="BEGIN_LINK" />Chrome Web Store<ph name="END_LINK" /> pour trouver une application de remplacement appropriée. <ph name="BEGIN_LINK_HELP" />En savoir plus<ph name="END_LINK_HELP" /></translation> <translation id="7157063064925785854">En cliquant sur "Continuer", vous acceptez d'être lié par les documents : <ph name="LEGAL_DOC_LINK_TEXT_1" />, <ph name="LEGAL_DOC_LINK_TEXT_2" />, <ph name="LEGAL_DOC_LINK_TEXT_3" /> et <ph name="LEGAL_DOC_LINK_TEXT_4" />.</translation> <translation id="7158238151765743968">Connexion à l'appareil "<ph name="DEVICE_NAME" />" toujours en cours…</translation> @@ -4594,6 +4599,7 @@ <translation id="7175353351958621980">Chargé depuis :</translation> <translation id="7180611975245234373">Actualiser</translation> <translation id="7180865173735832675">Personnaliser</translation> +<translation id="7181387261278441780">Effacer les données de sites et réinitialiser les autorisations</translation> <translation id="7185078796915954712">TLS 1.3</translation> <translation id="7185690883425432021">Cette option permet de masquer le bouton de fermeture des onglets inactifs lorsque la barre d'onglets est en mode empilé.</translation> <translation id="7186088072322679094">Garder dans la barre d'outils</translation> @@ -4626,7 +4632,6 @@ <translation id="7223775956298141902">Aucune extension n'est installée.</translation> <translation id="7224023051066864079">Masque de sous-réseau :</translation> <translation id="7225179976675429563">Type de réseau manquant.</translation> -<translation id="7230191962699768124">Tout afficher, sans animation</translation> <translation id="7230787553283372882">Personnaliser la taille du texte</translation> <translation id="7231224339346098802">Indiquez le nombre de copies à imprimer (une ou plus).</translation> <translation id="7238585580608191973">Empreinte SHA-256</translation> @@ -4758,7 +4763,6 @@ <translation id="7409233648990234464">Relancer et Powerwash</translation> <translation id="7409836189476010449">Exécuter Flash</translation> <translation id="7410344089573941623">Demander si <ph name="HOST" /> souhaite accéder à votre caméra et à votre micro</translation> -<translation id="7411343637221933631">{NUM_COOKIES,plural, =1{1 provenant de ce site}one{# provenant de ce site}other{# provenant de ce site}}</translation> <translation id="7412226954991670867">Mémoire processeur graphique</translation> <translation id="7416362041876611053">Erreur réseau inconnue.</translation> <translation id="7417453074306512035">Clavier éthiopien</translation> @@ -4880,6 +4884,7 @@ <translation id="756445078718366910">Ouvrir une fenêtre du navigateur</translation> <translation id="7564847347806291057">Arrêter le processus</translation> <translation id="7566723889363720618">F12</translation> +<translation id="7567314848159753396">Cookie : <ph name="NAME" /></translation> <translation id="756809126120519699">Données de Chrome effacées</translation> <translation id="7568790562536448087">Mise à jour en cours</translation> <translation id="7573172247376861652">Charge de la batterie</translation> @@ -4920,6 +4925,7 @@ <translation id="7626009897377900107">Génération de mots de passe</translation> <translation id="7627262197844840899">Les cartes MasterCard ne sont pas acceptées sur ce site.</translation> <translation id="7627790789328695202">Le fichier <ph name="FILE_NAME" /> existe déjà. Veuillez le renommer, puis réessayer.</translation> +<translation id="7628127343934101653">Ouvrir les fichiers PDF dans l'application de visionnage de documents PDF par défaut.</translation> <translation id="762917759028004464">Le navigateur par défaut est actuellement <ph name="BROWSER_NAME" />.</translation> <translation id="7629536005696009600">Autoriser l'insertion des identifiants stockés pour les applications Android dans les sites Web correspondants</translation> <translation id="7629827748548208700">Onglet : <ph name="TAB_NAME" /></translation> @@ -5148,6 +5154,7 @@ <translation id="7957513156576779045">Activer le Bluetooth pour permettre l'association</translation> <translation id="7957615753207896812">Ouvrir les paramètres du clavier</translation> <translation id="7959074893852789871">Le fichier contenait plusieurs certificats, dont certains n'ont pas été importés :</translation> +<translation id="7959700692661109221"><ph name="BEGIN_PARAGRAPH" />Le service de localisation de Google utilise des sources comme le Wi-Fi pour estimer plus rapidement et plus précisément la position de votre appareil. Lorsque vous activez ce service, l'appareil se connecte à un réseau Wi-Fi pour fournir les informations de localisation. Vous pouvez désactiver cette option à tout moment dans les paramètres de localisation.<ph name="END_PARAGRAPH" /></translation> <translation id="7961015016161918242">Jamais</translation> <translation id="7964089325405904043">Importation et exportation de mots de passe</translation> <translation id="7965010376480416255">Mémoire partagée</translation> @@ -5298,6 +5305,7 @@ <translation id="8146793085009540321">Échec de la connexion. Veuillez contacter votre administrateur ou réessayer.</translation> <translation id="8148264977957212129">Mode de saisie du pinyin</translation> <translation id="8148913456785123871">Afficher les cartes Google Now dans le lanceur d'applications</translation> +<translation id="8150391391298684512">Désactiver l'API Windows Runtime MIDI</translation> <translation id="8151185429379586178">Outils de développement</translation> <translation id="8151638057146502721">Configurer</translation> <translation id="8151639108075998630">Activer la navigation en tant qu'invité</translation> @@ -5579,6 +5587,7 @@ <translation id="8532294913309524834">Classer les langues selon vos préférences.</translation> <translation id="8535005006684281994">URL de renouvellement du certificat Netscape</translation> <translation id="8539727552378197395">Non (HttpOnly)</translation> +<translation id="8541084862688000575">Charger automatiquement les applications Android</translation> <translation id="8543181531796978784">Vous pouvez <ph name="BEGIN_ERROR_LINK" />signaler un problème de détection<ph name="END_ERROR_LINK" />. Si vous avez compris les risques auxquels vous vous exposez, vous pouvez <ph name="BEGIN_LINK" />consulter ce site dangereux<ph name="END_LINK" />.</translation> <translation id="8545107379349809705">Masquer les informations…</translation> <translation id="8545211332741562162">Permettre aux pages Web d'utiliser les fonctionnalités expérimentales JavaScript</translation> @@ -5606,7 +5615,6 @@ <translation id="8569764466147087991">Sélectionnez le fichier à ouvrir</translation> <translation id="8571032220281885258">Lorsque vous dites "OK Google", les termes que vous énoncez ensuite font l'objet d'une recherche dans Chrome.</translation> <translation id="8571108619753148184">Serveur 4</translation> -<translation id="8572832761467613633">Flash uniquement</translation> <translation id="8572981282494768930">Interdire aux sites d'accéder à ma caméra et à mon micro</translation> <translation id="8574234089711453001">Affiche un bouton de téléchargement lors de l'ouverture d'une page associée à une URL de média.</translation> <translation id="857779305329188634">Permet d'activer la compatibilité du protocole expérimental QUIC.</translation> @@ -5628,6 +5636,7 @@ <translation id="8600929685092827187">Désactiver le mode veille à la réception de paquets</translation> <translation id="8601206103050338563">Authentification du client WWW TLS</translation> <translation id="8602851771975208551">Un autre programme sur votre ordinateur a ajouté une application qui risque de modifier le fonctionnement de Google Chrome.</translation> +<translation id="8603912787021349466">Autoriser le lancement automatique des applications Android une fois que vous êtes connecté.</translation> <translation id="8605428685123651449">Mémoire SQLite</translation> <translation id="8605503133013456784">Impossible de se déconnecter et de se dissocier de "<ph name="DEVICE_NAME" />".</translation> <translation id="8606726445206553943">Utiliser vos appareils MIDI</translation> @@ -5980,6 +5989,7 @@ <translation id="9053965862400494292">Une erreur s'est produite lors de la configuration de la synchronisation.</translation> <translation id="9056034633062863292">Mise à jour de Chromebox en cours…</translation> <translation id="9056810968620647706">Aucune correspondance trouvée</translation> +<translation id="9057119625587205566">Aucune imprimante à proximité</translation> <translation id="9059868303873565140">Menu d'état</translation> <translation id="9064142312330104323">Photo du profil Google (chargement en cours)</translation> <translation id="9064275926664971810">Activer la saisie automatique pour remplir les formulaires d'un simple clic</translation> @@ -5990,6 +6000,7 @@ <translation id="9067401056540256169">Cet indicateur nuit à la sécurité de Chrome. Utilisez-le uniquement si vous comprenez ce que cela implique. Notez que cet indicateur peut être supprimé sans préavis. S'il est activé, les cadres d'origine https peuvent utiliser WebSockets avec une URL non sécurisée (ws://).</translation> <translation id="9068931793451030927">Chemin :</translation> <translation id="9070219033670098627">Changer de profil utilisateur</translation> +<translation id="9070940116164932228">Limiter les minuteurs en arrière-plan qui sollicitent beaucoup le processeur</translation> <translation id="907148966137935206">Interdire à tous les sites d'afficher des fenêtres pop-up (recommandé)</translation> <translation id="9072550133391925347"><ph name="PASSWORD_MANAGER_BRAND" /> vous connecte automatiquement aux sites et aux applications éligibles avec les mots de passe que vous avez enregistrés.</translation> <translation id="9073281213608662541">PAP</translation> @@ -6024,6 +6035,7 @@ <translation id="9112614144067920641">Veuillez choisir un nouveau code PIN.</translation> <translation id="9112748030372401671">Changer le fond d'écran</translation> <translation id="9112987648460918699">Rechercher...</translation> +<translation id="9114663181201435112">Connectez-vous en toute simplicité</translation> <translation id="9115487443206954631">Gérer les appareils Cast</translation> <translation id="9115675100829699941">&Favoris</translation> <translation id="9121814364785106365">Ouvrir dans un onglet épinglé</translation> @@ -6118,7 +6130,6 @@ <translation id="952992212772159698">Désactivé</translation> <translation id="960719561871045870">Code de l'opérateur</translation> <translation id="960987915827980018">Environ 1 heure restante</translation> -<translation id="962778376131245616">Afficher uniquement les éléments non sécurisés, avec animation</translation> <translation id="96421021576709873">Réseau Wi-Fi</translation> <translation id="965490406356730238">Activer le décodage MJPEG avec accélération matérielle pour l'image capturée, si disponible</translation> <translation id="968174221497644223">Cache de l'application</translation>
diff --git a/chrome/app/resources/generated_resources_gu.xtb b/chrome/app/resources/generated_resources_gu.xtb index cb919fc7..2e72bed 100644 --- a/chrome/app/resources/generated_resources_gu.xtb +++ b/chrome/app/resources/generated_resources_gu.xtb
@@ -18,7 +18,6 @@ <translation id="1029317248976101138">ઝૂમ કરો</translation> <translation id="1029595648591494741">"<ph name="EXTENSION_NAME" />" નો પ્રયાસ કરીએ?</translation> <translation id="1031362278801463162">પૂર્વાવલોકન લોડ કરી રહ્યું છે</translation> -<translation id="1031460590482534116">ક્લાયંટ પ્રમાણપત્ર સ્ટોર કરવાનો પ્રયાસ કરતી વખતે ભૂલ આવી હતી. ભૂલ <ph name="ERROR_NUMBER" /> (<ph name="ERROR_NAME" />).</translation> <translation id="1031573127485938293">પૂછો (નીતિ દ્વારા)</translation> <translation id="103279545524624934">Android ઍપ્લિકેશનો લોંચ કરવા માટે ડિસ્ક સ્થાન ખાલી કરો.</translation> <translation id="1033780634303702874">તમારા સીરિયલ ઉપકરણોને ઍક્સેસ કરો</translation> @@ -101,6 +100,7 @@ <translation id="1128591060186966949">શોધ એંજિન સંપાદિત કરો</translation> <translation id="1128987120443782698">સ્ટોરેજ ઉપકરણની ક્ષમતા <ph name="DEVICE_CAPACITY" /> ની છે. કૃપા કરીને ઓછામાં ઓછું 4GB ની ક્ષમતાવાળું SD કાર્ડ અથવા USB મેમરી સ્ટિક શામેલ કરો.</translation> <translation id="1137135726305341424">domContentLoaded (મુખ્ય ફ્રેમ અને સમાન મૂળ iframes) ની પહેલાં domContentLoaded અને તમામ સંસાધનો લોડ થવાનો પ્રારંભ થયો.</translation> +<translation id="1138663153846032155">ફ્લેશને બદલે HTML ને પ્રાથમિકતા આપો</translation> <translation id="1140351953533677694">તમારા Bluetooth અને સીરિયલ ઉપકરણોને ઍક્સેસ કરો</translation> <translation id="114140604515785785">એક્સ્ટેંશન રૂટ ડાયરેક્ટરી:</translation> <translation id="1143142264369994168">પ્રમાણપત્ર હસ્તાક્ષરકર્તા</translation> @@ -252,6 +252,7 @@ <translation id="1351692861129622852"><ph name="FILE_COUNT" /> ફાઇલો આયાત કરી રહ્યું છે...</translation> <translation id="1352103415082130575">થાઈ કીબોર્ડ (Pattachote)</translation> <translation id="1353686479385938207"><ph name="PROVIDER_NAME" />: <ph name="NETWORK_NAME" /></translation> +<translation id="1353946958707294039">સામગ્રી ડિઝાઇન સ્ટોરેજ સંચાલક</translation> <translation id="1353966721814789986">સ્ટાર્ટઅપ પૃષ્ઠો</translation> <translation id="1354868058853714482">Adobe Reader જૂનું છે અને તે અસુરક્ષિત હોઈ શકે છે.</translation> <translation id="1355408554203439639">3D સૉફ્ટવેર રાસ્ટરાઇઝર</translation> @@ -420,7 +421,6 @@ <translation id="1533920822694388968">ટીવી સંરેખણ</translation> <translation id="15373452373711364">મોટું માઉસ કર્સર</translation> <translation id="1543284117603151572">Edge માંથી આયાત કરેલ</translation> -<translation id="1544350195767834591">{NUM_COOKIES,plural, =1{અન્ય સાઇટ્સમાંથી 1}one{અન્ય સાઇટ્સમાંથી #}other{અન્ય સાઇટ્સમાંથી #}}</translation> <translation id="1545177026077493356">સ્વચલિત કિઓસ્ક મોડ</translation> <translation id="1545786162090505744">ક્વેરીના બદલે %s વાળું URL</translation> <translation id="1546280085599573572">જ્યારે તમે હોમ બટન ક્લિક કરો છો ત્યારે જે પૃષ્ઠ દર્શાવવામાં આવે છે તે આ એક્સટેન્શને બદલ્યું છે.</translation> @@ -444,7 +444,6 @@ <translation id="1559235587769913376">યુનિકોડ અક્ષરો ઇનપુટ કરો</translation> <translation id="1561092721008294962">UI ટેક્સ્ટ માટે HarfBuzz</translation> <translation id="1566049601598938765">વેબસાઇટ</translation> -<translation id="1566958206723629112">Flash અને PDF</translation> <translation id="1567723158593978621">જ્યારે સક્ષમ હોય ત્યારે, બ્રાઉઝરમાં સાઇન ઇન કરવા માટે નવા gaia પાસવર્ડ-દ્વારા-અલગ પડાયેલ સાઇન ઇન ફ્લો નો ઉપયોગ કરવામાં આવશે.</translation> <translation id="1567993339577891801">JavaScript કન્સોલ</translation> <translation id="1568323446248056064">ડિસ્પ્લે ઉપકરણ સેટિંગ્સ ખોલો</translation> @@ -572,7 +571,6 @@ <translation id="1723940674997333416">https મૂળમાંથી અસુરક્ષિત WebSocket ને મંજૂરી આપો</translation> <translation id="1725149567830788547">&નિયંત્રણો બતાવો</translation> <translation id="172612876728038702">TPM સેટ થઈ રહ્યું છે. કૃપા કરીને ધીરજ ધરો; આમાં થોડો સમય લાગી શકે છે.</translation> -<translation id="1727135806684246609">સામગ્રી સુરક્ષા વર્બોઝ</translation> <translation id="1729533290416704613">જ્યારે તમે ઑમ્નિબૉક્સ પરથી શોધ કરો ત્યારે કયું પૃષ્ઠ બતાવવામાં આવે તે તેનું પણ નિયંત્રણ કરે છે.</translation> <translation id="1731346223650886555">અર્ધવિરામ</translation> <translation id="1731589410171062430">કુલ: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /> (<ph name="NUMBER_OF_PAGES" /> <ph name="PAGE_OR_PAGES_LABEL" />)</translation> @@ -869,6 +867,7 @@ <translation id="218492098606937156">ટચ ઇવેન્ટ્સ સક્ષમ કરો</translation> <translation id="2187317261103489799">શોધો (ડિફૉલ્ટ)</translation> <translation id="2187895286714876935">સર્વર પ્રમાણપત્ર આયાત કરવામાં ભૂલ</translation> +<translation id="2188881192257509750"><ph name="APPLICATION" /> ખોલો</translation> <translation id="2190069059097339078">WiFi ઓળખપત્રો બનાવનાર</translation> <translation id="219008588003277019">મૂળ ક્લાયંટ મોડ્યુલ: <ph name="NEXE_NAME" /></translation> <translation id="2190355936436201913">(ખાલી)</translation> @@ -987,6 +986,7 @@ <translation id="2326606747676847821">છુપામાં જાઓ</translation> <translation id="2326931316514688470">ઍપ્લિકેશન &ફરીથી લોડ કરો</translation> <translation id="2327492829706409234">ઍપ્લિકેશન સક્ષમ કરો</translation> +<translation id="2328054044222305089">આ તમારા ઉપકરણ પર <ph name="SITE" /> એ સંગ્રહિત કરેલ કોઈપણ ડેટાને કાઢી નાખશે અને તમે ચલાવવા માટે મંજૂરી આપેલ કોઈપણ પરવાનગીને ફરીથી સેટ કરશે. શું તમે ચાલુ રાખવા માગો છો?</translation> <translation id="2329597144923131178">તમારા તમામ ઉપકરણો પર તમારા બુકમાર્ક્સ, ઇતિહાસ, પાસવર્ડ્સ અને અન્ય સેટિંગ્સ મેળવવા માટે સાઇન ઇન કરો.</translation> <translation id="2332131598580221120">દુકાનમાં જુઓ</translation> <translation id="2332742915001411729">ડિફોલ્ટ પર ફરીથી સેટ કરો</translation> @@ -1262,7 +1262,6 @@ <translation id="2675358154061544447">અલગ પ્રક્રિયાઓમાં ક્રોસ-સાઇટ iframes રેન્ડર કરવા માટે ઉચ્ચ પ્રયોગાત્મક સમર્થન. આ મોડમાં, જો દસ્તાવેજો સમાન વેબસાઇટ પરથી હોય માત્ર તો જ તેઓ એક રેન્ડરર પ્રક્રિયા શેર કરશે.</translation> <translation id="2676946222714718093">આ પર ચલાવી રહ્યાં છે</translation> <translation id="2678063897982469759">ફરી સક્ષમ કરો</translation> -<translation id="2678246812096664977">તમામ પ્લગ-ઇન્સ</translation> <translation id="2679385451463308372">સિસ્ટમ સંવાદનો ઉપયોગ કરીને છાપો... </translation> <translation id="2680208403056680091">તમારું ઇન્ટરનેટ કનેક્શન નિયંત્રિત કરવામાં આવી રહ્યું છે</translation> <translation id="268053382412112343">Hi&story</translation> @@ -1436,7 +1435,6 @@ <translation id="287286579981869940"><ph name="PROVIDER_NAME" /> ઉમેરો...</translation> <translation id="2872961005593481000">શટ ડાઉન કરો</translation> <translation id="2875698561019555027">(Chrome ભૂલ પૃષ્ઠો)</translation> -<translation id="2879560882721503072"><ph name="ISSUER" /> દ્વારા રજૂ કરાયેલું ક્લાયંટ પ્રમાણપત્ર સફળતાપૂર્વક સ્ટોર થયું.</translation> <translation id="288024221176729610">ચેક</translation> <translation id="288042212351694283">તમારા યુનિવર્સલ 2જા ફેક્ટરના ઉપકરણોની ઍક્સેસ</translation> <translation id="2881966438216424900">છેલ્લે ઍક્સેસ કર્યું:</translation> @@ -1585,6 +1583,7 @@ <translation id="3057861065630527966">તમારા ફોટા અને વિડિઓઝનો બેકઅપ લો</translation> <translation id="3058212636943679650">જો કોઈવાર તમને તમારા કમ્પ્યુટરની ઑપરેટિંગ સિસ્ટમ પુનઃસ્થાપિત કરવાની જરૂર પડે, તો તમને SD કાર્ડ અથવા USB મેમરી સ્ટિકની પુનઃપ્રાપ્તિ કરવાની જરૂર પડશે.</translation> <translation id="305932878998873762">HTTP માટેની સરળ કેશ એ નવી કેશ છે. તે ડિસ્ક જગ્યા ફાળવણી માટેની ફાઇલસિસ્ટમ પર આધાર રાખે છે.</translation> +<translation id="3060251871394327123">આ તમારા ઉપકરણ પર <ph name="SITE" /> એ સંગ્રહિત કરેલ કોઈપણ ડેટાને કાઢી નાખશે. શું તમે ચાલુ રાખવા માગો છો?</translation> <translation id="3061650404498811439">IME પસંદ કરો મેનૂમાંથી ઇમોજી, હસ્તલેખન અને વૉઇસ ઇનપુટ ઍક્સેસ સક્ષમ કરો.</translation> <translation id="3062606427884046423">Chrome મીડિયા સૂચનાઓ માટે Android MediaStyle સૂચનાઓનો ઉપયોગ કરો.</translation> <translation id="3063844757726132584">આ હાથવગા લોન્ચરથી તમારી તમામ ઍપ્લિકેશનોને ઍક્સેસ કરો. રમતો રમો, વિડિઓ ચેટ કરો, સંગીત સાંભળો, દસ્તાવેજોને સંપાદિત કરો અથવા વધુ ઍપ્લિકેશનો મેળવો.</translation> @@ -1634,6 +1633,7 @@ <translation id="3123569374670379335">(નિરીક્ષિત)</translation> <translation id="3124111068741548686">વપરાશકર્તા હેન્ડલ કરે છે</translation> <translation id="3126026824346185272">Ctrl</translation> +<translation id="3127156390846601284">બતાવેલ તમામ સાઇટ્સ માટે આ તમારા ઉપકરણ પર સંગ્રહિત કોઈપણ ડેટાને કાઢી નાખશે. શું તમે ચાલુ રાખવા માગો છો?</translation> <translation id="312759608736432009">ઉપકરણ નિર્માતા:</translation> <translation id="3127919023693423797">પ્રમાણિત કરી રહ્યું છે...</translation> <translation id="3128230619496333808">ટૅબ 6</translation> @@ -1732,7 +1732,6 @@ <translation id="3264544094376351444">Sans-Serif ફૉન્ટ</translation> <translation id="3264547943200567728">તમારા Chromebox ના નેટવર્કને સેટ કરવામાં નિષ્ફળ થયાં</translation> <translation id="3265459715026181080">વિંડો બંધ કરો</translation> -<translation id="3267271790328635957">માત્ર PDF</translation> <translation id="3267726687589094446">બહુવિધ ફાઇલોના સ્વયંચાલિત ડાઉનલોડને મંજૂરી આપવાનું ચાલુ રાખો</translation> <translation id="3267998849713137817">સંશોધિત કર્યાનો સમય</translation> <translation id="3268451620468152448">ઓપન ટેબ્સ</translation> @@ -1978,6 +1977,7 @@ <translation id="3574210789297084292">સાઇન ઇન કરો</translation> <translation id="3574305903863751447"><ph name="CITY" />, <ph name="STATE" /> <ph name="COUNTRY" /></translation> <translation id="357479282490346887">લિથુનિયન</translation> +<translation id="3575927481544652747">WebMIDI માટે Windows રનટાઇમ MIDI API ને અક્ષમ કરો, કે જે Windows 10 અથવા પછીના સંસ્કરણ પર ડિફૉલ્ટ તરીકે સક્ષમ કરેલ છે.</translation> <translation id="3576324189521867626">સફળતાપૂર્વક ઇન્સ્ટૉલ કરી</translation> <translation id="3578331450833904042">ડિફોલ્ટ (બધું જ સાંભળશે)</translation> <translation id="3578594933904494462">આ ટેબની સામગ્રી શેર કરવામાં આવી રહી છે.</translation> @@ -2031,8 +2031,6 @@ <translation id="3627320433825461852">1 થી ઓછી મિનિટ બાકી</translation> <translation id="3627588569887975815">છુ&પી વિંડોમાં લિંક ખોલો</translation> <translation id="3627671146180677314">નેટસ્કેપ પ્રમાણપત્ર નવીકરણ સમય</translation> -<translation id="3629326610814700057">સ્થાનિક સ્ટોરેજ સંચાલિત કરવા માટે સ્ટોરેજ સંચાલક સક્ષમ કરે છે.</translation> -<translation id="3630337581925712713"><ph name="PERMISSION_TYPE_LABEL" />:</translation> <translation id="3631337165634322335">ચાલુ છૂપા સત્ર પર ફક્ત નીચેના અપવાદો લાગુ થાય છે.</translation> <translation id="3633586230741134985">ઍપ્લિકેશન લૉન્ચર સેટિંગ્સ</translation> <translation id="3633997706330212530">તમે વૈકલ્પિક રીતે આ સેવાઓને અક્ષમ કરી શકો છો.</translation> @@ -2055,7 +2053,8 @@ <translation id="3654045516529121250">તમારી ઍક્સેસિબિલિટી સેટિંગ્સ વાંચો</translation> <translation id="3654092442379740616">સમન્વયન ભૂલ: <ph name="PRODUCT_NAME" /> જૂનું છે અને તેને અપડેટ કરવાની જરૂર છે.</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{તેને એક ફાઇલ માટે કાયમી ઍક્સેસ છે.}one{તેને # ફાઈલ્સ માટે કાયમી ઍક્સેસ છે.}other{તેને # ફાઈલ્સ માટે કાયમી ઍક્સેસ છે.}}</translation> -<translation id="3657468915905674858">PPAPI Win32k લોકડાઉન સક્ષમ કરો.</translation> +<translation id="365793796291733849"><ph name="BEGIN_PARAGRAPH1" />જ્યારે તમે સ્વયંચલિત બેકઅપ ચાલુ કરો છો, ત્યારે ઉપકરણ અને ઍપ્લિકેશન ડેટાને સમયાંતરે Google ડ્રાઇવમાં ખાનગી ફોલ્ડરમાં સાચવવામાં આવે છે. ઍપ્લિકેશન ડેટા એ ઍપ્લિકેશને સાચવેલો કોઈપણ ડેટા હોઈ શકે છે (વિકાસકર્તા સેટિંગ્સના આધારે), જેમાં સંપર્કો, સંદેશા અને ફોટા જેવા સંભવિત રૂપે સંવેદનશીલ ડેટાનો સમાવેશ થાય છે.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />તમારા Drive storage ક્વોટાની સામે બેકઅપ ડેટાને ગણવામાં આવશે નહીં. મોટી ફાઇલો અથવા વિકાસકર્તાઓએ સેવામાંથી બાકાત રાખવાનું પસંદ કર્યું હોય તેવી ફાઇલોનું બેક અપ લેવામાં આવશે નહીં.<ph name="END_PARAGRAPH2" /></translation> <translation id="3660234220361471169">અવિશ્વસનીય</translation> <translation id="3665589677786828986">Chrome ને જાણ થઈ છે કે તમારી કેટલીક સેટિંગ્સ બીજા પ્રોગ્રામ દ્વારા દૂષિત કરવામાં આવેલી અને તેમને તેમના મૂળ ડિફોલ્ટ્સ પર ફરીથી સેટ કરી છે.</translation> <translation id="3665842570601375360">સુરક્ષા:</translation> @@ -2110,6 +2109,7 @@ <translation id="3733127536501031542">સ્ટેપ-અપ સાથે SSL સર્વર </translation> <translation id="3736520371357197498">જો તમે તમારી સુરક્ષાના જોખમોને સમજો છો, તો તમે જોખમી પ્રોગ્રામ્સ દૂર કરી દેવામાં આવે તે પહેલાં <ph name="BEGIN_LINK" />આ અસલામત સાઇટની મુલાકાત<ph name="END_LINK" /> લઈ શકો છો.</translation> <translation id="3738924763801731196"><ph name="OID" />:</translation> +<translation id="3739254215541673094"><ph name="APPLICATION" /> ખોલીએ?</translation> <translation id="3739798227959604811">પુનરાવર્તન પહેલાં વિલંબ:</translation> <translation id="3741158646617793859"><ph name="DEVICE_NAME" /> હવે Admin Console માં દેખાશે</translation> <translation id="3741243925913727067">Google ડ્રાઇવ પર તમારા મીડિયા ઉપકરણના ફોટા અને વિડિઓઝનો બેક અપ લો.</translation> @@ -2348,7 +2348,6 @@ <translation id="4058793769387728514">હવે દસ્તાવેજ તપાસો</translation> <translation id="4059285154003114015">ફ્રેમ &છાપો...</translation> <translation id="406070391919917862">પૃષ્ઠભૂમિ ઍપ્લિકેશનો</translation> -<translation id="4061502419206152498">ફક્ત બિન-સુરક્ષિત, બિન-એનિમેટ કરેલ બતાવો</translation> <translation id="4062251648694601778">તમારા <ph name="SHORT_PRODUCT_NAME" /> ઉપકરણને માણો. કોઈ પ્રશ્ન છે? તમે સ્થિતિ ટ્રેમાં "?" ને ક્લિક કરીને હંમેશાં સહાય મેળવી શકો છો.</translation> <translation id="4065876735068446555">તમે ઉપયોગમાં લઈ રહ્યાં છો તે નેટવર્ક (<ph name="NETWORK_ID" />) માટે, તમારે તેના લોગિન પૃષ્ઠની મુલાકાત લેવાની જરૂર હોઈ શકે છે.</translation> <translation id="4068506536726151626">આ પૃષ્ઠમાં તમારા સ્થાનને ટ્રૅક કરતી નીચેની સાઇટ્સનાં ઘટકો શામેલ છે:</translation> @@ -2387,7 +2386,6 @@ <translation id="4101878899871018532">પાસવર્ડ સંચાલક સમન્વયન માટે ઉપયોગમાં લેવાતાં ઓળખાણપત્રને સાચવવા માટેની ઑફર કરશે નહીં.</translation> <translation id="410351446219883937">ઑટોપ્લે</translation> <translation id="4104163789986725820">નિ&કાસ કરો...</translation> -<translation id="4105523032910086267">સામગ્રી ડિઝાઇનમાં સુરક્ષા વર્બોઝના એનિમેશન અને દૃશ્યતાને સેટ કરે છે.</translation> <translation id="4105563239298244027">Google ડ્રાઇવ સાથે 1 TB મફત મેળવો</translation> <translation id="4109135793348361820"><ph name="USER_NAME" /> (<ph name="USER_EMAIL" />) પર વિંડો ખસેડો</translation> <translation id="4110342520124362335"><ph name="DOMAIN" /> તરફથી કૂકીઝ અવરોધિત.</translation> @@ -2438,6 +2436,7 @@ <translation id="418179967336296930">રશિયન ધ્વન્યાત્મક (YaZHert) કીબોર્ડ</translation> <translation id="4181841719683918333">ભાષાઓ</translation> <translation id="4187248015940562149">વેબ Bluetooth ને સક્ષમ કરે છે જે વેબસાઇટ્સને તમારી આસપાસના Bluetooth ઉપકરણો સાથે કનેક્ટ થવાની અને તેઓને નિયંત્રિત કરવાની મંજૂરી આપી શકે છે.</translation> +<translation id="4188447344915957833">સામગ્રી ડિઝાઇન સેટિંગ્સમાં સ્ટોરેજ સંચાલક સક્ષમ કરે છે.</translation> <translation id="4189406272289638749">એક એક્સ્ટેન્શન, <b><ph name="EXTENSION_NAME" /></b> આ સેટિંગનું નિયંત્રણ કરે છે.</translation> <translation id="4193154014135846272">Google દસ્તાવેજ</translation> <translation id="4193182321948161343">સામગ્રી ડિઝાઇન વપરાશકર્તા સંચાલકને સક્ષમ કરો</translation> @@ -2645,6 +2644,7 @@ <translation id="4508765956121923607">સ્રો&ત જુઓ</translation> <translation id="4509017836361568632">ફોટો કાઢી નાખો</translation> <translation id="4509345063551561634">સ્થાન:</translation> +<translation id="4513946894732546136">પ્રતિસાદ</translation> <translation id="4514542542275172126">નવો નિરીક્ષિત વપરાશકર્તા સેટ કરો</translation> <translation id="4514914692061505365">તમામ pexe ફાઇલો માટે PNaCl ના ઝડપી Subzero અનુવાદનો ઉપયોગ કરવાની ફરજ પાડે છે.</translation> <translation id="451515744433878153">દૂર કરો</translation> @@ -2743,6 +2743,7 @@ <translation id="4656293982926141856">આ કમ્પ્યુટર</translation> <translation id="4656631038341342120">જો આ ઉપકરણ માટે ઉપલબ્ધ હોય તો VR શેલ સક્ષમ કરો.</translation> <translation id="4657031070957997341"><ph name="HOST" /> પર પ્લગિન્સને હંમેશા મંજૂરી આપો</translation> +<translation id="466008749075469935">પૃષ્ઠભૂમિ ટાઇમર્સના CPU વપરાશને 1% સુધી મર્યાદિત કરવા માટે હસ્તક્ષેપને સક્ષમ કરે છે.</translation> <translation id="4663254525753315077">જ્યારે શક્ય હોય, ત્યારે વધારાનાં સ્ક્રોલિંગ ઘટકની સ્ક્રોલિંગ સામગ્રીઓને ઝડપી સ્ક્રોલિંગ માટે સંમિશ્ર સ્તર પર મૂકે છે.</translation> <translation id="4664482161435122549">PKCS #12 નિકાસ ભૂલ</translation> <translation id="4665014895760275686">નિર્માતા</translation> @@ -2811,6 +2812,7 @@ <translation id="4749157430980974800">જ્યોર્જિયન કીબોર્ડ</translation> <translation id="4750394297954878236">સૂચનો</translation> <translation id="475088594373173692">પ્રથમ વપરાશકર્તા</translation> +<translation id="4750892496809949692">પ્લગ-ઇન્સની સૂચિમાંથી ફ્લેશને છુપાવીને HTML સામગ્રીને પ્રાથમિકતા આપો.</translation> <translation id="4750917950439032686">તમારી માહિતી (ઉદાહરણ તરીકે, પાસવર્ડ્સ અથવા ક્રેડિટ કાર્ડ નંબર્સ) ખાનગી હોય છે જ્યારે તે આ સાઇટ પર મોકલવામાં આવે.</translation> <translation id="4753602155423695878">Android ફોન પૃષ્ઠ લોડ કરવાનું પ્રોગ્રેસ બાર એનિમેશન</translation> <translation id="4755240240651974342">ફિનિશ કીબોર્ડ</translation> @@ -3085,6 +3087,7 @@ <translation id="5119450342834678097">સેટિંગ્સ મેનૂમાં ટેબ્લેટ સાઇટ વિકલ્પની વિનંતી કરો</translation> <translation id="5120068803556741301">તૃતીય પક્ષ ઇનપુટ પદ્ધતિ</translation> <translation id="5120421890733714118">વેબસાઇટ્સ ઓળખવા માટે આ પ્રમાણપત્ર પર વિશ્વાસ કરો.</translation> +<translation id="5120516977819314347">ખોટો PIN અથવા પાસવર્ડ.</translation> <translation id="5121130586824819730">તમારી હાર્ડ ડિસ્ક પૂર્ણ ભરેલી છે. કૃપા કરીને અન્ય સ્થાન પર સાચવો અથવા હાર્ડ ડિસ્ક પર વધુ જગ્યા કરો.</translation> <translation id="5125751979347152379">અમાન્ય URL.</translation> <translation id="5127881134400491887">નેટવર્ક કનેક્શન્સનું સંચાલન કરો</translation> @@ -3092,6 +3095,7 @@ <translation id="512903556749061217">જોડાયેલું</translation> <translation id="5129301143853688736">આ સાઇટ પરનું તમારું કનેક્શન ખાનગી નથી. હુમલાખોરો <ph name="DOMAIN" /> માંથી તમારી માહિતી (ઉદાહરણ તરીકે, ફોટા, પાસવર્ડ્સ, સંદેશા અને ક્રેડિટ કાર્ડ્સ) ચોરી કરવાનો પ્રયાસ કરી શકે છે.</translation> <translation id="5129662217315786329">પોલીશ</translation> +<translation id="5131347545782851480">PDF દસ્તાવેજો</translation> <translation id="5134856901811723984">Chrome OS સિસ્ટમ UI માં સામગ્રી ડિઝાઇન</translation> <translation id="5135533361271311778">બુકમાર્ક આઇટમ બનાવી શકાઈ નથી.</translation> <translation id="5136529877787728692">F7</translation> @@ -3258,6 +3262,7 @@ <translation id="5328031682234198929">8</translation> <translation id="5329858601952122676">&કાઢી નાખો</translation> <translation id="5330145655348521461">આ ફાઇલોને બીજા ડેસ્કટૉપ પર ખોલેલી. તેને જોવા માટે <ph name="USER_NAME" /> (<ph name="MAIL_ADDRESS" />) પર જાઓ.</translation> +<translation id="5330512191124428349">માહિતી મેળવો</translation> <translation id="5332624210073556029">ટાઇમ ઝોન:</translation> <translation id="5333807720589685258">જો તમે સાચી PIN અનલૉક કી દાખલ કરી ન શકો તો તમારું SIM કાર્ડ કાયમીરૂપે અક્ષમ કરવામાં આવશે.</translation> @@ -3691,7 +3696,6 @@ <translation id="5892507820957994680">બિલ્ટ-ઇન સૉફ્ટવેર રેંડરિંગ સૂચિને ઓવરરાઇડ કરે છે અને અનસપોર્ટેડ સિસ્ટમ ગોઠવણી પર GPU-એક્સિલરેશનને સક્ષમ કરે છે.</translation> <translation id="5895138241574237353">પુનઃપ્રારંભ કરો</translation> <translation id="5895187275912066135">ના રોજ રજૂ કરાયું</translation> -<translation id="5898154795085152510">સર્વરે અમાન્ય ક્લાયંટ પ્રમાણપત્ર આપ્યું. ભૂલ <ph name="ERROR_NUMBER" /> (<ph name="ERROR_NAME" />)</translation> <translation id="5900302528761731119">Google પ્રોફાઇલ ફોટો</translation> <translation id="590253956165195626">તમે વાંચો છો તે ભાષામાં ન હોય તેવા પૃષ્ઠોના અનુવાદની ઓફર કરો.</translation> <translation id="5904093760909470684">પ્રોક્સી ગોઠવણી</translation> @@ -3746,6 +3750,8 @@ <translation id="5984222099446776634">હાલમાં મુલાકાત લીધેલા</translation> <translation id="5984814259619230127">Smart Lock Bluetooth ન્યૂન ઊર્જા શોધ</translation> <translation id="5986245990306121338">જો સક્ષમ હોય, તો જ્યારે સેટિંગ્સમાં 'ટેબ્સ અને ઍપ્લિકેશનો મર્જ કરો' વિકલ્પ ચાલુ હોય ત્યારે પણ એક ટેબ સ્વિચર બતાવવામાં આવશે.</translation> +<translation id="5989712527536636369"><ph name="BEGIN_PARAGRAPH1" />આ તમારા ઉપકરણ અને તમે કેવી રીતે તેનો ઉપયોગ કરો છો તેના વિશેની સામાન્ય માહિતી છે, જેમ કે બૅટરી સ્તર, તમે કેટલીવાર તમારી ઍપ્લિકેશનોનો ઉપયોગ કરો છો, તમારા નેટવર્ક કનેક્શન્સની ગુણવત્તા અને અવધિ (જેમ કે Wi‑Fi અને Bluetooth) અને જ્યારે વસ્તુઓ જે રીતે કામ કરવી જોઈએ તે રીતે ન કરે ત્યારની ક્રેશ રિપોર્ટ્સ. તેનો ઉપયોગ Google ના ઉત્પાદનો અને સેવાઓને દરેક જણ માટે બહેતર બનાવવા માટે થશે. કેટલીક એકીકૃત માહિતી Android વિકાસકર્તાઓ જેવા ભાગીદારોની પણ સહાય કરશે, જેનાથી ઍપ્લિકેશનો અને ઉત્પાદનો બહેતર બનાવવામાં આવે.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />તમે આને કોઈપણ સમયે Android ઍપ્લિકેશનોની સેટિંગ્સમાં ચાલુ અથવા બંધ કરી શકો છો. આ સિસ્ટમ અપડેટ્સ અને સુરક્ષા જેવી આવશ્યક સેવાઓ પ્રાપ્ત કરવા માટે તેને જરૂર હોય એવી માહિતી મોકલવા માટેની તમારા ઉપકરણની ક્ષમતાને પ્રભાવિત કરતું નથી.<ph name="END_PARAGRAPH2" /></translation> <translation id="5990198433782424697">chrome:// URL પર એક્સ્ટેન્શન્સ</translation> <translation id="5990814808592353318">મેન્યુઅલ પાસવર્ડ જનરેશન.</translation> <translation id="5991049340509704927">મૅગ્નિફાઇ</translation> @@ -3759,6 +3765,7 @@ <translation id="6005695835120147974">મીડિયા રાઉટર</translation> <translation id="6007237601604674381">ખસેડવું નિષ્ફળ થયું. <ph name="ERROR_MESSAGE" /></translation> <translation id="6008241731410823808">હાયપરલિંક ઑડિટિંગ પિંગ્સ મોકલે છે.</translation> +<translation id="6011449291337289699">સાઇટનો ડેટા સાફ કરો</translation> <translation id="6015796118275082299">વર્ષ</translation> <translation id="6016551720757758985">અગાઉના સંસ્કરણ પર પાછા ફરવાની સાથે Powerwash ની પુષ્ટિ કરો</translation> <translation id="6016809788585079594">એક છેલ્લી વાર "Ok Google" કહો</translation> @@ -3948,7 +3955,6 @@ <translation id="6276301056778294989">ખાતરી કરો કે ઉપકરણ સમાન કોડ દર્શાવી રહ્યું છે.</translation> <translation id="6277105963844135994">નેટવર્ક ટાઇમઆઉટ</translation> <translation id="6277518330158259200">સ્ક્રીનશોટ &લો</translation> -<translation id="6278428485366576908">થીમ</translation> <translation id="6279183038361895380">તમારા કર્સરને બતાવવા માટે |<ph name="ACCELERATOR" />| દબાવો</translation> <translation id="6280215091796946657">એક અલગ એકાઉન્ટ સાથે સાઇન ઇન કરો</translation> <translation id="6280912520669706465">ARC</translation> @@ -4201,6 +4207,7 @@ <translation id="6607272825297743757">ફાઇલ માહિતી</translation> <translation id="6607831829715835317">વધુ સા&ધનો</translation> <translation id="6608140561353073361">તમામ કૂકીઝ અને સાઇટ ડેટા...</translation> +<translation id="6610183966322615106">પ્રિન્ટર ઉમેરવામાં ભૂલ</translation> <translation id="6610610633807698299">URL દાખલ કરો...</translation> <translation id="6612358246767739896">સુરક્ષિત સામગ્રી</translation> <translation id="6615455863669487791">મને બતાવો</translation> @@ -4264,7 +4271,6 @@ <translation id="6708242697268981054">મૂળ:</translation> <translation id="6709357832553498500"><ph name="EXTENSIONNAME" /> નો ઉપયોગ કરીને કનેક્ટ કરો</translation> <translation id="6710213216561001401">પહેલાનું</translation> -<translation id="6712158998835983046">તમામ બતાવો, એનિમેટ કરેલ</translation> <translation id="6718273304615422081">ઝિપ કરી રહ્યાં છે...</translation> <translation id="671928215901716392">સ્ક્રીન લૉક કરો</translation> <translation id="6721972322305477112">&File</translation> @@ -4537,7 +4543,6 @@ <translation id="7088434364990739311">અપડેટ તપાસ પ્રારંભ કરવામાં નિષ્ફળ થયું (ભૂલ કોડ <ph name="ERROR" />).</translation> <translation id="708856090370082727">OSK ઓવરસ્ક્રોલ સમર્થનને સક્ષમ કરો. આ ફ્લેગ ચાલુ હોવા પર OSK ફક્ત વિઝ્યુઅલ વ્યૂપોર્ટનો જ આકાર બદલશે.</translation> <translation id="7088674813905715446">આ ઉપકરણને વ્યવસ્થાપક દ્વારા દૂર કરવાની સ્થિતિમાં મૂકવામાં આવ્યું છે. નોંધણી માટે તેને સક્ષમ કરવા માટે, કૃપા કરીને તમારા વ્યવસ્થાપકને ઉપકરણને લંબિત સ્થિતિમાં મૂકવા દો.</translation> -<translation id="7089609847854449639">સ્ટોરેજ સંચાલક</translation> <translation id="708969677220991657">જ્યારે અમાન્ય પ્રમાણપત્ર પ્રસ્તુત કર્યું હોય ત્યારે પણ, હંમેશાં HTTPS પર localhost માટેની વિનંતીઓને મંજૂરી આપે છે.</translation> <translation id="7092106376816104">પૉપ-અપ અપવાદો</translation> <translation id="7093866338626856921">આ નામના ઉપકરણ સાથે ડેટા વિનિમય કરો: <ph name="HOSTNAMES" /></translation> @@ -4577,7 +4582,7 @@ <translation id="715118844758971915">ક્લાસિક પ્રિન્ટર્સ</translation> <translation id="7154130902455071009">તમારા પ્રારંભ પૃષ્ઠને આ પર બદલો: <ph name="START_PAGE" /></translation> <translation id="7155171745945906037">કૅમેરા અથવા ફાઇલમાંથી અસ્તિત્વમાંનો ફોટો</translation> -<translation id="715568033737470079">PPAPI પ્લગ-ઇન્સનો ઉલ્લેખ કરો જે Win32k લોકડાઉન સેન્ડબોક્સ નીતિ અંતર્ગત ચલાવવામાં આવશે (ફક્ત Windows 10 અને એથી ઉચ્ચ સંસ્કરણો).</translation> +<translation id="7155226869555939647"><ph name="APPLICATION" /> માટે હંમેશાં લિંક્સ ખોલો</translation> <translation id="7156235233373189579">આ ફાઇલની રચના Windows સૉફ્ટવેરનો ઉપયોગ કરી રહેલ એક PC માટે કરવામાં આવી છે. આ Chrome OS ચલાવી રહેલા તમારા ઉપકરણ સાથે સુસંગત નથી. કૃપા કરીને એક અનુકૂળ અવેજી ઍપ્લિકેશન માટે <ph name="BEGIN_LINK" />Chrome વેબ દુકાન<ph name="END_LINK" /> પર શોધો.<ph name="BEGIN_LINK_HELP" />વધુ જાણો<ph name="END_LINK_HELP" /></translation> <translation id="7157063064925785854">ચાલુ રાખો પર ક્લિક કરીને તમે <ph name="LEGAL_DOC_LINK_TEXT_1" />, <ph name="LEGAL_DOC_LINK_TEXT_2" />, <ph name="LEGAL_DOC_LINK_TEXT_3" /> અને <ph name="LEGAL_DOC_LINK_TEXT_4" />થી સંમત થાઓ છો.</translation> <translation id="7158238151765743968">"<ph name="DEVICE_NAME" />" પર કનેક્શન હજી પણ પ્રક્રિયામાં છે.</translation> @@ -4592,6 +4597,7 @@ <translation id="7175353351958621980">અહીંથી લોડ કરેલું:</translation> <translation id="7180611975245234373">તાજું કરો</translation> <translation id="7180865173735832675">કસ્ટમાઇઝ કરો</translation> +<translation id="7181387261278441780">સાઇટ સાફ કરો અને ફરીથી સેટ કરો</translation> <translation id="7185078796915954712">TLS 1.3</translation> <translation id="7185690883425432021">જ્યારે ટેબસ્ટ્રિપ સ્ટૅક્ડ મોડમાં હોય ત્યારે નિષ્ક્રિય ટેબ્સના બંધ કરો બટનોને છુપાવે છે.</translation> <translation id="7186088072322679094">ટુલબારમાં રાખો</translation> @@ -4624,7 +4630,6 @@ <translation id="7223775956298141902">અરેરે.... તમારી પાસે કોઈ એક્સ્ટેંશન્સ નથી :-(</translation> <translation id="7224023051066864079">સબનેટ માસ્ક:</translation> <translation id="7225179976675429563">નેટવર્ક પ્રકાર ખૂટે છે</translation> -<translation id="7230191962699768124">તમામ બતાવો, બિન-એનિમેટ કરેલ</translation> <translation id="7230787553283372882">તમારી ટેક્સ્ટના કદને કસ્ટમાઇઝ કરો</translation> <translation id="7231224339346098802">કેટલી કૉપિ છાપવાની છે તે દર્શાવવા માટે સંખ્યાનો ઉપયોગ કરો (1 અથવા વધુ).</translation> <translation id="7238585580608191973">SHA-256 ફિંગરપ્રિંટ</translation> @@ -4756,7 +4761,6 @@ <translation id="7409233648990234464">ફરીથી લૉન્ચ કરો અને Powerwash કરો</translation> <translation id="7409836189476010449">ફ્લેશ ચલાવો</translation> <translation id="7410344089573941623">પૂછો કે <ph name="HOST" /> તમારા કૅમેરા અને માઇક્રોફોનને ઍક્સેસ કરવા માંગે છે કે કેમ</translation> -<translation id="7411343637221933631">{NUM_COOKIES,plural, =1{આ સાઇટમાંથી 1}one{આ સાઇટમાંથી #}other{આ સાઇટમાંથી #}}</translation> <translation id="7412226954991670867">GPU મેમરી</translation> <translation id="7416362041876611053">અજ્ઞાત નેટવર્ક ભૂલ.</translation> <translation id="7417453074306512035">ઇથિઓપિક કીબોર્ડ</translation> @@ -4878,6 +4882,7 @@ <translation id="756445078718366910">બ્રાઉઝર વિંડો ખોલો</translation> <translation id="7564847347806291057">પ્રક્રિયાનો અંત કરો</translation> <translation id="7566723889363720618">F12</translation> +<translation id="7567314848159753396">કુકી: <ph name="NAME" /></translation> <translation id="756809126120519699">Chrome ડેટા સાફ કર્યો</translation> <translation id="7568790562536448087">અપડેટ થઈ રહ્યું છે</translation> <translation id="7573172247376861652">બેટરી ચાર્જ</translation> @@ -4918,6 +4923,7 @@ <translation id="7626009897377900107">પાસવર્ડ જનરેશન</translation> <translation id="7627262197844840899">આ સાઇટ MasterCard ને સ્વીકારતી નથી.</translation> <translation id="7627790789328695202">ઉફ્ફ, <ph name="FILE_NAME" /> પહેલાંથી અસ્તિત્વમાં છે. તેનું નામ બદલો અને ફરી પ્રયાસ કરો.</translation> +<translation id="7628127343934101653">PDF ફાઇલોને ડિફૉલ્ટ PDF દર્શક ઍપ્લિકેશનમાં ખોલો.</translation> <translation id="762917759028004464"><ph name="BROWSER_NAME" /> હાલમાં ડિફૉલ્ટ બ્રાઉઝર છે.</translation> <translation id="7629536005696009600">સંબંધિત વેબસાઇટ્સમાં ભરવા માટે Android ઍપ્લિકેશનો માટે સંગ્રહિત ઓળખપત્રોને મંજૂરી આપો.</translation> <translation id="7629827748548208700">ટૅબ: <ph name="TAB_NAME" /></translation> @@ -5146,6 +5152,7 @@ <translation id="7957513156576779045">જોડી કરવાની મંજૂરી આપવા માટે Bluetooth ચાલુ કરો</translation> <translation id="7957615753207896812">કીબોર્ડ ઉપકરણ સેટિંગ્સ ખોલો</translation> <translation id="7959074893852789871">ફાઇલમાં બહુવિધ પ્રમાણપત્રો રહેલા છે, તેમાંનાં કેટલાક આયાત કરેલા નથી:</translation> +<translation id="7959700692661109221"><ph name="BEGIN_PARAGRAPH" />Google ની સ્થાન સેવા તમારા ઉપકરણના સ્થાનને વધુ ઝડપથી અને સચોટપણે અંદાજ લગાવવામાં સહાય કરવા માટે Wi-Fi જેવા સ્રોતોનો ઉપયોગ કરે છે. જ્યારે તમે Google ની સ્થાન સેવાઓને ચાલુ કરો છો, ત્યારે તમારું ઉપકરણ એવા મોડમાં દાખલ થાય છે કે જે સ્થાન માહિતી પ્રદાન કરવા માટે Wi-Fi નો ઉપયોગ કરે છે. તમે આને કોઈપણ સમયે સ્થાન સેટિંગ્સમાં બંધ કરી શકો છો.<ph name="END_PARAGRAPH" /></translation> <translation id="7961015016161918242">ક્યારેય નહીં</translation> <translation id="7964089325405904043">પાસવર્ડ આયાત અને નિકાસ</translation> <translation id="7965010376480416255">વહેંચેલી મેમરી</translation> @@ -5291,6 +5298,7 @@ <translation id="8146793085009540321">સાઇન-ઇન નિષ્ફળ થયું. કૃપા કરીને તમારા વ્યવસ્થાપકનો સંપર્ક કરો અથવા ફરી પ્રયાસ કરો.</translation> <translation id="8148264977957212129">પિનયિન ઇનપુટ મેથડ</translation> <translation id="8148913456785123871">લોન્ચરમાં Google Now કાર્ડ્સ દર્શાવો</translation> +<translation id="8150391391298684512">Windows રનટાઇમ MIDI API ને અક્ષમ કરો</translation> <translation id="8151185429379586178">વિકાસકર્તા સાધનો</translation> <translation id="8151638057146502721">ગોઠવો</translation> <translation id="8151639108075998630">અતિથિ બ્રાઉઝિંગ સક્ષમ કરો</translation> @@ -5574,6 +5582,7 @@ <translation id="8532294913309524834">તમારી પસંદગીના આધારે ભાષાઓને ક્રમમાં ગોઠવો.</translation> <translation id="8535005006684281994">નેટસ્કેપ પ્રમાણપત્ર નવીકરણ URL</translation> <translation id="8539727552378197395">ના (ફક્ત Http)</translation> +<translation id="8541084862688000575">Android ઍપ્લિકેશનોને આપમેળે લોડ કરો</translation> <translation id="8543181531796978784">તમે <ph name="BEGIN_ERROR_LINK" />શોધ સમસ્યાની જાણ<ph name="END_ERROR_LINK" /> કરી શકો છો અથવા જો તમે તમારી સુરક્ષા અંગેનાં જોખમોને સમજતાં હોવ, તો <ph name="BEGIN_LINK" />આ અસુરક્ષિત સાઇટની મુલાકાત<ph name="END_LINK" /> લઈ શકો છો.</translation> <translation id="8545107379349809705">માહિતી છુપાવો...</translation> <translation id="8545211332741562162">પ્રાયોગિક JavaScript સુવિધાઓનો ઉપયોગ કરવા માટે વેબ પૃષ્ઠોને સક્ષમ કરો.</translation> @@ -5601,7 +5610,6 @@ <translation id="8569764466147087991">ખોલવા માટે એક ફાઇલ પસંદ કરો</translation> <translation id="8571032220281885258">જ્યારે તમે "Ok Google" કહો છો, ત્યારે તમે પછી જે કહો છો Chrome તેની શોધ કરશે.</translation> <translation id="8571108619753148184">સર્વર 4</translation> -<translation id="8572832761467613633">માત્ર Flash</translation> <translation id="8572981282494768930">સાઇટ્સને તમારા કૅમેરા અને માઇક્રોફોનને ઍક્સેસ કરવાની મંજૂરી આપશો નહીં</translation> <translation id="8574234089711453001">મીડિયા url સાથેના કોઈ પૃષ્ઠને ખોલવા પર બતાવવા માટે ડાઉનલોડ કરો બટનને મંજૂરી આપો.</translation> <translation id="857779305329188634">પ્રાયોગિક QUIC પ્રોટોકોલ સમર્થનને સક્ષમ કરો.</translation> @@ -5623,6 +5631,7 @@ <translation id="8600929685092827187">વૅક ઓન પેકેટ્સ</translation> <translation id="8601206103050338563">TLS WWW ક્લાયંટ પ્રમાણીકરણ</translation> <translation id="8602851771975208551">તમારા કમ્પ્યુટર પરના બીજા પ્રોગ્રામે એક ઍપ્લિકેશન ઉમેરી જે Chrome કાર્ય કરે છે તે રીતને બદલી શકે છે.</translation> +<translation id="8603912787021349466">સાઇન ઇન કર્યા પછી Android ઍપ્લિકેશનોને આપમેળે શરૂ થવાની મંજૂરી આપો.</translation> <translation id="8605428685123651449">SQLite મેમરી</translation> <translation id="8605503133013456784">"<ph name="DEVICE_NAME" />" માંથી ડિસ્કનેક્ટ કરવામાં અને જોડી રદ કરવામાં નિષ્ફળ થયું.</translation> <translation id="8606726445206553943">તમારા MIDI ઉપકરણોનો ઉપયોગ કરો</translation> @@ -5975,6 +5984,7 @@ <translation id="9053965862400494292">સમન્વય સેટ અપના પ્રયાસ વખતે એક ભૂલ આવી.</translation> <translation id="9056034633062863292">Chromebox અપડેટ કરી રહ્યાં છે</translation> <translation id="9056810968620647706">કોઈ મેળ મળ્યાં નથી.</translation> +<translation id="9057119625587205566">નજીકમાં કોઈ પ્રિન્ટર્સ નથી</translation> <translation id="9059868303873565140">સ્થિતિ મેનૂ</translation> <translation id="9064142312330104323">Google પ્રોફાઇલ ફોટો (લોડ થઇ રહ્યું છે)</translation> <translation id="9064275926664971810">એક જ ક્લિકમાં ફોર્મ્સ ભરવા માટે સ્વતઃભરણ સક્ષમ કરો</translation> @@ -5985,6 +5995,7 @@ <translation id="9067401056540256169">આ ફ્લેગ Chrome ને અસુરક્ષિત બનાવે છે. જો તમે સમજતાં હોવ કે આ શું કરે છે તો જ તેનો ઉપયોગ કરો. નોંધો કે આ ફ્લેગને કોઈપણ સૂચના વિના દૂર કરવામાં આવી શકે છે. જો સક્ષમ છે, તો https મૂળ સાથેની ફ્રેમ્સ, અસુરક્ષિત URL (ws://) સાથે WebSockets નો ઉપયોગ કરી શકે છે.</translation> <translation id="9068931793451030927">પાથ:</translation> <translation id="9070219033670098627">વ્યક્તિ પર સ્વિચ કરો</translation> +<translation id="9070940116164932228">થ્રોટલ ખર્ચાળ પૃષ્ઠભૂમિ ટાઇમર્સ</translation> <translation id="907148966137935206">કોઈ પણ સાઇટને પૉપ-અપ્સ બતાવવાની મંજૂરી આપવી નહીં (ભલામણ કરેલ) </translation> <translation id="9072550133391925347"><ph name="PASSWORD_MANAGER_BRAND" />, તમને તમે સાચવેલા પાસવર્ડ્સ વડે યોગ્ય હોય તેવી સાઇટ્સ અને ઍપ્લિકેશનોમાં આપમેળે સાઇન ઇન કરે છે.</translation> <translation id="9073281213608662541">PAP</translation> @@ -6019,6 +6030,7 @@ <translation id="9112614144067920641">કૃપા કરીને એક નવું PIN પસંદ કરો.</translation> <translation id="9112748030372401671">તમારું વોલપેપર બદલો</translation> <translation id="9112987648460918699">શોધો...</translation> +<translation id="9114663181201435112">સરળતાથી સાઇન ઇન કરો</translation> <translation id="9115487443206954631">કાસ્ટ ઉપકરણોને સંચાલિત કરો</translation> <translation id="9115675100829699941">&બુકમાર્ક્સ</translation> <translation id="9121814364785106365">પિન કરેલા ટૅબ તરીકે ખોલો</translation> @@ -6113,7 +6125,6 @@ <translation id="952992212772159698">સક્રિય કરેલું નથી</translation> <translation id="960719561871045870">ઓપરેટર કોડ</translation> <translation id="960987915827980018">લગભગ 1 કલાક બાકી</translation> -<translation id="962778376131245616">ફક્ત બિન-સુરક્ષિત, એનિમેટ કરેલ બતાવો</translation> <translation id="96421021576709873">Wi-Fi નેટવર્ક</translation> <translation id="965490406356730238">જ્યાં ઉપલબ્ધ હોય ત્યાં કેપ્ચર કરેલ ફ્રેમ માટે હાર્ડવેર-એક્સિલરેટેડ mjpeg ડીકોડ સક્ષમ કરો.</translation> <translation id="968174221497644223">ઍપ્લિકેશન કેશ</translation>
diff --git a/chrome/app/resources/generated_resources_hi.xtb b/chrome/app/resources/generated_resources_hi.xtb index 3fdb300..1646f34 100644 --- a/chrome/app/resources/generated_resources_hi.xtb +++ b/chrome/app/resources/generated_resources_hi.xtb
@@ -18,7 +18,6 @@ <translation id="1029317248976101138">ज़ूम</translation> <translation id="1029595648591494741">"<ph name="EXTENSION_NAME" />" आज़माएं?</translation> <translation id="1031362278801463162">पूर्वावलोकन लोड हो रहा है</translation> -<translation id="1031460590482534116">क्लाइंट प्रमाणपत्र संग्रहीत करने का प्रयास करते समय एक त्रुटि आई थी. त्रुटि <ph name="ERROR_NUMBER" /> (<ph name="ERROR_NAME" />).</translation> <translation id="1031573127485938293">पूछें (नीति द्वारा)</translation> <translation id="103279545524624934">Android ऐप्लिकेशन लॉन्च करने के लिए डिस्क में जगह खाली करें.</translation> <translation id="1033780634303702874">अपने सीरियल डिवाइस को एक्सेस करें</translation> @@ -101,6 +100,7 @@ <translation id="1128591060186966949">खोज इंजन संपादित करें</translation> <translation id="1128987120443782698">मेमोरी डिवाइस की क्षमता <ph name="DEVICE_CAPACITY" /> है. कृपया कम से कम 4GB की क्षमता वाला SD कार्ड या USB मेमोरी स्टिक लगाएं.</translation> <translation id="1137135726305341424">domContentLoaded और सभी संसाधन लोड, domContentLoaded (मुख्य फ़्रेम और समान मूल वाले iframe) से पहले शुरू हुए.</translation> +<translation id="1138663153846032155">Flash के बजाय HTML को प्राथमिकता दें</translation> <translation id="1140351953533677694">अपने ब्लूटूथ और Serial डिवाइस एक्सेस करें</translation> <translation id="114140604515785785">एक्सटेंशन मूल निर्देशिका:</translation> <translation id="1143142264369994168">प्रमाणपत्र हस्ताक्षरकर्ता</translation> @@ -252,6 +252,7 @@ <translation id="1351692861129622852"><ph name="FILE_COUNT" /> फ़ाइलें आयात की जा रही हैं...</translation> <translation id="1352103415082130575">थाई कीबोर्ड (पैट्टाशोटे)</translation> <translation id="1353686479385938207"><ph name="PROVIDER_NAME" />: <ph name="NETWORK_NAME" /></translation> +<translation id="1353946958707294039">मटीरियल डिज़ाइन जगह प्रबंधक</translation> <translation id="1353966721814789986">स्टार्टअप पृष्ठ</translation> <translation id="1354868058853714482">Adobe Reader पुराना हो चुका है और असुरक्षित हो सकता है.</translation> <translation id="1355408554203439639">3D सॉफ़्टवेयर रास्टराइज़र</translation> @@ -423,7 +424,6 @@ <translation id="1533920822694388968">TV संरेखण</translation> <translation id="15373452373711364">बड़ा माउस कर्सर</translation> <translation id="1543284117603151572">Edge से आयात किया गया</translation> -<translation id="1544350195767834591">{NUM_COOKIES,plural, =1{अन्य साइट से 1}one{अन्य साइट से #}other{अन्य साइट से #}}</translation> <translation id="1545177026077493356">स्वचालित किओस्क मोड</translation> <translation id="1545786162090505744">क्वेरी के स्थान पर %s वाला URL</translation> <translation id="1546280085599573572">इस एक्सटेंशन ने यह बदल दिया है कि जब आप होम बटन क्लिक करते हैं तब कौन सा पृष्ठ दिखाया जाए.</translation> @@ -447,7 +447,6 @@ <translation id="1559235587769913376">यूनिकोड वर्ण इनपुट करें</translation> <translation id="1561092721008294962">UI लेख के लिए HarfBuzz</translation> <translation id="1566049601598938765">वेबसाइट</translation> -<translation id="1566958206723629112">Flash और PDF</translation> <translation id="1567723158593978621">सक्षम होने पर, ब्राउज़र में प्रवेश करने पर नए gaia पासवर्ड-द्वारा अलग किए गए प्रवेश प्रवाह का उपयोग किया जाएगा.</translation> <translation id="1567993339577891801">JavaScript पैनल</translation> <translation id="1568323446248056064">प्रदर्शन डिवाइस सेटिंग खोलें</translation> @@ -576,7 +575,6 @@ <translation id="1723940674997333416">https मूल से असुरक्षित WebSocket की अनुमति दें</translation> <translation id="1725149567830788547">&नियंत्रण दिखाएं</translation> <translation id="172612876728038702">TPM सेट अप किया जा रहा है. कृपया धैर्य रखें; इसमें कुछ मिनट लग सकते हैं.</translation> -<translation id="1727135806684246609">मटीरियल सुरक्षा वर्बोस</translation> <translation id="1729533290416704613">इससे यह भी नियंत्रित होता है कि जब आप खोज वाली पट्टी से खोजते हैं तब कौन सा पृष्ठ दिखाया जाए.</translation> <translation id="1731346223650886555">अल्पविराम</translation> <translation id="1731589410171062430">कुल: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /> (<ph name="NUMBER_OF_PAGES" /> <ph name="PAGE_OR_PAGES_LABEL" />)</translation> @@ -872,6 +870,7 @@ <translation id="218492098606937156">स्पर्श इवेंट सक्षम करें</translation> <translation id="2187317261103489799">पता लगाएं (डिफ़ॉल्ट)</translation> <translation id="2187895286714876935">सर्वर प्रमाणपत्र आयात त्रुटि</translation> +<translation id="2188881192257509750"><ph name="APPLICATION" /> खोलें</translation> <translation id="2190069059097339078">वाई-फ़ाई प्रमाणिकता प्राप्तकर्ता</translation> <translation id="219008588003277019">नेटिव क्लाइंट मॉड्यूल: <ph name="NEXE_NAME" /></translation> <translation id="2190355936436201913">(खाली)</translation> @@ -990,6 +989,7 @@ <translation id="2326606747676847821">गुप्त मोड में जाएं</translation> <translation id="2326931316514688470">&ऐप पुन: लोड करें</translation> <translation id="2327492829706409234">ऐप्स सक्षम करें</translation> +<translation id="2328054044222305089">यह ऐसे किसी भी डेटा को हटा देगा जिसे <ph name="SITE" /> ने आपके डिवाइस पर संग्रहीत किया है और ऐसी किसी भी अनुमति को रीसेट कर देगा जिसे चलने की आपने अनुमति दी थी. क्या आप जारी रखना चाहते हैं?</translation> <translation id="2329597144923131178">सभी डिवाइसों पर बुकमार्क, इतिहास, पासवर्ड और अन्य सेटिंग प्राप्त करने हेतु प्रवेश करें.</translation> <translation id="2332131598580221120">स्टोर में देखें</translation> <translation id="2332742915001411729">डिफ़ॉल्ट पर रीसेट करें</translation> @@ -1265,7 +1265,6 @@ <translation id="2675358154061544447">क्रॉस-साइट iframes को अलग-अलग प्रक्रियाओं में रेंडर करने के लिए उच्च प्रयोगात्मक सहायता. इस मोड में, दस्तावेज़ रेंडरर प्रक्रिया को केवल तभी साझा करेंगे, जब वे समान वेब साइट से हों.</translation> <translation id="2676946222714718093">इस पर चलाया जा रहा है:</translation> <translation id="2678063897982469759">फिर से-सक्षम करें</translation> -<translation id="2678246812096664977">सभी प्लग इन</translation> <translation id="2679385451463308372">सिस्टम डायलॉग का उपयोग करके प्रिंट करें…</translation> <translation id="2680208403056680091">आपका इंटरनेट कनेक्शन नियंत्रित किया जा रहा है</translation> <translation id="268053382412112343">इति&हास</translation> @@ -1439,7 +1438,6 @@ <translation id="287286579981869940"><ph name="PROVIDER_NAME" /> जोड़ें...</translation> <translation id="2872961005593481000">शट डाउन करें</translation> <translation id="2875698561019555027">(Chrome त्रुटि पृष्ठ)</translation> -<translation id="2879560882721503072"><ph name="ISSUER" /> द्वारा जारी किए गए क्लाइंट प्रमाणपत्र को सफलतापूर्वक संग्रहीत कर लिया गया है.</translation> <translation id="288024221176729610">चेक</translation> <translation id="288042212351694283">अपने यूनीवर्सल सेकंड फ़ैक्टर डिवाइस एक्सेस करें</translation> <translation id="2881966438216424900">अंतिम बार पहुंच प्राप्त करने की तिथि:</translation> @@ -1588,6 +1586,7 @@ <translation id="3057861065630527966">अपनी फ़ोटो और वीडियो का बैक अप लें</translation> <translation id="3058212636943679650">यदि आपको कभी अपने कंप्यूटर के ऑपरेटिंग सिस्टम को पुनर्स्थापित करने की आवश्यकता हो, तो आपको एक पुनर्प्राप्ति SD कार्ड या USB मेमोरी स्टिक की आवश्यकता होगी.</translation> <translation id="305932878998873762">HTTP के लिए सरल संचय एक नया संचय है. डिस्क स्थान आवंटन के लिए यह फ़ाइल सिस्टम पर निर्भर करता है.</translation> +<translation id="3060251871394327123">यह ऐसे किसी भी डेटा को हटा देगा जिसे <ph name="SITE" /> ने आपके डिवाइस पर संग्रहीत किया है. क्या आप जारी रखना चाहते हैं?</translation> <translation id="3061650404498811439">ऑप्ट-इन IME मेनू से इमोजी, हस्तलेखन और ध्वनि इनपुट का एक्सेस सक्षम करें.</translation> <translation id="3062606427884046423">Chrome मीडिया नोटिफ़िकेशन के लिए Android MediaStyle नोटिफ़िकेशन का उपयोग करें.</translation> <translation id="3063844757726132584">इस आसान लॉन्चर से अपने सभी ऐप्लिकेशन एक्सेस करें. गेम खेलें, वीडियो चैट करें, संगीत सुनें, दस्तावेज़ संपादित करें, या और अधिक ऐप्लिकेशन प्राप्त करें.</translation> @@ -1637,6 +1636,7 @@ <translation id="3123569374670379335">(पर्यवेक्षित)</translation> <translation id="3124111068741548686">उपयोगकर्ता हैंडल</translation> <translation id="3126026824346185272">Ctrl</translation> +<translation id="3127156390846601284">यह ऐसे किसी भी डेटा को हटा देगा जिसे दिखाई गईं सभी साइटों के लिए आपके डिवाइस पर संग्रहीत किया गया है. क्या आप जारी रखना चाहते हैं?</translation> <translation id="312759608736432009">डिवाइस निर्माता:</translation> <translation id="3127919023693423797">प्रमाणित कर रहा है...</translation> <translation id="3128230619496333808">टैब 6</translation> @@ -1735,7 +1735,6 @@ <translation id="3264544094376351444">Sans-serif फ़ॉन्ट</translation> <translation id="3264547943200567728">आपके Chromebox के नेटवर्क को सेट करने में विफल रहा</translation> <translation id="3265459715026181080">विंडो बंद करें</translation> -<translation id="3267271790328635957">केवल PDF</translation> <translation id="3267726687589094446">एकाधिक फ़ाइलों के स्वचालित डाउनलोड की अनुमति देना जारी रखें</translation> <translation id="3267998849713137817">परिवर्तन समय</translation> <translation id="3268451620468152448">खुले सत्र</translation> @@ -1981,6 +1980,7 @@ <translation id="3574210789297084292">प्रवेश करें</translation> <translation id="3574305903863751447"><ph name="CITY" />, <ph name="STATE" /> <ph name="COUNTRY" /></translation> <translation id="357479282490346887">लिथुआनियाई</translation> +<translation id="3575927481544652747">WebMIDI के लिए Windows Runtime MIDI API अक्षम करें, जो Windows 10 या बाद वाले वर्शन पर डिफ़ॉल्ट रूप से सक्षम होता है.</translation> <translation id="3576324189521867626">सफलतापूर्वक इंस्टॉल हो गया है</translation> <translation id="3578331450833904042">डिफ़ॉल्ट (सब कुछ चुनें)</translation> <translation id="3578594933904494462">इस टैब की सामग्री को साझा किया जा रहा है.</translation> @@ -2034,8 +2034,6 @@ <translation id="3627320433825461852">1 मिनट से भी कम शेष है</translation> <translation id="3627588569887975815">&गुप्त विंडो में लिंक खोलें</translation> <translation id="3627671146180677314">Netscape प्रमाणपत्र नवीकरण समय</translation> -<translation id="3629326610814700057">मेमोरी प्रबंधक को स्थानीय मेमोरी प्रबंधित करनेे में सक्षम बनाता है.</translation> -<translation id="3630337581925712713"><ph name="PERMISSION_TYPE_LABEL" />:</translation> <translation id="3631337165634322335">नीचे दिए गए अपवाद केवल वर्तमान गुप्त सत्र पर ही लागू हैं.</translation> <translation id="3633586230741134985">ऐप चलाने के साधन की सेटिंग</translation> <translation id="3633997706330212530">आप वैकल्पिक रूप से इन सेवाओं को प्रयोग में नहीं कर सकते हैं.</translation> @@ -2058,7 +2056,8 @@ <translation id="3654045516529121250">अपनी पहुंच-योग्यता सेटिंग पढ़ें</translation> <translation id="3654092442379740616">समन्वयन त्रुटि: <ph name="PRODUCT_NAME" /> पुराना है और इसे अपडेट करने की आवश्यकता है.</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{उसे एक फ़ाइल की स्थायी ऐक्सेस प्राप्त है.}one{उसे # फ़ाइलों की स्थायी ऐक्सेस प्राप्त है.}other{उसे # फ़ाइलों की स्थायी ऐक्सेस प्राप्त है.}}</translation> -<translation id="3657468915905674858">PPAPI Win32k लॉकडाउन सक्षम करें.</translation> +<translation id="365793796291733849"><ph name="BEGIN_PARAGRAPH1" />जब आप स्वचालित बैकअप चालू करते हैं, तो डिवाइस और ऐप्लिकेशन डेटा को समय-समय पर Google डिस्क में निजी फ़ोल्डर में सहेज लिया जाता है. ऐप्लिकेशन डेटा ऐसा कोई भी डेटा हो सकता है जिसे किसी ऐप्लिकेशन ने सहेजा है (डेवलपर सेटिंग के आधार पर), इसमें संपर्क, संदेश और फ़ोटो जैसा संभावित रूप से संवेदनशील डेटा भी शामिल है.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />बैकअप डेटा की गणना आपकी डिस्क जगह में नहीं की जाएगी. बड़ी फ़ाइलें या डेवलपर द्वारा सेवा से बाहर रखने हेतु चुनी गईं फ़ाइलों का बैक अप नहीं लिया जाएगा.<ph name="END_PARAGRAPH2" /></translation> <translation id="3660234220361471169">अविश्वसनीय</translation> <translation id="3665589677786828986">Chrome को पता चला है कि आपकी कुछ सेटिंग किसी दूसरे प्रोग्राम के द्वारा दूषित कर दी गई हैं और उन्हें उनके मूल डिफ़ॉल्ट पर रीसेट कर दिया गया है.</translation> <translation id="3665842570601375360">सुरक्षा:</translation> @@ -2113,6 +2112,7 @@ <translation id="3733127536501031542">स्टेप-अप वाला SSL सर्वर</translation> <translation id="3736520371357197498">यदि आप अपनी सुरक्षा में होने वाले जोखिमों को समझते हैं, तो आप खतरनाक प्रोग्राम निकाले जाने से पहले <ph name="BEGIN_LINK" />इस असुरक्षित साइट पर विज़िट<ph name="END_LINK" /> कर सकते हैं.</translation> <translation id="3738924763801731196"><ph name="OID" />:</translation> +<translation id="3739254215541673094"><ph name="APPLICATION" /> खोलना चाहते हैं?</translation> <translation id="3739798227959604811">दोहराने से पहले विलंब:</translation> <translation id="3741158646617793859"><ph name="DEVICE_NAME" /> अब Admin Console में दिखाई देगा</translation> <translation id="3741243925913727067">अपने मीडिया डिवाइस की फ़ोटो और वीडियो का Google डिस्क पर बैकअप लें.</translation> @@ -2350,7 +2350,6 @@ <translation id="4058793769387728514">दस्तावेज़ की अभी जांच करें</translation> <translation id="4059285154003114015">फ़्रेम &प्रिंट करें...</translation> <translation id="406070391919917862">पृष्ठभूमि ऐप्स </translation> -<translation id="4061502419206152498">केवल गैर-सुरक्षित, गैर-एनिमेटेेड दिखाएं</translation> <translation id="4062251648694601778">अपने <ph name="SHORT_PRODUCT_NAME" /> डिवाइस का आनंद लें. क्या आपके पास प्रश्न हैं? आप स्थिति ट्रे में "?" क्लिक करके कभी भी सहायता प्राप्त कर सकते हैं.</translation> <translation id="4065876735068446555">आप जिस नेटवर्क (<ph name="NETWORK_ID" />) का उपयोग कर रहे हैं उसके लिए आपको लॉगिन पृष्ठ पर जाने की आवश्यकता हो सकती है.</translation> <translation id="4068506536726151626">इस पेज पर आपके स्थान की जानकारी रखने वाली निम्न साइटों की कुछ चीजें मौजूद हैं:</translation> @@ -2389,7 +2388,6 @@ <translation id="4101878899871018532">पासवर्ड प्रबंधक समन्वयित करने के लिए उपयोग किए जाने वाले क्रेडेंशियल को सहेजने के लिए नहीं कहेगा.</translation> <translation id="410351446219883937">स्वतः चलाएं</translation> <translation id="4104163789986725820">नि&र्यात करें...</translation> -<translation id="4105523032910086267">मटीरियल डिज़ाइन में सुरक्षा वर्बोस का एनिमेशन और दृश्यता सेट करता है.</translation> <translation id="4105563239298244027">Google डिस्क के साथ 1 TB मुफ़्त पाएं</translation> <translation id="4109135793348361820">विंडो को <ph name="USER_NAME" /> (<ph name="USER_EMAIL" />) पर ले जाएं</translation> <translation id="4110342520124362335"><ph name="DOMAIN" /> की कुकी अवरोधित हैं.</translation> @@ -2440,6 +2438,7 @@ <translation id="418179967336296930">रूसी फ़ोनेटिक (YaZHert) कीबोर्ड</translation> <translation id="4181841719683918333">भाषाएं</translation> <translation id="4187248015940562149">वेब ब्लूटूथ को सक्षम करता है जो वेबसाइट को आपके आस-पास के ब्लूटूथ डिवाइस से कनेक्ट करने और उन्हें नियंत्रित करने दे सकता है.</translation> +<translation id="4188447344915957833">मटीरियल डिज़ाइन सेटिंग में जगह प्रबंधक सक्षम करता है.</translation> <translation id="4189406272289638749">कोई एक्सटेंशन, <b><ph name="EXTENSION_NAME" /></b>, इस सेटिंग को नियंत्रित कर रहा है.</translation> <translation id="4193154014135846272">Google दस्तावेज़</translation> <translation id="4193182321948161343">मटीरियल डिज़ाइन उपयोगकर्ता प्रबंधक को सक्षम करें</translation> @@ -2647,6 +2646,7 @@ <translation id="4508765956121923607">स्रो&त देखें</translation> <translation id="4509017836361568632">फ़ोटो छोड़ें</translation> <translation id="4509345063551561634">स्थानः</translation> +<translation id="4513946894732546136">सुझाव</translation> <translation id="4514542542275172126">नया निगरानी में रखा गया उपयोगकर्ता सेट करें</translation> <translation id="4514914692061505365">सभी pexe फ़ाइलों के लिए PNaCl के तेज़ Subzero अनुवादक के उपयोग को लागू करें.</translation> <translation id="451515744433878153">निकालें</translation> @@ -2745,6 +2745,7 @@ <translation id="4656293982926141856">यह कंप्यूटर</translation> <translation id="4656631038341342120">यदि इस डिवाइस के लिए उपलब्ध हो तो VR शेल सक्षम करें.</translation> <translation id="4657031070957997341"><ph name="HOST" /> पर प्लग इन को हमेशा अनुमति दें</translation> +<translation id="466008749075469935">पृष्ठभूमि टाइमर के CPU उपयोग को 1% तक सीमित करने के लिए हस्तक्षेप सक्षम करता है.</translation> <translation id="4663254525753315077">जब संभव हो, तबओवरफ़्लो स्क्रॉलिंग तत्व की स्क्रॉलिंग सामग्री को तेज़ स्क्रॉलिंग के लिए समग्रित लेयर पर रखें.</translation> <translation id="4664482161435122549">PKCS #12 निर्यात त्रुटि</translation> <translation id="4665014895760275686">निर्माता</translation> @@ -2813,6 +2814,7 @@ <translation id="4749157430980974800">जॉर्जियन कीबोर्ड</translation> <translation id="4750394297954878236">सुझाव</translation> <translation id="475088594373173692">प्रथम उपयोगकर्ता</translation> +<translation id="4750892496809949692">प्लग इन की सूची से Flash को छिपाकर HTML सामग्री को प्राथमिकता दें.</translation> <translation id="4750917950439032686">आपकी जानकारी (उदाहरण के लिए, पासवर्ड या क्रेडिट कार्ड नंबर) जब इस साइट पर भेजी जाती है तब वह निजी होती है .</translation> <translation id="4753602155423695878">Android फ़ोन का पृष्ठ लोड प्रगति बार ऐनिमेशन</translation> <translation id="4755240240651974342">फ़िनिश कीबोर्ड</translation> @@ -3087,6 +3089,7 @@ <translation id="5119450342834678097">सेटिंग मेनू में अनुरोध टैबलेट साइट विकल्प</translation> <translation id="5120068803556741301">तृतीय पक्ष इनपुट विधि</translation> <translation id="5120421890733714118">वेबसाइटों की पहचान करने के लिए इस प्रमाणपत्र पर विश्वास करें.</translation> +<translation id="5120516977819314347">पिन या पासवर्ड गलत है.</translation> <translation id="5121130586824819730">आपकी हार्ड डिस्क भर गई है. कृपया किसी अन्य स्थान पर सहेजें या हार्ड डिस्क पर जगह बनाएं.</translation> <translation id="5125751979347152379">अमान्य URL.</translation> <translation id="5127881134400491887">नेटवर्क कनेक्शन प्रबंधित करें</translation> @@ -3094,6 +3097,7 @@ <translation id="512903556749061217">अनुलग्न</translation> <translation id="5129301143853688736">इस साइट से आपका कनेक्शन निजी नहीं है. हो सकता है कि हमलावर <ph name="DOMAIN" /> से आपकी जानकारी (उदाहरण के लिए, फ़ोटो, पासवर्ड, संदेश और क्रेडिट कार्ड) चुराने का प्रयास कर रहे हों.</translation> <translation id="5129662217315786329">पोलिश</translation> +<translation id="5131347545782851480">PDF दस्तावेज़</translation> <translation id="5134856901811723984">Chrome OS सिस्टम UI में मटीरियल डिज़ाइन</translation> <translation id="5135533361271311778">बुकमार्क आइटम नहीं बना सका.</translation> <translation id="5136529877787728692">F7</translation> @@ -3262,6 +3266,7 @@ <translation id="5328031682234198929">8</translation> <translation id="5329858601952122676">&हटाएं</translation> <translation id="5330145655348521461">ये फ़ाइलें किसी अलग डेस्कटॉप पर खुली हैं. उसे देखने के लिए <ph name="USER_NAME" /> (<ph name="MAIL_ADDRESS" />) पर जाएं.</translation> +<translation id="5330512191124428349">जानकारी पाएं</translation> <translation id="5332624210073556029">समय क्षेत्र:</translation> <translation id="5333807720589685258">यदि आप सही पिन अनलॉक कुंजी नहीं डाल पाते हैं तो आपका SIM कार्ड स्थायी रूप से अक्षम कर दिया जाएगा.</translation> @@ -3694,7 +3699,6 @@ <translation id="5892507820957994680">अंतर्निहित सॉफ़्टवेयर रेंडरिंग सूची ओवरराइड करता है और असमर्थित सिस्टम कॉन्फ़िगरेशन पर GPU-त्वरण सक्षम करता है.</translation> <translation id="5895138241574237353">पुन: प्रारंभ करें</translation> <translation id="5895187275912066135">जारी करने की तिथि</translation> -<translation id="5898154795085152510">सर्वर ने एक अमान्य क्लाइंट प्रमाणपत्र लौटाया. त्रुटि <ph name="ERROR_NUMBER" /> (<ph name="ERROR_NAME" />).</translation> <translation id="5900302528761731119">Google प्रोफ़ाइल फ़ोटो</translation> <translation id="590253956165195626">ऐसे पृष्ठों का अनुवाद करना ऑफ़र करें जो आपके द्वारा पढ़ी जाने वाली भाषा में नहीं हैं.</translation> <translation id="5904093760909470684">प्रॉक्सी कॉन्फ़िगरेशन</translation> @@ -3749,6 +3753,8 @@ <translation id="5984222099446776634">हाल ही में देखे गए</translation> <translation id="5984814259619230127">Smart Lock ब्लूटूथ निम्न ऊर्जा खोज</translation> <translation id="5986245990306121338">यदि टैब स्विचर सक्षम है,तो सेटिंग में 'टैब और ऐप्स मर्ज करें' विकल्प चालू होने पर भी टैब स्विचर दिखाई देगा.</translation> +<translation id="5989712527536636369"><ph name="BEGIN_PARAGRAPH1" />यह आपके डिवाइस और आप उसका उपयोग कैसे करते हैं इस बारे में सामान्य जानकारी है, जैसे कि बैटरी का स्तर, आप अपने ऐप्लिकेशन का उपयोग कितनी बार करते हैं, आपके नेटवर्क कनेक्शन (जैसे वाई-फ़ाई और ब्लूटूथ) की गुणवत्ता और अवधि और चीज़ों के अपेक्षानुसार काम नहीं करने पर ख़राबी रिपोर्ट. उसका उपयोग Google के उत्पादों और सेवाओं को सभी के लिए बेहतर बनाने में किया जाएगा. कुछ एकीकृत जानकारी Android डेवलपर जैसे सहयोगियों की भी सहायता करेगी, जिससे वे अपने ऐप्लिकेशन और उत्पादों को बेहतर भी बना सकेंगे.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />आप Android ऐप्लिकेशन सेटिंग में किसी भी समय इसे चालू या बंद कर सकते हैं. इससे आपके डिवाइस की ऐसी जानकारी भेजने की क्षमता प्रभावित नहीं होगी जिसकी आवश्यकता उसे सिस्टम अपडेट और सुरक्षा जैसी आवश्यक सेवाएं प्राप्त करने के लिए होती है.<ph name="END_PARAGRAPH2" /></translation> <translation id="5990198433782424697">chrome:// URL पर एक्सटेंशन</translation> <translation id="5990814808592353318">मैन्युअल पासवर्ड जेनरेशन.</translation> <translation id="5991049340509704927">आवर्धित करें</translation> @@ -3762,6 +3768,7 @@ <translation id="6005695835120147974">मीडिया राउटर</translation> <translation id="6007237601604674381">ले जाना विफल रहा. <ph name="ERROR_MESSAGE" /></translation> <translation id="6008241731410823808">हाइपरलिंक ऑडिटिंग पिंग भेजता है.</translation> +<translation id="6011449291337289699">साइट डेटा साफ़ करें</translation> <translation id="6015796118275082299">वर्ष</translation> <translation id="6016551720757758985">पिछले वर्ज़न पर वापस लौटने के साथ ही पावरवॉश की पुष्टि करें</translation> <translation id="6016809788585079594">एक आखिरी बार "Ok Google" बोलें</translation> @@ -3951,7 +3958,6 @@ <translation id="6276301056778294989">सुनिश्चित करें कि डिवाइस समान कोड दिखा रहा है.</translation> <translation id="6277105963844135994">नेटवर्क समय समाप्त</translation> <translation id="6277518330158259200">स्क्री&नशॉट लें</translation> -<translation id="6278428485366576908">थीम</translation> <translation id="6279183038361895380">अपना कर्सर दिखाने के लिए |<ph name="ACCELERATOR" />| दबाएं</translation> <translation id="6280215091796946657">किसी दूसरे खाते से प्रवेश करें</translation> <translation id="6280912520669706465">ARC</translation> @@ -4203,6 +4209,7 @@ <translation id="6607272825297743757">फ़ाइल जानकारी</translation> <translation id="6607831829715835317">अधिक टू&ल</translation> <translation id="6608140561353073361">सभी कुकी और साइट डेटा...</translation> +<translation id="6610183966322615106">प्रिंटर जोड़ने में गड़बड़ी</translation> <translation id="6610610633807698299">URL दर्ज करें...</translation> <translation id="6612358246767739896">सुरक्षित सामग्री</translation> <translation id="6615455863669487791">मुझे दिखाएं</translation> @@ -4266,7 +4273,6 @@ <translation id="6708242697268981054">मूल:</translation> <translation id="6709357832553498500"><ph name="EXTENSIONNAME" /> के उपयोग से कनेक्ट करें</translation> <translation id="6710213216561001401">पिछला</translation> -<translation id="6712158998835983046">सभी, एनिमेटेड दिखाएं</translation> <translation id="6718273304615422081">ज़िप किया जा रहा है...</translation> <translation id="671928215901716392">लॉक स्क्रीन</translation> <translation id="6721972322305477112">&फ़ाइल</translation> @@ -4539,7 +4545,6 @@ <translation id="7088434364990739311">अपडेट की जांच प्रारंभ करने में विफल (त्रुटि कोड <ph name="ERROR" />).</translation> <translation id="708856090370082727">OSK ओवरस्क्रॉल समर्थन सक्षम करें. इस फ़्लैग के चालू होने पर, OSK केवल विज़ुअल व्यूपोर्ट के आकार को बदलेगा.</translation> <translation id="7088674813905715446">इस डिवाइस को व्यवस्थापक द्वारा प्रावधान रद्द की गई स्थिति में रखा गया है. नामांकन के लिए इसे सक्षम करने के लिए, कृपया अपने व्यवस्थापक द्वारा डिवाइस को लंबित स्थिति में रहने दें.</translation> -<translation id="7089609847854449639">मेमोरी प्रबंधक</translation> <translation id="708969677220991657">HTTPS पर स्थानीय होस्ट के अनुरोधों को अनुमति देता है, भले ही अमान्य प्रमाणपत्र प्रस्तुत किया गया हो.</translation> <translation id="7092106376816104">पॉप-अप अपवाद</translation> <translation id="7093866338626856921"><ph name="HOSTNAMES" /> नामक डिवाइस से डेटा का आदान-प्रदान करें</translation> @@ -4579,7 +4584,7 @@ <translation id="715118844758971915">क्लासिक प्रिंटर</translation> <translation id="7154130902455071009">अपना आरंभ पृष्ठ इसमें बदलें: <ph name="START_PAGE" /></translation> <translation id="7155171745945906037">कैमरा या फ़ाइल से मौजूदा फ़ोटो</translation> -<translation id="715568033737470079">वे PPAPI प्लग इन निर्दिष्ट करें जो Win32k लॉकडाउन सैंडबॉक्स पॉलिसी के अंतर्गत चलाए जाएंगे (केवल Windows 10 और उससे उच्च वर्शन के लिए).</translation> +<translation id="7155226869555939647">हमेशा <ph name="APPLICATION" /> के लिए लिंक खोलें</translation> <translation id="7156235233373189579">फ़ाइल को Windows सॉफ़्टवेयर का उपयोग करने वाले पीसी के लिए डिज़ाइन किया गया है. यह आपके उस डिवाइस से संगत नहीं है जिस पर Chrome OS चल रहा है. कृपया उपयुक्त प्रतिस्थापना ऐप्स के लिए <ph name="BEGIN_LINK" />Chrome वेब स्टोर<ph name="END_LINK" /> खोजें.<ph name="BEGIN_LINK_HELP" />और जानें<ph name="END_LINK_HELP" /></translation> <translation id="7157063064925785854">जारी रखें क्लिक करके आप <ph name="LEGAL_DOC_LINK_TEXT_1" />, <ph name="LEGAL_DOC_LINK_TEXT_2" />, <ph name="LEGAL_DOC_LINK_TEXT_3" />, और <ph name="LEGAL_DOC_LINK_TEXT_4" /> से सहमति देते हैं.</translation> <translation id="7158238151765743968">"<ph name="DEVICE_NAME" />" से कनेक्शन अभी भी प्रगति में है.</translation> @@ -4594,6 +4599,7 @@ <translation id="7175353351958621980">यहां से लोड किया गया:</translation> <translation id="7180611975245234373">रीफ्रेश करें</translation> <translation id="7180865173735832675">कस्टमाइज़ करें</translation> +<translation id="7181387261278441780">साइट साफ़ करें और रीसेट करें</translation> <translation id="7185078796915954712">TLS 1.3</translation> <translation id="7185690883425432021">टैबस्ट्रिप के स्टैक मोड में होने पर निष्क्रिय टैब के बंद करने के बटन छिपाता है.</translation> <translation id="7186088072322679094">टूलबार में रखें</translation> @@ -4626,7 +4632,6 @@ <translation id="7223775956298141902">धत्... आपके पास कोई एक्सटेंशन नहीं है :-(</translation> <translation id="7224023051066864079">सबनेट मास्क:</translation> <translation id="7225179976675429563">नेटवर्क प्रकार गुम</translation> -<translation id="7230191962699768124">सभी, गैर-एनिमेटेड दिखाएं</translation> <translation id="7230787553283372882">अपने लेख का आकार कस्टमाइज़ करें</translation> <translation id="7231224339346098802">प्रिंट की जाने वाली प्रतियों की संख्या दर्शाने के लिए संख्या का उपयोग करें (1 या अधिक).</translation> <translation id="7238585580608191973">SHA-256 फ़िंगरप्रिंट</translation> @@ -4758,7 +4763,6 @@ <translation id="7409233648990234464">रीलॉन्च करें और पावरवॉश करें</translation> <translation id="7409836189476010449">Flash चलाएं</translation> <translation id="7410344089573941623">यदि <ph name="HOST" /> आपके कैमरे और माइक्रोफ़ोन को एक्सेस करना चाहे, तो पूछें</translation> -<translation id="7411343637221933631">{NUM_COOKIES,plural, =1{इस साइट से 1}one{इस साइट से #}other{इस साइट से #}}</translation> <translation id="7412226954991670867">GPU मेमोरी</translation> <translation id="7416362041876611053">अज्ञात नेटवर्क त्रुटि.</translation> <translation id="7417453074306512035">इथिओपियाई कीबोर्ड</translation> @@ -4880,6 +4884,7 @@ <translation id="756445078718366910">ब्राउज़र विंडो खोलें</translation> <translation id="7564847347806291057">प्रक्रिया समाप्त करें</translation> <translation id="7566723889363720618">F12</translation> +<translation id="7567314848159753396">कुकी <ph name="NAME" /></translation> <translation id="756809126120519699">साफ़ किया गया Chrome डेटा</translation> <translation id="7568790562536448087">अपडेट कर रहा है</translation> <translation id="7573172247376861652">बैटरी चार्ज</translation> @@ -4920,6 +4925,7 @@ <translation id="7626009897377900107">पासवर्ड जेनरेशन</translation> <translation id="7627262197844840899">यह साइट MasterCard स्वीकार नहीं करती.</translation> <translation id="7627790789328695202">ओह, <ph name="FILE_NAME" /> पहले से मौजूद है. उसका नाम बदलें और पुन: प्रयास करें.</translation> +<translation id="7628127343934101653">डिफ़ॉल्ट PDF व्यूअर ऐप्लिकेशन में PDF फ़ाइलें खोलें.</translation> <translation id="762917759028004464">वर्तमान में <ph name="BROWSER_NAME" /> डिफ़ॉल्ट ब्राउज़र है.</translation> <translation id="7629536005696009600">Android ऐप्लिकेशन के लिए संग्रहीत की गई प्रमाणिकता को संबंधित वेबसाइटों में भरे जाने की अनुमति दें.</translation> <translation id="7629827748548208700">टैब: <ph name="TAB_NAME" /></translation> @@ -5148,6 +5154,7 @@ <translation id="7957513156576779045">युग्मन की अनुमति देने के लिए ब्लूटूथ चालू करें</translation> <translation id="7957615753207896812">कीबोर्ड डिवाइस सेटिंग खोलें</translation> <translation id="7959074893852789871">फ़ाइल में एकाधिक प्रमाणपत्र थे, जिनमें से कुछ को आयात नहीं किया गया था:</translation> +<translation id="7959700692661109221"><ph name="BEGIN_PARAGRAPH" />Google की स्थान सेवा आपके डिवाइस के स्थान का अधिक तेज़ी से और अधिक सटीकता से अनुमान लगाने में सहायता करने के लिए वाई-फ़ाई जैसे स्रोतों का उपयोग करती है. जब आप Google की स्थान सेवाओं को चालू करते हैं, तो आपका डिवाइस ऐसे मोड में चला जाता है जो स्थान जानकारी देने के लिए वाई-फ़ाई का उपयोग करता है. आप इसे किसी भी समय स्थान सेटिंग में बंद कर सकते हैं.<ph name="END_PARAGRAPH" /></translation> <translation id="7961015016161918242">कभी नहीं</translation> <translation id="7964089325405904043">पासवर्ड आयात और निर्यात</translation> <translation id="7965010376480416255">साझा मेमोरी</translation> @@ -5298,6 +5305,7 @@ <translation id="8146793085009540321">प्रवेश करना विफल रहा. कृपया अपने व्यवस्थापक से संपर्क करें या पुन: प्रयास करें.</translation> <translation id="8148264977957212129">पिनयिन इनपुट पद्धति</translation> <translation id="8148913456785123871">Google नाओ कार्ड लॉन्चर में दिखाएं</translation> +<translation id="8150391391298684512">Windows Runtime MIDI API अक्षम करें</translation> <translation id="8151185429379586178">डेवलपर टूल</translation> <translation id="8151638057146502721">कॉन्फ़िगर करें</translation> <translation id="8151639108075998630">अतिथि ब्राउज़िंग सक्षम करें</translation> @@ -5578,6 +5586,7 @@ <translation id="8532294913309524834">अपनी प्राथमिकताओं के आधार पर भाषाएं क्रमित करें.</translation> <translation id="8535005006684281994">Netscape प्रमाणपत्र नवीकरण URL</translation> <translation id="8539727552378197395">नहीं (केवल Http)</translation> +<translation id="8541084862688000575">स्वचालित रूप से Android ऐप्लिकेशन लोड करें</translation> <translation id="8543181531796978784">आप <ph name="BEGIN_ERROR_LINK" />पहचान संबंधी समस्या की रिपोर्ट<ph name="END_ERROR_LINK" /> कर सकते हैं या यदि आप अपनी सुरक्षा से जुड़े जोखिमों को समझते हैं, तो <ph name="BEGIN_LINK" />इस असुरक्षित साइट पर जा<ph name="END_LINK" /> सकते हैं.</translation> <translation id="8545107379349809705">जानकारी छिपाएं...</translation> <translation id="8545211332741562162">प्रयोगात्मक JavaScript सुविधाओं का उपयोग करने के लिए वेब पृष्ठ सक्षम करें.</translation> @@ -5605,7 +5614,6 @@ <translation id="8569764466147087991">खोलने के लिए फ़ाइल को चुनें</translation> <translation id="8571032220281885258">जब आप "Ok Google" कहते हैं, तो Chrome वह खोजेगा जो आप आगे कहने वाले हैं.</translation> <translation id="8571108619753148184">सर्वर 4</translation> -<translation id="8572832761467613633">केवल Flash</translation> <translation id="8572981282494768930">साइटों को आपका कैमरा और माइक्रोफ़ोन एक्सेस न करने दें</translation> <translation id="8574234089711453001">मीडिया url वाले पृष्ठ को खोलते समय किसी डाउनलोड बटन को दिखाई देने की अनुमति दें.</translation> <translation id="857779305329188634">प्रयोगात्मक QUIC प्रोटोकॉल समर्थन को सक्षम करता है.</translation> @@ -5627,6 +5635,7 @@ <translation id="8600929685092827187">वेक ऑन पैकेट</translation> <translation id="8601206103050338563">TLS WWW क्लाइंट प्रमाणीकरण</translation> <translation id="8602851771975208551">आपके कंप्यूटर पर किसी अन्य प्रोग्राम ने ऐप्स जोड़ा है, जो Chrome के काम करने के तरीके को बदल सकता है.</translation> +<translation id="8603912787021349466">Android ऐप्लिकेशन को प्रवेश करने के बाद स्वचालित रूप से शुरू होने की अनुमति दें.</translation> <translation id="8605428685123651449">SQLite मेमोरी</translation> <translation id="8605503133013456784">"<ph name="DEVICE_NAME" />" से डिस्कनेक्ट करने और अयुग्मित करने में विफल.</translation> <translation id="8606726445206553943">अपने MIDI डिवाइस का उपयोग करें</translation> @@ -5979,6 +5988,7 @@ <translation id="9053965862400494292">समन्वयन सेट अप करने का प्रयास करते समय एक त्रुटि आई.</translation> <translation id="9056034633062863292">Chromebox अपडेट करना</translation> <translation id="9056810968620647706">कोई मिलान नहीं मिले.</translation> +<translation id="9057119625587205566">आस-पास कोई प्रिंटर नहीं</translation> <translation id="9059868303873565140">स्थिति मेनू</translation> <translation id="9064142312330104323">Google प्रोफ़ाइल फ़ोटो (लोड हो रहा है)</translation> <translation id="9064275926664971810">फ़ॉर्म को एक ही क्लिक में भरने के लिए स्वत: भरण सक्षम करें</translation> @@ -5989,6 +5999,7 @@ <translation id="9067401056540256169">यह फ़्लैग Chrome को असुरक्षित बनाता है. इसका उपयोग केवल तभी करें जब आपको यह पता हो कि यह क्या करता है. ध्यान दें कि इस फ़्लैग को बिना किसी सूचना के निकाला जा सकता है. सक्षम होने पर, https मूल वाले फ़्रेम असुरक्षित URL के साथ WebSockets का उपयोग कर सकते हैं (ws://).</translation> <translation id="9068931793451030927">पथ:</translation> <translation id="9070219033670098627">व्यक्ति स्विच करें</translation> +<translation id="9070940116164932228">महंगे पृष्ठभूमि टाइमर नियंत्रित करें</translation> <translation id="907148966137935206">किसी भी साइट को पॉप-अप दिखाने की अनुमति न दें (सुझाये गये) </translation> <translation id="9072550133391925347"><ph name="PASSWORD_MANAGER_BRAND" /> आपके द्वारा सहेजे गए पासवर्ड से आपको योग्य साइट और ऐप्स में अपने आप प्रवेश करा देता है.</translation> <translation id="9073281213608662541">PAP</translation> @@ -6022,6 +6033,7 @@ <translation id="9112614144067920641">कृपया नया पिन चुनें.</translation> <translation id="9112748030372401671">अपना वॉलपेपर बदलें</translation> <translation id="9112987648460918699">ढूंढें ...</translation> +<translation id="9114663181201435112">आसानी से प्रवेश करें</translation> <translation id="9115487443206954631">कास्ट डिवाइस प्रबंधित करें</translation> <translation id="9115675100829699941">&बुकमार्क</translation> <translation id="9121814364785106365">छोटे टैब के रूप में खोलें</translation> @@ -6116,7 +6128,6 @@ <translation id="952992212772159698">सक्रिय नहीं किया गया</translation> <translation id="960719561871045870">ऑपरेटर कोड</translation> <translation id="960987915827980018">लगभग 1 घंटा शेष है</translation> -<translation id="962778376131245616">केवल गैर-सुरक्षित, एनिमेटेड दिखाएं</translation> <translation id="96421021576709873">वाई-फ़ाई नेटवर्क</translation> <translation id="965490406356730238">जहां उपलब्ध हो वहां कैप्चर की गई फ़्रेम के लिए हार्डवेयर-त्वरित mjpeg डीकोड सक्षम करें.</translation> <translation id="968174221497644223">अनुप्रयोग संचय</translation>
diff --git a/chrome/app/resources/generated_resources_hr.xtb b/chrome/app/resources/generated_resources_hr.xtb index 936688d..2a4c262 100644 --- a/chrome/app/resources/generated_resources_hr.xtb +++ b/chrome/app/resources/generated_resources_hr.xtb
@@ -18,7 +18,6 @@ <translation id="1029317248976101138">Zumiranje</translation> <translation id="1029595648591494741">Želite li isprobati "<ph name="EXTENSION_NAME" />?</translation> <translation id="1031362278801463162">Učitavanje pregleda</translation> -<translation id="1031460590482534116">Došlo je do pogreške tijekom pokušaja pohranjivanja klijentskog certifikata. Pogreška <ph name="ERROR_NUMBER" /> (<ph name="ERROR_NAME" />).</translation> <translation id="1031573127485938293">Traži (na temelju pravila)</translation> <translation id="103279545524624934">Oslobodite prostor na disku da biste pokrenuli Android aplikacije.</translation> <translation id="1033780634303702874">pristupiti vašim serijski spojenim uređajima</translation> @@ -101,6 +100,7 @@ <translation id="1128591060186966949">Uređivanje tražilice</translation> <translation id="1128987120443782698">Uređaj za pohranu ima kapacitet <ph name="DEVICE_CAPACITY" />. Umetnite SD karticu ili USB memorijski privjesak kapaciteta od najmanje 4GB.</translation> <translation id="1137135726305341424">DOMContentLoaded i učitavanja svih resursa započela su prije događaja DOMContentLoaded (glavni okvir i iframeovi istog porijekla).</translation> +<translation id="1138663153846032155">Preferiraj HTML u odnosu na Flash</translation> <translation id="1140351953533677694">pristupiti vašim Bluetooth i serijski spojenim uređajima</translation> <translation id="114140604515785785">Kor. direktorij prošir.</translation> <translation id="1143142264369994168">Potpisnik certifikata</translation> @@ -252,6 +252,7 @@ <translation id="1351692861129622852">Uvoz datoteka (<ph name="FILE_COUNT" />)...</translation> <translation id="1352103415082130575">tajska tipkovnica (pattachote)</translation> <translation id="1353686479385938207"><ph name="PROVIDER_NAME" />: <ph name="NETWORK_NAME" /></translation> +<translation id="1353946958707294039">Upravitelj pohrane materijalnog dizajna</translation> <translation id="1353966721814789986">Početne stranice</translation> <translation id="1354868058853714482">Adobe Reader je zastario i može biti nesiguran.</translation> <translation id="1355408554203439639">3D softverski rasterizator</translation> @@ -423,7 +424,6 @@ <translation id="1533920822694388968">Poravnjanje TV-a</translation> <translation id="15373452373711364">Veliki pokazivač miša</translation> <translation id="1543284117603151572">Uvezeno iz Edgea</translation> -<translation id="1544350195767834591">{NUM_COOKIES,plural, =1{1 s drugih web-lokacija}one{# s drugih web-lokacija}few{# s drugih web-lokacija}other{# s drugih web-lokacija}}</translation> <translation id="1545177026077493356">Automatski način kioska</translation> <translation id="1545786162090505744">URL s %s na mjestu upita</translation> <translation id="1546280085599573572">Ovo proširenje promijenilo je stranicu koja se prikazuje kada se klikne gumb Početna.</translation> @@ -447,7 +447,6 @@ <translation id="1559235587769913376">Unos Unicode znakova</translation> <translation id="1561092721008294962">HarfBuzz za tekst sučelja</translation> <translation id="1566049601598938765">Web-lokacija</translation> -<translation id="1566958206723629112">Flash i PDF</translation> <translation id="1567723158593978621">Kada je to omogućeno, za prijavu na preglednik upotrebljavat će se novi tijek prijave s odvojenom zaporkom usluge GAIA.</translation> <translation id="1567993339577891801">Konzola JavaScripta</translation> <translation id="1568323446248056064">Otvorite postavke zaslona na uređaju</translation> @@ -576,7 +575,6 @@ <translation id="1723940674997333416">Dopuštanje nesigurnog WebSocketa s https izvora</translation> <translation id="1725149567830788547">Prikaži &kontrole</translation> <translation id="172612876728038702">Modul pouzdane platforme se postavlja. Molimo za strpljenje; ovo može potrajati nekoliko minuta.</translation> -<translation id="1727135806684246609">Opširan opis sigurnosti za materijalni dizajn</translation> <translation id="1729533290416704613">Upravlja i time koja se stranica prikazuje prilikom pretraživanja putem višenamjenskog okvira.</translation> <translation id="1731346223650886555">Točka-zarez</translation> <translation id="1731589410171062430">Ukupno: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /> (<ph name="NUMBER_OF_PAGES" /> <ph name="PAGE_OR_PAGES_LABEL" />)</translation> @@ -872,6 +870,7 @@ <translation id="218492098606937156">Omogući događaje dodira</translation> <translation id="2187317261103489799">Otkrij (zadano)</translation> <translation id="2187895286714876935">Pogreška pri uvozu Certifikata poslužitelja</translation> +<translation id="2188881192257509750">Otvori aplikaciju <ph name="APPLICATION" /></translation> <translation id="2190069059097339078">Dohvaćanje vjerodajnica za Wi-Fi</translation> <translation id="219008588003277019">Modul Native Client: <ph name="NEXE_NAME" /></translation> <translation id="2190355936436201913">(prazno)</translation> @@ -990,6 +989,7 @@ <translation id="2326606747676847821">Anonimni način</translation> <translation id="2326931316514688470">&Ponovo učitaj aplikaciju</translation> <translation id="2327492829706409234">Omogući aplikaciju</translation> +<translation id="2328054044222305089">Time će se izbrisati svi podaci koje je web-lokacija <ph name="SITE" /> pohranila na vašem uređaju i poništit će se sva dopuštenja koja ste odobrili. Želite li nastaviti?</translation> <translation id="2329597144923131178">Prijavite se da biste imali svoje oznake, povijest, zaporke i druge postavke na svim svojim uređajima.</translation> <translation id="2332131598580221120">Prikaži u Web-trgovini</translation> <translation id="2332742915001411729">Vrati na zadano</translation> @@ -1265,7 +1265,6 @@ <translation id="2675358154061544447">Vrlo eksperimentalna podrška za generiranje iframeova za više web-lokacija u zasebnim procesima. U tom načinu dokumenti dijele proces generiranja samo ako potječu s iste web-lokacije.</translation> <translation id="2676946222714718093">Reprodukcija na uređaju</translation> <translation id="2678063897982469759">Ponovo omogući</translation> -<translation id="2678246812096664977">Svi dodaci</translation> <translation id="2679385451463308372">Ispiši upotrebom dijaloga sustava...</translation> <translation id="2680208403056680091">Internetskom vezom upravlja proširenje</translation> <translation id="268053382412112343">Hi&story (Povijest)</translation> @@ -1439,7 +1438,6 @@ <translation id="287286579981869940">Dodaj davatelja usluge <ph name="PROVIDER_NAME" />...</translation> <translation id="2872961005593481000">Isključi</translation> <translation id="2875698561019555027">(Chromeove stranice pogrešaka)</translation> -<translation id="2879560882721503072">Certifikat klijenta koji je izdao <ph name="ISSUER" /> uspješno je spremljen.</translation> <translation id="288024221176729610">Češki</translation> <translation id="288042212351694283">Pristupite svojim Universal 2nd Factor uređajima</translation> <translation id="2881966438216424900">Posljednji pristup:</translation> @@ -1588,6 +1586,7 @@ <translation id="3057861065630527966">Izrada sigurnosnih kopija fotografija i videozapisa</translation> <translation id="3058212636943679650">Ako ćete ikad trebati oporaviti operativni sustav računala, bit će vam potrebna SD kartica ili USB memorijski privjesak za oporavak sustava.</translation> <translation id="305932878998873762">Jednostavna predmemorija za HTTP nova je predmemorija. Prostor na disku dodjeljuje se putem datotečnog sustava.</translation> +<translation id="3060251871394327123">Time će se izbrisati svi podaci koje je web-lokacija <ph name="SITE" /> pohranila na vašem uređaju. Želite li nastaviti?</translation> <translation id="3061650404498811439">Omogućuje pristup emojijima, unosu rukopisom i glasovnom unosu s dodatnog izbornika IME-a.</translation> <translation id="3062606427884046423">Upotrebljavaju se obavijesti Android MediaStyle za Chromeove obavijesti o medijskim sadržajima.</translation> <translation id="3063844757726132584">Pristupajte svim svojim aplikacijama iz ovog praktičnog pokretača. Igrajte igre, sudjelujte u videochatovima, slušajte glazbu, uređujte dokumente ili preuzmite još aplikacija.</translation> @@ -1637,6 +1636,7 @@ <translation id="3123569374670379335">(Pod nadzorom)</translation> <translation id="3124111068741548686">Rukuje USER</translation> <translation id="3126026824346185272">Ctrl</translation> +<translation id="3127156390846601284">Time će se izbrisati svi podaci pohranjeni na vašem uređaju za sve prikazane web-lokacije. Želite li nastaviti?</translation> <translation id="312759608736432009">Proizvođač uređaja:</translation> <translation id="3127919023693423797">Autentikacija...</translation> <translation id="3128230619496333808">Kartica 6</translation> @@ -1735,7 +1735,6 @@ <translation id="3264544094376351444">Font Sans-serif</translation> <translation id="3264547943200567728">Postavljanje mreže za Chromebox nije uspjelo</translation> <translation id="3265459715026181080">Zatvori prozor</translation> -<translation id="3267271790328635957">Samo PDF</translation> <translation id="3267726687589094446">Nastavi dozvoljavati automatska preuzimanja više datoteka</translation> <translation id="3267998849713137817">Vrijeme izmjene</translation> <translation id="3268451620468152448">Otvorene kartice</translation> @@ -1981,6 +1980,7 @@ <translation id="3574210789297084292">prijava</translation> <translation id="3574305903863751447"><ph name="CITY" />, <ph name="STATE" /> <ph name="COUNTRY" /></translation> <translation id="357479282490346887">Litavski</translation> +<translation id="3575927481544652747">Onemogućuje Windows Runtime MIDI API za WebMIDI koji je prema zadanim postavkama omogućen na Windowsima 10 ili novijim verzijama.</translation> <translation id="3576324189521867626">Uspješno instalirano</translation> <translation id="3578331450833904042">Zadano (sluša se sve)</translation> <translation id="3578594933904494462">Sadržaj ove kartice dijeli se.</translation> @@ -2034,8 +2034,6 @@ <translation id="3627320433825461852">Preostalo je manje od 1 minute</translation> <translation id="3627588569887975815">Otvori vezu u anonimnom prozoru</translation> <translation id="3627671146180677314">Vrijeme za obnavljanje Netscape certifikata</translation> -<translation id="3629326610814700057">Omogućuje upravitelju pohrane da upravlja lokalnom pohranom.</translation> -<translation id="3630337581925712713"><ph name="PERMISSION_TYPE_LABEL" />:</translation> <translation id="3631337165634322335">Donji izuzeci odnose se samo na trenutnu anonimnu sesiju.</translation> <translation id="3633586230741134985">Postavke pokretača aplikacija</translation> <translation id="3633997706330212530">Možete onemogućiti ove usluge.</translation> @@ -2058,7 +2056,8 @@ <translation id="3654045516529121250">čitati postavke pristupačnosti</translation> <translation id="3654092442379740616">Pogreška u sinkronizaciji: proizvod <ph name="PRODUCT_NAME" /> zastario je i treba ga ažurirati.</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{Ima trajni pristup jednoj datoteci.}one{Ima trajni pristup # datoteci.}few{Ima trajni pristup do # datoteke.}other{Ima trajni pristup do # datoteka.}}</translation> -<translation id="3657468915905674858">Omogući PPAPI Win32k Lockdown.</translation> +<translation id="365793796291733849"><ph name="BEGIN_PARAGRAPH1" />Kada uključite automatsku izradu sigurnosnih kopija, podaci uređaja i aplikacija periodički se spremaju u privatnu mapu na Google disku. Podaci aplikacije mogu biti bilo koji podaci koje je aplikacija spremila (na temelju postavki razvojnog programera), uključujući potencijalno osjetljive podatke kao što su kontakti, poruke i fotografije.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Podaci sigurnosnih kopija neće se ubrajati u vašu kvotu pohrane na Disku. Velike datoteke ili datoteke koje su razvojni programeri isključili iz te usluge neće se sigurnosno kopirati.<ph name="END_PARAGRAPH2" /></translation> <translation id="3660234220361471169">Nepouzdano</translation> <translation id="3665589677786828986">Chrome je otkrio da je neki drugi program promijenio vaše postavke, pa ih je vratio na izvorne zadane vrijednosti.</translation> <translation id="3665842570601375360">Sigurnost:</translation> @@ -2113,6 +2112,7 @@ <translation id="3733127536501031542">SSL poslužitelj s iskorakom</translation> <translation id="3736520371357197498">Ako ste svjesni sigurnosnih rizika, možete <ph name="BEGIN_LINK" />posjetiti tu nesigurnu web-lokaciju<ph name="END_LINK" /> prije uklanjanja opasnih programa.</translation> <translation id="3738924763801731196"><ph name="OID" />:</translation> +<translation id="3739254215541673094">Želite li otvoriti aplikaciju <ph name="APPLICATION" />?</translation> <translation id="3739798227959604811">Odgoda prije ponavljanja:</translation> <translation id="3741158646617793859"><ph name="DEVICE_NAME" /> sada će se pojaviti na konzoli administratora</translation> <translation id="3741243925913727067">Izrada sigurnosnih kopija fotografija i videozapisa s medijskog uređaja na Google disku.</translation> @@ -2351,7 +2351,6 @@ <translation id="4058793769387728514">Odmah provjeri dokument</translation> <translation id="4059285154003114015">&Ispis okvira...</translation> <translation id="406070391919917862">Aplikacije u pozadini</translation> -<translation id="4061502419206152498">Prikaži samo nesigurne, bez animacije</translation> <translation id="4062251648694601778">Uživajte u uređaju <ph name="SHORT_PRODUCT_NAME" />. Imate li pitanja? Možete dobiti pomoć u svakom trenutku, samo kliknite "?" na traci statusa.</translation> <translation id="4065876735068446555">Mreža koju upotrebljavate (<ph name="NETWORK_ID" />) može zahtijevati posjet stranici za prijavu.</translation> <translation id="4068506536726151626">Ova stranica sadrži elemente sa sljedećih web-lokacija koje prate vašu lokaciju:</translation> @@ -2390,7 +2389,6 @@ <translation id="4101878899871018532">Upravitelj zaporki neće nuditi spremanje vjerodajnice upotrijebljene za sinkroniziranje.</translation> <translation id="410351446219883937">Automatska reprodukcija</translation> <translation id="4104163789986725820">I&zvoz...</translation> -<translation id="4105523032910086267">Postavlja animaciju i vidljivost opširnog opisa sigurnosti za materijalni dizajn.</translation> <translation id="4105563239298244027">Dobijte 1 TB besplatne pohrane na Google disku</translation> <translation id="4109135793348361820">Premjesti prozor korisniku <ph name="USER_NAME" /> (<ph name="USER_EMAIL" />)</translation> <translation id="4110342520124362335">Blokirani su kolačići s web-mjesta <ph name="DOMAIN" />.</translation> @@ -2441,6 +2439,7 @@ <translation id="418179967336296930">Ruska fonetska (YaZHert) tipkovnica</translation> <translation id="4181841719683918333">Jezici</translation> <translation id="4187248015940562149">Omogućuje Web Bluetooth koji bi mogao omogućiti web-lokacijama povezivanje s Bluetooth uređajima u vašoj blizini i upravljanje njima.</translation> +<translation id="4188447344915957833">Omogućuje upravitelj pohrane u postavkama materijalnog dizajna.</translation> <translation id="4189406272289638749">Proširenje <b><ph name="EXTENSION_NAME" /></b> upravlja ovom postavkom.</translation> <translation id="4193154014135846272">Googleov dokument</translation> <translation id="4193182321948161343">Omogući upravitelja korisnika Materijalnog dizajna</translation> @@ -2648,6 +2647,7 @@ <translation id="4508765956121923607">Pogledaj i&zvor</translation> <translation id="4509017836361568632">Odbaci fotografiju</translation> <translation id="4509345063551561634">Lokacija:</translation> +<translation id="4513946894732546136">Povratne informacije</translation> <translation id="4514542542275172126">Postavite novog nadziranog korisnika</translation> <translation id="4514914692061505365">Nametni upotrebu PNaClovog brzog prevoditelja Subzero za sve pexe datoteke.</translation> <translation id="451515744433878153">Ukloni</translation> @@ -2746,6 +2746,7 @@ <translation id="4656293982926141856">Ovo računalo</translation> <translation id="4656631038341342120">Omogućuje se VR maska ako je dostupna za uređaj.</translation> <translation id="4657031070957997341">Uvijek dopusti dodatke na <ph name="HOST" /></translation> +<translation id="466008749075469935">Omogućuje intervenciju da bi se pozadinskim tajmerima upotreba procesora ograničila na 1%.</translation> <translation id="4663254525753315077">Kada je to moguće, stavlja sadržaj dodatnog pomičnog elementa na složeni sloj radi bržeg pomicanja.</translation> <translation id="4664482161435122549">Pogreška pri izvozu PKCS #12</translation> <translation id="4665014895760275686">Proizvođač</translation> @@ -2814,6 +2815,7 @@ <translation id="4749157430980974800">Gruzijska tipkovnica</translation> <translation id="4750394297954878236">Prijedlozi</translation> <translation id="475088594373173692">Prvi korisnik</translation> +<translation id="4750892496809949692">Preferiraj HTML sadržaj tako što se Flash neće prikazivati na popisu dodataka.</translation> <translation id="4750917950439032686">Vaši podaci (na primjer, zaporke i brojevi kreditnih kartica) privatni su kada se šalju na tu web-lokaciju.</translation> <translation id="4753602155423695878">Animacija trake napretka učitavanja stranice na Android telefonu</translation> <translation id="4755240240651974342">Finska tipkovnica</translation> @@ -3088,6 +3090,7 @@ <translation id="5119450342834678097">Opcija zahtjeva za web-lokaciju za tablete u izborniku postavki.</translation> <translation id="5120068803556741301">Način unosa treće strane</translation> <translation id="5120421890733714118">Vjeruj ovom certifikatu za identificiranje web-lokacija.</translation> +<translation id="5120516977819314347">PIN ili zaporka nisu točni.</translation> <translation id="5121130586824819730">Vaš je tvrdi disk pun. Spremite na neku drugu lokaciju ili oslobodite prostor na tvrdom disku.</translation> <translation id="5125751979347152379">Nevažeći URL.</translation> <translation id="5127881134400491887">upravljati mrežnim vezama</translation> @@ -3095,6 +3098,7 @@ <translation id="512903556749061217">povezano</translation> <translation id="5129301143853688736">Vaša veza s tom web-lokacijom nije privatna. Napadači možda pokušavaju ukrasti vaše podatke (na primjer, fotografije, zaporke, poruke i brojeve kreditnih kartica) s <ph name="DOMAIN" />.</translation> <translation id="5129662217315786329">Poljski</translation> +<translation id="5131347545782851480">PDF dokumenti</translation> <translation id="5134856901811723984">Materijalni dizajn u korisničkom sučelju OS-a Chrome</translation> <translation id="5135533361271311778">Nije bilo moguće stvoriti oznaku.</translation> <translation id="5136529877787728692">F7</translation> @@ -3263,6 +3267,7 @@ <translation id="5328031682234198929">8</translation> <translation id="5329858601952122676">&Obriši</translation> <translation id="5330145655348521461">Ove su datoteke otvorene na drugoj radnoj površini. Prebacite se na korisnika <ph name="USER_NAME" /> (<ph name="MAIL_ADDRESS" />) da biste ih vidjeli.</translation> +<translation id="5330512191124428349">Dohvati informacije</translation> <translation id="5332624210073556029">Vremenska zona:</translation> <translation id="5333807720589685258">SIM kartica trajno će se onemogućiti ako ne unesete točan ključ za otključavanje PIN-a.</translation> @@ -3695,7 +3700,6 @@ <translation id="5892507820957994680">Nadjačava ugrađeni popis izvođenja softvera i omogućuje GPU ubrzanje na nepodržanim konfiguracijama sustava.</translation> <translation id="5895138241574237353">Ponovno pokreni</translation> <translation id="5895187275912066135">Izdano</translation> -<translation id="5898154795085152510">Poslužitelj je vratio nevažeći klijentski certifikat. Pogreška <ph name="ERROR_NUMBER" /> (<ph name="ERROR_NAME" />).</translation> <translation id="5900302528761731119">Fotografija Google profila</translation> <translation id="590253956165195626">Ponudi prijevod stranica koje nisu na jeziku koji čitam.</translation> <translation id="5904093760909470684">Konfiguracija proxyja</translation> @@ -3750,6 +3754,8 @@ <translation id="5984222099446776634">Nedavno posjećeno</translation> <translation id="5984814259619230127">Smart Lock za otkrivanje putem Bluetooth Low Energyja</translation> <translation id="5986245990306121338">Ako je to omogućeno, prekidač za prebacivanje između kartica prikazivat će se i ako je uključena opcija "Spoji kartice i aplikacije" u postavkama.</translation> +<translation id="5989712527536636369"><ph name="BEGIN_PARAGRAPH1" />To su opće informacije o vašem uređaju i načinu na koji ga upotrebljavate, na primjer razina baterije, koliko često upotrebljavate aplikacije, kvaliteta i trajanje mrežnih veza (kao što su Wi-Fi i Bluetooth) te izvješća o rušenju programa kada stvari ne funkcioniraju kako treba. Upotrebljavat će se za poboljšanje Googleovih proizvoda i usluga za sve korisnike. Neki skupni podaci pomoći će i partnerima, na primjer razvojnim programerima Androida, da poboljšaju svoje aplikacije i proizvode.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Tu značajku možete uključiti ili isključiti u bilo kojem trenutku u postavkama Android aplikacija. Ne utječe na mogućnost uređaja da šalje informacije koje su mu potrebne za primanje bitnih usluga, kao što su ažuriranja sustava i sigurnost.<ph name="END_PARAGRAPH2" /></translation> <translation id="5990198433782424697">Proširenja na URL-ovima chrome://</translation> <translation id="5990814808592353318">Ručno generiranje zaporke.</translation> <translation id="5991049340509704927">Uvećanje</translation> @@ -3763,6 +3769,7 @@ <translation id="6005695835120147974">Usmjerivač medija</translation> <translation id="6007237601604674381">Premještanje nije uspjelo. <ph name="ERROR_MESSAGE" /></translation> <translation id="6008241731410823808">Šalje pingove za provjeru hiperveze.</translation> +<translation id="6011449291337289699">Brisanje podataka web-lokacija</translation> <translation id="6015796118275082299">Godina</translation> <translation id="6016551720757758985">Potvrda Powerwasha uz povratak na prethodnu verziju</translation> <translation id="6016809788585079594">Recite "OK Google" još samo jedanput</translation> @@ -3952,7 +3959,6 @@ <translation id="6276301056778294989">Provjerite je li na uređaju prikazana ista šifra.</translation> <translation id="6277105963844135994">Privremeni prekid mreže</translation> <translation id="6277518330158259200">I&zradi snimku zaslona</translation> -<translation id="6278428485366576908">Tema</translation> <translation id="6279183038361895380">Pritisnite |<ph name="ACCELERATOR" />| da bi se prikazao pokazivač</translation> <translation id="6280215091796946657">Prijavite se drugim računom</translation> <translation id="6280912520669706465">ARC</translation> @@ -4204,6 +4210,7 @@ <translation id="6607272825297743757">Informacije o datoteci</translation> <translation id="6607831829715835317">Više a&lata</translation> <translation id="6608140561353073361">Svi kolačići i podaci o web-lokaciji...</translation> +<translation id="6610183966322615106">Pogreška prilikom dodavanja pisača</translation> <translation id="6610610633807698299">Unesite URL...</translation> <translation id="6612358246767739896">Zaštićeni sadržaj</translation> <translation id="6615455863669487791">Pokaži mi</translation> @@ -4267,7 +4274,6 @@ <translation id="6708242697268981054">Porijeklo:</translation> <translation id="6709357832553498500">Poveži pomoću proširenja <ph name="EXTENSIONNAME" /></translation> <translation id="6710213216561001401">Prethodno</translation> -<translation id="6712158998835983046">Prikaži sve, animirano</translation> <translation id="6718273304615422081">Komprimiranje...</translation> <translation id="671928215901716392">Zaključaj zaslon</translation> <translation id="6721972322305477112">&File (Datoteka)</translation> @@ -4538,7 +4544,6 @@ <translation id="7088434364990739311">Nije uspjelo pokretanje ažuriranja (kôd pogreške <ph name="ERROR" />).</translation> <translation id="708856090370082727">Omogućuje podršku za pomicanje preko ruba za OSK. Ako je uključeno, OSK će promijeniti samo veličinu početnog prikaza.</translation> <translation id="7088674813905715446">Administrator je postavio uređaj u stanje uklonjenog pristupa. Da biste omogućili njegovu prijavu, zamolite administratora da postavi uređaj u stanje na čekanju.</translation> -<translation id="7089609847854449639">Upravitelj pohrane</translation> <translation id="708969677220991657">Omogućuje zahtjeve lokalnom hostu putem HTTPS-a čak i kada se pruži nevažeći certifikat.</translation> <translation id="7092106376816104">Iznimke za skočne prozore</translation> <translation id="7093866338626856921">razmjenjivati podatke s uređajima naziva: <ph name="HOSTNAMES" /></translation> @@ -4578,7 +4583,7 @@ <translation id="715118844758971915">Klasični pisači</translation> <translation id="7154130902455071009">promijeniti vašu početnu stranicu u: <ph name="START_PAGE" /></translation> <translation id="7155171745945906037">Postojeća fotografija s fotoaparata ili iz datoteke</translation> -<translation id="715568033737470079">Navode se PPAPI dodaci koji će se pokrenuti u okviru pravila zaključavanja testnog okruženja za Win32k (samo Windows 10 i novije verzije).</translation> +<translation id="7155226869555939647">Uvijek otvaraj veze za <ph name="APPLICATION" /></translation> <translation id="7156235233373189579">Ova datoteka predviđena je za računalo koje upotrebljava Windows softver. Nije kompatibilna s vašim uređajem koji radi na Chrome OS-u. Potražite odgovarajuću zamjensku datoteku u <ph name="BEGIN_LINK" />Chrome web-trgovini<ph name="END_LINK" />.<ph name="BEGIN_LINK_HELP" />Saznajte više<ph name="END_LINK_HELP" /></translation> <translation id="7157063064925785854">Klikom na Nastavi prihvaćate sljedeće: <ph name="LEGAL_DOC_LINK_TEXT_1" />, <ph name="LEGAL_DOC_LINK_TEXT_2" />, <ph name="LEGAL_DOC_LINK_TEXT_3" /> i <ph name="LEGAL_DOC_LINK_TEXT_4" />.</translation> <translation id="7158238151765743968">Povezivanje s uređajem "<ph name="DEVICE_NAME" />" još je u tijeku.</translation> @@ -4593,6 +4598,7 @@ <translation id="7175353351958621980">Učitano iz:</translation> <translation id="7180611975245234373">Osvježi</translation> <translation id="7180865173735832675">Prilagodi</translation> +<translation id="7181387261278441780">Brisanje i poništavanje web-lokacija</translation> <translation id="7185078796915954712">TLS 1.3</translation> <translation id="7185690883425432021">Gumbi za zatvaranje skrivaju se kada je vrpca kartica u načinu nizanja.</translation> <translation id="7186088072322679094">Zadrži na alatnoj traci</translation> @@ -4625,7 +4631,6 @@ <translation id="7223775956298141902">Nažalost... nemate proširenja :-(</translation> <translation id="7224023051066864079">Maska podmreže:</translation> <translation id="7225179976675429563">Nedostaje vrsta mreže</translation> -<translation id="7230191962699768124">Prikaži sve neanimirano</translation> <translation id="7230787553283372882">Prilagodba veličine teksta</translation> <translation id="7231224339346098802">Upotrijebite broj kako biste odredili broj primjeraka za ispis (1 ili više).</translation> <translation id="7238585580608191973">SHA-256 otisak prsta</translation> @@ -4756,7 +4761,6 @@ <translation id="7409233648990234464">Pokreni ponovo i izvrši Powerwash</translation> <translation id="7409836189476010449">pokrenuti Flash</translation> <translation id="7410344089573941623">Pitaj ako <ph name="HOST" /> želi pristupiti kameri i mikrofonu</translation> -<translation id="7411343637221933631">{NUM_COOKIES,plural, =1{1 s te web-lokacije}one{# s te web-lokacije}few{# s te web-lokacije}other{# s te web-lokacije}}</translation> <translation id="7412226954991670867">Memorija grafičkog procesora</translation> <translation id="7416362041876611053">Nepoznata mrežna pogreška.</translation> <translation id="7417453074306512035">etiopska tipkovnica</translation> @@ -4878,6 +4882,7 @@ <translation id="756445078718366910">Otvori prozor preglednika</translation> <translation id="7564847347806291057">Završi proces</translation> <translation id="7566723889363720618">F12</translation> +<translation id="7567314848159753396">Kolačić: <ph name="NAME" /></translation> <translation id="756809126120519699">Chromeovi su podaci izbrisani</translation> <translation id="7568790562536448087">Ažuriranje stavke</translation> <translation id="7573172247376861652">Punjenje baterije</translation> @@ -4918,6 +4923,7 @@ <translation id="7626009897377900107">Generiranje zaporke</translation> <translation id="7627262197844840899">Ova web-lokacija ne prihvaća MasterCard.</translation> <translation id="7627790789328695202">Ups, stavka <ph name="FILE_NAME" /> već postoji. Preimenujte je i pokušajte ponovo.</translation> +<translation id="7628127343934101653">Otvori PDF datoteke u zadanoj aplikaciji preglednika PDF-ova.</translation> <translation id="762917759028004464">Zadani preglednik trenutno je <ph name="BROWSER_NAME" />.</translation> <translation id="7629536005696009600">Dopuštanje popunjavanja pohranjenih vjerodajnica za Androidove aplikacije na odgovarajućim web-lokacijama.</translation> <translation id="7629827748548208700">Kartica: <ph name="TAB_NAME" /></translation> @@ -5146,6 +5152,7 @@ <translation id="7957513156576779045">Uključite Bluetooth da biste omogućili uparivanje</translation> <translation id="7957615753207896812">Otvorite postavke tipkovnice na uređaju</translation> <translation id="7959074893852789871">Datoteka je sadržavala više certifikata, a neki od njih nisu uvezeni:</translation> +<translation id="7959700692661109221"><ph name="BEGIN_PARAGRAPH" />Googleova usluga lokacije upotrebljava izvore kao što je Wi‑Fi za bržu i precizniju procjenu lokacije vašeg uređaja. Kada uključite Googleove usluge lokacije, vaš uređaj prelazi na način rada koji upotrebljava Wi-Fi za pružanje podataka o lokaciji. To možete isključiti u postavkama lokacije kada god želite.<ph name="END_PARAGRAPH" /></translation> <translation id="7961015016161918242">Nikad</translation> <translation id="7964089325405904043">Uvoz i izvoz zaporki</translation> <translation id="7965010376480416255">Dijeljena memorija</translation> @@ -5296,6 +5303,7 @@ <translation id="8146793085009540321">Prijava nije uspjela. Obratite se administratoru ili pokušajte ponovo.</translation> <translation id="8148264977957212129">Pinyin način unosa</translation> <translation id="8148913456785123871">Prikaži kartice Google Nowa na pokretaču</translation> +<translation id="8150391391298684512">Onemogući Windows Runtime MIDI API</translation> <translation id="8151185429379586178">Alati za razvojne programere</translation> <translation id="8151638057146502721">Konfiguracija</translation> <translation id="8151639108075998630">Omogući pregledavanje za gosta</translation> @@ -5576,6 +5584,7 @@ <translation id="8532294913309524834">Poredajte jezike prema svojim preferencijama.</translation> <translation id="8535005006684281994">URL za obnavljanje Netscape certifikata</translation> <translation id="8539727552378197395">Ne (samo http)</translation> +<translation id="8541084862688000575">Automatski učitaj Android aplikacije</translation> <translation id="8543181531796978784">Možete <ph name="BEGIN_ERROR_LINK" />prijaviti problem s otkrivanjem<ph name="END_ERROR_LINK" /> ili, ako razumijete na koje je načine ugrožena vaša sigurnost, <ph name="BEGIN_LINK" />posjetite nesigurnu web-lokaciju<ph name="END_LINK" />.</translation> <translation id="8545107379349809705">Sakrij podatke...</translation> <translation id="8545211332741562162">Omogućavanje web-stranica za upotrebu eksperimentalnih značajki JavaScripta.</translation> @@ -5603,7 +5612,6 @@ <translation id="8569764466147087991">Odaberite datoteku za otvaranje</translation> <translation id="8571032220281885258">Kada kažete "Ok Google", Chrome će potražiti ono što sljedeće izgovorite.</translation> <translation id="8571108619753148184">4. poslužitelj</translation> -<translation id="8572832761467613633">Samo Flash</translation> <translation id="8572981282494768930">Ne dopuštaj web-lokacijama pristup mojoj kameri i mikrofonu</translation> <translation id="8574234089711453001">Omogućuje prikaz gumba za preuzimanje pri otvaranju stranice s URL-om medijskog sadržaja.</translation> <translation id="857779305329188634">Omogući podršku eksperimentalnog QUIC protokola.</translation> @@ -5625,6 +5633,7 @@ <translation id="8600929685092827187">Buđenje uređaja po primitku paketa</translation> <translation id="8601206103050338563">TLS WWW klijentska provjera autentičnosti</translation> <translation id="8602851771975208551">Drugi program na vašem računalu dodao je aplikaciju koja može promijeniti način na koji radi Chrome.</translation> +<translation id="8603912787021349466">Omogućuje Android aplikacijama da se automatski pokrenu nakon prijave.</translation> <translation id="8605428685123651449">SQLite memorija</translation> <translation id="8605503133013456784">Prekidanje veze i poništavanje uparivanja s uređajem "<ph name="DEVICE_NAME" />" nije uspjelo.</translation> <translation id="8606726445206553943">upotrebljavati vaše MIDI uređaje</translation> @@ -5977,6 +5986,7 @@ <translation id="9053965862400494292">Došlo je do pogreške tijekom pokušaja postavljanja sinkronizacije.</translation> <translation id="9056034633062863292">Ažuriranje Chromeboxa</translation> <translation id="9056810968620647706">Nisu pronađeni nikakvi rezultati.</translation> +<translation id="9057119625587205566">Nema pisača u blizini</translation> <translation id="9059868303873565140">Statusni izbornik</translation> <translation id="9064142312330104323">Fotografija Google profila (učitavanje)</translation> <translation id="9064275926664971810">Omogućuje automatsko popunjavanje obrazaca jednim klikom</translation> @@ -5987,6 +5997,7 @@ <translation id="9067401056540256169">Zbog te je postavke Chrome nesiguran. Upotrebljavajte je samo ako znate što radi. Napominjemo da je možemo ukloniti bez prethodne najave. Ako je omogućena, okviri s https izvorom mogu upotrebljavati WebSockets s nesigurnim URL-om (ws://).</translation> <translation id="9068931793451030927">Put:</translation> <translation id="9070219033670098627">Promijeni osobu</translation> +<translation id="9070940116164932228">Priguši skupe pozadinske tajmere</translation> <translation id="907148966137935206">Nemoj dopustiti nijednoj web-lokaciji da prikazuje skočne prozore (preporučuje se)</translation> <translation id="9072550133391925347"><ph name="PASSWORD_MANAGER_BRAND" /> može upotrijebiti spremljene zaporke kako bi vas automatski prijavio na web-lokacije i aplikacije koje ispunjavaju uvjete.</translation> <translation id="9073281213608662541">PAP</translation> @@ -6020,6 +6031,7 @@ <translation id="9112614144067920641">Odaberite novi PIN.</translation> <translation id="9112748030372401671">promijeniti pozadinu</translation> <translation id="9112987648460918699">Traži...</translation> +<translation id="9114663181201435112">Jednostavna prijava</translation> <translation id="9115487443206954631">Upravljanje uređajima Cast</translation> <translation id="9115675100829699941">&Bookmarks (Oznake)</translation> <translation id="9121814364785106365">Otvori kao pričvršćenu karticu</translation> @@ -6114,7 +6126,6 @@ <translation id="952992212772159698">Nije aktivirano</translation> <translation id="960719561871045870">Kôd operatera</translation> <translation id="960987915827980018">Još otprilike 1 sat</translation> -<translation id="962778376131245616">Prikaži samo nesigurne, animirano</translation> <translation id="96421021576709873">Wi-Fi mreža</translation> <translation id="965490406356730238">Omogućuje hardverski ubrzano MJPEG dekodiranje za snimljeni okvir tamo gdje je to dostupno.</translation> <translation id="968174221497644223">Predmemorija aplikacije</translation>
diff --git a/chrome/app/resources/generated_resources_hu.xtb b/chrome/app/resources/generated_resources_hu.xtb index eb88fde6..0c26a796 100644 --- a/chrome/app/resources/generated_resources_hu.xtb +++ b/chrome/app/resources/generated_resources_hu.xtb
@@ -18,7 +18,6 @@ <translation id="1029317248976101138">Nagyítás</translation> <translation id="1029595648591494741">Kipróbálja a következőt: „<ph name="EXTENSION_NAME" />”?</translation> <translation id="1031362278801463162">Előnézet betöltése</translation> -<translation id="1031460590482534116">Hiba történt az ügyféltanúsítvány tárolása során. <ph name="ERROR_NUMBER" />. (<ph name="ERROR_NAME" />) hiba.</translation> <translation id="1031573127485938293">Kérdezzen rá (a házirend alapján)</translation> <translation id="103279545524624934">Szabadítson fel tárhelyet az Android-alkalmazások elindításához.</translation> <translation id="1033780634303702874">Hozzáférés a soros eszközökhöz</translation> @@ -101,6 +100,7 @@ <translation id="1128591060186966949">Keresőmotor beállítása</translation> <translation id="1128987120443782698">A tárolóeszköz kapacitása <ph name="DEVICE_CAPACITY" />. Kérjük, olyan SD-kártyát vagy USB-memóriakártyát helyezzen be, amelynek kapacitása legalább 4 GB.</translation> <translation id="1137135726305341424">A domContentLoaded és az összes forrás betöltése elkezdődött a domContentLoaded előtt (fő keret és azonos eredetű iframe-ek).</translation> +<translation id="1138663153846032155">HTML előnyben részesítése Flash helyett</translation> <translation id="1140351953533677694">Hozzáférés a Bluetooth- és a soros eszközökhöz</translation> <translation id="114140604515785785">A bővítmény gyökérkönyvtára:</translation> <translation id="1143142264369994168">Tanúsítvány aláírója</translation> @@ -252,6 +252,7 @@ <translation id="1351692861129622852"><ph name="FILE_COUNT" /> fájl importálása folyamatban…</translation> <translation id="1352103415082130575">Thai billentyűzet (Pattachote)</translation> <translation id="1353686479385938207"><ph name="PROVIDER_NAME" />: <ph name="NETWORK_NAME" /></translation> +<translation id="1353946958707294039">Anyagszerű megjelenés – tárhelykezelő</translation> <translation id="1353966721814789986">Kezdőoldalak</translation> <translation id="1354868058853714482">Az Adobe Reader elavult, ezért lehet, hogy nem biztonságos.</translation> <translation id="1355408554203439639">3D szoftveres raszterező</translation> @@ -423,7 +424,6 @@ <translation id="1533920822694388968">TV hangolása</translation> <translation id="15373452373711364">Nagy egérmutató</translation> <translation id="1543284117603151572">Az Edge böngészőből importálva</translation> -<translation id="1544350195767834591">{NUM_COOKIES,plural, =1{1 más webhelyekről}other{# más webhelyekről}}</translation> <translation id="1545177026077493356">Automatikus kioszk mód</translation> <translation id="1545786162090505744">URL, ahol a lekérdezést a %s helyettesíti</translation> <translation id="1546280085599573572">Ez a bővítmény azt módosította, hogy melyik oldal jelenjen meg a Kezdőlap gombra való kattintás esetén.</translation> @@ -447,7 +447,6 @@ <translation id="1559235587769913376">Unicode karakterek bevitele</translation> <translation id="1561092721008294962">HarfBuzz a kezelőfelület szövegeihez</translation> <translation id="1566049601598938765">Webhely</translation> -<translation id="1566958206723629112">Flash és PDF</translation> <translation id="1567723158593978621">Ha engedélyezve van, a böngésző az új GAIA-bejelentkezési folyamatot fogja használni, amely során a jelszót új oldalon kell megadni.</translation> <translation id="1567993339577891801">JavaScript-konzol</translation> <translation id="1568323446248056064">Megjelenítőeszköz beállításainak megnyitása</translation> @@ -576,7 +575,6 @@ <translation id="1723940674997333416">Https-eredetű, nem biztonságos WebSocket engedélyezése</translation> <translation id="1725149567830788547">&Vezérlők megjelenítése</translation> <translation id="172612876728038702">A TPM telepítése folyamatban. Legyen türelemmel, ez néhány percet is igénybe vehet.</translation> -<translation id="1727135806684246609">Az anyagszerű megjelenéssel kapcsolatos részletes biztonsági információ</translation> <translation id="1729533290416704613">Továbbá azt is szabályozza, hogy melyik oldal jelenik meg a cím- és keresősávban indított kereséskor.</translation> <translation id="1731346223650886555">Pontosvessző</translation> <translation id="1731589410171062430">Összesen: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /> (<ph name="NUMBER_OF_PAGES" /> <ph name="PAGE_OR_PAGES_LABEL" />)</translation> @@ -872,6 +870,7 @@ <translation id="218492098606937156">Érintéses események engedélyezése</translation> <translation id="2187317261103489799">Észlelés (alapértelmezett)</translation> <translation id="2187895286714876935">Hiba a szervertanúsítvány importálásánál</translation> +<translation id="2188881192257509750">A(z) <ph name="APPLICATION" /> megnyitása</translation> <translation id="2190069059097339078">Wi-Fi hitelesítési adatok lekérője</translation> <translation id="219008588003277019">Natív kliensmodul: <ph name="NEXE_NAME" /></translation> <translation id="2190355936436201913">(üres)</translation> @@ -990,6 +989,7 @@ <translation id="2326606747676847821">Váltás inkognitóra</translation> <translation id="2326931316514688470">Alkalmazás új&ratöltése</translation> <translation id="2327492829706409234">Alkalmazás engedélyezése</translation> +<translation id="2328054044222305089">Ez minden adatot töröl, amelyet a(z) <ph name="SITE" /> tárolt eszközén, és minden engedélyt visszaállít, melynek futását engedélyezte. Folytatja?</translation> <translation id="2329597144923131178">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="2332131598580221120">Megtekintés az áruházban</translation> <translation id="2332742915001411729">Visszaállítás az alapértékre</translation> @@ -1266,7 +1266,6 @@ <translation id="2675358154061544447">Erősen kísérleti támogatás webhelyek közti iframe-ek megjelenítéséhez külön folyamatban. Ebben a módban csak akkor osztják meg a dokumentumok a megjelenítő folyamatot, ha ugyanarról a webhelyről származnak.</translation> <translation id="2676946222714718093">Lejátszás folyamatban a következőn:</translation> <translation id="2678063897982469759">Újraengedélyezés</translation> -<translation id="2678246812096664977">Minden beépülő modul</translation> <translation id="2679385451463308372">Nyomtatás a rendszer párbeszédablakának segítségével...</translation> <translation id="2680208403056680091">Internetkapcsolata felett más vette át az irányítást</translation> <translation id="268053382412112343">Elő&zmények</translation> @@ -1440,7 +1439,6 @@ <translation id="287286579981869940"><ph name="PROVIDER_NAME" /> hozzáadása...</translation> <translation id="2872961005593481000">Leállítás</translation> <translation id="2875698561019555027">(Chrome-hibaoldalak)</translation> -<translation id="2879560882721503072">Sikeresen tárolta a <ph name="ISSUER" /> által kibocsátott ügyféltanúsítványt.</translation> <translation id="288024221176729610">cseh</translation> <translation id="288042212351694283">U2F (Universal 2nd Factor) eszközökhöz való hozzáférés</translation> <translation id="2881966438216424900">Utolsó hozzáférés ideje:</translation> @@ -1589,6 +1587,7 @@ <translation id="3057861065630527966">Biztonsági másolat készítése a fotókról és videókról</translation> <translation id="3058212636943679650">A számítógép operációs rendszerének helyreállításához SD-kártya vagy USB-memóriakártya szükséges.</translation> <translation id="305932878998873762">Az Egyszerű gyorsítótár HTTP-hez egy új gyorsítótár. Alapja a lemezterület lefoglalásáért felelős fájlrendszer.</translation> +<translation id="3060251871394327123">Ez minden adatot töröl, amelyet a(z) <ph name="SITE" /> tárolt eszközén. Folytatja?</translation> <translation id="3061650404498811439">A hangulatjelek, a kézírás és a hangbevitel engedélyezése a regisztrációs IME-menüből.</translation> <translation id="3062606427884046423">Android MediaStyle-értesítések használata a Chrome-médiaértesítéseknél.</translation> <translation id="3063844757726132584">A praktikus indítóból valamennyi alkalmazásához hozzáférhet. Játszhat, videócsevegést folytathat, zenét hallgathat, dokumentumot szerkeszthet, illetve további alkalmazásokat tölthet le.</translation> @@ -1638,6 +1637,7 @@ <translation id="3123569374670379335">(Felügyelt)</translation> <translation id="3124111068741548686">FELHASZNÁLÓI azonosítók</translation> <translation id="3126026824346185272">Ctrl</translation> +<translation id="3127156390846601284">Ez minden adatot töröl, amelyet a megjelenített webhelyek tároltak eszközén. Folytatja?</translation> <translation id="312759608736432009">Készülék gyártója:</translation> <translation id="3127919023693423797">Hitelesítés...</translation> <translation id="3128230619496333808">6. lap</translation> @@ -1736,7 +1736,6 @@ <translation id="3264544094376351444">Talp nélküli betűtípus</translation> <translation id="3264547943200567728">Nem sikerült beállítani a Chromebox hálózatát</translation> <translation id="3265459715026181080">Ablak bezárása</translation> -<translation id="3267271790328635957">Csak PDF</translation> <translation id="3267726687589094446">Több fájl automatikus letöltésének engedélyezése továbbra is</translation> <translation id="3267998849713137817">Módosítás ideje</translation> <translation id="3268451620468152448">Megnyitott lapok</translation> @@ -1982,6 +1981,7 @@ <translation id="3574210789297084292">Bejelentkezés</translation> <translation id="3574305903863751447"><ph name="CITY" />, <ph name="STATE" /> <ph name="COUNTRY" /></translation> <translation id="357479282490346887">litván</translation> +<translation id="3575927481544652747">A Windows Runtime MIDI API for WebMIDI kikapcsolása, amely alapértelmezés szerint be van kapcsolva Windows 10 vagy újabb rendszereken.</translation> <translation id="3576324189521867626">Sikeresen telepítve</translation> <translation id="3578331450833904042">Alapértelmezett (mindent észlel)</translation> <translation id="3578594933904494462">A lap tartalma meg lesz osztva.</translation> @@ -2035,8 +2035,6 @@ <translation id="3627320433825461852">Kevesebb mint 1 perc van hátra</translation> <translation id="3627588569887975815">Link megnyitása inko&gnitóablakban</translation> <translation id="3627671146180677314">Netscape tanúsítvány - megújítás ideje</translation> -<translation id="3629326610814700057">Engedélyezi a tárhelykezelő számára a helyi tárhely kezelését.</translation> -<translation id="3630337581925712713"><ph name="PERMISSION_TYPE_LABEL" />:</translation> <translation id="3631337165634322335">Az alábbi kivételek csak az aktuális inkognitómódú programfolyamatra vonatkoznak</translation> <translation id="3633586230741134985">Alkalmazásindító beállításai</translation> <translation id="3633997706330212530">Tetszése szerint kikapcsolhatja ezeket a szolgáltatásokat.</translation> @@ -2059,7 +2057,8 @@ <translation id="3654045516529121250">A kisegítő lehetőségek beállításainak áttekintése</translation> <translation id="3654092442379740616">Szinkronizálási hiba: A <ph name="PRODUCT_NAME" /> elavult, így frissítése szükséges.</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{Állandó hozzáférése van egy fájlhoz.}other{Állandó hozzáférése van # fájlhoz.}}</translation> -<translation id="3657468915905674858">PPAPI Win32k-lezárás engedélyezése</translation> +<translation id="365793796291733849"><ph name="BEGIN_PARAGRAPH1" />Ha engedélyezi az automatikus biztonsági mentést, a rendszer adott időközönként egy személyes mappába menti az eszköz- és alkalmazásadatokat a Google Drive-on. Alkalmazásadat bármilyen adat lehet, amelyet valamelyik alkalmazás mentett (a fejlesztői beállításoktól függően), beleértve a potenciálisan bizalmas adatokat is (például névjegyek, üzenetek és fotók).<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />A biztonsági mentés adatmennyisége nem számít bele a Drive-tárhelykvótába. A rendszer nem készít biztonsági másolatot a nagy, illetve a fejlesztők által a szolgáltatásból kizárt fájlokról.<ph name="END_PARAGRAPH2" /></translation> <translation id="3660234220361471169">Nem megbízható</translation> <translation id="3665589677786828986">A Chrome azt észlelte, hogy egy másik program miatt megsérült néhány beállítás, ezért visszaállítja őket az eredeti alapértelmezett értékekre.</translation> <translation id="3665842570601375360">Biztonság:</translation> @@ -2114,6 +2113,7 @@ <translation id="3733127536501031542">SSL-szerver Step-up használatával</translation> <translation id="3736520371357197498">Ha tisztában van a biztonságát fenyegető kockázatokkal, a veszélyes programok eltávolítása előtt is <ph name="BEGIN_LINK" />felkeresheti a nem biztonságos webhelyet<ph name="END_LINK" />.</translation> <translation id="3738924763801731196"><ph name="OID" />:</translation> +<translation id="3739254215541673094">Megnyitja: <ph name="APPLICATION" />?</translation> <translation id="3739798227959604811">Ismétlés előtti késleltetés:</translation> <translation id="3741158646617793859">A(z) <ph name="DEVICE_NAME" /> mostantól megjelenik a Kezelői konzolban</translation> <translation id="3741243925913727067">Biztonsági másolat készítése az adathordozón lévő fotókról és videókról a Google Drive-on.</translation> @@ -2351,7 +2351,6 @@ <translation id="4058793769387728514">Dokumentum ellenőrzése</translation> <translation id="4059285154003114015">Keret n&yomtatása…</translation> <translation id="406070391919917862">Háttéralkalmazások</translation> -<translation id="4061502419206152498">Csak nem biztonságos és nem animált információk megjelenítése</translation> <translation id="4062251648694601778">Élvezze <ph name="SHORT_PRODUCT_NAME" /> eszközét. Kérdése van? Bármikor segítséget kérhet, ha rákattint a „?” ikonra az állapottálcán.</translation> <translation id="4065876735068446555">Előfordulhat, hogy az Ön által használt hálózat (<ph name="NETWORK_ID" />) előírja a bejelentkezési oldal felkeresését.</translation> <translation id="4068506536726151626">Ezen az oldalon olyan elemek vannak webhelyekről, amelyek figyelik a tartózkodási helyét:</translation> @@ -2390,7 +2389,6 @@ <translation id="4101878899871018532">A jelszókezelő nem ajánlja fel a szinkronizáláshoz használt hitelesítő adatok mentését.</translation> <translation id="410351446219883937">Automatikus lejátszás</translation> <translation id="4104163789986725820">E&xportálás...</translation> -<translation id="4105523032910086267">Beállítja a részletes biztonsági információ animációját és láthatóságát az anyagszerű megjelenésben.</translation> <translation id="4105563239298244027">1 TB ingyenes tárhelyet kaphat a Google Drive-val</translation> <translation id="4109135793348361820">Az ablak áthelyezése <ph name="USER_NAME" /> (<ph name="USER_EMAIL" />) asztalára</translation> <translation id="4110342520124362335">A(z) <ph name="DOMAIN" /> oldalról származó cookie-k le vannak tiltva.</translation> @@ -2441,6 +2439,7 @@ <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="4188447344915957833">Engedélyezi a tárhelykezelő számára az anyagszerű megjelenési beállításokat.</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> <translation id="4193182321948161343">Az anyagszerű megjelenés szerinti felhasználókezelő engedélyezése</translation> @@ -2647,6 +2646,7 @@ <translation id="4508765956121923607">F&orrás megtekintése</translation> <translation id="4509017836361568632">Fotó elvetése</translation> <translation id="4509345063551561634">Hely:</translation> +<translation id="4513946894732546136">Visszajelzés</translation> <translation id="4514542542275172126">Új felügyelt felhasználó beállítása</translation> <translation id="4514914692061505365">A PNaCl gyors Subzero fordítójának kényszerített használata minden pexe-fájlnál.</translation> <translation id="451515744433878153">Eltávolítás</translation> @@ -2745,6 +2745,7 @@ <translation id="4656293982926141856">Ez a számítógép</translation> <translation id="4656631038341342120">VR-parancsértelmező engedélyezése, ha rendelkezésre áll ezen az eszközön.</translation> <translation id="4657031070957997341">Mindig engedélyezze a beépülő modulokat itt: <ph name="HOST" /></translation> +<translation id="466008749075469935">Engedélyezi a beavatkozást a háttéridőzítők általi CPU-használat 1%-ra történő korlátozásához.</translation> <translation id="4663254525753315077">Ha lehetséges, a túlcsorduló, görgethető elemek görgethető tartalmát egy összevont rétegre teszi a gyorsabb görgetés érdekében.</translation> <translation id="4664482161435122549">PKCS #12 exportálási hiba</translation> <translation id="4665014895760275686">Gyártó</translation> @@ -2814,6 +2815,7 @@ <translation id="4749157430980974800">Grúz billentyűzet</translation> <translation id="4750394297954878236">Javaslatok</translation> <translation id="475088594373173692">Első felhasználó</translation> +<translation id="4750892496809949692">HTML-tartalom előnyben részesítése a Flash elrejtésével a beépülő modulok listájából.</translation> <translation id="4750917950439032686">Adatai (például jelszava vagy hitelkártyaszáma) nem láthatók más számára, amikor a rendszer elküldi őket a webhelynek.</translation> <translation id="4753602155423695878">Androidos telefon folyamatjelző animációja weboldalak betöltésekor</translation> <translation id="4755240240651974342">Finn billentyűzet</translation> @@ -3087,6 +3089,7 @@ <translation id="5119450342834678097">Táblagépre optimalizált webhely kérése lehetőség a beállítások menüben</translation> <translation id="5120068803556741301">Harmadik fél által meghatározott beviteli mód</translation> <translation id="5120421890733714118">Bízzon meg ebben a tanúsítványban webhelyek azonosításakor.</translation> +<translation id="5120516977819314347">A PIN-kód vagy jelszó helytelen.</translation> <translation id="5121130586824819730">A merevlemez megtelt. Kérjük, mentsen másik helyre, vagy szabadítson fel elegendő helyet a merevlemezen.</translation> <translation id="5125751979347152379">Érvénytelen URL</translation> <translation id="5127881134400491887">Hálózati kapcsolatok kezelése</translation> @@ -3094,6 +3097,7 @@ <translation id="512903556749061217">csatlakoztatva</translation> <translation id="5129301143853688736">A webhellyel való kapcsolata nem privát. A támadók megpróbálhatják ellopni a(z) <ph name="DOMAIN" /> webhelyen lévő adatait (például fotókat, jelszavakat, üzeneteket vagy hitelkártyaadatokat).</translation> <translation id="5129662217315786329">lengyel</translation> +<translation id="5131347545782851480">PDF-dokumentumok</translation> <translation id="5134856901811723984">Anyagszerű megjelenés a Chrome OS rendszer kezelőfelületén</translation> <translation id="5135533361271311778">Nem sikerült létrehozni a könyvjelzőelemet.</translation> <translation id="5136529877787728692">F7</translation> @@ -3262,6 +3266,7 @@ <translation id="5328031682234198929">8</translation> <translation id="5329858601952122676">&Törlés</translation> <translation id="5330145655348521461">Ezek a fájlok meg vannak nyitva egy másik asztalon. A megtekintésükhöz váltson át <ph name="USER_NAME" /> (<ph name="MAIL_ADDRESS" />) profiljára.</translation> +<translation id="5330512191124428349">Információk megtekintése</translation> <translation id="5332624210073556029">Időzóna:</translation> <translation id="5333807720589685258">Ha nem tudja megadni a helyes PUK-kódot, a SIM-kártya véglegesen le lesz tiltva.</translation> @@ -3695,7 +3700,6 @@ <translation id="5892507820957994680">Felülbírálja a beépített szoftveres megjelenítési listát, és lehetővé teszi a GPU-gyorsítást a nem támogatott rendszerkonfigurációkon.</translation> <translation id="5895138241574237353">Újraindítás</translation> <translation id="5895187275912066135">Kiállítva</translation> -<translation id="5898154795085152510">A szerver érvénytelen ügyféltanúsítványt adott vissza. <ph name="ERROR_NUMBER" />. hiba (<ph name="ERROR_NAME" />).</translation> <translation id="5900302528761731119">Google-profil fotó</translation> <translation id="590253956165195626">Kínálja fel az Ön által nem ismert nyelven írt oldalak fordítását.</translation> <translation id="5904093760909470684">Proxykonfiguráció</translation> @@ -3750,6 +3754,8 @@ <translation id="5984222099446776634">Legutóbb látogatott</translation> <translation id="5984814259619230127">Smart Lock-keresés Bluetooth Low Energy kapcsolaton keresztül</translation> <translation id="5986245990306121338">Engedélyezése esetén a lapváltó még akkor is megjelenik, ha a „Lapok és alkalmazások egyesítése” lehetőség be van kapcsolva a beállításokban.</translation> +<translation id="5989712527536636369"><ph name="BEGIN_PARAGRAPH1" />Ezek általános információk eszközéről és annak használatáról, például az akkumulátor töltöttségi szintje, az alkalmazások használatának gyakorisága, a hálózati csatlakozások (például a Wi-Fi- és a Bluetooth-hálózat) minősége és időtartama, illetve a hibajelentések azokról az esetekről, amikor nem minden működik tökéletesen. Ezekkel az adatokkal a Google mindenki számára továbbfejleszti termékeit és szolgáltatásait. Bizonyos összesített adatok partnereinknek, például az Android-fejlesztőknek is segítenek abban, hogy alkalmazásaik és termékeik még jobbak legyenek.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />A funkciót bármikor be- vagy kikapcsolhatja az Android-alkalmazások Beállítások menüjében. Ez nem befolyásolja eszközének képességét azon információk elküldésére, amelyre a nélkülözhetetlen szolgáltatásokhoz, például a rendszerfrissítésekhez és a biztonság megőrzéséhez szüksége van.<ph name="END_PARAGRAPH2" /></translation> <translation id="5990198433782424697">Bővítmények a chrome:// URL-eken</translation> <translation id="5990814808592353318">Manuális jelszógenerálás.</translation> <translation id="5991049340509704927">Nagyítás</translation> @@ -3763,6 +3769,7 @@ <translation id="6005695835120147974">Adathordozó router</translation> <translation id="6007237601604674381">Az áthelyezés sikertelen. <ph name="ERROR_MESSAGE" /></translation> <translation id="6008241731410823808">Hiperlinkeket ellenőrző pingeket küld.</translation> +<translation id="6011449291337289699">Webhelyadatok törlése</translation> <translation id="6015796118275082299">Év</translation> <translation id="6016551720757758985">A Powerwash és az előző verzióhoz való visszatérés megerősítése</translation> <translation id="6016809788585079594">Mondja ki még egy utolsó alkalommal az „Ok Google” kifejezést.</translation> @@ -3952,7 +3959,6 @@ <translation id="6276301056778294989">Győződjön meg róla, hogy az eszközön ugyanaz a kód látható.</translation> <translation id="6277105963844135994">Hálózati időtúllépés</translation> <translation id="6277518330158259200">&Képernyőkép készítése</translation> -<translation id="6278428485366576908">Téma</translation> <translation id="6279183038361895380">Az egérmutató megjelenítéséhez nyomja meg a következő billentyűt: |<ph name="ACCELERATOR" />|</translation> <translation id="6280215091796946657">Bejelentkezés másik fiókkal</translation> <translation id="6280912520669706465">ARC</translation> @@ -4204,6 +4210,7 @@ <translation id="6607272825297743757">Fájlinformáció</translation> <translation id="6607831829715835317">További eszközök</translation> <translation id="6608140561353073361">Összes cookie és webhelyadat...</translation> +<translation id="6610183966322615106">A nyomtató hozzáadása során hiba történt</translation> <translation id="6610610633807698299">URL megadása...</translation> <translation id="6612358246767739896">Védett tartalom</translation> <translation id="6615455863669487791">Megjelenítés</translation> @@ -4267,7 +4274,6 @@ <translation id="6708242697268981054">Forrás:</translation> <translation id="6709357832553498500">Csatlakozás a következővel: <ph name="EXTENSIONNAME" /></translation> <translation id="6710213216561001401">Előző</translation> -<translation id="6712158998835983046">Összes animált megjelenítése</translation> <translation id="6718273304615422081">Tömörítés...</translation> <translation id="671928215901716392">Képernyő lezárása</translation> <translation id="6721972322305477112">&Fájl</translation> @@ -4539,7 +4545,6 @@ <translation id="7088434364990739311">A frissítés ellenőrzésének elindítása sikertelen (hibakód: <ph name="ERROR" />).</translation> <translation id="708856090370082727">A képernyő-billentyűzet túlgörgetése támogatásának engedélyezése. A jelölő bekapcsolása esetén a képernyő-billentyűzet csak átméretezi a vizuális látható területet.</translation> <translation id="7088674813905715446">Az eszközt a rendszergazda eltávolított állapotba helyezte. Ahhoz, hogy regisztrálhassa az eszközt, helyeztesse azt a rendszergazdával függő állapotba.</translation> -<translation id="7089609847854449639">Tárhelykezelő</translation> <translation id="708969677220991657">Engedélyezi a localhost felé irányuló kéréseket HTTPS protokollon keresztül, még akkor is, ha a számítógép által bemutatott tanúsítvány érvénytelen.</translation> <translation id="7092106376816104">Előugró ablakok kivételei</translation> <translation id="7093866338626856921">Adatok cseréje a(z) <ph name="HOSTNAMES" /> nevű eszközökkel</translation> @@ -4579,7 +4584,7 @@ <translation id="715118844758971915">Hagyományos nyomtatók</translation> <translation id="7154130902455071009">Kezdőoldal módosítása a következőre: <ph name="START_PAGE" /></translation> <translation id="7155171745945906037">Meglévő fénykép a fényképezőgépről vagy fájlból</translation> -<translation id="715568033737470079">Azon PPAPI beépülő modulok meghatározása, amelyek a Win32k lezárási tesztkörnyezet-házirenden belül futnak (csak Windows 10 vagy újabb rendszer esetén).</translation> +<translation id="7155226869555939647">Mindig nyissa meg a(z) <ph name="APPLICATION" /> linkjeit</translation> <translation id="7156235233373189579">Ezt a fájlt Windows-szoftvereket használó számítógéphez készítették. Nem kompatibilis az Ön Chrome OS-t futtató eszközével. A <ph name="BEGIN_LINK" />Chrome Internetes áruházban<ph name="END_LINK" /> kereshet megfelelő helyettesítő alkalmazást. <ph name="BEGIN_LINK_HELP" />További információ<ph name="END_LINK_HELP" /></translation> <translation id="7157063064925785854">A Folytatás lehetőségre kattintva elfogadja a következőket: <ph name="LEGAL_DOC_LINK_TEXT_1" />, <ph name="LEGAL_DOC_LINK_TEXT_2" />, <ph name="LEGAL_DOC_LINK_TEXT_3" /> és <ph name="LEGAL_DOC_LINK_TEXT_4" />.</translation> <translation id="7158238151765743968">A(z) „<ph name="DEVICE_NAME" />” eszközhöz való csatlakozás még mindig folyamatban van.</translation> @@ -4594,6 +4599,7 @@ <translation id="7175353351958621980">Betöltve innen:</translation> <translation id="7180611975245234373">Frissítés</translation> <translation id="7180865173735832675">Testreszabás</translation> +<translation id="7181387261278441780">Webhely törlése és visszaállítása</translation> <translation id="7185078796915954712">TLS 1.3</translation> <translation id="7185690883425432021">Elrejti a bezárás gombokat az inaktív lapokon, amikor a lapsáv halmozott módban van.</translation> <translation id="7186088072322679094">Gomb megtartása az eszköztáron</translation> @@ -4626,7 +4632,6 @@ <translation id="7223775956298141902">Hmm... Nincsenek bővítményei :-(</translation> <translation id="7224023051066864079">Alhálózati maszk:</translation> <translation id="7225179976675429563">Hiányzik a hálózat típusa</translation> -<translation id="7230191962699768124">Összes nem animált megjelenítése</translation> <translation id="7230787553283372882">Szövegméret személyre szabása</translation> <translation id="7231224339346098802">Számmal jelezze, hogy hány példányt kell nyomtatni (1 vagy több).</translation> <translation id="7238585580608191973">SHA-256 ujjlenyomat</translation> @@ -4758,7 +4763,6 @@ <translation id="7409233648990234464">Újraindítás és Powerwash</translation> <translation id="7409836189476010449">Flash futtatása</translation> <translation id="7410344089573941623">Kérdezzen rá, ha a(z) <ph name="HOST" /> hozzá szeretne férni a kamerához és a mikrofonhoz</translation> -<translation id="7411343637221933631">{NUM_COOKIES,plural, =1{1 erről a webhelyről}other{# erről a webhelyről}}</translation> <translation id="7412226954991670867">GPU memória</translation> <translation id="7416362041876611053">Ismeretlen hálózati hiba.</translation> <translation id="7417453074306512035">Etióp billentyűzet</translation> @@ -4880,6 +4884,7 @@ <translation id="756445078718366910">Böngészőablak megnyitása</translation> <translation id="7564847347806291057">Folyamat leállítása</translation> <translation id="7566723889363720618">F12</translation> +<translation id="7567314848159753396">Cookie: <ph name="NAME" /></translation> <translation id="756809126120519699">Chrome-adatok törölve</translation> <translation id="7568790562536448087"> frissítése</translation> <translation id="7573172247376861652">Akkumulátor töltése</translation> @@ -4920,6 +4925,7 @@ <translation id="7626009897377900107">Jelszógenerálás</translation> <translation id="7627262197844840899">Ez a webhely nem fogadja el a MasterCard kártyákat.</translation> <translation id="7627790789328695202">Hoppá! <ph name="FILE_NAME" /> már létezik. Nevezze át, majd próbálja újra.</translation> +<translation id="7628127343934101653">PDF-fájlok megnyitása az alapértelmezett PDF-olvasó alkalmazásban.</translation> <translation id="762917759028004464">Az alapértelmezett böngésző jelenleg ez: <ph name="BROWSER_NAME" />.</translation> <translation id="7629536005696009600">Az Android-alkalmazásoknál tárolt hitelesítési adatok kitöltésének engedélyezése a megfelelő webhelyeken.</translation> <translation id="7629827748548208700">Lap: <ph name="TAB_NAME" /></translation> @@ -5148,6 +5154,7 @@ <translation id="7957513156576779045">Bluetooth bekapcsolása a párosítás engedélyezéséhez</translation> <translation id="7957615753207896812">A billentyűzet eszközbeállításainak megnyitása</translation> <translation id="7959074893852789871">A fájl több tanúsítványt tartalmazott, amelyek közül néhány nincs importálva:</translation> +<translation id="7959700692661109221"><ph name="BEGIN_PARAGRAPH" />A Google helyszolgáltatása olyan forrásokat használ, mint a Wi-Fi, hogy segítségükkel gyorsabban és pontosabban határozza meg az eszköz becsült helyét. Ha Ön bekapcsolja a Google helyszolgáltatásait, eszköze olyan módba kerül, amely a Wi-Fi-hálózatokat helyadatok begyűjtésére használja. Ezt bármikor kikapcsolhatja a helybeállításoknál.<ph name="END_PARAGRAPH" /></translation> <translation id="7961015016161918242">Soha</translation> <translation id="7964089325405904043">Jelszó importálása és exportálása</translation> <translation id="7965010376480416255">Megosztott memória</translation> @@ -5298,6 +5305,7 @@ <translation id="8146793085009540321">Sikertelen bejelentkezés. Kérjük, forduljon rendszergazdájához, vagy próbálja újra.</translation> <translation id="8148264977957212129">Pinyin beviteli mód</translation> <translation id="8148913456785123871">Google Asszisztens-kártyák megjelenítése az indítón</translation> +<translation id="8150391391298684512">A Windows Runtime MIDI API kikapcsolása</translation> <translation id="8151185429379586178">Fejlesztői eszközök</translation> <translation id="8151638057146502721">Konfigurálás</translation> <translation id="8151639108075998630">Vendégként való böngészés engedélyezése</translation> @@ -5579,6 +5587,7 @@ <translation id="8532294913309524834">Rendeljen meg preferenciáinak megfelelő nyelveket.</translation> <translation id="8535005006684281994">Netscape tanúsítvány - megújítási URL</translation> <translation id="8539727552378197395">Nem (HttpOnly)</translation> +<translation id="8541084862688000575">Android-alkalmazások automatikus betöltése</translation> <translation id="8543181531796978784">Lehetősége van arra, hogy <ph name="BEGIN_ERROR_LINK" />jelentse az észlelési problémát<ph name="END_ERROR_LINK" />, ha pedig tisztában van a biztonságát fenyegető kockázatokkal, <ph name="BEGIN_LINK" />felkeresheti a nem biztonságos webhelyet<ph name="END_LINK" />.</translation> <translation id="8545107379349809705">Információk elrejtése...</translation> <translation id="8545211332741562162">Engedély a weboldalak számára, hogy kísérleti JavaScript-funkciókat használjanak.</translation> @@ -5606,7 +5615,6 @@ <translation id="8569764466147087991">Válassza ki a megnyitni kívánt fájlt</translation> <translation id="8571032220281885258">Amikor kimondja azt, hogy „OK Google”, a Chrome elindítja az Ön által ezt követően kimondott szavak keresését.</translation> <translation id="8571108619753148184">4. szerver</translation> -<translation id="8572832761467613633">Csak Flash</translation> <translation id="8572981282494768930">Ne engedje, hogy webhelyek hozzáférjenek a kamerához és a mikrofonhoz</translation> <translation id="8574234089711453001">Letöltés gomb megjelenésének engedélyezése média URL-lel rendelkező oldal megnyitása esetén.</translation> <translation id="857779305329188634">A kísérleti QUIC protokolltámogatás engedélyezése.</translation> @@ -5628,6 +5636,7 @@ <translation id="8600929685092827187">Ébresztőcsomagok</translation> <translation id="8601206103050338563">TLS WWW ügyfél hitelesítése</translation> <translation id="8602851771975208551">A számítógépen lévő egyik program olyan alkalmazást adott hozzá, amely módosíthatja a Chrome működését.</translation> +<translation id="8603912787021349466">Automatikus elindulás engedélyezése az Android-alkalmazások számára a bejelentkezést követően.</translation> <translation id="8605428685123651449">SQLite-memória</translation> <translation id="8605503133013456784">Nem sikerült megszakítani a kapcsolatot, illetve a(z) "<ph name="DEVICE_NAME" />" eszköz párosítását.</translation> <translation id="8606726445206553943">MIDI-eszközök használata</translation> @@ -5980,6 +5989,7 @@ <translation id="9053965862400494292">Hiba történt a szinkronizáláshoz való felkészülés során.</translation> <translation id="9056034633062863292">A Chromebox frissítése</translation> <translation id="9056810968620647706">Nincs találat.</translation> +<translation id="9057119625587205566">Nincsenek közeli nyomtatók</translation> <translation id="9059868303873565140">Állapotmenü</translation> <translation id="9064142312330104323">* Google-profil fotó (betöltés)</translation> <translation id="9064275926664971810">Használja az Automatikus kitöltést, amellyel az űrlapokat egyetlen kattintással kitöltheti</translation> @@ -5990,6 +6000,7 @@ <translation id="9067401056540256169">A jelző következtében a Chrome nem lesz biztonságos. Csak akkor használja, ha tudja, hogy mit csinál. Felhívjuk figyelmét, hogy ezt a jelzőt értesítés nélkül, bármikor eltávolíthatjuk. Ha engedélyezve van, akkor a https-eredetű keretek használhatnak WebSocketeket nem biztonságos URL-lel (ws://).</translation> <translation id="9068931793451030927">Elérési út:</translation> <translation id="9070219033670098627">Felhasználóváltás</translation> +<translation id="9070940116164932228">Drága háttéridőzítők be- vagy kikapcsolása</translation> <translation id="907148966137935206">Tiltsa le az előugró ablakokat minden webhelyen (ajánlott)</translation> <translation id="9072550133391925347">A(z) <ph name="PASSWORD_MANAGER_BRAND" /> segítségével automatikusan bejelentkezhet adott webhelyekre és alkalmazásokba a mentett jelszavaival.</translation> <translation id="9073281213608662541">PAP</translation> @@ -6023,6 +6034,7 @@ <translation id="9112614144067920641">Kérjük, válasszon új PIN kódot.</translation> <translation id="9112748030372401671">Háttérkép módosítása</translation> <translation id="9112987648460918699">Keresés...</translation> +<translation id="9114663181201435112">Egyszerű bejelentkezés</translation> <translation id="9115487443206954631">Cast-eszközök kezelése</translation> <translation id="9115675100829699941">&Könyvjelzők</translation> <translation id="9121814364785106365">Megnyitás rögzített lapként</translation> @@ -6117,7 +6129,6 @@ <translation id="952992212772159698">Nincs aktiválva</translation> <translation id="960719561871045870">Operátorkód</translation> <translation id="960987915827980018">Körülbelül 1 óra van hátra</translation> -<translation id="962778376131245616">Csak nem biztonságos, animált információ megjelenítése</translation> <translation id="96421021576709873">Wi-Fi hálózat</translation> <translation id="965490406356730238">Hardveresen gyorsított mjpeg-dekódolás engedélyezése rögzített képkockánál, amennyiben lehetséges.</translation> <translation id="968174221497644223">Alkalmazás-gyorsítótár</translation>
diff --git a/chrome/app/resources/generated_resources_id.xtb b/chrome/app/resources/generated_resources_id.xtb index f0658291..e4c3e27 100644 --- a/chrome/app/resources/generated_resources_id.xtb +++ b/chrome/app/resources/generated_resources_id.xtb
@@ -18,7 +18,6 @@ <translation id="1029317248976101138">Zoom</translation> <translation id="1029595648591494741">Coba "<ph name="EXTENSION_NAME" />"?</translation> <translation id="1031362278801463162">Memuat pratinjau</translation> -<translation id="1031460590482534116">Terjadi kesalahan ketika mencoba menyimpan sertifikat klien. Kesalahan <ph name="ERROR_NUMBER" /> (<ph name="ERROR_NAME" />).</translation> <translation id="1031573127485938293">Tanyakan (berdasarkan kebijakan)</translation> <translation id="103279545524624934">Kosongkan ruang disk untuk meluncurkan aplikasi Android.</translation> <translation id="1033780634303702874">Mengakses perangkat seri Anda</translation> @@ -101,6 +100,7 @@ <translation id="1128591060186966949">Edit mesin telusur</translation> <translation id="1128987120443782698">Perangkat penyimpanan ini berkapasitas <ph name="DEVICE_CAPACITY" />. Masukkan kartu SD atau stik memori USB yang berkapasitas sekurang-kurangnya 4 GB.</translation> <translation id="1137135726305341424">domContentLoaded dan semua muatan sumber daya dimulai sebelum domContentLoaded (main frame dan iframes asal yang sama).</translation> +<translation id="1138663153846032155">Pilih HTML daripada Flash</translation> <translation id="1140351953533677694">Mengakses perangkat Seri dan Bluetooth Anda</translation> <translation id="114140604515785785">Direktori akar ekstensi:</translation> <translation id="1143142264369994168">Penandatangan Sertifikat</translation> @@ -252,6 +252,7 @@ <translation id="1351692861129622852">Mengimpor <ph name="FILE_COUNT" /> file...</translation> <translation id="1352103415082130575">Keyboard Thai (Pattachote)</translation> <translation id="1353686479385938207"><ph name="PROVIDER_NAME" />: <ph name="NETWORK_NAME" /></translation> +<translation id="1353946958707294039">Pengelola penyimpanan Desain Material</translation> <translation id="1353966721814789986">Laman permulaan</translation> <translation id="1354868058853714482">Adobe Reader sudah usang dan mungkin tidak aman.</translation> <translation id="1355408554203439639">Rasterizer perangkat lunak 3D</translation> @@ -423,7 +424,6 @@ <translation id="1533920822694388968">Penyejajaran TV</translation> <translation id="15373452373711364">Kursor mouse besar</translation> <translation id="1543284117603151572">Diimpor Dari Edge</translation> -<translation id="1544350195767834591">{NUM_COOKIES,plural, =1{1 dari situs lainnya}other{# dari situs lainnya}}</translation> <translation id="1545177026077493356">Mode Kios Otomatis</translation> <translation id="1545786162090505744">URL dengan %s di tempat kueri</translation> <translation id="1546280085599573572">Ekstensi ini telah mengubah laman apa yang ditampilkan saat Anda mengeklik tombol Beranda.</translation> @@ -447,7 +447,6 @@ <translation id="1559235587769913376">Masukkan karakter Unicode</translation> <translation id="1561092721008294962">HarfBuzz untuk teks antarmuka</translation> <translation id="1566049601598938765">Situs web</translation> -<translation id="1566958206723629112">Flash dan PDF</translation> <translation id="1567723158593978621">Jika diaktifkan, proses masuk ke browser akan menggunakan alur masuk GAIA baru yang dipisahkan sandi.</translation> <translation id="1567993339577891801">Konsol Javascript</translation> <translation id="1568323446248056064">Buka setelan perangkat layar</translation> @@ -576,7 +575,6 @@ <translation id="1723940674997333416">Izinkan WebSocket tidak aman dari https asal</translation> <translation id="1725149567830788547">Tampilkan &Kontrol</translation> <translation id="172612876728038702">TPM sedang disiapkan. Harap bersabar; ini mungkin memerlukan waktu beberapa menit.</translation> -<translation id="1727135806684246609">Verbose Keamanan Materi</translation> <translation id="1729533290416704613">Juga mengontrol laman apa yang ditampilkan saat Anda menelusuri dari Omnibox.</translation> <translation id="1731346223650886555">Titik koma</translation> <translation id="1731589410171062430">Total: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /> (<ph name="NUMBER_OF_PAGES" /> <ph name="PAGE_OR_PAGES_LABEL" />)</translation> @@ -872,6 +870,7 @@ <translation id="218492098606937156">Aktifkan acara sentuh</translation> <translation id="2187317261103489799">Deteksi (default)</translation> <translation id="2187895286714876935">Kesalahan Impor Sertifikat Server</translation> +<translation id="2188881192257509750">Buka <ph name="APPLICATION" /></translation> <translation id="2190069059097339078">Pembuka Kredensial Wi-Fi</translation> <translation id="219008588003277019">Modul Klien Asli: <ph name="NEXE_NAME" /></translation> <translation id="2190355936436201913">(kosong)</translation> @@ -990,6 +989,7 @@ <translation id="2326606747676847821">Buka Mode Penyamaran</translation> <translation id="2326931316514688470">&Muat ulang aplikasi</translation> <translation id="2327492829706409234">Aktifkan aplikasi</translation> +<translation id="2328054044222305089">Tindakan ini akan menghapus semua data yang disimpan <ph name="SITE" /> di perangkat, dan menyetel ulang semua izin yang diberikan untuk berjalan. Ingin melanjutkan?</translation> <translation id="2329597144923131178">Masuk untuk mendapatkan bookmark, riwayat, sandi, dan setelan Anda lainnya di semua perangkat.</translation> <translation id="2332131598580221120">Lihat di toko</translation> <translation id="2332742915001411729">Setel ulang ke default</translation> @@ -1265,7 +1265,6 @@ <translation id="2675358154061544447">Dukungan yang sangat eksperimental untuk merender iframe antarsitus dalam proses terpisah. Dalam mode ini, dokumen akan membagikan proses perender hanya jika berasal dari situs web yang sama.</translation> <translation id="2676946222714718093">Diputar di</translation> <translation id="2678063897982469759">Aktifkan ulang</translation> -<translation id="2678246812096664977">Semua plugin</translation> <translation id="2679385451463308372">Cetak menggunakan dialog sistem...</translation> <translation id="2680208403056680091">Koneksi Internet Anda Sedang Dikendalikan</translation> <translation id="268053382412112343">Ri&wayat</translation> @@ -1439,7 +1438,6 @@ <translation id="287286579981869940">Menambahkan <ph name="PROVIDER_NAME" />...</translation> <translation id="2872961005593481000">Matikan</translation> <translation id="2875698561019555027">(Laman kesalahan Chrome)</translation> -<translation id="2879560882721503072">Berhasil menyimpan sertifikat yang diterbitkan oleh <ph name="ISSUER" />.</translation> <translation id="288024221176729610">Cheska</translation> <translation id="288042212351694283">Akses perangkat Universal 2nd Factor Anda</translation> <translation id="2881966438216424900">Terakhir diakses:</translation> @@ -1588,6 +1586,7 @@ <translation id="3057861065630527966">Cadangkan foto dan video</translation> <translation id="3058212636943679650">Jika suatu ketika sistem operasi komputer harus dipulihkan, Anda memerlukan kartu SD atau stik memori USB pemulihan.</translation> <translation id="305932878998873762">Cache Sederhana untuk HTTP adalah cache baru. Cache tersebut bergantung pada sistem file untuk alokasi ruang disk.</translation> +<translation id="3060251871394327123">Tindakan ini akan menghapus semua data yang disimpan <ph name="SITE" /> di perangkat. Ingin melanjutkan?</translation> <translation id="3061650404498811439">Memungkinkan akses ke emoji, tulisan tangan, dan masukan suara dari menu IME keikutsertaan.</translation> <translation id="3062606427884046423">Gunakan notifikasi Android MediaStyle untuk notifikasi media Chrome.</translation> <translation id="3063844757726132584">Akses semua aplikasi dari peluncur praktis ini. Mainkan game, lakukan video chat, dengarkan musik, edit dokumen, atau dapatkan aplikasi lainnya.</translation> @@ -1637,6 +1636,7 @@ <translation id="3123569374670379335">(Dilindungi)</translation> <translation id="3124111068741548686">Penanganan PENGGUNA</translation> <translation id="3126026824346185272">Ctrl</translation> +<translation id="3127156390846601284">Tindakan ini akan menghapus semua data yang disimpan di perangkat untuk semua situs yang ditampilkan. Ingin melanjutkan?</translation> <translation id="312759608736432009">Pabrikan perangkat:</translation> <translation id="3127919023693423797">Autentikasi...</translation> <translation id="3128230619496333808">Tab 6</translation> @@ -1735,7 +1735,6 @@ <translation id="3264544094376351444">Font Sans-serif</translation> <translation id="3264547943200567728">Gagal menyiapkan jaringan Chromebox</translation> <translation id="3265459715026181080">Tutup Jendela</translation> -<translation id="3267271790328635957">Khusus PDF</translation> <translation id="3267726687589094446">Lanjutkan mengizinkan unduhan otomatis beberapa file</translation> <translation id="3267998849713137817">Waktu Perubahan</translation> <translation id="3268451620468152448">Tab Terbuka</translation> @@ -1981,6 +1980,7 @@ <translation id="3574210789297084292">masuk</translation> <translation id="3574305903863751447"><ph name="CITY" />, <ph name="STATE" /> <ph name="COUNTRY" /></translation> <translation id="357479282490346887">Lithuania</translation> +<translation id="3575927481544652747">Menonaktifkan API Windows Runtime MIDI untuk WebMIDI, yang diaktifkan secara default di Windows 10 atau lebih baru.</translation> <translation id="3576324189521867626">Berhasil dipasang</translation> <translation id="3578331450833904042">Default (ambil semuanya)</translation> <translation id="3578594933904494462">Konten tab ini sedang dibagikan.</translation> @@ -2034,8 +2034,6 @@ <translation id="3627320433825461852">Kurang dari 1 menit lagi</translation> <translation id="3627588569887975815">Buka tautan di jendela penya&maran</translation> <translation id="3627671146180677314">Netscape Certificate Renewal Time</translation> -<translation id="3629326610814700057">Memungkinkan pengelola penyimpanan mengelola penyimpanan lokal.</translation> -<translation id="3630337581925712713"><ph name="PERMISSION_TYPE_LABEL" />:</translation> <translation id="3631337165634322335">Pengecualian di bawah hanya berlaku untuk sesi samaran saat ini.</translation> <translation id="3633586230741134985">Setelan Peluncur Aplikasi</translation> <translation id="3633997706330212530">Anda dapat menonaktifkan layanan ini secara opsional.</translation> @@ -2058,7 +2056,8 @@ <translation id="3654045516529121250">Baca setelan aksesibilitas Anda</translation> <translation id="3654092442379740616">Kesalahan Sinkronisasi: <ph name="PRODUCT_NAME" /> sudah usang dan perlu diperbarui.</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{Memiliki akses permanen ke satu file.}other{Memiliki akses permanen ke # file.}}</translation> -<translation id="3657468915905674858">Aktifkan Gembok Total Win32k PPAPI.</translation> +<translation id="365793796291733849"><ph name="BEGIN_PARAGRAPH1" />Jika Anda mengaktifkan pencadangan otomatis, data perangkat dan aplikasi disimpan secara berkala ke folder pribadi di Google Drive. Data aplikasi dapat berupa data apa saja yang disimpan oleh aplikasi (menurut setelan pengembang), termasuk data yang berpotensi sensitif seperti kontak, pesan, dan foto.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Data cadangan tidak dihitung dalam kuota penyimpanan Drive. File besar, atau file yang dipilih pengembang yang tidak disertakan dalam layanan tidak akan dicadangkan.<ph name="END_PARAGRAPH2" /></translation> <translation id="3660234220361471169">Tidak tepercaya</translation> <translation id="3665589677786828986">Chrome mendeteksi bahwa beberapa setelan Anda dirusak oleh program lain dan menyetelnya ulang ke setelan default aslinya.</translation> <translation id="3665842570601375360">Keamanan:</translation> @@ -2113,6 +2112,7 @@ <translation id="3733127536501031542">Server SSL dengan Step-up</translation> <translation id="3736520371357197498">Jika Anda memahami risiko terhadap keamanan, Anda dapat <ph name="BEGIN_LINK" />mengunjungi situs tidak aman ini<ph name="END_LINK" /> sebelum program berbahaya tersebut dibuang.</translation> <translation id="3738924763801731196"><ph name="OID" />:</translation> +<translation id="3739254215541673094">Buka <ph name="APPLICATION" />?</translation> <translation id="3739798227959604811">Tunda sebelum mengulangi:</translation> <translation id="3741158646617793859">Kini <ph name="DEVICE_NAME" /> akan ditampilkan di Konsol Admin</translation> <translation id="3741243925913727067">Mencadangkan foto dan video perangkat media ke Google Drive.</translation> @@ -2351,7 +2351,6 @@ <translation id="4058793769387728514">Periksa Dokumen Sekarang</translation> <translation id="4059285154003114015">&Cetak Bingkai...</translation> <translation id="406070391919917862">Aplikasi Latar Belakang</translation> -<translation id="4061502419206152498">Hanya tampilkan non animasi yang tidak aman</translation> <translation id="4062251648694601778">Nikmati perangkat <ph name="SHORT_PRODUCT_NAME" /> Anda. Ada pertanyaan? Dapatkan bantuan kapan saja dengan mengeklik "?" di baki status.</translation> <translation id="4065876735068446555">Jaringan yang digunakan (<ph name="NETWORK_ID" />) mungkin mewajibkan Anda mengunjungi laman masuk jaringan.</translation> <translation id="4068506536726151626">Laman ini berisi elemen dari situs berikut yang melacak lokasi Anda:</translation> @@ -2390,7 +2389,6 @@ <translation id="4101878899871018532">Pengelola sandi tidak akan menawarkan penyimpanan kredensial yang digunakan untuk sinkronisasi.</translation> <translation id="410351446219883937">Putar otomatis</translation> <translation id="4104163789986725820">E&kspor...</translation> -<translation id="4105523032910086267">Mengatur animasi dan keterlihatan verbose keamanan pada Desain Material.</translation> <translation id="4105563239298244027">Dapatkan gratis 1 TB dengan Google Drive</translation> <translation id="4109135793348361820">Pindahkan jendela ke <ph name="USER_NAME" /> (<ph name="USER_EMAIL" />)</translation> <translation id="4110342520124362335">Cookie dari <ph name="DOMAIN" /> dicekal.</translation> @@ -2441,6 +2439,7 @@ <translation id="418179967336296930">Keyboard Fonetik Rusia (YaZHert)</translation> <translation id="4181841719683918333">Bahasa</translation> <translation id="4187248015940562149">Mengaktifkan Bluetooth Web agar situs web dapat terhubung ke dan mengontrol perangkat Bluetooth di sekitar Anda.</translation> +<translation id="4188447344915957833">Mengaktifkan pengelola penyimpanan di Setelan Desain Material.</translation> <translation id="4189406272289638749">Ekstensi, <b><ph name="EXTENSION_NAME" /></b>, mengontrol setelan ini.</translation> <translation id="4193154014135846272">Dokumen Google</translation> <translation id="4193182321948161343">Aktifkan Pengelola Pengguna Desain Material</translation> @@ -2648,6 +2647,7 @@ <translation id="4508765956121923607">Lihat S&umber</translation> <translation id="4509017836361568632">Hapus foto</translation> <translation id="4509345063551561634">Lokasi:</translation> +<translation id="4513946894732546136">Masukan</translation> <translation id="4514542542275172126">Menyiapkan pengguna yang dilindungi yang baru</translation> <translation id="4514914692061505365">Memaksa penggunaan penerjemah Subzero yang cepat dari PNaCl untuk semua file pexe.</translation> <translation id="451515744433878153">Hapus</translation> @@ -2746,6 +2746,7 @@ <translation id="4656293982926141856">Komputer ini</translation> <translation id="4656631038341342120">Aktifkan VR shell jika tersedia untuk perangkat ini.</translation> <translation id="4657031070957997341">Selalu izinkan plugin di <ph name="HOST" /></translation> +<translation id="466008749075469935">Mengaktifkan intervensi untuk membatasi penggunaan CPU pengatur waktu latar belakang menjadi 1%.</translation> <translation id="4663254525753315077">Jika mungkin, letakkan konten gulir dari elemen gulir luapan ke dalam lapisan gabungan agar bergulir lebih cepat.</translation> <translation id="4664482161435122549">PKCS #12 Kesalahan Ekspor</translation> <translation id="4665014895760275686">Pabrikan</translation> @@ -2814,6 +2815,7 @@ <translation id="4749157430980974800">Keyboard Georgia</translation> <translation id="4750394297954878236">Saran</translation> <translation id="475088594373173692">Pengguna pertama</translation> +<translation id="4750892496809949692">Pilih konten HTML dengan menyembunyikan Flash dari daftar plugin.</translation> <translation id="4750917950439032686">Informasi Anda (misalnya, sandi atau nomor kartu kredit) bersifat pribadi saat dikirimkan ke situs ini.</translation> <translation id="4753602155423695878">Animasi bilah proses pemuatan laman ponsel Android</translation> <translation id="4755240240651974342">Keyboard untuk bahasa Suomi</translation> @@ -3088,6 +3090,7 @@ <translation id="5119450342834678097">Minta opsi situs tablet dalam menu setelan</translation> <translation id="5120068803556741301">Metode masukan pihak ketiga</translation> <translation id="5120421890733714118">Percayai sertifikat ini untuk mengidentifikasi situs web.</translation> +<translation id="5120516977819314347">PIN atau sandi salah.</translation> <translation id="5121130586824819730">Hard disk Anda sudah penuh. Simpan ke lokasi lain atau kosongkan lebih banyak ruang pada hard disk.</translation> <translation id="5125751979347152379">URL tidak valid.</translation> <translation id="5127881134400491887">Mengelola sambungan jaringan</translation> @@ -3095,6 +3098,7 @@ <translation id="512903556749061217">terpasang</translation> <translation id="5129301143853688736">Sambungan Anda ke situs ini tidak bersifat pribadi. Penyerang mungkin mencoba mencuri informasi Anda (misalnya foto, sandi, pesan, dan kartu kredit) dari <ph name="DOMAIN" />.</translation> <translation id="5129662217315786329">Polski</translation> +<translation id="5131347545782851480">Dokumen PDF</translation> <translation id="5134856901811723984">Desain Material di antarmuka sistem Chrome OS</translation> <translation id="5135533361271311778">Tidak dapat membuat item bookmark.</translation> <translation id="5136529877787728692">F7</translation> @@ -3222,7 +3226,7 @@ <translation id="527605982717517565">Selalu izinkan JavaScript di <ph name="HOST" /></translation> <translation id="52809057403474396">Plugin diblokir di laman ini.</translation> <translation id="5283008903473888488">"<ph name="BUNDLE_NAME" />" menambahkan ekstensi ini untuk <ph name="USER_NAME" />:</translation> -<translation id="5283677936944177147">Ups! Sistem gagal menentukan model perangkat atau nomor seri.</translation> +<translation id="5283677936944177147">Ups! Sistem gagal menentukan model perangkat atau nomor seri.</translation> <translation id="528468243742722775">Berakhir</translation> <translation id="5286673433070377078">Jalur Perender Terbaru - KEMUNGKINAN MEMBUAT BROWSER ANDA MOGOK</translation> <translation id="5287425679749926365">Akun Anda</translation> @@ -3263,6 +3267,7 @@ <translation id="5328031682234198929">8</translation> <translation id="5329858601952122676">&Hapus</translation> <translation id="5330145655348521461">File ini dibuka pada desktop yang berbeda. Pindahkan ke <ph name="USER_NAME" /> (<ph name="MAIL_ADDRESS" />) untuk melihatnya.</translation> +<translation id="5330512191124428349">Dapatkan info</translation> <translation id="5332624210073556029">Zona waktu:</translation> <translation id="5333807720589685258">Kartu SIM Anda akan dinonaktifkan secara permanen jika Anda tidak dapat memasukkan Kunci Pembuka PIN yang benar.</translation> @@ -3695,7 +3700,6 @@ <translation id="5892507820957994680">Mengganti daftar penguraian perangkat lunak yang tertanam dan mengaktifkan akselerasi GPU pada konfigurasi sistem yang tidak didukung.</translation> <translation id="5895138241574237353">Mulai Ulang</translation> <translation id="5895187275912066135">Diterbitkan Pada</translation> -<translation id="5898154795085152510">Server mengembalikan sertifikat klien yang tidak valid. Kesalahan <ph name="ERROR_NUMBER" /> (<ph name="ERROR_NAME" />).</translation> <translation id="5900302528761731119">Foto Google profil</translation> <translation id="590253956165195626">Tanya apakah laman yang tidak saya pahami ingin diterjemahkan</translation> <translation id="5904093760909470684">Konfigurasi Proxy</translation> @@ -3750,6 +3754,8 @@ <translation id="5984222099446776634">Barusan Dikunjungi</translation> <translation id="5984814259619230127">Penemuan Smart Lock Bluetooth Hemat Energi</translation> <translation id="5986245990306121338">Jika diaktifkan, pengalih tab akan muncul meski opsi 'gabungkan tab dan aplikasi' diaktifkan di setelan.</translation> +<translation id="5989712527536636369"><ph name="BEGIN_PARAGRAPH1" />Ini adalah informasi umum tentang perangkat dan cara menggunakannya, seperti tingkat baterai, seberapa sering Anda menggunakan aplikasi, kualitas dan durasi sambungan jaringan (seperti Wi-Fi dan Bluetooth), dan laporan kerusakan ketika ada yang tidak bekerja sebagaimana mestinya. Informasi ini akan digunakan untuk meningkatkan produk dan layanan Google untuk semua orang. Beberapa informasi gabungan juga akan membantu partner, seperti pengembang Android, menjadikan aplikasi dan produk mereka lebih baik.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Anda dapat mengaktifkan atau menonaktifkannya kapan saja di Setelan aplikasi Android. Tindakan ini tidak memengaruhi kemampuan perangkat untuk mengirimkan informasi yang diperlukan untuk menerima layanan yang penting seperti pembaruan sistem dan keamanan.<ph name="END_PARAGRAPH2" /></translation> <translation id="5990198433782424697">Ekstensi di URL chrome://</translation> <translation id="5990814808592353318">Pembuatan sandi manual.</translation> <translation id="5991049340509704927">Memperbesar</translation> @@ -3763,6 +3769,7 @@ <translation id="6005695835120147974">Router Media</translation> <translation id="6007237601604674381">Pemindahan gagal. <ph name="ERROR_MESSAGE" /></translation> <translation id="6008241731410823808">Mengirim ping pengauditan hyperlink.</translation> +<translation id="6011449291337289699">Hapus data situs</translation> <translation id="6015796118275082299">Tahun</translation> <translation id="6016551720757758985">Konfirmasi Powerwash dengan kembali ke versi sebelumnya</translation> <translation id="6016809788585079594">Ucapkan "Ok Google" sekali lagi</translation> @@ -3952,7 +3959,6 @@ <translation id="6276301056778294989">Pastikan perangkat menunjukkan kode yang sama.</translation> <translation id="6277105963844135994">Waktu tunggu jaringan habis</translation> <translation id="6277518330158259200">Ambil Tangkapan Layar</translation> -<translation id="6278428485366576908">Tema</translation> <translation id="6279183038361895380">Tekan |<ph name="ACCELERATOR" />| untuk menampilkan kursor</translation> <translation id="6280215091796946657">Masuk dengan akun lain</translation> <translation id="6280912520669706465">ARC</translation> @@ -4204,6 +4210,7 @@ <translation id="6607272825297743757">Info file</translation> <translation id="6607831829715835317">Alat lainnya</translation> <translation id="6608140561353073361">Semua cookie dan data situs...</translation> +<translation id="6610183966322615106">Kesalahan saat menambahkan printer</translation> <translation id="6610610633807698299">Masukkan URL...</translation> <translation id="6612358246767739896">Konten dilindungi</translation> <translation id="6615455863669487791">Tunjukkan</translation> @@ -4267,7 +4274,6 @@ <translation id="6708242697268981054">Asal:</translation> <translation id="6709357832553498500">Sambungkan menggunakan <ph name="EXTENSIONNAME" /></translation> <translation id="6710213216561001401">Sebelumnya</translation> -<translation id="6712158998835983046">Tampilkan semua animasi</translation> <translation id="6718273304615422081">Membuat file zip...</translation> <translation id="671928215901716392">Gembok layar</translation> <translation id="6721972322305477112">&Berkas</translation> @@ -4539,7 +4545,6 @@ <translation id="7088434364990739311">Pengecekan pembaruan gagal dilakukan (kode kesalahan <ph name="ERROR" />).</translation> <translation id="708856090370082727">Aktifkan dukungan gulir penuh OSK. Dengan mengaktifkan tanda ini, OSK hanya akan mengubah ukuran area pandang visual.</translation> <translation id="7088674813905715446">Perangkat ini telah dialihkan ke status dibatalkan penetapannya oleh administrator. Agar bisa dipakai untuk pendaftaran, minta administrator mengubah status perangkat menjadi menunggu keputusan.</translation> -<translation id="7089609847854449639">Pengelola penyimpanan</translation> <translation id="708969677220991657">Memungkinkan permintaan ke localhost melalui HTTPS meskipun sertifikat yang tidak valid diberikan.</translation> <translation id="7092106376816104">Pengecualian munculan</translation> <translation id="7093866338626856921">Menukar data dengan perangkat yang bernama: <ph name="HOSTNAMES" /></translation> @@ -4579,7 +4584,7 @@ <translation id="715118844758971915">Printer klasik</translation> <translation id="7154130902455071009">Ubah laman awal Anda menjadi: <ph name="START_PAGE" /></translation> <translation id="7155171745945906037">Foto yang sudah ada dari kamera atau file</translation> -<translation id="715568033737470079">Menentukan plugin PPAPI yang akan dijalankan dengan kebijakan lockdown sandbox Win32k (khusus Windows 10 atau lebih tinggi).</translation> +<translation id="7155226869555939647">Selalu buka tautan untuk <ph name="APPLICATION" /></translation> <translation id="7156235233373189579">File ini dirancang untuk PC yang menggunakan perangkat lunak Windows. File ini tidak kompatibel dengan perangkat Anda yang menjalankan Chrome OS. Telusuri aplikasi pengganti yang sesuai di <ph name="BEGIN_LINK" />Chrome Web Store<ph name="END_LINK" />.<ph name="BEGIN_LINK_HELP" />Pelajari Lebih Lanjut<ph name="END_LINK_HELP" /></translation> <translation id="7157063064925785854">Dengan mengeklik Lanjutkan, Anda menyetujui <ph name="LEGAL_DOC_LINK_TEXT_1" />, <ph name="LEGAL_DOC_LINK_TEXT_2" />, <ph name="LEGAL_DOC_LINK_TEXT_3" />, dan <ph name="LEGAL_DOC_LINK_TEXT_4" />.</translation> <translation id="7158238151765743968">Sambungan ke "<ph name="DEVICE_NAME" />" sedang dalam proses.</translation> @@ -4594,6 +4599,7 @@ <translation id="7175353351958621980">Dimuat dari:</translation> <translation id="7180611975245234373">Segarkan</translation> <translation id="7180865173735832675">Sesuaikan</translation> +<translation id="7181387261278441780">Hapus dan setel ulang situs</translation> <translation id="7185078796915954712">TLS 1.3</translation> <translation id="7185690883425432021">Sembunyikan tombol tutup pada tab yang tidak aktif saat tabstrip berada dalam mode tumpukan.</translation> <translation id="7186088072322679094">Tetap sematkan di Bilah Alat</translation> @@ -4626,7 +4632,6 @@ <translation id="7223775956298141902">Payah... Anda tidak memiliki ekstensi :-(</translation> <translation id="7224023051066864079">Subnet mask:</translation> <translation id="7225179976675429563">Jenis jaringan hilang</translation> -<translation id="7230191962699768124">Tampilkan semua non-animasi</translation> <translation id="7230787553283372882">Menyesuaikan ukuran teks</translation> <translation id="7231224339346098802">Gunakan angka untuk mengindikasikan jumlah salinan yang akan dicetak (1 atau lebih).</translation> <translation id="7238585580608191973">SHA-256 Fingerprint</translation> @@ -4758,7 +4763,6 @@ <translation id="7409233648990234464">Luncurkan Kembali dan Powerwash</translation> <translation id="7409836189476010449">Jalankan Flash</translation> <translation id="7410344089573941623">Tanyakan jika <ph name="HOST" /> ingin mengakses kamera dan mikrofon Anda</translation> -<translation id="7411343637221933631">{NUM_COOKIES,plural, =1{1 dari situs ini}other{# dari situs ini}}</translation> <translation id="7412226954991670867">Memori GPU</translation> <translation id="7416362041876611053">Kesalahan jaringan tidak dikenal.</translation> <translation id="7417453074306512035">Keyboard Ethiopia</translation> @@ -4880,6 +4884,7 @@ <translation id="756445078718366910">Buka Jendela Browser</translation> <translation id="7564847347806291057">Akhiri proses</translation> <translation id="7566723889363720618">F12</translation> +<translation id="7567314848159753396">Cookie: <ph name="NAME" /></translation> <translation id="756809126120519699">Data Chrome telah dihapus</translation> <translation id="7568790562536448087">Memperbarui</translation> <translation id="7573172247376861652">Pengisian Daya Beterai</translation> @@ -4920,6 +4925,7 @@ <translation id="7626009897377900107">Pembuatan sandi</translation> <translation id="7627262197844840899">Situs ini tidak menerima MasterCard.</translation> <translation id="7627790789328695202">Ups, <ph name="FILE_NAME" /> sudah ada. Ganti nama dan coba lagi.</translation> +<translation id="7628127343934101653">Buka file PDF di aplikasi penampil PDF default.</translation> <translation id="762917759028004464">Browser default saat ini: <ph name="BROWSER_NAME" />.</translation> <translation id="7629536005696009600">Mengizinkan kredensial yang disimpan untuk aplikasi Android agar diisikan ke situs web yang sesuai.</translation> <translation id="7629827748548208700">Tab: <ph name="TAB_NAME" /></translation> @@ -5148,6 +5154,7 @@ <translation id="7957513156576779045">Aktifkan Bluetooth untuk mengizinkan penyandingan</translation> <translation id="7957615753207896812">Buka setelan perangkat keyboard</translation> <translation id="7959074893852789871">File berisi beberapa sertifikat, beberapa di antaranya tidak diimpor.</translation> +<translation id="7959700692661109221"><ph name="BEGIN_PARAGRAPH" />Layanan lokasi Google menggunakan sumber seperti Wi-Fi untuk membantu memperkirakan lokasi perangkat dengan lebih cepat dan lebih akurat. Jika layanan lokasi Google diaktifkan, perangkat Anda masuk ke mode yang menggunakan Wi-Fi untuk memberikan informasi lokasi. Anda dapat menonaktifkan layanan ini kapan saja di setelan lokasi.<ph name="END_PARAGRAPH" /></translation> <translation id="7961015016161918242">Tidak pernah</translation> <translation id="7964089325405904043">Impor dan ekspor sandi</translation> <translation id="7965010376480416255">Memori Bersama</translation> @@ -5298,6 +5305,7 @@ <translation id="8146793085009540321">Proses masuk gagal. Hubungi administrator Anda atau coba lagi.</translation> <translation id="8148264977957212129">Metode masukan Pinyin</translation> <translation id="8148913456785123871">Tampilkan kartu Google Now di peluncur</translation> +<translation id="8150391391298684512">Nonaktifkan API Windows Runtime MIDI</translation> <translation id="8151185429379586178">Alat pengembang</translation> <translation id="8151638057146502721">Konfigurasi</translation> <translation id="8151639108075998630">Aktifkan penjelajahan tamu</translation> @@ -5578,6 +5586,7 @@ <translation id="8532294913309524834">Urutkan bahasa berdasarkan preferensi.</translation> <translation id="8535005006684281994">Netscape Certificate Renewal URL</translation> <translation id="8539727552378197395">Tidak (HttpOnly)</translation> +<translation id="8541084862688000575">Muat otomatis aplikasi Android</translation> <translation id="8543181531796978784">Anda dapat <ph name="BEGIN_ERROR_LINK" />melaporkan masalah pendeteksian<ph name="END_ERROR_LINK" /> atau, jika memahami risiko bagi keamanan, Anda dapat <ph name="BEGIN_LINK" />mengunjungi situs yang tidak aman<ph name="END_LINK" />.</translation> <translation id="8545107379349809705">Sembunyikan info...</translation> <translation id="8545211332741562162">Mengaktifkan laman web untuk menggunakan fitur JavaScript eksperimental.</translation> @@ -5605,7 +5614,6 @@ <translation id="8569764466147087991">Pilih file yang akan dibuka</translation> <translation id="8571032220281885258">Saat Anda mengucapkan "Ok Google", Chrome akan menelusuri apa yang Anda ucapkan berikutnya.</translation> <translation id="8571108619753148184">Server 4</translation> -<translation id="8572832761467613633">Khusus Flash</translation> <translation id="8572981282494768930">Jangan izinkan situs mengakses kamera dan mikrofon Anda</translation> <translation id="8574234089711453001">Memungkinkan tombol unduhan muncul saat membuka laman dengan URL media.</translation> <translation id="857779305329188634">Mengaktifkan dukungan protokol QUIC eksperimental.</translation> @@ -5627,6 +5635,7 @@ <translation id="8600929685092827187">Aktifkan Paket</translation> <translation id="8601206103050338563">Autentikasi klien TLS WWW</translation> <translation id="8602851771975208551">Program lain di komputer Anda menambahkan aplikasi yang dapat mengubah cara kerja Chrome.</translation> +<translation id="8603912787021349466">Mengizinkan aplikasi Android mulai secara otomatis setelah masuk.</translation> <translation id="8605428685123651449">Memori SQLite</translation> <translation id="8605503133013456784">Gagal memutus sambungan dan menghapus penyandingan dari "<ph name="DEVICE_NAME" />".</translation> <translation id="8606726445206553943">Menggunakan perangkat MIDI Anda</translation> @@ -5979,6 +5988,7 @@ <translation id="9053965862400494292">Kesalahan terjadi saat mencoba menyiapkan sinkronisasi.</translation> <translation id="9056034633062863292">Memperbarui Chromebox</translation> <translation id="9056810968620647706">Tidak ditemukan kecocokan.</translation> +<translation id="9057119625587205566">Tidak ada printer di sekitar</translation> <translation id="9059868303873565140">Menu status</translation> <translation id="9064142312330104323">Foto Google profil (memuat)</translation> <translation id="9064275926664971810">Aktifkan IsiOtomatis untuk mengisi formulir dengan sekali klik</translation> @@ -5989,6 +5999,7 @@ <translation id="9067401056540256169">Tanda ini membuat Chrome tidak aman. Gunakan tanda ini hanya jika Anda memahami apa maksudnya. Perhatikan bahwa tanda ini dapat dibuang tanpa pemberitahuan apa pun. Jika diaktifkan, frame dengan https asal dapat menggunakan WebSocket dengan URL yang tidak aman (ws://).</translation> <translation id="9068931793451030927">Jalur:</translation> <translation id="9070219033670098627">Ganti orang</translation> +<translation id="9070940116164932228">Batasi pengatur waktu latar belakang yang terlalu tinggi</translation> <translation id="907148966137935206">Jangan izinkan situs apa pun menampilkan munculan (disarankan)</translation> <translation id="9072550133391925347"><ph name="PASSWORD_MANAGER_BRAND" /> otomatis memasukkan Anda ke situs dan aplikasi yang memenuhi syarat menggunakan sandi tersimpan.</translation> <translation id="9073281213608662541">PAP</translation> @@ -6022,6 +6033,7 @@ <translation id="9112614144067920641">Harap pilih PIN baru.</translation> <translation id="9112748030372401671">Ubah wallpaper Anda</translation> <translation id="9112987648460918699">Temukan...</translation> +<translation id="9114663181201435112">Masuk dengan mudah</translation> <translation id="9115487443206954631">Mengelola perangkat Cast</translation> <translation id="9115675100829699941">&Bookmark</translation> <translation id="9121814364785106365">Buka sebagai tab terpasang</translation> @@ -6116,7 +6128,6 @@ <translation id="952992212772159698">Tidak diaktifkan</translation> <translation id="960719561871045870">Kode operator</translation> <translation id="960987915827980018">Sekitar 1 jam lagi</translation> -<translation id="962778376131245616">Hanya tampilkan animasi yang tidak aman</translation> <translation id="96421021576709873">Jaringan Wi-Fi</translation> <translation id="965490406356730238">Mengaktifkan dekode mjpeg dengan percepatan perangkat keras untuk bingkai yang dijepret jika tersedia.</translation> <translation id="968174221497644223">Cache aplikasi</translation>
diff --git a/chrome/app/resources/generated_resources_it.xtb b/chrome/app/resources/generated_resources_it.xtb index 005c682c..47487b0 100644 --- a/chrome/app/resources/generated_resources_it.xtb +++ b/chrome/app/resources/generated_resources_it.xtb
@@ -18,7 +18,6 @@ <translation id="1029317248976101138">Dimensioni dei caratteri</translation> <translation id="1029595648591494741">Provare "<ph name="EXTENSION_NAME" />"?</translation> <translation id="1031362278801463162">Caricamento anteprima in corso</translation> -<translation id="1031460590482534116">Si è verificato un errore durante il tentativo di archiviare il certificato client. Errore <ph name="ERROR_NUMBER" /> (<ph name="ERROR_NAME" />).</translation> <translation id="1031573127485938293">Chiedi (in base alle norme)</translation> <translation id="103279545524624934">Libera spazio sul disco per avviare le app Android.</translation> <translation id="1033780634303702874">Accesso ai dispositivi seriali</translation> @@ -101,6 +100,7 @@ <translation id="1128591060186966949">Modifica motore di ricerca</translation> <translation id="1128987120443782698">Il dispositivo di archiviazione ha una capacità di <ph name="DEVICE_CAPACITY" />. Inserisci una scheda SD o una chiavetta USB con una capacità di almeno 4 GB.</translation> <translation id="1137135726305341424">Il caricamento di domContentLoaded e di tutte le risorse è iniziato prima di domContentLoaded (frame principale e frame con la stessa origine).</translation> +<translation id="1138663153846032155">Prediligi HTML rispetto a Flash</translation> <translation id="1140351953533677694">Accesso ai dispositivi seriali e Bluetooth</translation> <translation id="114140604515785785">Directory principale estensione:</translation> <translation id="1143142264369994168">Firmatario del certificato</translation> @@ -252,6 +252,7 @@ <translation id="1351692861129622852">Importazione di <ph name="FILE_COUNT" /> file...</translation> <translation id="1352103415082130575">Tastiera Thailandese (Pattachote)</translation> <translation id="1353686479385938207"><ph name="PROVIDER_NAME" />: <ph name="NETWORK_NAME" /></translation> +<translation id="1353946958707294039">Gestione memoria Material Design</translation> <translation id="1353966721814789986">Pagine di avvio</translation> <translation id="1354868058853714482">Adobe Reader non è aggiornato e potrebbe non essere sicuro.</translation> <translation id="1355408554203439639">Unità di rasterizzazione software 3D</translation> @@ -423,7 +424,6 @@ <translation id="1533920822694388968">Allineamento TV</translation> <translation id="15373452373711364">Puntatore del mouse grande</translation> <translation id="1543284117603151572">Importati da Edge</translation> -<translation id="1544350195767834591">{NUM_COOKIES,plural, =1{1 da altri siti}other{# da altri siti}}</translation> <translation id="1545177026077493356">Modalità kiosk automatica</translation> <translation id="1545786162090505744">URL con %s al posto della query</translation> <translation id="1546280085599573572">Questa estensione ha cambiato la pagina mostrata quando fai clic sul pulsante Pagina iniziale.</translation> @@ -447,7 +447,6 @@ <translation id="1559235587769913376">Consente di inserire caratteri Unicode</translation> <translation id="1561092721008294962">HarfBuzz per il testo dell'interfaccia utente</translation> <translation id="1566049601598938765">Sito web</translation> -<translation id="1566958206723629112">Flash e PDF</translation> <translation id="1567723158593978621">Se l'opzione viene attivata, per accedere al browser viene utilizzato il nuovo flusso di accesso Gaia separato da password.</translation> <translation id="1567993339577891801">Console JavaScript</translation> <translation id="1568323446248056064">Apri le impostazioni dello schermo</translation> @@ -576,7 +575,6 @@ <translation id="1723940674997333416">Consenti WebSocket non sicuro da origine https</translation> <translation id="1725149567830788547">Mostra &controlli</translation> <translation id="172612876728038702">Configurazione del chip TPM in corso. Attendi; l'operazione potrebbe richiedere alcuni minuti.</translation> -<translation id="1727135806684246609">Dettagli sulla sicurezza in Material Design</translation> <translation id="1729533290416704613">Controlla anche la pagina visualizzata quando esegui ricerche dalla Omnibox.</translation> <translation id="1731346223650886555">Punto e virgola</translation> <translation id="1731589410171062430">Totale: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /> (<ph name="NUMBER_OF_PAGES" /> <ph name="PAGE_OR_PAGES_LABEL" />)</translation> @@ -872,6 +870,7 @@ <translation id="218492098606937156">Attiva eventi al tocco</translation> <translation id="2187317261103489799">Rileva (predefinita)</translation> <translation id="2187895286714876935">Errore di importazione del certificato del server</translation> +<translation id="2188881192257509750">Apri <ph name="APPLICATION" /></translation> <translation id="2190069059097339078">WiFi Credentials Getter</translation> <translation id="219008588003277019">Modulo Native Client: <ph name="NEXE_NAME" /></translation> <translation id="2190355936436201913">(vuoto)</translation> @@ -990,6 +989,7 @@ <translation id="2326606747676847821">Naviga in incognito</translation> <translation id="2326931316514688470">&Ricarica app</translation> <translation id="2327492829706409234">Attiva applicazione</translation> +<translation id="2328054044222305089">Verranno eliminati tutti i dati memorizzati dal sito <ph name="SITE" /> sul dispositivo e verranno reimpostate le eventuali autorizzazioni concesse. Vuoi continuare?</translation> <translation id="2329597144923131178">Accedi per visualizzare i tuoi Preferiti, la cronologia, le password e altre impostazioni su tutti i tuoi dispositivi.</translation> <translation id="2332131598580221120">Visualizza nello store</translation> <translation id="2332742915001411729">Ripristina impostazioni predefinite</translation> @@ -1264,7 +1264,6 @@ <translation id="2675358154061544447">Supporto altamente sperimentale del rendering di iframe tra siti in processi separati. In questa modalità, i documenti avranno uno stesso processo di rendering soltanto se deriveranno dallo stesso sito web.</translation> <translation id="2676946222714718093">In riproduzione su:</translation> <translation id="2678063897982469759">Riattiva</translation> -<translation id="2678246812096664977">Tutti i plug-in</translation> <translation id="2679385451463308372">Stampa utilizzando la finestra di dialogo di sistema…</translation> <translation id="2680208403056680091">La tua connessione Internet è controllata</translation> <translation id="268053382412112343">Cr&onologia</translation> @@ -1438,7 +1437,6 @@ <translation id="287286579981869940">Aggiungi <ph name="PROVIDER_NAME" />...</translation> <translation id="2872961005593481000">Spegni</translation> <translation id="2875698561019555027">(pagine di errore Chrome)</translation> -<translation id="2879560882721503072">Memorizzazione riuscita del certificato client rilasciato da <ph name="ISSUER" />.</translation> <translation id="288024221176729610">Ceco</translation> <translation id="288042212351694283">Accesso ai tuoi dispositivi Universal 2nd Factor</translation> <translation id="2881966438216424900">Ultimo accesso:</translation> @@ -1587,6 +1585,7 @@ <translation id="3057861065630527966">Effettua il backup di foto e video</translation> <translation id="3058212636943679650">Se fosse necessario ripristinare il sistema operativo del computer, avrai bisogno di una scheda SD o di una chiavetta USB di ripristino.</translation> <translation id="305932878998873762">La cache semplice per HTTP è una nuova cache che si basa sul filesystem per l'allocazione dello spazio su disco.</translation> +<translation id="3060251871394327123">Verranno eliminati tutti i dati memorizzati dal sito <ph name="SITE" /> sul dispositivo. Vuoi continuare?</translation> <translation id="3061650404498811439">Consenti l'accesso a emoji, scrittura a mano libera e input vocale dal menu IME.</translation> <translation id="3062606427884046423">Utilizza le notifiche Android MediaStyle per le notifiche multimediali di Chrome.</translation> <translation id="3063844757726132584">Accedi rapidamente a tutte le tue app da Avvio applicazioni. Gioca, videochatta, ascolta musica, modifica documenti o scarica altre app.</translation> @@ -1636,6 +1635,7 @@ <translation id="3123569374670379335">(Supervisionato)</translation> <translation id="3124111068741548686">Handle UTENTE</translation> <translation id="3126026824346185272">Ctrl</translation> +<translation id="3127156390846601284">Verranno eliminati tutti i dati memorizzati sul dispositivo relativi a tutti i i siti mostrati. Vuoi continuare?</translation> <translation id="312759608736432009">Produttore dispositivo:</translation> <translation id="3127919023693423797">Autenticazione in corso...</translation> <translation id="3128230619496333808">Scheda 6</translation> @@ -1734,7 +1734,6 @@ <translation id="3264544094376351444">Carattere sans-serif</translation> <translation id="3264547943200567728">Configurazione della rete del Chromebox non riuscita</translation> <translation id="3265459715026181080">Chiudi finestra</translation> -<translation id="3267271790328635957">Solo PDF</translation> <translation id="3267726687589094446">Continua a consentire download automatici di più file</translation> <translation id="3267998849713137817">Data/ora modifica</translation> <translation id="3268451620468152448">Schede aperte</translation> @@ -1978,6 +1977,7 @@ <translation id="3574210789297084292">accedi</translation> <translation id="3574305903863751447"><ph name="CITY" />, <ph name="STATE" /> <ph name="COUNTRY" /></translation> <translation id="357479282490346887">Lituano</translation> +<translation id="3575927481544652747">Consente di disattivare l'API Windows Runtime MIDI per WebMIDI, che è attiva per impostazione predefinita su Windows 10 o versioni successive.</translation> <translation id="3576324189521867626">Installata</translation> <translation id="3578331450833904042">Predefinito (viene rilevato tutto)</translation> <translation id="3578594933904494462">I contenuti di questa scheda vengono condivisi.</translation> @@ -2031,8 +2031,6 @@ <translation id="3627320433825461852">Meno di un minuto rimanente</translation> <translation id="3627588569887975815">Apri link in finestra di navigazione in inco&gnito</translation> <translation id="3627671146180677314">Data di rinnovo certificato Netscape</translation> -<translation id="3629326610814700057">Consente allo strumento di gestione della memoria di gestire lo spazio di archiviazione locale.</translation> -<translation id="3630337581925712713"><ph name="PERMISSION_TYPE_LABEL" />:</translation> <translation id="3631337165634322335">Le eccezioni che seguono valgono soltanto per l'attuale sessione di navigazione in incognito.</translation> <translation id="3633586230741134985">Impostazioni Avvio applicazioni</translation> <translation id="3633997706330212530">Puoi scegliere di disattivare questi servizi.</translation> @@ -2055,7 +2053,8 @@ <translation id="3654045516529121250">Lettura delle impostazioni di accessibilità</translation> <translation id="3654092442379740616">Errore di sincronizzazione. <ph name="PRODUCT_NAME" /> è obsoleto e deve essere aggiornato.</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{Ha accesso permanente a un file.}other{Ha accesso permanente a # file.}}</translation> -<translation id="3657468915905674858">Attiva blocco Win32k PPAPI.</translation> +<translation id="365793796291733849"><ph name="BEGIN_PARAGRAPH1" />Se attivi il backup automatico, i dati delle app e del dispositivo vengono salvati periodicamente in una cartella privata in Google Drive. Per dati delle app si intende qualsiasi dato salvato in un'app (in base alle impostazioni sviluppatore), inclusi i dati potenzialmente sensibili, come contatti, messaggi e foto.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />I dati di backup non incidono sulla quota di spazio di archiviazione di Google Drive. Non verrà effettuato il backup dei file di grandi dimensioni o dei file che gli sviluppatori hanno deciso di escludere dal servizio.<ph name="END_PARAGRAPH2" /></translation> <translation id="3660234220361471169">Non attendibile</translation> <translation id="3665589677786828986">Chrome ha rilevato che alcune impostazioni sono state danneggiate da un altro programma e le ha ripristinate con i valori originali predefiniti.</translation> <translation id="3665842570601375360">Sicurezza:</translation> @@ -2110,6 +2109,7 @@ <translation id="3733127536501031542">Server SSL con step-up</translation> <translation id="3736520371357197498">Se sei consapevole dei rischi per la tua sicurezza, potresti <ph name="BEGIN_LINK" />visitare questo sito non sicuro<ph name="END_LINK" /> senza aspettare che vengano rimossi i programmi pericolosi.</translation> <translation id="3738924763801731196"><ph name="OID" />:</translation> +<translation id="3739254215541673094">Aprire <ph name="APPLICATION" />?</translation> <translation id="3739798227959604811">Ritardo prima della ripetizione:</translation> <translation id="3741158646617793859"><ph name="DEVICE_NAME" /> verrà ora visualizzato nella Console di amministrazione</translation> <translation id="3741243925913727067">Effettua il backup su Google Drive di foto e video memorizzati sul tuo dispositivo multimediale.</translation> @@ -2348,7 +2348,6 @@ <translation id="4058793769387728514">Controlla documento ora</translation> <translation id="4059285154003114015">&Stampa frame...</translation> <translation id="406070391919917862">Applicazioni in background</translation> -<translation id="4061502419206152498">Mostra solo non sicuri, non animati</translation> <translation id="4062251648694601778">Utilizza al meglio il tuo dispositivo <ph name="SHORT_PRODUCT_NAME" />. Hai domande? Puoi ricevere assistenza in qualsiasi momento facendo clic su "?" nella barra di stato.</translation> <translation id="4065876735068446555">La rete in uso (<ph name="NETWORK_ID" />) potrebbe richiedere la visita della relativa pagina di accesso.</translation> <translation id="4068506536726151626">Questa pagina contiene elementi dai seguenti siti che stanno rilevando la tua posizione:</translation> @@ -2387,7 +2386,6 @@ <translation id="4101878899871018532">Gestione password non proporrà di salvare la credenziale utilizzata per la sincronizzazione.</translation> <translation id="410351446219883937">Riproduzione automatica</translation> <translation id="4104163789986725820">E&sporta...</translation> -<translation id="4105523032910086267">Imposta l'animazione e la visibilità dei dettagli sulla sicurezza in Material Design</translation> <translation id="4105563239298244027">Ottieni 1 TB gratis con Google Drive</translation> <translation id="4109135793348361820">Sposta finestra su <ph name="USER_NAME" /> (<ph name="USER_EMAIL" />)</translation> <translation id="4110342520124362335">Cookie provenienti da <ph name="DOMAIN" /> bloccati.</translation> @@ -2438,6 +2436,7 @@ <translation id="418179967336296930">Tastiera fonetica russa (YaZHert)</translation> <translation id="4181841719683918333">Lingue</translation> <translation id="4187248015940562149">Attiva Web Bluetooth, che potrebbe permettere ai siti web di connettersi ai dispositivi Bluetooth nelle vicinanze e di assumerne il controllo.</translation> +<translation id="4188447344915957833">Consente di attivare Gestione memoria nelle impostazioni di Material Design.</translation> <translation id="4189406272289638749">Un'estensione, <b><ph name="EXTENSION_NAME" /></b>, controlla questa impostazione.</translation> <translation id="4193154014135846272">Documento Google</translation> <translation id="4193182321948161343">Attiva Gestione utenti di Material Design</translation> @@ -2645,6 +2644,7 @@ <translation id="4508765956121923607">Visualizza s&orgente</translation> <translation id="4509017836361568632">Elimina foto</translation> <translation id="4509345063551561634">Percorso:</translation> +<translation id="4513946894732546136">Feedback</translation> <translation id="4514542542275172126">Configura un nuovo utente supervisionato</translation> <translation id="4514914692061505365">Consente di forzare l'utilizzo del veloce traduttore Subzero di PNaCl per tutti i file pexe.</translation> <translation id="451515744433878153">Rimuovi</translation> @@ -2743,6 +2743,7 @@ <translation id="4656293982926141856">Questo computer</translation> <translation id="4656631038341342120">Attiva shell per la realtà virtuale se disponibile per questo dispositivo.</translation> <translation id="4657031070957997341">Consenti sempre i plug-in su <ph name="HOST" /></translation> +<translation id="466008749075469935">Consente l'intervento per limitare all'1% l'utilizzo di CPU da parte dei timer in background.</translation> <translation id="4663254525753315077">Quando è possibile, posiziona i contenuti scorrevoli di un elemento di overflow in un livello composito per velocizzare lo scorrimento.</translation> <translation id="4664482161435122549">Errore di esportazione di PKCS #12</translation> <translation id="4665014895760275686">Produttore</translation> @@ -2808,6 +2809,7 @@ <translation id="4749157430980974800">Tastiera Georgiano</translation> <translation id="4750394297954878236">Suggerimenti</translation> <translation id="475088594373173692">Primo utente</translation> +<translation id="4750892496809949692">Consente di prediligere i contenuti HTML nascondendo Flash nell'elenco dei plug-in.</translation> <translation id="4750917950439032686">Le tue informazioni (ad esempio password o numeri di carte di credito) restano private quando vengono inviate a questo sito.</translation> <translation id="4753602155423695878">Animazione della barra di avanzamento del caricamento delle pagine sui telefoni Android</translation> <translation id="4755240240651974342">Tastiera finlandese</translation> @@ -3082,6 +3084,7 @@ <translation id="5119450342834678097">Opzione di richiesta del sito per il tablet nel menu di impostazioni</translation> <translation id="5120068803556741301">Metodo di immissione di terze parti</translation> <translation id="5120421890733714118">Considera attendibile questo certificato per l'identificazione dei siti web.</translation> +<translation id="5120516977819314347">Codice PIN o password errati.</translation> <translation id="5121130586824819730">Il disco rigido è pieno. Salva in un'altra posizione o libera spazio sul disco rigido.</translation> <translation id="5125751979347152379">URL non valido.</translation> <translation id="5127881134400491887">Gestione di connessioni di rete</translation> @@ -3089,6 +3092,7 @@ <translation id="512903556749061217">collegato</translation> <translation id="5129301143853688736">La tua connessione a questo sito non è privata. Gli autori di attacchi potrebbero provare a impossessarsi dei tuoi dati da <ph name="DOMAIN" /> (ad esempio, foto, password, messaggi e carte di credito).</translation> <translation id="5129662217315786329">Polacco</translation> +<translation id="5131347545782851480">Documenti PDF</translation> <translation id="5134856901811723984">Material Design nell'interfaccia utente del sistema Chrome OS</translation> <translation id="5135533361271311778">Impossibile creare l'elemento nei Preferiti.</translation> <translation id="5136529877787728692">F7</translation> @@ -3256,6 +3260,7 @@ <translation id="5328031682234198929">8</translation> <translation id="5329858601952122676">&Elimina</translation> <translation id="5330145655348521461">Questi file sono aperti su un desktop differente. Passa a <ph name="USER_NAME" /> (<ph name="MAIL_ADDRESS" />) per visualizzarli.</translation> +<translation id="5330512191124428349">Ottieni informazioni</translation> <translation id="5332624210073556029">Fuso orario:</translation> <translation id="5333807720589685258">La scheda SIM verrà definitivamente disabilitata se non sei in grado di inserire il codice di sblocco PIN corretto.</translation> @@ -3688,7 +3693,6 @@ <translation id="5892507820957994680">Esegue l'override dell'elenco di rendering integrato e attiva l'accelerazione GPU per le configurazioni di sistema non supportate.</translation> <translation id="5895138241574237353">Riavvia</translation> <translation id="5895187275912066135">Emesso in data</translation> -<translation id="5898154795085152510">Il server ha restituito un certificato client non valido. Errore <ph name="ERROR_NUMBER" /> (<ph name="ERROR_NAME" />).</translation> <translation id="5900302528761731119">Foto profilo Google</translation> <translation id="590253956165195626">Consenti di tradurre pagine in lingue che non conosci.</translation> <translation id="5904093760909470684">Configurazione proxy</translation> @@ -3743,6 +3747,8 @@ <translation id="5984222099446776634">Visitati di recente</translation> <translation id="5984814259619230127">Smart Lock per rilevamento tramite Bluetooth Low Energy</translation> <translation id="5986245990306121338">Se l'opzione viene attivata, viene mostrato un selettore di schede anche quando l'opzione "Unisci schede e app" è attiva nelle impostazioni.</translation> +<translation id="5989712527536636369"><ph name="BEGIN_PARAGRAPH1" />Si tratta di informazioni generali sul tuo dispositivo e sulla relativa modalità di utilizzo, ad esempio informazioni su livello della batteria, frequenza di utilizzo delle app, qualità e durata delle connessioni di rete (ad esempio Wi-Fi e Bluetooth), nonché rapporti sugli arresti anomali quando si verificano anomalie di funzionamento. Tali informazioni verranno utilizzate per migliorare i prodotti e i servizi Google per tutti. Alcune informazioni globali consentono anche ai partner, come gli sviluppatori Android, di migliorare i loro prodotti e le loro app.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Puoi attivare o disattivare questa opzione in qualsiasi momento nelle impostazioni delle app Android. Questa opzione non incide sulla capacità del dispositivo di inviare le informazioni necessarie per ricevere servizi essenziali quali gli aggiornamenti di sistema e la sicurezza.<ph name="END_PARAGRAPH2" /></translation> <translation id="5990198433782424697">Estensioni su URL chrome://</translation> <translation id="5990814808592353318">Generazione di password manuale.</translation> <translation id="5991049340509704927">Ingrandisci</translation> @@ -3756,6 +3762,7 @@ <translation id="6005695835120147974">Media Router</translation> <translation id="6007237601604674381">Spostamento non riuscito. <ph name="ERROR_MESSAGE" /></translation> <translation id="6008241731410823808">Consente di inviare ping di controllo dei link ipertestuali.</translation> +<translation id="6011449291337289699">Cancella i dati del sito</translation> <translation id="6015796118275082299">Anno</translation> <translation id="6016551720757758985">Se confermi il Powerwash viene ripristinata la versione precedente</translation> <translation id="6016809788585079594">Dì "Ok Google" per l'ultima volta</translation> @@ -3945,7 +3952,6 @@ <translation id="6276301056778294989">Assicurati che sul dispositivo sia visualizzato lo stesso codice.</translation> <translation id="6277105963844135994">Timeout di rete</translation> <translation id="6277518330158259200">&Acquisisci screenshot</translation> -<translation id="6278428485366576908">Tema</translation> <translation id="6279183038361895380">Premi |<ph name="ACCELERATOR" />| per mostrare il puntatore</translation> <translation id="6280215091796946657">Accedi con un altro account</translation> <translation id="6280912520669706465">ARC</translation> @@ -4197,6 +4203,7 @@ <translation id="6607272825297743757">Info sul file</translation> <translation id="6607831829715835317">A&ltri strumenti</translation> <translation id="6608140561353073361">Tutti i cookie e i dati dei siti...</translation> +<translation id="6610183966322615106">Errore durante l'aggiunta della stampante</translation> <translation id="6610610633807698299">Inserisci URL...</translation> <translation id="6612358246767739896">Contenuti protetti</translation> <translation id="6615455863669487791">Mostrami</translation> @@ -4260,7 +4267,6 @@ <translation id="6708242697268981054">Origine:</translation> <translation id="6709357832553498500">Connettiti utilizzando <ph name="EXTENSIONNAME" /></translation> <translation id="6710213216561001401">Indietro</translation> -<translation id="6712158998835983046">Mostra tutti, animati</translation> <translation id="6718273304615422081">Compressione...</translation> <translation id="671928215901716392">Blocco schermo</translation> <translation id="6721972322305477112">&File</translation> @@ -4533,7 +4539,6 @@ <translation id="7088434364990739311">Impossibile iniziare controllo disponibilità aggiornamenti (codice di errore <ph name="ERROR" />).</translation> <translation id="708856090370082727">Attiva il supporto dello scorrimento orizzontale per OSK. Se questo flag è selezionato, l'OSK ridimensionerà solo l'area visibile generale.</translation> <translation id="7088674813905715446">L'amministratore ha attivato lo stato Non predisposto per questo dispositivo. Per poter registrare il dispositivo, chiedi all'amministratore di attivare uno stato in sospeso.</translation> -<translation id="7089609847854449639">Gestione memoria</translation> <translation id="708969677220991657">Consente le richieste a localhost tramite HTTPS anche quando viene presentato un certificato non valido.</translation> <translation id="7092106376816104">Eccezioni popup</translation> <translation id="7093866338626856921">Scambio di dati con i dispositivi: <ph name="HOSTNAMES" /></translation> @@ -4573,7 +4578,7 @@ <translation id="715118844758971915">Stampanti classiche</translation> <translation id="7154130902455071009">Cambio della pagina iniziale con: <ph name="START_PAGE" /></translation> <translation id="7155171745945906037">Foto esistente da fotocamera o file</translation> -<translation id="715568033737470079">Specifica i plug-in PPAPI che verranno eseguiti nella norma relativa alla sandbox di blocco di Win32k (solo per Windows 10 e versioni successive).</translation> +<translation id="7155226869555939647">Apri sempre i link di <ph name="APPLICATION" /></translation> <translation id="7156235233373189579">Questo file è supportato su PC con software Windows. Non è compatibile con i dispositivi con Chrome OS. Cerca sul <ph name="BEGIN_LINK" />Chrome Web Store<ph name="END_LINK" /> un'app sostitutiva adatta.<ph name="BEGIN_LINK_HELP" />Ulteriori informazioni<ph name="END_LINK_HELP" /></translation> <translation id="7157063064925785854">Se fai clic su Continua, accetti i <ph name="LEGAL_DOC_LINK_TEXT_1" />, <ph name="LEGAL_DOC_LINK_TEXT_2" />, <ph name="LEGAL_DOC_LINK_TEXT_3" /> e le <ph name="LEGAL_DOC_LINK_TEXT_4" />.</translation> <translation id="7158238151765743968">Connessione a "<ph name="DEVICE_NAME" />" ancora in corso.</translation> @@ -4588,6 +4593,7 @@ <translation id="7175353351958621980">Caricamento da:</translation> <translation id="7180611975245234373">Aggiorna</translation> <translation id="7180865173735832675">Personalizza</translation> +<translation id="7181387261278441780">Cancella e reimposta sito</translation> <translation id="7185078796915954712">TLS 1.3</translation> <translation id="7185690883425432021">Consente di nascondere i pulsanti di chiusura delle schede non attive quando la tabstrip è in modalità sovrapposta.</translation> <translation id="7186088072322679094">Mantieni in barra degli strumenti</translation> @@ -4620,7 +4626,6 @@ <translation id="7223775956298141902">Non hai estensioni :-(</translation> <translation id="7224023051066864079">Subnet mask:</translation> <translation id="7225179976675429563">Tipo di rete mancante</translation> -<translation id="7230191962699768124">Mostra tutti, non animati</translation> <translation id="7230787553283372882">Personalizza la dimensione del testo</translation> <translation id="7231224339346098802">Specifica un numero per indicare il numero di copie da stampare (1 o più).</translation> <translation id="7238585580608191973">Impronta digitale SHA-256</translation> @@ -4745,7 +4750,6 @@ <translation id="7409233648990234464">Riavvia ed esegui Powerwash</translation> <translation id="7409836189476010449">Esegui Flash</translation> <translation id="7410344089573941623">Chiedi conferma se <ph name="HOST" /> vuole accedere alla webcam e al microfono</translation> -<translation id="7411343637221933631">{NUM_COOKIES,plural, =1{1 da questo sito}other{# da questo sito}}</translation> <translation id="7412226954991670867">Memoria GPU</translation> <translation id="7416362041876611053">Errore di rete sconosciuto.</translation> <translation id="7417453074306512035">Tastiera Etiope</translation> @@ -4865,6 +4869,7 @@ <translation id="756445078718366910">Apri finestra del browser</translation> <translation id="7564847347806291057">Termina processo</translation> <translation id="7566723889363720618">F12</translation> +<translation id="7567314848159753396">Cookie: <ph name="NAME" /></translation> <translation id="756809126120519699">Dati di Chrome cancellati</translation> <translation id="7568790562536448087">Aggiornamento</translation> <translation id="7573172247376861652">Carica della batteria</translation> @@ -4905,6 +4910,7 @@ <translation id="7626009897377900107">Generazione di password</translation> <translation id="7627262197844840899">Questo sito non accetta MasterCard.</translation> <translation id="7627790789328695202">Spiacenti. <ph name="FILE_NAME" /> esiste già. Rinominarlo e riprovare.</translation> +<translation id="7628127343934101653">Apri i file PDF nell'applicazione di visualizzazione di file PDF predefinita.</translation> <translation id="762917759028004464">Al momento il browser predefinito è <ph name="BROWSER_NAME" />.</translation> <translation id="7629536005696009600">Autorizza l'inserimento delle credenziali archiviate per le applicazioni Android nei siti web corrispondenti.</translation> <translation id="7629827748548208700">Scheda: <ph name="TAB_NAME" /></translation> @@ -5133,6 +5139,7 @@ <translation id="7957513156576779045">Attiva il Bluetooth per consentire l'accoppiamento</translation> <translation id="7957615753207896812">Apri le impostazioni della tastiera</translation> <translation id="7959074893852789871">Il file conteneva più certificati, alcuni dei quali non sono stati importati:</translation> +<translation id="7959700692661109221"><ph name="BEGIN_PARAGRAPH" />Il servizio di geolocalizzazione di Google utilizza fonti quali le reti Wi-Fi per stabilire in modo più rapido e preciso la posizione del dispositivo. Se attivi i servizi di geolocalizzazione di Google, sul dispositivo viene attivata una modalità che utilizza il Wi-Fi per fornire informazioni sulla posizione. Puoi disattivare questa funzione in qualsiasi momento nelle impostazioni Geolocalizzazione.<ph name="END_PARAGRAPH" /></translation> <translation id="7961015016161918242">Mai</translation> <translation id="7964089325405904043">Importazione ed esportazione di password</translation> <translation id="7965010376480416255">Memoria condivisa</translation> @@ -5283,6 +5290,7 @@ <translation id="8146793085009540321">Accesso non riuscito. Contatta l'amministratore o riprova.</translation> <translation id="8148264977957212129">Metodo di immissione Pinyin</translation> <translation id="8148913456785123871">Mostra schede Google Now in Avvio applicazioni</translation> +<translation id="8150391391298684512">Disattiva l'API Windows Runtime MIDI</translation> <translation id="8151185429379586178">Strumenti per sviluppatori</translation> <translation id="8151638057146502721">Configura</translation> <translation id="8151639108075998630">Attiva navigazione come ospite</translation> @@ -5563,6 +5571,7 @@ <translation id="8532294913309524834">Ordina le lingue in base alle tue preferenze.</translation> <translation id="8535005006684281994">URL di rinnovo certificato Netscape</translation> <translation id="8539727552378197395">No (solo Http)</translation> +<translation id="8541084862688000575">Carica automaticamente le app Android</translation> <translation id="8543181531796978784">Puoi <ph name="BEGIN_ERROR_LINK" />segnalare un problema di rilevamento<ph name="END_ERROR_LINK" /> oppure, se sei consapevole dei rischi per la tua sicurezza, <ph name="BEGIN_LINK" />visita questo sito non sicuro<ph name="END_LINK" />.</translation> <translation id="8545107379349809705">Nascondi informazioni...</translation> <translation id="8545211332741562162">Attiva l'utilizzo delle funzioni JavaScript sperimentali per le pagine web.</translation> @@ -5590,7 +5599,6 @@ <translation id="8569764466147087991">Seleziona un file da aprire</translation> <translation id="8571032220281885258">Quando pronunci "OK Google", Chrome cercherà le parole che pronunci subito dopo.</translation> <translation id="8571108619753148184">Server 4</translation> -<translation id="8572832761467613633">Solo Flash</translation> <translation id="8572981282494768930">Non consentire ai siti di accedere alla tua fotocamera e al tuo microfono</translation> <translation id="8574234089711453001">Consenti la visualizzazione di un pulsante Scarica all'apertura di una pagina con URL file multimediale.</translation> <translation id="857779305329188634">Consente di attivare il supporto del protocollo sperimentale QUIC.</translation> @@ -5612,6 +5620,7 @@ <translation id="8600929685092827187">Riattiva per pacchetti</translation> <translation id="8601206103050338563">Autenticazione TLS client WWW</translation> <translation id="8602851771975208551">Un altro programma sul computer ha aggiunto un'applicazione che potrebbe modificare il funzionamento di Chrome.</translation> +<translation id="8603912787021349466">Consente di avviare automaticamente le app Android dopo l'accesso.</translation> <translation id="8605428685123651449">Memoria SQLite</translation> <translation id="8605503133013456784">Impossibile scollegarsi da "<ph name="DEVICE_NAME" />" e annullare l'accoppiamento.</translation> <translation id="8606726445206553943">Utilizzare i tuoi dispositivi MIDI</translation> @@ -5964,6 +5973,7 @@ <translation id="9053965862400494292">Si è verificato un errore durante il tentativo di configurazione della sincronizzazione.</translation> <translation id="9056034633062863292">Aggiornamento del Chromebox</translation> <translation id="9056810968620647706">Nessuna corrispondenza trovata.</translation> +<translation id="9057119625587205566">Nessuna stampante nelle vicinanze</translation> <translation id="9059868303873565140">Menu Stato</translation> <translation id="9064142312330104323">Foto profilo Google (caricamento in corso)</translation> <translation id="9064275926664971810">Attiva la funzione Compilazione automatica per compilare i moduli con un singolo clic</translation> @@ -5974,6 +5984,7 @@ <translation id="9067401056540256169">Questo flag rende Chrome non sicuro. Utilizzalo soltanto se ne conosci la funzione. Tieni presente che questo flag potrebbe essere rimosso senza preavviso. Se viene attivato, i frame con un'origine https possono utilizzare WebSocket con un URL non sicuro (ws://).</translation> <translation id="9068931793451030927">Percorso:</translation> <translation id="9070219033670098627">Cambia persona</translation> +<translation id="9070940116164932228">Limita i timer in background che usano molta CPU</translation> <translation id="907148966137935206">Non consentire la visualizzazione di popup nei siti (consigliata)</translation> <translation id="9072550133391925347"><ph name="PASSWORD_MANAGER_BRAND" /> ti consente di accedere automaticamente alle app e ai siti idonei con le password salvate.</translation> <translation id="9073281213608662541">PAP</translation> @@ -6007,6 +6018,7 @@ <translation id="9112614144067920641">Scegli un nuovo PIN.</translation> <translation id="9112748030372401671">Modifica dello sfondo</translation> <translation id="9112987648460918699">Trova...</translation> +<translation id="9114663181201435112">Accedi facilmente</translation> <translation id="9115487443206954631">Gestisci i dispositivi Cast</translation> <translation id="9115675100829699941">&Preferiti</translation> <translation id="9121814364785106365">Apri in una scheda bloccata</translation> @@ -6101,7 +6113,6 @@ <translation id="952992212772159698">Non attivo</translation> <translation id="960719561871045870">Codice operatore</translation> <translation id="960987915827980018">Circa un'ora rimanente</translation> -<translation id="962778376131245616">Mostra solo non sicuri, animati</translation> <translation id="96421021576709873">Rete Wi-Fi</translation> <translation id="965490406356730238">Abilita la codifica mjpeg con accelerazione hardware per il frame acquisito, se disponibile.</translation> <translation id="968174221497644223">Cache applicazione</translation>
diff --git a/chrome/app/resources/generated_resources_iw.xtb b/chrome/app/resources/generated_resources_iw.xtb index ca07611f..f2080a3 100644 --- a/chrome/app/resources/generated_resources_iw.xtb +++ b/chrome/app/resources/generated_resources_iw.xtb
@@ -18,7 +18,6 @@ <translation id="1029317248976101138">התקרב</translation> <translation id="1029595648591494741">רוצה לנסות את "<ph name="EXTENSION_NAME" />"?</translation> <translation id="1031362278801463162">טוען תצוגה מקדימה</translation> -<translation id="1031460590482534116">אירעה שגיאה במהלך ניסיון לאחסן את אישור הלקוח. שגיאה <ph name="ERROR_NUMBER" /> (<ph name="ERROR_NAME" />).</translation> <translation id="1031573127485938293">שאל (לפי מדיניות)</translation> <translation id="103279545524624934">עליך לפנות שטח אחסון כדי להפעיל אפליקציות Android.</translation> <translation id="1033780634303702874">גישה להתקנים הסיריאליים שלך</translation> @@ -101,6 +100,7 @@ <translation id="1128591060186966949">עריכת מנוע חיפוש</translation> <translation id="1128987120443782698">התקן האחסון הוא בעל קיבולת של <ph name="DEVICE_CAPACITY" />. הכנס כרטיס SD או מקל זיכרון USB עם קיבולת של 4GB לפחות.</translation> <translation id="1137135726305341424">domContentLoaded וכל טעינות המשאבים שהחלו לפני domContentLoaded (מסגרת ראשית ואותן מסגרות iframe מקוריות).</translation> +<translation id="1138663153846032155">העדף HTML על Flash</translation> <translation id="1140351953533677694">גישה ל-Bluetooth ולהתקנים סיריאליים</translation> <translation id="114140604515785785">ספריית בסיס של תוסף:</translation> <translation id="1143142264369994168">חותם על אישור </translation> @@ -252,6 +252,7 @@ <translation id="1351692861129622852">מייבא <ph name="FILE_COUNT" /> קבצים...</translation> <translation id="1352103415082130575">מקלדת תאילנדית (Pattachote)</translation> <translation id="1353686479385938207"><ph name="PROVIDER_NAME" />: <ph name="NETWORK_NAME" /></translation> +<translation id="1353946958707294039">מנהל אחסון בעיצוב חדשני תלת-ממדי</translation> <translation id="1353966721814789986">דפי הפעלה</translation> <translation id="1354868058853714482">Adobe Reader אינו מעודכן ועשוי להיות לא מאובטח.</translation> <translation id="1355408554203439639">יוצר רשת הנקודות של תוכנות תלת ממד</translation> @@ -419,7 +420,6 @@ <translation id="1533920822694388968">יישור טלוויזיה</translation> <translation id="15373452373711364">סמן עכבר גדול</translation> <translation id="1543284117603151572">מיובא מ-Edge</translation> -<translation id="1544350195767834591">{NUM_COOKIES,plural, =1{אחד מאתרים אחרים}two{# מאתרים אחרים}many{# מאתרים אחרים}other{# מאתרים אחרים}}</translation> <translation id="1545177026077493356">מצב קיוסק אוטומטי</translation> <translation id="1545786162090505744">כתובת אתר עם %s במקום שאילתה</translation> <translation id="1546280085599573572">התוסף הזה שינה את הדף שמוצג כשאתה לוחץ על הלחצן 'דף הבית'.</translation> @@ -443,7 +443,6 @@ <translation id="1559235587769913376">תווי קלט Unicode</translation> <translation id="1561092721008294962">HarfBuzz לטקסט בממשק משתמש</translation> <translation id="1566049601598938765">אתר</translation> -<translation id="1566958206723629112">Flash ו-PDF</translation> <translation id="1567723158593978621">לאחר ההפעלה, בכניסה לדפדפן נעשה שימוש בתהליך כניסה חדש ל-GAIA, המופרד מסיסמה.</translation> <translation id="1567993339577891801">קונסולת JavaScript</translation> <translation id="1568323446248056064">פתח את הגדרות המכשיר של התצוגה</translation> @@ -572,7 +571,6 @@ <translation id="1723940674997333416">אפשר WebSocket לא מאובטח שמקורו ב-https</translation> <translation id="1725149567830788547">הצג &בקרים</translation> <translation id="172612876728038702">ה-TPM נמצא בתהליך הגדרה. המתן בסבלנות; הדבר עשוי לקחת מספר דקות.</translation> -<translation id="1727135806684246609">טקסט אבטחה בעיצוב חדשני תלת-ממדי</translation> <translation id="1729533290416704613">הגדרה זו גם קובעת איזה דף מוצג כשאתה מבצע חיפוש מסרגל הכתובות.</translation> <translation id="1731346223650886555">נקודה ופסיק</translation> <translation id="1731589410171062430">סך הכל: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /> (<ph name="NUMBER_OF_PAGES" /> <ph name="PAGE_OR_PAGES_LABEL" />)</translation> @@ -868,6 +866,7 @@ <translation id="218492098606937156">הפעל אירועי מגע</translation> <translation id="2187317261103489799">זהה (ברירת מחדל)</translation> <translation id="2187895286714876935">שגיאת ייבוא של אישור שרת</translation> +<translation id="2188881192257509750">פתח את <ph name="APPLICATION" /></translation> <translation id="2190069059097339078">מאחזר פרטי כניסה ל-Wi-Fi</translation> <translation id="219008588003277019"><ph name="NEXE_NAME" /> :Native Client יישום </translation> <translation id="2190355936436201913">(ריק)</translation> @@ -986,6 +985,7 @@ <translation id="2326606747676847821">עבור למצב גלישה בסתר</translation> <translation id="2326931316514688470">&טען אפליקציה מחדש</translation> <translation id="2327492829706409234">הפעל יישום</translation> +<translation id="2328054044222305089">פעולה זו תמחק את כל הנתונים שנשמרו במכשיר על ידי <ph name="SITE" /> ותאפס את כל ההרשאות שנתת להפעלה. האם אתה רוצה להמשיך?</translation> <translation id="2329597144923131178">היכנס כדי לקבל גישה אל הסימניות, ההיסטוריה, הסיסמאות והגדרות נוספות בכל המכשירים שברשותך.</translation> <translation id="2332131598580221120">הצג בחנות</translation> <translation id="2332742915001411729">אפס לברירת המחדל</translation> @@ -1261,7 +1261,6 @@ <translation id="2675358154061544447">תמיכה ניסיונית מאוד בעיבוד iFrames חוצי-אתרים בתהליכים נפרדים. במצב זה, מסמכים יחלקו תהליך של מעבד רק אם הם מאותו אתר.</translation> <translation id="2676946222714718093">מופעל ב-</translation> <translation id="2678063897982469759">הפוך מחדש לפעיל</translation> -<translation id="2678246812096664977">כל יישומי הפלאגין</translation> <translation id="2679385451463308372">הדפס באמצעות תיבת דו-שיח של המערכת...</translation> <translation id="2680208403056680091">החיבור שלך לאינטרנט נשלט על ידי גורם כלשהו</translation> <translation id="268053382412112343">הי&סטוריה</translation> @@ -1435,7 +1434,6 @@ <translation id="287286579981869940">הוסף את <ph name="PROVIDER_NAME" />...</translation> <translation id="2872961005593481000">כיבוי</translation> <translation id="2875698561019555027">(דפי שגיאה ב-Chrome)</translation> -<translation id="2879560882721503072">אישור לקוח שאוחסן בהצלחה הונפק על ידי <ph name="ISSUER" /></translation> <translation id="288024221176729610">צ'כית</translation> <translation id="288042212351694283">גישה למכשירי Universal 2nd Factor שלך</translation> <translation id="2881966438216424900">גישה אחרונה:</translation> @@ -1584,6 +1582,7 @@ <translation id="3057861065630527966">גבה את התמונות והסרטונים</translation> <translation id="3058212636943679650">אם תצטרך בעתיד לשחזר את מערכת ההפעלה של המחשב, תזדקק לכרטיס SD או למקל זיכרון USB לשחזור.</translation> <translation id="305932878998873762">הקובץ השמור הפשוט עבור HTTP הוא קובץ שמור חדש. הוא מתבסס על מערכת הקבצים להקצאת שטח דיסק.</translation> +<translation id="3060251871394327123">פעולה זו תמחק את כל הנתונים שנשמרו במכשיר על ידי <ph name="SITE" />. האם אתה רוצה להמשיך?</translation> <translation id="3061650404498811439">הפעל גישה לאמוג'י, כתב יד וקלט קולי בתפריט הצטרפות של עורך שיטת קלט (IME).</translation> <translation id="3062606427884046423">השתמש בהודעות Android MediaStyle להודעות מדיה של Chrome.</translation> <translation id="3063844757726132584">קבל גישה לכל האפליקציות ממפעיל האפליקציות השימושי הזה. שחק במשחקים, קיים צ'אט בווידאו, האזן למוזיקה, ערוך מסמכים או קבל אפליקציות נוספות.</translation> @@ -1633,6 +1632,7 @@ <translation id="3123569374670379335">(בפיקוח)</translation> <translation id="3124111068741548686">מזהים ייחודיים של משתמש</translation> <translation id="3126026824346185272">Ctrl</translation> +<translation id="3127156390846601284">פעולה זו תמחק את כל הנתונים שנשמרו במכשיר עבור כל האתרים המוצגים. האם אתה רוצה להמשיך?</translation> <translation id="312759608736432009">יצרן ההתקן:</translation> <translation id="3127919023693423797">מאמת...</translation> <translation id="3128230619496333808">כרטיסייה 6</translation> @@ -1730,7 +1730,6 @@ <translation id="3264544094376351444">גופן Sans-Serif</translation> <translation id="3264547943200567728">נכשל הניסיון להגדיר את הרשת של ה-Chromebox</translation> <translation id="3265459715026181080">סגור חלון</translation> -<translation id="3267271790328635957">PDF בלבד</translation> <translation id="3267726687589094446">המשך לאפשר הורדות אוטומטיות של קבצים מרובים</translation> <translation id="3267998849713137817">זמן השינוי</translation> <translation id="3268451620468152448">כרטיסיות פתוחות</translation> @@ -1976,6 +1975,7 @@ <translation id="3574210789297084292">היכנס</translation> <translation id="3574305903863751447"><ph name="CITY" />, <ph name="STATE" /> <ph name="COUNTRY" /></translation> <translation id="357479282490346887">ליטאית</translation> +<translation id="3575927481544652747">השבתה של Windows Runtime MIDI API ל-WebMIDI, המופעל כברירת מחדל ב-Windows 10 ואילך.</translation> <translation id="3576324189521867626">הותקן בהצלחה</translation> <translation id="3578331450833904042">ברירת מחדל (קולט הכל)</translation> <translation id="3578594933904494462">התוכן בכרטיסייה הזו משותף.</translation> @@ -2029,8 +2029,6 @@ <translation id="3627320433825461852">נותרה פחות מדקה אחת</translation> <translation id="3627588569887975815">פתח קישור בחלון גלישה פרטית</translation> <translation id="3627671146180677314">מועד חידוש של אישור Netscape</translation> -<translation id="3629326610814700057">מפעיל מנהל אחסון לניהול האחסון המקומי.</translation> -<translation id="3630337581925712713"><ph name="PERMISSION_TYPE_LABEL" />:</translation> <translation id="3631337165634322335">החריגים שבהמשך חלים רק על ההפעלה הנוכחית של גלישה בסתר</translation> <translation id="3633586230741134985">הגדרות מפעיל היישומים</translation> <translation id="3633997706330212530">יש לך אפשרות להשבית שירותים אלה.</translation> @@ -2053,7 +2051,8 @@ <translation id="3654045516529121250">קרא את הגדרות הנגישות שלך</translation> <translation id="3654092442379740616">שגיאת סנכרון: <ph name="PRODUCT_NAME" /> אינו מעודכן ויש לעדכן אותו.</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{יש לו גישה קבועה אל קובץ אחד.}two{יש לו גישה קבועה אל # קבצים.}many{יש לו גישה קבועה אל # קבצים.}other{יש לו גישה קבועה אל # קבצים.}}</translation> -<translation id="3657468915905674858">אפשר סגירה של PPAPI Win32k</translation> +<translation id="365793796291733849"><ph name="BEGIN_PARAGRAPH1" />לאחר שתפעיל את הגיבוי האוטומטי, נתונים מהמכשיר ומאפליקציות יישמרו מדי פעם בתיקייה פרטית ב-Google Drive. נתוני אפליקציות יכולים לכלול את כל הנתונים שנשמרו באפליקציה (בהתבסס על הגדרות המפתח), כולל נתונים שעשויים להיות רגישים, כמו אנשי קשר, הודעות ותמונות.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />נתונים מגובים לא ייחשבו כחלק ממכסת האחסון ב-Drive. קבצים גדולים או קבצים שמפתחים בחרו שלא לכלול בשירות לא יגובו.<ph name="END_PARAGRAPH2" /></translation> <translation id="3660234220361471169">לא אמין</translation> <translation id="3665589677786828986">Chrome זיהה שחלק מההגדרות שלך נפגמו על ידי תכנית אחרת ואיפס אותן לברירות המחדל המקוריות.</translation> <translation id="3665842570601375360">אבטחה:</translation> @@ -2108,6 +2107,7 @@ <translation id="3733127536501031542">שרת SSL עם הגברה</translation> <translation id="3736520371357197498">אם אתה מבין את הסיכונים בנוגע לאבטחה שלך, תוכל <ph name="BEGIN_LINK" />להיכנס לאתר לא בטוח זה<ph name="END_LINK" /> לפני הסרת התכניות המסוכנות.</translation> <translation id="3738924763801731196"><ph name="OID" />:</translation> +<translation id="3739254215541673094">לפתוח את <ph name="APPLICATION" />?</translation> <translation id="3739798227959604811">השהייה לפני חזרה:</translation> <translation id="3741158646617793859"><ph name="DEVICE_NAME" /> יופיע כעת במסוף הניהול</translation> <translation id="3741243925913727067">גבה ב-Google Drive את התמונות והסרטונים שבמכשיר המדיה.</translation> @@ -2346,7 +2346,6 @@ <translation id="4058793769387728514">בדוק מסמך כעת</translation> <translation id="4059285154003114015">&הדפס מסגרת...</translation> <translation id="406070391919917862">יישומים ברקע</translation> -<translation id="4061502419206152498">הצג רק תוכן לא מאובטח, ללא אנימציה</translation> <translation id="4062251648694601778">תיהנה ממכשיר <ph name="SHORT_PRODUCT_NAME" /> שלך. יש לך שאלות? תוכל תמיד לקבל עזרה על ידי לחיצה על הסמל "?" שמופיע במגש הסטטוס.</translation> <translation id="4065876735068446555">ייתכן שתוצג דרישה להיכנס לדף ההתחברות של הרשת שבה אתה משתמש (<ph name="NETWORK_ID" />).</translation> <translation id="4068506536726151626">דף זה מכיל אלמנטים מהאתרים הבאים העוקבים אחר המיקום שלך:</translation> @@ -2385,7 +2384,6 @@ <translation id="4101878899871018532">מנהל הסיסמאות לא יציע לשמור את פרטי הכניסה המשמשים לסנכרון.</translation> <translation id="410351446219883937">הפעלה אוטומטית</translation> <translation id="4104163789986725820">יי&צא...</translation> -<translation id="4105523032910086267">הגדרת האנימציה והחשיפה של טקסט האבטחה בעיצוב חדשני תלת-ממדי.</translation> <translation id="4105563239298244027">קבל 1TB בחינם עם Google Drive</translation> <translation id="4109135793348361820">העבר חלון אל <ph name="USER_NAME" /> (<ph name="USER_EMAIL" />)</translation> <translation id="4110342520124362335">קובצי Cookie מ-<ph name="DOMAIN" /> חסומים.</translation> @@ -2436,6 +2434,7 @@ <translation id="418179967336296930">מקלדת רוסית פונטית (YaZHert)</translation> <translation id="4181841719683918333">שפות</translation> <translation id="4187248015940562149">מפעיל Bluetooth באינטרנט. מצב זה יכול להתיר לאתרים להתחבר אל מכשירי Bluetooth בסביבתך ולשלוט בהם.</translation> +<translation id="4188447344915957833">מפעיל את מנהל האחסון בהגדרות 'עיצוב חדשני תלת-ממדי'.</translation> <translation id="4189406272289638749">ההגדרה הזו נמצאת בשליטה של תוסף - <b><ph name="EXTENSION_NAME" /></b>.</translation> <translation id="4193154014135846272">מסמך Google</translation> <translation id="4193182321948161343">הפעל את מנהל המשתמשים בעל העיצוב החדשני והתלת-ממדי</translation> @@ -2643,6 +2642,7 @@ <translation id="4508765956121923607">הצג מ&קור</translation> <translation id="4509017836361568632">מחק תמונה</translation> <translation id="4509345063551561634">מיקום:</translation> +<translation id="4513946894732546136">משוב</translation> <translation id="4514542542275172126">הגדר משתמש חדש בפיקוח</translation> <translation id="4514914692061505365">אלץ את השימוש במתרגם Subzero מהיר של PNaCl בכל קובצי pexe.</translation> <translation id="451515744433878153">הסר</translation> @@ -2741,6 +2741,7 @@ <translation id="4656293982926141856">במחשב הזה</translation> <translation id="4656631038341342120">הפעל מעטפת מציאות מדומה אם היא זמינה במכשיר זה.</translation> <translation id="4657031070957997341">התר תמיד יישומי פלאגין ב-<ph name="HOST" /></translation> +<translation id="466008749075469935">מאפשר התערבות לצורך הגבלת השימוש שטיימרים הפועלים ברקע עושים ביחידת העיבוד המרכזית (CPU) ל-1%.</translation> <translation id="4663254525753315077">כשניתן, מציג בשכבה מורכבת את תוכן הגלילה של רכיב גלילה לאפשרויות נוספות כדי לאפשר גלילה מהירה יותר.</translation> <translation id="4664482161435122549">שגיאת ייצוא של PKCS #12</translation> <translation id="4665014895760275686">יצרן</translation> @@ -2809,6 +2810,7 @@ <translation id="4749157430980974800">מקלדת גיאורגית</translation> <translation id="4750394297954878236">הצעות</translation> <translation id="475088594373173692">משתמש ראשון</translation> +<translation id="4750892496809949692">העדפה של תכני HTML על ידי הסתרה של Flash ברשימת יישומי הפלאגין.</translation> <translation id="4750917950439032686">הפרטים שלך (כמו סיסמאות או מספרי כרטיסי אשראי) נשלחים לאתר הזה במצב פרטי.</translation> <translation id="4753602155423695878">אנימציה של סרגל ההתקדמות בשביל טעינת דף בטלפון Android</translation> <translation id="4755240240651974342">מקלדת פינית</translation> @@ -3083,6 +3085,7 @@ <translation id="5119450342834678097">אפשרות לבקש אתר טאבלט בתפריט ההגדרות</translation> <translation id="5120068803556741301">שיטת קלט של צד שלישי</translation> <translation id="5120421890733714118">תן אמון באישור זה לזיהוי אתרי אינטרנט.</translation> +<translation id="5120516977819314347">ה-PIN או הסיסמה שגויים.</translation> <translation id="5121130586824819730">הדיסק הקשיח מלא. שמור במיקום אחר או פנה מקום בדיסק הקשיח.</translation> <translation id="5125751979347152379">כתובת אתר לא חוקית.</translation> <translation id="5127881134400491887">ניהול חיבורי רשת</translation> @@ -3090,6 +3093,7 @@ <translation id="512903556749061217">מחובר</translation> <translation id="5129301143853688736">החיבור אל האתר הזה אינו פרטי. ייתכן שתוקפים מנסים לגנוב את המידע שלך (לדוגמה: תמונות, סיסמאות, הודעות וכרטיסי אשראי) מ-<ph name="DOMAIN" />.</translation> <translation id="5129662217315786329">פולנית</translation> +<translation id="5131347545782851480">מסמכי PDF</translation> <translation id="5134856901811723984">עיצוב חדשני תלת-מימדי בממשק המשתמש של מערכת ההפעלה של Chrome</translation> <translation id="5135533361271311778">לא ניתן ליצור פריט סימניה.</translation> <translation id="5136529877787728692">F7</translation> @@ -3259,6 +3263,7 @@ <translation id="5328031682234198929">8</translation> <translation id="5329858601952122676">&מחק</translation> <translation id="5330145655348521461">הקבצים האלה נפתחו בשולחן עבודה אחר. עבור אל <ph name="USER_NAME" /> (<ph name="MAIL_ADDRESS" />) כדי להציג אותם.</translation> +<translation id="5330512191124428349">פרטי קובץ</translation> <translation id="5332624210073556029">אזור זמן:</translation> <translation id="5333807720589685258">כרטיס ה-SIM שלך יושבת לצמיתות אם לא תזין את המפתח הנכון לביטול נעילת ה-PIN.</translation> @@ -3691,7 +3696,6 @@ <translation id="5892507820957994680">עוקף את רשימת עיבוד התוכנה המובנית ומאפשר האצת GPU בתצורות מערכת בלתי נתמכות.</translation> <translation id="5895138241574237353">הפעל מחדש</translation> <translation id="5895187275912066135">הונפק בתאריך</translation> -<translation id="5898154795085152510">השרת החזיר אישור לקוח לא חוקי. שגיאה <ph name="ERROR_NUMBER" /> (<ph name="ERROR_NAME" />).</translation> <translation id="5900302528761731119">תמונת פרופיל Google</translation> <translation id="590253956165195626">הצע לתרגם דפים שאינם בשפה שאתה קורא.</translation> <translation id="5904093760909470684">תצורת שרת proxy</translation> @@ -3746,6 +3750,8 @@ <translation id="5984222099446776634">ביקרת לאחרונה</translation> <translation id="5984814259619230127">Smart Lock לגילוי באמצעות Bluetooth Low Energy</translation> <translation id="5986245990306121338">אם האפשרות מופעלת, מחליף הכרטיסיות יוצג גם אם האפשרות 'מזג כרטיסיות ויישומים' מופעלת בהגדרות.</translation> +<translation id="5989712527536636369"><ph name="BEGIN_PARAGRAPH1" />זהו מידע כללי על המכשיר ועל אופן השימוש בו, למשל רמת הטעינה של הסוללה, תדירות השימוש באפליקציות, איכות החיבור לרשתות (לדוגמה, Wi-Fi ו-Bluetooth) ומשך הזמן שהמכשיר היה מחובר אליהן, וכן דוחות על קריסה כשפריטים לא פועלים כהלכה. המידע ישמש לשיפור המוצרים והשירותים ש-Google מספקת לכל המשתמשים. חלק מהמידע הנצבר יסייע גם לשותפים כמו מפתחים ל-Android לשפר את האפליקציות והמוצרים שלהם.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />ניתן להפעיל או להשבית את התכונה בכל עת דרך הגדרות האפליקציות ל-Android. הפעלה או השבתה של התכונה לא ישפיעו על היכולת של המכשיר לשלוח את המידע הנדרש כדי לקבל שירותים חיוניים כגון עדכוני מערכת ושירותי אבטחה.<ph name="END_PARAGRAPH2" /></translation> <translation id="5990198433782424697">תוספים בכתובות אתר המתחילות ב-chrome://</translation> <translation id="5990814808592353318">יצירה ידנית של סיסמה.</translation> <translation id="5991049340509704927">הגדל</translation> @@ -3759,6 +3765,7 @@ <translation id="6005695835120147974">נתב מדיה</translation> <translation id="6007237601604674381">ההעברה נכשלה. <ph name="ERROR_MESSAGE" /></translation> <translation id="6008241731410823808">שולח איתותי פינג לביקורת של היפר-קישורים.</translation> +<translation id="6011449291337289699">מחיקה של נתוני אתר</translation> <translation id="6015796118275082299">שנה</translation> <translation id="6016551720757758985">אשר פעולת Powerwash בעת חזרה לגרסה קודמת</translation> <translation id="6016809788585079594">אמור 'Ok Google' בפעם האחרונה</translation> @@ -3948,7 +3955,6 @@ <translation id="6276301056778294989">ודא שבמכשיר מופיע קוד זהה.</translation> <translation id="6277105963844135994">תם הזמן הקצוב לתפוגה של הרשת</translation> <translation id="6277518330158259200">צלם מסך</translation> -<translation id="6278428485366576908">עיצוב</translation> <translation id="6279183038361895380">הקש על |<ph name="ACCELERATOR" />| כדי להציג את הסמן</translation> <translation id="6280215091796946657">היכנס באמצעות חשבון אחר</translation> <translation id="6280912520669706465">ARC</translation> @@ -4200,6 +4206,7 @@ <translation id="6607272825297743757">פרטי הקובץ</translation> <translation id="6607831829715835317">כלים &נוספים</translation> <translation id="6608140561353073361">כל קובצי ה-Cookies ונתוני האתר...</translation> +<translation id="6610183966322615106">שגיאה בהוספת מדפסת</translation> <translation id="6610610633807698299">הזן כתובת אתר...</translation> <translation id="6612358246767739896">תוכן מוגן</translation> <translation id="6615455863669487791">הראה לי</translation> @@ -4263,7 +4270,6 @@ <translation id="6708242697268981054">מקור:</translation> <translation id="6709357832553498500">התחבר באמצעות <ph name="EXTENSIONNAME" /></translation> <translation id="6710213216561001401">הקודם</translation> -<translation id="6712158998835983046">הצג את כל התוכן, עם אנימציה</translation> <translation id="6718273304615422081">דוחס...</translation> <translation id="671928215901716392">מסך נעילה</translation> <translation id="6721972322305477112">&קובץ</translation> @@ -4534,7 +4540,6 @@ <translation id="7088434364990739311">המערכת לא הצליחה להפעיל את בדיקת העדכונים (קוד שגיאה <ph name="ERROR" />).</translation> <translation id="708856090370082727">הפעל תמיכה של גלילת יתר של OSK. כשסימון זה פועל, ה-OSK ישנה את הגודל של אזור התצוגה הוויזואלי בלבד.</translation> <translation id="7088674813905715446">המכשיר הזה הועבר למצב 'ללא הקצאה' על ידי מנהל המערכת. על מנת להפעיל אותו עבור הרשמה, בקש ממנהל המערכת להעביר את המכשיר למצב המתנה.</translation> -<translation id="7089609847854449639">מנהל אחסון</translation> <translation id="708969677220991657">מאפשר לבקשות לבצע localhost ב-HTTPS, גם אם מוצג אישור לא חוקי.</translation> <translation id="7092106376816104">חריגים של חלונות קופצים</translation> <translation id="7093866338626856921">החלפת נתונים עם המכשירים ששמותיהם: <ph name="HOSTNAMES" /></translation> @@ -4574,7 +4579,7 @@ <translation id="715118844758971915">מדפסות קלאסיות</translation> <translation id="7154130902455071009">שנה את דף הפתיחה ל: <ph name="START_PAGE" /></translation> <translation id="7155171745945906037">תמונה קיימת ממצלמה או מקובץ</translation> -<translation id="715568033737470079">ציין את יישומי הפלאגין מסוג PPAPI שינוהלו במסגרת מדיניות סגירת ארגז החול של Win32k (רק מ-Windows 10 ואילך).</translation> +<translation id="7155226869555939647">פתח תמיד קישורים לאפליקציה <ph name="APPLICATION" /></translation> <translation id="7156235233373189579">קובץ זה מיועד למחשב עם תוכנת Windows. הוא אינו תואם למכשיר שלך שבו פועלת מערכת ההפעלה של Chrome. חפש ב<ph name="BEGIN_LINK" />חנות האינטרנט של Chrome<ph name="END_LINK" /> כדי לאתר יישום חלופי מתאים.<ph name="BEGIN_LINK_HELP" />למידע נוסף<ph name="END_LINK_HELP" /></translation> <translation id="7157063064925785854">בלחיצה על 'המשך', אתה מביע הסכמה ל<ph name="LEGAL_DOC_LINK_TEXT_1" />, <ph name="LEGAL_DOC_LINK_TEXT_2" />, <ph name="LEGAL_DOC_LINK_TEXT_3" />, ול<ph name="LEGAL_DOC_LINK_TEXT_4" />.</translation> <translation id="7158238151765743968">החיבור אל "<ph name="DEVICE_NAME" />" עדיין מתבצע.</translation> @@ -4589,6 +4594,7 @@ <translation id="7175353351958621980">נטען מתוך:</translation> <translation id="7180611975245234373">רענן</translation> <translation id="7180865173735832675">התאם אישית</translation> +<translation id="7181387261278441780">מחיקת נתונים ואיפוס של אתר</translation> <translation id="7185078796915954712">TLS 1.3</translation> <translation id="7185690883425432021">מסתיר את לחצני הסגירה בכרטיסיות לא פעילות כשסרגל הכרטיסיות במצב ערימה.</translation> <translation id="7186088072322679094">השאר בסרגל הכלים</translation> @@ -4621,7 +4627,6 @@ <translation id="7223775956298141902">אוי... אין לך תוספים :-(</translation> <translation id="7224023051066864079">מסיכת רשת משנה:</translation> <translation id="7225179976675429563">חסר סוג רשת</translation> -<translation id="7230191962699768124">הצג את כל התוכן, ללא אנימציה</translation> <translation id="7230787553283372882">התאם אישית את גודל הטקסט</translation> <translation id="7231224339346098802">השתמש במספר כדי לציין כמה עותקים להדפיס (1 או יותר).</translation> <translation id="7238585580608191973">טביעת אצבע SHA-256</translation> @@ -4747,7 +4752,6 @@ <translation id="7409233648990234464">הפעל מחדש ובצע Powerwash</translation> <translation id="7409836189476010449">הפעל Flash</translation> <translation id="7410344089573941623">שאל אם <ph name="HOST" /> רוצה גישה למצלמה ולמיקרופון</translation> -<translation id="7411343637221933631">{NUM_COOKIES,plural, =1{אחד מהאתר הזה}two{# מהאתר הזה}many{# מהאתר הזה}other{# מהאתר הזה}}</translation> <translation id="7412226954991670867">זיכרון GPU</translation> <translation id="7416362041876611053">שגיאת רשת לא ידועה.</translation> <translation id="7417453074306512035">מקלדת אתיופית</translation> @@ -4867,6 +4871,7 @@ <translation id="756445078718366910">פתח חלון דפדפן</translation> <translation id="7564847347806291057">סיים תהליך</translation> <translation id="7566723889363720618">F12</translation> +<translation id="7567314848159753396">קובץ Cookie: <ph name="NAME" /></translation> <translation id="756809126120519699">נתוני Chrome נוקו</translation> <translation id="7568790562536448087">מעדכן</translation> <translation id="7573172247376861652">טעינת סוללה</translation> @@ -4907,6 +4912,7 @@ <translation id="7626009897377900107">יצירת סיסמה</translation> <translation id="7627262197844840899">אתר זה אינו מקבל כרטיסי אשראי מסוג MasterCard.</translation> <translation id="7627790789328695202">אופס, <ph name="FILE_NAME" /> כבר קיים. שנה את השם שלו ונסה שוב.</translation> +<translation id="7628127343934101653">פתח קובצי PDF באפליקציה המוגדרת כברירת מחדל כמציג קובצי PDF.</translation> <translation id="762917759028004464">דפדפן ברירת המחדל הוא כרגע <ph name="BROWSER_NAME" />.</translation> <translation id="7629536005696009600">התר שימוש בפרטי כניסה המאוחסנים בשביל אפליקציות Android למילוי באתרים תואמים.</translation> <translation id="7629827748548208700">כרטיסייה: <ph name="TAB_NAME" /></translation> @@ -5135,6 +5141,7 @@ <translation id="7957513156576779045">הפעל Bluetooth כדי לאפשר את ההתאמה</translation> <translation id="7957615753207896812">פתח את הגדרות המכשיר של המקלדת</translation> <translation id="7959074893852789871">הקובץ הכיל אישורים מרובים, חלקם לא יובאו:</translation> +<translation id="7959700692661109221"><ph name="BEGIN_PARAGRAPH" /> שירות המיקום של Google נעזר במקורות כגון Wi‑Fi כדי להעריך את מיקום המכשיר שלך במהירות רבה יותר ובצורה מדויקת יותר. כאשר אתה מפעיל את שירותי המיקום של Google, המכשיר עובר למצב שבו המערכת משתמשת ב-Wi-Fi כדי לספק פרטי מיקום. תוכל להשבית מצב זה בכל עת דרך הגדרות המיקום. <ph name="END_PARAGRAPH" /></translation> <translation id="7961015016161918242">אף פעם</translation> <translation id="7964089325405904043">ייבוא וייצוא של סיסמאות</translation> <translation id="7965010376480416255">זיכרון משותף</translation> @@ -5285,6 +5292,7 @@ <translation id="8146793085009540321">הכניסה נכשלה. צור קשר עם מנהל המערכת או נסה שוב.</translation> <translation id="8148264977957212129">שיטת קלט Pinyin</translation> <translation id="8148913456785123871">הצג כרטיסים של Google Now במפעיל היישומים</translation> +<translation id="8150391391298684512">השבת את Windows Runtime MIDI API</translation> <translation id="8151185429379586178">כלים למפתחים</translation> <translation id="8151638057146502721">הגדר</translation> <translation id="8151639108075998630">הפוך גלישה של אורחים לפעילה</translation> @@ -5565,6 +5573,7 @@ <translation id="8532294913309524834">סדר שפות על פי העדפותיך.</translation> <translation id="8535005006684281994">כתובת אתר לחידוש אישור Netscape</translation> <translation id="8539727552378197395">לא (Http בלבד)</translation> +<translation id="8541084862688000575">טען אפליקציות ל-Android באופן אוטומטי</translation> <translation id="8543181531796978784">באפשרותך <ph name="BEGIN_ERROR_LINK" />לדווח על בעיית זיהוי<ph name="END_ERROR_LINK" /> או, אם אתה מבין את סיכוני האבטחה, <ph name="BEGIN_LINK" />להיכנס לאתר הזה, שאינו מאובטח<ph name="END_LINK" />.</translation> <translation id="8545107379349809705">הסתר פרטים....</translation> <translation id="8545211332741562162">מאפשר לדפי אינטרנט להשתמש בתכונות ניסיוניות של JavaScript.</translation> @@ -5592,7 +5601,6 @@ <translation id="8569764466147087991">בחר קובץ לפתיחה</translation> <translation id="8571032220281885258">כשתאמר "Ok Google," דפדפן Chrome יחפש את מה שתאמר לאחר מכן.</translation> <translation id="8571108619753148184">שרת 4</translation> -<translation id="8572832761467613633">Flash בלבד</translation> <translation id="8572981282494768930">אל תאפשר לאתרים לגשת למצלמה ולמיקרופון</translation> <translation id="8574234089711453001">התר הצגה של לחצן הורדה בפתיחת דף עם כתובת אתר של מדיה.</translation> <translation id="857779305329188634">הפעל תמיכה בפרוטוקול QUIC ניסיוני.</translation> @@ -5614,6 +5622,7 @@ <translation id="8600929685092827187">Wake On Packets</translation> <translation id="8601206103050338563">אימות לקוח TLS WWW</translation> <translation id="8602851771975208551">תכנית אחרת במחשב שלך הוסיפה יישום שעשוי לשנות את אופן הפעולה של Chrome.</translation> +<translation id="8603912787021349466">אפשר הפעלה אוטומטית של אפליקציות ל-Android לאחר כניסה.</translation> <translation id="8605428685123651449">זיכרון SQLite</translation> <translation id="8605503133013456784">נכשל הניסיון להתנתק או לבטל את ההתאמה של "<ph name="DEVICE_NAME" />".</translation> <translation id="8606726445206553943">להשתמש במכשירי ה-MIDI שלך</translation> @@ -5966,6 +5975,7 @@ <translation id="9053965862400494292">אירעה שגיאה בעת הנסיון להגדיר סנכרון.</translation> <translation id="9056034633062863292">עדכון Chromebox</translation> <translation id="9056810968620647706">לא נמצאו התאמות.</translation> +<translation id="9057119625587205566">אין מדפסות בקרבת מקום</translation> <translation id="9059868303873565140">תפריט מצב</translation> <translation id="9064142312330104323">תמונת פרופיל Google (בטעינה)</translation> <translation id="9064275926664971810">אפשר ל'מילוי אוטומטי' למלא טפסים בלחיצה אחת</translation> @@ -5976,6 +5986,7 @@ <translation id="9067401056540256169">הסימון הזה פוגם באבטחה של Chrome. השתמש בו רק אם אתה מבין את הפעולה שלו. שים לב שייתכן כי הסימון הזה יוסר ללא הודעה מראש. אם יופעל, מסגרות ממקור https יכולות להשתמש ב-WebSockets עם כתובת אתר לא מאובטחת (ws://).</translation> <translation id="9068931793451030927">נתיב:</translation> <translation id="9070219033670098627">החלף משתמש</translation> +<translation id="9070940116164932228">וסת טיימרים שפועלים ברקע ומשתמשים במשאבים רבים</translation> <translation id="907148966137935206">אל תרשה לאף אתר להציג חלונות קופצים (מומלץ)</translation> <translation id="9072550133391925347"><ph name="PASSWORD_MANAGER_BRAND" /> מכניס אותך באופן אוטומטי לאפליקציות ולאתרים כשירים באמצעות סיסמאות ששמרת.</translation> <translation id="9073281213608662541">PAP</translation> @@ -6009,6 +6020,7 @@ <translation id="9112614144067920641">בחר PIN חדש.</translation> <translation id="9112748030372401671">שינוי הטפט שלך</translation> <translation id="9112987648460918699">חפש...</translation> +<translation id="9114663181201435112">כניסה בקלות</translation> <translation id="9115487443206954631">נהל מכשירי Cast</translation> <translation id="9115675100829699941">&סימניות</translation> <translation id="9121814364785106365">פתח ככרטיסייה מוצמדת</translation> @@ -6103,7 +6115,6 @@ <translation id="952992212772159698">לא פעיל</translation> <translation id="960719561871045870">קוד ספק</translation> <translation id="960987915827980018">נותרה בערך שעה אחת</translation> -<translation id="962778376131245616">הצג רק תוכן לא-מאובטח, עם אנימציה</translation> <translation id="96421021576709873">רשת Wi-Fi</translation> <translation id="965490406356730238">היכן שהדבר אפשרי, הפעל פענוח של קובצי mjpeg עם האצה באמצעות חומרה בשביל מסגרת שצולמה.</translation> <translation id="968174221497644223">קובץ שמור של יישום</translation>
diff --git a/chrome/app/resources/generated_resources_ja.xtb b/chrome/app/resources/generated_resources_ja.xtb index d1d7252..6a7d5562 100644 --- a/chrome/app/resources/generated_resources_ja.xtb +++ b/chrome/app/resources/generated_resources_ja.xtb
@@ -18,7 +18,6 @@ <translation id="1029317248976101138">ズーム</translation> <translation id="1029595648591494741">「<ph name="EXTENSION_NAME" />」を試しますか?</translation> <translation id="1031362278801463162">プレビューを読み込んでいます</translation> -<translation id="1031460590482534116">クライアント証明書の格納中にエラーが発生しました。エラー <ph name="ERROR_NUMBER" />(<ph name="ERROR_NAME" />)。</translation> <translation id="1031573127485938293">確認(ポリシーで管理)</translation> <translation id="103279545524624934">Android アプリを起動できるようにディスク領域を解放します。</translation> <translation id="1033780634303702874">シリアル デバイスへのアクセス</translation> @@ -101,6 +100,7 @@ <translation id="1128591060186966949">検索エンジンの編集</translation> <translation id="1128987120443782698">このストレージ デバイスの容量は <ph name="DEVICE_CAPACITY" /> です。容量が 4 GB 以上の SD カードまたは USB メモリ スティックを挿入してください。</translation> <translation id="1137135726305341424">domContentLoaded と、domContentLoaded より前に開始したすべてのリソースの読み込み(メインフレームと、同じ発生元の iframe)。</translation> +<translation id="1138663153846032155">Flash より HTML を優先する</translation> <translation id="1140351953533677694">Bluetooth デバイスとシリアル デバイスへのアクセス</translation> <translation id="114140604515785785">拡張機能のルート ディレクトリ:</translation> <translation id="1143142264369994168">証明書の署名者</translation> @@ -252,6 +252,7 @@ <translation id="1351692861129622852"><ph name="FILE_COUNT" /> 件のファイルをインポートしています...</translation> <translation id="1352103415082130575">タイ語キーボード(Pattachote)</translation> <translation id="1353686479385938207"><ph name="PROVIDER_NAME" />: <ph name="NETWORK_NAME" /></translation> +<translation id="1353946958707294039">マテリアル デザインのストレージ マネージャ</translation> <translation id="1353966721814789986">起動ページ</translation> <translation id="1354868058853714482">Adobe Reader のバージョンが古いため安全でない可能性があります。</translation> <translation id="1355408554203439639">3D ソフトウェア ラスタライザ</translation> @@ -424,7 +425,6 @@ <translation id="1533920822694388968">テレビの配置</translation> <translation id="15373452373711364">大きいマウス カーソル</translation> <translation id="1543284117603151572">Edge からインポート</translation> -<translation id="1544350195767834591">{NUM_COOKIES,plural, =1{他サイトから 1 個}other{他サイトから # 個}}</translation> <translation id="1545177026077493356">自動キオスク モード</translation> <translation id="1545786162090505744">URL(%s=検索語句)</translation> <translation id="1546280085599573572">この拡張機能により、ホームボタンをクリックしたときに表示されるページが変更されました。</translation> @@ -448,7 +448,6 @@ <translation id="1559235587769913376">Unicode 文字の入力</translation> <translation id="1561092721008294962">HarfBuzz によるユーザー インターフェース テキストの表示</translation> <translation id="1566049601598938765">ウェブサイト</translation> -<translation id="1566958206723629112">Flash と PDF</translation> <translation id="1567723158593978621">有効にした場合、ブラウザへのログインに新しい GAIA パスワード分離型ログインフローが使用されます。</translation> <translation id="1567993339577891801">JavaScript コンソール</translation> <translation id="1568323446248056064">ディスプレイのデバイス設定を開く</translation> @@ -577,7 +576,6 @@ <translation id="1723940674997333416">HTTPS から発生した保護されていない WebSocket を許可する</translation> <translation id="1725149567830788547">コントロールを表示(&C)</translation> <translation id="172612876728038702">TPM をセットアップしています。数分かかる場合があるので、しばらくお待ちください。</translation> -<translation id="1727135806684246609">マテリアル セキュリティ詳細</translation> <translation id="1729533290416704613">この拡張機能では、アドレスバーからの検索時に表示されるページも制御されます。</translation> <translation id="1731346223650886555">セミコロン</translation> <translation id="1731589410171062430">印刷総数: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" />(<ph name="NUMBER_OF_PAGES" /> <ph name="PAGE_OR_PAGES_LABEL" />)</translation> @@ -873,6 +871,7 @@ <translation id="218492098606937156">タッチ イベントを有効にする</translation> <translation id="2187317261103489799">検出(デフォルト)</translation> <translation id="2187895286714876935">サーバー証明書インポート エラー</translation> +<translation id="2188881192257509750"><ph name="APPLICATION" /> を開く</translation> <translation id="2190069059097339078">WiFi 認証情報の取得機能</translation> <translation id="219008588003277019">ネイティブ クライアント モジュール: <ph name="NEXE_NAME" /></translation> <translation id="2190355936436201913">(なし)</translation> @@ -991,6 +990,7 @@ <translation id="2326606747676847821">シークレット モード</translation> <translation id="2326931316514688470">アプリを再読み込み(&R)</translation> <translation id="2327492829706409234">アプリを有効にする</translation> +<translation id="2328054044222305089"><ph name="SITE" /> によって端末に保存されたデータを削除し、実行を許可した権限をリセットします。続行しますか?</translation> <translation id="2329597144923131178">ログインすると、お使いのどのデバイスでも同じブックマーク、履歴、パスワード、その他の設定を利用できるようになります。</translation> <translation id="2332131598580221120">ストアで見る</translation> <translation id="2332742915001411729">デフォルトに戻す</translation> @@ -1266,7 +1266,6 @@ <translation id="2675358154061544447">別プロセスでのクロスサイト iframe のレンダリングを試験的にサポートします。このモードでは、同じウェブサイトのドキュメント間でのみレンダラ プロセスが共有されます。</translation> <translation id="2676946222714718093">再生中:</translation> <translation id="2678063897982469759">再度有効にする</translation> -<translation id="2678246812096664977">すべてのプラグイン</translation> <translation id="2679385451463308372">システム ダイアログを使用して印刷...</translation> <translation id="2680208403056680091">インターネット接続が制限されています</translation> <translation id="268053382412112343">履歴(&S)</translation> @@ -1440,7 +1439,6 @@ <translation id="287286579981869940"><ph name="PROVIDER_NAME" /> を追加...</translation> <translation id="2872961005593481000">終了</translation> <translation id="2875698561019555027">(Chrome エラーページ)</translation> -<translation id="2879560882721503072"><ph name="ISSUER" /> が発行したクライアント証明書を保存しました。</translation> <translation id="288024221176729610">チェコ語</translation> <translation id="288042212351694283">U2F(Universal 2nd Factor)デバイスにアクセスできませんでした。</translation> <translation id="2881966438216424900">最終アクセス日:</translation> @@ -1589,6 +1587,7 @@ <translation id="3057861065630527966">写真や動画をバックアップします</translation> <translation id="3058212636943679650">パソコンのオペレーティング システムを復旧する必要が生じると、復旧用の SD カードまたは USB メモリ スティックが必要になります。</translation> <translation id="305932878998873762">HTTP 用のシンプル キャッシュは新しいキャッシュ機能です。ディスク スペースの割り当てにファイルシステムを使用します。</translation> +<translation id="3060251871394327123"><ph name="SITE" /> によって端末に保存されたデータを削除します。続行しますか?</translation> <translation id="3061650404498811439">IME メニューで絵文字、手書き、音声による入力を選択できるようにします。</translation> <translation id="3062606427884046423">Chrome のメディア通知に Android のメディア スタイル通知を使用します。</translation> <translation id="3063844757726132584">インストールしているすべてのアプリにこのランチャーからアクセスできます。ゲーム、ビデオチャット、音楽鑑賞、ドキュメント編集を行ったり、さらにアプリを入手したりできます。</translation> @@ -1638,6 +1637,7 @@ <translation id="3123569374670379335">(監視対象)</translation> <translation id="3124111068741548686">USER ハンドル</translation> <translation id="3126026824346185272">Ctrl</translation> +<translation id="3127156390846601284">表示されているすべてのサイトについて、端末に保存されているデータを削除します。続行しますか?</translation> <translation id="312759608736432009">デバイス メーカー:</translation> <translation id="3127919023693423797">認証中...</translation> <translation id="3128230619496333808">タブ 6</translation> @@ -1736,7 +1736,6 @@ <translation id="3264544094376351444">Sans Serif フォント</translation> <translation id="3264547943200567728">Chromebox のネットワークを設定できませんでした</translation> <translation id="3265459715026181080">ウインドウを閉じる</translation> -<translation id="3267271790328635957">PDF のみ</translation> <translation id="3267726687589094446">複数ファイルの自動ダウンロードを今後も許可する</translation> <translation id="3267998849713137817">更新日時</translation> <translation id="3268451620468152448">開いているタブ</translation> @@ -1982,6 +1981,7 @@ <translation id="3574210789297084292">ログイン</translation> <translation id="3574305903863751447"><ph name="COUNTRY" /> <ph name="STATE" /> <ph name="CITY" /></translation> <translation id="357479282490346887">リトアニア語</translation> +<translation id="3575927481544652747">WebMIDI で Windows Runtime MIDI API を無効にします(Windows 10 以降ではデフォルトで有効です)。</translation> <translation id="3576324189521867626">インストールが完了しました</translation> <translation id="3578331450833904042">既定(広範囲の音声を検出)</translation> <translation id="3578594933904494462">このタブのコンテンツは共有されています。</translation> @@ -2035,8 +2035,6 @@ <translation id="3627320433825461852">あと 1 分未満</translation> <translation id="3627588569887975815">シークレット ウィンドウで開く(&G)</translation> <translation id="3627671146180677314">Netscape 証明書更新時間</translation> -<translation id="3629326610814700057">ローカル ストレージを管理するストレージ管理者を有効にします。</translation> -<translation id="3630337581925712713"><ph name="PERMISSION_TYPE_LABEL" />:</translation> <translation id="3631337165634322335">以下の例外は、このシークレット モード セッションにのみ適用されます。</translation> <translation id="3633586230741134985">アプリ ランチャーの設定</translation> <translation id="3633997706330212530">これらのサービスを無効にすることもできます。</translation> @@ -2059,7 +2057,8 @@ <translation id="3654045516529121250">ユーザー補助設定の読み取り</translation> <translation id="3654092442379740616">同期エラー: <ph name="PRODUCT_NAME" /> が最新ではないため、更新する必要があります。</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{1 個のファイルに永続的にアクセスできます。}other{# 個のファイルに永続的にアクセスできます。}}</translation> -<translation id="3657468915905674858">PPAPI Win32k のロックダウンを有効にする</translation> +<translation id="365793796291733849"><ph name="BEGIN_PARAGRAPH1" />自動バックアップをオンにすると、端末とアプリのデータは定期的に Google ドライブの非公開フォルダに保存されます。アプリのデータとは、デベロッパーの設定に基づいてアプリが保存したデータのことです。これには連絡先、メッセージ、写真など機密情報になり得るデータも含まれます。<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />バックアップ データは Google ドライブの保存容量にはカウントされません。大容量のファイルや、デベロッパーがサービスから除外することを選択したファイルはバックアップされません。<ph name="END_PARAGRAPH2" /></translation> <translation id="3660234220361471169">信頼されていない</translation> <translation id="3665589677786828986">設定の一部が別のプログラムによって変更されていたため、元のデフォルト設定に戻しました。</translation> <translation id="3665842570601375360">セキュリティ:</translation> @@ -2114,6 +2113,7 @@ <translation id="3733127536501031542">International Step-UP 対応の SSL サーバー</translation> <translation id="3736520371357197498">危険なプログラムが削除されるより前に<ph name="BEGIN_LINK" />この安全でないサイトにアクセスする<ph name="END_LINK" />場合は、セキュリティ上のリスクについてご承知おきください。</translation> <translation id="3738924763801731196"><ph name="OID" />:</translation> +<translation id="3739254215541673094"><ph name="APPLICATION" /> を開きますか?</translation> <translation id="3739798227959604811">リピートまでの時間:</translation> <translation id="3741158646617793859"><ph name="DEVICE_NAME" /> は管理コンソールに表示されます</translation> <translation id="3741243925913727067">メディア デバイスの写真や動画を Google ドライブにバックアップします。</translation> @@ -2352,7 +2352,6 @@ <translation id="4058793769387728514">書類を今すぐチェック</translation> <translation id="4059285154003114015">フレームを印刷(&P)...</translation> <translation id="406070391919917862">バックグラウンド アプリ</translation> -<translation id="4061502419206152498">保護されていない場合にのみアニメーションなしで表示する</translation> <translation id="4062251648694601778"><ph name="SHORT_PRODUCT_NAME" /> 搭載デバイスをお楽しみください。不明点があれば、いつでもステータス トレイの [?] をクリックしてヘルプを確認できます。</translation> <translation id="4065876735068446555">ご利用のネットワーク(<ph name="NETWORK_ID" />)では、ログインページへのアクセスが必要な可能性があります。</translation> <translation id="4068506536726151626">このページには、あなたの現在地を追跡している以下のサイトからの要素が含まれています。</translation> @@ -2391,7 +2390,6 @@ <translation id="4101878899871018532">同期に使用する認証情報の保存について尋ねるパスワード マネージャのメッセージが表示されないようにします。</translation> <translation id="410351446219883937">自動再生</translation> <translation id="4104163789986725820">エクスポート(&X)</translation> -<translation id="4105523032910086267">マテリアル デザインでセキュリティ詳細の表示およびアニメーションの有無を設定します。</translation> <translation id="4105563239298244027">Google ドライブは 1TB まで無料</translation> <translation id="4109135793348361820"><ph name="USER_NAME" />(<ph name="USER_EMAIL" />)にウィンドウを移動</translation> <translation id="4110342520124362335"><ph name="DOMAIN" /> からの Cookie がブロックされました。</translation> @@ -2442,6 +2440,7 @@ <translation id="418179967336296930">ロシア語表音(YaZHert)キーボード</translation> <translation id="4181841719683918333">言語</translation> <translation id="4187248015940562149">ウェブ Bluetooth を有効にします。ウェブ Bluetooth により、ウェブサイトはユーザーの近くにある Bluetooth デバイスに接続し、そのデバイスを制御することができます。</translation> +<translation id="4188447344915957833">マテリアル デザインの設定でストレージ マネージャを有効にします。</translation> <translation id="4189406272289638749">拡張機能 <b><ph name="EXTENSION_NAME" /></b> がこの設定を制御しています。</translation> <translation id="4193154014135846272">Google ドキュメント</translation> <translation id="4193182321948161343">マテリアル デザイン ユーザー マネージャを有効にする</translation> @@ -2649,6 +2648,7 @@ <translation id="4508765956121923607">ソースを表示(&O)</translation> <translation id="4509017836361568632">写真を破棄</translation> <translation id="4509345063551561634">場所:</translation> +<translation id="4513946894732546136">フィードバック</translation> <translation id="4514542542275172126">新しい監視対象ユーザーを設定します</translation> <translation id="4514914692061505365">すべての pexe ファイルに PNaCl の高速 Subzero トランスレータを使用するよう強制します。</translation> <translation id="451515744433878153">削除</translation> @@ -2747,6 +2747,7 @@ <translation id="4656293982926141856">このパソコン</translation> <translation id="4656631038341342120">この端末で使用可能な場合は、VR シェルを有効にします。</translation> <translation id="4657031070957997341"><ph name="HOST" /> のプラグインを常に許可する</translation> +<translation id="466008749075469935">バックグラウンド タイマーの CPU 使用率を 1% に制限します。</translation> <translation id="4663254525753315077">可能な場合は、オーバーフロー スクロール要素のスクロール コンテンツを合成レイヤに挿入し、スクロールを速くします。</translation> <translation id="4664482161435122549">PKCS #12 エクスポート エラー</translation> <translation id="4665014895760275686">メーカー</translation> @@ -2815,6 +2816,7 @@ <translation id="4749157430980974800">グルジア語キーボード</translation> <translation id="4750394297954878236">候補</translation> <translation id="475088594373173692">最初のユーザー</translation> +<translation id="4750892496809949692">プラグインのリストで Flash を非表示にして、HTML コンテンツを優先します。</translation> <translation id="4750917950439032686">お客様がこのサイトに送信した情報(パスワード、クレジット カード番号など)が第三者に見られることはありません。</translation> <translation id="4753602155423695878">Android スマートフォンのページ読み込み状況バーのアニメーション</translation> <translation id="4755240240651974342">フィンランド語のキーボード</translation> @@ -3089,6 +3091,7 @@ <translation id="5119450342834678097">設定メニューの [タブレット サイトのリクエスト] オプション</translation> <translation id="5120068803556741301">サードパーティによる入力方法</translation> <translation id="5120421890733714118">ウェブサイトの身元を特定するこの証明書を信頼します。</translation> +<translation id="5120516977819314347">PIN またはパスワードが正しくありません。</translation> <translation id="5121130586824819730">ハード ディスクがいっぱいです。別の場所に保存するか、ハード ディスクの空き容量を増やしてください。</translation> <translation id="5125751979347152379">URL が無効です。</translation> <translation id="5127881134400491887">ネットワーク接続の管理</translation> @@ -3096,6 +3099,7 @@ <translation id="512903556749061217">接続</translation> <translation id="5129301143853688736">このサイトへの接続はプライベート接続ではありません。悪意のあるユーザーが <ph name="DOMAIN" /> 上のあなたの情報(写真、パスワード、メッセージ、クレジット カード番号など)を不正に取得しようとしている可能性があります。</translation> <translation id="5129662217315786329">ポーランド語</translation> +<translation id="5131347545782851480">PDF ドキュメント</translation> <translation id="5134856901811723984">Chrome OS システムの画面のマテリアル デザイン</translation> <translation id="5135533361271311778">ブックマークの項目を作成できませんでした。</translation> <translation id="5136529877787728692">F7</translation> @@ -3264,6 +3268,7 @@ <translation id="5328031682234198929">8</translation> <translation id="5329858601952122676">削除(&D)</translation> <translation id="5330145655348521461">これらのファイルは別のデスクトップで開かれます。表示するには <ph name="USER_NAME" />(<ph name="MAIL_ADDRESS" />)に移動してください。</translation> +<translation id="5330512191124428349">情報を見る</translation> <translation id="5332624210073556029">タイムゾーン:</translation> <translation id="5333807720589685258">正しい PIN ロック解除キーが入力されないと、 SIM カードは永久的に無効になります。</translation> @@ -3696,7 +3701,6 @@ <translation id="5892507820957994680">組み込みのソフトウェア レンダリング リストを上書きし、サポートされていないシステム設定で GPU アクセラレーションを有効にします。</translation> <translation id="5895138241574237353">再起動</translation> <translation id="5895187275912066135">発行日</translation> -<translation id="5898154795085152510">サーバーから無効なクライアント証明書が返されました。エラー <ph name="ERROR_NUMBER" />(<ph name="ERROR_NAME" />)。</translation> <translation id="5900302528761731119">Google プロフィール写真</translation> <translation id="590253956165195626">母国語以外のページで翻訳ツールを表示する</translation> <translation id="5904093760909470684">プロキシ設定</translation> @@ -3751,6 +3755,8 @@ <translation id="5984222099446776634">最近のアクセス</translation> <translation id="5984814259619230127">Smart Lock での Bluetooth Low Energy による検出</translation> <translation id="5986245990306121338">有効にした場合、設定で [タブとアプリを統合] オプションがオンになっていてもタブ切り替えが表示されます。</translation> +<translation id="5989712527536636369"><ph name="BEGIN_PARAGRAPH1" />お使いの端末とその使用方法に関する全般情報です。電池残量、アプリの使用頻度、ネットワーク接続(Wi-Fi、Bluetooth など)の品質と接続時間、正常な動作が行われなかったときの障害レポートなどが含まれます。この情報は Google のサービス品質の向上に使用され、一部の統計情報はパートナー(Android デベロッパーなど)のアプリやサービスの向上にも役立てられます。<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Android アプリの設定でいつでもこの機能のオンとオフを切り替えることができます。この機能をオフにしても、端末でシステム アップデートやセキュリティなどの基本的なサービスを受けるために必要な情報の送信は行われます。<ph name="END_PARAGRAPH2" /></translation> <translation id="5990198433782424697">chrome:// URL での拡張機能</translation> <translation id="5990814808592353318">パスワードを手動で生成する</translation> <translation id="5991049340509704927">拡大表示</translation> @@ -3764,6 +3770,7 @@ <translation id="6005695835120147974">メディア ルーター</translation> <translation id="6007237601604674381">移動できませんでした。<ph name="ERROR_MESSAGE" /></translation> <translation id="6008241731410823808">ハイパーリンク監査の ping を送信します。</translation> +<translation id="6011449291337289699">サイトデータの削除</translation> <translation id="6015796118275082299">年</translation> <translation id="6016551720757758985">Powerwash を実行して以前のバージョンに戻すことを確認</translation> <translation id="6016809788585079594">最後にもう一度「OK Google」とお話しください</translation> @@ -3953,7 +3960,6 @@ <translation id="6276301056778294989">デバイスに同じコードが表示されていることを確認してください。</translation> <translation id="6277105963844135994">ネットワークがタイムアウトしました</translation> <translation id="6277518330158259200">スクリーンショットを撮る(&A)</translation> -<translation id="6278428485366576908">テーマ</translation> <translation id="6279183038361895380">カーソルを表示するには |<ph name="ACCELERATOR" />| を押します</translation> <translation id="6280215091796946657">別のアカウントでログイン</translation> <translation id="6280912520669706465">ARC</translation> @@ -4205,6 +4211,7 @@ <translation id="6607272825297743757">ファイル情報</translation> <translation id="6607831829715835317">その他のツール(&L)</translation> <translation id="6608140561353073361">すべての Cookie とサイト データ...</translation> +<translation id="6610183966322615106">プリンタの追加中にエラーが発生しました</translation> <translation id="6610610633807698299">URL を入力...</translation> <translation id="6612358246767739896">保護されたコンテンツ</translation> <translation id="6615455863669487791">表示</translation> @@ -4268,7 +4275,6 @@ <translation id="6708242697268981054">保存元:</translation> <translation id="6709357832553498500">「<ph name="EXTENSIONNAME" />」を使用して接続</translation> <translation id="6710213216561001401">前へ</translation> -<translation id="6712158998835983046">すべてアニメーション付きで表示する</translation> <translation id="6718273304615422081">圧縮しています...</translation> <translation id="671928215901716392">画面をロック</translation> <translation id="6721972322305477112">ファイル(&F)</translation> @@ -4541,7 +4547,6 @@ <translation id="7088434364990739311">更新チェックを起動できませんでした(エラー コード <ph name="ERROR" />)。</translation> <translation id="708856090370082727">OSK オーバースクロールのサポートを有効にします。このフラグが有効な場合は、ビジュアル ビューポートのサイズのみが変更されます。</translation> <translation id="7088674813905715446">このデバイスは、管理者によりプロビジョニングを解除されている状態です。このデバイスを登録できるようにするには、デバイスを待機状態にするよう管理者に依頼してください。</translation> -<translation id="7089609847854449639">ストレージ管理者</translation> <translation id="708969677220991657">無効な証明書が提示された場合でも HTTPS 経由でのローカルホストへのリクエストを許可します。</translation> <translation id="7092106376816104">ポップアップの例外</translation> <translation id="7093866338626856921">デバイス <ph name="HOSTNAMES" /> とのデータ交換</translation> @@ -4581,7 +4586,7 @@ <translation id="715118844758971915">従来のプリンタ</translation> <translation id="7154130902455071009">スタート ページを次に変更します: <ph name="START_PAGE" /></translation> <translation id="7155171745945906037">カメラやファイルに保存されている写真</translation> -<translation id="715568033737470079">Win32k のロックダウン サンドボックス ポリシー内で実行される PPAPI プラグインを指定します(Windows 10 以上のみ)。</translation> +<translation id="7155226869555939647">常に <ph name="APPLICATION" /> でリンクを開く</translation> <translation id="7156235233373189579">このファイルは Windows ソフトウェアを使用する PC 向けのもので、Chrome OS を実行するデバイスとは互換性がありません。<ph name="BEGIN_LINK" />Chrome ウェブストア<ph name="END_LINK" />で、このデバイスで使用できる代わりのアプリをお探しください。<ph name="BEGIN_LINK_HELP" />詳細<ph name="END_LINK_HELP" /></translation> <translation id="7157063064925785854">[続行] をクリックすると、<ph name="LEGAL_DOC_LINK_TEXT_1" />、<ph name="LEGAL_DOC_LINK_TEXT_2" />、<ph name="LEGAL_DOC_LINK_TEXT_3" />、<ph name="LEGAL_DOC_LINK_TEXT_4" />に同意したことになります。</translation> <translation id="7158238151765743968">「<ph name="DEVICE_NAME" />」に引き続き接続しています。</translation> @@ -4596,6 +4601,7 @@ <translation id="7175353351958621980">ロード元:</translation> <translation id="7180611975245234373">更新</translation> <translation id="7180865173735832675">カスタマイズ</translation> +<translation id="7181387261278441780">サイトデータを削除して権限をリセット</translation> <translation id="7185078796915954712">TLS 1.3</translation> <translation id="7185690883425432021">タブバーがスタックモードのときに、アクティブでないタブの [閉じる] ボタンを非表示にします。</translation> <translation id="7186088072322679094">ツールバーに残す</translation> @@ -4628,7 +4634,6 @@ <translation id="7223775956298141902">拡張機能はありません。</translation> <translation id="7224023051066864079">サブネット マスク:</translation> <translation id="7225179976675429563">ネットワークの種類が指定されていません</translation> -<translation id="7230191962699768124">すべてアニメーションなしで表示する</translation> <translation id="7230787553283372882">テキストサイズをカスタマイズします</translation> <translation id="7231224339346098802">1 以上の数字を使用して、印刷する部数を指定してください。</translation> <translation id="7238585580608191973">SHA-256 指紋</translation> @@ -4762,7 +4767,6 @@ <translation id="7409233648990234464">再起動と Powerwash</translation> <translation id="7409836189476010449">Flash の実行</translation> <translation id="7410344089573941623"><ph name="HOST" /> がカメラやマイクへのアクセスを要求しているか確認する</translation> -<translation id="7411343637221933631">{NUM_COOKIES,plural, =1{このサイトから 1 個}other{このサイトから # 個}}</translation> <translation id="7412226954991670867">GPU メモリ</translation> <translation id="7416362041876611053">不明なネットワーク エラーが発生しました。</translation> <translation id="7417453074306512035">エチオピア語キーボード</translation> @@ -4884,6 +4888,7 @@ <translation id="756445078718366910">ブラウザ ウィンドウを開く</translation> <translation id="7564847347806291057">プロセスを終了</translation> <translation id="7566723889363720618">F12</translation> +<translation id="7567314848159753396">Cookie: <ph name="NAME" /></translation> <translation id="756809126120519699">Chrome データの消去完了</translation> <translation id="7568790562536448087">更新中:</translation> <translation id="7573172247376861652">バッテリー充電</translation> @@ -4924,6 +4929,7 @@ <translation id="7626009897377900107">パスワードの生成</translation> <translation id="7627262197844840899">このサイトでは MasterCard は使用できません。</translation> <translation id="7627790789328695202"><ph name="FILE_NAME" /> は既に存在しています。名前を変更してもう一度お試しください。</translation> +<translation id="7628127343934101653">PDF ファイルをデフォルトの PDF ビューア アプリで開く。</translation> <translation id="762917759028004464">既定のブラウザは <ph name="BROWSER_NAME" /> に設定されています。</translation> <translation id="7629536005696009600">Android アプリケーション用に保存されている認証情報を、対応するウェブサイトに入力できるようにします。</translation> <translation id="7629827748548208700">タブ:<ph name="TAB_NAME" /></translation> @@ -5152,6 +5158,7 @@ <translation id="7957513156576779045">ペア設定するには Bluetooth を有効にします</translation> <translation id="7957615753207896812">キーボードのデバイス設定を開く</translation> <translation id="7959074893852789871">ファイルに含まれる複数の証明書のうち、一部をインポートできませんでした:</translation> +<translation id="7959700692661109221"><ph name="BEGIN_PARAGRAPH" />Google の位置情報サービスは、Wi-Fi などのソースを使用して、よりすばやく正確に端末の現在地を推定します。Google の位置情報サービスをオンにした場合、端末は Wi‑Fi を使用して現在地を推定するモードになります。このサービスは位置情報の設定でいつでもオフにできます。<ph name="END_PARAGRAPH" /></translation> <translation id="7961015016161918242">使用しない</translation> <translation id="7964089325405904043">パスワードのインポートとエクスポート</translation> <translation id="7965010376480416255">共有メモリ</translation> @@ -5302,6 +5309,7 @@ <translation id="8146793085009540321">ログインできませんでした。管理者にお問い合わせいただくか、もう一度お試しください。</translation> <translation id="8148264977957212129">Pinyin 入力方法</translation> <translation id="8148913456785123871">ランチャーで Google Now カードを利用する</translation> +<translation id="8150391391298684512">Windows Runtime MIDI API を無効にする</translation> <translation id="8151185429379586178">デベロッパー ツール</translation> <translation id="8151638057146502721">設定</translation> <translation id="8151639108075998630">ゲストのブラウジングを許可する</translation> @@ -5582,6 +5590,7 @@ <translation id="8532294913309524834">言語を任意の順序に並べます。</translation> <translation id="8535005006684281994">Netscape 証明書更新 URL</translation> <translation id="8539727552378197395">いいえ(HTTP のみ)</translation> +<translation id="8541084862688000575">Android アプリを自動的に読み込む</translation> <translation id="8543181531796978784"><ph name="BEGIN_ERROR_LINK" />検出の問題をご報告<ph name="END_ERROR_LINK" />ください。<ph name="BEGIN_LINK" />安全でないこのサイトにアクセス<ph name="END_LINK" />する場合は、セキュリティ上のリスクがあることをご承知おきください。</translation> <translation id="8545107379349809705">情報を表示しない...</translation> <translation id="8545211332741562162">ウェブページで JavaScript の試験運用機能を使用できるようにします。</translation> @@ -5609,7 +5618,6 @@ <translation id="8569764466147087991">ファイルを選択して開く</translation> <translation id="8571032220281885258">「OK Google」と話しかけると、その後に話す内容が Chrome で検索されます。</translation> <translation id="8571108619753148184">サーバー 4</translation> -<translation id="8572832761467613633">Flash のみ</translation> <translation id="8572981282494768930">カメラやマイクへのアクセスをサイトに許可しない</translation> <translation id="8574234089711453001">メディア URL のページを開くときにダウンロード ボタンが表示されるようにします。</translation> <translation id="857779305329188634">QUIC プロトコルのサポート(試験運用中)を有効にします。</translation> @@ -5631,6 +5639,7 @@ <translation id="8600929685092827187">パケットを受信したらスリープから復帰する</translation> <translation id="8601206103050338563">TLS WWW クライアント認証</translation> <translation id="8602851771975208551">パソコン上の別のプログラムにより、Chrome の動作方法を変更する可能性のあるアプリが追加されました。</translation> +<translation id="8603912787021349466">ログイン後に Android アプリが自動起動することを許可します。</translation> <translation id="8605428685123651449">SQLite メモリ</translation> <translation id="8605503133013456784">「<ph name="DEVICE_NAME" />」との接続を切断してペア設定を解除できませんでした。</translation> <translation id="8606726445206553943">MIDI デバイスの使用</translation> @@ -5983,6 +5992,7 @@ <translation id="9053965862400494292">同期の設定中にエラーが発生しました。</translation> <translation id="9056034633062863292">Chromebox を更新中...</translation> <translation id="9056810968620647706">一致する項目が見つかりません。</translation> +<translation id="9057119625587205566">近くにプリンタはありません</translation> <translation id="9059868303873565140">ステータス メニュー</translation> <translation id="9064142312330104323">Google プロフィール写真(読み込み中)</translation> <translation id="9064275926664971810">フォームにワンクリックで自動入力できるようにします</translation> @@ -5993,6 +6003,7 @@ <translation id="9067401056540256169">このフラグを使用すると Chrome は安全でなくなります。このフラグによる影響を正しく理解している場合にのみ使用してください。このフラグは予告なく削除されることがあります。このフラグを有効にすると、HTTPS から発生したフレームで、保護されていない URL(ws://)の WebSocket を使用できるようになります。</translation> <translation id="9068931793451030927">パス:</translation> <translation id="9070219033670098627">ユーザーを切り替え</translation> +<translation id="9070940116164932228">バックグラウンド タイマーの CPU 使用率を制限する</translation> <translation id="907148966137935206">すべてのサイトのポップアップ表示を許可しない(推奨)</translation> <translation id="9072550133391925347"><ph name="PASSWORD_MANAGER_BRAND" /> では、保存したパスワードを使って対象となるサイトとアプリへの自動ログインが行われます。</translation> <translation id="9073281213608662541">PAP</translation> @@ -6026,6 +6037,7 @@ <translation id="9112614144067920641">新しい PIN を選択してください。</translation> <translation id="9112748030372401671">壁紙を変更する</translation> <translation id="9112987648460918699">検索...</translation> +<translation id="9114663181201435112">簡単にログイン</translation> <translation id="9115487443206954631">キャスト デバイスを管理</translation> <translation id="9115675100829699941">ブックマーク(&B)</translation> <translation id="9121814364785106365">固定されたタブとして開く</translation> @@ -6120,7 +6132,6 @@ <translation id="952992212772159698">無効</translation> <translation id="960719561871045870">事業者コード</translation> <translation id="960987915827980018">あと約 1 時間</translation> -<translation id="962778376131245616">保護されていない場合にのみアニメーション付きで表示する</translation> <translation id="96421021576709873">Wi-Fi ネットワーク</translation> <translation id="965490406356730238">取得済みのフレームに対し、可能な場合にハードウェア アクセラレーションによる mjpeg デコードを有効にします。</translation> <translation id="968174221497644223">アプリケーション キャッシュ</translation>
diff --git a/chrome/app/resources/generated_resources_kn.xtb b/chrome/app/resources/generated_resources_kn.xtb index 43dc2baf..72e4c1d 100644 --- a/chrome/app/resources/generated_resources_kn.xtb +++ b/chrome/app/resources/generated_resources_kn.xtb
@@ -18,7 +18,6 @@ <translation id="1029317248976101138">ಝೂಮ್</translation> <translation id="1029595648591494741">"<ph name="EXTENSION_NAME" />" ಪ್ರಯತ್ನಿಸುವುದೇ?</translation> <translation id="1031362278801463162">ಪೂರ್ವವೀಕ್ಷಣೆ ಲೋಡ್ ಆಗುತ್ತಿದೆ</translation> -<translation id="1031460590482534116">ಕ್ಲೈಂಟ್ ದೃಢೀಕರಣವನ್ನು ಸಂಗ್ರಹಿಸಲು ಪ್ರಯತ್ನಿಸುವಾಗ ದೋಷ ಸಂಭವಿಸಿದೆ. ದೋಷ <ph name="ERROR_NUMBER" /> (<ph name="ERROR_NAME" />).</translation> <translation id="1031573127485938293">ಕೇಳು (ನೀತಿಯ ಮೂಲಕ)</translation> <translation id="103279545524624934">Android ಅಪ್ಲಿಕೇಶನ್ಗಳನ್ನು ಪ್ರಾರಂಭಿಸಲು ಡಿಸ್ಕ್ ಸ್ಥಳಾವಕಾಶ ಮುಕ್ತಗೊಳಿಸಿ.</translation> <translation id="1033780634303702874">ನಿಮ್ಮ ಸರಣಿ ಸಾಧನಗಳನ್ನು ಪ್ರವೇಶಿಸಿ</translation> @@ -101,6 +100,7 @@ <translation id="1128591060186966949">ಹುಡುಕಾಟ ಎಂಜಿನ್ ಅನ್ನು ಎಡಿಟ್ ಮಾಡಿ</translation> <translation id="1128987120443782698">ಸಂಗ್ರಹಣೆ ಸಾಧನವು <ph name="DEVICE_CAPACITY" /> ನ ಸಾಮರ್ಥ್ಯವನ್ನು ಹೊಂದಿದೆ. ದಯವಿಟ್ಟು ಕನಿಷ್ಠ 4GB ಯ ಸಾಮರ್ಥ್ಯ ಹೊಂದಿರುವ SD ಕಾರ್ಡ್ ಅಥವಾ USB ಮೆಮೊರಿ ಸ್ಟಿಕ್ ಅನ್ನು ಸೇರಿಸಿ.</translation> <translation id="1137135726305341424">domContentLoaded ಮತ್ತು domContentLoaded (ಮುಖ್ಯ ಫ್ರೇಮ್ ಮತ್ತು ಅದೇ ಮೂಲದ iframes) ಗಿಂತಲೂ ಮೊದಲು ಪ್ರಾರಂಭಗೊಂಡ ಎಲ್ಲಾ ಸಂಪನ್ಮೂಲ ಲೋಡ್ಗಳು.</translation> +<translation id="1138663153846032155">ಫ್ಲ್ಯಾಶ್ ಮೂಲಕ HTML ಗೆ ಆದ್ಯತೆ ನೀಡಿ</translation> <translation id="1140351953533677694">ನಿಮ್ಮ ಬ್ಲೂಟೂತ್ ಮತ್ತು ಸರಣಿ ಸಾಧನಗಳನ್ನು ಪ್ರವೇಶಿಸಿ</translation> <translation id="114140604515785785">ವಿಸ್ತರಣೆ ಮೂಲ ಡೈರೆಕ್ಟರಿ:</translation> <translation id="1143142264369994168">ಪ್ರಮಾಣಪತ್ರ ಸಹಿ ಮಾಡುವವರು</translation> @@ -252,6 +252,7 @@ <translation id="1351692861129622852"><ph name="FILE_COUNT" /> ಫೈಲ್ಗಳನ್ನು ಆಮದು ಮಾಡಲಾಗುತ್ತಿದೆ...</translation> <translation id="1352103415082130575">ಥಾಯ್ ಕೀಬೋರ್ಡ್ (ಪ್ಯಾಟಾಚೊಟ್)</translation> <translation id="1353686479385938207"><ph name="PROVIDER_NAME" />: <ph name="NETWORK_NAME" /></translation> +<translation id="1353946958707294039">ವಸ್ತು ವಿನ್ಯಾಸ ಸಂಗ್ರಹಣೆ ನಿರ್ವಾಹಕ</translation> <translation id="1353966721814789986">ಆರಂಭಿಕ ಪುಟಗಳು</translation> <translation id="1354868058853714482">Adobe Reader ಅವಧಿ ಮುಗಿದಿದೆ ಮತ್ತು ಸುರಕ್ಷತೆಯ ದೃಷ್ಟಿಯಿಂದ ದುರ್ಬಲಗೊಂಡಿರಬಹುದು.</translation> <translation id="1355408554203439639">3D ಸಾಫ್ಟ್ವೇರ್ ರಾಸ್ಟರೈಸರ್</translation> @@ -367,7 +368,7 @@ <translation id="1483493594462132177">ಕಳುಹಿಸು</translation> <translation id="148466539719134488">ಸ್ವಿಸ್</translation> <translation id="1485015260175968628">ಇದೀಗ ಸಾಧ್ಯ:</translation> -<translation id="1486096554574027028">ಪಾಸ್ವರ್ಡ್ಗಳನ್ನು ಹುಡುಕು</translation> +<translation id="1486096554574027028">ಪಾಸ್ವರ್ಡ್ಗಳನ್ನು ಹುಡುಕಿ</translation> <translation id="149054319867505275">"use asm" ಇರುವಾಗ Asm.js ಮೌಲ್ಯೀಕರಿಸಿ ತದನಂತರ WebAssembly ಗೆ ಮಾರ್ಪಡಿಸಿ.</translation> <translation id="1493263392339817010">ಫಾಂಟ್ಗಳನ್ನು ಕಸ್ಟಮೈಸ್ ಮಾಡಿ...</translation> <translation id="1493492096534259649">ಈ ಭಾಷೆಯನ್ನು ಕಾಗುಣಿತ ಪರಿಶೀಲನೆಗಾಗಿ ಬಳಸಲು ಸಾಧ್ಯವಿಲ್ಲ</translation> @@ -424,7 +425,6 @@ <translation id="1533920822694388968">TV ಹೊಂದಾಣಿಕೆ</translation> <translation id="15373452373711364">ದೊಡ್ಡ ಮೌಸ್ ಕರ್ಸರ್</translation> <translation id="1543284117603151572">Edge ನಿಂದ ಆಮದು ಮಾಡಿಕೊಳ್ಳಲಾಗಿದೆ</translation> -<translation id="1544350195767834591">{NUM_COOKIES,plural, =1{ಇತರೆ ಸೈಟ್ಗಳಿಂದ 1}one{ಇತರೆ ಸೈಟ್ಗಳಿಂದ #}other{ಇತರೆ ಸೈಟ್ಗಳಿಂದ #}}</translation> <translation id="1545177026077493356">ಸ್ವಯಂಚಾಲಿತ ಕಿಯೋಸ್ಕ್ ಮೋಡ್</translation> <translation id="1545786162090505744">ಕ್ವೈರಿ ಸ್ಥಳದಲ್ಲಿ %s ನೊಂದಿಗೆ URL</translation> <translation id="1546280085599573572">ನೀವು ಮುಖಪುಟದ ಬಟನ್ ಕ್ಲಿಕ್ ಮಾಡಿದಾಗ ತೋರಿಸಬೇಕಾದ ಪುಟವನ್ನು ಈ ವಿಸ್ತರಣೆಯು ಬದಲಾಯಿಸಿದೆ.</translation> @@ -448,7 +448,6 @@ <translation id="1559235587769913376">ಯೂನಿಕೋಡ್ ಅಕ್ಷರಗಳನ್ನು ಇನ್ಪುಟ್ ಮಾಡಿ</translation> <translation id="1561092721008294962">UI ಪಠ್ಯಕ್ಕಾಗಿ HarfBuzz</translation> <translation id="1566049601598938765">ವೆಬ್ಸೈಟ್</translation> -<translation id="1566958206723629112">ಫ್ಲ್ಯಾಶ್ ಮತ್ತು PDF</translation> <translation id="1567723158593978621">ಸಕ್ರಿಯಗೊಳಿಸಿದಾಗ, ಬ್ರೌಸರ್ಗೆ ಸೈನ್ ಇನ್ ಮಾಡುವುದರಿಂದ ಹೊಸ gaia ಪಾಸ್ವರ್ಡ್ ಬಳಸುತ್ತದೆ-ಸೈನ್ ಇನ್ ಹರಿವು ಪ್ರತ್ಯೇಕವಾಗಿರುತ್ತದೆ.</translation> <translation id="1567993339577891801">JavaScript ಕನ್ಸೋಲ್</translation> <translation id="1568323446248056064">ಪ್ರದರ್ಶನ ಸಾಧನ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ತೆರೆಯಿರಿ</translation> @@ -577,7 +576,6 @@ <translation id="1723940674997333416">https ಮೂಲದಿಂದ ಅಸುರಕ್ಷಿತ WebSocket ಅನುಮತಿಸಿ</translation> <translation id="1725149567830788547">&ನಿಯಂತ್ರಣಗಳನ್ನು ತೋರಿಸಿ</translation> <translation id="172612876728038702">TPM ಅನ್ನು ಹೊಂದಿಸಲಾಗುತ್ತಿದೆ. ದಯವಿಟ್ಟು ತಾಳ್ಮೆಯಿಂದಿರಿ; ಇದು ತುಸು ಸಮಯ ತೆಗೆದುಕೊಳ್ಳಬಹುದು. </translation> -<translation id="1727135806684246609">ವಸ್ತು ಭದ್ರತೆ ವರ್ಬೋಸ್</translation> <translation id="1729533290416704613">ಓಮ್ನಿಬಾಕ್ಸ್ನಿಂದ ನೀವು ಹುಡುಕಾಟ ನಡೆಸಿದಾಗ ತೋರಿಸಬೇಕಾದ ಪುಟವನ್ನು ಕೂಡಾ ಇದು ನಿಯಂತ್ರಿಸುತ್ತದೆ.</translation> <translation id="1731346223650886555">ಅರ್ಧವಿರಾಮಚಿಹ್ನೆ</translation> <translation id="1731589410171062430">ಮೊತ್ತ: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /> (<ph name="NUMBER_OF_PAGES" /> <ph name="PAGE_OR_PAGES_LABEL" />)</translation> @@ -873,6 +871,7 @@ <translation id="218492098606937156">ಸ್ಪರ್ಶ ಈವೆಂಟ್ಗಳನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ</translation> <translation id="2187317261103489799">ಪತ್ತೆ ಮಾಡಿ (ಡಿಫಾಲ್ಟ್)</translation> <translation id="2187895286714876935">ಸರ್ವರ್ ಪ್ರಮಾಣಪತ್ರದ ಆಮದು ದೋಷ</translation> +<translation id="2188881192257509750"><ph name="APPLICATION" /> ತೆರೆಯಿರಿ</translation> <translation id="2190069059097339078">ವೈಫೈ ರುಜುವಾತುಗಳ ಪಡೆಯುವಿಕೆ</translation> <translation id="219008588003277019">ಸ್ಥಳೀಯ ಕ್ಲೈಂಟ್ ಮಾಡ್ಯೂಲ್: <ph name="NEXE_NAME" /></translation> <translation id="2190355936436201913">(ಖಾಲಿ)</translation> @@ -991,6 +990,7 @@ <translation id="2326606747676847821">ಅದೃಶ್ಯ ಬ್ರೌಸರ್ಗೆ ಹೋಗು</translation> <translation id="2326931316514688470">ಅಪ್ಲಿಕೇಶನ್ &ಮರುಲೋಡ್ ಮಾಡಿ</translation> <translation id="2327492829706409234">ಅಪ್ಲಿಕೇಶನ್ ಸಕ್ರಿಯಗೊಳಿಸು</translation> +<translation id="2328054044222305089">ಇದು ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ <ph name="SITE" /> ಸಂಗ್ರಹಿಸಲಾದ ಯಾವುದೇ ಡೇಟಾವನ್ನು ಅಳಿಸುತ್ತದೆ ಮತ್ತು ರನ್ ಮಾಡಲು ನೀವು ನೀಡಿದ ಅನುಮತಿಗಳನ್ನು ಮರುಹೊಂದಿಸುತ್ತದೆ. ನೀವು ಮುಂದುವರಿಸಲು ಬಯಸುತ್ತೀರಾ?</translation> <translation id="2329597144923131178">ನಿಮ್ಮ ಎಲ್ಲ ಸಾಧನಗಳಲ್ಲಿ ನಿಮ್ಮ ಬುಕ್ಮಾರ್ಕ್ಗಳು, ಇತಿಹಾಸ ಮತ್ತು ಇತರ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ಪಡೆದುಕೊಳ್ಳಲು ಸೈನ್ ಇನ್ ಮಾಡಿ.</translation> <translation id="2332131598580221120">ಸ್ಟೋರ್ನಲ್ಲಿ ವೀಕ್ಷಿಸಿ</translation> <translation id="2332742915001411729">ಡೀಫಾಲ್ಟ್ಗೆ ಮರುಹೊಂದಿಸಿ</translation> @@ -1266,7 +1266,6 @@ <translation id="2675358154061544447">ಪ್ರತ್ಯೇಕ ಪ್ರಕ್ರಿಯೆಗಳಲ್ಲಿ ಕ್ರಾಸ್-ಸೈಟ್ iframe ಗಳನ್ನು ರೆಂಡರ್ ಮಾಡಲು ಹೆಚ್ಚು ಪ್ರಾಯೋಗಿಕ ಬೆಂಬಲ. ಈ ಮೋಡ್ನಲ್ಲಿ, ಡಾಕ್ಯುಮೆಂಟ್ಗಳು ಒಂದು ವೇಳೆ ಅದೇ ವೆಬ್ ಸೈಟ್ನಿಂದ ಆಗಿದ್ದರೆ ಮಾತ್ರ ರೆಂಡರರ್ ಪ್ರಕ್ರಿಯೆಯನ್ನು ಹಂಚಿಕೊಳ್ಳುತ್ತವೆ.</translation> <translation id="2676946222714718093">ಪ್ಲೇ ಆಗುತ್ತಿದೆ</translation> <translation id="2678063897982469759">ಮರು-ಸಕ್ರಿಯಗೊಳಿಸಿ</translation> -<translation id="2678246812096664977">ಎಲ್ಲಾ ಪ್ಲಗಿನ್ಗಳು</translation> <translation id="2679385451463308372">ಸಿಸ್ಟಂ ಸಂವಾದವನ್ನು ಬಳಸಿ ಮುದ್ರಿಸಿ...</translation> <translation id="2680208403056680091">ನಿಮ್ಮ ಇಂಟರ್ನೆಟ್ ಸಂಪರ್ಕವನ್ನು ನಿಯಂತ್ರಿಸಲಾಗುತ್ತಿದೆ</translation> <translation id="268053382412112343">&ಇತಿಹಾಸ</translation> @@ -1440,7 +1439,6 @@ <translation id="287286579981869940"><ph name="PROVIDER_NAME" /> ಸೇರಿಸಿ...</translation> <translation id="2872961005593481000">ಮುಚ್ಚಿಬಿಡಿ </translation> <translation id="2875698561019555027">(Chrome ದೋಷ ಪುಟಗಳು)</translation> -<translation id="2879560882721503072"><ph name="ISSUER" /> ರಿಂದ ನೀಡಿದ ಕ್ಲೈಂಟ್ ಪ್ರಮಾಣಪತ್ರವನ್ನು ಯಶಸ್ವಿಯಾಗಿ ಸಂರಕ್ಷಿಸಲಾಗಿದೆ.</translation> <translation id="288024221176729610">ಜೆಕ್</translation> <translation id="288042212351694283">ನಿಮ್ಮ ಯುನಿವರ್ಸಲ್ 2ನೇ ಫ್ಯಾಕ್ಟರ್ ಸಾಧನಗಳನ್ನು ಪ್ರವೇಶಿಸಿ</translation> <translation id="2881966438216424900">ಕೊನೆಯ ಬಾರಿ ಪ್ರವೇಶಿಸಿರುವುದು:</translation> @@ -1589,6 +1587,7 @@ <translation id="3057861065630527966">ನಿಮ್ಮ ಫೋಟೋಗಳು ಮತ್ತು ವೀಡಿಯೊಗಳನ್ನು ಬ್ಯಾಕಪ್ ಮಾಡಿ</translation> <translation id="3058212636943679650">ನಿಮ್ಮ ಕಂಪ್ಯೂಟರ್ನ ಆಪರೇಟಿಂಗ್ ಸಿಸ್ಟಂ ಅನ್ನು ನೀವು ಎಂದಿಗಾದರೂ ಪುನಃಸ್ಥಾಪಿಸುವ ಅಗತ್ಯ ಒದಗಿದಲ್ಲಿ ನಿಮಗೆ ಪುನರ್ಪ್ರಾಪ್ತಿಯ SD ಕಾರ್ಡ್ ಅಥವಾ USB ಮೆಮೊರಿ ಸ್ಟಿಕ್ನ ಅಗತ್ಯವಿರುತ್ತದೆ.</translation> <translation id="305932878998873762">HTTP ಗಾಗಿನ ಸರಳ ಕ್ಯಾಚ್ ಒಂದು ಹೊಸ ಕ್ಯಾಚ್ ಆಗಿದೆ. ಇದು ಡಿಸ್ಕ್ ಸ್ಪೇಸ್ ವಿಂಗಡನೆಗಾಗಿ ಫೈಲ್ಸಿಸ್ಟಂ ಮೇಲೆ ಅವಲಂಬನೆಗೊಂಡಿದೆ.</translation> +<translation id="3060251871394327123">ಇದು ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ <ph name="SITE" /> ಸಂಗ್ರಹಿಸಲಾದ ಯಾವುದೇ ಡೇಟಾವನ್ನು ಅಳಿಸುತ್ತದೆ. ನೀವು ಮುಂದುವರಿಸಲು ಬಯಸುತ್ತೀರಾ?</translation> <translation id="3061650404498811439">ಎಮೋಜಿ, ಕೈಬರಹ ಮತ್ತು ಧ್ವನಿ ಇನ್ಪುಟ್ ಫಾರ್ಮ್ಗೆ ಆಯ್ಕೆಯ IME ಮೆನುವಿನಲ್ಲಿ ಪ್ರವೇಶವನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ.</translation> <translation id="3062606427884046423">Chrome ಮಾಧ್ಯಮ ಪ್ರಕಟಣೆಗಳಿಗೆ Android MediaStyle ಪ್ರಕಟಣೆಗಳನ್ನು ಬಳಸಿ.</translation> <translation id="3063844757726132584">ಈ ಹ್ಯಾಂಡಿ ಲಾಂಚರ್ನಿಂದ ನಿಮ್ಮ ಎಲ್ಲ ಅಪ್ಲಿಕೇಶನ್ಗಳನ್ನು ಪ್ರವೇಶಿಸಿ. ಆಟಗಳನ್ನು ಆಡಿ, ವೀಡಿಯೊ ಚಾಟ್ ಮಾಡಿ, ಸಂಗೀತವನ್ನು ಆಲಿಸಿ, ಡಾಕ್ಯುಮೆಂಟ್ಗಳನ್ನು ಎಡಿಟ್ ಮಾಡಿ, ಅಥವಾ ಇನ್ನಷ್ಟು ಅಪ್ಲಿಕೇಶನ್ಗಳನ್ನು ಪಡೆದುಕೊಳ್ಳಿ.</translation> @@ -1638,6 +1637,7 @@ <translation id="3123569374670379335">(ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡಲಾಗಿದೆ)</translation> <translation id="3124111068741548686">ಬಳಕೆದಾರರ ನಿರ್ವಹಣೆಗಳು</translation> <translation id="3126026824346185272">Ctrl</translation> +<translation id="3127156390846601284">ಎಲ್ಲಾ ಸೈಟ್ಗಳಲ್ಲಿ ತೋರಿಸಲು ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ಸಂಗ್ರಹಿಸಲಾದ ಯಾವುದೇ ಡೇಟಾವನ್ನು ಇದು ಅಳಿಸುತ್ತದೆ. ನೀವು ಮುಂದುವರಿಸಲು ಬಯಸುತ್ತೀರಾ?</translation> <translation id="312759608736432009">ಸಾಧನ ತಯಾರಕ:</translation> <translation id="3127919023693423797">ದೃಢೀಕರಿಸಲಾಗುತ್ತಿದೆ...</translation> <translation id="3128230619496333808">ಟ್ಯಾಬ್ 6</translation> @@ -1716,7 +1716,7 @@ <translation id="32279126412636473">(⌘R) ಅನ್ನು ಮರುಲೋಡ್ ಮಾಡಿ</translation> <translation id="3228679360002431295">ಸಂಪರ್ಕಿಸಲಾಗುತ್ತಿದೆ ಮತ್ತು ಪರಿಶೀಲಿಸಲಾಗುತ್ತಿದೆ<ph name="ANIMATED_ELLIPSIS" /></translation> <translation id="3232318083971127729">ಮೌಲ್ಯ:</translation> -<translation id="3234666976984236645">ಈ ಸೈಟ್ನಲ್ಲಿ ಯಾವಾಗೂ ಮುಖ್ಯ ವಿಷಯವನ್ನು ಹುಡುಕು</translation> +<translation id="3234666976984236645">ಈ ಸೈಟ್ನಲ್ಲಿ ಯಾವಾಗೂ ಮುಖ್ಯ ವಿಷಯವನ್ನು ಹುಡುಕಿ</translation> <translation id="3237784613213365159"><ph name="NEW_PROFILE_NAME" /> ಈಗ ಮೇಲ್ವಿಚಾರಣೆಯಲ್ಲಿರುವ ಬಳಕೆದಾರರು</translation> <translation id="323803881985677942">ವಿಸ್ತರಣೆ ಆಯ್ಕೆಗಳನ್ನು ತೆರೆಯಿರಿ</translation> <translation id="324056286105023296"><ph name="PROFILE_NAME" /> ಇಲ್ಲವೇ?</translation> @@ -1736,7 +1736,6 @@ <translation id="3264544094376351444">Sans-Serif ಫಾಂಟ್</translation> <translation id="3264547943200567728">ನಿಮ್ಮ Chromebox ನ ನೆಟ್ವರ್ಕ್ ಹೊಂದಿಸಲು ವಿಫಲವಾಗಿದೆ</translation> <translation id="3265459715026181080">ವಿಂಡೋ ಮುಚ್ಚು</translation> -<translation id="3267271790328635957">PDF ಮಾತ್ರ</translation> <translation id="3267726687589094446">ಬಹು ಫೈಲ್ಗಳ ಸ್ವಯಂಚಾಲಿತ ಡೌನ್ಲೋಡ್ಗಳನ್ನು ಅನುಮತಿಸುವುದನ್ನು ಮುಂದುವರಿಸು</translation> <translation id="3267998849713137817">ಮಾರ್ಪಡಿಸಿದ ಸಮಯ</translation> <translation id="3268451620468152448">ತೆರೆದ ಟ್ಯಾಬ್ಗಳು</translation> @@ -1981,6 +1980,7 @@ <translation id="3574210789297084292">ಸೈನ್ ಇನ್</translation> <translation id="3574305903863751447"><ph name="CITY" />, <ph name="STATE" /> <ph name="COUNTRY" /></translation> <translation id="357479282490346887">ಲಿಥುವಾನಿಯನ್</translation> +<translation id="3575927481544652747">WebMIDI ಗೆ Windows Runtime MIDI API ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ, ಇದನ್ನು Windows 10 ಅಥವಾ ನಂತರದ ಆವೃತ್ತಿಯಲ್ಲಿ ಡಿಫಾಲ್ಟ್ ಆಗಿ ಸಕ್ರಿಯಗೊಳಿಸಲಾಗುತ್ತದೆ.</translation> <translation id="3576324189521867626">ಯಶಸ್ವಿಯಾಗಿ ಸ್ಥಾಪಿಸಲಾಗಿದೆ</translation> <translation id="3578331450833904042">ಡಿಫಾಲ್ಟ್ (ಪ್ರತಿಯೊಂದನ್ನು ಆರಿಸಿಕೊಳ್ಳಿ)</translation> <translation id="3578594933904494462">ಈ ಟ್ಯಾಬ್ ವಿಷಯವನ್ನು ಹಂಚಲಾಗುತ್ತಿದೆ.</translation> @@ -2034,8 +2034,6 @@ <translation id="3627320433825461852">1 ನಿಮಿಷಕ್ಕಿಂತಲೂ ಕಡಿಮೆ ಬಾಕಿ ಉಳಿದಿದೆ</translation> <translation id="3627588569887975815">ಲಿಂಕ್ ಅನ್ನು ಅಜ್ಞಾ&ತ ವಿಂಡೋದಲ್ಲಿ ತೆರೆಯಿರಿ</translation> <translation id="3627671146180677314">Netscape ಪ್ರಮಾಣಪತ್ರ ಅಪ್ಡೇಟ್ ಸಮಯ</translation> -<translation id="3629326610814700057">ಸ್ಥಳೀಯ ಸಂಗ್ರಹಣೆ ನಿರ್ವಹಿಸಲು ಸಂಗ್ರಹಣೆಯ ನಿರ್ವಾಹಕ ಸಕ್ರಿಯಗೊಳಿಸುತ್ತದೆ.</translation> -<translation id="3630337581925712713"><ph name="PERMISSION_TYPE_LABEL" />:</translation> <translation id="3631337165634322335">ಕೆಳಗಿನ ವಿನಾಯಿತಿಗಳು ಪ್ರಸ್ತುತ ಅದೃಶ್ಯ ಸೆಶನ್ಗೆ ಮಾತ್ರ ಅನ್ವಯಿಸುತ್ತದೆ.</translation> <translation id="3633586230741134985">ಅಪ್ಲಿಕೇಶನ್ ಲಾಂಚರ್ ಸೆಟ್ಟಿಂಗ್ಗಳು</translation> <translation id="3633997706330212530">ನಿಮಗೆ ಇಷ್ಟವಾದಾಗ ಈ ಸೇವೆಗಳನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಬಹುದು.</translation> @@ -2058,7 +2056,7 @@ <translation id="3654045516529121250">ನಿಮ್ಮ ಪ್ರವೇಶಿಸುವಿಕೆ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ಓದಿಕೊಳ್ಳಿ</translation> <translation id="3654092442379740616">ಸಿಂಕ್ ದೋಷ: <ph name="PRODUCT_NAME" /> ಅವಧಿ ಮುಕ್ತಾಯಗೊಂಡಿದೆ ಮತ್ತು ನವೀಕರಿಸುವ ಅಗತ್ಯವಿದೆ.</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{ಇದು ಒಂದು ಫೈಲ್ಗೆ ಶಾಶ್ವತ ಪ್ರವೇಶವನ್ನು ಹೊಂದಿದೆ.}one{ಇದು # ಫೈಲ್ಗಳಿಗೆ ಶಾಶ್ವತ ಪ್ರವೇಶವನ್ನು ಹೊಂದಿದೆ.}other{ಇದು # ಫೈಲ್ಗಳಿಗೆ ಶಾಶ್ವತ ಪ್ರವೇಶವನ್ನು ಹೊಂದಿದೆ.}}</translation> -<translation id="3657468915905674858">PPAPI Win32k ಲಾಕ್ಡೌನ್ ಸಕ್ರಿಯಗೊಳಿಸಿ.</translation> +<translation id="365793796291733849"><ph name="BEGIN_PARAGRAPH1" />ನೀವು ಸ್ವಯಂಚಾಲಿತ ಬ್ಯಾಕಪ್ ಆನ್ ಮಾಡಿದಾಗ, Google ಡ್ರೈವ್ನಲ್ಲಿನ ಖಾಸಗಿ ಫೋಲ್ಡರ್ಗೆ ಸಾಧನ ಮತ್ತು ಅಪ್ಲಿಕೇಶನ್ ಡೇಟಾವನ್ನು ನಿಯತಕಾಲಿಕವಾಗಿ ಉಳಿಸಲಾಗುತ್ತದೆ. ಅಪ್ಲಿಕೇಶನ್ ಡೇಟಾವು ಸಂಪರ್ಕಗಳು, ಸಂದೇಶಗಳು ಮತ್ತು ಫೋಟೋಗಳಂತಹ ಸಂಭವನೀಯ ಸೂಕ್ಷ್ಮ ಡೇಟಾ ಸೇರಿದಂತೆ, ಅಪ್ಲಿಕೇಶನ್ ಉಳಿಸಿರುವಂತಹ ಅಪ್ಲಿಕೇಶನ್ನ ಯಾವುದೇ ಡೇಟಾ ಆಗಿರಬಹುದು (ಡೆವಲಪರ್ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ಆಧರಿಸಿ).<ph name="END_PARAGRAPH1" /><ph name="BEGIN_PARAGRAPH2" />ಬ್ಯಾಕಪ್ ಡೇಟಾವನ್ನು ನಿಮ್ಮ ಡೇಟಾ ಸಂಗ್ರಹಣೆ ಕೋಟಾದಲ್ಲಿ ಪರಿಗಣಿಸಲಾಗುವುದಿಲ್ಲ. ದೊಡ್ಡ ಫೈಲ್ಗಳು ಅಥವಾ ಫೈಲ್ಗಳ ಡೆವಲಪರ್ಗಳು ಸೇವೆಯಿಂದ ಹೊರತುಪಡಿಸುವುದಕ್ಕೆ ಆಯ್ಕೆಮಾಡಿಕೊಂಡಿರುವುದನ್ನು ಬ್ಯಾಕಪ್ ಮಾಡಲು ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ.<ph name="END_PARAGRAPH2" /></translation> <translation id="3660234220361471169">ವಿಶ್ವಾಸಾರ್ಹವಿಲ್ಲದ</translation> <translation id="3665589677786828986">ನಿಮ್ಮ ಕೆಲವು ಸೆಟ್ಟಿಂಗ್ಗಳು ಬೇರೊಂದು ಪ್ರೋಗ್ರಾಂನಿಂದಾಗಿ ಹಾನಿಗೊಳಗಾಗಿರುವುದು Chrome ಗಮನಕ್ಕೆ ಬಂದಿದೆ ಮತ್ತು ಅವುಗಳ ಮೂಲ ಡೀಫಾಲ್ಟ್ಗಳಿಗೆ ಅವುಗಳನ್ನು ಮರುಹೊಂದಿಸಿದೆ.</translation> <translation id="3665842570601375360">ಭದ್ರತೆ:</translation> @@ -2113,6 +2111,7 @@ <translation id="3733127536501031542">ಹೆಚ್ಚುವಿಕೆಯೊಂದಿಗೆ SSL ಸರ್ವರ್</translation> <translation id="3736520371357197498">ನಿಮ್ಮ ಸುರಕ್ಷತೆ ಅಪಾಯಗಳು ನಿಮಗೆ ಅರ್ಥವಾಗಿದ್ದರೆ, ಅಪಾಯಕಾರಿ ಪ್ರೋಗ್ರಾಂಗಳನ್ನು ತೆಗೆದುಹಾಕುವುದಕ್ಕೂ ಮೊದಲು ನೀವು <ph name="BEGIN_LINK" />ಈ ಅಸುರಕ್ಷಿತ ಸೈಟ್ಗೆ ಭೇಟಿ ನೀಡಬಹುದು<ph name="END_LINK" />.</translation> <translation id="3738924763801731196"><ph name="OID" />:</translation> +<translation id="3739254215541673094"><ph name="APPLICATION" /> ತೆರೆಯುವುದೇ?</translation> <translation id="3739798227959604811">ಪುನರಾವರ್ತನೆ ಮುಂಚೆ ವಿಳಂಬ:</translation> <translation id="3741158646617793859"><ph name="DEVICE_NAME" /> ಈಗ ನಿರ್ವಹಣೆ ಕನ್ಸೋಲ್ನಲ್ಲಿ ಕಾಣಿಸುತ್ತದೆ</translation> <translation id="3741243925913727067">ನಿಮ್ಮ ಮಾಧ್ಯಮ ಸಾಧನದ ಫೋಟೋಗಳು ಮತ್ತು ವೀಡಿಯೊಗಳನ್ನು Google ಡ್ರೈವ್ಗೆ ಬ್ಯಾಕಪ್ ಮಾಡಿ.</translation> @@ -2255,7 +2254,7 @@ <translation id="3911824782900911339">ಹೊಸ ಟ್ಯಾಬ್ ಪುಟ</translation> <translation id="3914002678357611185">ಅಪ್ಲಿಕೇಶನ್ ಲಿಂಕ್ ಮಾಡಿ</translation> <translation id="391445228316373457">ನೇಪಾಳಿ ಕೀಬೋರ್ಡ್ (ಫೋನೆಟಿಕ್)</translation> -<translation id="3915280005470252504">ಧ್ವನಿ ಮೂಲಕ ಹುಡುಕು</translation> +<translation id="3915280005470252504">ಧ್ವನಿ ಮೂಲಕ ಹುಡುಕಿ</translation> <translation id="3916445069167113093">ಈ ಫೈಲ್ನ ಪ್ರಕಾರವು ನಿಮ್ಮ ಕಂಪ್ಯೂಟರ್ಗೆ ಹಾನಿಯನ್ನುಂಟು ಮಾಡಬಹುದು. ನೀವು <ph name="FILE_NAME" /> ಅನ್ನು ಹೇಗಿದ್ದರೂ ಇರಿಸಲು ಬಯಸುವಿರಾ?</translation> <translation id="3920504717067627103">ಪ್ರಮಾಣಪತ್ರ ನೀತಿಗಳು</translation> <translation id="392089482157167418">ChromeVox ಸಕ್ರಿಯಗೊಳಿಸಿ (ಮಾತಿನ ಪ್ರತಿಕ್ರಿಯೆ)</translation> @@ -2351,7 +2350,6 @@ <translation id="4058793769387728514">ಡಾಕ್ಯುಮೆಂಟ್ ಅನ್ನು ಇದೀಗ ಪರಿಶೀಲಿಸಿ</translation> <translation id="4059285154003114015">ಫ್ರೇಮ್ &ಪ್ರಿಂಟ್ ಮಾಡಿ...</translation> <translation id="406070391919917862">ಹಿನ್ನೆಲೆ ಅಪ್ಲಿಕೇಶನ್</translation> -<translation id="4061502419206152498">ಅಸುರಕ್ಷಿತ, ಅನಿಮೇಟ್ ಮಾಡದಿರುವುದನ್ನು ಮಾತ್ರ ತೋರಿಸು</translation> <translation id="4062251648694601778">ನಿಮ್ಮ <ph name="SHORT_PRODUCT_NAME" /> ಸಾಧನವನ್ನು ಆನಂದಿಸಿ. ಪ್ರಶ್ನೆಗಳಿವೆಯೇ? ಸ್ಥಿತಿ ಟ್ರೇನಲ್ಲಿರುವ "?" ಚಿಹ್ನೆಯನ್ನು ಕ್ಲಿಕ್ ಮಾಡುವ ಮೂಲಕ ಯಾವಾಗ ಬೇಕಾದರೂ ನೀವು ಸಹಾಯವನ್ನು ಪಡೆದುಕೊಳ್ಳಬಹುದು.</translation> <translation id="4065876735068446555">ನೀವು ಬಳಸುತ್ತಿರುವ ನೆಟ್ವರ್ಕ್ (<ph name="NETWORK_ID" />) ನ ಲಾಗಿನ್ ಪುಟಕ್ಕೆ ಭೇಟಿ ನೀಡಬೇಕಾದ ಅಗತ್ಯವಿದೆ.</translation> <translation id="4068506536726151626">ಈ ಪುಟವು ನಿಮ್ಮ ಸ್ಥಾನದ ನಿಗಾ ಇರಿಸುತ್ತಿರುವ ಈ ಕೆಳಗಿನ ಸೈಟ್ಗಳ ಮೂಲಾಂಶಗಳನ್ನು ಒಳಗೊಂಡಿದೆ:</translation> @@ -2390,7 +2388,6 @@ <translation id="4101878899871018532">ಸಿಂಕ್ ಮಾಡಲು ಬಳಸಲಾದ ರುಜುವಾತನ್ನು ಉಳಿಸುವ ಅವಕಾಶವನ್ನು ಪಾಸ್ವರ್ಡ್ ನಿರ್ವಾಹಕ ನೀಡುವುದಿಲ್ಲ.</translation> <translation id="410351446219883937">ಆಟೋಪ್ಲೇ</translation> <translation id="4104163789986725820">ರ&ಫ್ತು...</translation> -<translation id="4105523032910086267">ವಸ್ತು ವಿನ್ಯಾಸದಲ್ಲಿ ಭದ್ರತೆ ವರ್ಬೋಸ್ನ ಅನಿಮೇಶನ್ ಮತ್ತು ಗೋಚರತೆಯನ್ನು ಹೊಂದಿಸುತ್ತದೆ.</translation> <translation id="4105563239298244027">Google ಡ್ರೈವ್ನೊಂದಿಗೆ 1 TB ಉಚಿತ ಪಡೆಯಿರಿ</translation> <translation id="4109135793348361820">ವಿಂಡೋವನ್ನು <ph name="USER_NAME" /> (<ph name="USER_EMAIL" />) ಗೆ ಸರಿಸಿ</translation> <translation id="4110342520124362335"><ph name="DOMAIN" /> ನ ಕುಕೀಸ್ ಅನ್ನು ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ.</translation> @@ -2441,6 +2438,7 @@ <translation id="418179967336296930">ರಷ್ಯನ್ ಫೋನೆಟಿಕ್ (YaZHert) ಕೀಬೋರ್ಡ್</translation> <translation id="4181841719683918333">ಭಾಷೆಗಳು</translation> <translation id="4187248015940562149">ವೆಬ್ ಬ್ಲೂಟೂತ್ ಸಕ್ರಿಯಗೊಳಿಸುತ್ತದೆ, ಇದು ನಿಮ್ಮ ಸುತ್ತಲಿನ ಬ್ಲೂಟೂತ್ಗೆ ಸಂಪರ್ಕಗೊಳ್ಳಲು ಮತ್ತು ಅವುಗಳನ್ನು ನಿಯಂತ್ರಿಸಲು ವೆಬ್ಸೈಟ್ಗಳಿಗೆ ಅನುಮತಿಸಬಹುದು.</translation> +<translation id="4188447344915957833">ವಸ್ತು ವಿನ್ಯಾಸ ಸೆಟ್ಟಿಂಗ್ಗಳಲ್ಲಿ ಸಂಗ್ರಹಣೆಯ ನಿರ್ವಾಹಕವನ್ನು ಸಕ್ರಿಯಗೊಳಿಸುತ್ತದೆ.</translation> <translation id="4189406272289638749"><b><ph name="EXTENSION_NAME" /></b> ವಿಸ್ತರಣೆಯೊಂದು ಈ ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ನಿಯಂತ್ರಿಸುತ್ತಿದೆ.</translation> <translation id="4193154014135846272">Google ಡಾಕ್ಯುಮೆಂಟ್</translation> <translation id="4193182321948161343">ವಸ್ತು ವಿನ್ಯಾಸ ಬಳಕೆದಾರ ಮ್ಯಾನೇಜರ್ ಸಕ್ರಿಯಗೊಳಿಸಿ</translation> @@ -2648,6 +2646,7 @@ <translation id="4508765956121923607">ಮೂ&ಲವನ್ನು ವೀಕ್ಷಿಸಿ</translation> <translation id="4509017836361568632">ಫೋಟೊವನ್ನು ತ್ಯಜಿಸಿ</translation> <translation id="4509345063551561634">ಸ್ಥಳ:</translation> +<translation id="4513946894732546136">ಪ್ರತಿಕ್ರಿಯೆ</translation> <translation id="4514542542275172126">ಹೊಸ ಮೇಲ್ಚಿಚಾರಣೆ ಬಳಕೆದಾರರನ್ನು ಹೊಂದಿಸಿ</translation> <translation id="4514914692061505365">ಎಲ್ಲಾ pexe ಫೈಲ್ಗಳಿಗೆ PNaCl ನ ಫಾಸ್ಟ್ ಸಬ್ಜೀರೋ ಅನುವಾದಕದ ಬಳಕೆಗೆ ಬಲವಂತಗೊಳಿಸಿ.</translation> <translation id="451515744433878153">ತೆಗೆದುಹಾಕು</translation> @@ -2746,6 +2745,7 @@ <translation id="4656293982926141856">ಈ ಕಂಪ್ಯೂಟರ್</translation> <translation id="4656631038341342120">ಈ ಸಾಧನಕ್ಕೆ ಲಭ್ಯವಿದ್ದರೆ VR ಶೆಲ್ ಸಕ್ರಿಯಗೊಳಿಸಿ.</translation> <translation id="4657031070957997341"><ph name="HOST" /> ನಲ್ಲಿ ಪ್ಲಗ್ ಇನ್ಗಳನ್ನು ಯಾವಾಗಲೂ ಅನುಮತಿಸಿ</translation> +<translation id="466008749075469935">ಹಿನ್ನೆಲೆ ಟೈಮರ್ಗಳ CPU ಬಳಕೆಯನ್ನು 1% ಗೆ ಮಿತಿಗೊಳಿಸಲು ಮಧ್ಯಸ್ಥಿಕೆ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸುತ್ತದೆ.</translation> <translation id="4663254525753315077">ಸಾಧ್ಯವಿದ್ದಾಗ, ವೇಗವಾಗಿ ಸ್ಕ್ರೋಲ್ ಮಾಡುವುದಕ್ಕಾಗಿ ಅತ್ಯಧಿಕ ಸ್ಕ್ರೋಲ್ ಮಾಡುವ ಅಂಶದ ಸ್ಕ್ರೋಲ್ ವಿಷಯಗಳನ್ನು ಸಂಯೋಜಿಸಲಾದ ಲೇಯರ್ನಲ್ಲಿ ಇರಿಸುತ್ತದೆ.</translation> <translation id="4664482161435122549">PKCS #12 ರಫ್ತು ದೋಷ</translation> <translation id="4665014895760275686">ತಯಾರಕರು</translation> @@ -2815,6 +2815,7 @@ <translation id="4749157430980974800">ಜಾರ್ಜಿಯನ್ ಕೀಬೋರ್ಡ್</translation> <translation id="4750394297954878236">ಸಲಹೆಗಳು</translation> <translation id="475088594373173692">ಮೊದಲ ಬಳಕೆದಾರ</translation> +<translation id="4750892496809949692">ಪ್ಲಗ್ಇನ್ಗಳಲ್ಲಿನ ಪಟ್ಟಿಯಿಂದ ಫ್ಲ್ಯಾಶ್ ಮರೆಮಾಡುವ ಮೂಲಕ HTML ವಿಷಯಕ್ಕೆ ಆದ್ಯತೆ ನೀಡಿ.</translation> <translation id="4750917950439032686">ಈ ಸೈಟ್ಗೆ ನಿಮ್ಮ ಮಾಹಿತಿಯನ್ನು ಕಳುಹಿಸಿದಾಗ ಅದು (ಉದಾಹರಣೆಗೆ, ಪಾಸ್ವರ್ಡ್ಗಳು ಅಥವಾ ಕ್ರೆಡಿಟ್ ಕಾರ್ಡ್ ಸಂಖ್ಯೆಗಳು) ಖಾಸಗಿಯಾಗಿರುತ್ತದೆ.</translation> <translation id="4753602155423695878">Android ಫೋನ್ ಪುಟ ಪ್ರಗತಿ ಬಾರ್ ಆನಿಮೇಶನ್ ಲೋಡ್ ಮಾಡುತ್ತಿದೆ</translation> <translation id="4755240240651974342">ಫಿನ್ನೀಶ್ ಕೀಬೋರ್ಡ್</translation> @@ -3089,6 +3090,7 @@ <translation id="5119450342834678097">ಸೆಟ್ಟಿಂಗ್ಗಳ ಮೆನುವಿನಲ್ಲಿ ಟ್ಯಾಬ್ಲೆಟ್ ಸೈಟ್ ಆಯ್ಕೆಗೆ ವಿನಂತಿಸಿ</translation> <translation id="5120068803556741301">ಮೂರನೇ ವ್ಯಕ್ತಿಯ ಇನ್ಪುಟ್ ವಿಧಾನ</translation> <translation id="5120421890733714118">ವೆಬ್ಸೈಟ್ಗಳನ್ನು ಗುರುತಿಸುವುದಕ್ಕಾಗಿ ಈ ಪ್ರಮಾಣಪತ್ರವನ್ನು ನಂಬಿರಿ.</translation> +<translation id="5120516977819314347">ಪಿನ್ ಅಥವಾ ಪಾಸ್ವರ್ಡ್ ತಪ್ಪಾಗಿದೆ.</translation> <translation id="5121130586824819730">ನಿಮ್ಮ ಹಾರ್ಡ್ ಡಿಸ್ಕ್ ಭರ್ತಿಯಾಗಿದೆ. ದಯವಿಟ್ಟು ಬೇರೊಂದು ಸ್ಥಳದಲ್ಲಿ ಉಳಿಸಿ ಇಲ್ಲವೇ ಹಾರ್ಡ್ ಡಿಸ್ಕ್ನಲ್ಲಿ ಹೆಚ್ಚಿನ ಅವಕಾಶ ಕಲ್ಪಿಸಿ.</translation> <translation id="5125751979347152379">ಅಮಾನ್ಯವಾದ URL.</translation> <translation id="5127881134400491887">ನೆಟ್ವರ್ಕ್ ಸಂಪರ್ಕಗಳನ್ನು ನಿರ್ವಹಿಸಿ</translation> @@ -3096,6 +3098,7 @@ <translation id="512903556749061217">ಲಗತ್ತಿಸಲಾಗಿದೆ</translation> <translation id="5129301143853688736">ಈ ಸೈಟ್ಗೆ ನಿಮ್ಮ ಸಂಪರ್ಕವು ಖಾಸಗಿಯಾಗಿಲ್ಲ. <ph name="DOMAIN" /> ನಿಂದ ದಾಳಿಕೋರರು ನಿಮ್ಮ ಮಾಹಿತಿಯನ್ನು ಕಳವು ಮಾಡಲು ಪ್ರಯತ್ನಿಸುತ್ತಿರಬಹುದು (ಉದಾಹರಣೆಗೆ ಫೋಟೋಗಳು, ಪಾಸ್ವರ್ಡ್ಗಳು, ಸಂದೇಶಗಳು ಮತ್ತು ಕ್ರೆಡಿಟ್ ಕಾರ್ಡ್ಗಳು).</translation> <translation id="5129662217315786329">ಪೋಲಿಶ್</translation> +<translation id="5131347545782851480">PDF ಡಾಕ್ಯುಮೆಂಟ್ಗಳು</translation> <translation id="5134856901811723984">Chrome OS ಸಿಸ್ಟಂ UI ನಲ್ಲಿ ವಸ್ತು ವಿನ್ಯಾಸ</translation> <translation id="5135533361271311778">ಬುಕ್ಮಾರ್ಕ್ ಐಟಂ ಅನ್ನು ರಚಿಸಲು ಆಗುವುದಿಲ್ಲ.</translation> <translation id="5136529877787728692">F7</translation> @@ -3269,6 +3272,7 @@ <translation id="5328031682234198929">8</translation> <translation id="5329858601952122676">&ಅಳಿಸು</translation> <translation id="5330145655348521461">ಈ ಫೈಲ್ಗಳನ್ನು ವಿವಿಧ ಡೆಸ್ಕ್ಟಾಪ್ಗಳಲ್ಲಿ ತೆರೆಯಲಾಗಿದೆ. ಅದನ್ನು ವೀಕ್ಷಿಸಲು <ph name="USER_NAME" /> (<ph name="MAIL_ADDRESS" />) ಗೆ ಸರಿಸಿ.</translation> +<translation id="5330512191124428349">ಮಾಹಿತಿ ಪಡೆಯಿರಿ</translation> <translation id="5332624210073556029">ಸಮಯ ವಲಯ:</translation> <translation id="5333807720589685258">ನೀವು ಸರಿಯಾದ ಪಿನ್ ಅನ್ಲಾಕ್ ಕೀಯನ್ನು ನಮೂದಿಸದಿದ್ದಲ್ಲಿ ನಿಮ್ಮ ಸಿಮ್ ಕಾರ್ಡ್ ಅನ್ನು ಶಾಶ್ವತವಾಗಿ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗುತ್ತದೆ.</translation> @@ -3441,7 +3445,7 @@ <translation id="5543983818738093899">ಸ್ಥಿತಿಯನ್ನು ಪರಿಶೀಲಿಸಲಾಗುತ್ತಿದೆ...</translation> <translation id="5544363333869861395">V8 ಪಾರ್ಸರ್ ಡೇಟಾ ಸಂಗ್ರಹಿಸಿ.</translation> <translation id="5546477470896554111">ಪವರ್ ಮೂಲವನ್ನು ನಿರ್ವಹಿಸಿ...</translation> -<translation id="5546865291508181392">ಹುಡುಕು</translation> +<translation id="5546865291508181392">ಹುಡುಕಿ</translation> <translation id="5548207786079516019">ಇದು <ph name="PRODUCT_NAME" /> ರ ದ್ವಿತೀಯ ಸ್ಥಾಪನೆ ಆಗಿದೆ, ಮತ್ತು ನಿಮ್ಮ ಡಿಫಾಲ್ಟ್ ಬ್ರೌಸರ್ ಆಗಿ ಮಾಡಲಾಗುವುದಿಲ್ಲ.</translation> <translation id="5552766427357412199">ಟ್ರೂ (ಅನಿರ್ದಿಷ್ಟವಿರುವಾಗ)</translation> <translation id="5553089923092577885">ಪ್ರಮಾಣಪತ್ರ ನೀತಿ ಮ್ಯಾಪಿಂಗ್ಗಳು</translation> @@ -3702,7 +3706,6 @@ <translation id="5892507820957994680">ಆಂತರಿಕ ಸಾಫ್ಟ್ವೇರ್ ಸಲ್ಲಿಸುವಿಕೆ ಪಟ್ಟಿಯನ್ನು ಅತಿಕ್ರಮಿಸುತ್ತದೆ ಮತ್ತು ಬೆಂಬಲಿಸದೆ ಇರುವ ಸಿಸ್ಟಂ ಕಾನ್ಫಿಗರೇಶನ್ಗಳಲ್ಲಿ GPU-ವೇಗವರ್ಧನೆಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸುತ್ತದೆ.</translation> <translation id="5895138241574237353">ಮರುಪ್ರಾರಂಭಿಸಿ</translation> <translation id="5895187275912066135">ರಂದು ನೀಡಲಾಗಿದೆ</translation> -<translation id="5898154795085152510">ಅಮಾನ್ಯ ಕ್ಲೈಂಟ್ ಪ್ರಮಾಣಪತ್ರವೊಂದನ್ನು ಸರ್ವರ್ ಹಿಂತಿರುಗಿಸಿದೆ. ದೋಷ <ph name="ERROR_NUMBER" /><ph name="ERROR_NAME" />.</translation> <translation id="5900302528761731119">Google ಪ್ರೊಫೈಲ್ ಫೋಟೋ</translation> <translation id="590253956165195626">ನನ್ನ ಭಾಷೆಯಲ್ಲಿಲ್ಲದ ಪುಟಗಳನ್ನು ಅನುವಾದ ಮಾಡುವ ಆಫರ್ ನೀಡು.</translation> <translation id="5904093760909470684">ಪ್ರಾಕ್ಸಿ ಕಾನ್ಫಿಗರೇಶನ್</translation> @@ -3757,6 +3760,7 @@ <translation id="5984222099446776634">ಇತ್ತೀಚೆಗೆ ಭೇಟಿ ನೀಡಿದವು</translation> <translation id="5984814259619230127">Smart Lock Bluetooth ಕಡಿಮೆ ಶಕ್ತಿ ಅನ್ವೇಷಣೆ</translation> <translation id="5986245990306121338">ಸಕ್ರಿಯಗೊಳಿಸಿದರೆ, ಸೆಟ್ಟಿಂಗ್ಗಳಲ್ಲಿ 'ಟ್ಯಾಬ್ಗಳು ಮತ್ತು ಅಪ್ಲಿಕೇಶನ್ಗಳನ್ನು ವಿಲೀನಗೊಳಿಸು' ಆಯ್ಕೆ ಇದ್ದರೂ ಟ್ಯಾಬ್ ಸ್ವಿಚ್ಚರ್ ತೋರಿಸಲಾಗುತ್ತದೆ.</translation> +<translation id="5989712527536636369"><ph name="BEGIN_PARAGRAPH1" />ಇದು ಈ ಸಾಧನದ ಬಗ್ಗೆ ಮತ್ತು ಅದನ್ನು ನೀವು ಹೇಗೆ ಬಳಸುತ್ತೀರಿ ಎಂಬುದರ ಕುರಿತು ಸಾಮಾನ್ಯ ಮಾಹಿತಿಯಾಗಿದೆ, ಅಂದರೆ ಬ್ಯಾಟರಿ ಮಟ್ಟ, ನಿಮ್ಮ ಅಪ್ಲಿಕೇಶನ್ಗಳನ್ನು ಎಷ್ಟು ಬಾರಿ ಬಳಸಲಾಗುತ್ತದೆ, ನೆಟ್ವರ್ಕ್ ಸಂಪರ್ಕಗಳ ಗುಣಮಟ್ಟ ಮತ್ತು ಅವಧಿ (ವೈ-ಫೈ ಮತ್ತು ಬ್ಲೂಟೂತ್ನಂತಹ) ಮತ್ತು ಕೆಲಸ ಮಾಡುವ ರೀತಿಯಲ್ಲಿ ಮಾಡದೆ ಇರುವಾಗ ಕ್ರ್ಯಾಶ್ ವರದಿಗಳಂತಹ ಮಾಹಿತಿ ಹೊಂದಿರುತ್ತದೆ. ಇದನ್ನು ಎಲ್ಲರಿಗೂ Google ನ ಉತ್ಪನ್ನಗಳು ಮತ್ತು ಸೇವೆಗಳನ್ನು ಸುಧಾರಿಸಲು ಬಳಸಲಾಗುತ್ತದೆ. ಕೆಲವು ಒಟ್ಟು ಮೊತ್ತದ ಮಾಹಿತಿಯು Android ಡೆವಲಪರ್ಗಳಂತಹ ಪಾಲುದಾರರಿಗೆ, ತಮ್ಮ ಅಪ್ಲಿಕೇಶನ್ಗಳು ಮತ್ತು ಉತ್ಪನ್ನಗಳು ಉತ್ತಮವಾಗಿ ಕಾರ್ಯನಿರ್ವಹಿಸುವಂತೆ ಕೂಡಾ ಸಹಾಯ ಮಾಡುತ್ತದೆ.<ph name="END_PARAGRAPH1" /><ph name="BEGIN_PARAGRAPH2" />ನೀವು ಇದನ್ನು ಯಾವ ಸಮಯದಲ್ಲಾದರೂ Android ಅಪ್ಲಿಕೇಶನ್ ಸೆಟ್ಟಿಂಗ್ಗಳಲ್ಲಿ ಆನ್ ಅಥವಾ ಆಫ್ ಮಾಡಬಹುದು. ಸಿಸ್ಟಂ ನವೀಕರಣಗಳು ಮತ್ತು ಭದ್ರತೆಯಂತಹ ಅಗತ್ಯ ಸೇವೆಗಳನ್ನು ಸ್ವೀಕರಿಸಲು ಅಗತ್ಯವಿರುವ ಮಾಹಿತಿ ಕಳುಹಿಸಲು ಇದು ಈ ಸಾಧನದ ಸಾಮರ್ಥ್ಯಕ್ಕೆ ಯಾವುದೇ ಪರಿಣಾಮ ಬೀರುವುದಿಲ್ಲ.<ph name="END_PARAGRAPH2" /></translation> <translation id="5990198433782424697">chrome:// URLಗಳಲ್ಲಿನ ವಿಸ್ತರಣೆಗಳು</translation> <translation id="5990814808592353318">ಹಸ್ತಚಾಲಿತ ಪಾಸ್ವರ್ಡ್ ರಚನೆ.</translation> <translation id="5991049340509704927">ವರ್ಧಿಸು</translation> @@ -3770,6 +3774,7 @@ <translation id="6005695835120147974">ಮಾಧ್ಯಮ ರೂಟರ್</translation> <translation id="6007237601604674381">ಸರಿಸುವುದು ವಿಫಲವಾಗಿದೆ. <ph name="ERROR_MESSAGE" /></translation> <translation id="6008241731410823808">ಹೈಪರ್ಲಿಂಕ್ ಆಡಿಟಿಂಗ್ ಪಿಂಗ್ಗಳನ್ನು ಕಳುಹಿಸುತ್ತದೆ.</translation> +<translation id="6011449291337289699">ಸೈಟ್ ಡೇಟಾವನ್ನು ತೆರವುಗೊಳಿಸಿ</translation> <translation id="6015796118275082299">ವರ್ಷ</translation> <translation id="6016551720757758985">ಹಿಂದಿನ ಆವೃತ್ತಿಗೆ ಹಿಂತಿರುಗುವ ಮೂಲಕ ಪವರ್ವಾಶ್ ಅನ್ನು ದೃಢೀಕರಿಸಿ</translation> <translation id="6016809788585079594">ಕೊನೆಯ ಬಾರಿ ಒಮ್ಮೆ "Ok Google" ಎಂದು ಹೇಳಿ</translation> @@ -3959,7 +3964,6 @@ <translation id="6276301056778294989">ಸಾಧನವು ಅದೇ ಕೋಡ್ ತೋರಿಸುತ್ತಿದೆಯೇ ಎಂಬುದನ್ನು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಿ.</translation> <translation id="6277105963844135994">ನೆಟ್ವರ್ಕ್ ಅವಧಿ ಮುಗಿದಿದೆ</translation> <translation id="6277518330158259200">ಸ್ಕ್ರೀ&ನ್ಶಾಟ್ ತೆಗೆದುಕೊಳ್ಳಿ</translation> -<translation id="6278428485366576908">ಥೀಮ್</translation> <translation id="6279183038361895380">ನಿಮ್ಮ ಕರ್ಸರ್ ತೋರಿಸಲು |<ph name="ACCELERATOR" />| ಒತ್ತಿ</translation> <translation id="6280215091796946657">ಬೇರೆ ಖಾತೆಯೊಂದಿಗೆ ಸೈನ್ ಇನ್ ಮಾಡಿ</translation> <translation id="6280912520669706465">ARC</translation> @@ -4210,6 +4214,7 @@ <translation id="6607272825297743757">ಫೈಲ್ ಮಾಹಿತಿ</translation> <translation id="6607831829715835317">ಹೆಚ್ಚಿನ ಪರಿ&ಕರಗಳು</translation> <translation id="6608140561353073361">ಎಲ್ಲ ಕುಕೀಗಳು ಮತ್ತು ಸೈಟ್ ಡೇಟಾ...</translation> +<translation id="6610183966322615106">ಪ್ರಿಂಟರ್ ಸೇರಿಸುವಲ್ಲಿ ದೋಷ</translation> <translation id="6610610633807698299">URL ನಮೂದಿಸಿ...</translation> <translation id="6612358246767739896">ಸಂರಕ್ಷಿಸಿದ ವಿಷಯ</translation> <translation id="6615455863669487791">ನನಗೆ ತೋರಿಸಿ</translation> @@ -4273,7 +4278,6 @@ <translation id="6708242697268981054">ಮೂಲ:</translation> <translation id="6709357832553498500"><ph name="EXTENSIONNAME" /> ಬಳಸುವ ಮೂಲಕ ಸಂಪರ್ಕಪಡಿಸು</translation> <translation id="6710213216561001401">ಹಿಂದೆ</translation> -<translation id="6712158998835983046">ಅನಿಮೇಟ್ ಮಾಡಿದ ಎಲ್ಲಾ ತೋರಿಸು</translation> <translation id="6718273304615422081">ಜಿಪ್ ಮಾಡಲಾಗುತ್ತಿದೆ...</translation> <translation id="671928215901716392">ಪರದೆಯನ್ನು ಲಾಕ್ ಮಾಡಿ</translation> <translation id="6721972322305477112">&ಫೈಲ್</translation> @@ -4547,7 +4551,6 @@ <translation id="7088434364990739311">ಅಪ್ಡೇಟ್ ಪರಿಶೀಲನೆಯು ಪ್ರಾರಂಭಿಸಲು ವಿಫಲವಾಗಿದೆ (ದೋಷ ಕೋಡ್ <ph name="ERROR" />).</translation> <translation id="708856090370082727">OSK ಓವರ್ಸ್ಕ್ರಾಲ್ ಬೆಂಬಲವನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ. ಈ ಫ್ಲ್ಯಾಗ್ ಆನ್ ಮಾಡುವ ಮೂಲಕ, ದೃಶ್ಯ ವೀವ್ಪೋರ್ಟ್ ಅನ್ನು ಮಾತ್ರ OSK ಮರುಗಾತ್ರಗೊಳಿಸುತ್ತದೆ.</translation> <translation id="7088674813905715446">ನಿರ್ವಾಹಕರಿಂದ ಈ ಸಾಧನವನ್ನು ಆದ್ಯತೆ ಇಲ್ಲದ ಸ್ಥಿತಿಯಲ್ಲಿ ಇರಿಸಲಾಗಿದೆ. ನೋಂದಣಿಗಾಗಿ ಸಕ್ರಿಯಗೊಳಿಸಲು, ಸಾಧನವನ್ನು ನಿಮ್ಮ ನಿರ್ವಾಹಕರು ಬಾಕಿ ಸ್ಥಿತಿಯಲ್ಲಿರಿಸುವಂತೆ ತಿಳಿಸಿ.</translation> -<translation id="7089609847854449639">ಸಂಗ್ರಹಣೆಯ ನಿರ್ವಾಹಕ</translation> <translation id="708969677220991657">ಅಮಾನ್ಯವಾದ ಪ್ರಮಾಣಪತ್ರವನ್ನು ಒದಗಿಸಿದಾಗಲೂ HTTPS ನಲ್ಲಿ ಸ್ಥಳೀಯಹೋಸ್ಟ್ಗೆ ವಿನಂತಿಗಳನ್ನು ಅನುಮತಿಸುತ್ತದೆ.</translation> <translation id="7092106376816104">ಪಾಪ್-ಅಪ್ ವಿನಾಯಿತಿಗಳು</translation> <translation id="7093866338626856921">ಈ ಹೆಸರಿನ ಸಾಧನಗಳೊಂದಿಗೆ ಡೇಟಾ ವಿನಿಮಯ ಮಾಡಿ: <ph name="HOSTNAMES" /></translation> @@ -4587,7 +4590,7 @@ <translation id="715118844758971915">ಕ್ಲಾಸಿಕ್ ಮುದ್ರಕಗಳು</translation> <translation id="7154130902455071009">ನಿಮ್ಮ ಪ್ರಾರಂಭ ಪುಟವನ್ನು ಇದಕ್ಕೆ ಬದಲಾಯಿಸಿ: <ph name="START_PAGE" /></translation> <translation id="7155171745945906037">ಕ್ಯಾಮರಾ ಅಥವಾ ಫೈಲ್ನಿಂದ ಪ್ರಸ್ತುತ ಫೋಟೋ</translation> -<translation id="715568033737470079">Win32k ಲಾಕ್ಡೌನ್ ಸ್ಯಾಂಡ್ಬಾಕ್ಸ್ ನೀತಿಯಲ್ಲಿ ರನ್ ಮಾಡಲಾಗುವ PPAPI ಪ್ಲಗಿನ್ಗಳನ್ನು ನಿರ್ದಿಷ್ಟಪಡಿಸಿ (Windows 10 ಮತ್ತು ಮೇಲ್ಪಟ್ಟು ಮಾತ್ರ).</translation> +<translation id="7155226869555939647"><ph name="APPLICATION" /> ಗೆ ಯಾವಾಗಲೂ ಲಿಂಕ್ಗಳನ್ನು ತೆರೆ</translation> <translation id="7156235233373189579">Windows ಸಾಫ್ಟ್ವೇರ್ ಬಳಸಿಕೊಂಡು PC ಗಾಗಿ ಈ ಈ ಫೈಲ್ ಅನ್ನು ವಿನ್ಯಾಸಗೊಳಿಸಲಾಗಿದೆ. Chrome OS ಅನ್ನು ರನ್ ಮಾಡುವ ನಿಮ್ಮ ಸಾಧನದ ಜೊತೆಗೆ ಇದು ಹೊಂದಾಣಿಕೆಯಾಗುವುದಿಲ್ಲ. ದಯವಿಟ್ಟು ಸೂಕ್ತವಾದ ಬದಲಿ ಅಪ್ಲಿಕೇಶನ್ಗಾಗಿ <ph name="BEGIN_LINK" />Chrome ವೆಬ್ ಅಂಗಡಿಯಲ್ಲಿ<ph name="END_LINK" /> ಹುಡುಕಿ.<ph name="BEGIN_LINK_HELP" />ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ<ph name="END_LINK_HELP" /></translation> <translation id="7157063064925785854">ಮುಂದುವರಿಸು ಕ್ಲಿಕ್ ಮಾಡುವುದರ ಮೂಲಕ ನೀವು <ph name="LEGAL_DOC_LINK_TEXT_1" />, <ph name="LEGAL_DOC_LINK_TEXT_2" />, <ph name="LEGAL_DOC_LINK_TEXT_3" />, ಮತ್ತು <ph name="LEGAL_DOC_LINK_TEXT_4" /> ಗೆ ಸಮ್ಮತಿಸುತ್ತೀರಿ.</translation> <translation id="7158238151765743968">"<ph name="DEVICE_NAME" />" ಗೆ ಸಂಪರ್ಕವು ಇನ್ನೂ ಪ್ರಗತಿಯಲ್ಲಿದೆ.</translation> @@ -4602,6 +4605,7 @@ <translation id="7175353351958621980">ಇದರಿಂದ ಲೋಡ್ ಮಾಡಲಾಗಿದೆ:</translation> <translation id="7180611975245234373">ರೀಫ್ರೆಶ್ ಮಾಡಿ</translation> <translation id="7180865173735832675">ಕಸ್ಟಮೈಸ್</translation> +<translation id="7181387261278441780">ಸೈಟ್ ತೆರವುಗೊಳಿಸಿ ಮತ್ತು ಮರುಹೊಂದಿಸಿ</translation> <translation id="7185078796915954712">TLS 1.3</translation> <translation id="7185690883425432021">ಸ್ಟ್ಯಾಕ್ ಮಾಡಲಾದ ಮೋಡ್ನಲ್ಲಿ ಟ್ಯಾಬ್ಸ್ಟ್ರಿಪ್ ಇರುವಾಗ ನಿಷ್ಕ್ರಿಯ ಟ್ಯಾಬ್ಗಳ ಮುಚ್ಚುವ ಬಟನ್ಗಳನ್ನು ಮರೆಮಾಡುತ್ತದೆ.</translation> <translation id="7186088072322679094">ಪರಿಕರಪಟ್ಟಿಯಲ್ಲಿ ಇರಿಸು</translation> @@ -4634,7 +4638,6 @@ <translation id="7223775956298141902">ಬೂ...ನೀವು ಯಾವುದೇ ವಿಸ್ತರಣೆಗಳನ್ನು ಹೊಂದಿಲ್ಲ :-(</translation> <translation id="7224023051066864079">ಸಬ್ನೆಟ್ ಮಾಸ್ಕ್:</translation> <translation id="7225179976675429563">ನೆಟ್ವರ್ಕ್ ಪ್ರಕಾರ ಕಾಣೆಯಾಗಿದೆ</translation> -<translation id="7230191962699768124">ಅನಿಮೇಟ್ ಮಾಡದ ಎಲ್ಲಾ ತೋರಿಸು</translation> <translation id="7230787553283372882">ನಿಮ್ಮ ಪಠ್ಯ ಗಾತ್ರ ಗ್ರಾಹಕೀಯಗೊಳಿಸಿ</translation> <translation id="7231224339346098802">ಎಷ್ಟು ಪ್ರತಿಗಳನ್ನು ಮುದ್ರಿಸಬೇಕೆಂದು (1 ಅಥವಾ ಹೆಚ್ಚು) ಸೂಚಿಸಲು ಸಂಖ್ಯೆಯನ್ನು ಬಳಸಿ.</translation> <translation id="7238585580608191973">SHA-256 ಬೆರಳಚ್ಚು</translation> @@ -4766,7 +4769,6 @@ <translation id="7409233648990234464">ಮರುಪ್ರಾರಂಭಿಸಿ ಮತ್ತು ಪವರ್ವಾಶ್ ಮಾಡಿ</translation> <translation id="7409836189476010449">ಫ್ಲ್ಯಾಶ್ ರನ್ ಮಾಡು</translation> <translation id="7410344089573941623">ನಿಮ್ಮ ಕ್ಯಾಮರಾ ಹಾಗೂ ಮೈಕ್ರೋಫೋನ್ ಪ್ರವೇಶಿಸಲು <ph name="HOST" /> ಬಯಸುತ್ತಾರೆಯೇ ಎಂಬುದನ್ನು ಕೇಳಿ</translation> -<translation id="7411343637221933631">{NUM_COOKIES,plural, =1{ಈ ಸೈಟ್ನಿಂದ 1}one{ಈ ಸೈಟ್ನಿಂದ #}other{ಈ ಸೈಟ್ನಿಂದ #}}</translation> <translation id="7412226954991670867">GPU ಸ್ಮರಣೆ</translation> <translation id="7416362041876611053">ಅಪರಿಚಿತ ನೆಟ್ವರ್ಕ್ ದೋಷ.</translation> <translation id="7417453074306512035">ಇಥಿಯೋಪಿಕ್ ಕೀಬೋರ್ಡ್</translation> @@ -4888,6 +4890,7 @@ <translation id="756445078718366910">ಬ್ರೌಸರ್ ವಿಂಡೋವನ್ನು ತೆರೆಯಿರಿ</translation> <translation id="7564847347806291057">ಪ್ರಕ್ರಿಯೆ ಕೊನೆಗೊಳಿಸಿ</translation> <translation id="7566723889363720618">F12</translation> +<translation id="7567314848159753396">ಕುಕೀ: <ph name="NAME" /></translation> <translation id="756809126120519699">Chrome ಡೇಟಾ ತೆರವುಗೊಳಿಸಲಾಗಿದೆ</translation> <translation id="7568790562536448087">ನವೀಕರಿಸಲಾಗುತ್ತಿದೆ</translation> <translation id="7573172247376861652">ಬ್ಯಾಟರಿ ಚಾರ್ಜ್</translation> @@ -4928,6 +4931,7 @@ <translation id="7626009897377900107">ಪಾಸ್ವರ್ಡ್ ರಚನೆ</translation> <translation id="7627262197844840899">ಈ ಸೈಟ್ MasterCard ಅನ್ನು ಸ್ವೀಕರಿಸುವುದಿಲ್ಲ.</translation> <translation id="7627790789328695202">ಓಹ್, <ph name="FILE_NAME" /> ಈಗಾಗಲೇ ಅಸ್ತಿತ್ವದಲ್ಲಿದೆ. ಅದನ್ನು ಮರುಹೆಸರಿಸಿ ಹಾಗೂ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ.</translation> +<translation id="7628127343934101653">ಡಿಫಾಲ್ಟ್ PDF ವೀಕ್ಷಣೆಯ ಅಪ್ಲಿಕೇಶನ್ನಲ್ಲಿ PDF ಫೈಲ್ಗಳನ್ನು ತೆರೆಯಿರಿ.</translation> <translation id="762917759028004464">ಡಿಫಾಲ್ಟ್ ಬ್ರೌಸರ್ ಪ್ರಸ್ತುತ <ph name="BROWSER_NAME" /> ಆಗಿದೆ.</translation> <translation id="7629536005696009600">ಸೂಕ್ತವಾದ ವೆಬ್ಸೈಟ್ಗಳಲ್ಲಿ ಭರ್ತಿ ಮಾಡಲು Android ಅಪ್ಲಿಕೇಶನ್ಗಳಿಗೆ ಸಂಗ್ರಹಿಸಲಾದ ರುಜುವಾತುಗಳನ್ನು ಅನುಮತಿಸಿ.</translation> <translation id="7629827748548208700">ಟ್ಯಾಬ್: <ph name="TAB_NAME" /></translation> @@ -5156,6 +5160,7 @@ <translation id="7957513156576779045">ಜೋಡಣೆಯನ್ನು ಅನುಮತಿಸಲು ಬ್ಲೂಟೂತ್ ಆನ್ ಮಾಡಿ</translation> <translation id="7957615753207896812">ಕೀಬೋರ್ಡ್ ಸಾಧನ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ತೆರೆಯಿರಿ</translation> <translation id="7959074893852789871">ಫೈಲ್ ಬಹು ಪ್ರಮಾಣಪತ್ರಗಳನ್ನು ಒಳಗೊಂಡಿದೆ, ಕೆಲವೊಂದನ್ನು ಆಮದು ಮಾಡಲಾಗಿಲ್ಲ:</translation> +<translation id="7959700692661109221"><ph name="BEGIN_PARAGRAPH" />Google ನ ಸ್ಥಳ ಸೇವೆಯು ನಿಮ್ಮ ಸಾಧನದ ಸ್ಥಳವನ್ನು ವೇಗವಾಗಿ ಮತ್ತು ಹೆಚ್ಚು ನಿಖರವಾಗಿ ಅಂದಾಜು ಮಾಡಲು ಸಹಾಯಕವಾಗಿ ವೈ-ಫೈನಂತಹ ಮೂಲಗಳನ್ನು ಬಳಸುತ್ತದೆ. ನೀವು Google ನ ಸ್ಥಳ ಸೇವೆಯನ್ನು ಆನ್ ಮಾಡಿದಾಗ ನಿಮ್ಮ ಸಾಧನವು ವೈ-ಫೈ ಬಳಸಿ ಸ್ಥಳ ಮಾಹಿತಿಯನ್ನು ಒದಗಿಸುವ ಮೋಡ್ಗೆ ಪ್ರವೇಶಿಸುತ್ತದೆ. ನೀವು ಯಾವ ಸಮಯದಲ್ಲಾದರೂ ಸ್ಥಳ ಸೆಟ್ಟಿಂಗ್ಗಳಲ್ಲಿ ಇದನ್ನು ಆಫ್ ಮಾಡಬಹುದು.<ph name="END_PARAGRAPH" /></translation> <translation id="7961015016161918242">ಎಂದಿಗೂ ಇಲ್ಲ</translation> <translation id="7964089325405904043">ಪಾಸ್ವರ್ಡ್ ಆಮದು ಮತ್ತು ರಫ್ತು</translation> <translation id="7965010376480416255">ಹಂಚಿದ ಸ್ಮರಣೆ</translation> @@ -5303,6 +5308,7 @@ <translation id="8146793085009540321">ಸೈನ್-ಇನ್ ವಿಫಲವಾಗಿದೆ. ದಯವಿಟ್ಟು ನಿಮ್ಮ ನಿರ್ವಾಹಕರನ್ನು ಸಂಪರ್ಕಿಸಿ ಅಥವಾ ಮತ್ತೊಮ್ಮೆ ಪ್ರಯತ್ನಿಸಿ.</translation> <translation id="8148264977957212129">ಪಿನ್ಯಿನ್ ಇನ್ಪುಟ್ ವಿಧಾನ</translation> <translation id="8148913456785123871">ಲಾಂಚರ್ನಲ್ಲಿ Google Now ಕಾರ್ಡ್ಗಳನ್ನು ತೋರಿಸಿ</translation> +<translation id="8150391391298684512">Windows Runtime MIDI API ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ</translation> <translation id="8151185429379586178">ಡೆವಲಪರ್ ಪರಿಕರಗಳು</translation> <translation id="8151638057146502721">ಕಾನ್ಫಿಗರ್ ಮಾಡಿ</translation> <translation id="8151639108075998630">ಅತಿಥಿ ಬ್ರೌಸಿಂಗ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ</translation> @@ -5385,7 +5391,7 @@ <translation id="8256319818471787266">ಸ್ಪಾರ್ಕಿ</translation> <translation id="8257950718085972371">ಕ್ಯಾಮರಾ ಪ್ರವೇಶ ನಿರ್ಬಂಧಿಸುವುದನ್ನು ಮುಂದುವರಿಸಿ</translation> <translation id="8258405095852912294">ಈ ಸೈಟ್ ಅನ್ವೇಷಣೆಯನ್ನು ಸ್ವೀಕರಿಸುವುದಿಲ್ಲ.</translation> -<translation id="8259581864063078725">ಈ ಪ್ರಿಂಟರ್ ಅನ್ನು ಬಳಸಲು ಮುದ್ರಣ ಅಪ್ಲಿಕೇಶನ್ ಹುಡುಕು ಕ್ಲಿಕ್ ಮಾಡಿ.</translation> +<translation id="8259581864063078725">ಈ ಪ್ರಿಂಟರ್ ಅನ್ನು ಬಳಸಲು ಮುದ್ರಣ ಅಪ್ಲಿಕೇಶನ್ ಹುಡುಕಿ ಕ್ಲಿಕ್ ಮಾಡಿ.</translation> <translation id="8260864402787962391">ಮೌಸ್</translation> <translation id="8261378640211443080">ಈ ವಿಸ್ತರಣೆಯನ್ನು <ph name="IDS_EXTENSION_WEB_STORE_TITLE" /> ನಲ್ಲಿ ಪಟ್ಟಿ ಮಾಡಲಾಗಿಲ್ಲ ಮತ್ತು ಇದು ನಿಮಗೆ ಅರಿವಿಲ್ಲದಂತೆ ಸೇರಿಸಿರಬಹುದು.</translation> <translation id="8261387128019234107"><ph name="PROFILE_NAME" /> ಗಾಗಿ ಖಾತೆಯನ್ನು ಸೇರಿಸು</translation> @@ -5588,6 +5594,7 @@ <translation id="8532294913309524834">ನಿಮ್ಮ ಆದ್ಯತೆಯನ್ನು ಆಧರಿಸಿ ಭಾಷೆಗಳನ್ನು ಕ್ರಮಗೊಳಿಸಿ.</translation> <translation id="8535005006684281994">Netscape ಪ್ರಮಾಣಪತ್ರ ಅಪ್ಡೇಟ್ URL</translation> <translation id="8539727552378197395">ಇಲ್ಲ (Httpಮಾತ್ರ)</translation> +<translation id="8541084862688000575">Android ಅಪ್ಲಿಕೇಶನ್ಗಳನ್ನು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಲೋಡ್ ಮಾಡಿ</translation> <translation id="8543181531796978784">ನೀವು <ph name="BEGIN_ERROR_LINK" />ಪತ್ತೆ ಹಚ್ಚುವಿಕೆ ಸಮಸ್ಯೆಯನ್ನು ವರದಿ ಮಾಡಬಹುದು<ph name="END_ERROR_LINK" /> ಅಥವಾ ನಿಮ್ಮ ಭದ್ರತೆಯ ಅಪಾಯಗಳ ಕುರಿತು ನಿಮಗೆ ಅರ್ಥವಾಗಿದ್ದರೆ, <ph name="BEGIN_LINK" />ಈ ಅಸುರಕ್ಷಿತ ಸೈಟ್ಗೆ ಭೇಟಿ ನೀಡಿ<ph name="END_LINK" />.</translation> <translation id="8545107379349809705">ಮಾಹಿತಿ ಮರೆಮಾಡಿ...</translation> <translation id="8545211332741562162">ಪ್ರಾಯೋಗಿಕ JavaScript ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು ಬಳಸಲು ವೆಬ್ ಪುಟಗಳನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ.</translation> @@ -5615,7 +5622,6 @@ <translation id="8569764466147087991">ತೆರೆಯಲು ಫೈಲ್ವೊಂದನ್ನು ಆಯ್ಕೆ ಮಾಡಿ</translation> <translation id="8571032220281885258">ನೀವು "ಸರಿ Google" ಎಂದು ಹೇಳಿದಾಗ, ನೀವು ನಂತರ ಹೇಳಬಹುದಾದ್ದನ್ನು Chrome ಹುಡುಕುತ್ತದೆ.</translation> <translation id="8571108619753148184">ಸರ್ವರ್ 4</translation> -<translation id="8572832761467613633">ಫ್ಲ್ಯಾಶ್ ಮಾತ್ರ</translation> <translation id="8572981282494768930">ನಿಮ್ಮ ಕ್ಯಾಮರಾ ಮತ್ತು ಮೈಕ್ರೋಫೋನ್ ಪ್ರವೇಶಿಸಲು ಸೈಟ್ಗಳನ್ನು ಅನುಮತಿಸಬೇಡಿ</translation> <translation id="8574234089711453001">ಮಾಧ್ಯಮ url ಜೊತೆಗೆ ಪುಟ ತೆರೆಯುವಾಗ ಡೌನ್ಲೋಡ್ ಬಟನ್ ಕಾಣಿಸಿಕೊಳ್ಳಲು ಅನುಮತಿಸಿ.</translation> <translation id="857779305329188634">ಪ್ರಾಯೋಗಿಕ QUIC ಪ್ರೋಟೋಕಾಲ್ ಬೆಂಬಲವನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ.</translation> @@ -5637,6 +5643,7 @@ <translation id="8600929685092827187">ಪ್ಯಾಕೆಟ್ಗಳ ಮೂಲಕ ಎಚ್ಚರಿಸಿ</translation> <translation id="8601206103050338563">TLS WWW ಗ್ರಾಹಕ ಅಪ್ಲಿಕೇಶನ್</translation> <translation id="8602851771975208551">ನಿಮ್ಮ ಕಂಪ್ಯೂಟರ್ನಲ್ಲಿನ ಮತ್ತೊಂದು ಪ್ರೋಗ್ರಾಂ Chrome ಕಾರ್ಯನಿರ್ವಹಿಸುವ ವಿಧಾನವನ್ನು ಬದಲಿಸಬಹುದಾದಂತಹ ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ಸೇರಿಸಿದೆ.</translation> +<translation id="8603912787021349466">Android ಅಪ್ಲಿಕೇಶನ್ಗಳನ್ನು ಸೈನ್ ಇನ್ ಮಾಡಿದ ನಂತರ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಪ್ರಾರಂಭಿಸಲು ಅನುಮತಿಸಿ.</translation> <translation id="8605428685123651449">SQLite ಸ್ಮರಣೆ</translation> <translation id="8605503133013456784">"<ph name="DEVICE_NAME" />" ಜೊತೆಗಿನ ಸಂಪರ್ಕ ಕಡಿತ ಹಾಗೂ ಬೇರ್ಪಡಿಸುವಿಕೆ ವಿಫಲಗೊಂಡಿದೆ.</translation> <translation id="8606726445206553943">ನಿಮ್ಮ MIDI ಸಾಧನಗಳನ್ನು ಬಳಸಿ</translation> @@ -5989,6 +5996,7 @@ <translation id="9053965862400494292">ಸಿಂಕ್ ಅನ್ನು ರಚಿಸಲು ಪ್ರಯತ್ನಿಸುವಾಗ ದೋಷ ಸಂಭವಿಸಿದೆ.</translation> <translation id="9056034633062863292">Chromebox ನವೀಕರಿಸಲಾಗುತ್ತಿದೆ</translation> <translation id="9056810968620647706">ಯಾವುದೇ ಹೊಂದಾಣಿಕೆಗಳು ಕಂಡುಬಂದಿಲ್ಲ.</translation> +<translation id="9057119625587205566">ಸಮೀಪದಲ್ಲಿ ಯಾವುದೇ ಪ್ರಿಂಟರ್ಗಳಿಲ್ಲ</translation> <translation id="9059868303873565140">ಸ್ಥಿತಿ ಮೆನು</translation> <translation id="9064142312330104323">Google ಪ್ರೊಫೈಲ್ ಫೋಟೋ(ಲೋಡ್ ಆಗುತ್ತಿದೆ)</translation> <translation id="9064275926664971810">ಒಂದು ಕ್ಲಿಕ್ನೊಂದಿಗೆ ವೆಬ್ ಫಾರ್ಮ್ಗಳನ್ನು ತುಂಬಲು ಸ್ವಯಂ ತುಂಬುವಿಕೆಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ</translation> @@ -5999,6 +6007,7 @@ <translation id="9067401056540256169">ಈ ಫ್ಲ್ಯಾಗ್ Chrome ಅನ್ನು ಅಸುರಕ್ಷಿತಗೊಳಿಸುತ್ತದೆ. ಇದು ಏನು ಮಾಡುತ್ತದೆ ಎಂಬುದು ನಿಮಗೆ ಅರ್ಥವಾದರೆ ಮಾತ್ರ ಇದನ್ನು ಬಳಸಿ. ಯಾವುದೇ ಎಚ್ಚರಿಕೆ ಇಲ್ಲದೆ ಈ ಫ್ಲ್ಯಾಗ್ ಅನ್ನು ತೆಗೆದುಹಾಕಬಹುದು ಎಂಬುದು ನಿಮ್ಮ ಗಮನದಲ್ಲಿರಲಿ. ಸಕ್ರಿಯಗೊಳಿಸಿದರೆ, https ಮೂಲದ ಫ್ರೇಮ್ಗಳು ಅಸುರಕ್ಷಿತ URL (ws://) ಮೂಲಕ WebSocket ಗಳನ್ನು ಬಳಸಬಹುದು.</translation> <translation id="9068931793451030927">ಪಾಥ್:</translation> <translation id="9070219033670098627">ವ್ಯಕ್ತಿಯನ್ನು ಬದಲಾಯಿಸಿ</translation> +<translation id="9070940116164932228">ಥ್ರೊಟಲ್ ದುಬಾರಿ ವೆಚ್ಚದ ಹಿನ್ನೆಲೆ ಟೈಮರ್ಗಳು</translation> <translation id="907148966137935206">ಯಾವುದೇ ಸೈಟ್ ಪಾಪ್-ಅಪ್ಗಳನ್ನು ತೋರಿಸಲು ಅನುಮತಸಬೇಡ (ಶಿಫಾರಸು ಮಾಡಲಾಗಿದೆ)</translation> <translation id="9072550133391925347">ನೀವು ಉಳಿಸಲಾದ ಪಾಸ್ವರ್ಡ್ಗಳೊಂದಿಗೆ ಅರ್ಹರಾಗಿರುವ ಸೈಟ್ಗಳು ಮತ್ತು ಅಪ್ಲಿಕೇಶನ್ಗಳಿಗೆ <ph name="PASSWORD_MANAGER_BRAND" /> ನಿಮ್ಮನ್ನು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಸೈನ್ ಇನ್ ಮಾಡುತ್ತದೆ.</translation> <translation id="9073281213608662541">PAP</translation> @@ -6032,7 +6041,8 @@ <translation id="9111742992492686570">ವಿಷಮಸ್ಥಿತಿಯ ಭದ್ರತಾ ನವೀಕರಣವನ್ನು ಡೌನ್ಲೋಡ್ ಮಾಡಿ</translation> <translation id="9112614144067920641">ದಯವಿಟ್ಟು ಹೊಸ PIN ಅನ್ನು ಆಯ್ಕೆಮಾಡಿ.</translation> <translation id="9112748030372401671">ನಿಮ್ಮ ವಾಲ್ಪೇಪರ್ ಬದಲಿಸಿ</translation> -<translation id="9112987648460918699">ಹುಡುಕು...</translation> +<translation id="9112987648460918699">ಹುಡುಕಿ...</translation> +<translation id="9114663181201435112">ಸುಲಭವಾಗಿ ಸೈನ್ ಇನ್ ಮಾಡಿ</translation> <translation id="9115487443206954631">ಬಿತ್ತರಿಸುವಿಕೆ ಸಾಧನಗಳನ್ನು ನಿರ್ವಹಿಸಿ</translation> <translation id="9115675100829699941">&ಬುಕ್ಮಾರ್ಕ್ಗಳು</translation> <translation id="9121814364785106365">ಪಿನ್ ಮಾಡಿದ ಟ್ಯಾಬ್ ಆಗಿ ತೆರೆ</translation> @@ -6128,7 +6138,6 @@ <translation id="952992212772159698">ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿಲ್ಲ</translation> <translation id="960719561871045870">ಆಪರೇಟರ್ ಕೋಡ್</translation> <translation id="960987915827980018">ಸುಮಾರು 1 ಗಂಟೆ ಉಳಿದಿದೆ</translation> -<translation id="962778376131245616">ಅಸುರಕ್ಷಿತ, ಅನಿಮೇಟ್ ಮಾಡಿರುವುದನ್ನು ಮಾತ್ರ ತೋರಿಸು</translation> <translation id="96421021576709873">ವೈ-ಫೈ ನೆಟ್ವರ್ಕ್</translation> <translation id="965490406356730238">ಕ್ಯಾಪ್ಚರ್ ಮಾಡಲಾದ ಫ್ರೇಮ್ಗೆ ಲಭ್ಯವಿರುವಲ್ಲಿ ಹಾರ್ಡ್ವೇರ್-ವೇಗೋತ್ಕರ್ಷಿತ mjpeg ಡೀಕೋಡ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ.</translation> <translation id="968174221497644223">ಅಪ್ಲಿಕೇಶನ್ ಸಂಗ್ರಹ</translation>
diff --git a/chrome/app/resources/generated_resources_ko.xtb b/chrome/app/resources/generated_resources_ko.xtb index 0cd727f5..ba74cd71 100644 --- a/chrome/app/resources/generated_resources_ko.xtb +++ b/chrome/app/resources/generated_resources_ko.xtb
@@ -18,7 +18,6 @@ <translation id="1029317248976101138">확대</translation> <translation id="1029595648591494741">'<ph name="EXTENSION_NAME" />'을(를) 사용해 보시겠습니까?</translation> <translation id="1031362278801463162">미리보기 로드 중</translation> -<translation id="1031460590482534116">클라이언트 인증서를 저장하는 중에 오류가 발생했습니다. 오류 <ph name="ERROR_NUMBER" />(<ph name="ERROR_NAME" />).</translation> <translation id="1031573127485938293">정책에 의한 요청</translation> <translation id="103279545524624934">Android 앱을 실행하려면 디스크 저장 공간을 확보하세요.</translation> <translation id="1033780634303702874">직렬 기기에 액세스</translation> @@ -33,7 +32,7 @@ <translation id="1045157690796831147">음역(namaskar → നമസ്കാരം)</translation> <translation id="1046059554679513793">이미 사용 중인 이름입니다.</translation> <translation id="1047431265488717055">링크 텍스트 복사(&X)</translation> -<translation id="1047726139967079566">페이지 북마크...</translation> +<translation id="1047726139967079566">현재 페이지를 북마크에 추가...</translation> <translation id="1047956942837015229"><ph name="COUNT" />개 항목 삭제 중...</translation> <translation id="1048286738600630630">디스플레이</translation> <translation id="1048597748939794622">모든 레이어에 사용하도록 강제 설정합니다.</translation> @@ -101,6 +100,7 @@ <translation id="1128591060186966949">검색 엔진 수정</translation> <translation id="1128987120443782698">저장장치 용량이 <ph name="DEVICE_CAPACITY" />입니다. 용량이 4GB 이상인 SD 카드나 USB 메모리를 삽입하세요.</translation> <translation id="1137135726305341424">domContentLoaded 및 모든 리소스 로드는 domContentLoaded(메인 프레임 및 동일한 원래의 iframe) 전에 시작됩니다.</translation> +<translation id="1138663153846032155">플래시보다 HTML 선호</translation> <translation id="1140351953533677694">블루투스 및 직렬 기기에 액세스</translation> <translation id="114140604515785785">확장 프로그램 루트 디렉토리:</translation> <translation id="1143142264369994168">인증서 서명자</translation> @@ -252,6 +252,7 @@ <translation id="1351692861129622852">파일 <ph name="FILE_COUNT" />개를 가져오는 중...</translation> <translation id="1352103415082130575">태국어 키보드(Pattachote)</translation> <translation id="1353686479385938207"><ph name="PROVIDER_NAME" />: <ph name="NETWORK_NAME" /></translation> +<translation id="1353946958707294039">머티리얼 디자인 저장용량 관리자</translation> <translation id="1353966721814789986">시작 페이지</translation> <translation id="1354868058853714482">Adobe Reader가 오래되어 보안에 문제가 있을 수 있습니다.</translation> <translation id="1355408554203439639">3D 소프트웨어 래스터라이저</translation> @@ -424,7 +425,6 @@ <translation id="1533920822694388968">TV 정렬</translation> <translation id="15373452373711364">큰 마우스 커서</translation> <translation id="1543284117603151572">Edge에서 가져옴</translation> -<translation id="1544350195767834591">{NUM_COOKIES,plural, =1{다른 사이트의 쿠키 1개}other{다른 사이트의 쿠키 #개}}</translation> <translation id="1545177026077493356">자동 키오스크 모드</translation> <translation id="1545786162090505744">URL(검색어 자리에 % 입력)</translation> <translation id="1546280085599573572">홈 버튼을 클릭하면 표시되는 페이지가 이 확장 프로그램으로 인해 변경되었습니다.</translation> @@ -448,7 +448,6 @@ <translation id="1559235587769913376">유니코드 문자 입력</translation> <translation id="1561092721008294962">UI 텍스트용 HarfBuzz</translation> <translation id="1566049601598938765">웹사이트</translation> -<translation id="1566958206723629112">Flash 및 PDF</translation> <translation id="1567723158593978621">사용 설정하면 브라우저에 로그인할 때 새로운 비밀번호 분리형 GAIA 로그인 절차를 사용합니다.</translation> <translation id="1567993339577891801">자바스크립트 콘솔</translation> <translation id="1568323446248056064">디스플레이 기기 설정 열기</translation> @@ -577,7 +576,6 @@ <translation id="1723940674997333416">https 출처의 안전하지 않은 WebSocket 허용</translation> <translation id="1725149567830788547">컨트롤 표시(&C)</translation> <translation id="172612876728038702">TPM이 설정하는 중입니다. 몇 분 정도 소요될 수 있습니다.</translation> -<translation id="1727135806684246609">자료 보안 관련 상세 설명</translation> <translation id="1729533290416704613">또한 검색주소창에서 검색할 때 표시되는 페이지를 설정합니다.</translation> <translation id="1731346223650886555">세미콜론</translation> <translation id="1731589410171062430">합계: <ph name="NUMBER_OF_SHEETS" /><ph name="SHEETS_LABEL" />(<ph name="NUMBER_OF_PAGES" /><ph name="PAGE_OR_PAGES_LABEL" />)</translation> @@ -656,7 +654,7 @@ <translation id="1842969606798536927">결제하기</translation> <translation id="184456654378801210">(기본)</translation> <translation id="1844692022597038441">이 파일은 오프라인에서 사용할 수 없습니다.</translation> -<translation id="1846308012215045257"><ph name="PLUGIN_NAME" />을(를) 실행하려면 Control-클릭합니다.</translation> +<translation id="1846308012215045257"><ph name="PLUGIN_NAME" />을(를) 실행하려면 Control 키를 누르고 클릭합니다.</translation> <translation id="184633654410729720">태국어 키보드(Kedmanee)</translation> <translation id="1849186935225320012">이 페이지는 MIDI 기기를 완전히 제어할 수 있습니다.</translation> <translation id="1850508293116537636">시계 방향으로 회전(&C)</translation> @@ -874,6 +872,7 @@ <translation id="218492098606937156">터치 이벤트 사용</translation> <translation id="2187317261103489799">감지(기본값)</translation> <translation id="2187895286714876935">서버 인증서 가져오기 오류</translation> +<translation id="2188881192257509750"><ph name="APPLICATION" /> 열기</translation> <translation id="2190069059097339078">WiFi 사용자 인증 정보 Getter</translation> <translation id="219008588003277019">네이티브 클라이언트 모듈: <ph name="NEXE_NAME" /></translation> <translation id="2190355936436201913">(비어있음)</translation> @@ -992,6 +991,7 @@ <translation id="2326606747676847821">시크릿 탭 열기</translation> <translation id="2326931316514688470">앱 새로고침(&R)</translation> <translation id="2327492829706409234">앱 사용</translation> +<translation id="2328054044222305089"><ph name="SITE" />에서 기기에 저장한 모든 데이터가 삭제되며 실행을 위해 부여된 모든 권한이 재설정됩니다. 계속하시겠습니까?</translation> <translation id="2329597144923131178">로그인하면 모든 기기에서 북마크, 방문 기록, 비밀번호, 기타 설정을 사용할 수 있습니다.</translation> <translation id="2332131598580221120">스토어에서 보기</translation> <translation id="2332742915001411729">기본 설정으로 돌아가기</translation> @@ -1267,7 +1267,6 @@ <translation id="2675358154061544447">별도의 프로세스를 통해 교차 사이트 iframe 렌더링에 실험 단계의 지원을 제공합니다. 이 모드에서는 같은 웹사이트의 문서인 경우에만 렌더러 프로세스를 공유합니다.</translation> <translation id="2676946222714718093">재생 중:</translation> <translation id="2678063897982469759">다시 사용</translation> -<translation id="2678246812096664977">모든 플러그인</translation> <translation id="2679385451463308372">시스템 대화상자를 사용하여 인쇄...</translation> <translation id="2680208403056680091">인터넷 연결이 제어되고 있습니다.</translation> <translation id="268053382412112343">내역(&S)</translation> @@ -1441,7 +1440,6 @@ <translation id="287286579981869940"><ph name="PROVIDER_NAME" /> 추가...</translation> <translation id="2872961005593481000">종료</translation> <translation id="2875698561019555027">(Chrome 오류 페이지)</translation> -<translation id="2879560882721503072"><ph name="ISSUER" />에서 발행한 클라이언트 인증서를 성공적으로 저장했습니다.</translation> <translation id="288024221176729610">체코어</translation> <translation id="288042212351694283">Universal 2nd Factor 기기에 액세스</translation> <translation id="2881966438216424900">마지막 액세스 날짜:</translation> @@ -1590,6 +1588,7 @@ <translation id="3057861065630527966">사진 및 동영상을 백업합니다.</translation> <translation id="3058212636943679650">컴퓨터의 운영체제를 복구해야 하는 경우, 복구 SD 카드 또는 USB 메모리가 필요합니다.</translation> <translation id="305932878998873762">HTTP용 단순 캐시는 새로운 캐시이며 디스크 공간 할당에 파일 시스템을 사용합니다.</translation> +<translation id="3060251871394327123"><ph name="SITE" />에서 기기에 저장한 모든 데이터가 삭제됩니다. 계속하시겠습니까?</translation> <translation id="3061650404498811439">IME 선택 메뉴에서 그림 이모티콘, 손글씨, 음성 입력에 액세스할 수 있게 합니다.</translation> <translation id="3062606427884046423">Chrome 미디어 알림에 Android MediaStyle 알림을 사용합니다.</translation> <translation id="3063844757726132584">이 간편한 실행기를 사용하여 모든 앱에 액세스할 수 있습니다. 게임과 화상 채팅을 하고 음악을 들으며 문서를 수정하거나 다른 앱을 다운로드해 보세요.</translation> @@ -1639,6 +1638,7 @@ <translation id="3123569374670379335">(관리 대상)</translation> <translation id="3124111068741548686">사용자 핸들</translation> <translation id="3126026824346185272">Ctrl</translation> +<translation id="3127156390846601284">표시되는 모든 사이트와 관련하여 기기에 저장된 모든 데이터가 삭제됩니다. 계속하시겠습니까?</translation> <translation id="312759608736432009">기기 제조업체:</translation> <translation id="3127919023693423797">인증하는 중...</translation> <translation id="3128230619496333808">탭 6</translation> @@ -1737,7 +1737,6 @@ <translation id="3264544094376351444">Sans-serif</translation> <translation id="3264547943200567728">Chromebox 네트워크 설정 실패</translation> <translation id="3265459715026181080">창 닫기</translation> -<translation id="3267271790328635957">PDF만 해당</translation> <translation id="3267726687589094446">여러 파일을 자동으로 다운로드하도록 계속 허용</translation> <translation id="3267998849713137817">수정 시간</translation> <translation id="3268451620468152448">열린 탭</translation> @@ -1983,6 +1982,7 @@ <translation id="3574210789297084292">로그인</translation> <translation id="3574305903863751447"><ph name="COUNTRY" /> <ph name="STATE" />, <ph name="CITY" /></translation> <translation id="357479282490346887">리투아니아어</translation> +<translation id="3575927481544652747">Windows 10 이후 버전에서 기본적으로 사용하도록 설정되어 있는 WebMIDI용 Windows Runtime MIDI API를 사용 중지합니다.</translation> <translation id="3576324189521867626">설치되었습니다.</translation> <translation id="3578331450833904042">기본(모든 소리 감지)</translation> <translation id="3578594933904494462">이 탭의 콘텐츠를 공유 중입니다.</translation> @@ -2036,8 +2036,6 @@ <translation id="3627320433825461852">1분 미만 남음</translation> <translation id="3627588569887975815">시크릿 창에서 링크 열기(&G)</translation> <translation id="3627671146180677314">Netscape Certificate Renewal Time</translation> -<translation id="3629326610814700057">로컬 저장용량을 관리하는 저장용량 관리자를 사용합니다.</translation> -<translation id="3630337581925712713"><ph name="PERMISSION_TYPE_LABEL" />:</translation> <translation id="3631337165634322335">아래 예외는 현재 시크릿 세션에만 적용됩니다.</translation> <translation id="3633586230741134985">앱 실행기 설정</translation> <translation id="3633997706330212530">아래 서비스를 사용하지 않도록 설정할 수도 있습니다.</translation> @@ -2060,7 +2058,8 @@ <translation id="3654045516529121250">접근성 설정 확인</translation> <translation id="3654092442379740616">동기화 오류: <ph name="PRODUCT_NAME" />이(가) 오래되어 업데이트해야 합니다.</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{파일 1개에 영구적으로 액세스할 수 있습니다.}other{파일 #개에 영구적으로 액세스할 수 있습니다.}}</translation> -<translation id="3657468915905674858">PPAPI Win32k 잠금 사용</translation> +<translation id="365793796291733849"><ph name="BEGIN_PARAGRAPH1" />자동 백업을 사용하면 기기 및 앱 데이터가 Google 드라이브의 비공개 폴더에 주기적으로 저장됩니다. 앱 데이터는 개발자 설정에 따라 앱에서 저장한 모든 데이터를 가리키며 연락처, 메시지, 사진과 같이 잠재적으로 민감한 데이터를 포함할 수 있습니다.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />백업 데이터는 드라이브 저장용량 계산에 포함되지 않습니다. 대용량 파일이나 개발자가 서비스에서 제외하도록 선택한 파일은 백업되지 않습니다.<ph name="END_PARAGRAPH2" /></translation> <translation id="3660234220361471169">신뢰할 수 없음</translation> <translation id="3665589677786828986">Chrome에서 다른 프로그램이 브라우저 설정을 일부 손상시키고 원래 기본값으로 재설정했음을 감지했습니다.</translation> <translation id="3665842570601375360">보안:</translation> @@ -2115,6 +2114,7 @@ <translation id="3733127536501031542">SSL 서버(Step-up 사용)</translation> <translation id="3736520371357197498">보안 관련 위험을 이해한다면 위험한 프로그램이 삭제되기 전에 <ph name="BEGIN_LINK" />안전하지 않은 사이트<ph name="END_LINK" />에 방문해도 됩니다.</translation> <translation id="3738924763801731196"><ph name="OID" />:</translation> +<translation id="3739254215541673094"><ph name="APPLICATION" />을(를) 여시겠습니까?</translation> <translation id="3739798227959604811">반복 전 지연:</translation> <translation id="3741158646617793859">이제 <ph name="DEVICE_NAME" />(이)가 관리 콘솔에 표시됩니다.</translation> <translation id="3741243925913727067">Google 드라이브에 미디어 기기의 사진과 동영상을 백업합니다.</translation> @@ -2354,7 +2354,6 @@ <translation id="4058793769387728514">지금 문서 확인</translation> <translation id="4059285154003114015">프레임 인쇄(&P)</translation> <translation id="406070391919917862">백그라운드 애플리케이션</translation> -<translation id="4061502419206152498">비보안 비애니메이션만 표시</translation> <translation id="4062251648694601778"><ph name="SHORT_PRODUCT_NAME" /> 기기를 마음대로 사용하세요. 상태 표시줄에서 '?' 표시를 클릭하면 언제든지 도움말을 확인할 수 있습니다.</translation> <translation id="4065876735068446555">사용 중인 네트워크(<ph name="NETWORK_ID" />)에서 로그인 페이지 방문을 요청할 수 있습니다.</translation> <translation id="4068506536726151626">이 페이지에는 사용자 위치를 추적하는 다음 사이트의 요소가 포함되어 있습니다.</translation> @@ -2391,7 +2390,6 @@ <translation id="4101878899871018532">비밀번호 관리자가 동기화에 사용되는 사용자 인증 정보를 저장하도록 제안하지 않습니다.</translation> <translation id="410351446219883937">자동재생</translation> <translation id="4104163789986725820">내보내기(&X)...</translation> -<translation id="4105523032910086267">머티리얼 디자인에서 보안 정보의 애니메이션과 가시성을 설정합니다.</translation> <translation id="4105563239298244027">Google 드라이브에서 1TB를 무료로 사용하세요.</translation> <translation id="4109135793348361820">창을 <ph name="USER_NAME" />(<ph name="USER_EMAIL" />)님에게로 이동</translation> <translation id="4110342520124362335"><ph name="DOMAIN" />의 쿠키를 차단했습니다.</translation> @@ -2442,6 +2440,7 @@ <translation id="418179967336296930">러시아 표음식(YaZHert) 키보드</translation> <translation id="4181841719683918333">언어</translation> <translation id="4187248015940562149">웹사이트에서 내 주변의 블루투스 기기에 연결하여 제어하도록 할 수 있는 웹 블루투스를 사용하도록 설정합니다.</translation> +<translation id="4188447344915957833">머티리얼 디자인 설정에서 저장용량 관리자를 사용합니다.</translation> <translation id="4189406272289638749"><b><ph name="EXTENSION_NAME" /></b> 확장 프로그램에서 설정을 제어하고 있습니다.</translation> <translation id="4193154014135846272">Google 문서</translation> <translation id="4193182321948161343">머티리얼 디자인 사용자 관리자 사용</translation> @@ -2649,6 +2648,7 @@ <translation id="4508765956121923607">소스 보기(&O)</translation> <translation id="4509017836361568632">사진 삭제</translation> <translation id="4509345063551561634">위치:</translation> +<translation id="4513946894732546136">문제 신고</translation> <translation id="4514542542275172126">새로운 관리 대상 사용자 설정</translation> <translation id="4514914692061505365">모든 pexe 파일에서 PNaCl의 빠른 Subzero 변환기를 강제 사용합니다.</translation> <translation id="451515744433878153">제거</translation> @@ -2747,6 +2747,7 @@ <translation id="4656293982926141856">이 컴퓨터</translation> <translation id="4656631038341342120">이 기기에서 사용할 수 있는 경우 가상 현실 셸을 사용합니다.</translation> <translation id="4657031070957997341"><ph name="HOST" />에서 플러그인 항상 허용</translation> +<translation id="466008749075469935">백그라운드 타이머의 CPU 사용을 1%로 제한하는 개입을 사용합니다.</translation> <translation id="4663254525753315077">가능한 경우 더 빠르게 스크롤할 수 있도록 오버플로 스크롤 요소의 스크롤 콘텐츠를 합성된 레이어에 놓습니다.</translation> <translation id="4664482161435122549">PKCS #12 내보내기 오류</translation> <translation id="4665014895760275686">제조업체</translation> @@ -2815,6 +2816,7 @@ <translation id="4749157430980974800">조지아어 키보드</translation> <translation id="4750394297954878236">추천</translation> <translation id="475088594373173692">첫 번째 사용자</translation> +<translation id="4750892496809949692">플러그인 목록에서 플래시를 숨기고 HTML 콘텐츠를 사용합니다.</translation> <translation id="4750917950439032686">비밀번호나 신용카드 번호 등의 정보는 비공개 상태로 이 사이트에 전송됩니다.</translation> <translation id="4753602155423695878">Android 휴대전화의 페이지 로드 진행률 표시줄 애니메이션</translation> <translation id="4755240240651974342">핀란드어 키보드</translation> @@ -3089,6 +3091,7 @@ <translation id="5119450342834678097">설정 메뉴의 태블릿 사이트 요청 옵션</translation> <translation id="5120068803556741301">타사 입력 방식</translation> <translation id="5120421890733714118">웹사이트를 식별하기 위해 이 인증서를 신뢰합니다.</translation> +<translation id="5120516977819314347">PIN 또는 비밀번호가 잘못되었습니다.</translation> <translation id="5121130586824819730">하드 디스크가 가득 찼습니다. 다른 위치에 저장하거나 하드 디스크에 더 많은 공간을 확보하시기 바랍니다.</translation> <translation id="5125751979347152379">잘못된 URL입니다.</translation> <translation id="5127881134400491887">네트워크 연결 관리</translation> @@ -3096,6 +3099,7 @@ <translation id="512903556749061217">첨부됨</translation> <translation id="5129301143853688736">이 사이트에 비공개로 연결하도록 설정되지 않았습니다. 공격자가 <ph name="DOMAIN" />에서 사용자의 정보(예: 사진, 비밀번호, 메시지, 신용카드)를 도용하려고 시도하는 중일 수 있습니다.</translation> <translation id="5129662217315786329">폴란드어</translation> +<translation id="5131347545782851480">PDF 문서</translation> <translation id="5134856901811723984">Chrome OS 시스템 UI의 머티리얼 디자인</translation> <translation id="5135533361271311778">북마크 항목을 만들지 못했습니다.</translation> <translation id="5136529877787728692">F7</translation> @@ -3264,6 +3268,7 @@ <translation id="5328031682234198929">8</translation> <translation id="5329858601952122676">삭제(&D)</translation> <translation id="5330145655348521461">파일이 다른 데스크톱에서 열려 있습니다. 파일을 보려면 <ph name="USER_NAME" />(<ph name="MAIL_ADDRESS" />)(으)로 이동하세요.</translation> +<translation id="5330512191124428349">정보 받기</translation> <translation id="5332624210073556029">표준시간대:</translation> <translation id="5333807720589685258">정확한 PIN 잠금해제 키를 입력하지 않으면 SIM 카드가 영구적으로 사용 중지됩니다.</translation> @@ -3696,7 +3701,6 @@ <translation id="5892507820957994680">내장된 소프트웨어 렌더링 목록을 무시하고 지원되지 않는 시스템 설정에 GPU 가속 사용</translation> <translation id="5895138241574237353">다시 시작</translation> <translation id="5895187275912066135">발급 날짜</translation> -<translation id="5898154795085152510">서버에서 잘못된 클라이언트 인증서를 반환했습니다. 오류 <ph name="ERROR_NUMBER" />(<ph name="ERROR_NAME" />).</translation> <translation id="5900302528761731119">Google 프로필 사진</translation> <translation id="590253956165195626">사용 언어가 다른 페이지에 대한 번역 옵션 제공</translation> <translation id="5904093760909470684">프록시 설정</translation> @@ -3751,6 +3755,8 @@ <translation id="5984222099446776634">최근 방문</translation> <translation id="5984814259619230127">Smart Lock 저전력 블루투스(BLE) 검색</translation> <translation id="5986245990306121338">사용하도록 설정하면 설정에서 '탭 및 앱 병합' 옵션을 사용하도록 설정한 경우에도 탭 전환 도구가 표시됩니다.</translation> +<translation id="5989712527536636369"><ph name="BEGIN_PARAGRAPH1" />이 정보는 배터리 수준, 앱 사용 빈도, 네트워크 연결(Wi-Fi 및 블루투스 등) 품질 및 시간, 오류 발생 시 비정상 종료 보고서 등 내 기기와 기기 사용 방식에 관한 일반적인 정보입니다. 이 정보는 모든 사람을 위해 Google 제품 및 서비스를 개선하는 데 사용됩니다. 집계된 정보 중 일부는 Android 개발자 등의 파트너가 앱과 제품을 개선하는 데 유용하게 사용됩니다.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Android 앱 설정에서 이 기능을 언제든지 사용 설정하거나 사용 중지할 수 있습니다. 이 기능은 기기에서 시스템 업데이트와 보안 등 필수 서비스를 받는 데 필요한 정보를 전송하는 능력에 영향을 주지 않습니다.<ph name="END_PARAGRAPH2" /></translation> <translation id="5990198433782424697">chrome:// URL의 확장 프로그램</translation> <translation id="5990814808592353318">비밀번호 직접 생성</translation> <translation id="5991049340509704927">확대</translation> @@ -3764,6 +3770,7 @@ <translation id="6005695835120147974">미디어 라우터</translation> <translation id="6007237601604674381">이동에 실패했습니다. <ph name="ERROR_MESSAGE" /></translation> <translation id="6008241731410823808">하이퍼링크 검사 ping을 전송합니다.</translation> +<translation id="6011449291337289699">사이트 데이터 삭제</translation> <translation id="6015796118275082299">연도</translation> <translation id="6016551720757758985">이전 버전으로 돌아가서 Powerwash 확인</translation> <translation id="6016809788585079594">마지막으로 한번 더 "Ok Google"이라고 말하세요.</translation> @@ -3953,7 +3960,6 @@ <translation id="6276301056778294989">기기에 동일한 코드가 표시되는지 확인하세요.</translation> <translation id="6277105963844135994">네트워크 시간 초과</translation> <translation id="6277518330158259200">스크린샷 캡쳐하기(&A)</translation> -<translation id="6278428485366576908">테마</translation> <translation id="6279183038361895380">|<ph name="ACCELERATOR" />|을(를) 눌러 커서 표시</translation> <translation id="6280215091796946657">다른 계정으로 로그인</translation> <translation id="6280912520669706465">ARC</translation> @@ -4205,6 +4211,7 @@ <translation id="6607272825297743757">파일 정보</translation> <translation id="6607831829715835317">도구 더보기</translation> <translation id="6608140561353073361">모든 쿠키 및 사이트 데이터...</translation> +<translation id="6610183966322615106">프린터를 추가하는 도중에 오류가 발생했습니다.</translation> <translation id="6610610633807698299">URL 입력...</translation> <translation id="6612358246767739896">보호된 콘텐츠</translation> <translation id="6615455863669487791">표시</translation> @@ -4268,7 +4275,6 @@ <translation id="6708242697268981054">출처:</translation> <translation id="6709357832553498500"><ph name="EXTENSIONNAME" />을(를) 사용하여 연결</translation> <translation id="6710213216561001401">이전</translation> -<translation id="6712158998835983046">모두 보기(애니메이션)</translation> <translation id="6718273304615422081">압축 중...</translation> <translation id="671928215901716392">화면 잠금</translation> <translation id="6721972322305477112">파일(&F)</translation> @@ -4299,7 +4305,7 @@ <translation id="6748465660675848252">계속 진행할 수 있지만 동기화된 데이터와 설정만 복원됩니다. 모든 로컬 데이터가 손실됩니다.</translation> <translation id="6751256176799620176">폴더 1개 선택됨</translation> <translation id="6751344591405861699"><ph name="WINDOW_TITLE" /> (시크릿 모드)</translation> -<translation id="6753714565687320504">인터넷 사용 기록 제어</translation> +<translation id="6753714565687320504">인터넷 사용 기록 관리</translation> <translation id="6759193508432371551">초기화</translation> <translation id="6760765581316020278">베트남어 키보드(VNI)</translation> <translation id="6766534397406211000">알림이 삭제되면 메시지 센터가 항상 위로 스크롤되는 실험 기능을 사용합니다.</translation> @@ -4474,7 +4480,7 @@ <translation id="7010160495478792664">가능한 경우 하드웨어 가속을 통해 동영상을 디코딩합니다.</translation> <translation id="7010400591230614821">적극적인 탭 개방 전략</translation> <translation id="701080569351381435">소스 보기</translation> -<translation id="7012372675181957985"><ph name="BEGIN_LINK" />history.google.com<ph name="END_LINK" />에서 내 Google 계정에 있는 다른 형식의 탐색 기록을 확인할 수 있습니다.</translation> +<translation id="7012372675181957985">Google 계정에 다른 형식의 탐색 기록이 <ph name="BEGIN_LINK" />history.google.com<ph name="END_LINK" />에 남아있을 수 있습니다.</translation> <translation id="7012435537548305893">터치 보기 모드에서 전체 화면 앱 목록을 사용하도록 설정합니다.</translation> <translation id="7013485839273047434">더 많은 확장 프로그램 다운로드</translation> <translation id="7014174261166285193">설치에 실패했습니다.</translation> @@ -4540,7 +4546,6 @@ <translation id="7088434364990739311">업데이트 확인을 시작하지 못했습니다(오류 코드: <ph name="ERROR" />).</translation> <translation id="708856090370082727">OSK 오버스크롤 지원을 사용합니다. 이 플래그를 사용하도록 설정하면 OSK가 시각 표시 영역의 크기만 다시 조정합니다.</translation> <translation id="7088674813905715446">이 기기는 관리자에 의해 사용 중단 상태로 설정되었습니다. 기기를 등록에 사용하려면 관리자에게 기기를 대기 상태로 전환해 달라고 요청해야 합니다.</translation> -<translation id="7089609847854449639">저장용량 관리자</translation> <translation id="708969677220991657">제공된 인증서가 유효하지 않은 경우에도 HTTPS를 통해 localhost로 요청을 보내도록 허용합니다.</translation> <translation id="7092106376816104">팝업 예외</translation> <translation id="7093866338626856921">이름이 <ph name="HOSTNAMES" />인 기기와 데이터 교환</translation> @@ -4580,7 +4585,7 @@ <translation id="715118844758971915">일반 프린터</translation> <translation id="7154130902455071009">다음으로 시작 페이지 변경: <ph name="START_PAGE" /></translation> <translation id="7155171745945906037">카메라 또는 파일의 기존 사진</translation> -<translation id="715568033737470079">Win32k 잠금 샌드박스 정책 내에서 실행될 PPAPI 플러그인을 지정합니다(Windows 10 이상만 해당).</translation> +<translation id="7155226869555939647">언제나 <ph name="APPLICATION" /> 링크 열기</translation> <translation id="7156235233373189579">이 파일은 Windows 소프트웨어를 사용하는 PC용으로 설계되었으며 Chrome OS를 실행하는 기기와 호환되지 않습니다. 적합한 대체 앱을 찾으려면 <ph name="BEGIN_LINK" />Chrome 웹 스토어<ph name="END_LINK" />를 검색하세요. <ph name="BEGIN_LINK_HELP" />자세히 알아보기<ph name="END_LINK_HELP" /></translation> <translation id="7157063064925785854">계속을 클릭하면 <ph name="LEGAL_DOC_LINK_TEXT_1" />, <ph name="LEGAL_DOC_LINK_TEXT_2" />, <ph name="LEGAL_DOC_LINK_TEXT_3" /> 및 <ph name="LEGAL_DOC_LINK_TEXT_4" />에 동의하는 것으로 간주됩니다.</translation> <translation id="7158238151765743968"><ph name="DEVICE_NAME" />에 연결 중입니다.</translation> @@ -4595,6 +4600,7 @@ <translation id="7175353351958621980">로드 위치:</translation> <translation id="7180611975245234373">새로고침</translation> <translation id="7180865173735832675">맞춤설정</translation> +<translation id="7181387261278441780">사이트 삭제 및 재설정</translation> <translation id="7185078796915954712">TLS 1.3</translation> <translation id="7185690883425432021">탭 스트림이 겹침 모드일 때 비활성 탭의 닫기 버튼을 숨깁니다.</translation> <translation id="7186088072322679094">툴바에 보관</translation> @@ -4627,7 +4633,6 @@ <translation id="7223775956298141902">저런, 확장 프로그램이 없군요.</translation> <translation id="7224023051066864079">서브넷 마스크:</translation> <translation id="7225179976675429563">네트워크 유형이 없습니다.</translation> -<translation id="7230191962699768124">모두 보기(비애니메이션)</translation> <translation id="7230787553283372882">텍스트 크기 맞춤설정</translation> <translation id="7231224339346098802">숫자로 인쇄 매수를 표시하세요(1 이상).</translation> <translation id="7238585580608191973">SHA-256 지문</translation> @@ -4759,7 +4764,6 @@ <translation id="7409233648990234464">다시 실행 및 Powerwash</translation> <translation id="7409836189476010449">플래시 실행</translation> <translation id="7410344089573941623"><ph name="HOST" />에서 카메라와 마이크에 액세스하려는 경우 메시지 표시</translation> -<translation id="7411343637221933631">{NUM_COOKIES,plural, =1{이 사이트의 쿠키 1개}other{이 사이트의 쿠키 #개}}</translation> <translation id="7412226954991670867">GPU 메모리</translation> <translation id="7416362041876611053">알려지지 않은 네트워크 오류입니다.</translation> <translation id="7417453074306512035">에티오피아어 키보드</translation> @@ -4881,6 +4885,7 @@ <translation id="756445078718366910">브라우저 창 열기</translation> <translation id="7564847347806291057">프로세스 종료</translation> <translation id="7566723889363720618">F12</translation> +<translation id="7567314848159753396">쿠키: <ph name="NAME" /></translation> <translation id="756809126120519699">Chrome 데이터 삭제됨</translation> <translation id="7568790562536448087">업데이트</translation> <translation id="7573172247376861652">배터리 충전</translation> @@ -4921,6 +4926,7 @@ <translation id="7626009897377900107">비밀번호 생성</translation> <translation id="7627262197844840899">이 사이트에서는 MasterCard를 사용할 수 없습니다.</translation> <translation id="7627790789328695202"><ph name="FILE_NAME" />이(가) 이미 있습니다. 이름을 변경한 후 다시 시도해 주세요.</translation> +<translation id="7628127343934101653">기본 PDF 뷰어 애플리케이션에서 PDF 파일 열기</translation> <translation id="762917759028004464">현재 기본 브라우저는 <ph name="BROWSER_NAME" />입니다.</translation> <translation id="7629536005696009600">Android 애플리케이션에 저장된 사용자 인증 정보가 관련 웹사이트에 입력되도록 허용합니다.</translation> <translation id="7629827748548208700">탭: <ph name="TAB_NAME" /></translation> @@ -5149,6 +5155,7 @@ <translation id="7957513156576779045">페어링을 허용하려면 블루투스를 사용 설정하세요.</translation> <translation id="7957615753207896812">키보드 기기 설정 열기</translation> <translation id="7959074893852789871">파일에 여러 인증서가 있지만 그 중 일부를 가져올 수 없습니다.</translation> +<translation id="7959700692661109221"><ph name="BEGIN_PARAGRAPH" />Google의 위치 서비스를 이용하면 Wi-Fi와 같은 소스를 활용하여 현재 위치를 더 빠르고 정확하게 예측할 수 있습니다. Google의 위치 서비스를 사용하면 기기에서 Wi-Fi를 사용하여 위치 정보를 제공하게 됩니다. 언제든지 위치 설정에서 이 기능을 사용 중지할 수 있습니다.<ph name="END_PARAGRAPH" /></translation> <translation id="7961015016161918242">사용하지 않음</translation> <translation id="7964089325405904043">비밀번호 가져오기와 내보내기</translation> <translation id="7965010376480416255">공유 메모리</translation> @@ -5299,6 +5306,7 @@ <translation id="8146793085009540321">로그인하지 못했습니다. 관리자에게 문의하거나 다시 시도해 보세요.</translation> <translation id="8148264977957212129">병음 입력 방법</translation> <translation id="8148913456785123871">런처에 Google Now 카드 표시</translation> +<translation id="8150391391298684512">Windows Runtime MIDI API 사용 중지</translation> <translation id="8151185429379586178">개발자 도구</translation> <translation id="8151638057146502721">구성</translation> <translation id="8151639108075998630">손님으로 로그인 허용</translation> @@ -5581,6 +5589,7 @@ <translation id="8532294913309524834">원하는 대로 언어를 정렬하세요.</translation> <translation id="8535005006684281994">Netscape Certificate Renewal URL</translation> <translation id="8539727552378197395">허용 안함(Http만)</translation> +<translation id="8541084862688000575">Android 앱 자동 로드</translation> <translation id="8543181531796978784"><ph name="BEGIN_ERROR_LINK" />감지 문제를 신고<ph name="END_ERROR_LINK" />할 수 있으며, 보안에 미치는 위험을 감수한다면 <ph name="BEGIN_LINK" />이 안전하지 않은 사이트를 방문<ph name="END_LINK" />할 수 있습니다.</translation> <translation id="8545107379349809705">정보 숨기기</translation> <translation id="8545211332741562162">실험용 자바스크립트 기능을 사용하기 위해 웹페이지를 사용하도록 설정합니다.</translation> @@ -5608,7 +5617,6 @@ <translation id="8569764466147087991">열려는 파일 선택</translation> <translation id="8571032220281885258">Chrome이 'Ok Google' 다음에 말하는 내용을 검색합니다.</translation> <translation id="8571108619753148184">서버 4</translation> -<translation id="8572832761467613633">Flash만 해당</translation> <translation id="8572981282494768930">내 카메라 및 마이크에 대한 모든 사이트의 액세스를 허용 안 함</translation> <translation id="8574234089711453001">미디어 url을 통해 페이지를 열 때 다운로드 버튼이 표시되도록 허용합니다.</translation> <translation id="857779305329188634">실험용 QUIC 프로토콜 지원을 사용하도록 설정합니다.</translation> @@ -5630,6 +5638,7 @@ <translation id="8600929685092827187">웨이크 온 패킷(WOP)</translation> <translation id="8601206103050338563">TLS WWW 클라이언트 인증</translation> <translation id="8602851771975208551">컴퓨터의 다른 프로그램에서 Chrome 작동에 영향을 줄 수 있는 앱을 추가했습니다.</translation> +<translation id="8603912787021349466">로그인한 뒤 Android 앱이 자동으로 시작될 수 있게 허용합니다.</translation> <translation id="8605428685123651449">SQLite 메모리</translation> <translation id="8605503133013456784">'<ph name="DEVICE_NAME" />'에서 연결을 끊고 페어링을 해제하지 못했습니다.</translation> <translation id="8606726445206553943">MIDI 기기를 사용합니다.</translation> @@ -5982,6 +5991,7 @@ <translation id="9053965862400494292">동기화를 설정하는 동안 오류가 발생했습니다.</translation> <translation id="9056034633062863292">Chromebox 업데이트 중</translation> <translation id="9056810968620647706">일치하는 항목이 없습니다.</translation> +<translation id="9057119625587205566">주변에 프린터 없음</translation> <translation id="9059868303873565140">상태 메뉴</translation> <translation id="9064142312330104323">Google 프로필 사진(로드 중)</translation> <translation id="9064275926664971810">클릭 한 번으로 양식을 작성하는 자동완성 사용</translation> @@ -5992,6 +6002,7 @@ <translation id="9067401056540256169">이 플래그를 사용하면 Chrome의 안전성이 낮아집니다. 이 플래그의 역할을 이해한 경우에만 사용하시기 바랍니다. 이 플래그는 사전 통지 없이 삭제될 수 있습니다. 사용 설정하면 https 출처가 포함된 프레임이 안전하지 않은 URL(ws://)을 포함한 WebSockets을 사용할 수 있습니다.</translation> <translation id="9068931793451030927">경로:</translation> <translation id="9070219033670098627">사용자 전환</translation> +<translation id="9070940116164932228">고가의 백그라운드 타이머 조정</translation> <translation id="907148966137935206">모든 사이트에서 팝업 표시 허용 안함(권장)</translation> <translation id="9072550133391925347"><ph name="PASSWORD_MANAGER_BRAND" />에서 저장한 비밀번호를 사용하여 적합한 사이트와 앱에 자동 로그인합니다.</translation> <translation id="9073281213608662541">PAP</translation> @@ -6026,6 +6037,7 @@ <translation id="9112614144067920641">새 PIN을 선택하세요.</translation> <translation id="9112748030372401671">배경화면 변경</translation> <translation id="9112987648460918699">찾기...</translation> +<translation id="9114663181201435112">간편한 로그인</translation> <translation id="9115487443206954631">Cast 기기 관리</translation> <translation id="9115675100829699941">북마크(&B)</translation> <translation id="9121814364785106365">고정 탭으로 열기</translation> @@ -6120,7 +6132,6 @@ <translation id="952992212772159698">활성화되지 않음</translation> <translation id="960719561871045870">운영자 코드</translation> <translation id="960987915827980018">약 1시간 남음</translation> -<translation id="962778376131245616">비보안, 애니메이션만 표시</translation> <translation id="96421021576709873">Wi-Fi 네트워크</translation> <translation id="965490406356730238">사용 가능한 경우 캡처된 프레임에 하드웨어 가속 mjpeg 디코딩을 사용합니다.</translation> <translation id="968174221497644223">애플리케이션 캐시</translation>
diff --git a/chrome/app/resources/generated_resources_lt.xtb b/chrome/app/resources/generated_resources_lt.xtb index 64e2c029..c2f9ebb8 100644 --- a/chrome/app/resources/generated_resources_lt.xtb +++ b/chrome/app/resources/generated_resources_lt.xtb
@@ -18,7 +18,6 @@ <translation id="1029317248976101138">Keisti mastelį</translation> <translation id="1029595648591494741">Išbandyti „<ph name="EXTENSION_NAME" />“?</translation> <translation id="1031362278801463162">Įkeliama peržiūra</translation> -<translation id="1031460590482534116">Bandant išsaugoti kliento sertifikatą įvyko klaida. <ph name="ERROR_NUMBER" /> klaida (<ph name="ERROR_NAME" />).</translation> <translation id="1031573127485938293">Klausti (atsižvelgiant į politiką)</translation> <translation id="103279545524624934">Atlaisvinkite vietos diske, kad galėtumėte paleisti „Android“ programas.</translation> <translation id="1033780634303702874">Pasiekti nuosekliuosius įtaisus</translation> @@ -101,6 +100,7 @@ <translation id="1128591060186966949">Paieškos variklio redagavimas</translation> <translation id="1128987120443782698">Saugojimo įrenginio talpa <ph name="DEVICE_CAPACITY" />. Įdėkite mažiausiai 4 GB talpos SD ar USB atminties kortelę.</translation> <translation id="1137135726305341424">„domContentLoaded“ ir visos išteklių įkeltys pradėtos prieš „domContentLoaded“ (pagrindinis rėmelis ir tos pačios kilmės „iframe“).</translation> +<translation id="1138663153846032155">Pirmenybę teikti HTML, o ne „Flash“</translation> <translation id="1140351953533677694">Pasiekti „Bluetooth“ ir nuosekliuosius įtaisus</translation> <translation id="114140604515785785">Plėtinio šakninis katalogas:</translation> <translation id="1143142264369994168">Sertifikatą pasirašantis asmuo</translation> @@ -252,6 +252,7 @@ <translation id="1351692861129622852">Importuojami failai (<ph name="FILE_COUNT" />)...</translation> <translation id="1352103415082130575">Tailandietiška klaviatūra („Pattachote“)</translation> <translation id="1353686479385938207">„<ph name="PROVIDER_NAME" />“: „<ph name="NETWORK_NAME" />“</translation> +<translation id="1353946958707294039">Trimačių objektų dizaino saugyklos tvarkytuvė</translation> <translation id="1353966721814789986">Paleisties puslapiai</translation> <translation id="1354868058853714482">„Adobe Reader“ programa pasenusi ir gali būti nesaugi.</translation> <translation id="1355408554203439639">3D programinės įrangos keistuvas į rastrinį vaizdą</translation> @@ -423,7 +424,6 @@ <translation id="1533920822694388968">TV lygiavimas</translation> <translation id="15373452373711364">Didelis pelės žymeklis</translation> <translation id="1543284117603151572">Importuota iš „Edge“</translation> -<translation id="1544350195767834591">{NUM_COOKIES,plural, =1{1 iš kitų svetainių}one{# iš kitų svetainių}few{# iš kitų svetainių}many{# iš kitų svetainių}other{# iš kitų svetainių}}</translation> <translation id="1545177026077493356">Automatinis viešojo terminalo režimas</translation> <translation id="1545786162090505744">URL su %s užklausos viet.</translation> <translation id="1546280085599573572">Šis plėtinys pakeitė puslapį, kuris rodomas spustelėjus pagrindinio puslapio mygtuką.</translation> @@ -447,7 +447,6 @@ <translation id="1559235587769913376">Įvesties „Unicode“ simboliai</translation> <translation id="1561092721008294962">„HarfBuzz“ NS tekstui</translation> <translation id="1566049601598938765">Svetainė</translation> -<translation id="1566958206723629112">„Flash“ ir PDF</translation> <translation id="1567723158593978621">Įgalinus prisijungiant prie naršyklės bus naudojamas naujas GAIA slaptažodžiais atskirto prisijungimo srautas.</translation> <translation id="1567993339577891801">„JavaScript“ pultas</translation> <translation id="1568323446248056064">Atidaryti įrenginio pateikties nustatymus</translation> @@ -576,7 +575,6 @@ <translation id="1723940674997333416">Leisti nesaugius HTTPS kilmės „WebSocket“</translation> <translation id="1725149567830788547">Rodyti valdiklius</translation> <translation id="172612876728038702">Nustatomas TPM. Būkite kantrūs; tai gali užtrukti kelias minutes.</translation> -<translation id="1727135806684246609">Trimačių objektų saugos daugiažodis</translation> <translation id="1729533290416704613">Ji taip pat kontroliuoja, koks puslapis rodomas, kai ieškote „Omnibox“.</translation> <translation id="1731346223650886555">Kabliataškis</translation> <translation id="1731589410171062430">Iš viso: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /> (<ph name="NUMBER_OF_PAGES" /> <ph name="PAGE_OR_PAGES_LABEL" />)</translation> @@ -873,6 +871,7 @@ <translation id="218492098606937156">Įgalinti liečiamus įvykius</translation> <translation id="2187317261103489799">Aptikti (numatytoji parinktis)</translation> <translation id="2187895286714876935">Serverio sertifikato importavimo klaida</translation> +<translation id="2188881192257509750">Atidaryti <ph name="APPLICATION" /></translation> <translation id="2190069059097339078">„Wi-Fi“ prisijungimo duomenų atsisiuntimo priemonė</translation> <translation id="219008588003277019">Vietinio kliento modulis: „<ph name="NEXE_NAME" />“</translation> <translation id="2190355936436201913">(tuščias)</translation> @@ -991,6 +990,7 @@ <translation id="2326606747676847821">Įjungti inkognito režimą</translation> <translation id="2326931316514688470">&Įkelti programą iš naujo</translation> <translation id="2327492829706409234">Įgalinti programą</translation> +<translation id="2328054044222305089">Bus ištrinti visi duomenys, kuriuos <ph name="SITE" /> išsaugojo jūsų įrenginyje, ir bus iš naujo nustatyti leidimai, kuriuos suteikėte. Ar norite tęsti?</translation> <translation id="2329597144923131178">Pris. ir pas. žymių, ist., slapt. bei kitų nust. duom. visuose įreng.</translation> <translation id="2332131598580221120">Žiūrėti parduotuvėje</translation> <translation id="2332742915001411729">Nustatyti iš naujo numatytąjį</translation> @@ -1266,7 +1266,6 @@ <translation id="2675358154061544447">Eksperimentinis skirtingų svetainių „iframe“ atvaizdavimo atskiruose procesuose. Kai veikia šis režimas, dokumentų atvaizdavimo procesas bus toks pat, jei jie yra iš tos pačios svetainės.</translation> <translation id="2676946222714718093">Leidžiama</translation> <translation id="2678063897982469759">Iš naujo įgalinti</translation> -<translation id="2678246812096664977">Visi papildiniai</translation> <translation id="2679385451463308372">Spausdinkite naudodami sistemos dialogo langą...</translation> <translation id="2680208403056680091">Interneto ryšys yra kontroliuojamas</translation> <translation id="268053382412112343">Is&torija</translation> @@ -1440,7 +1439,6 @@ <translation id="287286579981869940">Pridėti „<ph name="PROVIDER_NAME" />“...</translation> <translation id="2872961005593481000">Stabdyti</translation> <translation id="2875698561019555027">(„Chrome“ klaidų puslapiai)</translation> -<translation id="2879560882721503072"><ph name="ISSUER" /> išduotas kliento sertifikatas išsaugotas sėkmingai.</translation> <translation id="288024221176729610">Čekų</translation> <translation id="288042212351694283">Pasiekiami bendrieji 2 veiksnio įrenginiai</translation> <translation id="2881966438216424900">Paskutinį kartą pasiekta:</translation> @@ -1589,6 +1587,7 @@ <translation id="3057861065630527966">Kurkite atsargines nuotraukų ir vaizdo įrašų kopijas</translation> <translation id="3058212636943679650">Jei kada nors reikės atkurti kompiuterio operacinę sistemą, reikės atkūrimo SD arba USB atminties kortelės.</translation> <translation id="305932878998873762">Paprasta HTTP talpykla yra naujoji talpykla. Paskirstant disko vietą naudojama failų sistema.</translation> +<translation id="3060251871394327123">Bus ištrinti visi duomenys, kuriuos <ph name="SITE" /> išsaugojo jūsų įrenginyje. Ar norite tęsti?</translation> <translation id="3061650404498811439">Įgalinti prieigą prie jaustukų, rašymo ranka funkcijos ir balso įvesties iš pasirenkamo IMRP meniu.</translation> <translation id="3062606427884046423">Naudoti „Android MediaStyle“ pranešimus siunčiant „Chrome“ medijos pranešimus.</translation> <translation id="3063844757726132584">Pasiekite visas programas naudodami šią patogią paleidimo priemonę. Žaiskite žaidimus, dalyvaukite vaizdo pokalbiuose, klausykite muzikos, redaguokite dokumentus arba gaukite daugiau programų.</translation> @@ -1638,6 +1637,7 @@ <translation id="3123569374670379335">(Prižiūrima)</translation> <translation id="3124111068741548686">NAUDOTOJO tvarkomi elementai</translation> <translation id="3126026824346185272">Ctrl</translation> +<translation id="3127156390846601284">Bus ištrinti visi duomenys, kuriuos jūsų įrenginyje išsaugojo visos rodomos svetainės. Ar norite tęsti?</translation> <translation id="312759608736432009">Įrenginio gamintojas:</translation> <translation id="3127919023693423797">Autentifikuojama...</translation> <translation id="3128230619496333808">6 skirtukas</translation> @@ -1736,7 +1736,6 @@ <translation id="3264544094376351444">Šriftas „Sans-Serif“</translation> <translation id="3264547943200567728">Nepavyko nustatyti „Chromebox“ tinklo</translation> <translation id="3265459715026181080">Uždaryti langą</translation> -<translation id="3267271790328635957">Tik PDF</translation> <translation id="3267726687589094446">Toliau leisti automatiškai atsisiųsti kelis failus</translation> <translation id="3267998849713137817">Pakeistas laikas</translation> <translation id="3268451620468152448">Atidaryti skirtukai</translation> @@ -1982,6 +1981,7 @@ <translation id="3574210789297084292">prisijungti</translation> <translation id="3574305903863751447"><ph name="CITY" />, <ph name="STATE" /> <ph name="COUNTRY" /></translation> <translation id="357479282490346887">Lietuvių</translation> +<translation id="3575927481544652747">Išjungti „Windows Runtime MIDI“ API, skirtą „WebMIDI“, kuri pagal numatytuosius nustatymus įgalinta 10 arba naujesnės versijos sistemoje „Windows“.</translation> <translation id="3576324189521867626">Sėkmingai įdiegta</translation> <translation id="3578331450833904042">Numatytasis (pasirinkti viską)</translation> <translation id="3578594933904494462">Šio skirtuko lapo turinys bendrinamas.</translation> @@ -2035,8 +2035,6 @@ <translation id="3627320433825461852">Liko mažiau nei 1 min.</translation> <translation id="3627588569887975815">Atidaryti nuorodą inco&gnito lange</translation> <translation id="3627671146180677314">„Netscape“ sertifikato atnaujinimo laikas</translation> -<translation id="3629326610814700057">Leidžiama saugyklos tvarkyklei tvarkyti vietinę saugyklą.</translation> -<translation id="3630337581925712713"><ph name="PERMISSION_TYPE_LABEL" />:</translation> <translation id="3631337165634322335">Toliau pateiktos išimtys taikomos tik dabartinei inkognito sesijai.</translation> <translation id="3633586230741134985">Programų paleidimo priemonės nustatymai</translation> <translation id="3633997706330212530">Galite pasirinkti neleisti šių paslaugų.</translation> @@ -2059,7 +2057,8 @@ <translation id="3654045516529121250">Skaitykite pasiekiamumo nustatymus</translation> <translation id="3654092442379740616">Sinchronizavimo klaida: „<ph name="PRODUCT_NAME" />“ yra pasenusi ir turi būti atnaujinta.</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{Suteikta nuolatinė prieiga prie vieno failo.}one{Suteikta nuolatinė prieiga prie # failo.}few{Suteikta nuolatinė prieiga prie # failų.}many{Suteikta nuolatinė prieiga prie # failo.}other{Suteikta nuolatinė prieiga prie # failų.}}</translation> -<translation id="3657468915905674858">Įgalinti PPAPI „Win32k“ užrakinimą.</translation> +<translation id="365793796291733849"><ph name="BEGIN_PARAGRAPH1" />Kai įjungsite automatinę atsarginės kopijos kūrimo funkciją, įrenginio ir programų duomenys bus periodiškai saugomi privačiame „Google“ diske. Programų duomenys gali būti bet kurie programos išsaugoti duomenys (atsižvelgiant į kūrėjo nustatymus), įskaitant potencialiai neskelbtinus duomenis, pvz., kontaktus, pranešimus ir nuotraukas.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Atsarginės kopijos duomenys nebus įtraukti skaičiuojant Disko saugyklos kvotą. Nebus kuriama atsarginė didelių failų arba failų, kuriuos kūrėjai pasirinko išskirti iš šios paslaugos, kopija.<ph name="END_PARAGRAPH2" /></translation> <translation id="3660234220361471169">Nepatikima</translation> <translation id="3665589677786828986">„Chrome“ aptiko, kad kai kuriuos nustatymus sugadino kita programa, ir nustatė juos iš naujo į pirminius numatytuosius nustatymus.</translation> <translation id="3665842570601375360">Sauga:</translation> @@ -2114,6 +2113,7 @@ <translation id="3733127536501031542">SSL serveris su sąranka</translation> <translation id="3736520371357197498">Jei suprantate, kokia rizika gali kilti jūsų saugai, galite <ph name="BEGIN_LINK" />apsilankyti šioje nesaugioje svetainėje<ph name="END_LINK" />, kol iš jos dar nepašalintos pavojingos programos.</translation> <translation id="3738924763801731196"><ph name="OID" />:</translation> +<translation id="3739254215541673094">Atidaryti <ph name="APPLICATION" />?</translation> <translation id="3739798227959604811">Atidėti iki pakartojimo:</translation> <translation id="3741158646617793859">Dabar „<ph name="DEVICE_NAME" />“ bus rodomas „Admin Console“</translation> <translation id="3741243925913727067">Kurkite atsargines medijos įrenginio nuotraukų ir vaizdo įrašų kopijas „Google“ diske.</translation> @@ -2352,7 +2352,6 @@ <translation id="4058793769387728514">Patikrinti dokumentą dabar</translation> <translation id="4059285154003114015">&Spausdinti rėmelį...</translation> <translation id="406070391919917862">Fono programos</translation> -<translation id="4061502419206152498">Rodyti tik nesaugius, be animacijos</translation> <translation id="4062251648694601778">Mėgaukitės savo „<ph name="SHORT_PRODUCT_NAME" />“ įrenginiu. Turite klausimų? Visada galite sulaukti pagalbos spustelėję „?“ būsenos dėkle.</translation> <translation id="4065876735068446555">Naudojant šį tinklą (<ph name="NETWORK_ID" />) gali būti prašoma apsilankyti prisijungimo puslapyje.</translation> <translation id="4068506536726151626">Šiame puslapyje yra elementų iš šių svetainių, kuriose stebima jūsų vietovė:</translation> @@ -2391,7 +2390,6 @@ <translation id="4101878899871018532">Slaptažodžių tvarkytuvė nesiūlys išsaugoti prisijungimo duomenų, naudojamų sinchronizuojant.</translation> <translation id="410351446219883937">Automatinis paleidimas</translation> <translation id="4104163789986725820">Eksportuoti...</translation> -<translation id="4105523032910086267">Nustatoma trimačių objektų dizaino saugos daugiažodžio animacija ir matomumas.</translation> <translation id="4105563239298244027">Gaukite 1 TB nemokamai naudodami „Google“ diską</translation> <translation id="4109135793348361820">Perkelti langą <ph name="USER_NAME" /> (<ph name="USER_EMAIL" />)</translation> <translation id="4110342520124362335"><ph name="DOMAIN" /> slapukai užblokuoti.</translation> @@ -2442,6 +2440,7 @@ <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="4188447344915957833">Trimačių objektų dizaino nustatymuose įgalinama saugyklos tvarkytuvė.</translation> <translation id="4189406272289638749">Plėtinys (<b><ph name="EXTENSION_NAME" /></b>) valdo šį nustatymą.</translation> <translation id="4193154014135846272">„Google“ dokumentas</translation> <translation id="4193182321948161343">Įgalinti trimačių objektų dizaino naudotojų tvarkytuvę</translation> @@ -2649,6 +2648,7 @@ <translation id="4508765956121923607">Žiūrėti ša&ltinį</translation> <translation id="4509017836361568632">Atmesti nuotrauką</translation> <translation id="4509345063551561634">Vieta:</translation> +<translation id="4513946894732546136">Atsiliepimai</translation> <translation id="4514542542275172126">Nustatyti naują prižiūrimą naudotoją</translation> <translation id="4514914692061505365">Priverstinai naudoti „PNaCl“ greitą „Subzero“ vertimo programą visuose perkeliamuose vykdomuosiuose failuose.</translation> <translation id="451515744433878153">Pašalinti</translation> @@ -2747,6 +2747,7 @@ <translation id="4656293982926141856">Šis kompiuteris</translation> <translation id="4656631038341342120">Įgalinti virtualiosios realybės apvalkalą, jei tai įmanoma šiame įrenginyje.</translation> <translation id="4657031070957997341">Visada leisti papildinius iš <ph name="HOST" /></translation> +<translation id="466008749075469935">Įgalinamas įsikišimas siekiant apriboti foninių laikmačių centrinio procesoriaus naudojimą iki 1 proc.</translation> <translation id="4663254525753315077">Kai įmanoma, perpildos slinkimo elemento turinį perkelia į sudėtinį sluoksnį, kad būtų slenkama greičiau.</translation> <translation id="4664482161435122549">PKCS Nr. 12 eksportavimo klaida</translation> <translation id="4665014895760275686">Gamintojas</translation> @@ -2815,6 +2816,7 @@ <translation id="4749157430980974800">Gruziniška klaviatūra</translation> <translation id="4750394297954878236">Pasiūlymai</translation> <translation id="475088594373173692">Pirmas naudotojas</translation> +<translation id="4750892496809949692">Teikti pirmenybę HTML turiniui paslepiant „Flash“ papildinių sąraše.</translation> <translation id="4750917950439032686">Į šią svetainę siunčiama informacija (pvz., slaptažodžiai arba kredito kortelių numeriai) yra privati.</translation> <translation id="4753602155423695878">„Android“ telefono puslapio įkėlimo eigos juostos animacija</translation> <translation id="4755240240651974342">Suomiška klaviatūra</translation> @@ -3089,6 +3091,7 @@ <translation id="5119450342834678097">Planšetinio kompiuterio svetainės užklausos teikimo parinktis nustatymų meniu</translation> <translation id="5120068803556741301">Trečiosios šalies įvesties būdas</translation> <translation id="5120421890733714118">Pasitikėti šiuo sertifikatu nustatant svetaines.</translation> +<translation id="5120516977819314347">Neteisingas PIN kodas arba slaptažodis.</translation> <translation id="5121130586824819730">Jūsų standusis diskas pilnas. Išsaugokite kitoje vietoje arba atlaisvinkite vietos standžiajame diske.</translation> <translation id="5125751979347152379">Negaliojantis URL.</translation> <translation id="5127881134400491887">Valdyti tinklo ryšius</translation> @@ -3096,6 +3099,7 @@ <translation id="512903556749061217">prijungtas</translation> <translation id="5129301143853688736">Ryšys su šia svetaine nėra privatus. Užgrobėjai gali bandyti pavogti jūsų informaciją (pvz., nuotraukas, slaptažodžius, pranešimus ar kredito kortelių duomenis) iš <ph name="DOMAIN" />.</translation> <translation id="5129662217315786329">Lenkų</translation> +<translation id="5131347545782851480">PDF dokumentai</translation> <translation id="5134856901811723984">Trimačių objektų dizainas „Chrome“ OS sistemos NS</translation> <translation id="5135533361271311778">Žymės elemento sukurti nepavyko.</translation> <translation id="5136529877787728692">F7</translation> @@ -3264,6 +3268,7 @@ <translation id="5328031682234198929">8</translation> <translation id="5329858601952122676">&Pašalinti</translation> <translation id="5330145655348521461">Šie failai atidaryti kitame darbalaukyje. Perkelkite failus <ph name="USER_NAME" /> (<ph name="MAIL_ADDRESS" />), kad peržiūrėtumėte juos.</translation> +<translation id="5330512191124428349">Gauti informacijos</translation> <translation id="5332624210073556029">Laiko juosta:</translation> <translation id="5333807720589685258">SIM kortelė bus visam laikui išjungta, jei negalėsite įvesti tinkamo PIN kodo atrakinimo rakto.</translation> @@ -3697,7 +3702,6 @@ <translation id="5892507820957994680">Nepaisoma įtaisytosios programinės įrangos nuskaitymo sąrašo ir įgalinamas GPU spartinimas esant nepalaikomoms sistemos konfigūracijoms.</translation> <translation id="5895138241574237353">Paleisti iš naujo</translation> <translation id="5895187275912066135">Išduota</translation> -<translation id="5898154795085152510">Serveris pateikė neteisingą kliento sertifikatą. <ph name="ERROR_NUMBER" /> klaida (<ph name="ERROR_NAME" />).</translation> <translation id="5900302528761731119">„Google“ profilio nuotrauka</translation> <translation id="590253956165195626">Siūlyti versti puslapius, kurie pateikiami ne skaitoma kalba.</translation> <translation id="5904093760909470684">Tarpinio serverio konfigūracija</translation> @@ -3752,6 +3756,8 @@ <translation id="5984222099446776634">Neseniai lankyta</translation> <translation id="5984814259619230127">„Smart Lock“ „Bluetooth“ mažai energijos naudojančio ryšio aptikimas</translation> <translation id="5986245990306121338">Jei įgalinta, skirtukų perjungiklis bus rodomas net tada, kai nustatymuose bus įjungta parinktis „Sujungti skirtukus ir programas“.</translation> +<translation id="5989712527536636369"><ph name="BEGIN_PARAGRAPH1" />Tai bendroji informacija apie jūsų įrenginį ir tai, kaip jį naudojate, pvz., akumuliatoriaus įkrovimo lygį, kaip dažnai naudojate programas ir tinklo ryšių (pvz., „Wi-Fi“ ar „Bluetooth“) kokybę ir naudojimo trukmę bei strigčių ataskaitas, kai kažkas veikia netinkamai. Ši informacija bus naudojama siekiant tobulinti „Google“ produktus ir paslaugas visiems. Dalis sukauptos informacijos taip pat bus naudinga partneriams, pvz., „Android“ kūrėjams, tobulinti jų programas ir produktus.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Šį nustatymą galite bet kada įjungti arba išjungti „Android“ programų nustatymuose. Tai nepaveiks įrenginio galimybės siųsti reikiamą informaciją, kad gautų svarbiausias paslaugas, pvz., sistemos naujinius ir saugos paslaugas.<ph name="END_PARAGRAPH2" /></translation> <translation id="5990198433782424697">Plėtiniai chrome:// URL</translation> <translation id="5990814808592353318">Neautomatinis slaptažodžio generavimas.</translation> <translation id="5991049340509704927">Didinti</translation> @@ -3765,6 +3771,7 @@ <translation id="6005695835120147974">Medijos maršruto parinktuvas</translation> <translation id="6007237601604674381">Nepavyko perkelti. <ph name="ERROR_MESSAGE" /></translation> <translation id="6008241731410823808">Siunčiamos hipersaitų ryšio patikros užklausos.</translation> +<translation id="6011449291337289699">Išvalyti svetainės duomenis</translation> <translation id="6015796118275082299">Metai</translation> <translation id="6016551720757758985">„Powerwash“ grąžinant ankstesnę versiją patvirtinimas</translation> <translation id="6016809788585079594">Paskutinį kartą ištarkite „Ok Google“</translation> @@ -3954,7 +3961,6 @@ <translation id="6276301056778294989">Įsitikinkite, kad įrenginyje rodomas tas pats kodas.</translation> <translation id="6277105963844135994">Baigėsi tinklo skirtasis laikas</translation> <translation id="6277518330158259200">S&ukurti ekrano kopiją</translation> -<translation id="6278428485366576908">Tema</translation> <translation id="6279183038361895380">Paspauskite |<ph name="ACCELERATOR" />|, kad būtų rodomas žymeklis</translation> <translation id="6280215091796946657">Prisijunkite naudodami kitą paskyrą</translation> <translation id="6280912520669706465">ARC</translation> @@ -4206,6 +4212,7 @@ <translation id="6607272825297743757">Failo informacija</translation> <translation id="6607831829715835317">Daugiau įrank&ių</translation> <translation id="6608140561353073361">Visi slapukai ir svetainės duomenys...</translation> +<translation id="6610183966322615106">Klaida pridedant spausdintuvą</translation> <translation id="6610610633807698299">Įvesti URL...</translation> <translation id="6612358246767739896">Apsaugotas turinys</translation> <translation id="6615455863669487791">Rodyti</translation> @@ -4269,7 +4276,6 @@ <translation id="6708242697268981054">Pradžia:</translation> <translation id="6709357832553498500">Prisijungti naudojant „<ph name="EXTENSIONNAME" />“</translation> <translation id="6710213216561001401">Ankstesnis</translation> -<translation id="6712158998835983046">Rodyti viską, su animacija</translation> <translation id="6718273304615422081">Glaudinama...</translation> <translation id="671928215901716392">Užrakinti ekraną</translation> <translation id="6721972322305477112">&Failas</translation> @@ -4543,7 +4549,6 @@ <translation id="7088434364990739311">Nepavyko pradėti naujinio patikrinimo (klaidos kodas <ph name="ERROR" />).</translation> <translation id="708856090370082727">Įgalinti OSK perslinkimo palaikymą. Kai ši žymė įjungta, OSK pakeis tik matomos peržiūros srities dydį.</translation> <translation id="7088674813905715446">Administratorius nustatė šio įrenginio būseną į „neteikiama“. Kad galėtumėte jį užregistruoti, nurodykite administratoriui nustatyti įrenginio būseną į „laukiama“.</translation> -<translation id="7089609847854449639">Saugyklos tvarkytuvė</translation> <translation id="708969677220991657">Leidžiamos užklausos į vietinę prieglobą per HTTPS, net kai pateiktas netinkamas sertifikatas.</translation> <translation id="7092106376816104">Iššokančiųjų langų išimtys</translation> <translation id="7093866338626856921">Keistis duomenimis su įrenginiais, kurių pavadinimai: <ph name="HOSTNAMES" /></translation> @@ -4583,7 +4588,7 @@ <translation id="715118844758971915">Įprasti spausdintuvai</translation> <translation id="7154130902455071009">Pakeiskite pradžios puslapį į: <ph name="START_PAGE" /></translation> <translation id="7155171745945906037">Esama nuotrauka iš fotoaparato arba failo</translation> -<translation id="715568033737470079">Nurodykite PPAPI papildinius, kurie bus vykdomi taikant „Win32k“ užrakinimo smėlio dėžės politiką (tik 10 ir naujesnių versijų „Windows“).</translation> +<translation id="7155226869555939647">Visada atidaryti „<ph name="APPLICATION" />“ nuorodas</translation> <translation id="7156235233373189579">Šis failas skirtas asmeniniam kompiuteriui, kuriame naudojama „Windows“ programinė įranga. Jis nesuderinamas su jūsų įrenginiu, kuriame veikia „Chrome“ OS. Tinkamos pakaitinės programos ieškokite <ph name="BEGIN_LINK" />„Chrome“ internetinėje parduotuvėje<ph name="END_LINK" />. <ph name="BEGIN_LINK_HELP" />Sužinokite daugiau<ph name="END_LINK_HELP" /></translation> <translation id="7157063064925785854">Spustelėdami „Tęsti“ sutinkate su <ph name="LEGAL_DOC_LINK_TEXT_1" />, <ph name="LEGAL_DOC_LINK_TEXT_2" />, <ph name="LEGAL_DOC_LINK_TEXT_3" /> ir <ph name="LEGAL_DOC_LINK_TEXT_4" />.</translation> <translation id="7158238151765743968">Vis dar bandoma užmegzti ryšį su „<ph name="DEVICE_NAME" />“.</translation> @@ -4598,6 +4603,7 @@ <translation id="7175353351958621980">Įkelta iš:</translation> <translation id="7180611975245234373">Atnaujinti</translation> <translation id="7180865173735832675">Tinkinti</translation> +<translation id="7181387261278441780">Išvalyti svetainę ir nustatyti iš naujo</translation> <translation id="7185078796915954712">1.3 versijos TLS</translation> <translation id="7185690883425432021">Slepiami neaktyvių skirtukų uždarymo mygtukai, kai skirtukų juostelėje įjungtas krūvos režimas.</translation> <translation id="7186088072322679094">Laikyti įrankių juostoje</translation> @@ -4630,7 +4636,6 @@ <translation id="7223775956298141902">Nėra įdiegtų plėtinių :-(</translation> <translation id="7224023051066864079">Potinklio kaukė:</translation> <translation id="7225179976675429563">Trūksta tinklo tipo</translation> -<translation id="7230191962699768124">Rodyti viską, be animacijos</translation> <translation id="7230787553283372882">Tinkinkite teksto dydį</translation> <translation id="7231224339346098802">Skaičiumi nurodykite, kiek kopijų spausdinti (1 ar daugiau).</translation> <translation id="7238585580608191973">SHA-256 kontrolinis kodas</translation> @@ -4762,7 +4767,6 @@ <translation id="7409233648990234464">Paleisti iš naujo ir paleisti „Powerwash“</translation> <translation id="7409836189476010449">Vykdyti „Flash“</translation> <translation id="7410344089573941623">Klausti, jei <ph name="HOST" /> nori pasiekti fotoaparatą ir mikrofoną</translation> -<translation id="7411343637221933631">{NUM_COOKIES,plural, =1{1 iš šios svetainės}one{# iš šios svetainės}few{# iš šios svetainės}many{# iš šios svetainės}other{# iš šios svetainės}}</translation> <translation id="7412226954991670867">GPU atmintis</translation> <translation id="7416362041876611053">Nežinoma tinklo klaida.</translation> <translation id="7417453074306512035">Etiopiška klaviatūra</translation> @@ -4884,6 +4888,7 @@ <translation id="756445078718366910">Atidaryti naršyklės langą</translation> <translation id="7564847347806291057">Baigti procesą</translation> <translation id="7566723889363720618">F12</translation> +<translation id="7567314848159753396">Slapukas: <ph name="NAME" /></translation> <translation id="756809126120519699">Išvalyti „Chrome“ duomenys</translation> <translation id="7568790562536448087">Atnaujinama</translation> <translation id="7573172247376861652">Akumuliatoriaus įkrovimas</translation> @@ -4924,6 +4929,7 @@ <translation id="7626009897377900107">Slaptažodžio generavimas</translation> <translation id="7627262197844840899">Šioje svetainėje negalima naudoti „MasterCard“.</translation> <translation id="7627790789328695202">Oi, „<ph name="FILE_NAME" />“ jau yra. Pervardykite jį ir bandykite dar kartą.</translation> +<translation id="7628127343934101653">Atidaryti PDF failus numatytoje PDF peržiūros priemonės programoje.</translation> <translation id="762917759028004464">Šiuo metu pagrindinė naršyklė „<ph name="BROWSER_NAME" />“</translation> <translation id="7629536005696009600">Leisti atitinkamas svetaines užpildyti „Android“ programų išsaugotais prisijungimo duomenimis.</translation> <translation id="7629827748548208700">Skirtukas: <ph name="TAB_NAME" /></translation> @@ -5152,6 +5158,7 @@ <translation id="7957513156576779045">Įjunkite „Bluetooth“, kad leistumėte susieti</translation> <translation id="7957615753207896812">Atidaryti klaviatūros įrenginio nustatymus</translation> <translation id="7959074893852789871">Faile buvo keli sertifikatai; kai kurie iš jų nebuvo importuoti:</translation> +<translation id="7959700692661109221"><ph name="BEGIN_PARAGRAPH" />„Google“ vietovės paslauga naudoja įvairius išteklius, pvz., „Wi-Fi“, kad padėtų greičiau ir tiksliau nustatyti įrenginio vietovę. Kai įjungiate „Google“ vietovių paslaugas, įrenginyje nustatomas režimas, kuris teikdamas vietovės informaciją naudoja „Wi-Fi“. Galite bet kada išjungti šią funkciją vietovės nustatymuose.<ph name="END_PARAGRAPH" /></translation> <translation id="7961015016161918242">Niekada</translation> <translation id="7964089325405904043">Slaptažodžio importavimas ir eksportavimas</translation> <translation id="7965010376480416255">Bendrinama atmintis</translation> @@ -5302,6 +5309,7 @@ <translation id="8146793085009540321">Nepavyko prisijungti. Susisiekite su administratoriumi arba bandykite dar kartą.</translation> <translation id="8148264977957212129">„Pinyin“ įvesties metodas</translation> <translation id="8148913456785123871">Rodyti „Google“ dabar korteles paleidimo priemonėje</translation> +<translation id="8150391391298684512">Išjungti „Windows Runtime MIDI“ API</translation> <translation id="8151185429379586178">Kūrėjo įrankiai</translation> <translation id="8151638057146502721">Konfigūruoti</translation> <translation id="8151639108075998630">Įgalinti svečių naršymą</translation> @@ -5584,6 +5592,7 @@ <translation id="8532294913309524834">Kitos kalbos pagal nuostatas.</translation> <translation id="8535005006684281994">„Netscape“ sertifikato atnaujinimo URL</translation> <translation id="8539727552378197395">Ne (HttpOnly)</translation> +<translation id="8541084862688000575">Automatiškai įkelti „Android“ programas</translation> <translation id="8543181531796978784">Galite <ph name="BEGIN_ERROR_LINK" />pranešti apie aptikimo problemą<ph name="END_ERROR_LINK" /> arba, jei suprantate saugos riziką, galite <ph name="BEGIN_LINK" />apsilankyti šioje nesaugioje svetainėje<ph name="END_LINK" />.</translation> <translation id="8545107379349809705">Slėpti informaciją...</translation> <translation id="8545211332741562162">Įgalinti tinklalapius naudoti bandomosios „JavaScript“ funkcijas.</translation> @@ -5611,7 +5620,6 @@ <translation id="8569764466147087991">Pasirinkite norimą atidaryti failą</translation> <translation id="8571032220281885258">Kai pasakysite „Ok Google“, „Chrome“ ieškos kitų jūsų pasakytų žodžių.</translation> <translation id="8571108619753148184">4 serveris</translation> -<translation id="8572832761467613633">Tik „Flash“</translation> <translation id="8572981282494768930">Neleisti svetainėms pasiekti fotoaparato ir mikrofono</translation> <translation id="8574234089711453001">Leisti rodyti atsisiuntimo mygtuką atidarant puslapį su medijos URL.</translation> <translation id="857779305329188634">Įgalinti eksperimentinio QUIC protokolo palaikymą.</translation> @@ -5633,6 +5641,7 @@ <translation id="8600929685092827187">Pažadinti gavus paketų</translation> <translation id="8601206103050338563">TLS WWW kliento tapatybės nustatymas</translation> <translation id="8602851771975208551">Kita jūsų kompiuteryje esanti programa pridėjo programą, kuri gali pakeisti „Chrome“ veikimo būdą.</translation> +<translation id="8603912787021349466">Leisti prisijungus automatiškai paleisti „Android“ programas.</translation> <translation id="8605428685123651449">„SQLite“ atmintis</translation> <translation id="8605503133013456784">Nepavyko atsijungti ir atsieti nuo „<ph name="DEVICE_NAME" />“.</translation> <translation id="8606726445206553943">Naudoti MIDI įrenginius</translation> @@ -5985,6 +5994,7 @@ <translation id="9053965862400494292">Bandant nustatyti sinchronizavimą įvyko klaida.</translation> <translation id="9056034633062863292">„Chromebox“ atnaujinamas</translation> <translation id="9056810968620647706">Nerasta jokių atitikčių.</translation> +<translation id="9057119625587205566">Netoliese nerasta jokių spausdintuvų</translation> <translation id="9059868303873565140">Būsenos meniu</translation> <translation id="9064142312330104323">„Google“ profilio nuotrauka (įkeliama)</translation> <translation id="9064275926664971810">Įgalinti automatinį pildymą, kad būtų galima užpildyti žiniatinklio formas vienu paspaudimu</translation> @@ -5995,6 +6005,7 @@ <translation id="9067401056540256169">Naudojant šią žymą, „Chrome“ yra nesaugi. Naudokite ją, tik jei žinote, ką ji daro. Atminkite, kad ši žyma gali būti pašalinta neįspėjus. Jei ji įgalinta, HTTPS kilmės kadrai gali naudoti „WebSocket“ su nesaugiu URL (ws://).</translation> <translation id="9068931793451030927">Kelias:</translation> <translation id="9070219033670098627">Perjungti asmenį</translation> +<translation id="9070940116164932228">Apriboti brangius foninius laikmačius</translation> <translation id="907148966137935206">Neleisti jokiai svetainei rodyti iššokančiųjų langų (rekomenduojama)</translation> <translation id="9072550133391925347">„<ph name="PASSWORD_MANAGER_BRAND" />“ automatiškai prijungia jus tinkamose svetainėse ir programose naudodama išsaugotus slaptažodžius.</translation> <translation id="9073281213608662541">PAP</translation> @@ -6029,6 +6040,7 @@ <translation id="9112614144067920641">Pasirinkite naują PIN kodą.</translation> <translation id="9112748030372401671">Darbalaukio fono keitimas</translation> <translation id="9112987648460918699">Rasti...</translation> +<translation id="9114663181201435112">Lengvai prisijunkite</translation> <translation id="9115487443206954631">„Cast“ įrenginių tvarkymas</translation> <translation id="9115675100829699941">&Žymės</translation> <translation id="9121814364785106365">Atidaryti kaip susegtą skirtuką</translation> @@ -6123,7 +6135,6 @@ <translation id="952992212772159698">Nesuaktyvinta</translation> <translation id="960719561871045870">Operacijos ženklo kodas</translation> <translation id="960987915827980018">Liko apie 1 val.</translation> -<translation id="962778376131245616">Rodyti tik nesaugius, su animacija</translation> <translation id="96421021576709873">„Wi-Fi“ ryšio tinklas</translation> <translation id="965490406356730238">Įgalinti aparatinės įrangos paspartintą užfiksuoto kadro „mjpeg“ iššifravimą, jei įmanoma.</translation> <translation id="968174221497644223">Programos talpykla</translation>
diff --git a/chrome/app/resources/generated_resources_lv.xtb b/chrome/app/resources/generated_resources_lv.xtb index 45fd390e..383fcbb 100644 --- a/chrome/app/resources/generated_resources_lv.xtb +++ b/chrome/app/resources/generated_resources_lv.xtb
@@ -18,7 +18,6 @@ <translation id="1029317248976101138">Tālummaiņa</translation> <translation id="1029595648591494741">Vai izmēģināsiet “<ph name="EXTENSION_NAME" />”?</translation> <translation id="1031362278801463162">Notiek priekšskatījuma ielāde</translation> -<translation id="1031460590482534116">Mēģinot saglabāt klienta sertifikātu, radās kļūda. Kļūda <ph name="ERROR_NUMBER" /> (<ph name="ERROR_NAME" />).</translation> <translation id="1031573127485938293">Vaicāt (atbilstoši politikai)</translation> <translation id="103279545524624934">Atbrīvojiet vietu diskā, lai varētu palaist Android lietotnes.</translation> <translation id="1033780634303702874">Piekļūt jūsu seriālajām ierīcēm</translation> @@ -101,6 +100,7 @@ <translation id="1128591060186966949">Meklētājprogrammas rediģēšana</translation> <translation id="1128987120443782698">Atmiņas ierīces ietilpība ir <ph name="DEVICE_CAPACITY" />. Ievietojiet SD karti vai USB atmiņas karti, kuras ietilpība ir vismaz 4 GB.</translation> <translation id="1137135726305341424">domContentLoaded un visu resursu ielāde sākta pirms domContentLoaded (galvenais ietvars un tās pašas izcelsmes iframes).</translation> +<translation id="1138663153846032155">Priekšroka HTML, nevis Flash</translation> <translation id="1140351953533677694">Piekļūt jūsu Bluetooth un seriālajām ierīcēm</translation> <translation id="114140604515785785">Paplašināj. direktorijs:</translation> <translation id="1143142264369994168">Sertifikāta parakstītājs</translation> @@ -252,6 +252,7 @@ <translation id="1351692861129622852">Notiek <ph name="FILE_COUNT" /> failu importēšana...</translation> <translation id="1352103415082130575">Taju valodas tastatūra (Pattachote)</translation> <translation id="1353686479385938207"><ph name="PROVIDER_NAME" />: <ph name="NETWORK_NAME" /></translation> +<translation id="1353946958707294039">Materiāla dizaina krātuves pārvaldnieks</translation> <translation id="1353966721814789986">Sākumlapas</translation> <translation id="1354868058853714482">Adobe Reader versija ir novecojusi un var nebūt droša.</translation> <translation id="1355408554203439639">3D programmatūras rastrētājs</translation> @@ -423,7 +424,6 @@ <translation id="1533920822694388968">TV līdzināšana</translation> <translation id="15373452373711364">Liels peles kursors</translation> <translation id="1543284117603151572">Importētas no pārlūkprogrammas Edge</translation> -<translation id="1544350195767834591">{NUM_COOKIES,plural, =1{1 no citām vietnēm}zero{# no citām vietnēm}one{# no citām vietnēm}other{# no citām vietnēm}}</translation> <translation id="1545177026077493356">Automātiskais kioska režīms</translation> <translation id="1545786162090505744">URL ar zīmēm % vaicājuma vietā</translation> <translation id="1546280085599573572">Šis paplašinājums mainīja iestatījumu, kura lapa tiek parādīta, noklikšķinot uz pogas Sākums.</translation> @@ -447,7 +447,6 @@ <translation id="1559235587769913376">Ievadīt unikoda rakstzīmes</translation> <translation id="1561092721008294962">HarfBuzz lietotāja saskarne tekstam</translation> <translation id="1566049601598938765">Vietne</translation> -<translation id="1566958206723629112">Flash un PDF</translation> <translation id="1567723158593978621">Ja šī opcija ir iespējota, tiks izmantota jauna pierakstīšanās plūsma ar GAIA paroli, lai pierakstītos pārlūkprogrammā.</translation> <translation id="1567993339577891801">JavaScript konsole</translation> <translation id="1568323446248056064">Atvērt attēlojuma ierīces iestatījumus</translation> @@ -576,7 +575,6 @@ <translation id="1723940674997333416">Nedroša protokola WebSocket atļaušana “https” avotiem.</translation> <translation id="1725149567830788547">Rādīt &vadīklas</translation> <translation id="172612876728038702">Notiek TPM iestatīšana. Tā kā tas var aizņemt dažas minūtes, esiet pacietīgs.</translation> -<translation id="1727135806684246609">Materiālās drošības daudzvārdu slēdzis</translation> <translation id="1729533290416704613">Tas nosaka arī to, kāda lapa tiks rādīta, kad meklēsiet, izmantojot universālo lodziņu.</translation> <translation id="1731346223650886555">Semikols</translation> <translation id="1731589410171062430">Kopā: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /> (<ph name="NUMBER_OF_PAGES" /> <ph name="PAGE_OR_PAGES_LABEL" />)</translation> @@ -873,6 +871,7 @@ <translation id="218492098606937156">Iespējot skārienekrāna notikumus</translation> <translation id="2187317261103489799">Noteikt (pēc noklusējuma)</translation> <translation id="2187895286714876935">Servera sertifikāta importēšanas kļūda</translation> +<translation id="2188881192257509750">Atvērt lietojumprogrammu <ph name="APPLICATION" /></translation> <translation id="2190069059097339078">Wi-Fi akreditācijas datu ieguvējs</translation> <translation id="219008588003277019">Native Client modulis: <ph name="NEXE_NAME" /></translation> <translation id="2190355936436201913">(tukšs)</translation> @@ -991,6 +990,7 @@ <translation id="2326606747676847821">Pārlūkojiet inkognito režīmā</translation> <translation id="2326931316514688470">&Atkārtoti ielādēt lietotni</translation> <translation id="2327492829706409234">Iespējot lietotni</translation> +<translation id="2328054044222305089">Veicot šo darbību, tiks dzēsti ierīcē saglabātie dati no vietnes <ph name="SITE" /> un tiks atiestatītas jūsu piešķirtās palaišanas atļaujas. Vai vēlaties turpināt?</translation> <translation id="2329597144923131178">Pierakstieties, lai grāmatzīmes, vēsture, paroles u.c. būtu pieejamas visās jūsu ierīcēs.</translation> <translation id="2332131598580221120">Skatīt veikalā</translation> <translation id="2332742915001411729">Atiestatīt noklusējuma iestatījumus</translation> @@ -1266,7 +1266,6 @@ <translation id="2675358154061544447">Eksperimentāls atbalsts iframe tagu renderēšanai vairākās vietnēs, izmantojot atsevišķus procesus. Šajā režīmā dokumentiem tiks izmantots renderēts process tikai tad, ja tie ir no vienas vietnes.</translation> <translation id="2676946222714718093">Tiek atskaņots šeit:</translation> <translation id="2678063897982469759">Atkārtoti iespējot</translation> -<translation id="2678246812096664977">Visi spraudņi</translation> <translation id="2679385451463308372">Drukāt ar sistēmas dialoglodziņu...</translation> <translation id="2680208403056680091">Jūsu interneta savienojums tiek pārvaldīts</translation> <translation id="268053382412112343">Vēsture</translation> @@ -1440,7 +1439,6 @@ <translation id="287286579981869940">Pievienot pakalpojumu sniedzēju <ph name="PROVIDER_NAME" />...</translation> <translation id="2872961005593481000">Beidzēt</translation> <translation id="2875698561019555027">(Chrome kļūdu lapas)</translation> -<translation id="2879560882721503072">Sekmīgi saglabāts klienta sertifikāts, ko izsniedza <ph name="ISSUER" /></translation> <translation id="288024221176729610">Čehu valoda</translation> <translation id="288042212351694283">Piekļūstiet savām Universal 2nd Factor ierīcēm</translation> <translation id="2881966438216424900">Pēdējoreiz piekļūts:</translation> @@ -1589,6 +1587,7 @@ <translation id="3057861065630527966">Dublēt fotoattēlus un videoklipus</translation> <translation id="3058212636943679650">Ja kādreiz jums vajadzēs atjaunot datora operētājsistēmu, būs nepieciešama atkopšanas SD karte vai USB atmiņas karte.</translation> <translation id="305932878998873762">Vienkāršā HTTP kešatmiņa ir jauna veida kešatmiņa. To izmantojot, vieta diskā tiek piešķirta, pamatojoties uz failu sistēmu.</translation> +<translation id="3060251871394327123">Veicot šo darbību, tiks dzēsti ierīcē saglabātie dati no vietnes <ph name="SITE" />. Vai vēlaties turpināt?</translation> <translation id="3061650404498811439">Iespējot piekļuvi emocijzīmēm, rokraksta vai balss ievadei no IME izvēlnes.</translation> <translation id="3062606427884046423">Izmantojiet Android MediaStyle paziņojumus Chrome satura paziņojumiem.</translation> <translation id="3063844757726132584">Piekļūstiet visām savām lietotnēm no šīs ērtās palaišanas programmas. Spēlējiet spēles, piedalieties video tērzēšanā, klausieties mūziku, rediģējiet dokumentus, kā arī iegūstiet vairāk lietotņu.</translation> @@ -1638,6 +1637,7 @@ <translation id="3123569374670379335">(Uzraudzīts)</translation> <translation id="3124111068741548686">USER apstrādātāji</translation> <translation id="3126026824346185272">Ctrl</translation> +<translation id="3127156390846601284">Veicot šo darbību, tiks dzēsti ierīcē saglabātie dati no visām parādītajām vietnēm. Vai vēlaties turpināt?</translation> <translation id="312759608736432009">Ierīces ražotājs:</translation> <translation id="3127919023693423797">Notiek autentiskuma noteikšana...</translation> <translation id="3128230619496333808">6. cilne</translation> @@ -1737,7 +1737,6 @@ <translation id="3264544094376351444">Sans-Serif fonts</translation> <translation id="3264547943200567728">Neizdevās iestatīt Chromebox tīklu</translation> <translation id="3265459715026181080">Aizvērt logu</translation> -<translation id="3267271790328635957">Tikai PDF</translation> <translation id="3267726687589094446">Atļaut vairāku failu automātisku lejupielādēšanu arī turpmāk</translation> <translation id="3267998849713137817">Izmaiņu veikšanas laiks</translation> <translation id="3268451620468152448">Atvērtās cilnes</translation> @@ -1983,6 +1982,7 @@ <translation id="3574210789297084292">pierakstīties</translation> <translation id="3574305903863751447"><ph name="CITY" />, <ph name="STATE" /> <ph name="COUNTRY" /></translation> <translation id="357479282490346887">Lietuviešu valoda</translation> +<translation id="3575927481544652747">Atspējot Windows Runtime MIDI API saskarnei WebMIDI, kas operētājsistēmā Windows 10 un jaunākās versijās pēc noklusējuma ir iespējots.</translation> <translation id="3576324189521867626">Veiksmīgi instalēta</translation> <translation id="3578331450833904042">Noklusējums (uztvert visu)</translation> <translation id="3578594933904494462">Šīs cilnes saturs tiek kopīgots.</translation> @@ -2036,8 +2036,6 @@ <translation id="3627320433825461852">Atlikusi mazāk nekā 1 minūte</translation> <translation id="3627588569887975815">Atvērt saiti inkognito logā</translation> <translation id="3627671146180677314">Netscape sertifikāta atjaunošanas laiks</translation> -<translation id="3629326610814700057">Iespējo krātuves pārvaldnieku, lai pārvaldītu lokālo krātuvi.</translation> -<translation id="3630337581925712713"><ph name="PERMISSION_TYPE_LABEL" />:</translation> <translation id="3631337165634322335">Tālāk redzamie izņēmumi attiecas tikai uz pašreizējo inkognito režīma sesiju.</translation> <translation id="3633586230741134985">Lietojumprogrammu palaidēja iestatījumi</translation> <translation id="3633997706330212530">Ja nepieciešams, šos pakalpojumus var atspējot.</translation> @@ -2060,7 +2058,8 @@ <translation id="3654045516529121250">Lasīt jūsu piekļuves iestatījumus</translation> <translation id="3654092442379740616">Sinhronizācijas kļūda: <ph name="PRODUCT_NAME" /> ir novecojis un ir jāatjaunina.</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{Tai ir pastāvīga piekļuve vienam failam.}zero{Tai ir pastāvīga piekļuve # failiem.}one{Tai ir pastāvīga piekļuve # failam.}other{Tai ir pastāvīga piekļuve # failiem.}}</translation> -<translation id="3657468915905674858">PPAPI Win32k bloķēšanas iespējošana</translation> +<translation id="365793796291733849"><ph name="BEGIN_PARAGRAPH1" />Ieslēdzot automātisko dublēšanu, ierīces dati un lietotņu dati tiek periodiski saglabāti privātā mapē Google diskā. Lietotņu dati var būt jebkādi lietotņu saglabātie dati (atkarībā no izstrādātāja iestatījumiem), tostarp potenciāli sensitīvi dati, piemēram, kontaktpersonas, ziņojumi un fotoattēli.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Dublētie dati netiks ieskaitīti Diska krātuves kvotā. Netiks dublēti lieli faili, kā arī faili, kurus izstrādātāji ir izvēlējušies neiekļaut pakalpojumā.<ph name="END_PARAGRAPH2" /></translation> <translation id="3660234220361471169">Neuzticami</translation> <translation id="3665589677786828986">Pārlūkā Chrome tika konstatēts, ka daži jūsu iestatījumi tika bojāti citā programmā, tāpēc šie iestatījumi tika atiestatīti uz sākotnējiem noklusējuma iestatījumiem.</translation> <translation id="3665842570601375360">Drošība:</translation> @@ -2115,6 +2114,7 @@ <translation id="3733127536501031542">SSL serveris ar palielināšanu</translation> <translation id="3736520371357197498">Ja apzināties drošības risku, varat <ph name="BEGIN_LINK" />apmeklēt šo nedrošo vietni<ph name="END_LINK" />, pirms ir noņemtas bīstamās programmas.</translation> <translation id="3738924763801731196"><ph name="OID" />:</translation> +<translation id="3739254215541673094">Vai atvērt lietojumprogrammu <ph name="APPLICATION" />?</translation> <translation id="3739798227959604811">Kavēšanās pirms atkārtošanas:</translation> <translation id="3741158646617793859"><ph name="DEVICE_NAME" /> ierīce tagad tiks rādīta administratora konsolē</translation> <translation id="3741243925913727067">Dublējiet savas multivides ierīces fotoattēlus un videoklipus Google diskā.</translation> @@ -2353,7 +2353,6 @@ <translation id="4058793769387728514">Pārbaudīt dokumentu tagad</translation> <translation id="4059285154003114015">&Drukāt rāmi...</translation> <translation id="406070391919917862">Fona lietotnes</translation> -<translation id="4061502419206152498">Rādīt tikai nedrošu statusu bez animācijas</translation> <translation id="4062251648694601778">Izbaudiet darbu ar <ph name="SHORT_PRODUCT_NAME" /> ierīci. Vai jums ir jautājumi? Vienmēr varat saņemt palīdzību, statusa teknē noklikšķinot uz “?”.</translation> <translation id="4065876735068446555">Iespējams, izmantotajā tīklā (<ph name="NETWORK_ID" />) tiks prasīts apmeklēt pieteikšanās lapu.</translation> <translation id="4068506536726151626">Šajā lapā ir elementi no šādām vietnēm, kas izseko jūsu atrašanās vietu:</translation> @@ -2392,7 +2391,6 @@ <translation id="4101878899871018532">Paroļu pārvaldnieks nepiedāvās saglabāt akreditācijas datus, kas tiek izmantoti sinhronizēšanai.</translation> <translation id="410351446219883937">Automātiskā atskaņošana</translation> <translation id="4104163789986725820">E&ksportēt...</translation> -<translation id="4105523032910086267">Materiāla dizainā iestata drošības daudzvārdu slēdža animāciju un redzamību.</translation> <translation id="4105563239298244027">Izmantojot pakalpojumu Google disks, iegūsiet 1 TB lielu bezmaksas krātuvi</translation> <translation id="4109135793348361820">Pārvietot logu uz šī lietotāja darbvirsmu: <ph name="USER_NAME" /> (<ph name="USER_EMAIL" />)</translation> <translation id="4110342520124362335"><ph name="DOMAIN" /> sīkfaili ir bloķēti.</translation> @@ -2443,6 +2441,7 @@ <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="4188447344915957833">Materiāla dizaina iestatījumos iespējo krātuves pārvaldnieku.</translation> <translation id="4189406272289638749">Šo iestatījumu kontrolē paplašinājums <b><ph name="EXTENSION_NAME" /></b>.</translation> <translation id="4193154014135846272">Google dokuments</translation> <translation id="4193182321948161343">Materiāla dizaina lietotāju pārziņa iespējošana</translation> @@ -2650,6 +2649,7 @@ <translation id="4508765956121923607">Skatīt av&otu</translation> <translation id="4509017836361568632">Atmest fotoattēlu</translation> <translation id="4509345063551561634">Atraans vieta:</translation> +<translation id="4513946894732546136">Atsauksmes</translation> <translation id="4514542542275172126">Izveidot jaunu uzraudzītā lietotāja profilu</translation> <translation id="4514914692061505365">Piespiedu kārtā izmantot ātro PNaCl tulkotāju Subzero visiem PEXE failiem.</translation> <translation id="451515744433878153">Noņemt</translation> @@ -2748,6 +2748,7 @@ <translation id="4656293982926141856">Šajā datorā</translation> <translation id="4656631038341342120">Iespējot VR čaulu, ja tā ir pieejama šai ierīcei.</translation> <translation id="4657031070957997341">Vienmēr atļaut izmantot spraudņus vietnē <ph name="HOST" /></translation> +<translation id="466008749075469935">Iespējo iejaukšanos, lai ierobežotu fona taimeru centrālā procesora lietojumu līdz 1%.</translation> <translation id="4663254525753315077">Kad iespējams, pārpildes ritināmā elementa ritināmais saturs tiek izvietots saliktajā slānī, lai ritināšana būtu ātrāka.</translation> <translation id="4664482161435122549">PKCS #12 eksporta kļūda</translation> <translation id="4665014895760275686">Ražotājs</translation> @@ -2816,6 +2817,7 @@ <translation id="4749157430980974800">Gruzīnu tastatūra</translation> <translation id="4750394297954878236">Ieteikumi</translation> <translation id="475088594373173692">Pirmais lietotājs</translation> +<translation id="4750892496809949692">Dot priekšroku HTML saturam, spraudņu sarakstā paslēpjot Flash.</translation> <translation id="4750917950439032686">Jūsu informācija (piemēram, paroles vai kredītkaršu numuri) ir privāta, kad tā tiek nosūtīta uz šo vietni.</translation> <translation id="4753602155423695878">Android tālruņa lapas ielādes norises joslas animācija</translation> <translation id="4755240240651974342">Somu valodas tastatūra</translation> @@ -3090,6 +3092,7 @@ <translation id="5119450342834678097">Opcija “Pieprasīt planšetdatoram paredzētu vietni” iestatījumu izvēlnē</translation> <translation id="5120068803556741301">Trešās puses ievades metode</translation> <translation id="5120421890733714118">Uzticēties šim sertifikātam, lai identificētu vietnes.</translation> +<translation id="5120516977819314347">PIN vai parole nav pareiza.</translation> <translation id="5121130586824819730">Cietais disks ir pilns. Saglabājiet citā atrašanās vietā vai atbrīvojiet vietu cietajā diskā.</translation> <translation id="5125751979347152379">Nederīgs URL.</translation> <translation id="5127881134400491887">Pārvaldīt tīkla savienojumus</translation> @@ -3097,6 +3100,7 @@ <translation id="512903556749061217">pievienota</translation> <translation id="5129301143853688736">Jūsu savienojums ar šo vietni nav privāts. Uzbrucēji var mēģināt nozagt jūsu informāciju (piemēram, fotoattēlus, paroles, ziņojumus vai kredītkaršu datus) no domēna <ph name="DOMAIN" />.</translation> <translation id="5129662217315786329">Poļu valoda</translation> +<translation id="5131347545782851480">PDF dokumenti</translation> <translation id="5134856901811723984">Materiāla dizains Chrome OS sistēmas UI</translation> <translation id="5135533361271311778">Nevarēja izveidot grāmatzīmes vienumu.</translation> <translation id="5136529877787728692">F7</translation> @@ -3265,6 +3269,7 @@ <translation id="5328031682234198929">8</translation> <translation id="5329858601952122676">Dzēst</translation> <translation id="5330145655348521461">Šie faili tika atvērti citā darbvirsmā. Lai skatītu šo darbvirsmu, izmantojiet profilu <ph name="USER_NAME" /> (<ph name="MAIL_ADDRESS" />).</translation> +<translation id="5330512191124428349">Iegūt informāciju</translation> <translation id="5332624210073556029">Laika josla:</translation> <translation id="5333807720589685258">SIM karte tiks neatgriezeniski atspējota, ja nevarēsiet ievadīt pareizo PIN atbloķēšanas atslēgu.</translation> @@ -3697,7 +3702,6 @@ <translation id="5892507820957994680">Ignorē iebūvētās programmatūras renderēšanas sarakstu un ļauj GPU paātrināšanu neatbalstītās sistēmas konfigurācijās.</translation> <translation id="5895138241574237353">Restartēt</translation> <translation id="5895187275912066135">Izsniegšanas datums</translation> -<translation id="5898154795085152510">Serveris atgrieza nederīgu klienta sertifikātu. Kļūda <ph name="ERROR_NUMBER" /> (<ph name="ERROR_NAME" />).</translation> <translation id="5900302528761731119">Google profila fotoattēls</translation> <translation id="590253956165195626">Piedāvāt tulkot lapas, kas nav manā valodā</translation> <translation id="5904093760909470684">Starpniekservera konfigurācija</translation> @@ -3752,6 +3756,8 @@ <translation id="5984222099446776634">Nesen apmeklētie</translation> <translation id="5984814259619230127">Smart Lock Bluetooth Low Energy noteikšana</translation> <translation id="5986245990306121338">Esot iespējotai šai opcijai, ciļņu pārslēdzējs tiek rādīts pat tad, ja iestatījumos ir iespējota opcija “Apvienot cilnes un lietotnes”.</translation> +<translation id="5989712527536636369"><ph name="BEGIN_PARAGRAPH1" />Šī ir vispārīga informācija par jūsu ierīci un tās lietošanu, piemēram, par akumulatora jaudas līmeni, lietotņu izmantošanas biežumu, tīkla savienojumu (piemēram, Wi‑Fi un Bluetooth) kvalitāti un ilgumu, kā arī par avāriju pārskatiem, kad ierīcē radušies traucējumi. Šī informācija tiks izmantota, lai uzlabotu ikviena lietotāja pieredzi, lietojot Google produktus un pakalpojumus. Daļa no apkopotās informācijas palīdzēs arī partneriem, piemēram, Android izstrādātājiem, veidot labākas lietotnes un produktus.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Šo funkciju varat jebkurā brīdī ieslēgt vai izslēgt Android lietotnē Iestatījumi. Tas neietekmēs jūsu ierīces spēju nosūtīt informāciju, kas nepieciešama, lai saņemtu vajadzīgos pakalpojumus, piemēram, sistēmas atjauninājumus un drošību.<ph name="END_PARAGRAPH2" /></translation> <translation id="5990198433782424697">Paplašinājumi chrome:// vietrāžos URL</translation> <translation id="5990814808592353318">Manuāla paroles ģenerēšana.</translation> <translation id="5991049340509704927">Palielināt</translation> @@ -3765,6 +3771,7 @@ <translation id="6005695835120147974">Multivides maršrutētājs</translation> <translation id="6007237601604674381">Pārvietošana neizdevās. <ph name="ERROR_MESSAGE" /></translation> <translation id="6008241731410823808">Tiek nosūtīti hipersaišu auditēšanas ehotesti.</translation> +<translation id="6011449291337289699">Vietnes datu notīrīšana</translation> <translation id="6015796118275082299">Gads</translation> <translation id="6016551720757758985">Apstiprinājums funkcijas Powerwash lietošanai, lai atjaunotu ierīcē iepriekšējo programmatūras versiju</translation> <translation id="6016809788585079594">Vēl vienu reizi sakiet frāzi “Ok Google”</translation> @@ -3954,7 +3961,6 @@ <translation id="6276301056778294989">Pārliecinieties, ka ierīcē tiek rādīts tāds pats kods.</translation> <translation id="6277105963844135994">Radās tīkla noildze.</translation> <translation id="6277518330158259200">I&egūt ekrānuzņēmumu</translation> -<translation id="6278428485366576908">Motīvs</translation> <translation id="6279183038361895380">Lai tiktu parādīts kursors, nospiediet |<ph name="ACCELERATOR" />|</translation> <translation id="6280215091796946657">Pierakstīties ar citu kontu</translation> <translation id="6280912520669706465">ARC</translation> @@ -4206,6 +4212,7 @@ <translation id="6607272825297743757">Faila informācija</translation> <translation id="6607831829715835317">Vairā&k rīku</translation> <translation id="6608140561353073361">Visi sīkfaili un vietņu dati...</translation> +<translation id="6610183966322615106">Kļūda, pievienojot printeri</translation> <translation id="6610610633807698299">Ievadīt URL...</translation> <translation id="6612358246767739896">Aizsargāts saturs</translation> <translation id="6615455863669487791">Rādīt man</translation> @@ -4269,7 +4276,6 @@ <translation id="6708242697268981054">Avots:</translation> <translation id="6709357832553498500">Izveidot savienojumu, izmantojot paplašinājumu <ph name="EXTENSIONNAME" /></translation> <translation id="6710213216561001401">Iepriekšējais</translation> -<translation id="6712158998835983046">Rādīt visus ar animāciju</translation> <translation id="6718273304615422081">Notiek tilpsaspiešana...</translation> <translation id="671928215901716392">Bloķēt ekrānu</translation> <translation id="6721972322305477112">&Fails</translation> @@ -4542,7 +4548,6 @@ <translation id="7088434364990739311">Neizdevās palaist atjauninājumu pārbaudi (kļūdas kods: <ph name="ERROR" />).</translation> <translation id="708856090370082727">Iespējojiet ekrāna tastatūras ritināšanu pāri malām. Ja šis karodziņš ir ieslēgts, ekrāna tastatūra mainīs tikai vizuālās skatvietas izmēru.</translation> <translation id="7088674813905715446">Administrators šai ierīcei ir piešķīris noņemšanas statusu. Lai tiktu aktivizēta šīs ierīces reģistrēšana, lūdziet administratoram piešķirt tai gaidīšanas statusu.</translation> -<translation id="7089609847854449639">Krātuves pārvaldnieks</translation> <translation id="708969677220991657">Tiek atļauta pieprasījumu sūtīšana uz lokālo saimniekdatoru, izmantojot HTTPS, pat ja tiek uzrādīts nederīgs sertifikāts.</translation> <translation id="7092106376816104">Uznirstošo logu izņēmumi</translation> <translation id="7093866338626856921">apmainīties datiem ar šādām ierīcēm: <ph name="HOSTNAMES" /></translation> @@ -4582,7 +4587,7 @@ <translation id="715118844758971915">Klasiskie printeri</translation> <translation id="7154130902455071009">Mainiet savu sākumlapu uz šo: <ph name="START_PAGE" /></translation> <translation id="7155171745945906037">Esošs fotoattēls no kameras vai faila</translation> -<translation id="715568033737470079">Norādiet PPAPI spraudņus, kas tiks izmantoti Win32k noslēgšanas smilškastes politikā (tikai Windows 10 un jaunākās versijās).</translation> +<translation id="7155226869555939647">Vienmēr atvērt lietojumprogrammas <ph name="APPLICATION" /> saites</translation> <translation id="7156235233373189579">Šis fails ir paredzēts datoram, kurā tiek izmantota Windows programmatūra. Tas nav saderīgs ar jūsu ierīci, kurā darbojas Chrome OS. Atbilstošu lietotni meklējiet <ph name="BEGIN_LINK" />Chrome interneta veikalā<ph name="END_LINK" />. <ph name="BEGIN_LINK_HELP" />Uzziniet vairāk<ph name="END_LINK_HELP" />.</translation> <translation id="7157063064925785854">Noklikšķinot uz “Turpināt”, jūs piekrītat noteikumiem šādos juridiskajos dokumentos: <ph name="LEGAL_DOC_LINK_TEXT_1" />, <ph name="LEGAL_DOC_LINK_TEXT_2" />, <ph name="LEGAL_DOC_LINK_TEXT_3" /> un <ph name="LEGAL_DOC_LINK_TEXT_4" />.</translation> <translation id="7158238151765743968">Joprojām notiek savienojuma izveide ar ierīci <ph name="DEVICE_NAME" />.</translation> @@ -4597,6 +4602,7 @@ <translation id="7175353351958621980">Ielādēts no:</translation> <translation id="7180611975245234373">Atsvaidzināt</translation> <translation id="7180865173735832675">Piemērot</translation> +<translation id="7181387261278441780">Vietnes datu notīrīšana un atiestatīšana</translation> <translation id="7185078796915954712">TLS 1.3</translation> <translation id="7185690883425432021">Neaktīvo ciļņu aizvēršanas pogas tiek paslēptas, ja ciļņu josla ir kaskādes režīmā.</translation> <translation id="7186088072322679094">Saglabāšana rīkjoslā</translation> @@ -4629,7 +4635,6 @@ <translation id="7223775956298141902">Diemžēl neviens paplašinājums nav instalēts :(</translation> <translation id="7224023051066864079">Apakštīkla maska:</translation> <translation id="7225179976675429563">Nav norādīts tīkla veids</translation> -<translation id="7230191962699768124">Rādīt visus bez animācijas</translation> <translation id="7230787553283372882">Pielāgojiet teksta lielumu.</translation> <translation id="7231224339346098802">Izmantojiet skaitli, lai norādītu, cik eksemplāri jādrukā (viens vai vairāki).</translation> <translation id="7238585580608191973">SHA-256 pirkstu nospiedums</translation> @@ -4761,7 +4766,6 @@ <translation id="7409233648990234464">Atkārtoti palaist un Powerwash</translation> <translation id="7409836189476010449">Aktivizēt Flash atskaņotāju</translation> <translation id="7410344089573941623">Vaicāt, ja vietne <ph name="HOST" /> vēlas piekļūt jūsu kamerai un mikrofonam</translation> -<translation id="7411343637221933631">{NUM_COOKIES,plural, =1{1 no šīs vietnes}zero{# no šīs vietnes}one{# no šīs vietnes}other{# no šīs vietnes}}</translation> <translation id="7412226954991670867">Grafiskā procesora atmiņa</translation> <translation id="7416362041876611053">Nezināma tīkla kļūda.</translation> <translation id="7417453074306512035">Gēzu rakstības tastatūra</translation> @@ -4883,6 +4887,7 @@ <translation id="756445078718366910">Atvērt pārlūkprogrammas logu</translation> <translation id="7564847347806291057">Pārtraukt procesu</translation> <translation id="7566723889363720618">F12</translation> +<translation id="7567314848159753396">Sīkfails: <ph name="NAME" /></translation> <translation id="756809126120519699">Chrome dati tika notīrīti</translation> <translation id="7568790562536448087">Notiek atjaunināšana</translation> <translation id="7573172247376861652">Akumulatora uzlāde</translation> @@ -4923,6 +4928,7 @@ <translation id="7626009897377900107">Paroles ģenerēšana</translation> <translation id="7627262197844840899">Šajā vietnē netiek pieņemti maksājumi ar MasterCard karti.</translation> <translation id="7627790789328695202">Diemžēl fails <ph name="FILE_NAME" /> jau pastāv. Pārdēvējiet to un mēģiniet vēlreiz.</translation> +<translation id="7628127343934101653">Atvērt PDF failus noklusējuma PDF skatītāja lietojumprogrammā.</translation> <translation id="762917759028004464">Noklusējuma pārlūks šobrīd ir <ph name="BROWSER_NAME" />.</translation> <translation id="7629536005696009600">Atļaut aizpildīt Android lietojumprogrammām glabātos akreditācijas datus attiecīgajās vietnēs</translation> <translation id="7629827748548208700">Cilne: <ph name="TAB_NAME" /></translation> @@ -5151,6 +5157,7 @@ <translation id="7957513156576779045">Ieslēgt Bluetooth, lai atļautu savienošanu pārī</translation> <translation id="7957615753207896812">Atvērt tastatūras ierīces iestatījumus</translation> <translation id="7959074893852789871">Failā bija iekļauti vairāki sertifikāti, no kuriem daži netika importēti:</translation> +<translation id="7959700692661109221"><ph name="BEGIN_PARAGRAPH" />Google atrašanās vietas pakalpojums izmanto tādus avotus kā Wi‑Fi, lai palīdzētu ātrāk un precīzāk noteikt jūsu ierīces atrašanās vietu. Ieslēdzot Google atrašanās vietas pakalpojumus, jūsu ierīcē sāk darboties režīms, kas izmanto Wi‑Fi, lai sniegtu informāciju par atrašanās vietu. Šo funkciju varat jebkurā laikā izslēgt atrašanās vietas iestatījumos.<ph name="END_PARAGRAPH" /></translation> <translation id="7961015016161918242">Nekad</translation> <translation id="7964089325405904043">Paroļu importēšana un eksportēšana</translation> <translation id="7965010376480416255">Koplietotā atmiņa</translation> @@ -5301,6 +5308,7 @@ <translation id="8146793085009540321">Neizdevās pierakstīties. Lūdzu, sazinieties ar administratoru vai mēģiniet vēlreiz.</translation> <translation id="8148264977957212129">Pinyin valodas ievades metode</translation> <translation id="8148913456785123871">Rādīt “Google tagad” kartītes palaišanas programmā</translation> +<translation id="8150391391298684512">Atspējot Windows Runtime MIDI API</translation> <translation id="8151185429379586178">Izstrādātāju rīki</translation> <translation id="8151638057146502721">Konfigurēt</translation> <translation id="8151639108075998630">Iespējot pārlūkošanu viesim</translation> @@ -5583,6 +5591,7 @@ <translation id="8532294913309524834">Kārtojiet valodas atbilstoši preferencei.</translation> <translation id="8535005006684281994">Netscape sertifikāta atjaunošanas URL</translation> <translation id="8539727552378197395">Nē (HttpOnly)</translation> +<translation id="8541084862688000575">Automātiski ielādēt Android lietotnes</translation> <translation id="8543181531796978784">Jūs varat <ph name="BEGIN_ERROR_LINK" />ziņot par noteikšanas problēmu<ph name="END_ERROR_LINK" /> vai, ja apzināties drošības riskus, <ph name="BEGIN_LINK" />apmeklēt šo nedrošo vietni<ph name="END_LINK" />.</translation> <translation id="8545107379349809705">Slēpt informāciju...</translation> <translation id="8545211332741562162">Iespējot tīmekļa lapas izmantot eksperimentālās JavaScript funkcijas.</translation> @@ -5610,7 +5619,6 @@ <translation id="8569764466147087991">Atlasīt atveramo failu</translation> <translation id="8571032220281885258">Kad izrunāsiet tekstu “Ok Google”, pārlūkā Chrome tiks meklēts vaicājums, kuru izrunāsiet kā nākamo.</translation> <translation id="8571108619753148184">4. serveris</translation> -<translation id="8572832761467613633">Tikai Flash</translation> <translation id="8572981282494768930">Neļaut vietnēm piekļūt manai kamerai un mikrofonam</translation> <translation id="8574234089711453001">Atļaujiet rādīt lejupielādes pogu, kad tiek atvērta lapa ar satura URL.</translation> <translation id="857779305329188634">Iespējot eksperimentālā protokola QUIC atbalstu.</translation> @@ -5632,6 +5640,7 @@ <translation id="8600929685092827187">Aktivizēšanas paketes</translation> <translation id="8601206103050338563">TLS WWW klienta autentifikācija</translation> <translation id="8602851771975208551">Cita datorā instalēta programma ir izraisījusi tādas lietotnes pievienošanu, kas var ietekmēt pārlūkprogrammas Chrome darbību.</translation> +<translation id="8603912787021349466">Atļaut pēc pierakstīšanās automātiski palaist Android lietotnes.</translation> <translation id="8605428685123651449">SQLite atmiņa</translation> <translation id="8605503133013456784">Neizdevās atvienot un atdalīt no pāra ar ierīci <ph name="DEVICE_NAME" />.</translation> <translation id="8606726445206553943">izmantot jūsu MIDI ierīces</translation> @@ -5984,6 +5993,7 @@ <translation id="9053965862400494292">Radās kļūda, mēģinot uzstādīt sinhronizāciju.</translation> <translation id="9056034633062863292">Chromebox datora atjaunināšana</translation> <translation id="9056810968620647706">Atbilstoši rezultāti nav atrasti.</translation> +<translation id="9057119625587205566">Tuvumā nav printeru</translation> <translation id="9059868303873565140">Statusa izvēlne</translation> <translation id="9064142312330104323">Google profila fotoattēls (notiek ielāde)</translation> <translation id="9064275926664971810">Iespējot automātisko aizpildi, lai varētu aizpildīt veidlapas ar vienu klikšķi</translation> @@ -5994,6 +6004,7 @@ <translation id="9067401056540256169">Šis karogs padara Chrome nedrošu. Izmantojiet to tikai tad, ja saprotat tā nozīmi. Ņemiet vērā, ka šo karogu var noņemt bez iepriekšēja brīdinājuma. Ja tas ir iespējots, ietvaros ar “https” avotu var izmantot protokolu WebSockets ar nedrošu URL (ws://).</translation> <translation id="9068931793451030927">Ceļš:</translation> <translation id="9070219033670098627">Pārslēgt lietotāju</translation> +<translation id="9070940116164932228">Ierobežot apjomīgus fona taimerus</translation> <translation id="907148966137935206">Neļaut nevienai vietnei rādīt uznirstošos logus (ieteicams)</translation> <translation id="9072550133391925347"><ph name="PASSWORD_MANAGER_BRAND" /> automātiski pierakstās piemērotajās vietnēs un lietotnēs, izmantojot jūsu saglabātās paroles.</translation> <translation id="9073281213608662541">PAP</translation> @@ -6028,6 +6039,7 @@ <translation id="9112614144067920641">Lūdzu, izvēlieties jaunu PIN!</translation> <translation id="9112748030372401671">Mainīt tapeti</translation> <translation id="9112987648460918699">Atrast...</translation> +<translation id="9114663181201435112">Vienkārša pierakstīšanās</translation> <translation id="9115487443206954631">Apraides ierīču pārvaldība</translation> <translation id="9115675100829699941">Grāmatzīmes</translation> <translation id="9121814364785106365">Atvērt kā piespraustu cilni</translation> @@ -6122,7 +6134,6 @@ <translation id="952992212772159698">Neaktivizēts</translation> <translation id="960719561871045870">Operatora kods</translation> <translation id="960987915827980018">Atlikusi apmēram 1 stunda</translation> -<translation id="962778376131245616">Rādīt tikai nedrošu statusu ar animāciju</translation> <translation id="96421021576709873">Wi-Fi tīkls</translation> <translation id="965490406356730238">Iespējot ar aparatūru paātrinātu mjpeg atšifrēšanu uzņemtajam kadram (kur tas ir pieejams).</translation> <translation id="968174221497644223">Lietojumprogrammas kešatmiņa</translation>
diff --git a/chrome/app/resources/generated_resources_ml.xtb b/chrome/app/resources/generated_resources_ml.xtb index b7100ce..58c1b5b6 100644 --- a/chrome/app/resources/generated_resources_ml.xtb +++ b/chrome/app/resources/generated_resources_ml.xtb
@@ -18,7 +18,6 @@ <translation id="1029317248976101138">സൂം ചെയ്യുക</translation> <translation id="1029595648591494741">"<ph name="EXTENSION_NAME" />" പരീക്ഷിച്ചുനോക്കണോ?</translation> <translation id="1031362278801463162">പ്രിവ്യൂ ലോഡുചെയ്യുന്നു...</translation> -<translation id="1031460590482534116">ക്ലയന്റ് സര്ട്ടിഫിക്കറ്റ് സംഭരിക്കാന് ശ്രമിക്കുമ്പോള് ഒരു പിശക് സംഭവിച്ചു. പിശക് <ph name="ERROR_NUMBER" />(<ph name="ERROR_NAME" />).</translation> <translation id="1031573127485938293">ചോദിക്കുക (നയം മാനേജുചെയ്യുന്നത്)</translation> <translation id="103279545524624934">Android ആപ്സ് ആരംഭിക്കുന്നതിന്, ഡിസ്ക് ഇടം സൃഷ്ടിക്കുക.</translation> <translation id="1033780634303702874">നിങ്ങളുടെ സീരിയൽ ഉപകരണങ്ങൾ ആക്സസ്സുചെയ്യുക</translation> @@ -101,6 +100,7 @@ <translation id="1128591060186966949">തിരയൽ എഞ്ചിൻ എഡിറ്റുചെയ്യുക</translation> <translation id="1128987120443782698">ഈ ഉപാധിയുടെ സംഭരണ ശേഷി <ph name="DEVICE_CAPACITY" /> ആണ്. ചുരുങ്ങിയത് 4GB ശേഷിയുള്ള ഒരു SD കാര്ഡോ USB മെമ്മറി സ്റ്റിക്കോ ദയവായി ബന്ധിപ്പിക്കുക.</translation> <translation id="1137135726305341424">domContentLoaded എന്നതും എല്ലാ ഉറവിട ലോഡുകളും domContentLoaded-ന് മുമ്പ് ആരംഭിച്ചതാണ് (പ്രധാന ഫ്രെയിമും സമാന ഉറവിട iframes എന്നതും).</translation> +<translation id="1138663153846032155">ഫ്ലാഷിന് പകരം HTML-ന് മുൻഗണന നൽകുക</translation> <translation id="1140351953533677694">നിങ്ങളുടെ Bluetooth, സീരിയൽ ഉപകരണങ്ങൾ ആക്സസ്സുചെയ്യുക</translation> <translation id="114140604515785785">വിപുലീകരണ റൂട്ട് ഡയറക്ടറി:</translation> <translation id="1143142264369994168">സര്ട്ടിഫിക്കറ്റ് സൈന് ചെയ്തയാള്</translation> @@ -252,6 +252,7 @@ <translation id="1351692861129622852"><ph name="FILE_COUNT" /> ഫയലുകൾ ഇമ്പോർട്ടുചെയ്യുന്നു...</translation> <translation id="1352103415082130575">തായ് കീബോർഡ് (പറ്റച്ചോട്ടെ)</translation> <translation id="1353686479385938207"><ph name="PROVIDER_NAME" />: <ph name="NETWORK_NAME" /></translation> +<translation id="1353946958707294039">മെറ്റീരിയൽ രൂപകൽപ്പന സ്റ്റോറേജ് മാനേജർ</translation> <translation id="1353966721814789986">ആരംഭ പേജുകള്</translation> <translation id="1354868058853714482">Adobe Reader കാലവധി കഴിഞ്ഞതായതിനാല് സുരക്ഷിതമായിരിക്കില്ല.</translation> <translation id="1355408554203439639">3D സോഫ്റ്റ്വെയർ റാസ്റ്ററൈസർ</translation> @@ -421,7 +422,6 @@ <translation id="1533920822694388968">TV വിന്യാസം</translation> <translation id="15373452373711364">വലിയ മൗസ് കഴ്സർ</translation> <translation id="1543284117603151572">Edge-ൽ നിന്നും ഇമ്പോർട്ടുചെയ്തത്</translation> -<translation id="1544350195767834591">{NUM_COOKIES,plural, =1{മറ്റ് സൈറ്റുകളിൽ നിന്ന് ഒരെണ്ണം}other{മറ്റ് സൈറ്റുകളിൽ നിന്ന് # എണ്ണം}}</translation> <translation id="1545177026077493356">യാന്ത്രിക കിയോസ്ക് മോഡ്</translation> <translation id="1545786162090505744">ചോദ്യ സ്ഥലത്തെ %s ഉള്ള URL</translation> <translation id="1546280085599573572">നിങ്ങൾ ഹോം ബട്ടൺ ക്ലിക്കുചെയ്യുമ്പോൾ ദൃശ്യമാകുന്ന പേജിനെ ഈ വിപുലീകരണം മാറ്റി.</translation> @@ -445,7 +445,6 @@ <translation id="1559235587769913376">യൂണികോഡ് അക്ഷരങ്ങള് ഇന്പുട്ട് ചെയ്യുക</translation> <translation id="1561092721008294962">UI ടെക്സ്റ്റിനായുള്ള HarfBuzz</translation> <translation id="1566049601598938765">വെബ്സൈറ്റ്</translation> -<translation id="1566958206723629112">Flash, PDF എന്നിവ</translation> <translation id="1567723158593978621">പ്രവർത്തനക്ഷമമാക്കിയിരിക്കുമ്പോൾ, ബ്രൗസറിലേക്ക് സൈൻ ഇൻ ചെയ്യുന്ന പ്രവർത്തനം ഒരു പുതിയ gaia പാസ്വേഡ്-വിഭജിത സൈൻ ഇൻ ഫ്ലോയെ ഉപയോഗിക്കും.</translation> <translation id="1567993339577891801">JavaScript കണ്സോള്</translation> <translation id="1568323446248056064">ഡിസ്പ്ലേ ഉപകരണ ക്രമീകരണം തുറക്കുക</translation> @@ -574,7 +573,6 @@ <translation id="1723940674997333416">https ഉറവിടത്തിൽ നിന്ന് സുരക്ഷിതമല്ലാത്ത WebSocket അനുവദിക്കുക</translation> <translation id="1725149567830788547">&നിയന്ത്രണങ്ങള് കാണിക്കുക </translation> <translation id="172612876728038702">TPM സജ്ജീകരിച്ച് കൊണ്ടിരിക്കുകയാണ്. ദയവായി കാത്തിരിക്കുക; ഇതിന് കുറച്ച് മിനിട്ടുകളെടുക്കാം.</translation> -<translation id="1727135806684246609">മെറ്റീരിയൽ സുരക്ഷ വെർബോസ്</translation> <translation id="1729533290416704613">നിങ്ങൾ ഓമ്നിബോക്സിൽ നിന്ന് തിരയുമ്പോൾ ദൃശ്യമാകുന്ന പേജും അത് നിയന്ത്രിയ്ക്കും.</translation> <translation id="1731346223650886555">അര്ദ്ധവിരാമം</translation> <translation id="1731589410171062430">ആകെ: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /> (<ph name="NUMBER_OF_PAGES" /> <ph name="PAGE_OR_PAGES_LABEL" />)</translation> @@ -871,6 +869,7 @@ <translation id="218492098606937156">ടച്ച് ഇവന്റുകൾ പ്രാപ്തമാക്കുക</translation> <translation id="2187317261103489799">കണ്ടെത്തുക (ഡിഫോൾട്ട്)</translation> <translation id="2187895286714876935">സെര്വര് സാക്ഷ്യപത്ര ഇറക്കുമതി പിശക്</translation> +<translation id="2188881192257509750"><ph name="APPLICATION" /> തുറക്കുക</translation> <translation id="2190069059097339078">WiFi ക്രെഡൻഷ്യൽ ലഭ്യമാക്കൽ</translation> <translation id="219008588003277019">നേറ്റീവ് ക്ലയന്റ് മൊഡ്യൂള്: <ph name="NEXE_NAME" /></translation> <translation id="2190355936436201913">(ശൂന്യം)</translation> @@ -990,6 +989,7 @@ <translation id="2326606747676847821">ആൾമാറാട്ടത്തിലേക്ക് പോകുക</translation> <translation id="2326931316514688470">അപ്ലിക്കേഷൻ &വീണ്ടും ലോഡുചെയ്യുക</translation> <translation id="2327492829706409234">അപ്ലിക്കേഷനുകൾ പ്രാപ്തമാക്കുക</translation> +<translation id="2328054044222305089"><ph name="SITE" /> നിങ്ങളുടെ ഉപകരണത്തിൽ സൂക്ഷിച്ച എല്ലാ വിവരങ്ങളും ഇല്ലാതാക്കി, റൺ ചെയ്യാൻ അനുവദിച്ച എല്ലാ അനുമതികളെയും ഇത് റീസെറ്റുചെയ്യും. തുടരണോ?</translation> <translation id="2329597144923131178">നിങ്ങളുടെ എല്ലാ ഉപകരണങ്ങളിലും ബുക്ക്മാർക്കുകളും ചരിത്രവും മറ്റ് ക്രമീകരണവും ലഭിക്കാൻ സൈൻ ഇൻ ചെയ്യുക.</translation> <translation id="2332131598580221120">സ്റ്റോറിൽ കാണുക</translation> <translation id="2332742915001411729">സ്ഥിരസ്ഥിതിയിലേക്ക് പുനഃസജ്ജമാക്കുക</translation> @@ -1265,7 +1265,6 @@ <translation id="2675358154061544447">വെവ്വേറേ പ്രോസസ്സുകളിലൂടെ ക്രോസ്-സൈറ്റ് iframes റെൻഡർ ചെയ്യുന്നതിനുള്ള ഉയർന്ന പരീക്ഷണാത്മക പിന്തുണ. ഈ മോഡിൽ, ഡോക്യുമെന്റുകൾ സമാന വെബ്സൈറ്റിൽ നിന്നാണെങ്കിൽ മാത്രമേ ഒരു റെൻഡറർ പ്രോസസ്സ് പങ്കിടുകയുള്ളൂ.</translation> <translation id="2676946222714718093">ഇതിൽ പ്ലേ ചെയ്യുന്നു</translation> <translation id="2678063897982469759">പുനഃപ്രാപ്തമാക്കുക</translation> -<translation id="2678246812096664977">എല്ലാ പ്ലഗിന്നുകളും</translation> <translation id="2679385451463308372">സിസ്റ്റം ഡയലോഗ് ഉപയോഗിച്ച് പ്രിന്റ് ചെയ്യുക...</translation> <translation id="2680208403056680091">നിങ്ങളുടെ ഇന്റർനെറ്റ് കണക്ഷൻ നിയന്ത്രിക്കുന്നു</translation> <translation id="268053382412112343">ച&രിത്രം</translation> @@ -1439,7 +1438,6 @@ <translation id="287286579981869940"><ph name="PROVIDER_NAME" /> ചേർക്കുക...</translation> <translation id="2872961005593481000">അടയ്ക്കുക</translation> <translation id="2875698561019555027">(Chrome പിശക് പേജുകൾ)</translation> -<translation id="2879560882721503072"><ph name="ISSUER" /> നല്കിയ ക്ലയന്റ് സര്ട്ടിഫിക്കറ്റ് വിജയകരമായി സംഭരിച്ചു.</translation> <translation id="288024221176729610">ചെക്ക്</translation> <translation id="288042212351694283">നിങ്ങളുടെ യൂണിവേഴ്സൽ സെക്കൻഡ് ഫാക്റ്റർ ഉപകരണങ്ങൾ ആക്സസ്സുചെയ്യുക</translation> <translation id="2881966438216424900">അവസാനം ആക്സസുചെയ്തത്:</translation> @@ -1588,6 +1586,7 @@ <translation id="3057861065630527966">നിങ്ങളുടെ ഫോട്ടോകളും വീഡിയോകളും ബാക്കപ്പുചെയ്യുക</translation> <translation id="3058212636943679650">നിങ്ങളുടെ കമ്പ്യൂട്ടറിന്റെ ഓപ്പറേറ്റിംഗ് സിസ്റ്റം പിന്നീടെപ്പോഴെങ്കിലും പുനഃസ്ഥാപിക്കണമെങ്കില് ഒരു റിക്കവറി SD കാര്ഡോ USB മെമ്മറി സ്റ്റിക്കോ ആവശ്യമായി വരും.</translation> <translation id="305932878998873762">HTTP-യുടെ ലളിതമായ കാഷെ ഒരു പുതിയ കാഷെ ആണ്. ഡിസ്ക് സ്പെയ്സ് അലോക്കേഷനായി ഇത് ഫയൽ സിസ്റ്റത്തെ ആശ്രയിക്കുന്നു.</translation> +<translation id="3060251871394327123"><ph name="SITE" /> നിങ്ങളുടെ ഉപകരണത്തിൽ സൂക്ഷിച്ച എല്ലാ വിവരങ്ങളും ഇത് ഇല്ലാതാക്കും. തുടരണോ?</translation> <translation id="3061650404498811439">ഇമോജി, കൈയക്ഷരം, വോയ്സ് ഇൻപുട്ട് ഫോം ഓപ്റ്റ് ഇൻ IME മെനു എന്നിവയിലേക്ക് ആക്സസ്സ് നൽകുക.</translation> <translation id="3062606427884046423">Chrome മീഡിയ അറിയിപ്പുകൾക്കായി Android MediaStyle അറിയിപ്പുകൾ ഉപയോഗിക്കുക.</translation> <translation id="3063844757726132584">ഈ ഹാൻഡി ലോഞ്ചറിൽ നിന്ന് നിങ്ങളുടെ എല്ലാ ആപ്സും ആക്സസ്സ് ചെയ്യുക. ഗെയിമുകൾ കളിക്കുകയും വീഡിയോ ചാറ്റ് നടത്തുകയും സംഗീതം ആസ്വദിക്കുകയും ഡോക്യുമെന്റുകൾ എഡിറ്റുചെയ്യുകയും കൂടുതൽ ആപ്സ് സ്വന്തമാക്കുകയും ചെയ്യുക.</translation> @@ -1637,6 +1636,7 @@ <translation id="3123569374670379335">(സൂപ്പർവൈസുചെയ്തത്)</translation> <translation id="3124111068741548686">ഉപയോക്താവ് കൈകാര്യംചെയ്യുന്നവ</translation> <translation id="3126026824346185272">Ctrl</translation> +<translation id="3127156390846601284">കാണിച്ചിരിക്കുന്ന എല്ലാ സൈറ്റുകളുടെയും, നിങ്ങളുടെ ഉപകരണത്തിൽ സൂക്ഷിച്ചിരിക്കുന്ന വിവരങ്ങളെല്ലാം ഇത് ഇല്ലാതാക്കും. തുടരണോ?</translation> <translation id="312759608736432009">ഉപാധി നിര്മ്മാതാവ്:</translation> <translation id="3127919023693423797">പ്രാമാണീകരിക്കുന്നു...</translation> <translation id="3128230619496333808">ടാബ് 6</translation> @@ -1735,7 +1735,6 @@ <translation id="3264544094376351444">സാന്സ്-സെരിഫ് ഫോണ്ട്</translation> <translation id="3264547943200567728">നിങ്ങളുടെ Chromebox-ന്റെ നെറ്റ്വർക്ക് സജ്ജമാക്കാനായില്ല</translation> <translation id="3265459715026181080">വിന്ഡോ അടയ്ക്കുക</translation> -<translation id="3267271790328635957">PDF മാത്രം</translation> <translation id="3267726687589094446">ഒന്നിലധികം ഫയലുകളുടെ യാന്ത്രിക ഡൗൺലോഡുചെയ്യൽ അനുവദിക്കുന്നത് തുടരുക</translation> <translation id="3267998849713137817">പരിഷ്ക്കരിച്ച സമയം</translation> <translation id="3268451620468152448">ഓപ്പൺ ടാബുകൾ</translation> @@ -1981,6 +1980,7 @@ <translation id="3574210789297084292">പ്രവേശിക്കുക</translation> <translation id="3574305903863751447"><ph name="CITY" />, <ph name="STATE" /> <ph name="COUNTRY" /></translation> <translation id="357479282490346887">ലിത്വാനിയന്</translation> +<translation id="3575927481544652747">Windows 10 അല്ലെങ്കിൽ അതിന് ശേഷമുള്ള പതിപ്പിൽ ഡിഫോൾട്ടായി പ്രവർത്തനക്ഷമമാക്കിയിരിക്കുന്ന Windows Runtime MIDI API-യെ MIDI API-യ്ക്കായി പ്രവർത്തനരഹിതമാക്കുക.</translation> <translation id="3576324189521867626">ഇൻസ്റ്റാൾ ചെയ്തു</translation> <translation id="3578331450833904042">സ്ഥിരം (എല്ലാം പിക്കപ്പ് ചെയ്യുക)</translation> <translation id="3578594933904494462">ഈ ടാബിന്റെ ഉള്ളടക്കം പങ്കിടുന്നു.</translation> @@ -2034,8 +2034,6 @@ <translation id="3627320433825461852">1 മിനിറ്റിൽ താഴെ ശേഷിക്കുന്നു</translation> <translation id="3627588569887975815">അദൃ&ശ്യ വിന്ഡോയിലെ ലിങ്ക് തുറക്കുക</translation> <translation id="3627671146180677314">നെറ്റ്സ്കേപ്പ് സര്ട്ടിഫിക്കറ്റ് പുതുക്കല് സമയം</translation> -<translation id="3629326610814700057">ലോക്കൽ സ്റ്റോറേജ് മാനേജുചെയ്യാൻ സ്റ്റോറേജ് മാനേജറെ അനുവദിക്കുന്നു.</translation> -<translation id="3630337581925712713"><ph name="PERMISSION_TYPE_LABEL" />:</translation> <translation id="3631337165634322335">ചുവടെയുള്ള ഒഴിവാക്കലുകള് നിലവിലെ ആള്മാറാട്ട സെഷനില് മാത്രം ബാധകമാണ്.</translation> <translation id="3633586230741134985">അപ്ലിക്കേഷൻ ലോഞ്ചർ ക്രമീകരണങ്ങൾ</translation> <translation id="3633997706330212530">നിങ്ങള് ഈ സേവനങ്ങള് ഓപ്ഷണലായി അപ്രാപ്തമാക്കിയേക്കാം.</translation> @@ -2058,7 +2056,8 @@ <translation id="3654045516529121250">നിങ്ങളുടെ പ്രവേശനക്ഷമത ക്രമീകരണങ്ങൾ റീഡുചെയ്യുക</translation> <translation id="3654092442379740616">സമന്വയിപ്പിക്കൽ പിശക്: <ph name="PRODUCT_NAME" /> എന്നത് കാലഹരണപ്പെട്ടതിനാൽ അപ്ഡേറ്റ് ചെയ്യേണ്ടത് ആവശ്യമാണ്.</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{ഇതിന് ഒരു ഫയലിലേക്ക് ശാശ്വതമായ ആക്സസ്സ് ഉണ്ട്.}other{ഇതിന് # ഫയലുകളിലേക്ക് ശാശ്വതമായ ആക്സസ്സ് ഉണ്ട്.}}</translation> -<translation id="3657468915905674858">PPAPI Win32k ലോക്ക്ഡൗൺ പ്രവർത്തനക്ഷമമാക്കുക.</translation> +<translation id="365793796291733849"><ph name="BEGIN_PARAGRAPH1" />നിങ്ങൾ സ്വയമേവയുള്ള ബായ്ക്കപ്പ് ഓണാക്കുമ്പോൾ, Google ഡ്രൈവിലെ ഒരു സ്വകാര്യ ഫോൾഡറിൽ ഉപകരണവും ആപ്പ് വിവരങ്ങളും ഇടയ്ക്കിടെ സംരക്ഷിക്കും. ആപ്പ് വിവരങ്ങൾ എന്നത് കോൺടാക്റ്റുകൾ, സന്ദേശങ്ങൾ, ഫോട്ടോകൾ എന്നിവ പോലുള്ള രഹസ്യസ്വഭാവമുള്ളതാകാൻ സാധ്യതയുള്ള വിവരങ്ങൾ ഉൾപ്പെടെ, ആപ്പ് സംരക്ഷിച്ചിട്ടുള്ള ഏതൊരു വിവരവും (ഡെവലപ്പർ ക്രമീകരണം അടിസ്ഥാനമാക്കി) ആകാം.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />ബായ്ക്കപ്പ് ഡാറ്റയെ നിങ്ങളുടെ Drive storage ക്വാട്ടയിൽ കണക്കാക്കുന്നതല്ല. വലിയ ഫയലുകളോ സേവനത്തിൽ ഉൾപ്പെടുത്തേണ്ടെന്ന് ഡെവലപ്പർമാർ തീരുമാനിച്ചിട്ടുള്ള ഫയലുകളോ ബായ്ക്കപ്പെടുക്കില്ല.<ph name="END_PARAGRAPH2" /></translation> <translation id="3660234220361471169">വിശ്വസ്തമല്ലാത്തത്</translation> <translation id="3665589677786828986">മറ്റൊരു പ്രോഗ്രാം നിങ്ങളുടെ ചില ക്രമീകരണങ്ങൾക്ക് കേടുവരുത്തി അവയുടെ യഥാർത്ഥ സ്ഥിര ക്രമീകരണങ്ങളിലേക്ക് അവ പുനഃസജ്ജമാക്കിയതായി Chrome കണ്ടെത്തി.</translation> <translation id="3665842570601375360">സുരക്ഷ:</translation> @@ -2113,6 +2112,7 @@ <translation id="3733127536501031542">സ്റ്റെപ്പ്-അപ്പ് ഉള്ള SSL സെര്വര് </translation> <translation id="3736520371357197498">നിങ്ങളുടെ സുരക്ഷയെ ബാധിച്ചേക്കാവുന്ന അപകട സാധ്യതകളെക്കുറിച്ച് മനസ്സിലാക്കുകയാണെങ്കിൽപ്പോലും, പ്രോഗ്രാമുകൾ നീക്കംചെയ്യുന്നതിനു മുമ്പ് <ph name="BEGIN_LINK" />ഈ സുരക്ഷിതമല്ലാത്ത സൈറ്റ്<ph name="END_LINK" /> നിങ്ങൾക്ക് സന്ദർശിക്കാം (ശുപാർശചെയ്യുന്നില്ല).</translation> <translation id="3738924763801731196"><ph name="OID" />:</translation> +<translation id="3739254215541673094"><ph name="APPLICATION" /> തുറക്കണോ?</translation> <translation id="3739798227959604811">ആവർത്തിക്കുന്നതിന് മുമ്പുള്ള സമയം:</translation> <translation id="3741158646617793859"><ph name="DEVICE_NAME" />, ഇപ്പോൾ അഡ്മിൻ കൺസോളിൽ ദൃശ്യമാകും</translation> <translation id="3741243925913727067">Google ഡ്രൈവിലേക്ക് നിങ്ങളുടെ മീഡിയ ഉപകരണത്തിന്റെ ഫോട്ടോകളും വീഡിയോകളും ബാക്കപ്പുചെയ്യുക.</translation> @@ -2350,7 +2350,6 @@ <translation id="4058793769387728514">പ്രമാണം ഇപ്പോള് പരിശോധിക്കുക</translation> <translation id="4059285154003114015">ഫ്രെയിം &പ്രിന്റുചെയ്യുക...</translation> <translation id="406070391919917862">പശ്ചാത്തല അപ്ലിക്കേഷനുകള്</translation> -<translation id="4061502419206152498">സുരക്ഷിതമല്ലാത്തതും ആനിമേറ്റുചെയ്യാത്തതുമായവ മാത്രം കാണിക്കുക</translation> <translation id="4062251648694601778">നിങ്ങളുടെ <ph name="SHORT_PRODUCT_NAME" /> ഉപകരണം ആസ്വദിക്കുക. ചോദ്യങ്ങളുണ്ടോ? സ്റ്റാറ്റസ് ട്രേയിലെ "?" ക്ലിക്കുചെയ്യുന്നതിലൂടെ നിങ്ങൾക്ക് എല്ലായ്പ്പോഴും സഹായം നേടാനാവും.</translation> <translation id="4065876735068446555">നിങ്ങൾ ഉപയോഗിക്കുന്ന നെറ്റ്വർക്ക് (<ph name="NETWORK_ID" />) അതിന്റെ ലോഗിൻ പേജ് സന്ദർശിക്കാൻ നിങ്ങളോട് ആവശ്യപ്പെടാം.</translation> <translation id="4068506536726151626">നിങ്ങളുടെ ലൊക്കേഷൻ ട്രാക്കുചെയ്യുന്ന ഇനിപ്പറയുന്ന സൈറ്റുകളിൽ നിന്നുമുള്ള ഘടകങ്ങൾ ഈ പേജിൽ അടങ്ങിയിരിക്കുന്നു:</translation> @@ -2389,7 +2388,6 @@ <translation id="4101878899871018532">സമന്വയിപ്പിക്കാൻ ഉപയോഗിക്കുന്ന ക്രെഡൻഷ്യലിനെ പാസ്വേഡ് മാനേജർ സംരക്ഷിക്കുകയില്ല.</translation> <translation id="410351446219883937">സ്വയം പ്ലേചെയ്യൽ</translation> <translation id="4104163789986725820">കയ&റ്റുമതി ചെയ്യുക...</translation> -<translation id="4105523032910086267">മെറ്റീരിയൽ രൂപകൽപ്പനയിലെ സുരക്ഷാ വെർബോസിന്റെ ആനിമേഷനും ദൃശ്യപരതയും സജ്ജമാക്കുന്നു.</translation> <translation id="4105563239298244027">Google ഡ്രൈവിൽ 1 TB സൗജന്യമായി നേടുക</translation> <translation id="4109135793348361820">വിൻഡോ <ph name="USER_NAME" /> (<ph name="USER_EMAIL" />) എന്നതിലേക്ക് നീക്കുക</translation> <translation id="4110342520124362335"><ph name="DOMAIN" /> എന്നതില് നിന്നുള്ള കുക്കികളെ തടഞ്ഞു.</translation> @@ -2439,6 +2437,7 @@ <translation id="418179967336296930">റഷ്യൻ ഫൊണറ്റിക് (YaZHert) കീബോർഡ്</translation> <translation id="4181841719683918333">ഭാഷകൾ</translation> <translation id="4187248015940562149">നിങ്ങൾക്ക് ചുറ്റുമുള്ള Bluetooth ഉപകരണങ്ങളിലേക്ക് കണക്റ്റുചെയ്യാനും അവയെ നിയന്ത്രിക്കാനും, വെബ്സൈറ്റുകളെ അനുവദിക്കുന്ന വെബ് Bluetooth പ്രവർത്തനക്ഷമമാക്കുന്നു.</translation> +<translation id="4188447344915957833">മെറ്റീരിയൽ രൂപകൽപ്പന ക്രമീകരണത്തിൽ സ്റ്റോറേജ് മാനേജർ പ്രവർത്തനക്ഷമമാക്കുന്നു.</translation> <translation id="4189406272289638749"><b><ph name="EXTENSION_NAME" /></b> എന്ന വിപുലികരണത്തെ ഈ ക്രമീകരണം നിയന്ത്രിക്കുന്നു.</translation> <translation id="4193154014135846272">Google പ്രമാണം</translation> <translation id="4193182321948161343">'മെറ്റീരിയൽ രൂപകൽപ്പന ഉപയോക്തൃ മാനേജറെ' പ്രവർത്തനക്ഷമമാക്കുന്നു</translation> @@ -2646,6 +2645,7 @@ <translation id="4508765956121923607">ഉറ&വിടം കാണുക</translation> <translation id="4509017836361568632">ഫോട്ടോ നിരസിക്കുക</translation> <translation id="4509345063551561634">സ്ഥാനം:</translation> +<translation id="4513946894732546136">ഫീഡ്ബാക്ക്</translation> <translation id="4514542542275172126">സൂപ്പർവൈസുചെയ്ത ഉപയോക്താവിനെ സജ്ജീകരിക്കുക</translation> <translation id="4514914692061505365">എല്ലാ pexe ഫയലുകളിലും PNaCl-ന്റെ വേഗതയാർന്ന സബ്സീറോ ട്രാൻസ്ലേറ്റർ ഉപയോഗിക്കാൻ പ്രേരിപ്പിക്കുക.</translation> <translation id="451515744433878153">നീക്കംചെയ്യുക</translation> @@ -2744,6 +2744,7 @@ <translation id="4656293982926141856">ഈ കമ്പ്യൂട്ടറിൽ</translation> <translation id="4656631038341342120">ഈ ഉപകരണത്തിന് VR ഷെൽ ലഭ്യമാണെങ്കിൽ അത് പ്രവർത്തനക്ഷമമാക്കുക.</translation> <translation id="4657031070957997341"><ph name="HOST" /> എന്നതിൽ എല്ലായ്പ്പോഴും പ്ലഗിൻ അനുവദിക്കുക</translation> +<translation id="466008749075469935">പശ്ചാത്തല ടൈമറുകളുടെ CPU ഉപയോഗം 1% എന്നതിലേക്ക് പരിമിതപ്പെടുത്താൻ ഇടപെടലിനെ പ്രവർത്തനക്ഷമമാക്കുന്നു.</translation> <translation id="4663254525753315077">വേഗതയുള്ള സ്ക്രോളിംഗിന്, സാധ്യമാകുമ്പോൾ ഒരു ഓവർഫ്ലോ സ്ക്രോളിംഗ് എലമെന്റിന്റെ സ്ക്രോളിംഗ് ഉള്ളടക്കങ്ങൾ ഒരു സംയോജിത ലേയറിലേക്ക് ഇടുന്നു.</translation> <translation id="4664482161435122549">PKCS #12 കയറ്റുമതി പിശക്</translation> <translation id="4665014895760275686">നിര്മ്മാതാവ്</translation> @@ -2812,6 +2813,7 @@ <translation id="4749157430980974800">ജോർജ്ജിയൻ കീബോർഡ്</translation> <translation id="4750394297954878236">നിർദ്ദേശങ്ങൾ</translation> <translation id="475088594373173692">ആദ്യ ഉപയോക്താവ്</translation> +<translation id="4750892496809949692">പ്ലഗിന്നുകളുടെ ലിസ്റ്റിൽ നിന്ന് ഫ്ലാഷ് മറച്ചുകൊണ്ട് HTML ഉള്ളടക്കം തിരഞ്ഞെടുക്കുക.</translation> <translation id="4750917950439032686">നിങ്ങളുടെ വിവരങ്ങൾ (ഉദാഹരണത്തിന്, പാസ്വേഡുകളോ ക്രെഡിറ്റ് കാർഡ് നമ്പറുകളോ) ഈ സൈറ്റിലേക്ക് അയച്ച് കഴിഞ്ഞാൽ പിന്നെയത് സ്വകാര്യമായിരിക്കും.</translation> <translation id="4753602155423695878">Android ഫോൺ പേജ് ലോഡുചെയ്യൽ പ്രോഗ്രസ്സ് ബാർ ആനിമേഷൻ</translation> <translation id="4755240240651974342">ഫിന്നിഷ് കീബോര്ഡ്</translation> @@ -3086,6 +3088,7 @@ <translation id="5119450342834678097">ക്രമീകരണ മെനുവിൽ ടാബ്ലെറ്റ് സൈറ്റ് ഓപ്ഷൻ അഭ്യർത്ഥിക്കുക</translation> <translation id="5120068803556741301">മൂന്നാം കക്ഷി ഇൻപുട്ട് രീതി</translation> <translation id="5120421890733714118">വെബ്സൈറ്റുകൾ തിരിച്ചറിയുന്നതിനായി ഈ സർട്ടിഫിക്കറ്റിനെ വിശ്വസിക്കുക.</translation> +<translation id="5120516977819314347">പിൻ നമ്പറോ പാസ്വേഡോ തെറ്റാണ്.</translation> <translation id="5121130586824819730">നിങ്ങളുടെ ഹാർഡ് ഡിസ്ക് നിറഞ്ഞു. മറ്റൊരു ലൊക്കേഷനിലേക്ക് സംരക്ഷിക്കുകയോ ഹാർഡ് ഡിസ്കിൽ കൂടുതൽ ഇടം സൃഷ്ടിക്കുകയോ ചെയ്യുക.</translation> <translation id="5125751979347152379">URL അസാധുവാണ്.</translation> <translation id="5127881134400491887">നെറ്റ്വർക്ക് കണക്ഷനുകൾ നിയന്ത്രിക്കുക</translation> @@ -3093,6 +3096,7 @@ <translation id="512903556749061217">അറ്റാച്ചുചെയ്തു</translation> <translation id="5129301143853688736">ഈ സൈറ്റിലേക്കുള്ള കണക്ഷൻ സ്വകാര്യമല്ല. ആക്രമണകാരികൾ <ph name="DOMAIN" /> എന്നതിൽ നിന്ന് നിങ്ങളുടെ വിവരം (ഉദാഹരണത്തിന്, ഫോട്ടോകളും പാസ്വേഡുകളും സന്ദേശങ്ങളും ക്രെഡിറ്റ് കാർഡുകളും) മോഷ്ടിക്കാൻ ശ്രമിച്ചേക്കാം.</translation> <translation id="5129662217315786329">പോളിഷ്</translation> +<translation id="5131347545782851480">PDF ഡോക്യുമെന്റുകൾ</translation> <translation id="5134856901811723984">Chrome OS സിസ്റ്റം UI എന്നതിലെ മെറ്റീരിയൽ രൂപകൽപ്പന</translation> <translation id="5135533361271311778">ബുക്ക്മാര്ക്ക് ഇനം സൃഷ്ടിക്കാന് കഴിഞ്ഞില്ല.</translation> <translation id="5136529877787728692">F7</translation> @@ -3261,6 +3265,7 @@ <translation id="5328031682234198929">8</translation> <translation id="5329858601952122676">&ഇല്ലാതാക്കൂ</translation> <translation id="5330145655348521461">ഈ ഫയലുകൾ മറ്റൊരു ഡെസ്ക്ടോപ്പിലാണ് തുറന്നിരിക്കുന്നത്. അത് കാണാൻ <ph name="USER_NAME" /> (<ph name="MAIL_ADDRESS" />) എന്നതിലേക്ക് നീക്കുക.</translation> +<translation id="5330512191124428349">വിവരം സ്വീകരിക്കുക</translation> <translation id="5332624210073556029">സമയ മേഖല :</translation> <translation id="5333807720589685258">ശരിയായ പിൻ അണ്ലോക്ക് കീ നല്കാന് നിങ്ങള്ക്ക് കഴിഞ്ഞില്ലെങ്കിൽ സിം കാര്ഡ് ശാശ്വതമായി പ്രവർത്തനരഹിതമാക്കപ്പെടും.</translation> @@ -3693,7 +3698,6 @@ <translation id="5892507820957994680">ബില്ട്ട്-ഇന് സോഫ്റ്റ്വെയര് തര്ജ്ജമ പട്ടിക അസാധുവാക്കുന്നു കൂടാതെ പിന്തുണക്കാത്ത സിസ്റ്റം കോണ്ഫിഗറേഷനുകളില് GPU-ത്വരിതപ്പെടുത്തല് പ്രാപ്തമാക്കുന്നു.</translation> <translation id="5895138241574237353">പുനരാരംഭിക്കുക</translation> <translation id="5895187275912066135">ഇനിപ്പറയുന്നദിവസം നല്കി</translation> -<translation id="5898154795085152510">സെര്വര് അസാധുവായ ക്ലയന്റ് സര്ട്ടിഫിക്കറ്റ് മടക്കി. പിശക് <ph name="ERROR_NUMBER" /> (<ph name="ERROR_NAME" />).</translation> <translation id="5900302528761731119">Google പ്രൊഫൈൽ ഫോട്ടോ</translation> <translation id="590253956165195626">നിങ്ങൾ വായിക്കുന്ന ഭാഷയിൽ ഉള്ളതല്ലാത്ത പേജുകൾ വിവർത്തനം ചെയ്യുന്നത് വാഗ്ദാനം ചെയ്യുന്നു.</translation> <translation id="5904093760909470684">പ്രോക്സി ക്രമീകരണം</translation> @@ -3748,6 +3752,8 @@ <translation id="5984222099446776634">സമീപകാലത്ത് സന്ദർശിച്ചത്</translation> <translation id="5984814259619230127">സ്മാർട്ട് ലോക്ക് Bluetooth ലോ എനർജി കണ്ടെത്തൽ</translation> <translation id="5986245990306121338">പ്രവർത്തനക്ഷമമാക്കിയാൽ, ക്രമീകരണത്തിൽ 'ടാബുകളും ആപ്സും ലയിപ്പിക്കുക' എന്ന ഓപ്ഷൻ ഓണാണെങ്കിൽ പോലും ഒരു ടാബ് സ്വിച്ചർ കാണിക്കുന്നതാണ്.</translation> +<translation id="5989712527536636369"><ph name="BEGIN_PARAGRAPH1" />ബാറ്ററി നില, ആപ്സുകൾ എത്രതവണ ഉപയോഗിക്കുന്നുണ്ടെന്നത്, നെറ്റ്വർക്ക് കണക്ഷനുകളുടെ (Wi-Fi, Bluetooth എന്നിവ പോലുള്ള) നിലവാരവും ദൈർഘ്യവും, കാര്യങ്ങൾ ശരിയായി പ്രവർത്തിക്കാത്തപ്പോഴുള്ള ക്രാഷ് റിപ്പോർട്ടുകൾ എന്നിവപോലുള്ള നിങ്ങളുടെ ഉപകരണത്തെക്കുറിച്ചും അത് ഉപയോഗിക്കുന്ന വിധത്തെക്കുറിച്ചുമുള്ള പൊതുവായ വിവരങ്ങളാണിത്. ഇത് എല്ലാവർക്കുമായി Google-ന്റെ ഉൽപ്പന്നങ്ങളും സേവനങ്ങളും മെച്ചപ്പെടുത്താൻ ഉപയോഗിക്കും. Android ഡെവലപ്പർമാർ പോലുള്ള പങ്കാളികൾക്ക് അവരുടെ ആപ്സുകളും ഉൽപ്പന്നങ്ങളും മികച്ചതാക്കുന്നതിനും സമാഹരിച്ച ചില വിവരങ്ങൾ സഹായിക്കും.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />നിങ്ങൾക്കിത് എപ്പോൾ വേണമെങ്കിലും Android ആപ്സ് ക്രമീകരണത്തിൽ ഓണാക്കാനോ ഓഫാക്കാനോ കഴിയും. സിസ്റ്റം അപ്ഡേറ്റുകളും സുരക്ഷയും പോലുള്ള അടിസ്ഥാന സേവനങ്ങൾ ലഭ്യമാക്കുന്നതിനാവശ്യമായ വിവരങ്ങൾ അയയ്ക്കാനുള്ള ഉപകരണത്തിന്റെ കഴിവിനെ ഇത് ബാധിക്കില്ല.<ph name="END_PARAGRAPH2" /></translation> <translation id="5990198433782424697">chrome:// URL-കളിലെ വിപുലീകരണം</translation> <translation id="5990814808592353318">സ്വമേധയാ പാസ്വേഡ് സൃഷ്ടിക്കൽ.</translation> <translation id="5991049340509704927">മാഗ്നിഫൈ ചെയ്യുക</translation> @@ -3761,6 +3767,7 @@ <translation id="6005695835120147974">മീഡിയ റൂട്ടർ</translation> <translation id="6007237601604674381">നീക്കുന്നത് പരാജയപ്പെട്ടു. <ph name="ERROR_MESSAGE" /></translation> <translation id="6008241731410823808">ഹൈപ്പർലിംഗ് ഓഡിറ്റിംഗ് പിംഗുകൾ അയയ്ക്കുന്നു.</translation> +<translation id="6011449291337289699">സൈറ്റ് ഡാറ്റ മായ്ക്കുക</translation> <translation id="6015796118275082299">വര്ഷം</translation> <translation id="6016551720757758985">മുൻ പതിപ്പിലേക്ക് പോകുന്നതിനുള്ള പവർവാഷ് സ്ഥിരീകരിക്കുക</translation> <translation id="6016809788585079594">അവസാനം "Ok Google" എന്ന് ഒരു തവണ പറയുക</translation> @@ -3950,7 +3957,6 @@ <translation id="6276301056778294989">ഉപകരണത്തിൽ സമാന കോഡ് കാണിക്കുന്നുണ്ടെന്ന് ഉറപ്പുവരുത്തുക.</translation> <translation id="6277105963844135994">നെറ്റ്വർക്കിന്റെ സമയപരിധി കഴിഞ്ഞു</translation> <translation id="6277518330158259200">സ്ക്രീൻഷോട്ടെടുക്കുക</translation> -<translation id="6278428485366576908">തീം</translation> <translation id="6279183038361895380">നിങ്ങളുടെ കഴ്സർ കാണിക്കാൻ |<ph name="ACCELERATOR" />| അമർത്തുക</translation> <translation id="6280215091796946657">മറ്റൊരു അക്കൗണ്ട് ഉപയോഗിച്ച് സൈൻ ഇൻ ചെയ്യുക</translation> <translation id="6280912520669706465">ARC</translation> @@ -4202,6 +4208,7 @@ <translation id="6607272825297743757">ഫയൽ വിവരം</translation> <translation id="6607831829715835317">കൂടുതൽ ഉപക&രണങ്ങൾ</translation> <translation id="6608140561353073361">എല്ലാ കുക്കികളും സൈറ്റ് ഡാറ്റയും...</translation> +<translation id="6610183966322615106">പ്രിന്റർ ചേർക്കുന്നതിൽ പിശക്</translation> <translation id="6610610633807698299">URL നൽകുക...</translation> <translation id="6612358246767739896">പരിരക്ഷിത ഉള്ളടക്കം</translation> <translation id="6615455863669487791">എന്നെ കാണിക്കുക</translation> @@ -4265,7 +4272,6 @@ <translation id="6708242697268981054">ഉത്ഭവം:</translation> <translation id="6709357832553498500"><ph name="EXTENSIONNAME" /> ഉപയോഗിച്ച് കണക്റ്റുചെയ്യുക</translation> <translation id="6710213216561001401">കഴിഞ്ഞ</translation> -<translation id="6712158998835983046">ആനിമേറ്റുചെയ്തതെല്ലാം കാണിക്കുക</translation> <translation id="6718273304615422081">Zip ചെയ്യുന്നു...</translation> <translation id="671928215901716392">സ്ക്രീൻ ലോക്കുചെയ്യുക</translation> <translation id="6721972322305477112">&ഫയല്</translation> @@ -4538,7 +4544,6 @@ <translation id="7088434364990739311">അപ്ഡേറ്റ് പരിശോധന ആരംഭിക്കുന്നതിൽ പരാജയപ്പെട്ടു (പിശക് കോഡ് <ph name="ERROR" />).</translation> <translation id="708856090370082727">OSK ഓവർസ്ക്രോൾ പിന്തുണ പ്രവർത്തനക്ഷമമാക്കുക. ഈ ഫ്ലാഗ് ഓണായിരിക്കുമ്പോൾ OSK, വിഷ്വൽ വ്യൂപോർട്ടിന്റെ വലുപ്പം മാത്രമേ മാറ്റുകയുള്ളൂ.</translation> <translation id="7088674813905715446">അഡ്മിനിസ്ട്രേറ്റർ ഈ ഉപകരണം ഡിപ്രൊവിഷൻ ചെയ്ത നിലയിലാക്കിയിരിക്കുന്നു. എൻറോൾമെന്റിനായി ഇത് പ്രവർത്തനക്ഷമമാക്കാൻ, അഡ്മിനിസ്ട്രേറ്റർ ഈ ഉപകരണത്തെ തീർപ്പുകൽപ്പിക്കാത്ത നിലയിലാക്കേണ്ടതുണ്ട്.</translation> -<translation id="7089609847854449639">സ്റ്റോറേജ് മാനേജർ</translation> <translation id="708969677220991657">അസാധുവായ ഒരു സർട്ടിഫിക്കറ്റ് ഉള്ളപ്പോൾ പോലും HTTPS വഴി ലോക്കൽഹോസ്റ്റിലേക്കുള്ള അഭ്യർത്ഥനകളെ അനുവദിക്കുന്നു.</translation> <translation id="7092106376816104">പോപ്പ്-അപ്പ് ഒഴിവാക്കലുകള്</translation> <translation id="7093866338626856921"><ph name="HOSTNAMES" /> പേരിലുള്ള ഉപകരണങ്ങൾ ഉപയോഗിച്ച് ഡാറ്റ എക്സ്ചേഞ്ചുചെയ്യുക</translation> @@ -4578,7 +4583,7 @@ <translation id="715118844758971915">ക്ലാസിക് പ്രിന്ററുകൾ</translation> <translation id="7154130902455071009">നിങ്ങളുടെ ആരംഭ പേജ് ഇതായി മാറ്റുക: <ph name="START_PAGE" /></translation> <translation id="7155171745945906037">ക്യാമറയിൽ നിന്നോ ഫയലിൽ നിന്നോ ഉള്ള നിലവിലെ ഫോട്ടോ</translation> -<translation id="715568033737470079">Win32k ലോക്ക്ഡൗൺ സാൻഡ്ബോക്സ് നയത്തിൽത്തന്നെ പ്രവർത്തിക്കുന്ന PPAPI പ്ലഗിന്നുകൾ വ്യക്തമാക്കുക (Windows 10-നും അതിനുശേഷമുള്ളവയിലും മാത്രം).</translation> +<translation id="7155226869555939647">എപ്പോഴും <ph name="APPLICATION" />-ന്റെ ലിങ്കുകൾ തുറക്കുക</translation> <translation id="7156235233373189579">ഈ ഫയൽ, Windows സോഫ്റ്റ്വെയർ ഉപയോഗിക്കുന്ന ഒരു PC-യ്ക്കായി രൂപകൽപ്പന ചെയ്തിരിക്കുന്നു. Chrome OS പ്രവർത്തിപ്പിക്കുന്ന നിങ്ങളുടെ ഉപകരണത്തിന് ഇത് അനുയോജ്യമല്ല. അനുയോജ്യമായ മറ്റൊരു അപ്ലിക്കേഷനായി <ph name="BEGIN_LINK" />Chrome വെബ് സ്റ്റോറിൽ<ph name="END_LINK" /> തിരയുക.<ph name="BEGIN_LINK_HELP" />കൂടുതലറിയുക<ph name="END_LINK_HELP" /></translation> <translation id="7157063064925785854">തുടരുക ക്ലിക്കുചെയ്യുന്നതിലൂടെ നിങ്ങൾ <ph name="LEGAL_DOC_LINK_TEXT_1" />, <ph name="LEGAL_DOC_LINK_TEXT_2" />, <ph name="LEGAL_DOC_LINK_TEXT_3" />, <ph name="LEGAL_DOC_LINK_TEXT_4" /> എന്നിവ അംഗീകരിക്കുന്നു.</translation> <translation id="7158238151765743968">"<ph name="DEVICE_NAME" />" എന്നതിലേക്കുള്ള കണക്ഷൻ ഇപ്പോഴും പുരോഗതിയിലാണ്.</translation> @@ -4593,6 +4598,7 @@ <translation id="7175353351958621980">ഇതില്നിന്ന് ലോഡ് ചെയ്തത്:</translation> <translation id="7180611975245234373">പുതുക്കുക</translation> <translation id="7180865173735832675">ഇച്ഛാനുസൃതമാക്കുക</translation> +<translation id="7181387261278441780">സൈറ്റ് മായ്ച്ച് റീസെറ്റുചെയ്യുക</translation> <translation id="7185078796915954712">TLS 1.3</translation> <translation id="7185690883425432021">ടാബ്സ്ട്രിപ്പ് അടുക്കൽ മോഡിലായിരിക്കുമ്പോൾ നിഷ്ക്രിയമായ ടാബുകളുടെ 'അടയ്ക്കുക' ബട്ടണുകൾ മറയ്ക്കുന്നു.</translation> <translation id="7186088072322679094">ടൂൾബാറിൽ സൂക്ഷിക്കുക</translation> @@ -4625,7 +4631,6 @@ <translation id="7223775956298141902">അയ്യോ... നിങ്ങൾക്ക് വിപുലീകരണങ്ങൾ ഒന്നുമില്ല :-(</translation> <translation id="7224023051066864079">സബ്നെറ്റ് മാസ്ക്:</translation> <translation id="7225179976675429563">നെറ്റ്വർക്ക് തരം നഷ്ടമായി</translation> -<translation id="7230191962699768124">ആനിമേറ്റുചെയ്യാത്തതെല്ലാം കാണിക്കുക</translation> <translation id="7230787553283372882">നിങ്ങളുടെ ടെക്സ്റ്റ് വലുപ്പം ഇഷ്ടാനുസൃതമാക്കുക</translation> <translation id="7231224339346098802">എത്ര കോപ്പികള് പ്രിന്റു ചെയ്യണമെന്നത് സൂചിപ്പിക്കുന്നതിനായി ഒരു നമ്പര് ഉപയോഗിക്കുക (1 അല്ലെങ്കില് കൂടുതൽ).</translation> <translation id="7238585580608191973">SHA-256 ഫിംഗര്പ്രിന്റ്</translation> @@ -4757,7 +4762,6 @@ <translation id="7409233648990234464">വീണ്ടും സമാരംഭിക്കലും പവർവാഷും</translation> <translation id="7409836189476010449">Flash റൺ ചെയ്യുക</translation> <translation id="7410344089573941623">നിങ്ങളുടെ ക്യാമറയും മൈക്രോഫോണും ആക്സസ്സുചെയ്യാൻ <ph name="HOST" /> താൽപ്പര്യപ്പെടുന്നുണ്ടോയെന്ന് ചോദിക്കുക</translation> -<translation id="7411343637221933631">{NUM_COOKIES,plural, =1{ഈ സൈറ്റിൽ നിന്ന് ഒരെണ്ണം}other{ഈ സൈറ്റിൽ നിന്ന് # എണ്ണം}}</translation> <translation id="7412226954991670867">GPU മെമ്മറി</translation> <translation id="7416362041876611053">അജ്ഞാത നെറ്റ്വർക്ക് പിശക്.</translation> <translation id="7417453074306512035">എത്യോപിക് കീബോർഡ്</translation> @@ -4879,6 +4883,7 @@ <translation id="756445078718366910">ബ്രൌസര് വിന്ഡോ തുറക്കുക</translation> <translation id="7564847347806291057">പ്രക്രിയയുടെ അവസാനം</translation> <translation id="7566723889363720618">F12</translation> +<translation id="7567314848159753396">കുക്കി: <ph name="NAME" /></translation> <translation id="756809126120519699">Chrome ഡാറ്റ മായ്ച്ചു</translation> <translation id="7568790562536448087">അപ്ഡേറ്റുചെയ്യുന്നു</translation> <translation id="7573172247376861652">ബാറ്ററി ചാർജ്ജ്</translation> @@ -4919,6 +4924,7 @@ <translation id="7626009897377900107">പാസ്വേഡ് സൃഷ്ടിക്കൽ</translation> <translation id="7627262197844840899">ഈ സൈറ്റ് MasterCard-നെ അംഗീകരിക്കുന്നില്ല.</translation> <translation id="7627790789328695202">ക്ഷമിക്കണം, <ph name="FILE_NAME" /> ഇതിനകം നിലവിലുണ്ട്. അതിന്റെ പേരുമാറ്റി വീണ്ടും ശ്രമിക്കുക.</translation> +<translation id="7628127343934101653">ഡിഫോൾട്ട് PDF വ്യൂവർ അപ്ലിക്കേഷനിൽ PDF ഫയലുകൾ തുറക്കുക.</translation> <translation id="762917759028004464">നിലവിലെ ഡിഫോൾട്ട് ബ്രൗസർ <ph name="BROWSER_NAME" /> ആണ്.</translation> <translation id="7629536005696009600">അനുബന്ധ വെബ്സൈറ്റുകളിലേക്ക് ഫിൽ ചെയ്യേണ്ട Android അപ്ലിക്കേഷനുകൾക്കായി സംഭരിച്ചിരിക്കുന്ന ക്രഡൻഷ്യലുകളെ അനുവദിക്കുക.</translation> <translation id="7629827748548208700">ടാബ്: <ph name="TAB_NAME" /></translation> @@ -5147,6 +5153,7 @@ <translation id="7957513156576779045">ജോടിയാക്കുന്നതിന് Bluetooth ഓണാക്കുക</translation> <translation id="7957615753207896812">കീബോർഡ് ഉപകരണ ക്രമീകരണം തുറക്കുക</translation> <translation id="7959074893852789871">ഫയലില് ഒന്നിലധികം സാക്ഷ്യപ്ത്രങ്ങള് അടങ്ങിയിരിക്കുന്നു, അവയില് ചിലത് ഇറക്കുമതി ചെയ്തിട്ടില്ല:</translation> +<translation id="7959700692661109221"><ph name="BEGIN_PARAGRAPH" />നിങ്ങളുടെ ഉപകരണത്തിന്റെ ലൊക്കേഷൻ വേഗത്തിലും കൂടുതൽ കൃത്യമായും കണക്കാക്കാൻ സഹായിക്കുന്നതിന്, Google-ന്റെ ലൊക്കേഷൻ സേവനം Wi-Fi പോലുള്ള ഉറവിടങ്ങൾ ഉപയോഗിക്കുന്നു. Google-ന്റെ ലൊക്കേഷൻ സേവനങ്ങൾ ഓണാക്കുമ്പോൾ നിങ്ങളുടെ ഉപകരണം, Wi-Fi ഉപയോഗിച്ച് ലൊക്കേഷൻ വിവരങ്ങൾ നൽകുന്ന മോഡിലേക്ക് പ്രവേശിക്കുന്നു. എപ്പോൾ വേണമെങ്കിലും ലൊക്കേഷൻ ക്രമീകരണത്തിൽ ഇത് ഓഫാക്കാനാകും.<ph name="END_PARAGRAPH" /></translation> <translation id="7961015016161918242">ഒരിക്കലും</translation> <translation id="7964089325405904043">പാസ്വേഡ് ഇമ്പോർട്ട്, എക്സ്പോർട്ട് എന്നിവ ചെയ്യുക</translation> <translation id="7965010376480416255">പങ്കിട്ട മെമ്മറി</translation> @@ -5297,6 +5304,7 @@ <translation id="8146793085009540321">സൈൻ ഇൻ ചെയ്യാനായില്ല. നിങ്ങളുടെ അഡ്മിനിസ്ട്രേറ്ററെ ബന്ധപ്പെടുകയോ വീണ്ടും ശ്രമിക്കുകയോ ചെയ്യുക.</translation> <translation id="8148264977957212129">Pinyin ഇന്പുട്ട് രീതി</translation> <translation id="8148913456785123871">ലോഞ്ചറിൽ Google Now കാർഡുകൾ കാണിക്കുക</translation> +<translation id="8150391391298684512">Windows Runtime MIDI API പ്രവർത്തനരഹിതമാക്കുക</translation> <translation id="8151185429379586178">ഡവലപ്പര് ഉപകരണങ്ങള്</translation> <translation id="8151638057146502721">കോൺഫിഗർ ചെയ്യുക</translation> <translation id="8151639108075998630">അതിഥി ബ്രൌസിംഗ് പ്രാപ്തമാക്കുക</translation> @@ -5579,6 +5587,7 @@ <translation id="8532294913309524834">നിങ്ങളുടെ മുൻഗണന അനുസരിച്ച് ഭാഷകൾ ക്രമപ്പെടുത്തുക.</translation> <translation id="8535005006684281994">നെറ്റ്സ്കേപ്പ് സര്ട്ടിഫിക്കറ്റ് പുതുക്കല്URL</translation> <translation id="8539727552378197395">ഇല്ല (Httpമാത്രം)</translation> +<translation id="8541084862688000575">Android ആപ്സുകൾ സ്വയമേവ ലോഡുചെയ്യുക</translation> <translation id="8543181531796978784">നിങ്ങൾക്ക് <ph name="BEGIN_ERROR_LINK" />സുരക്ഷാപ്രശ്നം റിപ്പോർട്ടുചെയ്യാം<ph name="END_ERROR_LINK" /> അല്ലെങ്കിൽ, സുരക്ഷയെ ബാധിച്ചേക്കാവുന്ന അപകട സാധ്യതകളെക്കുറിച്ച് ബോധ്യമുണ്ടെങ്കിൽ <ph name="BEGIN_LINK" />സുരക്ഷിതമല്ലാത്ത ഈ സൈറ്റ്<ph name="END_LINK" />സന്ദർശിക്കുക.</translation> <translation id="8545107379349809705">വിവരങ്ങൾ മറയ്ക്കുക...</translation> <translation id="8545211332741562162">പരീക്ഷണാത്മക JavaScript സവിശേഷതകൾ ഉപയോഗിക്കാൻ വെബ് പേജുകൾ പ്രാപ്തമാക്കുക.</translation> @@ -5606,7 +5615,6 @@ <translation id="8569764466147087991">തുറക്കുന്നതിന് ഒരു ഫയല് തിരഞ്ഞെടുക്കുക</translation> <translation id="8571032220281885258">നിങ്ങൾ "ശരി Google" എന്നുപറയുമ്പോൾ, നിങ്ങൾ അടുത്തതായി പറയുന്നത് Chrome തിരയും.</translation> <translation id="8571108619753148184">സെർവർ 4</translation> -<translation id="8572832761467613633">Flash മാത്രം</translation> <translation id="8572981282494768930">നിങ്ങളുടെ ക്യാമറയും മൈക്രോഫോണും ആക്സസ്സ് ചെയ്യാൻ സൈറ്റുകളെ അനുവദിക്കരുത്</translation> <translation id="8574234089711453001">മീഡിയ url ഉപയോഗിച്ച് പേജ് തുറക്കുമ്പോൾ ഒരു ഡൗൺലോഡ് ബട്ടൺ ദൃശ്യമാക്കാൻ അനുവദിക്കുക.</translation> <translation id="857779305329188634">പരീക്ഷണാത്മക QUIC പ്രോട്ടോക്കോൾ പിന്തുണ പ്രവർത്തനക്ഷമമാക്കുക.</translation> @@ -5628,6 +5636,7 @@ <translation id="8600929685092827187">വേക്ക് ഓൺ പാക്കറ്റുകൾ</translation> <translation id="8601206103050338563">TLS WWW ക്ലയന്റ് പ്രാമാണീകരണം</translation> <translation id="8602851771975208551">നിങ്ങളുടെ കമ്പ്യൂട്ടറിലെ മറ്റൊരു പ്രോഗ്രാം Chrome പ്രവർത്തിക്കുന്ന രീതി മാറ്റിയേക്കാവുന്ന ഒരു അപ്ലിക്കേഷൻ ചേർത്തു.</translation> +<translation id="8603912787021349466">Android ആപ്സുകളെ സൈൻ ഇൻ ചെയ്തതിന് ശേഷം സ്വയമേവ ആരംഭിക്കാൻ അനുവദിക്കുക.</translation> <translation id="8605428685123651449">SQLite മെമ്മറി</translation> <translation id="8605503133013456784">"<ph name="DEVICE_NAME" />" എന്നതിൽ നിന്ന് വിച്ഛേദിക്കുന്നതിനും ജോഡിയല്ലാതാക്കുന്നതിനും പരാജയപ്പെട്ടു.</translation> <translation id="8606726445206553943">നിങ്ങളുടെ MIDI ഉപകരണങ്ങൾ ഉപയോഗിക്കുക</translation> @@ -5979,6 +5988,7 @@ <translation id="9053965862400494292">സമന്വയം സജ്ജമാക്കാന് ശ്രമിക്കുന്നതിനിടയില് ഒരു പിശകു സംഭവിച്ചു.</translation> <translation id="9056034633062863292">Chromebox അപ്ഡേറ്റുചെയ്യുന്നു</translation> <translation id="9056810968620647706">പൊരുത്തങ്ങളൊന്നും കണ്ടെത്തിയില്ല.</translation> +<translation id="9057119625587205566">സമീപത്ത് പ്രിന്ററുകളില്ല</translation> <translation id="9059868303873565140">സ്റ്റാറ്റസ് മെനു</translation> <translation id="9064142312330104323">Google പ്രൊഫൈൽ ഫോട്ടോ (ലോഡുചെയ്യുന്നു)</translation> <translation id="9064275926664971810">ഒരൊറ്റ ക്ലിക്കിലൂടെ ഫോമുകള് പൂരിപ്പിക്കുന്നതിന്, ഓട്ടോഫിൽ പ്രവർത്തനക്ഷമമാക്കുക</translation> @@ -5989,6 +5999,7 @@ <translation id="9067401056540256169">ഈ ഫ്ലാഗ് Chrome-നെ സുരക്ഷിതമല്ലാത്തതാക്കുന്നു. ഇതിന്റെ ഉപയോഗം മനസിലാക്കിയെങ്കിൽ മാത്രം ഇത് ഉപയോഗിക്കുക. അറിയിപ്പൊന്നുമില്ലാതെ തന്നെ ഈ ഫ്ലാഗ് നീക്കംചെയ്തേക്കാമെന്നത് ശ്രദ്ധിക്കുക. പ്രവർത്തനക്ഷമമാക്കിയിട്ടുണ്ടെങ്കിൽ, ഒരു https ഉറവിടമുള്ള ഫ്രെയിമുകൾക്ക് സുരക്ഷിതമല്ലാത്ത URL (ws://) ഉള്ള WebSockets ഉപയോഗിക്കാനാകും.</translation> <translation id="9068931793451030927">പാത:</translation> <translation id="9070219033670098627">ഉപയോക്താവിനെ മാറ്റുക</translation> +<translation id="9070940116164932228">ത്രോട്ടിൽ എക്സ്പെൻസീവ് പശ്ചാത്തല ടൈമറുകൾ</translation> <translation id="907148966137935206">പോപ്പ്-അപ്പുകള് കാണിക്കാന് ഒരു സൈറ്റിനെയും അനുവദിക്കരുത് (ശുപാര്ശിതം)</translation> <translation id="9072550133391925347">നിങ്ങൾ സംരക്ഷിച്ച പാസ്വേഡുകൾ ഉപയോഗിച്ച് യോഗ്യമായ സൈറ്റുകളിലേക്കും ആപ്സിലേക്കും <ph name="PASSWORD_MANAGER_BRAND" />, നിങ്ങളെ സ്വയമേവ സൈൻ ഇൻ ചെയ്യിക്കുന്നു.</translation> <translation id="9073281213608662541">PAP</translation> @@ -6023,6 +6034,7 @@ <translation id="9112614144067920641">ഒരു പുതിയ PIN ദയവായി തിരഞ്ഞെടുക്കുക.</translation> <translation id="9112748030372401671">നിങ്ങളുടെ വാൾപേപ്പർ മാറ്റുക</translation> <translation id="9112987648460918699">കണ്ടെത്തുക...</translation> +<translation id="9114663181201435112">എളുപ്പത്തിൽ സൈൻ ഇൻ ചെയ്യുക</translation> <translation id="9115487443206954631">Cast ഉപകരണങ്ങൾ മാനേജുചെയ്യുക</translation> <translation id="9115675100829699941">&ബുക്ക്മാര്ക്കുകള്</translation> <translation id="9121814364785106365">പിന് ചെയ്ത ടാബായി തുറക്കുക</translation> @@ -6117,7 +6129,6 @@ <translation id="952992212772159698">സജീവമാക്കിയില്ല</translation> <translation id="960719561871045870">ഓപ്പറേറ്റർ കോഡ്</translation> <translation id="960987915827980018">ഏകദേശം 1 മണിക്കൂർ ശേഷിക്കുന്നു</translation> -<translation id="962778376131245616">സുരക്ഷിതമല്ലാത്തതും ആനിമേറ്റുചെയ്തതുമായവ മാത്രം കാണിക്കുക</translation> <translation id="96421021576709873">Wi-Fi നെറ്റ്വർക്ക്</translation> <translation id="965490406356730238">ക്യാപ്ചർ ചെയ്ത ഫ്രെയിമിനായി ലഭ്യമായിരിക്കുമ്പോൾ ഹാർഡ്വെയർ ത്വരിതപ്പെടുത്തിയ mjpeg ഡീകോഡ് പ്രവർത്തനക്ഷമമാക്കുക.</translation> <translation id="968174221497644223">അപ്ലിക്കേഷന് കാഷെ</translation>
diff --git a/chrome/app/resources/generated_resources_mr.xtb b/chrome/app/resources/generated_resources_mr.xtb index 989282f..11078da 100644 --- a/chrome/app/resources/generated_resources_mr.xtb +++ b/chrome/app/resources/generated_resources_mr.xtb
@@ -18,7 +18,6 @@ <translation id="1029317248976101138">झूम करा</translation> <translation id="1029595648591494741">"<ph name="EXTENSION_NAME" />" वापरून पहायचे?</translation> <translation id="1031362278801463162">पूर्वावलोकन लोड करत आहे</translation> -<translation id="1031460590482534116">क्लायंट प्रमाणपत्र संचयित करण्याचा प्रयत्न करताना एक त्रुटी आली. त्रुटी <ph name="ERROR_NUMBER" /> (<ph name="ERROR_NAME" />).</translation> <translation id="1031573127485938293">विचारा (धोरणानुसार)</translation> <translation id="103279545524624934">Android अॅप्स लाँच करण्यासाठी डिस्क स्थान मोकळे करा.</translation> <translation id="1033780634303702874">आपल्या अनुक्रमिक डिव्हाइसेसवर प्रवेश करा</translation> @@ -101,6 +100,7 @@ <translation id="1128591060186966949">शोध इंजिन संपादित करा</translation> <translation id="1128987120443782698">संचयन डिव्हाइसची क्षमता <ph name="DEVICE_CAPACITY" /> आहे. कृपया कमीत कमी 4GB क्षमतेचे एक SD कार्ड किंवा USB मेमरी स्टिक घाला. </translation> <translation id="1137135726305341424">domContentLoaded (मुख्य फ्रेम आणि समान मूळ iframes) पूर्वी domContentLoaded आणि सर्व संसाधने लोड करणे प्रारंभ झाले.</translation> +<translation id="1138663153846032155">फ्लॅश पेक्षा HTML ला प्राधान्य द्या</translation> <translation id="1140351953533677694">आपल्या Bluetooth आणि अनुक्रमिक डिव्हाइसेसवर प्रवेश करा</translation> <translation id="114140604515785785">विस्तार मूळ निर्देशिका:</translation> <translation id="1143142264369994168">प्रमाणपत्र स्वाक्षरीकर्ता</translation> @@ -252,6 +252,7 @@ <translation id="1351692861129622852"><ph name="FILE_COUNT" /> फायली आयात करीत आहे...</translation> <translation id="1352103415082130575">थाई कीबोर्ड (Pattachote)</translation> <translation id="1353686479385938207"><ph name="PROVIDER_NAME" />: <ph name="NETWORK_NAME" /></translation> +<translation id="1353946958707294039">वस्तू डिझाइन संचय व्यवस्थापक</translation> <translation id="1353966721814789986">स्टार्टअप पृष्ठे</translation> <translation id="1354868058853714482">Adobe Reader कालबाह्य आणि कदाचित असुरक्षित आहे.</translation> <translation id="1355408554203439639">3D सॉफ्टवेअर रास्टरायझर</translation> @@ -423,7 +424,6 @@ <translation id="1533920822694388968">टीव्ही संरेखन</translation> <translation id="15373452373711364">मोठा माउस कर्सर</translation> <translation id="1543284117603151572">Edge वरून आयात केले</translation> -<translation id="1544350195767834591">{NUM_COOKIES,plural, =1{अन्य साइट मधील 1}one{अन्य साइट मधील #}other{अन्य साइट मधील #}}</translation> <translation id="1545177026077493356">स्वयंचलित कियोस्क मोड</translation> <translation id="1545786162090505744">क्वेरीच्या जागेवर % सह URL</translation> <translation id="1546280085599573572">आपण होम बटण क्लिक करता तेव्हा कोणते पृष्ठ दर्शविले जाते हे या विस्ताराने बदलले आहे.</translation> @@ -447,7 +447,6 @@ <translation id="1559235587769913376">युनिकोड वर्ण इनपुट करा</translation> <translation id="1561092721008294962">UI मजकुरासाठी HarfBuzz</translation> <translation id="1566049601598938765">वेबसाइट</translation> -<translation id="1566958206723629112">फ्लॅश आणि PDF</translation> <translation id="1567723158593978621">सक्षम केलेले असताना, ब्राउझरमध्ये साइन इन करणे नवीन gaia संकेतशब्दाने-विभक्त केलेले साइन इन प्रवाह वापरेल.</translation> <translation id="1567993339577891801">JavaScript कन्सोल</translation> <translation id="1568323446248056064">प्रदर्शन डिव्हाइस सेटिंग्ज उघडा</translation> @@ -575,7 +574,6 @@ <translation id="1723940674997333416">मूळ https वरील असुरक्षित WebSocket ला अनुमती द्या</translation> <translation id="1725149567830788547">&नियंत्रणे दर्शवा</translation> <translation id="172612876728038702">TPM सेट अप केले जात आहे. कृपया धीर धरा, यात काही मिनिटे लागू शकतात.</translation> -<translation id="1727135806684246609">सामग्री सुरक्षितता शाब्दिक</translation> <translation id="1729533290416704613">आपण विविधोपयोगी क्षेत्रातून शोध घेता तेव्हा कोणते पृष्ठ दर्शविले जाते हे देखील हे नियंत्रित करते.</translation> <translation id="1731346223650886555">अर्धविराम</translation> <translation id="1731589410171062430">एकूण: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /> (<ph name="NUMBER_OF_PAGES" /> <ph name="PAGE_OR_PAGES_LABEL" />)</translation> @@ -641,7 +639,7 @@ <translation id="1825832322945165090">डिव्हाइसवर पुरेसे रिक्त स्थान नाही</translation> <translation id="1826516787628120939">तपासत आहे</translation> <translation id="1828149253358786390"><ph name="SITE" /> आपल्याला सूचना पाठवू इच्छिते.</translation> -<translation id="1828378091493947763">हे प्लगिन या डिव्हाइसवर उपलब्ध नाही</translation> +<translation id="1828378091493947763">हे प्लगिन या डिव्हाइसवर समर्थित नाही</translation> <translation id="1828901632669367785">सिस्टम संवाद वापरून मुद्रित करा…</translation> <translation id="1829192082282182671">झूम &कमी करा</translation> <translation id="1830550083491357902">साइन इन केलेले नाही</translation> @@ -871,6 +869,7 @@ <translation id="218492098606937156">टच इव्हेंट सक्षम करा</translation> <translation id="2187317261103489799">शोधा (डीफॉल्ट)</translation> <translation id="2187895286714876935">सर्व्हर प्रमाणपत्र आयात त्रुटी</translation> +<translation id="2188881192257509750"><ph name="APPLICATION" /> उघडा</translation> <translation id="2190069059097339078">WiFi क्रेडेन्शियल मिळविणारा</translation> <translation id="219008588003277019">नेटिव्ह क्लायंट मॉड्यूल: <ph name="NEXE_NAME" /></translation> <translation id="2190355936436201913">(रिक्त)</translation> @@ -989,6 +988,7 @@ <translation id="2326606747676847821">गुप्त व्हा</translation> <translation id="2326931316514688470">&अॅप रीलोड करा</translation> <translation id="2327492829706409234">अॅप सक्षम करा</translation> +<translation id="2328054044222305089">हे आपल्या डिव्हाइसवर <ph name="SITE" /> ने संचयित केलेल्या कोणत्याही डेटास हटवेल आणि चालविण्यासाठी आपण मंजूरी दिलेल्या कोणत्याही परवानग्यांना रीसेट करेल. आपण सुरु ठेवू इच्छिता?</translation> <translation id="2329597144923131178">आपल्या सर्व डिव्हाइसेस वरील आपले बुकमार्क, इतिहास, संकेतशब्द आणि इतर सेटिंग्ज मिळविण्यासाठी साइन इन करा.</translation> <translation id="2332131598580221120">स्टोअर मध्ये पहा</translation> <translation id="2332742915001411729">डीफॉल्टवर रीसेट करा</translation> @@ -1264,7 +1264,6 @@ <translation id="2675358154061544447">स्वतंत्र प्रक्रियांमध्ये क्रॉस-साइट iframe प्रदान करण्यासाठी सर्वोच्च प्रायोगिक समर्थन. या मोडमध्ये, दस्तऐवज समान वेबसाइट वरील असतील तरच ते प्रदानकर्ता प्रक्रिया सामायिक करतील.</translation> <translation id="2676946222714718093">यावर प्ले होत आहे</translation> <translation id="2678063897982469759">पुन्हा-सक्षम करा</translation> -<translation id="2678246812096664977">सर्व प्लगिन</translation> <translation id="2679385451463308372">सिस्टम संवाद वापरून मुद्रित करा…</translation> <translation id="2680208403056680091">आपले इंटरनेट कनेक्शन नियंत्रित केले जात आहे</translation> <translation id="268053382412112343">इति&हास</translation> @@ -1438,7 +1437,6 @@ <translation id="287286579981869940"><ph name="PROVIDER_NAME" /> जोडा...</translation> <translation id="2872961005593481000">बंद करा</translation> <translation id="2875698561019555027">(Chrome त्रुटी पृष्ठे)</translation> -<translation id="2879560882721503072"><ph name="ISSUER" /> द्वारे जारी केलेले क्लायंट प्रमाणपत्र यशस्वीरित्या संग्रहीत झाले.</translation> <translation id="288024221176729610">झेक</translation> <translation id="288042212351694283">आपल्या सर्वंकष 2 रा घटक डिव्हाइसेसवर प्रवेश करा</translation> <translation id="2881966438216424900"> अखेरचा प्रवेशः</translation> @@ -1583,6 +1581,7 @@ <translation id="3057861065630527966">आपले फोटो आणि व्हिडिओंचा बॅकअप घ्या</translation> <translation id="3058212636943679650">आपल्याला आपल्या संगणकाची ऑपरेटिंग प्रणाली नेहमी पुनर्स्थापित करणे आवश्यक असल्यास आपल्याला एक पुनर्प्राप्ती SD कार्ड किंवा USB मेमरी स्टिकची आवश्यकता असेल.</translation> <translation id="305932878998873762">HTTP साठी साधे कॅशे एक नवीन कॅशे आहे. डिस्क जागा वाटपासाठी ते फाईलसिस्टीमवर अवलंबून असते.</translation> +<translation id="3060251871394327123">हे आपल्या डिव्हाइसवर <ph name="SITE" /> ने संचयित केलेल्या कोणत्याही डेटास हटवेल. आपण सुरु ठेवू इच्छिता?</translation> <translation id="3061650404498811439">निवडण्यायोग्य IME मेनूवरून इमोजी, हस्ताक्षर आणि व्हॉइस इनपुट फॉर्म मध्ये प्रवेश सक्षम करा.</translation> <translation id="3062606427884046423">Chrome मीडिया सूचनांसाठी Android MediaStyle सूचना वापरा.</translation> <translation id="3063844757726132584">या सोयीस्कर लाँचर मधून आपल्या सर्व अॅप्समध्ये प्रवेश करा. Play गेम्स, व्हिडिओ चॅट, संगीत ऐका, दस्तऐवज संपादित करा किंवा आणखी अॅप्स मिळवा.</translation> @@ -1632,6 +1631,7 @@ <translation id="3123569374670379335">(पर्यवेक्षित)</translation> <translation id="3124111068741548686">वापरकर्ता हँडल</translation> <translation id="3126026824346185272">Ctrl</translation> +<translation id="3127156390846601284">दर्शविलेल्या सर्व साइटसाठी आपल्या डिव्हाइसवर संचयित केलेल्या कोणत्याही डेटास हे हटवेल. आपण सुरु ठेवू इच्छिता?</translation> <translation id="312759608736432009">डिव्हाइस निर्माता:</translation> <translation id="3127919023693423797">प्रमाणीकरण करीत आहे...</translation> <translation id="3128230619496333808">टॅब 6</translation> @@ -1730,7 +1730,6 @@ <translation id="3264544094376351444">Sans-serif font</translation> <translation id="3264547943200567728">आपल्या Chromebox चे नेटवर्क सेट करण्यात अयशस्वी</translation> <translation id="3265459715026181080">विंडो बंद करा</translation> -<translation id="3267271790328635957">केवळ PDF</translation> <translation id="3267726687589094446">एकाधिक फायलींच्या स्वयंचलित डाउनलोडिंगला अनुमती देणे सुरू ठेवा</translation> <translation id="3267998849713137817">सुधारित वेळ</translation> <translation id="3268451620468152448">उघडे Tabs</translation> @@ -1976,6 +1975,7 @@ <translation id="3574210789297084292">साइन इन करा</translation> <translation id="3574305903863751447"><ph name="CITY" />, <ph name="STATE" /> <ph name="COUNTRY" /></translation> <translation id="357479282490346887">लिथुआनियन</translation> +<translation id="3575927481544652747">WebMIDI साठी, Windows Runtime MIDI API अक्षम करा जो Windows 10 किंवा त्यानंतरच्या आवृत्तीवर डीफॉल्टनुसार सक्षम केला जाऊ शकतो.</translation> <translation id="3576324189521867626">यशस्वीरित्या स्थापित केला</translation> <translation id="3578331450833904042">डीफॉल्ट (सर्वकाही उचला)</translation> <translation id="3578594933904494462">या टॅबची सामग्री सामायिक केली जात आहे.</translation> @@ -2029,8 +2029,6 @@ <translation id="3627320433825461852">1 मिनिटापेक्षा कमी बाकी</translation> <translation id="3627588569887975815">गु&प्त विंडोमध्ये दुवा उघडा</translation> <translation id="3627671146180677314">Netscape प्रमाणपत्र नूतनीकरण वेळ</translation> -<translation id="3629326610814700057">स्थानिक संचय व्यवस्थापित करण्यासाठी संचय व्यवस्थापकास सक्षम करते.</translation> -<translation id="3630337581925712713"><ph name="PERMISSION_TYPE_LABEL" />:</translation> <translation id="3631337165634322335">खालील अपवाद केवळ वर्तमान गुप्त सत्रावर लागू होऊ शकतात.</translation> <translation id="3633586230741134985">अॅप लाँचर सेटिंग्ज</translation> <translation id="3633997706330212530">आपण वैकल्पिकरित्या या सेवा अक्षम करु शकता.</translation> @@ -2053,7 +2051,7 @@ <translation id="3654045516529121250">आपल्या प्रवेश योग्यता सेटिंग्ज वाचा</translation> <translation id="3654092442379740616">समक्रमण त्रुटी: <ph name="PRODUCT_NAME" /> कालबाह्य नाही आणि अद्यतनित केले जाणे आवश्यक आहे.</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{यास एका फाईलवर कायमचा प्रवेश आहे.}one{यास # फाईलवर कायमचा प्रवेश आहे.}other{यास # फायलींवर कायमचा प्रवेश आहे.}}</translation> -<translation id="3657468915905674858">PPAPI Win32k लॉकडाउन सक्षम करा.</translation> +<translation id="365793796291733849"><ph name="BEGIN_PARAGRAPH1" /> आपण स्वयंचलित बॅक अप चालू करता, तेव्हा डिव्हाइस आणि अॅप डेटा नियमितपणे Google ड्राइव्ह मधील एका खाजगी फोल्डरमध्ये जतन केला जातो. अॅप डेटा हा संपर्क, संदेश आणि फोटो यासारख्या संभाव्य संवेदनशील डेटासह, अॅपने जतन केलेला (विकासक सेटिंग्जवर आधारित) कोणताही डेटा असू शकतो. <ph name="END_PARAGRAPH1" /><ph name="BEGIN_PARAGRAPH2" /> बॅकअप डेटाची आपल्या ड्राइव्ह संचय कोट्यासाठी गणना केली जाणार नाही. मोठ्या फायली किंवा विकासकांनी सेवेतून वगळण्यासाठी निवडलेल्या फायलींचा बॅकअप घेतला जाणार नाही. <ph name="END_PARAGRAPH2" /></translation> <translation id="3660234220361471169">अविश्वासू</translation> <translation id="3665589677786828986">Chrome ला आढळले आहे की आपल्या काही सेटिंग्ज दुसर्या प्रोग्रामद्वारे दूषित झाल्या होत्या आणि त्यांच्या मूळ डीफॉल्टवर त्या रीसेट केल्या.</translation> <translation id="3665842570601375360">सुरक्षितता:</translation> @@ -2108,6 +2106,7 @@ <translation id="3733127536501031542">स्टेप-अप सह SSL सर्व्हर</translation> <translation id="3736520371357197498">आपल्याला आपल्या सुरक्षिततेच्या जोखमी समजत असल्यास, धोकादायक प्रोग्राम काढण्यापूर्वी आपण <ph name="BEGIN_LINK" />या असुरक्षित साइटला भेट देऊ शकता<ph name="END_LINK" />.</translation> <translation id="3738924763801731196"><ph name="OID" />:</translation> +<translation id="3739254215541673094"><ph name="APPLICATION" /> उघडायचा?</translation> <translation id="3739798227959604811">पुनरावृत्तीपूर्वी विलंब:</translation> <translation id="3741158646617793859">आता <ph name="DEVICE_NAME" /> Admin Console मध्ये दिसेल</translation> <translation id="3741243925913727067">Google ड्राइव्हवर आपल्या मीडिया डिव्हाइसच्या फोटो आणि व्हिडिओंचा बॅकअप घ्या.</translation> @@ -2347,7 +2346,6 @@ <translation id="4058793769387728514">त्वरित दस्तऐवज तपासा</translation> <translation id="4059285154003114015">&फ्रेम मुद्रित करा...</translation> <translation id="406070391919917862">पार्श्वभूमी अनुप्रयोग</translation> -<translation id="4061502419206152498">फक्त सुरक्षित नसलेले, अॅनिमेटेड नसलेले दर्शवा</translation> <translation id="4062251648694601778">आपल्या <ph name="SHORT_PRODUCT_NAME" /> डिव्हाइसचा आनंद घ्या. नवीन प्रश्न आहेत? आपण स्थिती ट्रे मध्ये "?" क्लिक करून नेहमी मदत मिळवू शकता.</translation> <translation id="4065876735068446555">आपण वापरत असलेल्या (<ph name="NETWORK_ID" />) नेटवर्कला त्याच्या लॉग इन पृष्ठास भेट देण्याची आवश्यकता असू शकते.</translation> <translation id="4068506536726151626">या पृष्ठावर आपले स्थान ट्रॅक करणार्या खालील साइटवरील घटक समाविष्ट आहेत:</translation> @@ -2384,7 +2382,6 @@ <translation id="4101878899871018532">संकेतशब्द व्यवस्थापक संकालित करण्यासाठी वापरले जाणारे क्रेडेन्शियल जतन करण्याची ऑफर देणार नाही.</translation> <translation id="410351446219883937">ऑटोप्ले</translation> <translation id="4104163789986725820">नि&र्यात करा...</translation> -<translation id="4105523032910086267">वस्तू डिझाइन मधील सामग्री सुरक्षितता शब्दांचे अॅनिमेशन आणि दृश्यमानता सेट करते.</translation> <translation id="4105563239298244027">Google ड्राइव्हसह 1 TB विनामूल्य मिळवा</translation> <translation id="4109135793348361820"><ph name="USER_NAME" /> (<ph name="USER_EMAIL" />) वर विंडो हलवा</translation> <translation id="4110342520124362335"><ph name="DOMAIN" /> वरील कुकीज अवरोधित.</translation> @@ -2435,6 +2432,7 @@ <translation id="418179967336296930">रशियन ध्वन्यात्मक (YaZHert) कीबोर्ड</translation> <translation id="4181841719683918333">भाषा</translation> <translation id="4187248015940562149">वेब Bluetooth सक्षम करते जे वेबसाइटना यास कनेक्ट करण्याची आणि आपल्या आसपासच्या Bluetooth डिव्हाइसेसना नियंत्रित करण्याची अनुमती देऊ शकते.</translation> +<translation id="4188447344915957833">वस्तू डिझाइन सेटिंग्जमध्ये संचय व्यवस्थापकास सक्षम करते.</translation> <translation id="4189406272289638749"><b><ph name="EXTENSION_NAME" /></b> विस्तार, हे सेटिंग नियंत्रित करत आहे.</translation> <translation id="4193154014135846272">Google दस्तऐवज</translation> <translation id="4193182321948161343">वस्तू डिझाइन वापरकर्ता व्यवस्थापक सक्षम करा</translation> @@ -2642,6 +2640,7 @@ <translation id="4508765956121923607">स्त्रो&त पाहा</translation> <translation id="4509017836361568632">फोटो टाकून द्या</translation> <translation id="4509345063551561634">स्थान:</translation> +<translation id="4513946894732546136">अभिप्राय</translation> <translation id="4514542542275172126">नवीन पर्यवेक्षी वापरकर्ता सेट अप करा</translation> <translation id="4514914692061505365">सर्व पिक्से फायलींसाठी PNaCl च्या जलद सबजिरो भाषांतरकर्त्याचा वापर करण्यास सक्ती करते.</translation> <translation id="451515744433878153">काढा</translation> @@ -2740,6 +2739,7 @@ <translation id="4656293982926141856">हा संगणक</translation> <translation id="4656631038341342120">या डिव्हाइससाठी VR शेल उपलब्ध असल्यास ते सक्षम करा.</translation> <translation id="4657031070957997341"><ph name="HOST" /> वर प्लगिन ना नेहमी अनुमती द्या</translation> +<translation id="466008749075469935">पार्श्वभूमी टायमरच्या CPU वापरास 1% पुरते मर्यादित करण्यासाठी हस्तक्षेपास सक्षम करते.</translation> <translation id="4663254525753315077">शक्य असेल तेव्हा, वेगवान स्क्रोलिंगसाठी विभाजित केलेल्या स्तरावर उत्सारित स्क्रोलिंग घटकांचे स्क्रोलिंग घटक ठेवते.</translation> <translation id="4664482161435122549">PKCS #12 निर्यात त्रुटी</translation> <translation id="4665014895760275686">निर्माता</translation> @@ -2807,6 +2807,7 @@ <translation id="4749157430980974800">जॉर्जियन कीबोर्ड</translation> <translation id="4750394297954878236">सूचना</translation> <translation id="475088594373173692">प्रथम वापरकर्ता</translation> +<translation id="4750892496809949692">प्लगिनच्या सूचीमधून फ्लॅश लपवून HTML सामग्रीस प्राधान्य द्या.</translation> <translation id="4750917950439032686">आपली माहिती (उदाहरणार्थ, संकेतशब्द किंवा क्रेडिट कार्ड क्रमांक) या साइटवर पाठविली जाते तेव्हा ती खाजगी राहते.</translation> <translation id="4753602155423695878">Android फोनचे पृष्ठ लोड होत असल्याचे प्रगती बार अॅनिमेशन</translation> <translation id="4755240240651974342">फिन्निश कीबोर्ड</translation> @@ -3082,6 +3083,7 @@ <translation id="5119450342834678097">सेटिंग्ज मेनूमध्ये टॅबलेट साइट पर्यायाची विनंती करा</translation> <translation id="5120068803556741301">तृतीय पक्ष इनपुट पद्धत</translation> <translation id="5120421890733714118">वेबसाइट ओळखण्यासाठी या प्रमाणपत्र विश्वास ठेवा.</translation> +<translation id="5120516977819314347">पिन किंवा संकेतशब्द चुकीचा आहे.</translation> <translation id="5121130586824819730">आपली हार्ड डिस्क पूर्ण भरली आहे. कृपया दुसर्या स्थानावर जतन करा किंवा हार्ड डिस्कवर अधिक जागा तयार करा.</translation> <translation id="5125751979347152379">अवैध URL.</translation> <translation id="5127881134400491887">नेटवर्क कनेक्शन व्यवस्थापित करा</translation> @@ -3089,6 +3091,7 @@ <translation id="512903556749061217">संलग्न केले</translation> <translation id="5129301143853688736">या साइटवरील आपले कनेक्शन खाजगी नाही. आक्रमणकर्ते कदाचित <ph name="DOMAIN" /> वरून आपली माहिती चोरण्याचा प्रयत्न करीत असू शकतात (उदाहरणार्थ, फोटो, संकेतशब्द, संकेतशब्द, संदेश आणि क्रेडिट कार्ड).</translation> <translation id="5129662217315786329">पोलिश</translation> +<translation id="5131347545782851480">PDF दस्तऐवज</translation> <translation id="5134856901811723984">Chrome OS सिस्टीम UI मध्ये वस्तू डिझाइन</translation> <translation id="5135533361271311778">बुकमार्क आयटम तयार करणे शक्य नाही.</translation> <translation id="5136529877787728692">F7</translation> @@ -3216,7 +3219,7 @@ <translation id="527605982717517565"><ph name="HOST" /> वर JavaScript ला नेहमी परवानगी द्या</translation> <translation id="52809057403474396">या पृष्ठावर प्लगिन अवरोधित केले होते.</translation> <translation id="5283008903473888488">"<ph name="BUNDLE_NAME" />" हे विस्तार या <ph name="USER_NAME" /> साठी जोडते:</translation> -<translation id="5283677936944177147">अरेरे! डिव्हाइस नमुना किंवा अनुक्रमांक निर्धारित करण्यात सिस्टीम अयशस्वी झाली.</translation> +<translation id="5283677936944177147">अरेरे! डिव्हाइस मॉडेल किंवा अनुक्रमांक निर्धारित करण्यात सिस्टीम अयशस्वी झाली.</translation> <translation id="528468243742722775">समाप्त</translation> <translation id="5286673433070377078">पूर्वगामी किनार प्रस्तुत करणारे पथ - आपला ब्राउझर क्रॅश करण्यासारखे</translation> <translation id="5287425679749926365">आपली खाती</translation> @@ -3257,6 +3260,7 @@ <translation id="5328031682234198929">8</translation> <translation id="5329858601952122676">&हटवा</translation> <translation id="5330145655348521461">या फायली एका भिन्न डेस्कटॉपवर उघडलेल्या आहेत. या पाहण्यासाठी <ph name="USER_NAME" /> (<ph name="MAIL_ADDRESS" />) वर हलवा.</translation> +<translation id="5330512191124428349">माहिती मिळवा</translation> <translation id="5332624210073556029">टाइम झोन:</translation> <translation id="5333807720589685258">आपण योग्य पिन अनलॉक की प्रविष्ट न केल्यास आपले सिम कार्ड कायमचे अक्षम केले जाईल.</translation> <translation id="5333958554630697967">विकसित होत असलेली प्रायोगिक वेब प्लॅटफॉर्म वैशिष्ट्ये सक्षम करते.</translation> @@ -3688,7 +3692,6 @@ <translation id="5892507820957994680">अंगभूत सॉफ्टवेअर प्रस्तुतीकरण सूची अधिलिखित करते आणि असमर्थित सिस्टम कॉन्फिगरेशनवर GPU-प्रवेग सक्षम करते.</translation> <translation id="5895138241574237353">रीस्टार्ट करा</translation> <translation id="5895187275912066135">रोजी जारी केले</translation> -<translation id="5898154795085152510">सर्व्हरने अवैध क्लायंटचे प्रमाणपत्र परत केले. त्रुटी <ph name="ERROR_NUMBER" /> (<ph name="ERROR_NAME" />).</translation> <translation id="5900302528761731119">Google प्रोफाइल फोटो</translation> <translation id="590253956165195626">आपण वाचत असलेल्या भाषेमध्ये नसलेल्या पृष्ठांचे भाषांतर करण्याचा प्रस्ताव द्या.</translation> <translation id="5904093760909470684">प्रॉक्झी कॉन्फिगरेशन</translation> @@ -3743,12 +3746,14 @@ <translation id="5984222099446776634">अलीकडे भेट दिलेले</translation> <translation id="5984814259619230127">Smart Lock Bluetooth कमी ऊर्जा शोध</translation> <translation id="5986245990306121338">सक्षम असल्यास, सेटिंग्ज मधील 'टॅब आणि अॅप्स विलीन करा' पर्याय चालू असताना देखील, टॅब स्विचर दर्शविला जाईल.</translation> +<translation id="5989712527536636369"><ph name="BEGIN_PARAGRAPH1" />आपल्या डिव्हाइसविषयी आणि आपण ते कसे वापरता याविषयी ही सामान्य माहिती आहे, जसे की बॅटरीची पातळी, आपण आपले अॅप्स किती वारंवार वापरता, आपल्या नेटवर्क कनेक्शनची गुणवत्ता आणि कालावधी (जसेकी Wi-Fi आणि Bluetooth) आणि वस्तूंनी जसे कार्य करावे त्याप्रकारे त्या करत नसल्यास क्रॅश अहवाल. प्रत्येकासाठी Google ची उत्पादने आणि सेवा सुधारण्यासाठी ही वापरली जाईल. काही एकत्रित केलेली माहिती, Android विकासक सारख्या भागीदारांना त्यांचे अॅप्स आणि उत्पादने अधिक चांगले बनविण्यात देखील मदत करेल.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />आपण Android अॅप्स सेटिंग्ज मध्ये हे कधीही चालू किंवा बंद करू शकता. यामुळे सिस्टीम अद्यतन आणि सुरक्षितता यासारख्या आवश्यक असलेल्या सेवांंना आवश्यक असलेली माहिती पाठविण्याची या डिव्हाइसची क्षमता प्रभावित होत नाही.<ph name="END_PARAGRAPH2" /></translation> <translation id="5990198433782424697">chrome:// URLs वरील विस्तार</translation> <translation id="5990814808592353318">व्यक्तिचलितरित्या संकेतशब्द निर्मिती.</translation> <translation id="5991049340509704927">विशालित करा</translation> <translation id="5991774521050363748">वेब सूचनांसाठी सानुकूल लेआउट सक्षम करा. त्यामध्ये अन्यथा शक्य नसलेल्या अचूक लेआउट सुधारणा असतील.</translation> <translation id="5993332328670040093">आपला डेटा वापर यापुढे मोजला जाणार नाही.</translation> -<translation id="5998167623928667649">फ्लॅश सेटिंग "अनुमती द्या" वर सेट केले असते सर्व फ्लॅश सामग्री चालवा</translation> +<translation id="5998167623928667649">फ्लॅश सेटिंग "अनुमती द्या" वर सेट केले असते तेव्हा सर्व फ्लॅश सामग्री चालवा</translation> <translation id="6003177993629630467"><ph name="PRODUCT_NAME" /> कदाचित त्यास अद्यतनित ठेवण्यास सक्षम नाही. </translation> <translation id="6003294706906016758">होस्ट केलेल्या अॅप्ससाठी वेब अॅप शैली फ्रेम सक्षम करते</translation> <translation id="600424552813877586">अवैध अनुप्रयोग.</translation> @@ -3756,6 +3761,7 @@ <translation id="6005695835120147974">मीडिया राउटर</translation> <translation id="6007237601604674381">हलविणे अयशस्वी. <ph name="ERROR_MESSAGE" /></translation> <translation id="6008241731410823808">हायपरलिंक परीक्षण पिंग पाठविते.</translation> +<translation id="6011449291337289699">साइट डेटा साफ करा</translation> <translation id="6015796118275082299">वर्ष</translation> <translation id="6016551720757758985">मागील आवृत्तीवर परत येऊन Powerwash ची पुष्टी करा</translation> <translation id="6016809788585079594">एकदाच शेवटचे "Ok Google" म्हणा</translation> @@ -3945,7 +3951,6 @@ <translation id="6276301056778294989">डिव्हाइस समान कोड दर्शवित असल्याचे सुनिश्चित करा.</translation> <translation id="6277105963844135994">नेटवर्क कालबाह्य</translation> <translation id="6277518330158259200">स्क्रीनशॉट घ्या</translation> -<translation id="6278428485366576908">थीम</translation> <translation id="6279183038361895380">आपला कर्सर दर्शविण्यासाठी |<ph name="ACCELERATOR" />| दाबा</translation> <translation id="6280215091796946657">एका भिन्न खात्याने साइन इन करा</translation> <translation id="6280912520669706465">ARC</translation> @@ -4198,6 +4203,7 @@ <translation id="6607272825297743757">फाईल माहिती</translation> <translation id="6607831829715835317">अधिक साध&ने</translation> <translation id="6608140561353073361">सर्व कुकीज आणि साइट डेटा...</translation> +<translation id="6610183966322615106">प्रिंटर जोडताना त्रुटी</translation> <translation id="6610610633807698299">URL प्रविष्ट करा...</translation> <translation id="6612358246767739896">संरक्षित सामग्री</translation> <translation id="6615455863669487791">मला दर्शवा</translation> @@ -4261,7 +4267,6 @@ <translation id="6708242697268981054">मूळ:</translation> <translation id="6709357832553498500"><ph name="EXTENSIONNAME" /> वापरून कनेक्ट करा</translation> <translation id="6710213216561001401">मागील</translation> -<translation id="6712158998835983046">अॅनिमेटेड, सर्व दर्शवा</translation> <translation id="6718273304615422081">झिप करत आहे...</translation> <translation id="671928215901716392">लॉक स्क्रीन</translation> <translation id="6721972322305477112">&फाइल</translation> @@ -4533,7 +4538,6 @@ <translation id="7088434364990739311">अद्यतन तपासणी प्रारंभ होण्यात अयशस्वी (त्रुटी कोड <ph name="ERROR" />).</translation> <translation id="708856090370082727">OSK ओव्हरस्क्रोल समर्थन सक्षम करा. हा ध्वज चालू करून, OSK केवळ दृश्यमान व्ह्यूपोर्टचा आकार बदलेल.</translation> <translation id="7088674813905715446">हे डिव्हाइस प्रशासकाद्वारे तरतूद नसलेल्या स्थितीमध्ये ठेवले गेले आहे. ते नोंदणीकरिता सक्षम करण्यासाठी, कृपया आपल्या प्रशासकाने डिव्हाइस एका प्रलंबित स्थितीमध्ये ठेवावे.</translation> -<translation id="7089609847854449639">संचय व्यवस्थापक</translation> <translation id="708969677220991657">अवैध प्रमाणपत्र सादर केल्यानंतर देखील HTTPS वर स्थानिकहोस्टसाठी विनंत्यांना अनुमती देते.</translation> <translation id="7092106376816104">पॉप-अप अपवाद</translation> <translation id="7093866338626856921">या नावाच्या डिव्हाइसेससह डेटा अदलाबदल करा: <ph name="HOSTNAMES" /></translation> @@ -4573,7 +4577,7 @@ <translation id="715118844758971915">क्लासिक प्रिंटर</translation> <translation id="7154130902455071009">आपले प्रारंभ पृष्ठ यावर बदला: <ph name="START_PAGE" /></translation> <translation id="7155171745945906037">कॅमेरा किंवा फाईल मधील विद्यमान फोटो</translation> -<translation id="715568033737470079">Win32k लॉकडाउन सॅन्डबॉक्स धोरणामध्ये चालवले जातील असे PPAPI प्लगइन निर्दिष्ट करा (केवळ Windows 10 आणि त्यानंतरची आवृत्ती).</translation> +<translation id="7155226869555939647">नेहमी <ph name="APPLICATION" /> साठी दुवे उघडा</translation> <translation id="7156235233373189579">ही फाईल Windows सॉफ्टवेअर वापरून एका PC साठी डिझाइन केली आहे. ही Chrome OS चालविणार्या आपल्या डिव्हाइसशी सुसंगत नाही. कृपया एका सोयीस्कर प्रतिस्थापन अॅप साठी <ph name="BEGIN_LINK" />Chrome वेब स्टोअर<ph name="END_LINK" /> शोधा.<ph name="BEGIN_LINK_HELP" />अधिक जाणून घ्या<ph name="END_LINK_HELP" /></translation> <translation id="7157063064925785854">सुरु ठेवा क्लिक करून आपण <ph name="LEGAL_DOC_LINK_TEXT_1" />, <ph name="LEGAL_DOC_LINK_TEXT_2" />, <ph name="LEGAL_DOC_LINK_TEXT_3" /> आणि <ph name="LEGAL_DOC_LINK_TEXT_4" /> ला सहमती देता.</translation> <translation id="7158238151765743968">"<ph name="DEVICE_NAME" />" चे कनेक्शन अद्याप प्रगतीपथावर आहे.</translation> @@ -4588,6 +4592,7 @@ <translation id="7175353351958621980">येथून लोड केले:</translation> <translation id="7180611975245234373">रीफ्रेश करा</translation> <translation id="7180865173735832675">सानुकूल करा</translation> +<translation id="7181387261278441780">साइट साफ आणि रीसेट करा</translation> <translation id="7185078796915954712">TLS 1.3</translation> <translation id="7185690883425432021">टॅबस्ट्रिप स्टॅक केलेल्या मोडमध्ये असते तेव्हा निष्क्रिय टॅबची बंद बटणे लपविते.</translation> <translation id="7186088072322679094">टूलबारमध्ये ठेवा</translation> @@ -4620,7 +4625,6 @@ <translation id="7223775956298141902">अरेरे.. आपल्याकडे कोणतेही विस्तार नाहीत :-(</translation> <translation id="7224023051066864079">सबनेट मास्क:</translation> <translation id="7225179976675429563">नेटवर्क प्रकार गहाळ</translation> -<translation id="7230191962699768124">अॅनिमेटेड-नसलेले, सर्व दर्शवा</translation> <translation id="7230787553283372882">आपला मजकूर आकार सानुकूलित करा</translation> <translation id="7231224339346098802">किती कॉपी मुद्रित करायच्या हे सूचित करण्यासाठी संख्या वापरा (1 किंवा अधिक).</translation> <translation id="7238585580608191973">SHA-256 बोटाचा ठसा</translation> @@ -4752,7 +4756,6 @@ <translation id="7409233648990234464">पुन्हा लाँच करा आणि Powerwash करा</translation> <translation id="7409836189476010449">फ्लॅश चालवा</translation> <translation id="7410344089573941623"><ph name="HOST" /> आपल्या कॅमेरा आणि मायक्रोफोनवर प्रवेश करू इच्छित असल्यास विचारा</translation> -<translation id="7411343637221933631">{NUM_COOKIES,plural, =1{या साइट वरील 1}one{या साइट वरील #}other{या साइट वरील #}}</translation> <translation id="7412226954991670867">GPU मेमरी</translation> <translation id="7416362041876611053">अज्ञात नेटवर्क त्रुटी.</translation> <translation id="7417453074306512035">इथिओपिक कीबोर्ड</translation> @@ -4874,6 +4877,7 @@ <translation id="756445078718366910">ब्राउझर विंडो उघडा</translation> <translation id="7564847347806291057">प्रक्रिया समाप्त करा</translation> <translation id="7566723889363720618">F12</translation> +<translation id="7567314848159753396">कुकी: <ph name="NAME" /></translation> <translation id="756809126120519699">Chrome डेटा साफ केला</translation> <translation id="7568790562536448087">अद्यतनित करीत आहे</translation> <translation id="7573172247376861652">बॅटरी चार्ज</translation> @@ -4913,6 +4917,7 @@ <translation id="7626009897377900107">संकेतशब्द निर्मिती</translation> <translation id="7627262197844840899">ही साइट MasterCard स्वीकारत नाही.</translation> <translation id="7627790789328695202">अरेरे, <ph name="FILE_NAME" /> आधीपासून अस्तित्वात आहे. हे पुनर्नामित करा आणि पुन्हा प्रयत्न करा.</translation> +<translation id="7628127343934101653">डीफॉल्ट PDF दर्शक अनुप्रयोगात PDF फायली उघडा.</translation> <translation id="762917759028004464">डीफॉल्ट ब्राउझर सध्या <ph name="BROWSER_NAME" /> आहे.</translation> <translation id="7629536005696009600">Android अनुप्रयोगांसाठी संचयित केलेल्या क्रेडेन्शियलना सुसंगत वेबसाइटमध्ये भरले जाण्यासाठी अनुमती द्या.</translation> <translation id="7629827748548208700">टॅब: <ph name="TAB_NAME" /></translation> @@ -5141,6 +5146,7 @@ <translation id="7957513156576779045">जोडणीस अनुमती देण्यासाठी Bluetooth चालू करा</translation> <translation id="7957615753207896812">कीबोर्ड डिव्हाइस सेटिंग्ज उघडा</translation> <translation id="7959074893852789871">फाइलमध्ये एकाधिक प्रमाणपत्रे आहेत, यापैकी काही आयात झाली नाहीत: </translation> +<translation id="7959700692661109221"><ph name="BEGIN_PARAGRAPH" />Google ची स्थान सेवा आपल्या डिव्हाइसच्या स्थानाचा अधिक जलद आणि अधिक अचूकपणे अंदाज लावण्यात मदत करण्यासाठी Wi-Fi सारख्या स्रोतांचा वापर करते. आपण Google च्या स्थान सेवा चालू करता तेव्हा, स्थान माहिती प्रदान करण्यासाठी आपले डिव्हाइस Wi-Fi चा वापर करणार्या मोडमध्ये प्रवेश करते. आपण हे स्थान सेटिंग्जमध्ये कधीही बंद करु शकता.<ph name="END_PARAGRAPH" /></translation> <translation id="7961015016161918242">कधीही नाही</translation> <translation id="7964089325405904043">संकेतशब्द आयात आणि निर्यात करणे</translation> <translation id="7965010376480416255">सामायिक मेमरी</translation> @@ -5291,6 +5297,7 @@ <translation id="8146793085009540321">साइन-इन अयशस्वी झाले. कृपया आपल्या प्रशासकाशी संपर्क साधा किंवा पुन्हा प्रयत्न करा.</translation> <translation id="8148264977957212129">पिनयिन इनपुट पद्धत</translation> <translation id="8148913456785123871">लाँचरमध्ये Google Now कार्ड दर्शवा</translation> +<translation id="8150391391298684512">Windows Runtime MIDI API अक्षम करा</translation> <translation id="8151185429379586178">विकासक साधने</translation> <translation id="8151638057146502721">कॉन्फिगर करा</translation> <translation id="8151639108075998630">अतिथी ब्राउझिंग सक्षम करा</translation> @@ -5571,6 +5578,7 @@ <translation id="8532294913309524834">आपल्या प्राधान्याच्या आधारावर भाषांची क्रमवारी लावा.</translation> <translation id="8535005006684281994">Netscape प्रमाणपत्र नूतनीकरण URL</translation> <translation id="8539727552378197395">नाही (HttpOnly)</translation> +<translation id="8541084862688000575">Android अॅप्स स्वयंचलितपणे लोड करा</translation> <translation id="8543181531796978784">आपण <ph name="BEGIN_ERROR_LINK" />ओळखण्याच्या समस्येचा अहवाल<ph name="END_ERROR_LINK" /> देऊ शकता किंवा आपल्या सुरक्षिततेस असणार्या जोखीम आपण समजत असल्यास, <ph name="BEGIN_LINK" />या असुरक्षित साइटला भेट द्या<ph name="END_LINK" />.</translation> <translation id="8545107379349809705">माहिती लपवा...</translation> <translation id="8545211332741562162">प्रायोगिक JavaScript वैशिष्ट्ये वापरण्यासाठी वेब पृष्ठे सक्षम करा.</translation> @@ -5598,7 +5606,6 @@ <translation id="8569764466147087991">उघडण्यासाठी फाइल निवडा</translation> <translation id="8571032220281885258">आपण "Ok Google" म्हणता, तेव्हा आपण पुढे काय म्हणता ते Chrome शोधेल.</translation> <translation id="8571108619753148184">सर्व्हर 4</translation> -<translation id="8572832761467613633">केवळ फ्लॅश</translation> <translation id="8572981282494768930">आपल्या कॅमेर्यावर आणि मायक्रोफोनवर प्रवेश करण्यास साइटना अनुमती देऊ नका</translation> <translation id="8574234089711453001">मीडिया url सह पृष्ठ उघडताना डाउनलोड बटण दर्शविले जाण्याची अनुमती द्या.</translation> <translation id="857779305329188634">प्रायोगिक QUIC प्रोटोकॉल समर्थन सक्षम करा.</translation> @@ -5620,6 +5627,7 @@ <translation id="8600929685092827187">पॅकेट सक्रिय करा</translation> <translation id="8601206103050338563">TLS WWW Client Authentication</translation> <translation id="8602851771975208551">आपल्या संगणकावरील दुसऱ्या प्रोग्रामने Chrome च्या कार्य करण्याचा मार्ग बदलू शकणारा अॅप जोडला.</translation> +<translation id="8603912787021349466">साइन इन केल्यानंतर Android अॅप्सना स्वयंचलितपणे प्रारंभ करण्यासाठी त्यांना अनुमती द्या.</translation> <translation id="8605428685123651449">SQLite मेमरी</translation> <translation id="8605503133013456784">"<ph name="DEVICE_NAME" />" वरुन डिस्कनेक्ट करण्यात आणि जोडणी काढण्यात अयशस्वी.</translation> <translation id="8606726445206553943">आपले MIDI डिव्हाइसेस वापरा</translation> @@ -5727,7 +5735,7 @@ <translation id="8732030010853991079">या चिन्हावर क्लिक करुन हा विस्तार वापरा.</translation> <translation id="8732212173949624846">आपल्या सर्व साइन इन केलेल्या डिव्हाइसेसवर आपला ब्राउझिंग इतिहास वाचा आणि बदला</translation> <translation id="8734073480934656039">ही सेटिंग सक्षम करणे कियोस्क अनुप्रयोगांना सुरूवातीस स्वयंचलितपणे लाँच करण्याची अनुमती देते.</translation> -<translation id="873545264931343897"><ph name="PLUGIN_NAME" /> अद्यतनित करणे समाप्त होते तेव्हा, ते सक्रिय करण्यासाठी पृष्ठ रीलोड करा</translation> +<translation id="873545264931343897"><ph name="PLUGIN_NAME" /> अद्यतन समाप्त झाल्यावर, ते सक्रिय करण्यासाठी पृष्ठ रीलोड करा</translation> <translation id="8736288397686080465">ही साइट पार्श्वभूमीमध्ये अद्यतनित केली गेली आहे.</translation> <translation id="8737260648576902897">Adobe Reader स्थापन करा</translation> <translation id="8737354914281742249">शेल हँडलर</translation> @@ -5748,7 +5756,7 @@ <translation id="8758895886513993540">डेस्कटॉप सामायिकरणासाठी वापरकर्ते टॅब निवडू शकतात किंवा नाही त्यास हे ध्वजांकन नियंत्रित करते.</translation> <translation id="8759408218731716181">एकाधिक साइन इन सेट करू शकत नाही</translation> <translation id="8759753423332885148">अधिक जाणून घ्या.</translation> -<translation id="8763204422633679667"><ph name="PLUGIN_NAME" /> ने स्थापना पूर्ण केल्यानंतर, ते सक्रिय करण्यासाठी पृष्ठ रीलोड करा</translation> +<translation id="8763204422633679667"><ph name="PLUGIN_NAME" /> स्थापित झाल्यानंतर, ते सक्रिय करण्यासाठी पृष्ठ रीलोड करा</translation> <translation id="8765985713192161328">हँडलर व्यवस्थापित करा...</translation> <translation id="8767072502252310690">वापरकर्ते</translation> <translation id="8768367823103160496">माऊस कर्सर लॉक</translation> @@ -5973,6 +5981,7 @@ <translation id="9053965862400494292">समक्रमण सेट अप करण्याचा प्रयत्न करीत असताना एक त्रुटी आली.</translation> <translation id="9056034633062863292">Chromebox अद्यतनित करीत आहे</translation> <translation id="9056810968620647706">जुळण्या आढळल्या नाहीत.</translation> +<translation id="9057119625587205566">जवळपास कोणतेही प्रिंटर नाहीत</translation> <translation id="9059868303873565140">स्थिती मेनू</translation> <translation id="9064142312330104323">Google प्रोफाइल फोटो (लोड करत आहे)</translation> <translation id="9064275926664971810">एका क्लिकमध्ये वेब फॉर्म भरण्यासाठी स्वयं-भरण सक्षम करा</translation> @@ -5983,6 +5992,7 @@ <translation id="9067401056540256169">हे ध्वजांकन Chrome असुरक्षित करते. हे केवळ आपल्याला हे करत असलेले समजत असल्यास वापरा. लक्षात ठेवा की हे ध्वजांकन कोणत्याही सूचनेशिवाय काढले जाऊ शकते. सक्षम असल्यास, मूळ https असलेल्या फ्रेम असुरक्षित URL (ws://) सह WebSockets वापरू शकतात.</translation> <translation id="9068931793451030927">पथ:</translation> <translation id="9070219033670098627">व्यक्ती स्विच करा</translation> +<translation id="9070940116164932228">महाग पार्श्वभूमी टायमर नियंत्रित करा</translation> <translation id="907148966137935206">कोणत्याही साइटला पॉप-अप दर्शविण्याची परवानगी देऊ नका (शिफारस केलेले)</translation> <translation id="9072550133391925347">आपण जतन केलेल्या संकेतशब्दासह <ph name="PASSWORD_MANAGER_BRAND" /> स्वयंचलितपणे आपल्याला पात्र असलेल्या साइट आणि अॅप्समध्ये साइन इन करते.</translation> <translation id="9073281213608662541">PAP</translation> @@ -6016,6 +6026,7 @@ <translation id="9112614144067920641">कृपया नवीन पिन निवडा.</translation> <translation id="9112748030372401671">आपला वॉलपेपर बदला</translation> <translation id="9112987648460918699">शोधा...</translation> +<translation id="9114663181201435112">सहजपणे साइन इन करा</translation> <translation id="9115487443206954631">कास्ट डिव्हाइसेस व्यवस्थापित करा</translation> <translation id="9115675100829699941">&बुकमार्क</translation> <translation id="9121814364785106365">पिन केलेला टॅब म्हणून उघडा</translation> @@ -6110,7 +6121,6 @@ <translation id="952992212772159698">सक्रिय नाही</translation> <translation id="960719561871045870">ऑपरेटर कोड</translation> <translation id="960987915827980018">सुमारे 1 तास बाकी</translation> -<translation id="962778376131245616">फक्त सुरक्षित-नसलेले, अॅनिमेटेड दर्शवा</translation> <translation id="96421021576709873">Wi-Fi नेटवर्क</translation> <translation id="965490406356730238">जिथे उपलब्ध असते तेथे कॅप्चर केलेल्या फ्रेमसाठी हार्डवेअर-त्वरित केलेले mjpeg डीकोड सक्षम करा.</translation> <translation id="968174221497644223">अनुप्रयोग कॅशे</translation>
diff --git a/chrome/app/resources/generated_resources_ms.xtb b/chrome/app/resources/generated_resources_ms.xtb index 0d05e696..238d51c 100644 --- a/chrome/app/resources/generated_resources_ms.xtb +++ b/chrome/app/resources/generated_resources_ms.xtb
@@ -18,7 +18,6 @@ <translation id="1029317248976101138">Zum</translation> <translation id="1029595648591494741">Cuba "<ph name="EXTENSION_NAME" />"?</translation> <translation id="1031362278801463162">Memuatkan pratonton</translation> -<translation id="1031460590482534116">Terdapat ralat semasa mencuba untuk menyimpan sijil klien. Ralat <ph name="ERROR_NUMBER" /> (<ph name="ERROR_NAME" />).</translation> <translation id="1031573127485938293">Tanya (oleh dasar)</translation> <translation id="103279545524624934">Kosongkan ruang cakera untuk melancarkan apl Android.</translation> <translation id="1033780634303702874">Akses peranti bersiri anda</translation> @@ -101,6 +100,7 @@ <translation id="1128591060186966949">Edit enjin carian</translation> <translation id="1128987120443782698">Peranti storan mempunyai keupayaan <ph name="DEVICE_CAPACITY" />. Sila masukkan kad SD atau batang memori USB dengan sekurang-kurangnya keupayaan 4GB.</translation> <translation id="1137135726305341424">domContentLoaded dan pemuatan semua sumber bermula sebelum domContentLoaded (bingkai utama dan iframes daripada asal yang sama).</translation> +<translation id="1138663153846032155">Pilih HTML berbanding Flash</translation> <translation id="1140351953533677694">Akses peranti Bluetooth dan Bersiri anda</translation> <translation id="114140604515785785">Direktori akar sambungan:</translation> <translation id="1143142264369994168">Penandatangan Sijil</translation> @@ -252,6 +252,7 @@ <translation id="1351692861129622852">Mengimport fail <ph name="FILE_COUNT" />...</translation> <translation id="1352103415082130575">Papan kekunci bahasa Thai (Pattachote)</translation> <translation id="1353686479385938207"><ph name="PROVIDER_NAME" />: <ph name="NETWORK_NAME" /></translation> +<translation id="1353946958707294039">Pengurus storan Reka Bentuk Bahan</translation> <translation id="1353966721814789986">Halaman permulaan</translation> <translation id="1354868058853714482">Adobe Reader sudah lapuk dan mungkin tidak selamat.</translation> <translation id="1355408554203439639">Rasterizer perisian 3D</translation> @@ -423,7 +424,6 @@ <translation id="1533920822694388968">Penjajaran TV</translation> <translation id="15373452373711364">Kursor tetikus besar</translation> <translation id="1543284117603151572">Diimport Daripada Edge</translation> -<translation id="1544350195767834591">{NUM_COOKIES,plural, =1{1 daripada tapak lain}other{# daripada tapak lain}}</translation> <translation id="1545177026077493356">Mod Kios Automatik</translation> <translation id="1545786162090505744">URL dengan %s sebagai ganti pertanyaan</translation> <translation id="1546280085599573572">Sambungan ini telah menukar halaman yang ditunjukkan apabila anda mengklik butang Laman Utama.</translation> @@ -447,7 +447,6 @@ <translation id="1559235587769913376">Input aksara Unikod</translation> <translation id="1561092721008294962">HarfBuzz untuk teks UI</translation> <translation id="1566049601598938765">Tapak web</translation> -<translation id="1566958206723629112">Flash dan PDF</translation> <translation id="1567723158593978621">Apabila didayakan, tindakan log masuk ke penyemak imbas akan menggunakan aliran log masuk dipisahkan kata laluan gaia baharu.</translation> <translation id="1567993339577891801">JavaScript Console</translation> <translation id="1568323446248056064">Buka tetapan peranti paparan</translation> @@ -576,7 +575,6 @@ <translation id="1723940674997333416">Benarkan WebSocket tidak selamat daripada asal https</translation> <translation id="1725149567830788547">Paparkan &Kawalan</translation> <translation id="172612876728038702">TPM sedang disediakan. Sila bersabar; ini mungkin mengambil masa beberapa minit.</translation> -<translation id="1727135806684246609">Keselamatan Bahan Terperinci</translation> <translation id="1729533290416704613">Sambungan turut mengawal halaman yang ditunjukkan apabila anda membuat carian dari Kotak Omni.</translation> <translation id="1731346223650886555">Koma bernoktah</translation> <translation id="1731589410171062430">Jumlah: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /> (<ph name="NUMBER_OF_PAGES" /> <ph name="PAGE_OR_PAGES_LABEL" />)</translation> @@ -872,6 +870,7 @@ <translation id="218492098606937156">Dayakan acara sentuh</translation> <translation id="2187317261103489799">Kesan (lalai)</translation> <translation id="2187895286714876935">Ralat Import Sijil Pelayan</translation> +<translation id="2188881192257509750">Buka <ph name="APPLICATION" /></translation> <translation id="2190069059097339078">Pengutip Bukti Kelayakan WiFi</translation> <translation id="219008588003277019">Modul Klien Asli: <ph name="NEXE_NAME" /></translation> <translation id="2190355936436201913">(kosong)</translation> @@ -881,7 +880,7 @@ <translation id="2195729137168608510">Perlindungan E-mel</translation> <translation id="2198315389084035571">Bahasa Cina Mudah</translation> <translation id="2199829153606285995">Input suara pada papan kekunci maya</translation> -<translation id="219985413780390209">Melindungi anda dan peranti daripada tapak yang berbahaya</translation> +<translation id="219985413780390209">Lindungi diri dan peranti anda daripada tapak yang berbahaya</translation> <translation id="2201351910914874948">Pembuatan kepipis apl untuk apl yang dihoskan pada Mac</translation> <translation id="220138918934036434">Sembunyikan butang</translation> <translation id="2202898655984161076">Terdapat masalah menyenaraikan pencetak. Beberapa pencetak anda mungkin tidak berjaya didaftarkan dengan <ph name="CLOUD_PRINT_NAME" />.</translation> @@ -990,6 +989,7 @@ <translation id="2326606747676847821">Gunakan Inkognito</translation> <translation id="2326931316514688470">&Muat semula apl</translation> <translation id="2327492829706409234">Dayakan apl</translation> +<translation id="2328054044222305089">Tindakan ini akan memadamkan mana-mana data <ph name="SITE" /> yang disimpan pada peranti anda dan menetapkan semula mana-mana kebenaran yang anda berikan untuk dijalankan. Anda ingin teruskan?</translation> <translation id="2329597144923131178">Log masuk untuk mendapatkan penanda halaman, sejarah, kata laluan dan tetapan lain pada semua peranti anda.</translation> <translation id="2332131598580221120">Lihat di gedung</translation> <translation id="2332742915001411729">Tetapkan semula kepada lalai</translation> @@ -1266,7 +1266,6 @@ <translation id="2675358154061544447">Sokongan yang bersifat percubaan untuk memaparkan iframes silang tapak dalam proses yang berasingan. Dalam mod ini, dokumen akan berkongsi proses pemaparan hanya jika proses ini daripada tapak web yang sama.</translation> <translation id="2676946222714718093">Dimainkan di</translation> <translation id="2678063897982469759">Dayakan semula</translation> -<translation id="2678246812096664977">Semua pemalam</translation> <translation id="2679385451463308372">Cetak menggunakan dialog sistem…</translation> <translation id="2680208403056680091">Sambungan Internet Anda Sedang Dikawal</translation> <translation id="268053382412112343">Se&jarah</translation> @@ -1440,7 +1439,6 @@ <translation id="287286579981869940">Tambahkan <ph name="PROVIDER_NAME" />...</translation> <translation id="2872961005593481000">Mematikan</translation> <translation id="2875698561019555027">(Halaman ralat Chrome)</translation> -<translation id="2879560882721503072">Berjaya menyimpan sijil klien yang dikeluarkan oleh <ph name="ISSUER" />.</translation> <translation id="288024221176729610">Bahasa Czech</translation> <translation id="288042212351694283">Mengakses peranti Universal 2nd Factor anda</translation> <translation id="2881966438216424900">Terakhir diakses:</translation> @@ -1589,6 +1587,7 @@ <translation id="3057861065630527966">Sandarkan foto dan video anda</translation> <translation id="3058212636943679650">Jika anda perlu memulihkan sistem pengendalian komputer anda, anda memerlukan kad SD pemulihan atau batang memori USB.</translation> <translation id="305932878998873762">Cache Mudah untuk HTTP merupakan cache baharu. Cache ini bergantung pada sistem fail untuk peruntukan ruang cakera.</translation> +<translation id="3060251871394327123">Tindakan ini akan memadamkan mana-mana data <ph name="SITE" /> yang disimpan pada perani anda. Anda ingin teruskan?</translation> <translation id="3061650404498811439">Dayakan akses kepada emoji, tulisan tangan dan input suara pada menu IME ikut serta.</translation> <translation id="3062606427884046423">Gunakan pemberitahuan Android MediaStyle untuk pemberitahuan media Chrome.</translation> <translation id="3063844757726132584">Akses semua apl anda daripada pelancar mudah guna ini. Main permainan, bersembang video, mendengar muzik, mengedit dokumen atau dapatkan lebih banyak apl.</translation> @@ -1638,6 +1637,7 @@ <translation id="3123569374670379335">(Diselia)</translation> <translation id="3124111068741548686">Pemegang USER</translation> <translation id="3126026824346185272">Ctrl</translation> +<translation id="3127156390846601284">Tindakan ini akan memadamkan mana-mana data yang disimpan pada peranti anda untuk semua tapak yang ditunjukkan. Anda ingin teruskan?</translation> <translation id="312759608736432009">Pengeluar peranti:</translation> <translation id="3127919023693423797">Mengesahkan...</translation> <translation id="3128230619496333808">Tab 6</translation> @@ -1736,7 +1736,6 @@ <translation id="3264544094376351444">Fon Sans-serif</translation> <translation id="3264547943200567728">Gagal menyediakan rangkaian Chromebox anda</translation> <translation id="3265459715026181080">Tutup Tetingkap</translation> -<translation id="3267271790328635957">PDF sahaja</translation> <translation id="3267726687589094446">Terus membenarkan muat turun automatik berbilang fail</translation> <translation id="3267998849713137817">Masa Diubah Suai</translation> <translation id="3268451620468152448">Tab Terbuka</translation> @@ -1982,6 +1981,7 @@ <translation id="3574210789297084292">log masuk</translation> <translation id="3574305903863751447"><ph name="CITY" />, <ph name="STATE" /> <ph name="COUNTRY" /></translation> <translation id="357479282490346887">Bahasa Lithuania</translation> +<translation id="3575927481544652747">Lumpuhkan Windows Runtime MIDI API untuk WebMIDI, yang didayakan secara lalai pada Windows 10 atau lebih baharu.</translation> <translation id="3576324189521867626">Berjaya dipasang</translation> <translation id="3578331450833904042">Lalai (ambil segala-galanya)</translation> <translation id="3578594933904494462">Kandungan tab ini sedang dikongsi.</translation> @@ -2035,8 +2035,6 @@ <translation id="3627320433825461852">Tinggal kurang 1 minit</translation> <translation id="3627588569887975815">Buka pautan dalam tetingkap inko&gnito</translation> <translation id="3627671146180677314">Masa Pembaharuan Sijil Netscape</translation> -<translation id="3629326610814700057">Membolehkan pengurus storan mengurus storan setempat.</translation> -<translation id="3630337581925712713"><ph name="PERMISSION_TYPE_LABEL" />:</translation> <translation id="3631337165634322335">Pengecualian di bawah hanya digunakan untuk sesi inkognito semasa.</translation> <translation id="3633586230741134985">Tetapan Pelancar Apl</translation> <translation id="3633997706330212530">Anda juga boleh memilih untuk melumpuhkan perkhidmatan ini</translation> @@ -2059,7 +2057,8 @@ <translation id="3654045516529121250">Baca tetapan kebolehaksesan anda</translation> <translation id="3654092442379740616">Ralat Segerak: <ph name="PRODUCT_NAME" /> sudah lapuk dan perlu dikemas kini.</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{Apl mempunyai akses tetap kepada satu fail.}other{Apl mempunyai akses tetap kepada # fail.}}</translation> -<translation id="3657468915905674858">Dayakan Kunci Semua Win32k PPAPI.</translation> +<translation id="365793796291733849"><ph name="BEGIN_PARAGRAPH1" />Apabila anda menghidupkan sandaran automatik, data peranti dan apl disimpan secara berkala ke folder peribadi di Google Drive. Data apl boleh terdiri daripada sebarang data yang telah disimpan oleh apl (berdasarkan tetapan pembangun), termasuk data yang mungkin sensitif seperti kenalan mesej dan foto.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Data sandaran tidak akan dikira dalam kuota storan Drive anda. Fail bersaiz besar atau fail yang telah ditentukan oleh pembangun untuk dikecualikan daripada perkhidmatan tidak akan disandarkan.<ph name="END_PARAGRAPH2" /></translation> <translation id="3660234220361471169">Tidak Dipercayai</translation> <translation id="3665589677786828986">Chrome mengesan bahawa sesetengah tetapan anda telah terganggu oleh program lain dan menetapkannya semula kepada tetapan lalainya yang asal.</translation> <translation id="3665842570601375360">Keselamatan:</translation> @@ -2114,6 +2113,7 @@ <translation id="3733127536501031542">Pelayan SSL dengan Peningkatan</translation> <translation id="3736520371357197498">Jika anda memahami risiko terhadap keselamatan anda, anda boleh <ph name="BEGIN_LINK" />melawati tapak web yang tidak selamat ini<ph name="END_LINK" /> sebelum program berbahaya dialih keluar.</translation> <translation id="3738924763801731196"><ph name="OID" />:</translation> +<translation id="3739254215541673094">Buka <ph name="APPLICATION" />?</translation> <translation id="3739798227959604811">Lengah sebelum mengulang:</translation> <translation id="3741158646617793859"><ph name="DEVICE_NAME" /> kini akan muncul dalam Admin Console</translation> <translation id="3741243925913727067">Sandarkan foto dan video peranti media anda pada Google Drive.</translation> @@ -2352,7 +2352,6 @@ <translation id="4058793769387728514">Periksa Dokumen Sekarang</translation> <translation id="4059285154003114015">&Bingkai Cetak...</translation> <translation id="406070391919917862">Apl Latar Belakang</translation> -<translation id="4061502419206152498">Tunjukkan tidak selamat, bukan animasi sahaja</translation> <translation id="4062251648694601778">Selamat menggunakan peranti <ph name="SHORT_PRODUCT_NAME" /> anda. Soalan? Anda boleh mendapatkan bantuan pada bila-bila masa sahaja dengan mengklik "?" dalam dulang status.</translation> <translation id="4065876735068446555">Rangkaian yang anda gunakan (<ph name="NETWORK_ID" />) mungkin memerlukan anda untuk melawati halaman log masuknya.</translation> <translation id="4068506536726151626">Halaman ini mengandungi unsur daripada tapak berikut yang menjejaki lokasi anda:</translation> @@ -2391,7 +2390,6 @@ <translation id="4101878899871018532">Pengurus kata laluan tidak akan menawarkan untuk menyimpan bukti kelayakan yang digunakan untuk penyegerakan.</translation> <translation id="410351446219883937">Automain</translation> <translation id="4104163789986725820">E&ksport...</translation> -<translation id="4105523032910086267">Menetapkan animasi dan keterlihatan keselamatan terperinci dalam Reka Bentuk Bahan.</translation> <translation id="4105563239298244027">Dapatkan 1 TB percuma dengan Google Drive</translation> <translation id="4109135793348361820">Alihkan tetingkap ke <ph name="USER_NAME" /> (<ph name="USER_EMAIL" />)</translation> <translation id="4110342520124362335">Kuki daripada <ph name="DOMAIN" /> disekat.</translation> @@ -2442,6 +2440,7 @@ <translation id="418179967336296930">Papan kekunci Fonetik Rusia (YaZHert)</translation> <translation id="4181841719683918333">Bahasa</translation> <translation id="4187248015940562149">Mendayakan Bluetooth Web yang mungkin membenarkan tapak web menyambung dan mengawal peranti Bluetooth di sekitar anda.</translation> +<translation id="4188447344915957833">Mendayakan pengurus storan dalam Tetapan Reka Bentuk Bahan.</translation> <translation id="4189406272289638749">Sambungan, <b><ph name="EXTENSION_NAME" /></b>, mengawal tetapan ini.</translation> <translation id="4193154014135846272">Dokumen Google</translation> <translation id="4193182321948161343">Dayakan Pengurus Pengguna Reka Bentuk Bahan</translation> @@ -2649,6 +2648,7 @@ <translation id="4508765956121923607">Paparkan S&umber</translation> <translation id="4509017836361568632">Buang foto</translation> <translation id="4509345063551561634">Lokasi:</translation> +<translation id="4513946894732546136">Maklum balas</translation> <translation id="4514542542275172126">Sediakan pengguna diselia yang baharu</translation> <translation id="4514914692061505365">Memaksa penggunaan penterjemah Subzero pantas PNaCl untuk semua fail pexe.</translation> <translation id="451515744433878153">Alih keluar</translation> @@ -2747,6 +2747,7 @@ <translation id="4656293982926141856">Komputer ini</translation> <translation id="4656631038341342120">Dayakan cangkerang VR jika tersedia untuk peranti ini.</translation> <translation id="4657031070957997341">Sentiasa benarkan pemalam pada <ph name="HOST" /></translation> +<translation id="466008749075469935">Membolehkan campur tangan untuk mengehadkan penggunaan CPU pemasa latar belakang kepada 1%.</translation> <translation id="4663254525753315077">Apabila boleh, meletakkan kandungan menatal bagi unsur penatalan aliran limpah ke atas lapisan komposit untuk penatalan yang lebih pantas.</translation> <translation id="4664482161435122549">PKCS #12 Eksport Ralat</translation> <translation id="4665014895760275686">Pengeluar</translation> @@ -2815,6 +2816,7 @@ <translation id="4749157430980974800">Papan kekunci bahasa Georgia</translation> <translation id="4750394297954878236">Cadangan</translation> <translation id="475088594373173692">Pengguna pertama</translation> +<translation id="4750892496809949692">Pilih kandungan HTML dengan menyembunyikan Flash daripada senarai pemalam.</translation> <translation id="4750917950439032686">Maklumat anda (contohnya, kata laluan atau nombor kad kredit) adalah berciri peribadi apabila dihantar ke tapak ini.</translation> <translation id="4753602155423695878">Animasi bar kemajuan pemuatan halaman telefon Android</translation> <translation id="4755240240651974342">Papan kekunci Finland</translation> @@ -3089,6 +3091,7 @@ <translation id="5119450342834678097">Pilihan tapak tablet permintaan dalam menu tetapan</translation> <translation id="5120068803556741301">Kaedah input pihak ketiga</translation> <translation id="5120421890733714118">Percayakan sijil ini untuk mengenal pasti laman web.</translation> +<translation id="5120516977819314347">PIN atau kata laluan salah.</translation> <translation id="5121130586824819730">Cakera keras anda telah penuh. Sila simpan ke lokasi lain atau sediakan lagi ruang pada cakera keras.</translation> <translation id="5125751979347152379">URL tidak sah.</translation> <translation id="5127881134400491887">Urus sambungan rangkaian</translation> @@ -3096,6 +3099,7 @@ <translation id="512903556749061217">dipasang</translation> <translation id="5129301143853688736">Sambungan anda ke tapak web ini tidak tertutup. Penyerang mungkin akan cuba mencuri maklumat anda (sebagai contoh, foto, kata laluan, mesej dan kad kredit) daripada <ph name="DOMAIN" />.</translation> <translation id="5129662217315786329">Bahasa Poland</translation> +<translation id="5131347545782851480">Dokumen PDF</translation> <translation id="5134856901811723984">Reka Bentuk Bahan dalam UI sistem OS Chrome</translation> <translation id="5135533361271311778">Tidak dapat mencipta item penanda halaman.</translation> <translation id="5136529877787728692">F7</translation> @@ -3264,6 +3268,7 @@ <translation id="5328031682234198929">8</translation> <translation id="5329858601952122676">&Padam</translation> <translation id="5330145655348521461">Fail ini dibuka pada desktop yang berbeza. Alihkan ke <ph name="USER_NAME" /> (<ph name="MAIL_ADDRESS" />) untuk melihat fail.</translation> +<translation id="5330512191124428349">Dapatkan maklumat</translation> <translation id="5332624210073556029">Zon waktu:</translation> <translation id="5333807720589685258">Kad SIM anda akan dilumpuhkan secara kekal jika anda tidak dapat memasukkan Kunci Buka Kunci PIN yang betul.</translation> @@ -3696,7 +3701,6 @@ <translation id="5892507820957994680">Membatalkan senarai paparan perisian terbina dalam dan mendayakan pecutan GPU pada konfigurasi sistem yang tidak disokong.</translation> <translation id="5895138241574237353">Mulakan Semula</translation> <translation id="5895187275912066135">Dikeluarkan Pada</translation> -<translation id="5898154795085152510">Pelayan mengembalikan sijil klien yang tidak sah. Ralat <ph name="ERROR_NUMBER" /> (<ph name="ERROR_NAME" />).</translation> <translation id="5900302528761731119">Foto Profil Google</translation> <translation id="590253956165195626">Tawaran untuk menterjemah halaman yang bukan dalam bahasa yang anda baca.</translation> <translation id="5904093760909470684">Konfigurasi Proksi</translation> @@ -3751,6 +3755,8 @@ <translation id="5984222099446776634">Dilawati Baru-baru Ini</translation> <translation id="5984814259619230127">Penemuan Tenaga Rendah Bluetooth Smart Lock</translation> <translation id="5986245990306121338">Jika didayakan, penukar tab akan ditunjukkan walaupun semasa pilihan 'gabungkan tab dan apl' dihidupkan dalam tetapan.</translation> +<translation id="5989712527536636369"><ph name="BEGIN_PARAGRAPH1" />Ini ialah maklumat umum tentang peranti anda dan cara menggunakannya, seperti paras bateri, kekerapan anda menggunakan apl, kualiti dan tempoh sambungan rangkaian anda (seperti Wi-Fi dan Bluetooth) dan laporan ranap sistem apabila sistem tidak berfungsi seperti yang djangkakan. Maklumat ini akan digunakan untuk meningkatkan produk dan perkhidmatan Google untuk semua orang. Sesetengah maklumat yang dikumpulkan akan membantu rakan kongsi, seperti pembangun Android serta dapat menjadikan apl dan produk mereka lebih baik.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Anda boleh menghidupkan atau mematikan ciri ini pada bila-bila masa dalam Tetapan apl Android. Tindakan ini tidak akan menjejaskan keupayaan peranti anda untuk menghantar maklumat yang diperlukannya untuk menerima perkhidmatan yang penting seperti kemas kini sistem dan keselamatan.<ph name="END_PARAGRAPH2" /></translation> <translation id="5990198433782424697">Sambungan pada URL chrome://</translation> <translation id="5990814808592353318">Penjanaan kata laluan secara manual.</translation> <translation id="5991049340509704927">Membesarkan</translation> @@ -3764,6 +3770,7 @@ <translation id="6005695835120147974">Penghala Media</translation> <translation id="6007237601604674381">Pemindahan gagal. <ph name="ERROR_MESSAGE" /></translation> <translation id="6008241731410823808">Menghantar ping pengauditan hiperpautan.</translation> +<translation id="6011449291337289699">Kosongkan data tapak</translation> <translation id="6015796118275082299">Tahun</translation> <translation id="6016551720757758985">Sahkan Powerwash dengan kembali ke versi terdahulu</translation> <translation id="6016809788585079594">Sebut "Ok Google" untuk kali terakhir</translation> @@ -3953,7 +3960,6 @@ <translation id="6276301056778294989">Pastikan peranti menunjukkan kod yang sama</translation> <translation id="6277105963844135994">Tamat masa rangkaian</translation> <translation id="6277518330158259200">A&mbil Tangkapan Skrin</translation> -<translation id="6278428485366576908">Tema</translation> <translation id="6279183038361895380">Tekan |<ph name="ACCELERATOR" />| untuk memaparkan kursor anda</translation> <translation id="6280215091796946657">Log masuk dengan akaun lain</translation> <translation id="6280912520669706465">ARC</translation> @@ -4205,6 +4211,7 @@ <translation id="6607272825297743757">Maklumat fail</translation> <translation id="6607831829715835317">Lagi al&at</translation> <translation id="6608140561353073361">Semua kuki dan data tapak...</translation> +<translation id="6610183966322615106">Ralat menambahkan pencetak</translation> <translation id="6610610633807698299">Masukkan URL...</translation> <translation id="6612358246767739896">Kandungan yang dilindungi</translation> <translation id="6615455863669487791">Tunjukkan kepada saya</translation> @@ -4268,7 +4275,6 @@ <translation id="6708242697268981054">Asal:</translation> <translation id="6709357832553498500">Sambung menggunakan <ph name="EXTENSIONNAME" /></translation> <translation id="6710213216561001401">Sebelumnya</translation> -<translation id="6712158998835983046">Tunjukkan semua, animasi</translation> <translation id="6718273304615422081">Mengezip...</translation> <translation id="671928215901716392">Kunci skrin</translation> <translation id="6721972322305477112">&Fail</translation> @@ -4541,7 +4547,6 @@ <translation id="7088434364990739311">Semakan kemas kini gagal dimulakan (kod ralat <ph name="ERROR" />).</translation> <translation id="708856090370082727">Dayakan sokongan tatal lampau OSK. Apabila bendera ini dihidupkan, OSK hanya akan mengubah saiz port pandang visual.</translation> <translation id="7088674813905715446">Peranti ini telah diletakkan dalam keadaan nyahperuntukkan oleh pentadbir. Untuk mendayakannya agar dapat didaftarkan, minta pentadbir meletakkan peranti dalam keadaan belum selesai.</translation> -<translation id="7089609847854449639">Pengurus storan</translation> <translation id="708969677220991657">Membenarkan permintaan kepada hos setempat melalui HTTPS walaupun sijil tidak sah diberikan.</translation> <translation id="7092106376816104">Pengecualian pop timbul</translation> <translation id="7093866338626856921">Bertukar data dengan peranti yang bernama: <ph name="HOSTNAMES" /></translation> @@ -4581,7 +4586,7 @@ <translation id="715118844758971915">Pencetak klasik</translation> <translation id="7154130902455071009">Tukar halaman permulaan anda kepada: <ph name="START_PAGE" /></translation> <translation id="7155171745945906037">Foto sedia ada daripada kamera atau fail</translation> -<translation id="715568033737470079">Tentukan pemalam PPAPI yang akan dijalankan dalam dasar kotak pasir kunci semua Win32k (Windows 10 dan yang lebih baharu sahaja).</translation> +<translation id="7155226869555939647">Sentiasa buka pautan untuk <ph name="APPLICATION" /></translation> <translation id="7156235233373189579">Fail ini direka bentuk untuk komputer dengan menggunakan perisian Windows. Ini tidak serasi dengan peranti anda yang menjalankan OS Chrome. Sila cari <ph name="BEGIN_LINK" />Chrome Web Store<ph name="END_LINK" /> bagi apl ganti yang sesuai. <ph name="BEGIN_LINK_HELP" />Ketahui Lebih Lanjut<ph name="END_LINK_HELP" /></translation> <translation id="7157063064925785854">Apabila Teruskan diklik, bermakna anda bersetuju menerima <ph name="LEGAL_DOC_LINK_TEXT_1" />, <ph name="LEGAL_DOC_LINK_TEXT_2" />, <ph name="LEGAL_DOC_LINK_TEXT_3" /> dan <ph name="LEGAL_DOC_LINK_TEXT_4" />.</translation> <translation id="7158238151765743968">Sambungan ke "<ph name="DEVICE_NAME" />" masih dijalankan.</translation> @@ -4596,6 +4601,7 @@ <translation id="7175353351958621980">Dimuatkan daripada:</translation> <translation id="7180611975245234373">Muat semula</translation> <translation id="7180865173735832675">Peribadikan</translation> +<translation id="7181387261278441780">Kosongkan dan tetapkan semula tapak</translation> <translation id="7185078796915954712">TLS 1.3</translation> <translation id="7185690883425432021">Menyembunyikan butang tutup pada tab tidak aktif apabila jalur tab berada dalam mod tindanan.</translation> <translation id="7186088072322679094">Simpan dalam Bar Alat</translation> @@ -4628,7 +4634,6 @@ <translation id="7223775956298141902">Boo ... Anda tidak mempunyai sambungan :-(</translation> <translation id="7224023051066864079">Topeng subnet:</translation> <translation id="7225179976675429563">Jenis rangkaian tiada</translation> -<translation id="7230191962699768124">Tunjukkan semua, bukan animasi</translation> <translation id="7230787553283372882">Sesuaikan saiz teks anda</translation> <translation id="7231224339346098802">Gunakan nombor untuk menunjukkan bilangan salinan untuk dicetak (1 atau lebih).</translation> <translation id="7238585580608191973">Cap jari SHA-256</translation> @@ -4759,7 +4764,6 @@ <translation id="7409233648990234464">Lancarkan Semula dan Powerwash</translation> <translation id="7409836189476010449">Jalankan Flash</translation> <translation id="7410344089573941623">Tanya jika <ph name="HOST" /> ingin mengakses kamera dan mikrofon anda</translation> -<translation id="7411343637221933631">{NUM_COOKIES,plural, =1{1 daripada tapak ini}other{# daripada tapak ini}}</translation> <translation id="7412226954991670867">Memori GPU</translation> <translation id="7416362041876611053">Ralat rangkaian tidak diketahui</translation> <translation id="7417453074306512035">Papan kekunci bahasa Ethiopia</translation> @@ -4881,6 +4885,7 @@ <translation id="756445078718366910">Buka Tetingkap Penyemak Imbas</translation> <translation id="7564847347806291057">Proses akhir</translation> <translation id="7566723889363720618">F12</translation> +<translation id="7567314848159753396">Kuki: <ph name="NAME" /></translation> <translation id="756809126120519699">Data Chrome dikosongkan</translation> <translation id="7568790562536448087">Mengemas kini</translation> <translation id="7573172247376861652">Cas Bateri</translation> @@ -4921,6 +4926,7 @@ <translation id="7626009897377900107">Penghasilan kata laluan</translation> <translation id="7627262197844840899">Tapak ini tidak menerima MasterCard.</translation> <translation id="7627790789328695202">Op, <ph name="FILE_NAME" /> telah pun wujud. Namakan semula dan cuba lagi.</translation> +<translation id="7628127343934101653">Buka fail PDF dalam aplikasi pemapar PDF lalai.</translation> <translation id="762917759028004464">Penyemak imbas lalai kini <ph name="BROWSER_NAME" />.</translation> <translation id="7629536005696009600">Benarkan bukti kelayakan yang disimpan untuk aplikasi Android diisi dalam tapak web yang sama.</translation> <translation id="7629827748548208700">Tab: <ph name="TAB_NAME" /></translation> @@ -5149,6 +5155,7 @@ <translation id="7957513156576779045">Hidupkan Bluetooth untuk membenarkan penggandingan</translation> <translation id="7957615753207896812">Buka tetapan peranti papan kekunci</translation> <translation id="7959074893852789871">Fail mengandungi berbilang sijil, beberapa daripadanya tidak diimport:</translation> +<translation id="7959700692661109221"><ph name="BEGIN_PARAGRAPH" />Perkhidmatan lokasi Google menggunakan sumber seperti Wi-Fi untuk membantu menganggar lokasi peranti anda dengan lebih cepat dan lebih tepat. Apabila anda menghidupkan perkhidmatan lokasi Google, peranti anda memasuki mod yang menggunakan Wi-Fi untuk memberikan maklumat lokasi. Anda boleh mematikan ciri ini dalam tetapan lokasi pada bila-bila masa.<ph name="END_PARAGRAPH" /></translation> <translation id="7961015016161918242">Tidak sama sekali</translation> <translation id="7964089325405904043">Import dan eksport kata laluan</translation> <translation id="7965010376480416255">Memori Kongsi</translation> @@ -5299,6 +5306,7 @@ <translation id="8146793085009540321">Log masuk gagal. Sila hubungi pentadbir anda atau cuba lagi.</translation> <translation id="8148264977957212129">Kaedah input Pinyin</translation> <translation id="8148913456785123871">Tunjukkan kad Google Now dalam pelancar</translation> +<translation id="8150391391298684512">Lumpuhkan Windows Runtime MIDI API</translation> <translation id="8151185429379586178">Alat pembangun</translation> <translation id="8151638057146502721">Konfigurasi</translation> <translation id="8151639108075998630">Dayakan penyemakan imbas tetamu</translation> @@ -5581,6 +5589,7 @@ <translation id="8532294913309524834">Susun bahasa berdasarkan pilihan anda.</translation> <translation id="8535005006684281994">URL Pembaharuan Sijil Netscape</translation> <translation id="8539727552378197395">Tidak (HttpOnly)</translation> +<translation id="8541084862688000575">Muatkan apl Android secara automatik</translation> <translation id="8543181531796978784">Anda boleh <ph name="BEGIN_ERROR_LINK" />laporkan masalah pengesanan<ph name="END_ERROR_LINK" /> atau jika anda memahami risikonya kepada keselamatan anda, <ph name="BEGIN_LINK" />lawati tapak yang tidak selamat ini<ph name="END_LINK" />.</translation> <translation id="8545107379349809705">Sembunyikan maklumat...</translation> <translation id="8545211332741562162">Membolehkan halaman web menggunakan ciri percubaan JavaScript.</translation> @@ -5608,7 +5617,6 @@ <translation id="8569764466147087991">Pilih fail untuk dibuka</translation> <translation id="8571032220281885258">Apabila anda menyebut "Ok Google", Chrome akan mencari perkara yang anda sebut seterusnya.</translation> <translation id="8571108619753148184">Pelayan 4</translation> -<translation id="8572832761467613633">Flash sahaja</translation> <translation id="8572981282494768930">Jangan benarkan tapak mengakses kamera dan mikrofon anda</translation> <translation id="8574234089711453001">Benarkan butang muat turun dipaparkan semasa membuka halaman dengan url media.</translation> <translation id="857779305329188634">Dayakan sokongan protokol QUIC percubaan.</translation> @@ -5630,6 +5638,7 @@ <translation id="8600929685092827187">Aktifkan Apabila Menerima Paket</translation> <translation id="8601206103050338563">Pengesahan Klien TLS WWW</translation> <translation id="8602851771975208551">Program lain pada komputer anda menambah apl yang boleh mengubah cara Chrome berfungsi.</translation> +<translation id="8603912787021349466">Benarkan apl Android untuk bermula secara automatik selepas mengelog masuk.</translation> <translation id="8605428685123651449">Memori SQLite</translation> <translation id="8605503133013456784">Gagal untuk memutuskan sambungan dan nyahpasangan dari "<ph name="DEVICE_NAME" />".</translation> <translation id="8606726445206553943">Gunakan peranti MIDI anda</translation> @@ -5982,6 +5991,7 @@ <translation id="9053965862400494292">Ralat berlaku semasa mencuba menyediakan segerak.</translation> <translation id="9056034633062863292">Mengemas kini Chromebox</translation> <translation id="9056810968620647706">Tiada padanan dijumpai.</translation> +<translation id="9057119625587205566">Tiada pencetak berdekatan</translation> <translation id="9059868303873565140">Menu status</translation> <translation id="9064142312330104323">Foto Profil Google (sedang dimuatkan)</translation> <translation id="9064275926664971810">Dayakan Autolengkap untuk mengisi borang dengan satu klikan</translation> @@ -5992,6 +6002,7 @@ <translation id="9067401056540256169">Bendera ini menjadikan Chrome tidak selamat. Gunakan ini hanya jika anda memahami perkara yang dilakukan. Sila maklum bahawa bendera ini boleh dialih keluar tanpa sebarang notis. Jika didayakan, bingkai dengan asal https boleh menggunakan WebSocket dengan URL tidak selamat (ws://).</translation> <translation id="9068931793451030927">Laluan:</translation> <translation id="9070219033670098627">Tukar orang</translation> +<translation id="9070940116164932228">Perlahankan pemasa latar belakang mahal</translation> <translation id="907148966137935206">Jangan benarkan mana-mana tapak untuk memaparkan pop muncul (disyorkan)</translation> <translation id="9072550133391925347"><ph name="PASSWORD_MANAGER_BRAND" /> melog masuk anda secara automatik ke tapak web dan apl yang layak menggunakan kata laluan yang disimpan.</translation> <translation id="9073281213608662541">PAP</translation> @@ -6025,6 +6036,7 @@ <translation id="9112614144067920641">Sila pilih PIN baharu.</translation> <translation id="9112748030372401671">Tukar kertas dinding anda</translation> <translation id="9112987648460918699">Find...</translation> +<translation id="9114663181201435112">Log masuk dengan mudah</translation> <translation id="9115487443206954631">Urus peranti Cast</translation> <translation id="9115675100829699941">&Bookmarks</translation> <translation id="9121814364785106365">Buka sebagai tab dipin</translation> @@ -6119,7 +6131,6 @@ <translation id="952992212772159698">Tidak diaktifkan</translation> <translation id="960719561871045870">Kod operator</translation> <translation id="960987915827980018">Tinggal kira-kira 1jam</translation> -<translation id="962778376131245616">Tunjukkan tidak selamat, animasi sahaja</translation> <translation id="96421021576709873">Rangkaian Wi-Fi</translation> <translation id="965490406356730238">Dayakan nyahkod mjpeg yang dipercepat perkakasan untuk bingkai diabadikan jika tersedia.</translation> <translation id="968174221497644223">Cache aplikasi</translation>
diff --git a/chrome/app/resources/generated_resources_nl.xtb b/chrome/app/resources/generated_resources_nl.xtb index 5f235a3..68f60f4 100644 --- a/chrome/app/resources/generated_resources_nl.xtb +++ b/chrome/app/resources/generated_resources_nl.xtb
@@ -18,7 +18,6 @@ <translation id="1029317248976101138">Zoom</translation> <translation id="1029595648591494741"><ph name="EXTENSION_NAME" /> proberen?</translation> <translation id="1031362278801463162">Voorbeeld wordt geladen</translation> -<translation id="1031460590482534116">Er is een fout opgetreden bij het opslaan van het clientcertificaat. Fout <ph name="ERROR_NUMBER" /> (<ph name="ERROR_NAME" />).</translation> <translation id="1031573127485938293">Vragen (via beleid)</translation> <translation id="103279545524624934">Maak schijfruimte vrij om Android-apps te starten.</translation> <translation id="1033780634303702874">Toegang krijgen tot je seriële apparaten</translation> @@ -101,6 +100,7 @@ <translation id="1128591060186966949">Zoekmachine bewerken</translation> <translation id="1128987120443782698">Het opslagapparaat heeft een capaciteit van <ph name="DEVICE_CAPACITY" />. Plaats een SD-kaart of USB-stick met een minimale capaciteit van 4 GB.</translation> <translation id="1137135726305341424">domContentLoaded en alle geladen bronnen die vóór domContentLoaded zijn gestart (mainframe en iframes met dezelfde oorsprong).</translation> +<translation id="1138663153846032155">HTML voorrang geven boven Flash</translation> <translation id="1140351953533677694">Toegang tot je seriële en Bluetooth-apparaten</translation> <translation id="114140604515785785">Hoofddirectory van extensie:</translation> <translation id="1143142264369994168">Ondertekenaar van het certificaat</translation> @@ -252,6 +252,7 @@ <translation id="1351692861129622852"><ph name="FILE_COUNT" /> bestanden importeren...</translation> <translation id="1352103415082130575">Thais toetsenbord (Pattachote)</translation> <translation id="1353686479385938207"><ph name="PROVIDER_NAME" />: <ph name="NETWORK_NAME" /></translation> +<translation id="1353946958707294039">Material Design-opslagbeheer</translation> <translation id="1353966721814789986">Startpagina's</translation> <translation id="1354868058853714482">Adobe Reader is verouderd en is mogelijk onveilig om te gebruiken.</translation> <translation id="1355408554203439639">3D-softwareraster</translation> @@ -423,7 +424,6 @@ <translation id="1533920822694388968">Tv-uitlijning</translation> <translation id="15373452373711364">Grote muisaanwijzer</translation> <translation id="1543284117603151572">Geïmporteerd uit Edge</translation> -<translation id="1544350195767834591">{NUM_COOKIES,plural, =1{Eén van andere sites}other{# van andere sites}}</translation> <translation id="1545177026077493356">Automatische kioskmodus</translation> <translation id="1545786162090505744">URL met %s ipv. zoekterm</translation> <translation id="1546280085599573572">Deze extensie heeft gewijzigd welke pagina wordt weergegeven wanneer je op de knop 'Startpagina' klikt.</translation> @@ -447,7 +447,6 @@ <translation id="1559235587769913376">Unicode-tekens invoeren</translation> <translation id="1561092721008294962">HarfBuzz voor UI-tekst</translation> <translation id="1566049601598938765">Website</translation> -<translation id="1566958206723629112">Flash en pdf</translation> <translation id="1567723158593978621">Als deze instelling is ingeschakeld, wordt voor inloggen bij de browser een nieuwe inlogprocedure met afzonderlijk GAIA-wachtwoord gebruikt.</translation> <translation id="1567993339577891801">JavaScript-console</translation> <translation id="1568323446248056064">Weergave-instellingen van apparaat openen</translation> @@ -576,7 +575,6 @@ <translation id="1723940674997333416">Onveilige WebSocket met https-herkomst toestaan</translation> <translation id="1725149567830788547">Besturingselementen &weergeven</translation> <translation id="172612876728038702">De TPM wordt ingesteld. Even geduld, dit kan een paar minuten duren.</translation> -<translation id="1727135806684246609">Material Design - beveiligingsinformatie</translation> <translation id="1729533290416704613">Hiermee wordt ook gecontroleerd welke pagina wordt weergegeven wanneer je vanuit de omnibox zoekt.</translation> <translation id="1731346223650886555">Puntkomma</translation> <translation id="1731589410171062430">Totaal: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /> (<ph name="NUMBER_OF_PAGES" /> <ph name="PAGE_OR_PAGES_LABEL" />)</translation> @@ -873,6 +871,7 @@ <translation id="218492098606937156">Aanraakgebeurtenissen inschakelen</translation> <translation id="2187317261103489799">Detecteren (standaard)</translation> <translation id="2187895286714876935">Fout bij importeren van servercertificaat</translation> +<translation id="2188881192257509750"><ph name="APPLICATION" /> openen</translation> <translation id="2190069059097339078">WiFi Credentials Getter</translation> <translation id="219008588003277019">Native Client-module: <ph name="NEXE_NAME" /></translation> <translation id="2190355936436201913">(leeg)</translation> @@ -991,6 +990,7 @@ <translation id="2326606747676847821">Incognito gaan</translation> <translation id="2326931316514688470">App opnieuw &laden</translation> <translation id="2327492829706409234">App inschakelen</translation> +<translation id="2328054044222305089">Hiermee worden gegevens verwijderd die <ph name="SITE" /> heeft opgeslagen op je apparaat en worden verleende rechten voor uitvoeren gereset. Wil je doorgaan?</translation> <translation id="2329597144923131178">Log in om je bladwijzers, geschiedenis, wachtwoorden en andere instellingen op al je apparaten te gebruiken.</translation> <translation id="2332131598580221120">Bekijken in de Web Store</translation> <translation id="2332742915001411729">Terugzetten naar standaardinstelling</translation> @@ -1266,7 +1266,6 @@ <translation id="2675358154061544447">Zeer experimentele ondersteuning voor het weergeven van iframes op verschillende sites in afzonderlijke processen. In deze modus delen documenten alleen een proces van het weergaveprogramma als ze afkomstig zijn van dezelfde website.</translation> <translation id="2676946222714718093">Wordt afgespeeld op</translation> <translation id="2678063897982469759">Opnieuw inschakelen</translation> -<translation id="2678246812096664977">Alle plug-ins</translation> <translation id="2679385451463308372">Afdrukken via het dialoogvenster van het systeem…</translation> <translation id="2680208403056680091">Je internetverbinding wordt beheerd</translation> <translation id="268053382412112343">Geschi&edenis</translation> @@ -1440,7 +1439,6 @@ <translation id="287286579981869940"><ph name="PROVIDER_NAME" /> toevoegen…</translation> <translation id="2872961005593481000">Afsluiten</translation> <translation id="2875698561019555027">(Chrome-foutpagina's)</translation> -<translation id="2879560882721503072">Client-certificaat dat is uitgegeven door <ph name="ISSUER" /> is opgeslagen.</translation> <translation id="288024221176729610">Tsjechisch</translation> <translation id="288042212351694283">Toegang tot je Universal 2nd Factor-apparaten</translation> <translation id="2881966438216424900">Laatst geopend:</translation> @@ -1589,6 +1587,7 @@ <translation id="3057861065630527966">Een back-up van je foto's en video's maken</translation> <translation id="3058212636943679650">Als je ooit het besturingssysteem van je computer moet herstellen, heb je een SD-kaart of USB-stick voor herstel nodig.</translation> <translation id="305932878998873762">De Simple Cache voor HTTP is een nieuw cachegeheugen. Het is afhankelijk van het bestandssysteem voor toekenning van schijfruimte.</translation> +<translation id="3060251871394327123">Hiermee worden gegevens verwijderd die <ph name="SITE" /> heeft opgeslagen op je apparaat. Wil je doorgaan?</translation> <translation id="3061650404498811439">Schakel toegang in tot invoer van emoji, handschrift en spraak via optioneel IME-menu.</translation> <translation id="3062606427884046423">Android MediaStyle-meldingen gebruiken voor Chrome-mediameldingen.</translation> <translation id="3063844757726132584">Open al je apps vanuit deze handige launcher. Speel games, start videochats, luister naar muziek, bewerk documenten of download meer apps.</translation> @@ -1638,6 +1637,7 @@ <translation id="3123569374670379335">(beperkte rechten)</translation> <translation id="3124111068741548686">USER-handles</translation> <translation id="3126026824346185272">Ctrl</translation> +<translation id="3127156390846601284">Hiermee worden gegevens die zijn opgeslagen op je apparaat, verwijderd voor alle weergegeven sites. Wil je doorgaan?</translation> <translation id="312759608736432009">Fabrikant van apparaat:</translation> <translation id="3127919023693423797">Verifiëren...</translation> <translation id="3128230619496333808">Tabblad 6</translation> @@ -1736,7 +1736,6 @@ <translation id="3264544094376351444">Sans-Serif-lettertype</translation> <translation id="3264547943200567728">Kan het netwerk van je Chromebox niet instellen</translation> <translation id="3265459715026181080">Sluit venster</translation> -<translation id="3267271790328635957">Alleen pdf</translation> <translation id="3267726687589094446">Automatisch downloaden van meerdere bestanden blijven toestaan</translation> <translation id="3267998849713137817">Aangepaste tijd</translation> <translation id="3268451620468152448">Geopende tabbladen</translation> @@ -1982,6 +1981,7 @@ <translation id="3574210789297084292">inloggen</translation> <translation id="3574305903863751447"><ph name="CITY" />, <ph name="STATE" /> <ph name="COUNTRY" /></translation> <translation id="357479282490346887">Litouws</translation> +<translation id="3575927481544652747">Windows Runtime MIDI API voor WebMIDI uitschakelen, die standaard is ingeschakeld in Windows 10 of hoger.</translation> <translation id="3576324189521867626">Installatie geslaagd</translation> <translation id="3578331450833904042">Standaard (alles opvangen)</translation> <translation id="3578594933904494462">De content van dit tabblad wordt gedeeld.</translation> @@ -2035,8 +2035,6 @@ <translation id="3627320433825461852">Minder dan 1 minuut resterend</translation> <translation id="3627588569887975815">Link openen in inco&gnitovenster</translation> <translation id="3627671146180677314">Vernieuwingsmoment voor Netscape-certificaat</translation> -<translation id="3629326610814700057">Hiermee wordt opslagbeheer ingeschakeld voor het beheer van lokale opslag.</translation> -<translation id="3630337581925712713"><ph name="PERMISSION_TYPE_LABEL" />:</translation> <translation id="3631337165634322335">De onderstaande uitzonderingen zijn alleen van toepassing op de huidige incognitosessie.</translation> <translation id="3633586230741134985">Instellingen van app-opstartprogramma</translation> <translation id="3633997706330212530">Je kunt deze services desgewenst uitschakelen.</translation> @@ -2059,7 +2057,8 @@ <translation id="3654045516529121250">Je toegankelijkheidsinstellingen lezen</translation> <translation id="3654092442379740616">Synchronisatiefout: <ph name="PRODUCT_NAME" /> is verouderd en moet worden bijgewerkt.</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{De app heeft permanent toegang tot één bestand.}other{De app heeft permanent toegang tot # bestanden.}}</translation> -<translation id="3657468915905674858">PPAPI Win32k Lockdown inschakelen.</translation> +<translation id="365793796291733849"><ph name="BEGIN_PARAGRAPH1" />Wanneer je de functie voor automatische back-ups inschakelt, worden apparaat- en app-gegevens periodiek opgeslagen in een privémap in Google Drive. App-gegevens kunnen gegevens zijn die een app heeft opgeslagen (op basis van ontwikkelaarsinstellingen), waaronder potentieel gevoelige gegevens zoals contacten, berichten en foto's.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Back-upgegevens tellen niet mee voor je Drive-opslagquotum. Er wordt geen back-up gemaakt van grote bestanden of bestanden die ontwikkelaars hebben uitgesloten van de service.<ph name="END_PARAGRAPH2" /></translation> <translation id="3660234220361471169">Niet vertrouwd</translation> <translation id="3665589677786828986">Chrome heeft gedetecteerd dat sommige van je instellingen zijn beschadigd door een ander programma en heeft de instellingen teruggezet naar de oorspronkelijke standaardwaarden.</translation> <translation id="3665842570601375360">Beveiliging:</translation> @@ -2114,6 +2113,7 @@ <translation id="3733127536501031542">SSL-server met step-up</translation> <translation id="3736520371357197498">Als je de beveiligingsrisico's begrijpt, kun je <ph name="BEGIN_LINK" />deze onveilige site bezoeken<ph name="END_LINK" /> voordat de gevaarlijke programma's zijn verwijderd.</translation> <translation id="3738924763801731196"><ph name="OID" />:</translation> +<translation id="3739254215541673094"><ph name="APPLICATION" /> openen?</translation> <translation id="3739798227959604811">Vertraging voor herhaling:</translation> <translation id="3741158646617793859"><ph name="DEVICE_NAME" /> wordt nu weergegeven in de beheerdersconsole</translation> <translation id="3741243925913727067">Maak een back-up van de foto's en video's op je media-apparaat in Google Drive.</translation> @@ -2352,7 +2352,6 @@ <translation id="4058793769387728514">Controleer document nu</translation> <translation id="4059285154003114015">F&rame afdrukken...</translation> <translation id="406070391919917862">Achtergrondapplicaties</translation> -<translation id="4061502419206152498">Alleen niet-beveiligde zonder animatie weergeven</translation> <translation id="4062251648694601778">Veel plezier met je <ph name="SHORT_PRODUCT_NAME" />-apparaat. Heb je vragen? Je kunt altijd hulp vinden door op het vraagteken in het statusvak te klikken.</translation> <translation id="4065876735068446555">Het is mogelijk dat je de inlogpagina moet bezoeken van het netwerk dat je gebruikt (<ph name="NETWORK_ID" />).</translation> <translation id="4068506536726151626">Deze pagina bevat elementen van de volgende sites die je locatie bijhouden:</translation> @@ -2391,7 +2390,6 @@ <translation id="4101878899871018532">Wachtwoordbeheer biedt niet aan om de gebruikte inloggegevens voor de synchronisatie op te slaan.</translation> <translation id="410351446219883937">Automatisch afspelen</translation> <translation id="4104163789986725820">E&xporteren...</translation> -<translation id="4105523032910086267">Hiermee worden de animatie en zichtbaarheid van de beveiligingsinformatie in Material Design ingesteld.</translation> <translation id="4105563239298244027">Ontvang 1 TB gratis met Google Drive</translation> <translation id="4109135793348361820">Venster verplaatsen naar <ph name="USER_NAME" /> (<ph name="USER_EMAIL" />)</translation> <translation id="4110342520124362335">Cookies van <ph name="DOMAIN" /> geblokkeerd.</translation> @@ -2442,6 +2440,7 @@ <translation id="418179967336296930">Fonetisch Russisch toetsenbord (YaZHert)</translation> <translation id="4181841719683918333">Talen</translation> <translation id="4187248015940562149">Hiermee wordt Web Bluetooth ingeschakeld, waarmee websites kunnen koppelen met Bluetooth-apparaten om je heen en deze kunnen besturen.</translation> +<translation id="4188447344915957833">Hiermee wordt opslagbeheer in de Material Design-instellingen ingeschakeld.</translation> <translation id="4189406272289638749">Deze instelling wordt beheerd door de extensie <b><ph name="EXTENSION_NAME" /></b>.</translation> <translation id="4193154014135846272">Google-document</translation> <translation id="4193182321948161343">Material Design-gebruikersbeheer inschakelen</translation> @@ -2649,6 +2648,7 @@ <translation id="4508765956121923607">Br&on weergeven</translation> <translation id="4509017836361568632">Foto weggooien</translation> <translation id="4509345063551561634">Locatie:</translation> +<translation id="4513946894732546136">Feedback</translation> <translation id="4514542542275172126">Nieuwe gebruiker met beperkte rechten instellen</translation> <translation id="4514914692061505365">Het gebruik van de snelle Subzero-vertaler van PNaCl afdwingen voor alle pexe-bestanden.</translation> <translation id="451515744433878153">Verwijderen</translation> @@ -2747,6 +2747,7 @@ <translation id="4656293982926141856">Deze computer</translation> <translation id="4656631038341342120">VR-shell inschakelen als deze beschikbaar is voor dit apparaat.</translation> <translation id="4657031070957997341">Plug-ins altijd toestaan op <ph name="HOST" /></translation> +<translation id="466008749075469935">Hiermee wordt interventie ingeschakeld om CPU-gebruik van achtergrondtimers te beperken tot 1%.</translation> <translation id="4663254525753315077">Indien mogelijk wordt de scrolinhoud van een overloop-scrolelement hiermee op een samengestelde laag voor sneller scrollen geplaatst.</translation> <translation id="4664482161435122549">Fout bij exporteren van PKCS #12</translation> <translation id="4665014895760275686">Fabrikant</translation> @@ -2815,6 +2816,7 @@ <translation id="4749157430980974800">Georgisch toetsenbord</translation> <translation id="4750394297954878236">Suggesties</translation> <translation id="475088594373173692">Eerste gebruiker</translation> +<translation id="4750892496809949692">HTML-content voorrang geven door Flash te verbergen in de lijst met plug-ins.</translation> <translation id="4750917950439032686">Je gegevens (zoals wachtwoorden of creditcardnummers) zijn privé wanneer ze worden verzonden naar deze site.</translation> <translation id="4753602155423695878">Animatie van de voortgangsbalk voor het laden van de pagina op een Android-telefoon</translation> <translation id="4755240240651974342">Fins toetsenbord</translation> @@ -3089,6 +3091,7 @@ <translation id="5119450342834678097">Optie voor het aanvragen tabletsites in het instellingenmenu</translation> <translation id="5120068803556741301">Invoermethode van derden</translation> <translation id="5120421890733714118">Dit certificaat vertrouwen voor het identificeren van websites.</translation> +<translation id="5120516977819314347">Pincode of wachtwoord onjuist.</translation> <translation id="5121130586824819730">Je vaste schijf is vol. Sla op een andere locatie op of maak ruimte vrij op de vaste schijf.</translation> <translation id="5125751979347152379">Ongeldige URL.</translation> <translation id="5127881134400491887">Netwerkverbindingen beheren</translation> @@ -3096,6 +3099,7 @@ <translation id="512903556749061217">aangesloten</translation> <translation id="5129301143853688736">Je verbinding met deze site is niet privé. Aanvallers kunnen mogelijk informatie (bijvoorbeeld foto's, wachtwoorden, berichten en creditcarddetails) van <ph name="DOMAIN" /> stelen.</translation> <translation id="5129662217315786329">Pools</translation> +<translation id="5131347545782851480">Pdf-documenten</translation> <translation id="5134856901811723984">Material Design in de gebruikersinterface van Chrome OS</translation> <translation id="5135533361271311778">Kan bladwijzeritem niet maken.</translation> <translation id="5136529877787728692">F7</translation> @@ -3263,6 +3267,7 @@ <translation id="5328031682234198929">8</translation> <translation id="5329858601952122676">Verwij&deren</translation> <translation id="5330145655348521461">Deze bestanden zijn op een ander bureaublad geopend. Verplaats ze naar <ph name="USER_NAME" /> (<ph name="MAIL_ADDRESS" />) om ze weer te geven.</translation> +<translation id="5330512191124428349">Informatie ophalen</translation> <translation id="5332624210073556029">Tijdzone:</translation> <translation id="5333807720589685258">Je simkaart wordt permanent uitgeschakeld als je geen correcte PUK-code kunt invoeren.</translation> <translation id="5333958554630697967">Hiermee schakel je experimentele Web Platform-functies in die in ontwikkeling zijn.</translation> @@ -3694,7 +3699,6 @@ <translation id="5892507820957994680">Hiermee wordt de ingebouwde lijst voor softwareverwerking genegeerd en wordt GPU-versnelling ingeschakeld voor niet-ondersteunde systeemconfiguraties.</translation> <translation id="5895138241574237353">Opnieuw starten</translation> <translation id="5895187275912066135">Verleend op</translation> -<translation id="5898154795085152510">De server heeft een ongeldig clientcertificaat geretourneerd. Fout <ph name="ERROR_NUMBER" /> (<ph name="ERROR_NAME" />).</translation> <translation id="5900302528761731119">Google-profielfoto</translation> <translation id="590253956165195626">Aanbieden om pagina’s te vertalen die in een voor jou onbekende taal zijn.</translation> <translation id="5904093760909470684">Proxyconfiguratie</translation> @@ -3749,6 +3753,8 @@ <translation id="5984222099446776634">Recent bezocht</translation> <translation id="5984814259619230127">Smart Lock-detectie via Bluetooth Low Energy</translation> <translation id="5986245990306121338">Als deze instelling is ingeschakeld, wordt een tabbladschakelaar weergegeven, ook als de optie 'tabbladen en apps samenvoegen' is ingeschakeld in de instellingen.</translation> +<translation id="5989712527536636369"><ph name="BEGIN_PARAGRAPH1" />Dit zijn algemene gegevens over je apparaat en hoe je het apparaat gebruikt, zoals de accustatus, hoe vaak je apps gebruikt, de kwaliteit en duur van je netwerkverbindingen (zoals wifi en Bluetooth), en crashrapporten wanneer zaken niet werken zoals ze zouden moeten werken. Deze gegevens worden gebruikt om de producten en services van Google voor iedereen te verbeteren. Sommige samengevoegde gegevens helpen ook partners, zoals Android-ontwikkelaars, om hun apps en producten beter te maken.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Je kunt dit op elk gewenst moment in- of uitschakelen in de instellingen voor Android-apps. Dit heeft geen invloed op de mogelijkheid van je apparaat om de benodigde gegevens te verzenden zodat het essentiële services kan ontvangen, zoals service-updates en beveiliging.<ph name="END_PARAGRAPH2" /></translation> <translation id="5990198433782424697">Extensies voor URL's met chrome://</translation> <translation id="5990814808592353318">Wachtwoorden handmatig genereren.</translation> <translation id="5991049340509704927">Vergroten</translation> @@ -3762,6 +3768,7 @@ <translation id="6005695835120147974">Mediarouter</translation> <translation id="6007237601604674381">Verplaatsen mislukt. <ph name="ERROR_MESSAGE" /></translation> <translation id="6008241731410823808">Verzendt signalen voor hyperlinkcontrole.</translation> +<translation id="6011449291337289699">Sitegegevens wissen</translation> <translation id="6015796118275082299">Jaar</translation> <translation id="6016551720757758985">Powerwash bevestigen met herstel van eerdere versie</translation> <translation id="6016809788585079594">Zeg nog één keer "Ok Google"</translation> @@ -3951,7 +3958,6 @@ <translation id="6276301056778294989">Zorg ervoor dat het apparaat dezelfde code weergeeft.</translation> <translation id="6277105963844135994">Time-out van netwerk</translation> <translation id="6277518330158259200">&Screenshot maken</translation> -<translation id="6278428485366576908">Thema</translation> <translation id="6279183038361895380">Druk op |<ph name="ACCELERATOR" />| om je cursor weer te geven</translation> <translation id="6280215091796946657">Inloggen met een ander account</translation> <translation id="6280912520669706465">ARC</translation> @@ -4203,6 +4209,7 @@ <translation id="6607272825297743757">Bestandsinformatie</translation> <translation id="6607831829715835317">Meer hu&lpprogramma's</translation> <translation id="6608140561353073361">Alle cookies en sitegegevens...</translation> +<translation id="6610183966322615106">Fout bij toevoegen van printer</translation> <translation id="6610610633807698299">URL invoeren...</translation> <translation id="6612358246767739896">Beveiligde content</translation> <translation id="6615455863669487791">Weergeven</translation> @@ -4266,7 +4273,6 @@ <translation id="6708242697268981054">Oorspronkelijke locatie:</translation> <translation id="6709357832553498500">Verbinding maken via <ph name="EXTENSIONNAME" /></translation> <translation id="6710213216561001401">Vorige</translation> -<translation id="6712158998835983046">Alle met animatie weergeven</translation> <translation id="6718273304615422081">Inpakken...</translation> <translation id="671928215901716392">Scherm vergrendelen</translation> <translation id="6721972322305477112">&Archief</translation> @@ -4539,7 +4545,6 @@ <translation id="7088434364990739311">Het starten van de updatecontrole is mislukt (foutcode <ph name="ERROR" />).</translation> <translation id="708856090370082727">Schakel ondersteuning voor overscrollen schermtoetsenbord in. Wanneer deze vlag is ingeschakeld, wordt alleen het formaat aangepast van de visuele viewport.</translation> <translation id="7088674813905715446">Dit apparaat is uit bedrijf genomen door de beheerder. Vraag uw beheerder om het apparaat op 'in behandeling' in te stellen, zodat het kan worden aangemeld.</translation> -<translation id="7089609847854449639">Opslagbeheer</translation> <translation id="708969677220991657">Hiermee worden verzoeken aan localhost via HTTPS toegestaan, ook als er een ongeldig certificaat wordt gepresenteerd.</translation> <translation id="7092106376816104">Uitzonderingen voor pop-ups</translation> <translation id="7093866338626856921">Gegevens uitwisselen met de apparaten met de naam: <ph name="HOSTNAMES" /></translation> @@ -4579,7 +4584,7 @@ <translation id="715118844758971915">Klassieke printers</translation> <translation id="7154130902455071009">Je startpagina wijzigen in: <ph name="START_PAGE" /></translation> <translation id="7155171745945906037">Bestaande foto van camera of uit bestand</translation> -<translation id="715568033737470079">Hiermee geef je de PPAPI-plug-ins op die worden uitgevoerd in het sandbox-beleid voor het vergrendelen van Win32k (alleen Windows 10 en hoger).</translation> +<translation id="7155226869555939647">Links voor <ph name="APPLICATION" /> altijd openen</translation> <translation id="7156235233373189579">Dit bestand is ontworpen voor een pc met Windows-software. Dit is niet compatibel met je apparaat met Chrome OS. Zoek in de <ph name="BEGIN_LINK" />Chrome Web Store<ph name="END_LINK" /> naar een geschikte, vervangende app.<ph name="BEGIN_LINK_HELP" />Meer informatie<ph name="END_LINK_HELP" /></translation> <translation id="7157063064925785854">Door op 'Doorgaan' te klikken, ga je akkoord met <ph name="LEGAL_DOC_LINK_TEXT_1" />, <ph name="LEGAL_DOC_LINK_TEXT_2" />, <ph name="LEGAL_DOC_LINK_TEXT_3" /> en <ph name="LEGAL_DOC_LINK_TEXT_4" />.</translation> <translation id="7158238151765743968">Verbinding met '<ph name="DEVICE_NAME" />' is nog actief.</translation> @@ -4594,6 +4599,7 @@ <translation id="7175353351958621980">Geladen via:</translation> <translation id="7180611975245234373">Vernieuwen</translation> <translation id="7180865173735832675">Aanpassen</translation> +<translation id="7181387261278441780">Site wissen en resetten</translation> <translation id="7185078796915954712">TLS 1.3</translation> <translation id="7185690883425432021">De knoppen voor het sluiten van inactieve tabbladen worden verborgen wanneer de tabbladstrook zich in de gestapelde modus bevindt.</translation> <translation id="7186088072322679094">In werkbalk houden</translation> @@ -4626,7 +4632,6 @@ <translation id="7223775956298141902">Je hebt nog geen extensies.</translation> <translation id="7224023051066864079">Subnetmasker:</translation> <translation id="7225179976675429563">Type netwerk ontbreekt</translation> -<translation id="7230191962699768124">Alle zonder animatie weergeven</translation> <translation id="7230787553283372882">Lettergrootte aanpassen</translation> <translation id="7231224339346098802">Gebruik een cijfer om aan te geven hoeveel exemplaren er moeten worden afgedrukt (1 of meer).</translation> <translation id="7238585580608191973">SHA-256-vingerafdruk</translation> @@ -4758,7 +4763,6 @@ <translation id="7409233648990234464">Opnieuw starten en Powerwash uitvoeren</translation> <translation id="7409836189476010449">Flash uitvoeren</translation> <translation id="7410344089573941623">Vragen of <ph name="HOST" /> toegang wil tot je camera en microfoon</translation> -<translation id="7411343637221933631">{NUM_COOKIES,plural, =1{Eén van deze site}other{# van deze site}}</translation> <translation id="7412226954991670867">GPU-geheugen</translation> <translation id="7416362041876611053">Onbekende netwerkfout.</translation> <translation id="7417453074306512035">Ethiopisch toetsenbord</translation> @@ -4880,6 +4884,7 @@ <translation id="756445078718366910">Browservenster openen</translation> <translation id="7564847347806291057">Proces beëindigen</translation> <translation id="7566723889363720618">F12</translation> +<translation id="7567314848159753396">Cookie: <ph name="NAME" /></translation> <translation id="756809126120519699">Chrome-gegevens gewist</translation> <translation id="7568790562536448087">Bijwerken</translation> <translation id="7573172247376861652">Acculading</translation> @@ -4920,6 +4925,7 @@ <translation id="7626009897377900107">Wachtwoorden genereren</translation> <translation id="7627262197844840899">Deze site accepteert geen MasterCard.</translation> <translation id="7627790789328695202"><ph name="FILE_NAME" /> bestaat al. Geef een nieuwe naam op en probeer het opnieuw.</translation> +<translation id="7628127343934101653">Pdf-bestanden openen in de standaard pdf-viewer-app.</translation> <translation id="762917759028004464">De standaardbrowser is momenteel <ph name="BROWSER_NAME" />.</translation> <translation id="7629536005696009600">Toestaan dat inloggegevens die worden opgeslagen voor Android-apps, worden ingevuld op bijbehorende websites.</translation> <translation id="7629827748548208700">Tabblad: <ph name="TAB_NAME" /></translation> @@ -5148,6 +5154,7 @@ <translation id="7957513156576779045">Schakel Bluetooth in om te koppelen</translation> <translation id="7957615753207896812">Toetsenbordinstellingen van apparaat openen</translation> <translation id="7959074893852789871">Het bestand bevat meerdere certificaten. Sommige van deze certificaten zijn niet geïmporteerd:</translation> +<translation id="7959700692661109221"><ph name="BEGIN_PARAGRAPH" />De locatieservice van Google maakt gebruik van bronnen zoals wifi, zodat de locatie van je apparaat sneller en nauwkeuriger kan worden bepaald. Wanneer je de locatieservices van Google inschakelt, wordt je apparaat ingesteld op een modus waarbij wifi wordt gebruikt om locatiegegevens te bieden. Je kunt deze functie op elk gewenst moment uitschakelen via de locatie-instellingen.<ph name="END_PARAGRAPH" /></translation> <translation id="7961015016161918242">Nooit</translation> <translation id="7964089325405904043">Wachtwoorden importeren en exporteren</translation> <translation id="7965010376480416255">Gedeeld geheugen</translation> @@ -5298,6 +5305,7 @@ <translation id="8146793085009540321">Inloggen mislukt. Neem contact op met je beheerder of probeer het opnieuw.</translation> <translation id="8148264977957212129">Pinyin-invoermethode</translation> <translation id="8148913456785123871">Google Now-kaarten weergeven in de Launcher</translation> +<translation id="8150391391298684512">Windows Runtime MIDI API uitschakelen</translation> <translation id="8151185429379586178">Ontwikkelaarstools</translation> <translation id="8151638057146502721">Configureren</translation> <translation id="8151639108075998630">Browsen als gast toestaan</translation> @@ -5580,6 +5588,7 @@ <translation id="8532294913309524834">Talen rangschikken op basis van je voorkeur.</translation> <translation id="8535005006684281994">URL voor verlengen van Netscape-certificaat</translation> <translation id="8539727552378197395">Nee (HttpOnly)</translation> +<translation id="8541084862688000575">Android-apps automatisch laden</translation> <translation id="8543181531796978784">Je kunt <ph name="BEGIN_ERROR_LINK" />een detectieprobleem melden<ph name="END_ERROR_LINK" />. Als je de veiligheidsrisico's begrijpt, kun je ook <ph name="BEGIN_LINK" />deze onveilige site bezoeken<ph name="END_LINK" />.</translation> <translation id="8545107379349809705">Informatie verbergen...</translation> <translation id="8545211332741562162">Webpagina's toestaan experimentele JavaScript-functies te gebruiken.</translation> @@ -5607,7 +5616,6 @@ <translation id="8569764466147087991">Selecteer een bestand om te openen</translation> <translation id="8571032220281885258">Wanneer je 'OK Google' zegt, zoekt Chrome naar het volgende dat je zegt.</translation> <translation id="8571108619753148184">Server 4</translation> -<translation id="8572832761467613633">Alleen Flash</translation> <translation id="8572981282494768930">Niet toestaan dat sites toegang krijgen tot je camera en microfoon</translation> <translation id="8574234089711453001">Toestaan dat een downloadknop wordt weergegeven wanneer een pagina met een media-URL wordt geopend.</translation> <translation id="857779305329188634">Experimentele QUIC-protocolondersteuning inschakelen.</translation> @@ -5629,6 +5637,7 @@ <translation id="8600929685092827187">Wekken bij pakketten</translation> <translation id="8601206103050338563">TLS WWW-clientverificatie</translation> <translation id="8602851771975208551">Een ander programma op je computer heeft een app toegevoegd die de manier waarop Chrome werkt kan wijzigen.</translation> +<translation id="8603912787021349466">Toestaan dat Android-apps automatisch worden gestart na inloggen.</translation> <translation id="8605428685123651449">SQLite-geheugen</translation> <translation id="8605503133013456784">Verbinding verbreken met en ontkoppelen van '<ph name="DEVICE_NAME" />' mislukt.</translation> <translation id="8606726445206553943">Je MIDI-apparaten gebruiken</translation> @@ -5982,6 +5991,7 @@ <translation id="9053965862400494292">Er is een fout opgetreden bij het instellen van de synchronisatie.</translation> <translation id="9056034633062863292">Chromebox bijwerken</translation> <translation id="9056810968620647706">Geen overeenkomsten gevonden.</translation> +<translation id="9057119625587205566">Geen printers in de buurt</translation> <translation id="9059868303873565140">Statusmenu</translation> <translation id="9064142312330104323">Google-profielfoto (laden)</translation> <translation id="9064275926664971810">Automatisch aanvullen inschakelen om formulieren met één klik in te vullen</translation> @@ -5992,6 +6002,7 @@ <translation id="9067401056540256169">Deze vlag maakt Chrome onveilig. Gebruik dit alleen als je deze functie begrijpt. Deze vlag kan zonder kennisgeving worden verwijderd. Als deze optie is ingeschakeld, kunnen frames met een HTTPS-herkomst WebSockets met een onveilige URL (ws://) gebruiken.</translation> <translation id="9068931793451030927">Pad:</translation> <translation id="9070219033670098627">Van persoon wisselen</translation> +<translation id="9070940116164932228">Intensieve achtergrondtimers beperken</translation> <translation id="907148966137935206">Sites niet toestaan pop-ups weer te geven (aanbevolen)</translation> <translation id="9072550133391925347"><ph name="PASSWORD_MANAGER_BRAND" /> logt je automatisch in bij geschikte sites en apps met wachtwoorden die je hebt opgeslagen.</translation> <translation id="9073281213608662541">PAP</translation> @@ -6026,6 +6037,7 @@ <translation id="9112614144067920641">Selecteer een nieuwe pincode.</translation> <translation id="9112748030372401671">Je achtergrond wijzigen</translation> <translation id="9112987648460918699">Zoek...</translation> +<translation id="9114663181201435112">Gemakkelijk inloggen</translation> <translation id="9115487443206954631">Cast-apparaten beheren</translation> <translation id="9115675100829699941">&Bladwijzers</translation> <translation id="9121814364785106365">Openen als vastgezet tabblad</translation> @@ -6120,7 +6132,6 @@ <translation id="952992212772159698">Niet geactiveerd</translation> <translation id="960719561871045870">Operatorcode</translation> <translation id="960987915827980018">Ongeveer 1 uur resterend</translation> -<translation id="962778376131245616">Alleen niet-beveiligde met animatie weergeven</translation> <translation id="96421021576709873">Wifi-netwerk</translation> <translation id="965490406356730238">Hardware-versnelde MJPEG-decodering voor vastgelegd frame waar mogelijk inschakelen.</translation> <translation id="968174221497644223">Applicatiecache</translation>
diff --git a/chrome/app/resources/generated_resources_no.xtb b/chrome/app/resources/generated_resources_no.xtb index 05decd3..59da6acb 100644 --- a/chrome/app/resources/generated_resources_no.xtb +++ b/chrome/app/resources/generated_resources_no.xtb
@@ -18,7 +18,6 @@ <translation id="1029317248976101138">Zoom</translation> <translation id="1029595648591494741">Vil du prøve <ph name="EXTENSION_NAME" />?</translation> <translation id="1031362278801463162">Laster inn forhåndsvisning</translation> -<translation id="1031460590482534116">Det oppstod en feil under lagring av klientsertifikatet. Feil <ph name="ERROR_NUMBER" /> (<ph name="ERROR_NAME" />).</translation> <translation id="1031573127485938293">Spør (i henhold til retningslinjer)</translation> <translation id="103279545524624934">Frigjør lagringsplass for å starte Android-apper.</translation> <translation id="1033780634303702874">bruke de seriekoblede enhetene dine</translation> @@ -101,6 +100,7 @@ <translation id="1128591060186966949">Endre i søkemotoren</translation> <translation id="1128987120443782698">Lagringsenheten har en kapasitet på <ph name="DEVICE_CAPACITY" />. Sett inn et SD-kort eller en USB-minnepinne med kapasitet på minst 4 GB.</translation> <translation id="1137135726305341424">domContentLoaded og alle ressursinnlastinger som er startet før domContentLoaded (hovedramme og iframe-elementer fra samme opphav).</translation> +<translation id="1138663153846032155">Foretrekk HTML fremfor Flash</translation> <translation id="1140351953533677694">bruke Bluetooth og de seriekoblede enhetene dine</translation> <translation id="114140604515785785">Rotkatalog for utvidelse:</translation> <translation id="1143142264369994168">Sertifikat-signatar</translation> @@ -252,6 +252,7 @@ <translation id="1351692861129622852">Importerer <ph name="FILE_COUNT" /> filer ...</translation> <translation id="1352103415082130575">Thai-tastatur (Pattachote)</translation> <translation id="1353686479385938207"><ph name="PROVIDER_NAME" />: <ph name="NETWORK_NAME" /></translation> +<translation id="1353946958707294039">«Material design»-lagringsbehandling</translation> <translation id="1353966721814789986">Oppstartsider</translation> <translation id="1354868058853714482">Adobe Reader er utdatert og kan være usikkert.</translation> <translation id="1355408554203439639">Programvarebasert 3D-rasterisering</translation> @@ -420,7 +421,6 @@ <translation id="1533920822694388968">TV-justering</translation> <translation id="15373452373711364">Stor markør</translation> <translation id="1543284117603151572">Importert fra Edge</translation> -<translation id="1544350195767834591">{NUM_COOKIES,plural, =1{1 fra andre nettsteder}other{# fra andre nettsteder}}</translation> <translation id="1545177026077493356">Automatisk kioskmodus</translation> <translation id="1545786162090505744">Nettadresse, med %s for søk</translation> <translation id="1546280085599573572">Denne utvidelsen har endret hvilken side som vises når du klikker på Startside-knappen.</translation> @@ -444,7 +444,6 @@ <translation id="1559235587769913376">Angi Unicode-tegn</translation> <translation id="1561092721008294962">HarfBuzz for tekst i brukergrensesnittet</translation> <translation id="1566049601598938765">Nettsted</translation> -<translation id="1566958206723629112">Flash og PDF</translation> <translation id="1567723158593978621">Når dette er på, brukes en ny påloggingsprosess som er adskilt fra gaia-passordet, når du logger på nettleseren.</translation> <translation id="1567993339577891801">JavaScript-konsoll</translation> <translation id="1568323446248056064">Åpne skjerminnstillingene på enheten</translation> @@ -573,7 +572,6 @@ <translation id="1723940674997333416">Tillat usikker WebSocket fra https-opprinnelse</translation> <translation id="1725149567830788547">Vis &kontroller</translation> <translation id="172612876728038702">TPM konfigureres. Vær tålmodig. Dette kan ta noen minutter.</translation> -<translation id="1727135806684246609">Detaljert sikkerhetsvarsel for «material design»</translation> <translation id="1729533290416704613">Den styrer også hvilken side som vises når du søker fra multifunksjonsfeltet.</translation> <translation id="1731346223650886555">Semikolon</translation> <translation id="1731589410171062430">Totalt: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /> (<ph name="NUMBER_OF_PAGES" /><ph name="PAGE_OR_PAGES_LABEL" />)</translation> @@ -869,6 +867,7 @@ <translation id="218492098606937156">Aktivér berøringshendelser</translation> <translation id="2187317261103489799">Oppdag (standard)</translation> <translation id="2187895286714876935">Feil ved import av tjenersertifikat</translation> +<translation id="2188881192257509750">Åpne <ph name="APPLICATION" /></translation> <translation id="2190069059097339078">WiFi Credentials Getter</translation> <translation id="219008588003277019">Native Client-modul: <ph name="NEXE_NAME" /></translation> <translation id="2190355936436201913">(tom)</translation> @@ -987,6 +986,7 @@ <translation id="2326606747676847821">Start inkognitomodus</translation> <translation id="2326931316514688470">&Last inn appen på nytt</translation> <translation id="2327492829706409234">Aktiver appen</translation> +<translation id="2328054044222305089">Dette fører til at alle data <ph name="SITE" /> har lagret på enheten din, blir slettet, og eventuelle kjøringstillatelser du har gitt, blir tilbakestilt. Vil du fortsette?</translation> <translation id="2329597144923131178">Logg på for å få bokmerkene, loggen, passordene og de andre innstillingene dine på alle enhetene du bruker.</translation> <translation id="2332131598580221120">Se i Nettmarked</translation> <translation id="2332742915001411729">Tilbakestill til standard</translation> @@ -1261,7 +1261,6 @@ <translation id="2675358154061544447">Svært eksperimentell støtte for gjengivelse av iframes med koblinger til andre nettsteder i separate prosesser. I denne modusen blir gjengivelsesprosesser bare delt mellom dokumenter fra samme nettsted.</translation> <translation id="2676946222714718093">Spilles av på</translation> <translation id="2678063897982469759">Aktiver på nytt</translation> -<translation id="2678246812096664977">Alle programtillegg</translation> <translation id="2679385451463308372">Skriv ut ved bruk av systemdialogboksen</translation> <translation id="2680208403056680091">Internett-tilkoblingen din kontrolleres</translation> <translation id="268053382412112343">Lo&gg</translation> @@ -1435,7 +1434,6 @@ <translation id="287286579981869940">Legg til <ph name="PROVIDER_NAME" /></translation> <translation id="2872961005593481000">Slå av</translation> <translation id="2875698561019555027">(Chrome-feilsider)</translation> -<translation id="2879560882721503072">Klientsertifikat utstedt av <ph name="ISSUER" /> er lagret.</translation> <translation id="288024221176729610">Tsjekkisk</translation> <translation id="288042212351694283">Tilgang til de universelle annenfaktorenhetene dine</translation> <translation id="2881966438216424900">Sist åpnet:</translation> @@ -1584,6 +1582,7 @@ <translation id="3057861065630527966">Sikkerhetskopiér bildene og videoene dine</translation> <translation id="3058212636943679650">Hvis du noen gang skulle trenge å gjenopprette datamaskinens operativsystem, må du ha SD-kort eller USB-minnepinne for gjenoppretting.</translation> <translation id="305932878998873762">Simple Cache for HTTP er en ny buffer. Den er avhengig av filsystemet for å bli tildelt lagringsplass.</translation> +<translation id="3060251871394327123">Dette fører til at alle data <ph name="SITE" /> har lagret på enheten din, blir slettet. Vil du fortsette?</translation> <translation id="3061650404498811439">Slår på tilgang til emojier, håndskrift og taleinndata fra den valgfrie IME-menyen.</translation> <translation id="3062606427884046423">Bruk Android MediaStyle-varsler for medievarsler i Chrome.</translation> <translation id="3063844757726132584">Få tilgang til alle appene dine i denne praktiske appoversikten. Spill, videochat, lytt til musikk, rediger dokumenter eller last ned flere apper.</translation> @@ -1633,6 +1632,7 @@ <translation id="3123569374670379335">(administrert)</translation> <translation id="3124111068741548686">BRUKEREN håndterer</translation> <translation id="3126026824346185272">Ctrl</translation> +<translation id="3127156390846601284">Dette fører til at alle data de viste nettstedene har lagret på enheten din, blir slettet. Vil du fortsette?</translation> <translation id="312759608736432009">Enhetens produsent:</translation> <translation id="3127919023693423797">Autentiserer ...</translation> <translation id="3128230619496333808">Fane 6</translation> @@ -1731,7 +1731,6 @@ <translation id="3264544094376351444">Uten seriffer</translation> <translation id="3264547943200567728">Kunne ikke konfigurere nettverket for Chromeboxen</translation> <translation id="3265459715026181080">Lukk vindu</translation> -<translation id="3267271790328635957">Bare PDF</translation> <translation id="3267726687589094446">Tillat fortsatt automatiske nedlastinger av flere filer</translation> <translation id="3267998849713137817">Endringstidspunkt</translation> <translation id="3268451620468152448">Åpne faner</translation> @@ -1976,6 +1975,7 @@ <translation id="3574210789297084292">logg på</translation> <translation id="3574305903863751447"><ph name="CITY" />, <ph name="STATE" />, <ph name="COUNTRY" /></translation> <translation id="357479282490346887">Litauisk</translation> +<translation id="3575927481544652747">Slå av Windows Runtime MIDI API for WebMIDI. Dette er som standard slått på i Windows 10 eller nyere.</translation> <translation id="3576324189521867626">Installert</translation> <translation id="3578331450833904042">Standard (registrerer alt)</translation> <translation id="3578594933904494462">Innholdet i denne fanen blir delt.</translation> @@ -2029,8 +2029,6 @@ <translation id="3627320433825461852">Mindre enn ett minutt igjen</translation> <translation id="3627588569887975815">Åpne linken i inko&gnitovindu</translation> <translation id="3627671146180677314">Tid for fornying av Netscape-sertifikat</translation> -<translation id="3629326610814700057">Slår på lagringsbehandlingen for å administrere lokal lagring.</translation> -<translation id="3630337581925712713"><ph name="PERMISSION_TYPE_LABEL" />:</translation> <translation id="3631337165634322335">Unntakene nedenfor gjelder kun gjeldende inkognitoøkt.</translation> <translation id="3633586230741134985">Innstillinger for appvelgeren</translation> <translation id="3633997706330212530">Du kan velge å deaktivere disse tjenestene.</translation> @@ -2053,7 +2051,8 @@ <translation id="3654045516529121250">lese tilgjengelighetsinnstillingene dine</translation> <translation id="3654092442379740616">Synkroniseringsfeil: <ph name="PRODUCT_NAME" /> er foreldet og må oppdateres.</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{Den har permanent tilgang til én fil.}other{Den har permanent tilgang til # filer.}}</translation> -<translation id="3657468915905674858">Slå på Win32k-låsing for PPAPI.</translation> +<translation id="365793796291733849"><ph name="BEGIN_PARAGRAPH1" />Når du slår på automatisk sikkerhetskopiering, lagres enhetsdata og appdata med jevne mellomrom i en privat mappe på Google Disk. Appdata kan være alle slags data apper har lagret (basert på utviklerinnstillingene), inkludert potensielt sensitive data, for eksempel kontakter, meldinger og bilder.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Sikkerhetskopierte data telles ikke med i Disk-lagringskvoten din. Store filer eller filer utviklere har valgt å ekskludere fra tjenesten, blir ikke sikkerhetskopiert.<ph name="END_PARAGRAPH2" /></translation> <translation id="3660234220361471169">Uklarert</translation> <translation id="3665589677786828986">Chrome har oppdaget at noen av innstillingene ble ødelagt av et annet program og tilbakestille dem til originalinnstillingene.</translation> <translation id="3665842570601375360">Sikkerhet:</translation> @@ -2108,6 +2107,7 @@ <translation id="3733127536501031542">SSL-tjener med oppgradering </translation> <translation id="3736520371357197498">Hvis du forstår sikkerhetsrisikoen, kan du <ph name="BEGIN_LINK" />gå til det usikre nettstedet<ph name="END_LINK" /> før de farlige programmene er fjernet.</translation> <translation id="3738924763801731196"><ph name="OID" />:</translation> +<translation id="3739254215541673094">Vil du åpne <ph name="APPLICATION" />?</translation> <translation id="3739798227959604811">Forsinkelse før gjentakelse:</translation> <translation id="3741158646617793859">Nå vises <ph name="DEVICE_NAME" /> i administrasjonskonsollen</translation> <translation id="3741243925913727067">Sikkerhetskopiér bilder og videoer på medieenheten din til Google Disk.</translation> @@ -2344,7 +2344,6 @@ <translation id="4058793769387728514">Kontroller dokument nå</translation> <translation id="4059285154003114015">Sk&riv ut ramme</translation> <translation id="406070391919917862">Bakgrunnsprogrammer</translation> -<translation id="4061502419206152498">Vis bare usikre (ikke animert)</translation> <translation id="4062251648694601778">Kos deg med <ph name="SHORT_PRODUCT_NAME" />-enheten din. Har du spørsmål? Du kan alltid få hjelp ved å klikke på spørsmålstegnet i statusfeltet.</translation> <translation id="4065876735068446555">Det kan hende at nettverket du bruker (<ph name="NETWORK_ID" />), krever at du besøker en påloggingsside.</translation> <translation id="4068506536726151626">Denne siden inneholder elementer fra følgende nettsteder som sporer posisjonen din:</translation> @@ -2383,7 +2382,6 @@ <translation id="4101878899871018532">Passordbehandleren tilbyr ikke lagring av påloggingsinformasjonen som brukes til synkronisering.</translation> <translation id="410351446219883937">Autoavspilling</translation> <translation id="4104163789986725820">E&ksportér</translation> -<translation id="4105523032910086267">Angir animasjon og synlighet for detaljerte sikkerhetsvarsler i «material design».</translation> <translation id="4105563239298244027">Få 1 TB gratis lagring med Google Disk</translation> <translation id="4109135793348361820">Flytt vinduet til <ph name="USER_NAME" /> (<ph name="USER_EMAIL" />)</translation> <translation id="4110342520124362335">Informasjonskapsler fra <ph name="DOMAIN" /> blokkert.</translation> @@ -2434,6 +2432,7 @@ <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="4188447344915957833">Slår på lagringsbehandlingen i «material design»-innstillingene.</translation> <translation id="4189406272289638749">Denne innstillingen kontrolleres av utvidelsen <b><ph name="EXTENSION_NAME" /></b>.</translation> <translation id="4193154014135846272">Google-dokument</translation> <translation id="4193182321948161343">Slå på «material design»-brukerbehandlingen</translation> @@ -2641,6 +2640,7 @@ <translation id="4508765956121923607">Vis &kilde</translation> <translation id="4509017836361568632">Slett bilde</translation> <translation id="4509345063551561634">Plassering:</translation> +<translation id="4513946894732546136">Google Feedback</translation> <translation id="4514542542275172126">Konfigurer en ny administrert bruker</translation> <translation id="4514914692061505365">Tving bruk av den raske PNaCl Subzero-oversetteren for alle pexe-filer.</translation> <translation id="451515744433878153">Fjern</translation> @@ -2739,6 +2739,7 @@ <translation id="4656293982926141856">Denne datamaskinen</translation> <translation id="4656631038341342120">Slå på VR-skall hvis det er tilgjengelig for denne enheten.</translation> <translation id="4657031070957997341">Tillat alltid programtillegg på <ph name="HOST" /></translation> +<translation id="466008749075469935">Slår på intervensjon for å begrense CPU-bruken for tidtakere i bakgrunnen til 1 %.</translation> <translation id="4663254525753315077">Når det er mulig, legges rullende innhold på et rulleelement med overflyt over på et sammensatt lag for å gi raskere rulling.</translation> <translation id="4664482161435122549">Eksportfeil for PKCS #12</translation> <translation id="4665014895760275686">Produsent</translation> @@ -2807,6 +2808,7 @@ <translation id="4749157430980974800">Georgisk tastatur</translation> <translation id="4750394297954878236">Forslag</translation> <translation id="475088594373173692">Første bruker</translation> +<translation id="4750892496809949692">Foretrekk HTML-innhold ved å skjule Flash fra listen over programtillegg.</translation> <translation id="4750917950439032686">Informasjonen din (for eksempel passord eller kredittkortnumre) er privat når den sendes til dette nettstedet.</translation> <translation id="4753602155423695878">Animasjon for fremdriftslinjen for sideinnlasting på Android-telefoner.</translation> <translation id="4755240240651974342">Finsk tastatur</translation> @@ -3080,6 +3082,7 @@ <translation id="5119450342834678097">Alternativ for sending av forespørsler om nettbrettoptimerte nettsteder i innstillingsmenyen</translation> <translation id="5120068803556741301">Tredjeparts inndatametode</translation> <translation id="5120421890733714118">Stol på dette sertifikatet for identifisering av nettsteder.</translation> +<translation id="5120516977819314347">PIN-koden eller passordet er feil.</translation> <translation id="5121130586824819730">Harddisken din er full. Lagre på et annet sted, eller frigjør plass på harddisken.</translation> <translation id="5125751979347152379">Ugyldig nettadresse.</translation> <translation id="5127881134400491887">administrere nettverkstilkoblinger</translation> @@ -3087,6 +3090,7 @@ <translation id="512903556749061217">vedlagt</translation> <translation id="5129301143853688736">Tilkoblingen til dette nettstedet er ikke privat. Det kan hende at hackere prøver å stjele informasjonen din (for eksempel bilder, passord, meldinger og kredittkort) fra <ph name="DOMAIN" />.</translation> <translation id="5129662217315786329">Polsk</translation> +<translation id="5131347545782851480">PDF-dokumenter</translation> <translation id="5134856901811723984">«Material design» i systembrukergrensesnittet i Chrome OS</translation> <translation id="5135533361271311778">Kan ikke opprette bokmerkeelement.</translation> <translation id="5136529877787728692">F7</translation> @@ -3253,6 +3257,7 @@ <translation id="5328031682234198929">8</translation> <translation id="5329858601952122676">&Slett</translation> <translation id="5330145655348521461">Disse filene ble åpnet på et annet skrivebord. Flytt til <ph name="USER_NAME" /> (<ph name="MAIL_ADDRESS" />) for å se dem.</translation> +<translation id="5330512191124428349">Få informasjon</translation> <translation id="5332624210073556029">Tidssone:</translation> <translation id="5333807720589685258">SIM-kortet ditt blir deaktivert permanent hvis du ikke angir riktig PUK-kode.</translation> @@ -3685,7 +3690,6 @@ <translation id="5892507820957994680">Overstyrer den innebygde listen over gjengivelsesprogramvare og aktiverer GPU-akselerasjon på systemkonfigurasjoner uten støtte.</translation> <translation id="5895138241574237353">Start på nytt</translation> <translation id="5895187275912066135">Utstedt</translation> -<translation id="5898154795085152510">Tjeneren returnerte et ugyldig klientsertifikat. Feil <ph name="ERROR_NUMBER" /> (<ph name="ERROR_NAME" />).</translation> <translation id="5900302528761731119">Google-profilbilde</translation> <translation id="590253956165195626">Tilby oversettelse av nettsider på språk du ikke kan lese.</translation> <translation id="5904093760909470684">Konfigurasjon av mellomtjener</translation> @@ -3740,6 +3744,8 @@ <translation id="5984222099446776634">Nylig besøkte</translation> <translation id="5984814259619230127">Smart Lock-gjenkjenning av telefoner over Bluetooth LE (Low Energy)</translation> <translation id="5986245990306121338">Hvis du slår på dette flagget, vises det en fanevelger selv når alternativet «Slå sammen faner og apper» er slått på i innstillingene.</translation> +<translation id="5989712527536636369"><ph name="BEGIN_PARAGRAPH1" />Dette er generell informasjon om enheten din og hvordan du bruker den, for eksempel batterinivå, hvor ofte du bruker appene dine, kvaliteten og varigheten på nettverkstilkoblingene (som Wi-Fi og Bluetooth) og programstopprapporter når ting ikke fungerer som de skal. Dette brukes for å forbedre Googles produkter og tjenester for alle brukere. Enkelte samlede opplysninger brukes også for å hjelpe partnere, for eksempel Android-utviklere, med å forbedre appene og produktene de tilbyr.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Du kan når som helst slå dette av eller på ved å gå til innstillingene for Android-apper. Dette har ingen innvirkning på enhetens evne til å sende informasjon den trenger for å motta nødvendige tjenester, for eksempel systemoppdateringer og sikkerhet.<ph name="END_PARAGRAPH2" /></translation> <translation id="5990198433782424697">Utvidelser på chrome://-nettadresser</translation> <translation id="5990814808592353318">Manuell passordgenerering.</translation> <translation id="5991049340509704927">Forstørr</translation> @@ -3753,6 +3759,7 @@ <translation id="6005695835120147974">Medieruter</translation> <translation id="6007237601604674381">Flytting mislyktes. <ph name="ERROR_MESSAGE" /></translation> <translation id="6008241731410823808">Sender ping for revisjon av hyperkoblinger.</translation> +<translation id="6011449291337289699">Fjern nettstedsdata</translation> <translation id="6015796118275082299">År</translation> <translation id="6016551720757758985">Bekreft kjøring av Powerwash, som tilbakestiller enheten til forrige versjon</translation> <translation id="6016809788585079594">Si «Ok Google» en siste gang</translation> @@ -3942,7 +3949,6 @@ <translation id="6276301056778294989">Kontrollér at enheten viser den samme koden.</translation> <translation id="6277105963844135994">Tidsavbrudd for nettverket</translation> <translation id="6277518330158259200">Ta en skjermdump</translation> -<translation id="6278428485366576908">Tema</translation> <translation id="6279183038361895380">Trykk på |<ph name="ACCELERATOR" />| for å se markøren</translation> <translation id="6280215091796946657">Logg på med en annen konto</translation> <translation id="6280912520669706465">ARC</translation> @@ -4193,6 +4199,7 @@ <translation id="6607272825297743757">Filinformasjon</translation> <translation id="6607831829715835317">Flere verktøy</translation> <translation id="6608140561353073361">Se alle informasjonskapsler og nettstedsdata</translation> +<translation id="6610183966322615106">Kunne ikke legge til skriveren</translation> <translation id="6610610633807698299">Angi nettadresse</translation> <translation id="6612358246767739896">Beskyttet innhold</translation> <translation id="6615455863669487791">Vis meg</translation> @@ -4256,7 +4263,6 @@ <translation id="6708242697268981054">Opprinnelse:</translation> <translation id="6709357832553498500">Koble til med <ph name="EXTENSIONNAME" /></translation> <translation id="6710213216561001401">Forrige</translation> -<translation id="6712158998835983046">Vis alle (animert)</translation> <translation id="6718273304615422081">Zipper ...</translation> <translation id="671928215901716392">Lås skjerm</translation> <translation id="6721972322305477112">&Fil</translation> @@ -4527,7 +4533,6 @@ <translation id="7088434364990739311">Kunne ikke starte søk etter oppdateringer (feilkode <ph name="ERROR" />).</translation> <translation id="708856090370082727">Slå på støtte for overrulling for skjermtastaturet. Når dette alternativet («flagget») er på, endrer skjermtastaturet bare størrelsen på det visuelle visningsområdet.</translation> <translation id="7088674813905715446">Administratoren har gitt denne enheten status som «ikke klargjort». For å aktivere den for registrering, må du be administratoren gi enheten status som «ventende».</translation> -<translation id="7089609847854449639">Lagringsbehandling</translation> <translation id="708969677220991657">Tillater forespørsler til den lokale verten via HTTPS selv når det presenteres et ugyldig sertifikat.</translation> <translation id="7092106376816104">Unntak for forgrunnsvinduer</translation> <translation id="7093866338626856921">Utveksle data med enhetene <ph name="HOSTNAMES" /></translation> @@ -4567,7 +4572,7 @@ <translation id="715118844758971915">Vanlige skrivere</translation> <translation id="7154130902455071009">endre startsiden din til: <ph name="START_PAGE" /></translation> <translation id="7155171745945906037">Eksisterende bilde fra kamera eller fil</translation> -<translation id="715568033737470079">Angir hvilke PPAPI-programtillegg som kan kjøres innenfor regelen for prosessisolering med Win32k-låsing (gjelder bare for Windows 10 og nyere).</translation> +<translation id="7155226869555939647">Åpne alltid linker for <ph name="APPLICATION" /></translation> <translation id="7156235233373189579">Denne filen er laget for en datamaskin som bruker Windows-programvare. Den er ikke kompatibel med enheten din, som kjører Chrome OS. Du kan søke i <ph name="BEGIN_LINK" />Chrome Nettmarked<ph name="END_LINK" /> etter en passende erstatningsapp.<ph name="BEGIN_LINK_HELP" />Finn ut mer<ph name="END_LINK_HELP" /></translation> <translation id="7157063064925785854">Ved å klikke på «Fortsett» godtar du <ph name="LEGAL_DOC_LINK_TEXT_1" />, <ph name="LEGAL_DOC_LINK_TEXT_2" />, <ph name="LEGAL_DOC_LINK_TEXT_3" /> og <ph name="LEGAL_DOC_LINK_TEXT_4" />.</translation> <translation id="7158238151765743968">Tilkobling til <ph name="DEVICE_NAME" /> pågår fortsatt.</translation> @@ -4582,6 +4587,7 @@ <translation id="7175353351958621980">Lastet fra:</translation> <translation id="7180611975245234373">Last inn på nytt</translation> <translation id="7180865173735832675">Tilpass</translation> +<translation id="7181387261278441780">Fjern og tilbakestill nettstedet</translation> <translation id="7185078796915954712">TLS 1.3</translation> <translation id="7185690883425432021">Skjuler lukkeknappene på inaktive faner når fanestripen er i stablet modus.</translation> <translation id="7186088072322679094">Behold i verktøyraden</translation> @@ -4614,7 +4620,6 @@ <translation id="7223775956298141902">Huff a meg, du har ingen utvidelser :-(</translation> <translation id="7224023051066864079">Delnettsmaske:</translation> <translation id="7225179976675429563">Nettverkstype mangler</translation> -<translation id="7230191962699768124">Vis alle (ikke animert)</translation> <translation id="7230787553283372882">Tilpass tekststørrelsen</translation> <translation id="7231224339346098802">Bruk et nummer for å angi hvor mange kopier som skal skrives ut (1 eller flere).</translation> <translation id="7238585580608191973">SHA-256-fingeravtrykk</translation> @@ -4740,7 +4745,6 @@ <translation id="7409233648990234464">Start på nytt og bruk Powerwash</translation> <translation id="7409836189476010449">Kjør Flash</translation> <translation id="7410344089573941623">Spør om <ph name="HOST" /> ønsker å bruke kameraet og mikrofonen din</translation> -<translation id="7411343637221933631">{NUM_COOKIES,plural, =1{1 fra dette nettstedet}other{# fra dette nettstedet}}</translation> <translation id="7412226954991670867">GPU-minne</translation> <translation id="7416362041876611053">Ukjent nettverksfeil.</translation> <translation id="7417453074306512035">Etiopisk tastatur</translation> @@ -4860,6 +4864,7 @@ <translation id="756445078718366910">Åpne nettleservindu</translation> <translation id="7564847347806291057">Avslutt prosessen</translation> <translation id="7566723889363720618">F12</translation> +<translation id="7567314848159753396">Informasjonskapsel: <ph name="NAME" /></translation> <translation id="756809126120519699">Chrome-dataene er slettet</translation> <translation id="7568790562536448087">Oppdaterer</translation> <translation id="7573172247376861652">Batterilading</translation> @@ -4900,6 +4905,7 @@ <translation id="7626009897377900107">Passordgenerering</translation> <translation id="7627262197844840899">Dette nettstedet godtar ikke MasterCard.</translation> <translation id="7627790789328695202">Beklager, <ph name="FILE_NAME" /> finnes allerede. Gi den et nytt navn og prøv igjen.</translation> +<translation id="7628127343934101653">Åpne PDF-filer i standardappen for visning av PDF-filer.</translation> <translation id="762917759028004464">Standard nettleser er <ph name="BROWSER_NAME" />.</translation> <translation id="7629536005696009600">Tillat at legitimasjon som er lagret for Android-apper, fylles inn på de tilhørende nettstedene.</translation> <translation id="7629827748548208700">Fane: <ph name="TAB_NAME" /></translation> @@ -5128,6 +5134,7 @@ <translation id="7957513156576779045">Slå på Bluetooth for å tillate tilkobling</translation> <translation id="7957615753207896812">Åpne tastaturinnstillingene på enheten</translation> <translation id="7959074893852789871">Filen inneholdt flere sertifikater, og enkelte av dem ble ikke importert:</translation> +<translation id="7959700692661109221"><ph name="BEGIN_PARAGRAPH" />Googles posisjonstjenester bruker kilder som Wi-Fi til å fastslå posisjonen til enheten din raskere og mer presist. Når du slår på Googles posisjonstjenester, aktiveres det en modus på enheten din hvor Wi-Fi brukes til å levere posisjonsinformasjon. Du kan når som helst slå av dette i posisjonsinnstillingene.<ph name="END_PARAGRAPH" /></translation> <translation id="7961015016161918242">Aldri</translation> <translation id="7964089325405904043">Import og eksport av passord</translation> <translation id="7965010376480416255">Lagret minne</translation> @@ -5278,6 +5285,7 @@ <translation id="8146793085009540321">Påloggingen mislyktes. Kontakt administratoren din, eller prøv på nytt.</translation> <translation id="8148264977957212129">Pinyin inndatametode</translation> <translation id="8148913456785123871">Vis Google Nå-kort i appoversikten</translation> +<translation id="8150391391298684512">Slå av Windows Runtime MIDI API</translation> <translation id="8151185429379586178">Utviklerverktøy</translation> <translation id="8151638057146502721">Konfigurer</translation> <translation id="8151639108075998630">Aktiver nettlesing for gjester</translation> @@ -5558,6 +5566,7 @@ <translation id="8532294913309524834">Bestill språk basert på preferansene dine.</translation> <translation id="8535005006684281994">Fornying av Netscape-sertifikat for nettadresse</translation> <translation id="8539727552378197395">Nei (kun http)</translation> +<translation id="8541084862688000575">Last inn Android-apper automatisk</translation> <translation id="8543181531796978784">Du kan <ph name="BEGIN_ERROR_LINK" />rapportere et påvisningsproblem<ph name="END_ERROR_LINK" /> eller, hvis du forstår sikkerhetsrisikoen, <ph name="BEGIN_LINK" />gå til dette usikre nettstedet<ph name="END_LINK" />.</translation> <translation id="8545107379349809705">Skjul informasjon</translation> <translation id="8545211332741562162">La nettsider bruke eksperimentelle JavaScript-funksjoner.</translation> @@ -5585,7 +5594,6 @@ <translation id="8569764466147087991">Velg en fil du vil åpne</translation> <translation id="8571032220281885258">Når du sier «Ok Google», søker Chrome etter det du sier rett etterpå.</translation> <translation id="8571108619753148184">Tjener 4</translation> -<translation id="8572832761467613633">Bare Flash</translation> <translation id="8572981282494768930">Ikke la nettsteder få tilgang til kameraet og mikrofonen din</translation> <translation id="8574234089711453001">Tillat at det vises en nedlastingsknapp når det åpnes sider med medienettadresser.</translation> <translation id="857779305329188634">Aktiver eksperimentell protokollstøtte for QUIC.</translation> @@ -5607,6 +5615,7 @@ <translation id="8600929685092827187">Vekk fra hvilemodus ved pakker</translation> <translation id="8601206103050338563">Autentisering av klienten TLS WWW</translation> <translation id="8602851771975208551">Et annet program på datamaskinen la til en app som kan endre måten Chrome fungerer på.</translation> +<translation id="8603912787021349466">Tillat at Android-apper starter automatisk når du logger på.</translation> <translation id="8605428685123651449">SQLite-minne</translation> <translation id="8605503133013456784">Kunne ikke fjerne tilknytning til og koble fra «<ph name="DEVICE_NAME" />».</translation> <translation id="8606726445206553943">bruke MIDI-enhetene dine</translation> @@ -5959,6 +5968,7 @@ <translation id="9053965862400494292">Det oppstod en feil under forsøket på å konfigurere Google Synkronisering.</translation> <translation id="9056034633062863292">Oppdaterer Chromeboxen</translation> <translation id="9056810968620647706">Finner ingen treff.</translation> +<translation id="9057119625587205566">Ingen skrivere i nærheten</translation> <translation id="9059868303873565140">Statusmeny</translation> <translation id="9064142312330104323">Google-profilbilde (laster inn)</translation> <translation id="9064275926664971810">Slå på Autofyll for å fylle ut skjemaer ved hjelp av ett enkelt klikk</translation> @@ -5969,6 +5979,7 @@ <translation id="9067401056540256169">Dette flagget gjør Chrome usikker. Du må bare bruke det hvis du forstår hva det innebærer. Merk at dette flagget kan bli fjernet uten forvarsel. Hvis aktivert, kan rammer med https-opprinnelse bruke WebSockets med en usikker nettadresse (ws://).</translation> <translation id="9068931793451030927">Bane:</translation> <translation id="9070219033670098627">Bytt person</translation> +<translation id="9070940116164932228">Reguler tidtakere i bakgrunnen som bruker mye ressurser</translation> <translation id="907148966137935206">Ikke tillat nettsteder å vise forgrunnsvinduer (anbefales)</translation> <translation id="9072550133391925347"><ph name="PASSWORD_MANAGER_BRAND" /> logger deg på kvalifiserte nettsteder og apper automatisk med passord du har lagret.</translation> <translation id="9073281213608662541">PAP</translation> @@ -6003,6 +6014,7 @@ <translation id="9112614144067920641">Velg en ny personlig kode.</translation> <translation id="9112748030372401671">endre bakgrunnen din</translation> <translation id="9112987648460918699">Finn</translation> +<translation id="9114663181201435112">Logg enkelt på</translation> <translation id="9115487443206954631">Administrer Cast-enheter</translation> <translation id="9115675100829699941">&Bokmerker</translation> <translation id="9121814364785106365">Åpne som festet fane</translation> @@ -6097,7 +6109,6 @@ <translation id="952992212772159698">Ikke aktivert</translation> <translation id="960719561871045870">Operatørkode</translation> <translation id="960987915827980018">Omtrent én time igjen</translation> -<translation id="962778376131245616">Vis bare usikre (animert)</translation> <translation id="96421021576709873">Wi-Fi-nettverk</translation> <translation id="965490406356730238">Slå på maskinvareakselerert MJPEG-dekoding for skjermdumper der dette er tilgjengelig.</translation> <translation id="968174221497644223">Programbuffer</translation>
diff --git a/chrome/app/resources/generated_resources_pl.xtb b/chrome/app/resources/generated_resources_pl.xtb index a35589da2..8f6caea 100644 --- a/chrome/app/resources/generated_resources_pl.xtb +++ b/chrome/app/resources/generated_resources_pl.xtb
@@ -18,7 +18,6 @@ <translation id="1029317248976101138">Powiększ</translation> <translation id="1029595648591494741">Wypróbować „<ph name="EXTENSION_NAME" />”?</translation> <translation id="1031362278801463162">Wczytywanie podglądu</translation> -<translation id="1031460590482534116">Wystąpił błąd podczas próby zapisania certyfikatu klienta. Błąd <ph name="ERROR_NUMBER" /> (<ph name="ERROR_NAME" />).</translation> <translation id="1031573127485938293">Pytaj (zgodnie z zasadami)</translation> <translation id="103279545524624934">Aby uruchomić aplikacje na Androida, zwolnij miejsce na dysku.</translation> <translation id="1033780634303702874">Dostęp do urządzeń szeregowych</translation> @@ -101,6 +100,7 @@ <translation id="1128591060186966949">Edytuj wyszukiwarkę</translation> <translation id="1128987120443782698">Urządzenie pamięci masowej ma pojemność <ph name="DEVICE_CAPACITY" />. Włóż kartę SD lub pamięć USB o pojemności co najmniej 4 GB.</translation> <translation id="1137135726305341424">Zdarzenie domContentLoaded i wczytanie wszystkich zasobów nastąpiło przed zdarzeniem domContentLoaded (główna ramka i elementy iframe z tego samego źródła).</translation> +<translation id="1138663153846032155">Wybieraj HTML zamiast Flasha</translation> <translation id="1140351953533677694">Dostęp do urządzeń Bluetooth i szeregowych</translation> <translation id="114140604515785785">Główny katalog rozszerzenia:</translation> <translation id="1143142264369994168">Podmiot podpisujący certyfikat</translation> @@ -252,6 +252,7 @@ <translation id="1351692861129622852">Importuję <ph name="FILE_COUNT" /> pliki(ów)...</translation> <translation id="1352103415082130575">Klawiatura tajska (Pattachote)</translation> <translation id="1353686479385938207"><ph name="PROVIDER_NAME" />: <ph name="NETWORK_NAME" /></translation> +<translation id="1353946958707294039">Menedżer miejsca Material Design</translation> <translation id="1353966721814789986">Strony otwierane po uruchomieniu</translation> <translation id="1354868058853714482">Program Adobe Reader jest nieaktualny i może mieć luki w zabezpieczeniach.</translation> <translation id="1355408554203439639">Programowy rasteryzator 3D</translation> @@ -423,7 +424,6 @@ <translation id="1533920822694388968">Dopasowywanie ekranu TV</translation> <translation id="15373452373711364">Duży kursor myszy</translation> <translation id="1543284117603151572">Zaimportowane z Edge</translation> -<translation id="1544350195767834591">{NUM_COOKIES,plural, =1{1 z innych stron}few{# z innych stron}many{# z innych stron}other{# z innych stron}}</translation> <translation id="1545177026077493356">Automatyczny tryb kiosku</translation> <translation id="1545786162090505744">URL z parametrem %s (zapytanie)</translation> <translation id="1546280085599573572">To rozszerzenie ustawiło inną stronę wyświetlaną po kliknięciu przycisku strony startowej.</translation> @@ -447,7 +447,6 @@ <translation id="1559235587769913376">Wprowadź znaki Unicode</translation> <translation id="1561092721008294962">HarfBuzz dla tekstu interfejsu</translation> <translation id="1566049601598938765">Strona internetowa</translation> -<translation id="1566958206723629112">Flash i PDF</translation> <translation id="1567723158593978621">Gdy ta opcja jest włączona, do logowania się w przeglądarce używany jest nowy proces z osobnym oknem do wpisywania hasła GAIA.</translation> <translation id="1567993339577891801">Konsola JavaScript</translation> <translation id="1568323446248056064">Otwórz ustawienia wyświetlacza</translation> @@ -576,7 +575,6 @@ <translation id="1723940674997333416">Zezwalaj na niezabezpieczone połączenie WebSocket z adresu źródłowego https</translation> <translation id="1725149567830788547">Pokaż elementy &sterujące</translation> <translation id="172612876728038702">Moduł TPM jest konfigurowany. Prosimy o cierpliwość; może to potrwać kilka minut.</translation> -<translation id="1727135806684246609">Pełne dane zabezpieczeń Material Design</translation> <translation id="1729533290416704613">Kontroluje także to, jaka strona wyświetla się po wyszukiwaniu w omniboksie.</translation> <translation id="1731346223650886555">Średnik</translation> <translation id="1731589410171062430">Łącznie: <ph name="SHEETS_LABEL" /> – <ph name="NUMBER_OF_SHEETS" /> (<ph name="PAGE_OR_PAGES_LABEL" /> – <ph name="NUMBER_OF_PAGES" />)</translation> @@ -655,7 +653,7 @@ <translation id="1842969606798536927">Zapłać</translation> <translation id="184456654378801210">(natywna)</translation> <translation id="1844692022597038441">Ten plik nie jest dostępny offline.</translation> -<translation id="1846308012215045257">Kliknij z naciśniętym klawiszem Control, by uruchomić wtyczkę <ph name="PLUGIN_NAME" /></translation> +<translation id="1846308012215045257">Naciśnij klawisz Control i kliknij, by uruchomić wtyczkę <ph name="PLUGIN_NAME" /></translation> <translation id="184633654410729720">Klawiatura tajska (Kedmanee)</translation> <translation id="1849186935225320012">Ta strona ma pełny dostęp do sterowania urządzeniami MIDI.</translation> <translation id="1850508293116537636">Obróć w &prawo</translation> @@ -872,6 +870,7 @@ <translation id="218492098606937156">Włącz zdarzenia dotykowe</translation> <translation id="2187317261103489799">Wykrywaj (domyślnie)</translation> <translation id="2187895286714876935">Błąd importowania certyfikatu serwera</translation> +<translation id="2188881192257509750">Otwórz <ph name="APPLICATION" /></translation> <translation id="2190069059097339078">Program do pobierania danych logowania do Wi-Fi</translation> <translation id="219008588003277019">Moduł klienta natywnego: <ph name="NEXE_NAME" /></translation> <translation id="2190355936436201913">(puste)</translation> @@ -990,6 +989,7 @@ <translation id="2326606747676847821">Włącz tryb incognito</translation> <translation id="2326931316514688470">P&rzeładuj aplikację</translation> <translation id="2327492829706409234">Włącz aplikację</translation> +<translation id="2328054044222305089">Spowoduje to usunięcie wszystkich danych zapisanych na urządzeniu przez witrynę <ph name="SITE" /> oraz zresetowanie wszystkich uprawnień przydzielonych w celu jej uruchamiania. Czy chcesz kontynuować?</translation> <translation id="2329597144923131178">Zaloguj się, by korzystać z zakładek, historii, haseł i innych ustawień na wszystkich swoich urządzeniach.</translation> <translation id="2332131598580221120">Wyświetl w sklepie</translation> <translation id="2332742915001411729">Przywróć domyślne</translation> @@ -1265,7 +1265,6 @@ <translation id="2675358154061544447">Bardzo eksperymentalna obsługa renderowania elementów iframe z różnych witryn w osobnych procesach. W tym trybie jeden proces będzie renderować tylko dokumenty pochodzące z tej samej witryny.</translation> <translation id="2676946222714718093">Odtwarzane na</translation> <translation id="2678063897982469759">Włącz ponownie</translation> -<translation id="2678246812096664977">Wszystkie wtyczki</translation> <translation id="2679385451463308372">Drukuj poprzez systemowe okno dialogowe</translation> <translation id="2680208403056680091">Twoje połączenie internetowe jest kontrolowane</translation> <translation id="268053382412112343">Hi&storia</translation> @@ -1439,7 +1438,6 @@ <translation id="287286579981869940">Dodaj dostawcę <ph name="PROVIDER_NAME" />...</translation> <translation id="2872961005593481000">Wyłącz</translation> <translation id="2875698561019555027">(Strony błędów Chrome)</translation> -<translation id="2879560882721503072">Pomyślnie zapisano certyfikat klienta wystawiony przez <ph name="ISSUER" />.</translation> <translation id="288024221176729610">Czeski</translation> <translation id="288042212351694283">Dostęp do urządzeń Universal 2nd Factor</translation> <translation id="2881966438216424900">Ostatni dostęp:</translation> @@ -1588,6 +1586,7 @@ <translation id="3057861065630527966">Utwórz kopię zapasową zdjęć i filmów</translation> <translation id="3058212636943679650">Do przywrócenia systemu operacyjnego komputera niezbędna jest karta SD lub pamięć USB z obrazem odzyskiwania.</translation> <translation id="305932878998873762">Prosta pamięć podręczna dla HTTP to nowa pamięć podręczna. Korzysta z systemu plików dla przydziału miejsca na dysku.</translation> +<translation id="3060251871394327123">Spowoduje to usunięcie wszystkich danych zapisanych na urządzeniu przez witrynę <ph name="SITE" />. Czy chcesz kontynuować?</translation> <translation id="3061650404498811439">Włącz dostęp do emotikonów, pisma odręcznego i rozpoznawania mowy w menu IME.</translation> <translation id="3062606427884046423">Używanie powiadomień Android MediaStyle jako powiadomień o multimediach w Chrome.</translation> <translation id="3063844757726132584">Otwieraj wszystkie aplikacje w praktycznym programie uruchamiającym. Graj w gry, rozmawiaj ze znajomymi na czacie wideo, słuchaj muzyki, edytuj dokumenty i pobieraj kolejne aplikacje.</translation> @@ -1637,6 +1636,7 @@ <translation id="3123569374670379335">(nadzorowany)</translation> <translation id="3124111068741548686">Uchwyty USER</translation> <translation id="3126026824346185272">Ctrl</translation> +<translation id="3127156390846601284">Spowoduje to usunięcie wszystkich zapisanych na urządzeniu danych dotyczących wszystkich pokazanych witryn. Czy chcesz kontynuować?</translation> <translation id="312759608736432009">Producent urządzenia:</translation> <translation id="3127919023693423797">Uwierzytelnianie...</translation> <translation id="3128230619496333808">Karta 6</translation> @@ -1735,7 +1735,6 @@ <translation id="3264544094376351444">Czcionka bezszeryfowa</translation> <translation id="3264547943200567728">Nie udało się skonfigurować sieci Chromeboksa</translation> <translation id="3265459715026181080">Zamknij okno</translation> -<translation id="3267271790328635957">Tylko PDF</translation> <translation id="3267726687589094446">Dalej zezwalaj na automatyczne pobieranie wielu plików</translation> <translation id="3267998849713137817">Czas modyfikacji</translation> <translation id="3268451620468152448">Otwarte karty</translation> @@ -1981,6 +1980,7 @@ <translation id="3574210789297084292">zaloguj się</translation> <translation id="3574305903863751447"><ph name="CITY" />, <ph name="STATE" /> <ph name="COUNTRY" /></translation> <translation id="357479282490346887">Litewski</translation> +<translation id="3575927481544652747">Wyłącz interfejs Windows Runtime MIDI API dla WebMIDI, który jest domyślnie włączony w systemie Windows 10 i nowszych.</translation> <translation id="3576324189521867626">Zainstalowano</translation> <translation id="3578331450833904042">Domyślny (rejestruje wszystkie dźwięki)</translation> <translation id="3578594933904494462">Treść tej karty jest udostępniana.</translation> @@ -2034,8 +2034,6 @@ <translation id="3627320433825461852">Została mniej niż 1 minuta</translation> <translation id="3627588569887975815">Otwórz link w oknie inco&gnito</translation> <translation id="3627671146180677314">Czas odnowienia certyfikatu firmy Netscape</translation> -<translation id="3629326610814700057">Umożliwia Menedżerowi miejsca zarządzanie miejscem lokalnym.</translation> -<translation id="3630337581925712713"><ph name="PERMISSION_TYPE_LABEL" />:</translation> <translation id="3631337165634322335">Poniższe wyjątki odnoszą się wyłącznie do bieżącej sesji incognito.</translation> <translation id="3633586230741134985">Ustawienia menu z aplikacjami</translation> <translation id="3633997706330212530">Możesz opcjonalnie wyłączyć te usługi.</translation> @@ -2058,7 +2056,8 @@ <translation id="3654045516529121250">Odczyt ustawień ułatwień dostępu</translation> <translation id="3654092442379740616">Błąd synchronizacji: aplikacja <ph name="PRODUCT_NAME" /> jest nieaktualna i musi zostać zaktualizowana.</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{Ma stały dostęp do jednego pliku.}few{Ma stały dostęp do # plików.}many{Ma stały dostęp do # plików.}other{Ma stały dostęp do # pliku.}}</translation> -<translation id="3657468915905674858">Włącz blokadę PPAPI Win32k.</translation> +<translation id="365793796291733849"><ph name="BEGIN_PARAGRAPH1" />Kiedy włączysz automatyczną kopię zapasową, dane urządzenia i aplikacji będą regularnie zapisywane w prywatnym folderze na Dysku Google. Dane aplikacji mogą obejmować dowolne informacje zapisane przez aplikację (w zależności od ustawień określonych przez programistę) – w tym potencjalnie poufne dane takie jak kontakty, wiadomości i zdjęcia.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Kopia zapasowa nie wlicza się do limitu miejsca na Dysku. Nie obejmuje dużych plików ani tych, które programista wyłączył z tej usługi.<ph name="END_PARAGRAPH2" /></translation> <translation id="3660234220361471169">Niezaufany</translation> <translation id="3665589677786828986">Przeglądarka Chrome wykryła, że niektóre z jej ustawień zostały zmodyfikowane przez inny program, i przywróciła im pierwotne wartości domyślne.</translation> <translation id="3665842570601375360">Zabezpieczenia:</translation> @@ -2113,6 +2112,7 @@ <translation id="3733127536501031542">Serwer SSL z dostępem</translation> <translation id="3736520371357197498">Jeśli rozumiesz zagrożenie, możesz <ph name="BEGIN_LINK" />odwiedzić tę niebezpieczną stronę<ph name="END_LINK" />, zanim niebezpieczne programy zostaną usunięte.</translation> <translation id="3738924763801731196"><ph name="OID" />:</translation> +<translation id="3739254215541673094">Otworzyć <ph name="APPLICATION" />?</translation> <translation id="3739798227959604811">Opóźnienie przed powtarzaniem:</translation> <translation id="3741158646617793859"><ph name="DEVICE_NAME" /> pojawi się teraz w konsoli administracyjnej</translation> <translation id="3741243925913727067">Tworzy na Dysku Google kopie zapasowe zdjęć i filmów z nośnika danych.</translation> @@ -2137,7 +2137,7 @@ <translation id="3763401818161139108">Zawsze uruchamiaj na <ph name="ORIGIN" /></translation> <translation id="3764314093345384080">Szczegółowe informacje o kompilacji</translation> <translation id="3764583730281406327">{NUM_DEVICES,plural, =1{Komunikuje się z urządzeniem USB}few{Komunikuje się z # urządzeniami USB}many{Komunikuje się z # urządzeniami USB}other{Komunikuje się z # urządzenia USB}}</translation> -<translation id="3764800135428056022">Proponuj zapamiętywanie haseł internetowych.</translation> +<translation id="3764800135428056022">Proponuj zapisywanie haseł internetowych.</translation> <translation id="3764986667044728669">Nie można się zarejestrować</translation> <translation id="3765285310188645110">Umożliwia udostępnianie stron offline.</translation> <translation id="3768037234834996183">Synchronizuję ustawienia...</translation> @@ -2351,7 +2351,6 @@ <translation id="4058793769387728514">Sprawdź dokument</translation> <translation id="4059285154003114015">&Drukuj ramkę...</translation> <translation id="406070391919917862">Aplikacje działające w tle</translation> -<translation id="4061502419206152498">Pokazuj tylko niezabezpieczone i nieanimowane</translation> <translation id="4062251648694601778">Życzymy przyjemnego użytkowania urządzenia <ph name="SHORT_PRODUCT_NAME" />. Masz pytania? Zawsze możesz otrzymać pomoc, klikając „?” na pasku stanu.</translation> <translation id="4065876735068446555">Sieć, której używasz (<ph name="NETWORK_ID" />), może wymagać przejścia na stronę logowania.</translation> <translation id="4068506536726151626">Ta strona zawiera elementy z następujących witryn, które śledzą Twoją lokalizację:</translation> @@ -2390,7 +2389,6 @@ <translation id="4101878899871018532">Menedżer haseł nie będzie proponował zapisywania danych uwierzytelniających używanych do synchronizowania.</translation> <translation id="410351446219883937">Autoodtwarzanie</translation> <translation id="4104163789986725820">E&ksportuj</translation> -<translation id="4105523032910086267">Ustawia animację i widoczność pełnych danych zabezpieczeń Material Design.</translation> <translation id="4105563239298244027">Uzyskaj 1 TB miejsca na Dysku Google za darmo</translation> <translation id="4109135793348361820">Przesuń okno do: <ph name="USER_NAME" /> (<ph name="USER_EMAIL" />)</translation> <translation id="4110342520124362335">Pliki cookie z witryny <ph name="DOMAIN" /> zostały zablokowane.</translation> @@ -2441,6 +2439,7 @@ <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="4188447344915957833">Włącza menedżera miejsca w ustawieniach Material Design.</translation> <translation id="4189406272289638749">Kontrolę nad tym ustawieniem ma rozszerzenie <b><ph name="EXTENSION_NAME" /></b>.</translation> <translation id="4193154014135846272">Dokument Google</translation> <translation id="4193182321948161343">Włącz menedżera użytkowników Material Design</translation> @@ -2648,6 +2647,7 @@ <translation id="4508765956121923607">Wyświetl ź&ródło</translation> <translation id="4509017836361568632">Odrzuć zdjęcie</translation> <translation id="4509345063551561634">Lokalizacja:</translation> +<translation id="4513946894732546136">Twoja opinia</translation> <translation id="4514542542275172126">Skonfiguruj nowego nadzorowanego użytkownika</translation> <translation id="4514914692061505365">Wymuś używanie szybkiego translatora PNaCl Subzero dla wszystkich plików pexe.</translation> <translation id="451515744433878153">Usuń</translation> @@ -2746,6 +2746,7 @@ <translation id="4656293982926141856">Ten komputer</translation> <translation id="4656631038341342120">Włącz środowisko rzeczywistości wirtualnej, jeśli jest dostępne dla urządzenia.</translation> <translation id="4657031070957997341">Zawsze zezwalaj na wtyczki na <ph name="HOST" /></translation> +<translation id="466008749075469935">Umożliwia ograniczenie użycia procesora przez liczniki czasu w tle do 1%.</translation> <translation id="4663254525753315077">Jeśli to możliwe, umieszcza przewijaną zawartość niemieszczącego się elementu na skomponowanej warstwie, by pozwolić na szybsze przewijanie.</translation> <translation id="4664482161435122549">Błąd eksportowania PKCS #12</translation> <translation id="4665014895760275686">Producent</translation> @@ -2811,6 +2812,7 @@ <translation id="4749157430980974800">Klawiatura gruzińska</translation> <translation id="4750394297954878236">Sugestie</translation> <translation id="475088594373173692">Pierwszy użytkownik</translation> +<translation id="4750892496809949692">Wybieraj treści HTML, ukrywając Flasha na liście wtyczek.</translation> <translation id="4750917950439032686">Informacje, które wysyłasz tej witrynie (na przykład hasła lub numery kart kredytowych), pozostają prywatne.</translation> <translation id="4753602155423695878">Animacja paska postępu ładowania strony telefonu w Androidzie</translation> <translation id="4755240240651974342">Klawiatura fińska</translation> @@ -3085,6 +3087,7 @@ <translation id="5119450342834678097">Dostępna w menu ustawień opcja żądania strony w wersji przeznaczonej na tablety</translation> <translation id="5120068803556741301">Metoda wprowadzania innej firmy</translation> <translation id="5120421890733714118">Ufaj temu certyfikatowi przy identyfikowaniu witryn.</translation> +<translation id="5120516977819314347">Nieprawidłowy kod PIN lub hasło.</translation> <translation id="5121130586824819730">Dysk twardy jest pełny. Zapisz w innej lokalizacji lub zwolnij miejsce na dysku.</translation> <translation id="5125751979347152379">Nieprawidłowy adres URL.</translation> <translation id="5127881134400491887">Zarządzać połączeniami sieciowymi</translation> @@ -3092,6 +3095,7 @@ <translation id="512903556749061217">podłączone</translation> <translation id="5129301143853688736">Połączenie ze stroną nie jest prywatne. Osoby dokonujące ataków mogą próbować wykraść Twoje informacje z <ph name="DOMAIN" /> (np. zdjęcia, hasła, wiadomości lub dane kart kredytowych).</translation> <translation id="5129662217315786329">polski</translation> +<translation id="5131347545782851480">Dokumenty PDF</translation> <translation id="5134856901811723984">Material Design w interfejsie użytkownika systemu Chrome OS</translation> <translation id="5135533361271311778">Nie można utworzyć zakładki.</translation> <translation id="5136529877787728692">F7</translation> @@ -3261,6 +3265,7 @@ <translation id="5328031682234198929">8</translation> <translation id="5329858601952122676">&Usuń</translation> <translation id="5330145655348521461">Te pliki zostały otwarte na innym pulpicie. Przejdź do <ph name="USER_NAME" /> (<ph name="MAIL_ADDRESS" />), aby je zobaczyć.</translation> +<translation id="5330512191124428349">Więcej informacji</translation> <translation id="5332624210073556029">Strefa czasowa</translation> <translation id="5333807720589685258">Jeśli nie wpiszesz prawidłowego klucza odblokowującego kod PIN, karta SIM zostanie trwale wyłączona.</translation> @@ -3693,7 +3698,6 @@ <translation id="5892507820957994680">Zastępuje wbudowaną listę renderowania programowego i włącza przyspieszanie za pomocą procesora GPU w przypadku nieobsługiwanej konfiguracji systemu.</translation> <translation id="5895138241574237353">Uruchom ponownie</translation> <translation id="5895187275912066135">Wystawiony dnia</translation> -<translation id="5898154795085152510">Serwer zwrócił nieprawidłowy certyfikat klienta. Błąd <ph name="ERROR_NUMBER" /> (<ph name="ERROR_NAME" />).</translation> <translation id="5900302528761731119">Zdjęcie z profilu Google</translation> <translation id="590253956165195626">Proponuj tłumaczenie stron w obcych językach.</translation> <translation id="5904093760909470684">Konfiguracja serwera proxy</translation> @@ -3748,6 +3752,8 @@ <translation id="5984222099446776634">Ostatnio odwiedzone</translation> <translation id="5984814259619230127">Wykrywanie urządzeń przez Smart Lock przy użyciu funkcji Bluetooth Low Energy</translation> <translation id="5986245990306121338">Jeśli opcja jest włączona, przełącznik kart będzie widoczny nawet po włączeniu w ustawieniach opcji „połącz karty i aplikacje”.</translation> +<translation id="5989712527536636369"><ph name="BEGIN_PARAGRAPH1" />Są to ogólne informacje o urządzeniu i sposobie jego używania. Obejmują poziom naładowania baterii, częstotliwość korzystania z aplikacji, jakość i czas trwania połączeń sieciowych (jak Wi-Fi i Bluetooth) oraz raporty o awariach sporządzane, gdy coś nie działa tak jak powinno. Będą one używane do ulepszania produktów i usług Google dostępnych dla wszystkich. Niektóre zebrane informacje pomogą partnerom – na przykład deweloperom aplikacji na Androida – w ulepszaniu ich produktów.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Tę opcję możesz włączyć lub wyłączyć w dowolnym momencie w ustawieniach aplikacji na Androida. Nie ma ona wpływu na możliwość wysyłania z urządzenia informacji potrzebnych do uzyskiwania podstawowych usług, jak aktualizacje i zabezpieczenia systemu.<ph name="END_PARAGRAPH2" /></translation> <translation id="5990198433782424697">Rozszerzenia w URL-ach chrome://</translation> <translation id="5990814808592353318">Ręczne generowanie haseł.</translation> <translation id="5991049340509704927">Powiększ</translation> @@ -3761,6 +3767,7 @@ <translation id="6005695835120147974">Router multimediów</translation> <translation id="6007237601604674381">Przenoszenie nie powiodło się. <ph name="ERROR_MESSAGE" /></translation> <translation id="6008241731410823808">Wysyła pakiety kontrolujące hiperlinki.</translation> +<translation id="6011449291337289699">Wyczyść dane witryny</translation> <translation id="6015796118275082299">Rok</translation> <translation id="6016551720757758985">Potwierdzanie wykonania funkcji Powerwash z przywróceniem poprzedniej wersji</translation> <translation id="6016809788585079594">Powiedz „OK, Google” ostatni raz</translation> @@ -3950,7 +3957,6 @@ <translation id="6276301056778294989">Upewnij się, że na urządzeniu pokazuje się ten sam kod.</translation> <translation id="6277105963844135994">Przekroczono czas oczekiwania na sieć</translation> <translation id="6277518330158259200">Wykon&aj zrzut ekranu</translation> -<translation id="6278428485366576908">Motyw</translation> <translation id="6279183038361895380">Naciśnij |<ph name="ACCELERATOR" />|, by wyświetlić kursor</translation> <translation id="6280215091796946657">Zaloguj się na inne konto</translation> <translation id="6280912520669706465">ARC</translation> @@ -4202,6 +4208,7 @@ <translation id="6607272825297743757">Informacje o pliku</translation> <translation id="6607831829715835317">Więcej narzę&dzi</translation> <translation id="6608140561353073361">Wszystkie pliki cookie i dane witryn...</translation> +<translation id="6610183966322615106">Błąd podczas dodawania drukarki</translation> <translation id="6610610633807698299">Wpisz URL...</translation> <translation id="6612358246767739896">Treść chroniona</translation> <translation id="6615455863669487791">Pokaż mi</translation> @@ -4265,7 +4272,6 @@ <translation id="6708242697268981054">Pochodzenie:</translation> <translation id="6709357832553498500">Połącz za pomocą rozszerzenia <ph name="EXTENSIONNAME" /></translation> <translation id="6710213216561001401">Wstecz</translation> -<translation id="6712158998835983046">Pokaż wszystkie animowane</translation> <translation id="6718273304615422081">Pakuję...</translation> <translation id="671928215901716392">Zablokuj ekran</translation> <translation id="6721972322305477112">&Plik</translation> @@ -4536,7 +4542,6 @@ <translation id="7088434364990739311">Nie udało się uruchomić sprawdzania aktualizacji (kod błędu <ph name="ERROR" />).</translation> <translation id="708856090370082727">Włącza sygnalizowanie końca przewijania dla klawiatury ekranowej. Jeśli ten znacznik jest włączony, klawiatura spowoduje tylko zmianę rozmiaru widocznego obszaru.</translation> <translation id="7088674813905715446">Administrator ustawił to urządzenie jako nieobsługiwane. Aby umożliwić jego rejestrację, poproś administratora, by ustawił je jako oczekujące.</translation> -<translation id="7089609847854449639">Menedżer miejsca</translation> <translation id="708969677220991657">Zezwala na wysyłanie do lokalnego hosta żądań przez HTTPS nawet w przypadku przedstawienia nieważnego certyfikatu.</translation> <translation id="7092106376816104">Wyjątki dla wyskakujących okienek</translation> <translation id="7093866338626856921">Wymiana danych z urządzeniami o nazwach: <ph name="HOSTNAMES" /></translation> @@ -4576,7 +4581,7 @@ <translation id="715118844758971915">Drukarki tradycyjne</translation> <translation id="7154130902455071009">Zmień stronę startową na: <ph name="START_PAGE" /></translation> <translation id="7155171745945906037">Istniejące zdjęcie z kamery lub pliku</translation> -<translation id="715568033737470079">Wybierz wtyczki PPAPI, które będą uruchamiane w ramach zasady piaskownicy blokady Win32k (tylko Windows 10 lub nowszy).</translation> +<translation id="7155226869555939647">Zawsze otwieraj linki do <ph name="APPLICATION" /></translation> <translation id="7156235233373189579">Ten plik został opracowany z myślą o komputerach z Windows. Jest on niezgodny z Twoim urządzeniem z Chrome OS. Spróbuj znaleźć aplikację zastępczą w <ph name="BEGIN_LINK" />Chrome Web Store<ph name="END_LINK" />. <ph name="BEGIN_LINK_HELP" />Więcej informacji<ph name="END_LINK_HELP" /></translation> <translation id="7157063064925785854">Klikając Dalej, akceptujesz <ph name="LEGAL_DOC_LINK_TEXT_1" />, <ph name="LEGAL_DOC_LINK_TEXT_2" />, <ph name="LEGAL_DOC_LINK_TEXT_3" /> i <ph name="LEGAL_DOC_LINK_TEXT_4" />.</translation> <translation id="7158238151765743968">Połączenie z urządzeniem <ph name="DEVICE_NAME" /> jest nadal w toku.</translation> @@ -4591,6 +4596,7 @@ <translation id="7175353351958621980">Załadowane z:</translation> <translation id="7180611975245234373">Odśwież</translation> <translation id="7180865173735832675">Dostosuj</translation> +<translation id="7181387261278441780">Wyczyść i zresetuj dane witryny</translation> <translation id="7185078796915954712">TLS 1.3</translation> <translation id="7185690883425432021">Ukrywa przyciski zamykania nieaktywnych kart, gdy pasek kart jest w trybie stosu.</translation> <translation id="7186088072322679094">Zachowaj na pasku narzędzi</translation> @@ -4623,7 +4629,6 @@ <translation id="7223775956298141902">Ech... nie masz żadnych rozszerzeń :-(</translation> <translation id="7224023051066864079">Maska podsieci:</translation> <translation id="7225179976675429563">Brak typu sieci</translation> -<translation id="7230191962699768124">Pokaż wszystkie nieanimowane</translation> <translation id="7230787553283372882">Dostosuj rozmiar tekstu</translation> <translation id="7231224339346098802">Wprowadź wartość numeryczną, aby określić liczbę kopii do wydrukowania (1 lub więcej).</translation> <translation id="7238585580608191973">Odcisk cyfrowy SHA-256</translation> @@ -4707,7 +4712,7 @@ <translation id="7360183604634508679">Menu Zakładki</translation> <translation id="7361039089383199231">$1 bajty(ów)</translation> <translation id="736108944194701898">Szybkość myszy:</translation> -<translation id="7361297102842600584">Kliknij prawym przyciskiem myszki, by uruchomić wtyczkę <ph name="PLUGIN_NAME" /></translation> +<translation id="7361297102842600584">Kliknij prawym przyciskiem myszy, by uruchomić wtyczkę <ph name="PLUGIN_NAME" /></translation> <translation id="7361824946268431273">Szybszy, łatwiejszy w użyciu i bezpieczniejszy komputer</translation> <translation id="7364745943115323529">Przesyłaj...</translation> <translation id="7364796246159120393">Wybierz plik</translation> @@ -4748,7 +4753,6 @@ <translation id="7409233648990234464">Uruchom ponownie i włącz Powerwash</translation> <translation id="7409836189476010449">uruchomić Flasha</translation> <translation id="7410344089573941623">Pytaj, gdy witryna <ph name="HOST" /> chce mieć dostęp do kamery i mikrofonu</translation> -<translation id="7411343637221933631">{NUM_COOKIES,plural, =1{1 z tej strony}few{# z tej strony}many{# z tej strony}other{# z tej strony}}</translation> <translation id="7412226954991670867">Pamięć GPU</translation> <translation id="7416362041876611053">Nieznany błąd sieci</translation> <translation id="7417453074306512035">Klawiatura etiopska</translation> @@ -4870,6 +4874,7 @@ <translation id="756445078718366910">Otwórz okno przeglądarki</translation> <translation id="7564847347806291057">Zakończ proces</translation> <translation id="7566723889363720618">F12</translation> +<translation id="7567314848159753396">Plik cookie: <ph name="NAME" /></translation> <translation id="756809126120519699">Wyczyszczono dane Chrome</translation> <translation id="7568790562536448087">Aktualizowanie</translation> <translation id="7573172247376861652">Poziom naładowania akumulatora</translation> @@ -4910,6 +4915,7 @@ <translation id="7626009897377900107">Generowanie haseł</translation> <translation id="7627262197844840899">Witryna nie akceptuje kart MasterCard.</translation> <translation id="7627790789328695202">Ups, plik <ph name="FILE_NAME" /> już istnieje. Zmień jego nazwę i spróbuj ponownie.</translation> +<translation id="7628127343934101653">Otwieraj pliki PDF w domyślnej przeglądarce dokumentów PDF.</translation> <translation id="762917759028004464">Aktualnie domyślną przeglądarką jest <ph name="BROWSER_NAME" />.</translation> <translation id="7629536005696009600">Zezwala na wykorzystanie danych logowania z aplikacji na Androida na powiązanych stronach.</translation> <translation id="7629827748548208700">Karta: <ph name="TAB_NAME" /></translation> @@ -5138,6 +5144,7 @@ <translation id="7957513156576779045">Włącz Bluetooth, by umożliwić parowanie</translation> <translation id="7957615753207896812">Otwórz ustawienia klawiatury</translation> <translation id="7959074893852789871">Plik zawierał wiele certyfikatów, z których niektóre nie zostały zaimportowane:</translation> +<translation id="7959700692661109221"><ph name="BEGIN_PARAGRAPH" />Usługi lokalizacyjne Google używają takich źródeł jak sieci Wi‑Fi, by szybciej i dokładniej określać lokalizację Twojego urządzenia. Gdy je włączysz, urządzenie wejdzie w tryb, w którym używa sieci Wi‑Fi do podawania informacji o lokalizacji. Tę funkcję możesz wyłączyć w dowolnym momencie w ustawieniach lokalizacji.<ph name="END_PARAGRAPH" /></translation> <translation id="7961015016161918242">Nigdy</translation> <translation id="7964089325405904043">Importowanie i eksportowanie haseł</translation> <translation id="7965010376480416255">Pamięć współużytkowana</translation> @@ -5288,6 +5295,7 @@ <translation id="8146793085009540321">Nie udało się zalogować. Skontaktuj się z administratorem lub spróbuj ponownie.</translation> <translation id="8148264977957212129">pinyin</translation> <translation id="8148913456785123871">Pokaż karty Google Now w programie uruchamiającym</translation> +<translation id="8150391391298684512">Wyłącz interfejs Windows Runtime MIDI API</translation> <translation id="8151185429379586178">Narzędzia dla programistów</translation> <translation id="8151638057146502721">Konfiguruj</translation> <translation id="8151639108075998630">Zezwalaj na logowanie jako gość</translation> @@ -5568,6 +5576,7 @@ <translation id="8532294913309524834">Ustaw preferowaną kolejność języków.</translation> <translation id="8535005006684281994">Adres URL odnowienia certyfikatu firmy Netscape</translation> <translation id="8539727552378197395">Nie (HttpOnly)</translation> +<translation id="8541084862688000575">Automatycznie ładuj aplikacje na Androida</translation> <translation id="8543181531796978784">Możesz <ph name="BEGIN_ERROR_LINK" />zgłosić problem z wykrywaniem<ph name="END_ERROR_LINK" /> lub – jeśli rozumiesz zagrożenie – <ph name="BEGIN_LINK" />wejść na tę niebezpieczną stronę<ph name="END_LINK" />.</translation> <translation id="8545107379349809705">Ukryj informacje...</translation> <translation id="8545211332741562162">Włącz eksperymentalne funkcje języka JavaScript na stronach internetowych.</translation> @@ -5595,7 +5604,6 @@ <translation id="8569764466147087991">Wybierz plik do otwarcia</translation> <translation id="8571032220281885258">Gdy powiesz „OK, Google”, Chrome wyszuka to, co powiesz w następnej kolejności.</translation> <translation id="8571108619753148184">Serwer 4</translation> -<translation id="8572832761467613633">Tylko Flash</translation> <translation id="8572981282494768930">Nie zezwalaj stronom na dostęp do kamery i mikrofonu</translation> <translation id="8574234089711453001">Zezwól na przycisk pobierania przy otwieraniu strony z adresem URL multimediów.</translation> <translation id="857779305329188634">Włącz obsługę eksperymentalnego protokołu QUIC.</translation> @@ -5617,6 +5625,7 @@ <translation id="8600929685092827187">Wybudzanie pakietami</translation> <translation id="8601206103050338563">Uwierzytelnianie klienta WWW TLS</translation> <translation id="8602851771975208551">Inny program na Twoim komputerze dodał aplikację, która może zmienić działanie Chrome.</translation> +<translation id="8603912787021349466">Zezwól na automatyczne uruchamianie aplikacji na Androida po zalogowaniu.</translation> <translation id="8605428685123651449">Pamięć SQLite</translation> <translation id="8605503133013456784">Nie można odłączyć od urządzenia „<ph name="DEVICE_NAME" />” i anulować sparowania.</translation> <translation id="8606726445206553943">Korzystać z urządzeń MIDI</translation> @@ -5724,7 +5733,7 @@ <translation id="8732030010853991079">Aby użyć tego rozszerzenia, kliknij jego ikonę.</translation> <translation id="8732212173949624846">Odczyt i zmiana historii przeglądania na wszystkich zalogowanych urządzeniach</translation> <translation id="8734073480934656039">Jeśli włączysz to ustawienie, możliwe będzie automatyczne uruchamianie aplikacji kiosku po włączeniu komputera.</translation> -<translation id="873545264931343897">Aby aktywować wtyczkę <ph name="PLUGIN_NAME" /> po jej zaktualizowaniu, załaduj stronę ponownie</translation> +<translation id="873545264931343897">Aby aktywować wtyczkę <ph name="PLUGIN_NAME" /> po jej zaktualizowaniu, ponownie załaduj stronę</translation> <translation id="8736288397686080465">Ta witryna została zaktualizowana w tle.</translation> <translation id="8737260648576902897">Zainstaluj Adobe Reader</translation> <translation id="8737354914281742249">Moduł obsługi powłoki</translation> @@ -5745,7 +5754,7 @@ <translation id="8758895886513993540">Ta flaga określa, czy użytkownicy mogą wybrać kartę przy udostępnianiu pulpitu.</translation> <translation id="8759408218731716181">Nie można skonfigurować wielokrotnego logowania</translation> <translation id="8759753423332885148">Więcej informacji.</translation> -<translation id="8763204422633679667">Aby aktywować wtyczkę <ph name="PLUGIN_NAME" /> po jej zainstalowaniu, załaduj stronę ponownie</translation> +<translation id="8763204422633679667">Aby aktywować wtyczkę <ph name="PLUGIN_NAME" /> po jej zainstalowaniu, ponownie załaduj stronę</translation> <translation id="8765985713192161328">Zarządzaj modułami obsługi</translation> <translation id="8767072502252310690">Użytkownicy</translation> <translation id="8768367823103160496">Blokada kursora myszy</translation> @@ -5969,6 +5978,7 @@ <translation id="9053965862400494292">Wystąpił błąd podczas próby skonfigurowania synchronizacji.</translation> <translation id="9056034633062863292">Aktualizuję Chromeboksa</translation> <translation id="9056810968620647706">Nie znaleziono żadnych dopasowań.</translation> +<translation id="9057119625587205566">Brak drukarek w pobliżu</translation> <translation id="9059868303873565140">Menu stanu</translation> <translation id="9064142312330104323">Zdjęcie z profilu Google (ładowanie)</translation> <translation id="9064275926664971810">Włącz autouzupełnianie, by jednym kliknięciem wypełniać formularze</translation> @@ -5979,6 +5989,7 @@ <translation id="9067401056540256169">Ta opcja zmniejsza bezpieczeństwo Chrome. Używaj jej tylko wtedy, gdy znasz zasady jej działania. Pamiętaj, że możemy ją usunąć bez żadnego powiadomienia. Po jej włączeniu ramki z adresu źródłowego https mogą korzystać z protokołu WebSockets przy niezabezpieczonym adresie URL (ws://).</translation> <translation id="9068931793451030927">Ścieżka:</translation> <translation id="9070219033670098627">Przełącz osobę</translation> +<translation id="9070940116164932228">Ogranicz drogie liczniki czasu w tle</translation> <translation id="907148966137935206">Nie zezwalaj na wyskakujące okienka w żadnej witrynie (zalecane)</translation> <translation id="9072550133391925347"><ph name="PASSWORD_MANAGER_BRAND" /> automatycznie loguje Cię w odpowiednich witrynach i aplikacjach przy użyciu zapisanych wcześniej haseł.</translation> <translation id="9073281213608662541">PAP</translation> @@ -5990,7 +6001,7 @@ <translation id="9084064520949870008">Otwórz jako okno</translation> <translation id="9086302186042011942">Synchronizuję</translation> <translation id="9087353528325876418">URL autowykrywania internetowego serwera proxy</translation> -<translation id="9088234649737575428">Wtyczka <ph name="PLUGIN_NAME" /> jest zablokowana przez zasady obowiązujące w firmie</translation> +<translation id="9088234649737575428">Wtyczka <ph name="PLUGIN_NAME" /> została zablokowana przez zasady przedsiębiorstwa</translation> <translation id="9088917181875854783">Potwierdź klucz widoczny na urządzeniu „<ph name="DEVICE_NAME" />”:</translation> <translation id="9090669887503413452">Wyślij informacje o systemie</translation> <translation id="9092426026094675787">Oznaczaj niezabezpieczone źródła jako niezabezpieczone</translation> @@ -6012,6 +6023,7 @@ <translation id="9112614144067920641">Wybierz nowy kod PIN.</translation> <translation id="9112748030372401671">Zmień tapetę</translation> <translation id="9112987648460918699">Znajdź...</translation> +<translation id="9114663181201435112">Łatwe logowanie</translation> <translation id="9115487443206954631">Zarządzaj urządzeniami przesyłającymi</translation> <translation id="9115675100829699941">&Zakładki</translation> <translation id="9121814364785106365">Otwórz jako przypiętą kartę</translation> @@ -6106,7 +6118,6 @@ <translation id="952992212772159698">Nie aktywowano</translation> <translation id="960719561871045870">Kod operatora</translation> <translation id="960987915827980018">Zostało około 1 godziny</translation> -<translation id="962778376131245616">Pokaż tylko niezabezpieczone, animowane</translation> <translation id="96421021576709873">Sieć Wi-Fi</translation> <translation id="965490406356730238">Włącz wspomagane sprzętowo dekodowanie przechwyconych klatek w formacie MJPEG (gdy to możliwe).</translation> <translation id="968174221497644223">Pamięć podręczna aplikacji</translation>
diff --git a/chrome/app/resources/generated_resources_pt-BR.xtb b/chrome/app/resources/generated_resources_pt-BR.xtb index 2279191..2eef9c1 100644 --- a/chrome/app/resources/generated_resources_pt-BR.xtb +++ b/chrome/app/resources/generated_resources_pt-BR.xtb
@@ -18,7 +18,6 @@ <translation id="1029317248976101138">Zoom</translation> <translation id="1029595648591494741">Testar "<ph name="EXTENSION_NAME" />"?</translation> <translation id="1031362278801463162">Carregando visualização</translation> -<translation id="1031460590482534116">Ocorreu um erro ao tentar armazenar o certificado do cliente. Erro <ph name="ERROR_NUMBER" /> (<ph name="ERROR_NAME" />).</translation> <translation id="1031573127485938293">Perguntar (por política)</translation> <translation id="103279545524624934">Libere espaço em disco para iniciar apps Android.</translation> <translation id="1033780634303702874">Acessar seus dispositivos de série</translation> @@ -101,6 +100,7 @@ <translation id="1128591060186966949">Editar mecanismo de pesquisa</translation> <translation id="1128987120443782698">O dispositivo de armazenamento tem capacidade de <ph name="DEVICE_CAPACITY" />. Insira um cartão SD ou um cartão de memória USB com pelo menos 4 GB de capacidade.</translation> <translation id="1137135726305341424">domContentLoaded e todos os carregamentos de recursos iniciados antes de domContentLoaded (frame principal e iframes da mesma origem).</translation> +<translation id="1138663153846032155">Preferir HTML a Flash</translation> <translation id="1140351953533677694">Acessar seus dispositivos de série e Bluetooth</translation> <translation id="114140604515785785">Diretório raiz da extensão:</translation> <translation id="1143142264369994168">Signatário do certificado</translation> @@ -252,6 +252,7 @@ <translation id="1351692861129622852">Importando <ph name="FILE_COUNT" /> arquivos...</translation> <translation id="1352103415082130575">Teclado tailandês (pattachote)</translation> <translation id="1353686479385938207"><ph name="PROVIDER_NAME" />: <ph name="NETWORK_NAME" /></translation> +<translation id="1353946958707294039">Gerenciador de armazenamento do material design</translation> <translation id="1353966721814789986">Páginas de inicialização</translation> <translation id="1354868058853714482">O Adobe Reader está desatualizado e pode oferecer insegurança.</translation> <translation id="1355408554203439639">Rasterizador de software 3D</translation> @@ -423,7 +424,6 @@ <translation id="1533920822694388968">Alinhamento da TV</translation> <translation id="15373452373711364">Cursor grande do mouse</translation> <translation id="1543284117603151572">Importados do Edge</translation> -<translation id="1544350195767834591">{NUM_COOKIES,plural, =1{1 de outros sites}one{# de outros sites}other{# de outros sites}}</translation> <translation id="1545177026077493356">Modo de quiosque automático</translation> <translation id="1545786162090505744">URL com %s no lugar da consulta</translation> <translation id="1546280085599573572">Esta extensão alterou a página que é exibida quando você clica no botão "Página inicial".</translation> @@ -447,7 +447,6 @@ <translation id="1559235587769913376">Entrada de caracteres Unicode</translation> <translation id="1561092721008294962">HarfBuzz para texto de interface de usuário</translation> <translation id="1566049601598938765">Website</translation> -<translation id="1566958206723629112">Flash e PDF</translation> <translation id="1567723158593978621">Quando ativado, o login no navegador usará um novo fluxo de login GAIA separado por senha.</translation> <translation id="1567993339577891801">Console JavaScript</translation> <translation id="1568323446248056064">Abrir configurações de exibição do dispositivo</translation> @@ -576,7 +575,6 @@ <translation id="1723940674997333416">Permitir WebSocket inseguro de origem https</translation> <translation id="1725149567830788547">Mostrar &controles</translation> <translation id="172612876728038702">O TPM está sendo configurado. Esse processo pode demorar alguns minutos.</translation> -<translation id="1727135806684246609">Detalhamento de segurança do material</translation> <translation id="1729533290416704613">Controla também qual página deve ser exibida quando você faz uma pesquisa na Omnibox.</translation> <translation id="1731346223650886555">Ponto-e-vírgula</translation> <translation id="1731589410171062430">Total: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /> (<ph name="NUMBER_OF_PAGES" /> <ph name="PAGE_OR_PAGES_LABEL" />)</translation> @@ -872,6 +870,7 @@ <translation id="218492098606937156">Ativar eventos de toque</translation> <translation id="2187317261103489799">Detectar (padrão)</translation> <translation id="2187895286714876935">Erro de importação do certificado de servidor</translation> +<translation id="2188881192257509750">Abrir <ph name="APPLICATION" /></translation> <translation id="2190069059097339078">Getter de credenciais de Wi-Fi</translation> <translation id="219008588003277019">Módulo do cliente nativo: <ph name="NEXE_NAME" /></translation> <translation id="2190355936436201913">(vazio)</translation> @@ -990,6 +989,7 @@ <translation id="2326606747676847821">Navegar em modo anônimo</translation> <translation id="2326931316514688470">&Recarregar aplicativo</translation> <translation id="2327492829706409234">Ativar aplicativo</translation> +<translation id="2328054044222305089">Essa ação excluirá todos os dados armazenados por <ph name="SITE" /> no seu dispositivo e redefinirá todas as permissões concedidas por você. Deseja continuar?</translation> <translation id="2329597144923131178">Faça login para que favoritos, histórico, senhas e outras configurações fiquem disponíveis em todos os seus dispositivos.</translation> <translation id="2332131598580221120">Ver na loja</translation> <translation id="2332742915001411729">Redefinir para os valores padrão</translation> @@ -1265,7 +1265,6 @@ <translation id="2675358154061544447">Compatibilidade altamente experimental para renderização de iframes entre sites em processos separados. Neste modo, os documentos compartilham um processo do renderizador apenas se eles são do mesmo website.</translation> <translation id="2676946222714718093">Reproduzindo em</translation> <translation id="2678063897982469759">Reativar</translation> -<translation id="2678246812096664977">Todos os plug-ins</translation> <translation id="2679385451463308372">Imprimir usando a caixa de diálogo do sistema...</translation> <translation id="2680208403056680091">Sua conexão com a Internet está sendo controlada</translation> <translation id="268053382412112343">Hi&stórico</translation> @@ -1439,7 +1438,6 @@ <translation id="287286579981869940">Adicionar <ph name="PROVIDER_NAME" />...</translation> <translation id="2872961005593481000">Encerrar</translation> <translation id="2875698561019555027">Páginas de erro do Chrome</translation> -<translation id="2879560882721503072">O certificado de cliente emitido por <ph name="ISSUER" /> foi armazenado.</translation> <translation id="288024221176729610">Tcheco</translation> <translation id="288042212351694283">Acessar seus dispositivos Universal 2nd Factor</translation> <translation id="2881966438216424900">Acessado pela última vez:</translation> @@ -1588,6 +1586,7 @@ <translation id="3057861065630527966">Fazer backup de suas fotos e seus vídeos</translation> <translation id="3058212636943679650">Se alguma vez tiver que restaurar o sistema operacional do seu computador, você precisará de um cartão SD de recuperação ou um cartão de memória USB.</translation> <translation id="305932878998873762">O Cache simples para HTTP é um novo cache. Ele conta com o sistema de arquivos para alocação do espaço em disco.</translation> +<translation id="3060251871394327123">Essa ação excluirá todos os dados armazenados por <ph name="SITE" /> no seu dispositivo. Deseja continuar?</translation> <translation id="3061650404498811439">Ativa o acesso a emoticons, pesquisa escrita e entrada de texto por voz a partir do menu IME de permissão</translation> <translation id="3062606427884046423">Usar notificações MediaStyle do Android para notificações de mídia do Chrome.</translation> <translation id="3063844757726132584">Acesse todos os seus apps nesta útil tela de início. Jogue, bata papo por vídeo, ouça músicas, edite documentos ou faça o download de mais apps.</translation> @@ -1637,6 +1636,7 @@ <translation id="3123569374670379335">(Supervisionado)</translation> <translation id="3124111068741548686">Processamentos do USUÁRIO</translation> <translation id="3126026824346185272">Ctrl</translation> +<translation id="3127156390846601284">Essa ação excluirá todos os dados armazenados no seu dispositivo para todos os sites exibidos. Deseja continuar?</translation> <translation id="312759608736432009">Fabricante do dispositivo:</translation> <translation id="3127919023693423797">Autenticando...</translation> <translation id="3128230619496333808">Aba 6</translation> @@ -1735,7 +1735,6 @@ <translation id="3264544094376351444">Fonte Sans-Serif</translation> <translation id="3264547943200567728">Falha ao configurar a rede do seu Chromebox</translation> <translation id="3265459715026181080">Fechar janela</translation> -<translation id="3267271790328635957">Somente PDF</translation> <translation id="3267726687589094446">Continuar permitindo download automático de vários arquivos</translation> <translation id="3267998849713137817">Horário modificado</translation> <translation id="3268451620468152448">Guias abertas</translation> @@ -1981,6 +1980,7 @@ <translation id="3574210789297084292">fazer login</translation> <translation id="3574305903863751447"><ph name="CITY" />, <ph name="STATE" /> <ph name="COUNTRY" /></translation> <translation id="357479282490346887">Lituano</translation> +<translation id="3575927481544652747">Desativar a Windows Runtime MIDI API para WebMIDI, que fica ativada por padrão no Windows 10 ou versões posteriores.</translation> <translation id="3576324189521867626">Instalação concluída</translation> <translation id="3578331450833904042">Padrão (captar tudo)</translation> <translation id="3578594933904494462">O conteúdo desta guia está sendo compartilhado.</translation> @@ -2034,8 +2034,6 @@ <translation id="3627320433825461852">Menos de 1 minuto restante</translation> <translation id="3627588569887975815">Abrir link em janela &anônima</translation> <translation id="3627671146180677314">Hora de renovação do certificado do Netscape</translation> -<translation id="3629326610814700057">Permite que o gerenciador de armazenamento gerencie o armazenamento local.</translation> -<translation id="3630337581925712713"><ph name="PERMISSION_TYPE_LABEL" />:</translation> <translation id="3631337165634322335">As exceções abaixo se aplicam somente à sessão no modo anônimo atual.</translation> <translation id="3633586230741134985">Configurações do iniciador de aplicativos</translation> <translation id="3633997706330212530">Você pode, opcionalmente, desativar esses serviços.</translation> @@ -2058,7 +2056,8 @@ <translation id="3654045516529121250">Ler suas configurações de acessibilidade</translation> <translation id="3654092442379740616">Erro de sincronização: <ph name="PRODUCT_NAME" /> está desatualizado e precisa ser atualizado.</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{Tem acesso permanente a um arquivo.}one{Tem acesso permanente a # arquivos.}other{Tem acesso permanente a # arquivos.}}</translation> -<translation id="3657468915905674858">Ativar Bloqueio total de PPAPI Win32k.</translation> +<translation id="365793796291733849"><ph name="BEGIN_PARAGRAPH1" />Quando você ativa o backup automático, os dados do dispositivo e dos apps são periodicamente salvos em uma pasta particular do Google Drive. Dados de apps podem ser quaisquer dados que um app tenha salvo (com base nas configurações do desenvolvedor), incluindo dados possivelmente confidenciais, como contatos, mensagens e fotos.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Dados de backup não são contabilizados na sua cota de armazenamento do Drive. Não é feito o backup de arquivos grandes ou de arquivos que os desenvolvedores optaram por excluir do serviço.<ph name="END_PARAGRAPH2" /></translation> <translation id="3660234220361471169">Não confiáveis</translation> <translation id="3665589677786828986">O Google Chrome detectou que algumas das suas configurações foram corrompidas por outro programa e as redefiniu para os padrões originais.</translation> <translation id="3665842570601375360">Segurança:</translation> @@ -2113,6 +2112,7 @@ <translation id="3733127536501031542">Servidor SSL com Step-up</translation> <translation id="3736520371357197498">Se você entende os riscos à sua segurança, pode <ph name="BEGIN_LINK" />acessar este site inseguro<ph name="END_LINK" /> antes de os programas perigosos serem removidos.</translation> <translation id="3738924763801731196"><ph name="OID" />:</translation> +<translation id="3739254215541673094">Abrir <ph name="APPLICATION" />?</translation> <translation id="3739798227959604811">Atraso antes da repetição:</translation> <translation id="3741158646617793859"><ph name="DEVICE_NAME" /> agora é exibido no Admin Console</translation> <translation id="3741243925913727067">Backup de fotos e vídeos do seu dispositivo de mídia para o Google Drive.</translation> @@ -2351,7 +2351,6 @@ <translation id="4058793769387728514">Verificar documento agora</translation> <translation id="4059285154003114015">&Imprimir frame...</translation> <translation id="406070391919917862">Aplicativos de fundo</translation> -<translation id="4061502419206152498">Mostrar somente não seguras, não animadas</translation> <translation id="4062251648694601778">Aproveite seu dispositivo <ph name="SHORT_PRODUCT_NAME" />. Dúvidas? Clique no ícone "?" na bandeja de status para receber ajuda.</translation> <translation id="4065876735068446555">A rede que você está usando (<ph name="NETWORK_ID" />) pode exigir que você visite a página de login.</translation> <translation id="4068506536726151626">Esta página contém elementos dos seguintes sites que estão rastreando o seu local:</translation> @@ -2390,7 +2389,6 @@ <translation id="4101878899871018532">O administrador de senhas não oferece a opção de salvar a credencial usada para sincronização.</translation> <translation id="410351446219883937">Reprodução automática</translation> <translation id="4104163789986725820">E&xportar...</translation> -<translation id="4105523032910086267">Define a animação e a visibilidade do detalhamento de segurança no material design.</translation> <translation id="4105563239298244027">Obtenha 1 TB gratuitos no Google Drive</translation> <translation id="4109135793348361820">Mover janela para <ph name="USER_NAME" /> (<ph name="USER_EMAIL" />)</translation> <translation id="4110342520124362335">Os cookies de <ph name="DOMAIN" /> foram bloqueados.</translation> @@ -2441,6 +2439,7 @@ <translation id="418179967336296930">Teclado fonético russo (YaZHert)</translation> <translation id="4181841719683918333">Idiomas</translation> <translation id="4187248015940562149">Ativa o Web Bluetooth, que permite que os websites se conectem a dispositivos Bluetooth ao seu redor e os controlem.</translation> +<translation id="4188447344915957833">Ativa o gerenciador de armazenamento nas configurações do material design.</translation> <translation id="4189406272289638749">Uma extensão, <b><ph name="EXTENSION_NAME" /></b>, está controlando esta configuração.</translation> <translation id="4193154014135846272">Documento do Google</translation> <translation id="4193182321948161343">Ativar o gerenciador de usuários do material design</translation> @@ -2647,6 +2646,7 @@ <translation id="4508765956121923607">Exibir &código fonte</translation> <translation id="4509017836361568632">Descartar foto</translation> <translation id="4509345063551561634">Local:</translation> +<translation id="4513946894732546136">Comentários</translation> <translation id="4514542542275172126">Configurar um novo usuário supervisionado</translation> <translation id="4514914692061505365">Força o uso de tradutor Subzero rápido do PNaCl para todos os arquivos pexe.</translation> <translation id="451515744433878153">Remover</translation> @@ -2745,6 +2745,7 @@ <translation id="4656293982926141856">Neste computador</translation> <translation id="4656631038341342120">Ativa o shell de RV, se disponível para esse dispositivo.</translation> <translation id="4657031070957997341">Sempre permitir plug-ins em <ph name="HOST" /></translation> +<translation id="466008749075469935">Permite a intervenção para limitar o uso de CPU de timers em segundo plano a 1%.</translation> <translation id="4663254525753315077">Quando possível, coloca os conteúdos de rolagem de um elemento de rolagem flutuante em uma camada composta, para uma rolagem mais rápida.</translation> <translation id="4664482161435122549">Erro de exportação do PKCS #12</translation> <translation id="4665014895760275686">Fabricante</translation> @@ -2813,6 +2814,7 @@ <translation id="4749157430980974800">Teclado georgiano</translation> <translation id="4750394297954878236">Sugestões</translation> <translation id="475088594373173692">Primeiro usuário</translation> +<translation id="4750892496809949692">Dá preferência a conteúdos HTML, ocultando os conteúdos em Flash da lista de plug-ins.</translation> <translation id="4750917950439032686">Suas informações (por exemplo, senhas ou números de cartão de crédito) permanecem particulares quando são enviadas para esse site.</translation> <translation id="4753602155423695878">Animação da barra de progresso do carregamento de página em um smartphone Android</translation> <translation id="4755240240651974342">Teclado finlandês</translation> @@ -3085,6 +3087,7 @@ <translation id="5119450342834678097">Opção de solicitar site para tablet no menu de configurações</translation> <translation id="5120068803556741301">Método de entrada de terceiros</translation> <translation id="5120421890733714118">Confiar neste certificado para a identificação de websites.</translation> +<translation id="5120516977819314347">Senha ou PIN incorreto.</translation> <translation id="5121130586824819730">Seu disco rígido está cheio. Salve em outro local ou libere mais espaço no disco rígido.</translation> <translation id="5125751979347152379">URL inválido.</translation> <translation id="5127881134400491887">Gerenciar conexões de rede</translation> @@ -3092,6 +3095,7 @@ <translation id="512903556749061217">conectado</translation> <translation id="5129301143853688736">Sua conexão com este site não é privada. Invasores podem tentar roubar suas informações, como fotos, senhas, mensagens e cartões de crédito, de <ph name="DOMAIN" />.</translation> <translation id="5129662217315786329">Polonês</translation> +<translation id="5131347545782851480">Documentos em PDF</translation> <translation id="5134856901811723984">Material design na interface do usuário do sistema do Chrome OS</translation> <translation id="5135533361271311778">Não foi possível criar um item de favorito.</translation> <translation id="5136529877787728692">F7</translation> @@ -3260,6 +3264,7 @@ <translation id="5328031682234198929">8</translation> <translation id="5329858601952122676">&Excluir</translation> <translation id="5330145655348521461">Estes arquivos estão abertos em uma área de trabalho diferente. Mude para <ph name="USER_NAME" /> (<ph name="MAIL_ADDRESS" />) para vê-los.</translation> +<translation id="5330512191124428349">Ver informações</translation> <translation id="5332624210073556029">Fuso horário:</translation> <translation id="5333807720589685258">Seu cartão SIM será permanentemente desativado se você não informar a chave correta de desbloqueio de PIN.</translation> @@ -3693,7 +3698,6 @@ <translation id="5892507820957994680">Substitui a lista de renderização do software integrado e permite a aceleração GPU em configurações do sistema não suportadas.</translation> <translation id="5895138241574237353">Reiniciar</translation> <translation id="5895187275912066135">Emitido em</translation> -<translation id="5898154795085152510">O servidor retornou um certificado de cliente inválido. Erro <ph name="ERROR_NUMBER" /> (<ph name="ERROR_NAME" />).</translation> <translation id="5900302528761731119">Foto do perfil do Google</translation> <translation id="590253956165195626">Sugerir a tradução de páginas que não estão em um idioma que você conheça.</translation> <translation id="5904093760909470684">Configuração de proxy</translation> @@ -3748,6 +3752,8 @@ <translation id="5984222099446776634">Visitados recentemente</translation> <translation id="5984814259619230127">Descoberta do Smart Lock no Bluetooth de baixa energia</translation> <translation id="5986245990306121338">Se ativada, um alternador de guias é exibido mesmo quando a opção "Mostrar guias junto com os apps recentes" está ativada nas configurações.</translation> +<translation id="5989712527536636369"><ph name="BEGIN_PARAGRAPH1" />Essas são informações gerais sobre seu dispositivo e sobre a forma como você o usa, como nível de bateria, frequência com que você usa seus apps, qualidade e duração das conexões de rede (como Wi-Fi e Bluetooth), bem como relatórios de erros quando os recursos não funcionam conforme o esperado. Elas são usadas para melhorar produtos e serviços do Google para todos. Algumas informações agregadas ajudam os parceiros, por exemplo desenvolvedores Android, a também melhorar apps e produtos.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />É possível ativar ou desativar esse recurso a qualquer momento nas configurações de apps Android. Isso não afeta a capacidade do seu dispositivo de enviar as informações necessárias para receber serviços essenciais, como atualizações do sistema e de segurança.<ph name="END_PARAGRAPH2" /></translation> <translation id="5990198433782424697">Extensões em URLs chrome://</translation> <translation id="5990814808592353318">Geração manual de senha.</translation> <translation id="5991049340509704927">Ampliar</translation> @@ -3761,6 +3767,7 @@ <translation id="6005695835120147974">Roteador de mídia</translation> <translation id="6007237601604674381">Falha na transferência. <ph name="ERROR_MESSAGE" /></translation> <translation id="6008241731410823808">Envia pings de auditoria de hiperlinks</translation> +<translation id="6011449291337289699">Limpar dados de sites</translation> <translation id="6015796118275082299">Ano</translation> <translation id="6016551720757758985">Confirmar powerwash com retorno à versão anterior</translation> <translation id="6016809788585079594">Diga "Ok Google" uma última vez</translation> @@ -3951,7 +3958,6 @@ <translation id="6276301056778294989">Certifique-se de que o dispositivo esteja mostrando o mesmo código.</translation> <translation id="6277105963844135994">Tempo limite de rede</translation> <translation id="6277518330158259200">T&irar captura de tela</translation> -<translation id="6278428485366576908">Tema</translation> <translation id="6279183038361895380">Pressione |<ph name="ACCELERATOR" />| para exibir seu cursor</translation> <translation id="6280215091796946657">Fazer login com outra conta</translation> <translation id="6280912520669706465">ARC</translation> @@ -4203,6 +4209,7 @@ <translation id="6607272825297743757">Informações do arquivo</translation> <translation id="6607831829715835317">Mais ferramen&tas</translation> <translation id="6608140561353073361">Todos os cookies e dados de sites...</translation> +<translation id="6610183966322615106">Erro ao adicionar impressora</translation> <translation id="6610610633807698299">Inserir URL...</translation> <translation id="6612358246767739896">Conteúdo protegido</translation> <translation id="6615455863669487791">Exibir</translation> @@ -4266,7 +4273,6 @@ <translation id="6708242697268981054">Origem:</translation> <translation id="6709357832553498500">Conectar usando <ph name="EXTENSIONNAME" /></translation> <translation id="6710213216561001401">Anterior</translation> -<translation id="6712158998835983046">Mostrar todas, animadas</translation> <translation id="6718273304615422081">Compactando...</translation> <translation id="671928215901716392">Bloquear tela</translation> <translation id="6721972322305477112">&Arquivo</translation> @@ -4539,7 +4545,6 @@ <translation id="7088434364990739311">A atualização da verificação falhou ao iniciar (código do erro <ph name="ERROR" />).</translation> <translation id="708856090370082727">Ativa a compatibilidade com a rolagem do teclado virtual. Quando essa sinalização está ativada, o teclado virtual só redimensiona a janela de visualização.</translation> <translation id="7088674813905715446">O administrador pôs este dispositivo no estado de aprovisionamento cancelado. Para ativar a inscrição do dispositivo, solicite que o administrador o coloque no estado "Pendente".</translation> -<translation id="7089609847854449639">Gerenciador de armazenamento</translation> <translation id="708969677220991657">Permite solicitações ao host local para HTTPS mesmo quando um certificado inválido é apresentado.</translation> <translation id="7092106376816104">Exceções de pop-ups</translation> <translation id="7093866338626856921">Trocar dados com os dispositivos chamados: <ph name="HOSTNAMES" /></translation> @@ -4579,7 +4584,7 @@ <translation id="715118844758971915">Impressoras tradicionais</translation> <translation id="7154130902455071009">Alterar sua página inicial para: <ph name="START_PAGE" /></translation> <translation id="7155171745945906037">Foto existente na câmera ou em arquivo</translation> -<translation id="715568033737470079">Especifique os plug-ins PPAPI que serão executados de acordo com a política de bloqueio total de sandbox Win32k (apenas para Windows 10 e versões superiores).</translation> +<translation id="7155226869555939647">Sempre abrir links de <ph name="APPLICATION" /></translation> <translation id="7156235233373189579">Este arquivo foi projetado para um computador que utiliza o software do Windows. Ele não é compatível com seu dispositivo, que executa o Chrome OS. Procure um app substituto adequado na <ph name="BEGIN_LINK" />Chrome Web Store<ph name="END_LINK" />.<ph name="BEGIN_LINK_HELP" />Saiba mais<ph name="END_LINK_HELP" /></translation> <translation id="7157063064925785854">Ao clicar em "Continuar", você aceita os seguintes documentos legais: <ph name="LEGAL_DOC_LINK_TEXT_1" />, <ph name="LEGAL_DOC_LINK_TEXT_2" />, <ph name="LEGAL_DOC_LINK_TEXT_3" /> e <ph name="LEGAL_DOC_LINK_TEXT_4" />.</translation> <translation id="7158238151765743968">A conexão com "<ph name="DEVICE_NAME" />" ainda está em andamento.</translation> @@ -4594,6 +4599,7 @@ <translation id="7175353351958621980">Carregado de:</translation> <translation id="7180611975245234373">Atualizar</translation> <translation id="7180865173735832675">Personalizar</translation> +<translation id="7181387261278441780">Limpar e redefinir sites</translation> <translation id="7185078796915954712">TLS 1.3</translation> <translation id="7185690883425432021">Oculta os botões de fechamento de guias inativas quando a faixa de guias está em modo empilhado.</translation> <translation id="7186088072322679094">Manter na barra de ferramentas</translation> @@ -4626,7 +4632,6 @@ <translation id="7223775956298141902">Puxa... Você não tem extensões :-(</translation> <translation id="7224023051066864079">Máscara de sub-rede:</translation> <translation id="7225179976675429563">Tipo de rede ausente</translation> -<translation id="7230191962699768124">Mostrar todas, não animadas</translation> <translation id="7230787553283372882">Personalizar o tamanho do texto</translation> <translation id="7231224339346098802">Use um número para indicar quantas cópias você quer imprimir (1 ou mais).</translation> <translation id="7238585580608191973">Assinatura digital SHA-256</translation> @@ -4759,7 +4764,6 @@ <translation id="7409233648990234464">Reiniciar e executar Powerwash</translation> <translation id="7409836189476010449">Executar Flash</translation> <translation id="7410344089573941623">Perguntar se <ph name="HOST" /> deseja acessar sua câmera e seu microfone</translation> -<translation id="7411343637221933631">{NUM_COOKIES,plural, =1{1 deste site}one{# deste site}other{# deste site}}</translation> <translation id="7412226954991670867">Memória GPU</translation> <translation id="7416362041876611053">Erro de rede desconhecido.</translation> <translation id="7417453074306512035">Teclado etíope</translation> @@ -4881,6 +4885,7 @@ <translation id="756445078718366910">Abrir janela do navegador</translation> <translation id="7564847347806291057">Encerrar processo</translation> <translation id="7566723889363720618">F12</translation> +<translation id="7567314848159753396">Cookie: <ph name="NAME" /></translation> <translation id="756809126120519699">Dados do Chrome apagados</translation> <translation id="7568790562536448087">Atualização</translation> <translation id="7573172247376861652">Carga da bateria</translation> @@ -4921,6 +4926,7 @@ <translation id="7626009897377900107">Geração de senhas</translation> <translation id="7627262197844840899">Este site não aceita MasterCard.</translation> <translation id="7627790789328695202">O item <ph name="FILE_NAME" /> já existe. Renomeie-o e tente novamente.</translation> +<translation id="7628127343934101653">Abrir arquivos em PDF no aplicativo visualizador de PDF padrão.</translation> <translation id="762917759028004464">Atualmente, o navegador padrão é <ph name="BROWSER_NAME" />.</translation> <translation id="7629536005696009600">Permitir que as credenciais armazenadas para apps Android sejam atendidas nos websites correspondentes.</translation> <translation id="7629827748548208700">Guia: <ph name="TAB_NAME" /></translation> @@ -5149,6 +5155,7 @@ <translation id="7957513156576779045">Ativar o Bluetooth para permitir o pareamento</translation> <translation id="7957615753207896812">Abrir configurações do teclado do dispositivo</translation> <translation id="7959074893852789871">O arquivo continha vários certificados e alguns deles não foram importados:</translation> +<translation id="7959700692661109221"><ph name="BEGIN_PARAGRAPH" />O Serviço de localização do Google usa fontes como o Wi-Fi para ajudar a estimar o local do seu dispositivo de forma mais rápida e precisa. Quando você ativa os serviços de localização do Google, seu dispositivo entra em um modo que usa o Wi-Fi para fornecer informações de local. É possível desativar esse recurso nas configurações de localização a qualquer momento.<ph name="END_PARAGRAPH" /></translation> <translation id="7961015016161918242">Nunca</translation> <translation id="7964089325405904043">Importação e exportação de senhas</translation> <translation id="7965010376480416255">Memória compartilhada</translation> @@ -5299,6 +5306,7 @@ <translation id="8146793085009540321">Falha no login. Entre em contato com o administrador ou tente novamente.</translation> <translation id="8148264977957212129">Método de entrada Pinyin</translation> <translation id="8148913456785123871">Exibir Google Now cards na tela de início</translation> +<translation id="8150391391298684512">Desativar a Windows Runtime MIDI API</translation> <translation id="8151185429379586178">Ferramentas do desenvolvedor</translation> <translation id="8151638057146502721">Configurar</translation> <translation id="8151639108075998630">Ativar a navegação de visitantes</translation> @@ -5579,6 +5587,7 @@ <translation id="8532294913309524834">Ordenar idiomas com base na sua preferência.</translation> <translation id="8535005006684281994">URL da renovação do certificado do Netscape</translation> <translation id="8539727552378197395">Nenhum (HttpOnly)</translation> +<translation id="8541084862688000575">Carregar apps Android automaticamente</translation> <translation id="8543181531796978784">Você pode <ph name="BEGIN_ERROR_LINK" />denunciar um problema de detecção<ph name="END_ERROR_LINK" /> ou, se entende os riscos à sua segurança, <ph name="BEGIN_LINK" />acessar este site não seguro<ph name="END_LINK" />.</translation> <translation id="8545107379349809705">Ocultar informações...</translation> <translation id="8545211332741562162">Permite que as páginas da web usem recursos experimentais do JavaScript.</translation> @@ -5606,7 +5615,6 @@ <translation id="8569764466147087991">Selecionar um arquivo para ser aberto</translation> <translation id="8571032220281885258">Quando você diz "Ok Google", o Chrome pesquisa sobre o que você disser em seguida.</translation> <translation id="8571108619753148184">Servidor 4</translation> -<translation id="8572832761467613633">Somente Flash</translation> <translation id="8572981282494768930">Não permitir que os sites acessem sua câmera e seu microfone</translation> <translation id="8574234089711453001">Permite que um botão de download seja exibido ao abrir uma página com URL de mídia.</translation> <translation id="857779305329188634">Ativar o suporte ao protocolo QUIC experimental.</translation> @@ -5628,6 +5636,7 @@ <translation id="8600929685092827187">Despertar quando receber pacotes</translation> <translation id="8601206103050338563">Autenticação do cliente TLS WWW</translation> <translation id="8602851771975208551">Outro programa em seu computador adicionou um aplicativo que pode mudar a forma como o Google Chrome funciona.</translation> +<translation id="8603912787021349466">Permitir que apps Android sejam iniciados automaticamente após o login.</translation> <translation id="8605428685123651449">Memória SQLite</translation> <translation id="8605503133013456784">Falha ao desconectar e desemparelhar de "<ph name="DEVICE_NAME" />".</translation> <translation id="8606726445206553943">Usar seus dispositivos MIDI</translation> @@ -5980,6 +5989,7 @@ <translation id="9053965862400494292">Ocorreu um erro ao tentar configurar a sincronização.</translation> <translation id="9056034633062863292">Atualizando o Chromebox</translation> <translation id="9056810968620647706">Nenhuma correspondência foi encontrada.</translation> +<translation id="9057119625587205566">Nenhuma impressora nas proximidades</translation> <translation id="9059868303873565140">Menu de status</translation> <translation id="9064142312330104323">Foto do Perfil do Google (carregando)</translation> <translation id="9064275926664971810">Ativar o Preenchimento automático e preencher formulários com um clique</translation> @@ -5990,6 +6000,7 @@ <translation id="9067401056540256169">Esta sinalização torna o Google Chrome inseguro. Use-a apenas se você entender o que ela faz. Essa sinalização pode ser removida sem qualquer aviso prévio. Se ela estiver ativada, quadros com origem https podem usar WebSockets com um URL inseguro (ws://).</translation> <translation id="9068931793451030927">Caminho:</translation> <translation id="9070219033670098627">Alterar pessoa</translation> +<translation id="9070940116164932228">Acelerar timers em segundo plano dispendiosos</translation> <translation id="907148966137935206">Não permitir que nenhum site mostre pop-ups (recomendado)</translation> <translation id="9072550133391925347"><ph name="PASSWORD_MANAGER_BRAND" /> conecta você automaticamente a apps e sites qualificados com senhas que você salvou.</translation> <translation id="9073281213608662541">PAP</translation> @@ -6023,6 +6034,7 @@ <translation id="9112614144067920641">Escolha um novo PIN.</translation> <translation id="9112748030372401671">Altere seu papel de parede</translation> <translation id="9112987648460918699">Buscar...</translation> +<translation id="9114663181201435112">Fazer login de forma fácil</translation> <translation id="9115487443206954631">Gerenciar dispositivos de transmissão</translation> <translation id="9115675100829699941">&Favoritos</translation> <translation id="9121814364785106365">Abrir como guia fixada</translation> @@ -6117,7 +6129,6 @@ <translation id="952992212772159698">Desativado</translation> <translation id="960719561871045870">Código da operadora</translation> <translation id="960987915827980018">Cerca de 1 hora restante</translation> -<translation id="962778376131245616">Mostrar apenas não seguras, animadas</translation> <translation id="96421021576709873">Rede Wi-Fi</translation> <translation id="965490406356730238">Quando disponível, permitir decodificação de mjpeg acelerada por hardware para o frame capturado.</translation> <translation id="968174221497644223">Cache de aplicativo</translation>
diff --git a/chrome/app/resources/generated_resources_pt-PT.xtb b/chrome/app/resources/generated_resources_pt-PT.xtb index 3a7a5f9..274834c 100644 --- a/chrome/app/resources/generated_resources_pt-PT.xtb +++ b/chrome/app/resources/generated_resources_pt-PT.xtb
@@ -18,7 +18,6 @@ <translation id="1029317248976101138">Zoom</translation> <translation id="1029595648591494741">Pretende experimentar a aplicação "<ph name="EXTENSION_NAME" />"?</translation> <translation id="1031362278801463162">A carregar a pré-visualização</translation> -<translation id="1031460590482534116">Ocorreu um erro enquanto tentava armazenar o certificado de cliente. Erro <ph name="ERROR_NUMBER" /> (<ph name="ERROR_NAME" />).</translation> <translation id="1031573127485938293">Pedir (pela política)</translation> <translation id="103279545524624934">Liberte espaço em disco para iniciar as aplicações Android.</translation> <translation id="1033780634303702874">Aceder aos dispositivos de série</translation> @@ -101,6 +100,7 @@ <translation id="1128591060186966949">Editar motor de pesquisa</translation> <translation id="1128987120443782698">O dispositivo de armazenamento tem uma capacidade de <ph name="DEVICE_CAPACITY" />. Insira um cartão SD ou memory stick USB com uma capacidade mínima de 4 GB.</translation> <translation id="1137135726305341424">domContentLoaded e todos os carregamentos de recursos iniciados antes de domContentLoaded (frame principal e os iframes da mesma origem).</translation> +<translation id="1138663153846032155">Preferir o HTML ao Flash</translation> <translation id="1140351953533677694">Aceder aos dispositivos Bluetooth e de série</translation> <translation id="114140604515785785">Diretório raiz da extensão:</translation> <translation id="1143142264369994168">Signatário do certificado</translation> @@ -252,6 +252,7 @@ <translation id="1351692861129622852">A importar <ph name="FILE_COUNT" /> ficheiros...</translation> <translation id="1352103415082130575">Teclado tailandês (pattachote)</translation> <translation id="1353686479385938207"><ph name="PROVIDER_NAME" />: <ph name="NETWORK_NAME" /></translation> +<translation id="1353946958707294039">Gestor de armazenamento do material design</translation> <translation id="1353966721814789986">Páginas de arranque</translation> <translation id="1354868058853714482">O Adobe Reader está desactualizado e pode não estar seguro.</translation> <translation id="1355408554203439639">Rasterizador de software 3D</translation> @@ -424,7 +425,6 @@ <translation id="1533920822694388968">Alinhamento da televisão</translation> <translation id="15373452373711364">Cursor do rato grande</translation> <translation id="1543284117603151572">Importado do Edge</translation> -<translation id="1544350195767834591">{NUM_COOKIES,plural, =1{1 de outros sites}other{# de outros sites}}</translation> <translation id="1545177026077493356">Modo quiosque automático</translation> <translation id="1545786162090505744">URL com %s em vez da consulta</translation> <translation id="1546280085599573572">Esta extensão alterou a página apresentada quando clica no botão Página inicial.</translation> @@ -448,7 +448,6 @@ <translation id="1559235587769913376">Entrada de caracteres Unicode</translation> <translation id="1561092721008294962">HarfBuzz para o texto da interface de utilizador</translation> <translation id="1566049601598938765">Website</translation> -<translation id="1566958206723629112">Flash e PDF</translation> <translation id="1567723158593978621">Quando ativado, o início de sessão no navegador utiliza um fluxo de início de sessão separado por palavra-passe GAIA.</translation> <translation id="1567993339577891801">Consola de JavaScript</translation> <translation id="1568323446248056064">Abrir definições do dispositivo de visualização</translation> @@ -577,7 +576,6 @@ <translation id="1723940674997333416">Permitir WebSocket não seguro de origem https</translation> <translation id="1725149567830788547">Mostrar &controlos</translation> <translation id="172612876728038702">Aguarde enquanto o TPM está a ser configurado; esta operação poderá demorar alguns minutos.</translation> -<translation id="1727135806684246609">Informações detalhadas de segurança do Material Design</translation> <translation id="1729533290416704613">Também controla a página apresentada quando pesquisa a partir da Caixa geral.</translation> <translation id="1731346223650886555">Ponto e vírgula</translation> <translation id="1731589410171062430">Total: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /> ( <ph name="NUMBER_OF_PAGES" /> <ph name="PAGE_OR_PAGES_LABEL" /> )</translation> @@ -873,6 +871,7 @@ <translation id="218492098606937156">Ativar eventos de toque</translation> <translation id="2187317261103489799">Detetar (predefinição)</translation> <translation id="2187895286714876935">Erro na importação do certificado do servidor</translation> +<translation id="2188881192257509750">Abrir <ph name="APPLICATION" /></translation> <translation id="2190069059097339078">Obtenção de credenciais de Wi-Fi</translation> <translation id="219008588003277019">Módulo Native Client: <ph name="NEXE_NAME" /></translation> <translation id="2190355936436201913">(vazio)</translation> @@ -991,6 +990,7 @@ <translation id="2326606747676847821">Entrar no modo de navegação anónima</translation> <translation id="2326931316514688470">&Recarregar aplicação</translation> <translation id="2327492829706409234">Ativar aplicação</translation> +<translation id="2328054044222305089">Esta ação irá eliminar todos os dados que o site <ph name="SITE" /> armazenou no seu dispositivo e repor todas as autorizações que tenha permitido executar. Pretende continuar?</translation> <translation id="2329597144923131178">Inicie sessão para aceder aos marcadores, ao histórico, às palavras-passe e a outras definições em todos os dispositivos.</translation> <translation id="2332131598580221120">Ver na loja</translation> <translation id="2332742915001411729">Repor predefinição</translation> @@ -1266,7 +1266,6 @@ <translation id="2675358154061544447">Suporte altamente experimental para processar iframes entre sites em processos separados. Neste modo, os documentos partilham um processo de renderização apenas se forem provenientes do mesmo Website.</translation> <translation id="2676946222714718093">A reproduzir em</translation> <translation id="2678063897982469759">Reactivar</translation> -<translation id="2678246812096664977">Todos os plug-ins</translation> <translation id="2679385451463308372">Imprimir utilizando o menu de diálogo do sistema...</translation> <translation id="2680208403056680091">A sua ligação à Internet está a ser controlada</translation> <translation id="268053382412112343">&Histórico</translation> @@ -1440,7 +1439,6 @@ <translation id="287286579981869940">Adicionar <ph name="PROVIDER_NAME" />...</translation> <translation id="2872961005593481000">Encerrar</translation> <translation id="2875698561019555027">(Páginas de erro do Chrome)</translation> -<translation id="2879560882721503072">O certificado de cliente emitido por <ph name="ISSUER" /> foi armazenado com êxito.</translation> <translation id="288024221176729610">Checo</translation> <translation id="288042212351694283">Aceder aos seus dispositivos Universal 2nd Factor</translation> <translation id="2881966438216424900">Último acesso:</translation> @@ -1590,6 +1588,7 @@ <translation id="3057861065630527966">Fazer uma cópia de segurança de fotografias e vídeos</translation> <translation id="3058212636943679650">Se precisar de restaurar o sistema operativo do computador, será necessário um cartão SD ou memory stick USB de recuperação.</translation> <translation id="305932878998873762">A Cache Simples para HTTP é uma nova cache. Depende do sistema de ficheiros para a atribuição do espaço em disco.</translation> +<translation id="3060251871394327123">Esta ação irá eliminar todos os dados que o site <ph name="SITE" /> armazenou no seu dispositivo. Pretende continuar?</translation> <translation id="3061650404498811439">Ativar o acesso à introdução de emoji, de escrita manual e de texto por voz a partir do menu IME de opção.</translation> <translation id="3062606427884046423">Utilizar notificações Android MediaStyle para notificações de multimédia do Chrome.</translation> <translation id="3063844757726132584">Aceda a todas as suas aplicações a partir deste prático iniciador. Divirta-se com jogos, participe em chat de vídeo, ouça música, edite documentos ou obtenha mais aplicações.</translation> @@ -1639,6 +1638,7 @@ <translation id="3123569374670379335">(Supervisionado)</translation> <translation id="3124111068741548686">Identificadores de UTILIZADOR</translation> <translation id="3126026824346185272">Ctrl</translation> +<translation id="3127156390846601284">Esta ação irá eliminar todos os dados armazenados no dispositivo para todos os sites apresentados. Pretende continuar?</translation> <translation id="312759608736432009">Fabricante do dispositivo:</translation> <translation id="3127919023693423797">A autenticar...</translation> <translation id="3128230619496333808">Separador 6</translation> @@ -1737,7 +1737,6 @@ <translation id="3264544094376351444">Tipo de letra Sans-Serif</translation> <translation id="3264547943200567728">Falha ao configurar a rede do seu Chromebox</translation> <translation id="3265459715026181080">Fechar janela</translation> -<translation id="3267271790328635957">Apenas PDF</translation> <translation id="3267726687589094446">Continuar a permitir transferências automáticas de vários ficheiros</translation> <translation id="3267998849713137817">Hora da modificação</translation> <translation id="3268451620468152448">Abrir Separadores</translation> @@ -1983,6 +1982,7 @@ <translation id="3574210789297084292">iniciar sessão</translation> <translation id="3574305903863751447"><ph name="CITY" />, <ph name="STATE" /> <ph name="COUNTRY" /></translation> <translation id="357479282490346887">Lituânia</translation> +<translation id="3575927481544652747">Desativa a API Windows Runtime MIDI para WebMIDI, que está ativada por predefinição no Windows 10 ou posterior.</translation> <translation id="3576324189521867626">Instalação com êxito</translation> <translation id="3578331450833904042">Predefinição (captar tudo)</translation> <translation id="3578594933904494462">O conteúdo deste separador está a ser partilhado.</translation> @@ -2036,8 +2036,6 @@ <translation id="3627320433825461852">Falta menos de 1 minuto</translation> <translation id="3627588569887975815">Abrir link numa janela sem re&gisto</translation> <translation id="3627671146180677314">Período de renovação do certificado Netscape</translation> -<translation id="3629326610814700057">Permite que o gestor de armazenamento gira o armazenamento local.</translation> -<translation id="3630337581925712713"><ph name="PERMISSION_TYPE_LABEL" />:</translation> <translation id="3631337165634322335">As excepções abaixo aplicam-se apenas à actual sessão no modo de navegação anónima.</translation> <translation id="3633586230741134985">Definições do Iniciador de Aplicações</translation> <translation id="3633997706330212530">Opcionalmente, pode desativar estes serviços.</translation> @@ -2060,7 +2058,8 @@ <translation id="3654045516529121250">Ler definições de acessibilidade</translation> <translation id="3654092442379740616">Erro de Sincronização: o <ph name="PRODUCT_NAME" /> está desatualizado e tem de ser atualizado.</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{Tem acesso permanente a um ficheiro.}other{Tem acesso permanente a # ficheiros.}}</translation> -<translation id="3657468915905674858">Ativar bloqueio Win32k PPAPI.</translation> +<translation id="365793796291733849"><ph name="BEGIN_PARAGRAPH1" />Quando ativa a cópia de segurança automática, os dados das aplicações e do dispositivo são guardados periodicamente numa pasta privada no Google Drive. Os dados das aplicações podem ser quaisquer dados que uma aplicação tenha guardado (com base nas definições do programador), incluindo dados potencialmente sensíveis, como contactos, mensagens e fotos.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Os dados da cópia de segurança não contam para a quota do Armazenamento do Drive. Não é feita uma cópia de segurança dos ficheiros grandes ou dos ficheiros que os programadores optaram por excluir do serviço.<ph name="END_PARAGRAPH2" /></translation> <translation id="3660234220361471169">Não fidedigno</translation> <translation id="3665589677786828986">O Chrome detetou que algumas das suas definições foram danificadas por outro programa e repôs as respetivas predefinições originais.</translation> <translation id="3665842570601375360">Segurança:</translation> @@ -2115,6 +2114,7 @@ <translation id="3733127536501031542">Servidor SSL com "Step-up"</translation> <translation id="3736520371357197498">Se compreende os riscos para a sua segurança, pode <ph name="BEGIN_LINK" />visitar este site não seguro<ph name="END_LINK" /> antes de os programas perigosos terem sido removidos.</translation> <translation id="3738924763801731196"><ph name="OID" />:</translation> +<translation id="3739254215541673094">Pretende abrir <ph name="APPLICATION" />?</translation> <translation id="3739798227959604811">Atraso antes da repetição:</translation> <translation id="3741158646617793859"><ph name="DEVICE_NAME" /> será agora apresentado na Consola do administrador.</translation> <translation id="3741243925913727067">Faça uma cópia de segurança das fotografias e dos vídeos do seu dispositivo multimédia no Google Drive.</translation> @@ -2353,7 +2353,6 @@ <translation id="4058793769387728514">Verificar documento agora</translation> <translation id="4059285154003114015">&Imprimir moldura...</translation> <translation id="406070391919917862">Aplicações em segundo plano</translation> -<translation id="4061502419206152498">Mostrar apenas não seguro, não animado</translation> <translation id="4062251648694601778">Desfrute do seu dispositivo <ph name="SHORT_PRODUCT_NAME" />. Tem dúvidas? Pode sempre obter ajuda ao clicar em "?" no tabuleiro de estado.</translation> <translation id="4065876735068446555">A rede que está a utilizar (<ph name="NETWORK_ID" />) pode exigir que visite a respetiva página de início de sessão.</translation> <translation id="4068506536726151626">Esta página contém elementos dos seguintes sites que estão a monitorizar a sua localização:</translation> @@ -2392,7 +2391,6 @@ <translation id="4101878899871018532">O gestor de palavras-passe não pede para guardar a credencial utilizada para sincronizar.</translation> <translation id="410351446219883937">Reprodução automática</translation> <translation id="4104163789986725820">E&xportar...</translation> -<translation id="4105523032910086267">Define a animação e a visibilidade das informações detalhadas de segurança no Material Design.</translation> <translation id="4105563239298244027">Obtenha 1 TB grátis com o Google Drive</translation> <translation id="4109135793348361820">Mover a janela para <ph name="USER_NAME" /> (<ph name="USER_EMAIL" />)</translation> <translation id="4110342520124362335">Cookies de <ph name="DOMAIN" /> bloqueados.</translation> @@ -2443,6 +2441,7 @@ <translation id="418179967336296930">Teclado com a fonética russa (YaZHert)</translation> <translation id="4181841719683918333">Idiomas</translation> <translation id="4187248015940562149">Ativa o Bluetooth Web, o que pode permitir que Websites se liguem a dispositivos Bluetooth à sua volta e os controlem.</translation> +<translation id="4188447344915957833">Ativa o gestor de armazenamento nas Definições do material design.</translation> <translation id="4189406272289638749">Uma extensão, <b><ph name="EXTENSION_NAME" /></b>, está a controlar esta definição.</translation> <translation id="4193154014135846272">Documento do Google</translation> <translation id="4193182321948161343">Ativar gestor de utilizadores do Material Design</translation> @@ -2650,6 +2649,7 @@ <translation id="4508765956121923607">Ver &Origem</translation> <translation id="4509017836361568632">Rejeitar fotografia</translation> <translation id="4509345063551561634">Localização:</translation> +<translation id="4513946894732546136">Comentários</translation> <translation id="4514542542275172126">Configurar novo utilizador supervisionado</translation> <translation id="4514914692061505365">Forçar a utilização do tradutor Subzero rápido de PNaCl para todos os ficheiros pexe.</translation> <translation id="451515744433878153">Remover</translation> @@ -2748,6 +2748,7 @@ <translation id="4656293982926141856">Este computador</translation> <translation id="4656631038341342120">Ativar shell de RV se estiver disponível neste dispositivo.</translation> <translation id="4657031070957997341">Permitir sempre plug-ins em <ph name="HOST" /></translation> +<translation id="466008749075469935">Ativa a intervenção para limitar a utilização da CPU por parte dos temporizadores em segundo plano a 1%.</translation> <translation id="4663254525753315077">Sempre que possível, coloca os conteúdos de deslocamento de um elemento de deslocamento de conteúdo excedido numa camada composta para obter um deslocamento mais rápido.</translation> <translation id="4664482161435122549">Erro ao exportar PKCS #12</translation> <translation id="4665014895760275686">Fabricante</translation> @@ -2816,6 +2817,7 @@ <translation id="4749157430980974800">Teclado em georgiano</translation> <translation id="4750394297954878236">Sugestões</translation> <translation id="475088594373173692">Primeiro utilizador</translation> +<translation id="4750892496809949692">Preferir o conteúdo HTML ao ocultar o Flash da lista de plug-ins.</translation> <translation id="4750917950439032686">As suas informações (por exemplo, palavras-passe ou números de cartões de crédito) são privadas quando são enviadas para este site.</translation> <translation id="4753602155423695878">Animação da barra de progresso do carregamento de páginas de telemóveis Android</translation> <translation id="4755240240651974342">Teclado finlandês</translation> @@ -3090,6 +3092,7 @@ <translation id="5119450342834678097">Solicitar opção de site para tablets no menu de definições</translation> <translation id="5120068803556741301">Método de introdução de terceiros</translation> <translation id="5120421890733714118">Confiar neste certificado para identificar Web sites.</translation> +<translation id="5120516977819314347">PIN ou palavra-passe incorretos.</translation> <translation id="5121130586824819730">O seu disco rígido está cheio. Guarde noutra localização ou liberte espaço no disco rígido.</translation> <translation id="5125751979347152379">URL inválido.</translation> <translation id="5127881134400491887">Gerir ligações de rede</translation> @@ -3097,6 +3100,7 @@ <translation id="512903556749061217">ligação estabelecida</translation> <translation id="5129301143853688736">A sua ligação a este site não é privada. É possível que utilizadores mal intencionados estejam a tentar roubar as suas informações (por exemplo, fotos, palavras-passe, mensagens e cartões de crédito) de <ph name="DOMAIN" />.</translation> <translation id="5129662217315786329">Polaco</translation> +<translation id="5131347545782851480">Documentos PDF</translation> <translation id="5134856901811723984">Material design na IU do sistema do SO Chrome</translation> <translation id="5135533361271311778">Não foi possível criar item de marcador.</translation> <translation id="5136529877787728692">F7</translation> @@ -3265,6 +3269,7 @@ <translation id="5328031682234198929">8</translation> <translation id="5329858601952122676">E&liminar</translation> <translation id="5330145655348521461">Estes ficheiros foram abertos num ambiente de trabalho diferente. Mova para <ph name="USER_NAME" /> (<ph name="MAIL_ADDRESS" />) para ver.</translation> +<translation id="5330512191124428349">Obter informações</translation> <translation id="5332624210073556029">Fuso horário:</translation> <translation id="5333807720589685258">O seu cartão SIM é desativado definitivamente se não conseguir introduzir a chave de desbloqueio do PIN correta.</translation> <translation id="5333958554630697967">Ativa funcionalidades da Plataforma Web experimentais que estão em desenvolvimento.</translation> @@ -3697,7 +3702,6 @@ <translation id="5892507820957994680">Substitui a lista de conversão de software incorporada e ativa a aceleração de GPU em configurações de sistema não suportadas.</translation> <translation id="5895138241574237353">Reiniciar</translation> <translation id="5895187275912066135">Emitido em</translation> -<translation id="5898154795085152510">O servidor devolveu um certificado de cliente inválido. Erro <ph name="ERROR_NUMBER" /> (<ph name="ERROR_NAME" />).</translation> <translation id="5900302528761731119">Fotografia do Perfil do Google</translation> <translation id="590253956165195626">Sugerir a tradução de páginas que não estejam num idioma que o utilizador saiba ler.</translation> <translation id="5904093760909470684">Configuração do proxy</translation> @@ -3752,6 +3756,8 @@ <translation id="5984222099446776634">Visitados Recentemente</translation> <translation id="5984814259619230127">Deteção de Bluetooth Low Energy do Smart Lock</translation> <translation id="5986245990306121338">Se ativado, é apresentado um comutador de separadores mesmo quando a opção "unir separadores e aplicações" estiver ativada nas definições.</translation> +<translation id="5989712527536636369"><ph name="BEGIN_PARAGRAPH1" />Estas são informações gerais acerca do dispositivo e do modo como o utiliza, tais como o nível da bateria, a frequência com que utiliza as aplicações, a qualidade e a duração das ligações de rede (como o Wi-Fi e o Bluetooth) e os relatórios de falhas quando algo não está a funcionar como deveria. Estas informações são utilizadas para melhorar os produtos e os serviços Google para todos. Algumas informações agregadas ajudam também os parceiros, como os programadores do Android, a melhorar os respetivos produtos e aplicações.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Pode ativá-las ou desativá-las a qualquer momento nas definições das aplicações Android. Isto não afeta a capacidade de o dispositivo enviar as informações de que necessita para receber serviços essenciais, tais como atualizações do sistema e de segurança.<ph name="END_PARAGRAPH2" /></translation> <translation id="5990198433782424697">Extensões nos URLs chrome://</translation> <translation id="5990814808592353318">Geração manual de palavras-passe.</translation> <translation id="5991049340509704927">Ampliar</translation> @@ -3765,6 +3771,7 @@ <translation id="6005695835120147974">Media Router</translation> <translation id="6007237601604674381">Falha ao mover. <ph name="ERROR_MESSAGE" /></translation> <translation id="6008241731410823808">Envia pings de auditoria de hiperligações.</translation> +<translation id="6011449291337289699">Limpar dados do site</translation> <translation id="6015796118275082299">Ano</translation> <translation id="6016551720757758985">Confirmar o Powerwash com o regresso à versão anterior</translation> <translation id="6016809788585079594">Diga "Ok Google" uma última vez</translation> @@ -3954,7 +3961,6 @@ <translation id="6276301056778294989">Certifique-se de que este dispositivo apresenta o mesmo código.</translation> <translation id="6277105963844135994">Limite de tempo da rede</translation> <translation id="6277518330158259200">C&riar captura de ecrã</translation> -<translation id="6278428485366576908">Tema</translation> <translation id="6279183038361895380">Premir |<ph name="ACCELERATOR" />| para mostrar o cursor</translation> <translation id="6280215091796946657">Iniciar sessão com uma conta diferente</translation> <translation id="6280912520669706465">ARC</translation> @@ -4206,6 +4212,7 @@ <translation id="6607272825297743757">Informações do ficheiro</translation> <translation id="6607831829715835317">Mais ferrament&as</translation> <translation id="6608140561353073361">Todos os cookies e dados do site...</translation> +<translation id="6610183966322615106">Erro ao adicionar impressora</translation> <translation id="6610610633807698299">Introduzir URL...</translation> <translation id="6612358246767739896">Conteúdo protegido</translation> <translation id="6615455863669487791">Mostrar</translation> @@ -4269,7 +4276,6 @@ <translation id="6708242697268981054">Origem:</translation> <translation id="6709357832553498500">Ligar através de <ph name="EXTENSIONNAME" /></translation> <translation id="6710213216561001401">Anterior</translation> -<translation id="6712158998835983046">Mostrar tudo, animado</translation> <translation id="6718273304615422081">A comprimir...</translation> <translation id="671928215901716392">Bloquear ecrã</translation> <translation id="6721972322305477112">&Ficheiro</translation> @@ -4541,7 +4547,6 @@ <translation id="7088434364990739311">Falha ao iniciar a verificação de atualizações (código de erro <ph name="ERROR" />).</translation> <translation id="708856090370082727">Ative o suporte do deslocamento do OSK. Com este sinalizador ativado, o OSK apenas redimensiona a área visível.</translation> <translation id="7088674813905715446">Este dispositivo foi colocado num estado descontinuado pelo administrador. Para ativá-lo para inscrição, solicite ao administrador que coloque o dispositivo num estado pendente.</translation> -<translation id="7089609847854449639">Gestor de armazenamento</translation> <translation id="708969677220991657">Permite pedidos ao localhost através de HTTPS mesmo quando é apresentado um certificado inválido.</translation> <translation id="7092106376816104">Exceções de pop-up</translation> <translation id="7093866338626856921">Trocar dados com os seguintes dispositivos: <ph name="HOSTNAMES" /></translation> @@ -4581,7 +4586,7 @@ <translation id="715118844758971915">Impressoras clássicas</translation> <translation id="7154130902455071009">Alterar a página de início para: <ph name="START_PAGE" /></translation> <translation id="7155171745945906037">Foto existente da câmara ou do ficheiro</translation> -<translation id="715568033737470079">Especificar os plug-ins PPAPI que serão executados na política de isolamento de processos de bloqueio Win32k (apenas Windows 10 e superior).</translation> +<translation id="7155226869555939647">Abrir sempre links de <ph name="APPLICATION" /></translation> <translation id="7156235233373189579">Este ficheiro foi concebido para um PC que utiliza software Windows. Por isso, não é compatível com o seu dispositivo, que utiliza o SO Chrome. Procure na <ph name="BEGIN_LINK" />Web Store do Chrome<ph name="END_LINK" /> uma aplicação de substituição adequada.<ph name="BEGIN_LINK_HELP" />Saiba mais<ph name="END_LINK_HELP" /></translation> <translation id="7157063064925785854">Ao clicar em Continuar, aceita os <ph name="LEGAL_DOC_LINK_TEXT_1" />, os <ph name="LEGAL_DOC_LINK_TEXT_2" />, os <ph name="LEGAL_DOC_LINK_TEXT_3" /> e os <ph name="LEGAL_DOC_LINK_TEXT_4" />.</translation> <translation id="7158238151765743968">A ligação a "<ph name="DEVICE_NAME" />" ainda está em curso.</translation> @@ -4596,6 +4601,7 @@ <translation id="7175353351958621980">Carregado de:</translation> <translation id="7180611975245234373">Atualizar</translation> <translation id="7180865173735832675">Personalizar</translation> +<translation id="7181387261278441780">Limpar e repor site</translation> <translation id="7185078796915954712">TLS 1.3</translation> <translation id="7185690883425432021">Oculta os botões fechar dos separadores inativos quando a faixa de separadores está em modo empilhado.</translation> <translation id="7186088072322679094">Manter na Barra de ferramentas</translation> @@ -4628,7 +4634,6 @@ <translation id="7223775956298141902">Boo... Não tem extensões :-(</translation> <translation id="7224023051066864079">Máscara de sub-rede:</translation> <translation id="7225179976675429563">Tipo de rede em falta</translation> -<translation id="7230191962699768124">Mostrar tudo, não animado</translation> <translation id="7230787553283372882">Personalizar o tamanho do texto</translation> <translation id="7231224339346098802">Utilize um número para indicar as cópias a imprimir (1 ou mais).</translation> <translation id="7238585580608191973">Impressão digital SHA-256</translation> @@ -4760,7 +4765,6 @@ <translation id="7409233648990234464">Reiniciar e Powerwash</translation> <translation id="7409836189476010449">Executar o Flash</translation> <translation id="7410344089573941623">Perguntar se <ph name="HOST" /> pretende aceder à sua câmara e microfone</translation> -<translation id="7411343637221933631">{NUM_COOKIES,plural, =1{1 deste site}other{# deste site}}</translation> <translation id="7412226954991670867">Memória GPU</translation> <translation id="7416362041876611053">Erro de rede desconhecido.</translation> <translation id="7417453074306512035">Teclado etíope</translation> @@ -4882,6 +4886,7 @@ <translation id="756445078718366910">Abrir janela do navegador</translation> <translation id="7564847347806291057">Concluir processo</translation> <translation id="7566723889363720618">F12</translation> +<translation id="7567314848159753396">Cookie: <ph name="NAME" /></translation> <translation id="756809126120519699">Dados do Chrome limpos</translation> <translation id="7568790562536448087">A atualizar</translation> <translation id="7573172247376861652">Carga da bateria</translation> @@ -4922,6 +4927,7 @@ <translation id="7626009897377900107">Geração de palavras-passe</translation> <translation id="7627262197844840899">Este site não aceita o cartão MasterCard.</translation> <translation id="7627790789328695202">Ups, <ph name="FILE_NAME" /> já existe. Dê um nome novo e tente novamente.</translation> +<translation id="7628127343934101653">Abrir ficheiros PDF na aplicação do visualizador de PDF predefinida.</translation> <translation id="762917759028004464">Atualmente, o navegador predefinido é o <ph name="BROWSER_NAME" />.</translation> <translation id="7629536005696009600">Permita que as credenciais armazenadas para aplicações Android sejam preenchidas em Websites correspondentes.</translation> <translation id="7629827748548208700">Separador: <ph name="TAB_NAME" /></translation> @@ -5150,6 +5156,7 @@ <translation id="7957513156576779045">Ativar o Bluetooth para permitir a sincronização</translation> <translation id="7957615753207896812">Abrir definições do dispositivo do teclado</translation> <translation id="7959074893852789871">O ficheiro continha vários certificados, sendo que alguns deles não foram importados:</translation> +<translation id="7959700692661109221"><ph name="BEGIN_PARAGRAPH" />O serviço de localização da Google utiliza fontes como o Wi-Fi para ajudar a estimar a localização do dispositivo mais rapidamente e com maior precisão. Quando ativa os serviços de localização da Google, o dispositivo entra num modo que utiliza o Wi-Fi para fornecer informações de localização. Pode desativar esta opção nas definições de localização a qualquer momento.<ph name="END_PARAGRAPH" /></translation> <translation id="7961015016161918242">Nunca</translation> <translation id="7964089325405904043">Importação e exportação de palavras-passe</translation> <translation id="7965010376480416255">Memória partilhada</translation> @@ -5300,6 +5307,7 @@ <translation id="8146793085009540321">Falha ao iniciar sessão. Contacte o administrador ou tente novamente.</translation> <translation id="8148264977957212129">Método de introdução Pinyin</translation> <translation id="8148913456785123871">Mostrar cartões do Google Now no iniciador</translation> +<translation id="8150391391298684512">Desativar a API Windows Runtime MIDI</translation> <translation id="8151185429379586178">Ferramentas do programador</translation> <translation id="8151638057146502721">Configurar</translation> <translation id="8151639108075998630">Activar navegação de convidado</translation> @@ -5580,6 +5588,7 @@ <translation id="8532294913309524834">Ordene idiomas com base na sua preferência.</translation> <translation id="8535005006684281994">URL de renovação de certificado Netscape</translation> <translation id="8539727552378197395">Não (HttpOnly)</translation> +<translation id="8541084862688000575">Carregar automaticamente aplicações Android</translation> <translation id="8543181531796978784">Pode <ph name="BEGIN_ERROR_LINK" />comunicar um problema de deteção<ph name="END_ERROR_LINK" /> ou, se compreende os riscos para a sua segurança, <ph name="BEGIN_LINK" />aceda a este site não seguro<ph name="END_LINK" />.</translation> <translation id="8545107379349809705">Ocultar informações...</translation> <translation id="8545211332741562162">Permitir que as páginas Web utilizem as funcionalidades de JavaScript experimentais.</translation> @@ -5607,7 +5616,6 @@ <translation id="8569764466147087991">Selecione um ficheiro para abrir</translation> <translation id="8571032220281885258">Quando disser "OK Google", o Chrome pesquisará o que disser a seguir.</translation> <translation id="8571108619753148184">Servidor 4</translation> -<translation id="8572832761467613633">Apenas Flash</translation> <translation id="8572981282494768930">Não permitir que os sites acedam à sua câmara e ao seu microfone</translation> <translation id="8574234089711453001">Permitir a apresentação de um botão de transferência ao abrir uma página com um URL de multimédia.</translation> <translation id="857779305329188634">Ativar suporte de protocolo QUIC experimental.</translation> @@ -5629,6 +5637,7 @@ <translation id="8600929685092827187">Reativar ao receber pacotes</translation> <translation id="8601206103050338563">Autenticação de cliente TLS WWW</translation> <translation id="8602851771975208551">Outro programa do computador adicionou uma aplicação que pode alterar o funcionamento do Chrome</translation> +<translation id="8603912787021349466">Permitir que as aplicações Android iniciem automaticamente após o início de sessão.</translation> <translation id="8605428685123651449">Memória SQLite</translation> <translation id="8605503133013456784">Falha ao desligar e desemparelhar de "<ph name="DEVICE_NAME" />".</translation> <translation id="8606726445206553943">Utilizar os seus dispositivos MIDI</translation> @@ -5981,6 +5990,7 @@ <translation id="9053965862400494292">Ocorreu um erro ao tentar configurar a sincronização.</translation> <translation id="9056034633062863292">Atualização do Chromebox</translation> <translation id="9056810968620647706">Não foram encontradas correspondências.</translation> +<translation id="9057119625587205566">Nenhuma impressora próxima</translation> <translation id="9059868303873565140">Menu de estado</translation> <translation id="9064142312330104323">Fotografia do Perfil do Google (a carregar)</translation> <translation id="9064275926664971810">Ativar a funcionalidade de Preenchimento Automático para preencher formulários Web com um único clique</translation> @@ -5991,6 +6001,7 @@ <translation id="9067401056540256169">Esta sinalização torna o Chrome inseguro. Utilize apenas se compreender o que isto faz. Tenha em atenção que esta sinalização pode ser removida sem qualquer aviso. Se ativada, frames com uma origem https podem utilizar WebSockets com um URL inseguro (ws://).</translation> <translation id="9068931793451030927">Caminho:</translation> <translation id="9070219033670098627">Mudar de pessoa</translation> +<translation id="9070940116164932228">Controlar os temporizadores em segundo plano que consomem muitos recursos</translation> <translation id="907148966137935206">Não permitir que nenhum site mostre pop-ups (recomendado)</translation> <translation id="9072550133391925347">O <ph name="PASSWORD_MANAGER_BRAND" /> inicia automaticamente sessão em sites e aplicações elegíveis com as palavras-passe que guardou.</translation> <translation id="9073281213608662541">PAP</translation> @@ -6024,6 +6035,7 @@ <translation id="9112614144067920641">Escolha um novo PIN.</translation> <translation id="9112748030372401671">Alterar a imagem de fundo</translation> <translation id="9112987648460918699">Localizar...</translation> +<translation id="9114663181201435112">Iniciar sessão facilmente</translation> <translation id="9115487443206954631">Gerir dispositivos de transmissão</translation> <translation id="9115675100829699941">&Marcadores</translation> <translation id="9121814364785106365">Abrir como separador fixo</translation> @@ -6118,7 +6130,6 @@ <translation id="952992212772159698">Não activado</translation> <translation id="960719561871045870">Código do operador</translation> <translation id="960987915827980018">Falta cerca de 1 hora</translation> -<translation id="962778376131245616">Mostrar apenas não seguro, animado</translation> <translation id="96421021576709873">Rede Wi-Fi</translation> <translation id="965490406356730238">Ative a descodificação de mjpeg acelerada por hardware para frame capturado quando disponível.</translation> <translation id="968174221497644223">Cache da aplicação</translation>
diff --git a/chrome/app/resources/generated_resources_ro.xtb b/chrome/app/resources/generated_resources_ro.xtb index 22a0179c9..7ad26a1 100644 --- a/chrome/app/resources/generated_resources_ro.xtb +++ b/chrome/app/resources/generated_resources_ro.xtb
@@ -18,7 +18,6 @@ <translation id="1029317248976101138">Zoom</translation> <translation id="1029595648591494741">Încercați „<ph name="EXTENSION_NAME" />”?</translation> <translation id="1031362278801463162">Se încarcă previzualizarea</translation> -<translation id="1031460590482534116">A apărut o eroare la încercarea de stocare a certificatului clientului. Eroare <ph name="ERROR_NUMBER" /> (<ph name="ERROR_NAME" />).</translation> <translation id="1031573127485938293">Solicită (gestionată de politică)</translation> <translation id="103279545524624934">Eliberează spațiu pe disc pentru a lansa aplicații Android.</translation> <translation id="1033780634303702874">Accesează dispozitivele seriale</translation> @@ -101,6 +100,7 @@ <translation id="1128591060186966949">Editează motorul de căutare</translation> <translation id="1128987120443782698">Dispozitivul de stocare are o capacitate de <ph name="DEVICE_CAPACITY" />. Introdu un card SD sau un stick de memorie USB cu o capacitate de minimum 4 GB.</translation> <translation id="1137135726305341424">domContentLoaded și toate încărcările de resurse începute înainte de domContentLoaded (cadrul principal și cadrele iframe cu aceeași origine).</translation> +<translation id="1138663153846032155">Prefer HTML în loc de Flash</translation> <translation id="1140351953533677694">Accesează dispozitivele Bluetooth și seriale</translation> <translation id="114140604515785785">Director rădăcină pentru extensie:</translation> <translation id="1143142264369994168">Semnatarul certificatului</translation> @@ -252,6 +252,7 @@ <translation id="1351692861129622852">Se importă <ph name="FILE_COUNT" /> (de) fișiere...</translation> <translation id="1352103415082130575">Tastatură thailandeză (Pattachote)</translation> <translation id="1353686479385938207"><ph name="PROVIDER_NAME" />: <ph name="NETWORK_NAME" /></translation> +<translation id="1353946958707294039">Managerul stocării în designul material</translation> <translation id="1353966721814789986">Pagini de pornire</translation> <translation id="1354868058853714482">Adobe Reader nu este actualizat și poate fi nesigur.</translation> <translation id="1355408554203439639">Software de rasterizare 3D</translation> @@ -423,7 +424,6 @@ <translation id="1533920822694388968">Alinierea televizorului</translation> <translation id="15373452373711364">Cursor de mouse mare</translation> <translation id="1543284117603151572">Importate din Edge</translation> -<translation id="1544350195767834591">{NUM_COOKIES,plural, =1{1 de pe alte site-uri}few{# de pe alte site-uri}other{# de pe alte site-uri}}</translation> <translation id="1545177026077493356">Mod chioșc automat</translation> <translation id="1545786162090505744">Adresă URL cu %s în loc de interogare</translation> <translation id="1546280085599573572">Această extensie a modificat ce pagină se afișează când dai clic pe butonul Pagină de pornire.</translation> @@ -447,7 +447,6 @@ <translation id="1559235587769913376">Introdu caracterele în format Unicode</translation> <translation id="1561092721008294962">HarfBuzz pentru textul interfeței de utilizare</translation> <translation id="1566049601598938765">Site</translation> -<translation id="1566958206723629112">Flash și PDF</translation> <translation id="1567723158593978621">Când opțiunea este activată, pentru conectarea la browser se va folosi un nou flux de conectare Gaia cu parolă separată.</translation> <translation id="1567993339577891801">Consolă JavaScript</translation> <translation id="1568323446248056064">Deschide setările dispozitivului privind afișajul</translation> @@ -576,7 +575,6 @@ <translation id="1723940674997333416">Permiteți traficul nesecurizat prin WebSocket provenit de la https</translation> <translation id="1725149567830788547">Afișează &comenzile</translation> <translation id="172612876728038702">TPM se configurează. Ai răbdare; acest lucru poate dura câteva minute.</translation> -<translation id="1727135806684246609">Detalierea securității în designul material</translation> <translation id="1729533290416704613">Stabilește și ce pagină se afișează când căutați din caseta polivalentă.</translation> <translation id="1731346223650886555">Punct și virgulă</translation> <translation id="1731589410171062430">Total: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /> (<ph name="NUMBER_OF_PAGES" /> <ph name="PAGE_OR_PAGES_LABEL" />)</translation> @@ -872,6 +870,7 @@ <translation id="218492098606937156">Activați evenimente pentru ecrane tactile</translation> <translation id="2187317261103489799">Detectează (în mod prestabilit)</translation> <translation id="2187895286714876935">Eroare de import a certificatului serverului</translation> +<translation id="2188881192257509750">Deschide <ph name="APPLICATION" /></translation> <translation id="2190069059097339078">Instrument de obținere a datelor de conectare WiFi</translation> <translation id="219008588003277019">Modul Client nativ: <ph name="NEXE_NAME" /></translation> <translation id="2190355936436201913">(gol)</translation> @@ -990,6 +989,7 @@ <translation id="2326606747676847821">Treci în incognito</translation> <translation id="2326931316514688470">&Reîncarcă aplicația</translation> <translation id="2327492829706409234">Activați aplicația</translation> +<translation id="2328054044222305089">Astfel, se vor șterge toate datele pe care <ph name="SITE" /> le-a stocat pe dispozitiv și se vor reseta permisiunile pe care le-ai acordat. Vrei să continui?</translation> <translation id="2329597144923131178">Conectează-te și accesează marcajele, istoricul, parolele și alte setări pe toate dispozitivele.</translation> <translation id="2332131598580221120">Vedeți în magazin</translation> <translation id="2332742915001411729">Resetați la valorile prestabilite</translation> @@ -1265,7 +1265,6 @@ <translation id="2675358154061544447">Compatibilitate foarte experimentală pentru redarea de cadre iframe între site-uri în procese separate. În acest mod, documentele vor folosi același proces de redare numai dacă provin de pe același site.</translation> <translation id="2676946222714718093">Se redă pe</translation> <translation id="2678063897982469759">Reactivează</translation> -<translation id="2678246812096664977">Toate pluginurile</translation> <translation id="2679385451463308372">Printează utilizând caseta de dialog a sistemului...</translation> <translation id="2680208403056680091">Conexiunea la internet este controlată</translation> <translation id="268053382412112343">Is&toric</translation> @@ -1439,7 +1438,6 @@ <translation id="287286579981869940">Adaugă <ph name="PROVIDER_NAME" />...</translation> <translation id="2872961005593481000">Închide</translation> <translation id="2875698561019555027">(pagini de erori Chrome)</translation> -<translation id="2879560882721503072">Certificatul de client emis de <ph name="ISSUER" /> a fost stocat.</translation> <translation id="288024221176729610">Cehă</translation> <translation id="288042212351694283">Accesează dispozitivele Universal 2nd Factor</translation> <translation id="2881966438216424900">Ultima accesare:</translation> @@ -1588,6 +1586,7 @@ <translation id="3057861065630527966">Fă backup pentru fotografii și videoclipuri</translation> <translation id="3058212636943679650">Dacă va fi necesar să restabilești sistemul de operare al computerului, vei avea nevoie de un card SD sau de un stick de memorie USB.</translation> <translation id="305932878998873762">Memoria cache simplă pentru HTTP este o memorie cache nouă. Aceasta se bazează pe sistemul de fișiere pentru alocarea spațiului de pe disc.</translation> +<translation id="3060251871394327123">Astfel, se vor șterge toate datele pe care <ph name="SITE" /> le-a stocat pe dispozitiv. Vrei să continui?</translation> <translation id="3061650404498811439">Permite accesul la emoji, la scrierea de mână și la intrarea vocală din meniul de opțiuni IME.</translation> <translation id="3062606427884046423">Folosește notificările Android MediaStyle pentru notificările media Chrome.</translation> <translation id="3063844757726132584">Accesează toate aplicațiile din acest lansator util. Joacă jocuri, conversează prin chat video, ascultă muzică, editează documente sau descarcă mai multe aplicații.</translation> @@ -1637,6 +1636,7 @@ <translation id="3123569374670379335">(Monitorizat)</translation> <translation id="3124111068741548686">Handle-uri USER</translation> <translation id="3126026824346185272">Ctrl</translation> +<translation id="3127156390846601284">Astfel, se vor șterge toate datele stocate pe dispozitiv pentru site-urile afișate. Vrei să continui?</translation> <translation id="312759608736432009">Producătorul dispozitivului:</translation> <translation id="3127919023693423797">Se autentifică...</translation> <translation id="3128230619496333808">Fila 6</translation> @@ -1735,7 +1735,6 @@ <translation id="3264544094376351444">Font Sans-Serif</translation> <translation id="3264547943200567728">Rețeaua pentru Chromebox nu a fost configurată</translation> <translation id="3265459715026181080">Închide fereastra</translation> -<translation id="3267271790328635957">Numai pentru fișiere PDF</translation> <translation id="3267726687589094446">Permiteți în continuare descărcarea automată a mai multor fișiere</translation> <translation id="3267998849713137817">Ora modificării</translation> <translation id="3268451620468152448">File deschise</translation> @@ -1981,6 +1980,7 @@ <translation id="3574210789297084292">conectați-vă</translation> <translation id="3574305903863751447"><ph name="CITY" />, <ph name="STATE" /> <ph name="COUNTRY" /></translation> <translation id="357479282490346887">Lituaniană</translation> +<translation id="3575927481544652747">Dezactivează API-ul Windows Runtime MIDI pentru WebMIDI, care este activat în mod prestabilit pe Windows 10 sau versiunile ulterioare.</translation> <translation id="3576324189521867626">S-a instalat</translation> <translation id="3578331450833904042">Prestabilit (captează orice sunet)</translation> <translation id="3578594933904494462">La conținutul acestei file se permite accesul.</translation> @@ -2034,8 +2034,6 @@ <translation id="3627320433825461852">A mai rămas mai puțin de 1 minut</translation> <translation id="3627588569887975815">Deschide linkul într-o fereastră inco&gnito</translation> <translation id="3627671146180677314">Interval de reînnoire a certificatului Netscape</translation> -<translation id="3629326610814700057">Permite managerului stocării să gestioneze stocarea locală.</translation> -<translation id="3630337581925712713"><ph name="PERMISSION_TYPE_LABEL" />:</translation> <translation id="3631337165634322335">Excepțiile de mai jos se aplică numai sesiunii actuale incognito.</translation> <translation id="3633586230741134985">Setări pentru lansatorul de aplicații</translation> <translation id="3633997706330212530">Puteți opta pentru dezactivarea acestor servicii.</translation> @@ -2058,7 +2056,8 @@ <translation id="3654045516529121250">Citește setările de accesibilitate</translation> <translation id="3654092442379740616">Eroare de sincronizare: <ph name="PRODUCT_NAME" /> este învechit și trebuie să fie actualizat.</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{Aplicația are acces definitiv la un fișier.}few{Aplicația are acces definitiv la # fișiere.}other{Aplicația are acces definitiv la # de fișiere.}}</translation> -<translation id="3657468915905674858">Activează blocarea PPAPI Win32k.</translation> +<translation id="365793796291733849"><ph name="BEGIN_PARAGRAPH1" />Când activezi backupul automat, datele dispozitivului și ale aplicațiilor sunt salvate periodic într-un dosar privat în Google Drive. Datele unei aplicații pot fi orice tipuri de date salvate de o aplicație (în funcție de setările dezvoltatorului), inclusiv date posibil sensibile, cum ar fi persoanele de contact, mesajele și fotografiile.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Backupul datelor nu se ia în considerare la calcularea cotei de stocare Drive. Fișierelor mari sau fișierelor pe care dezvoltatorii au ales să le excludă din serviciu nu li se va face backup.<ph name="END_PARAGRAPH2" /></translation> <translation id="3660234220361471169">Nu prezintă încredere</translation> <translation id="3665589677786828986">Chrome a detectat că unele dintre setări au fost deteriorate de alt program și le-a resetat la valorile inițiale.</translation> <translation id="3665842570601375360">Securitate:</translation> @@ -2113,6 +2112,7 @@ <translation id="3733127536501031542">Server SSL cu Step-Up</translation> <translation id="3736520371357197498">Dacă înțelegeți riscurile de securitate, puteți să <ph name="BEGIN_LINK" />accesați acest site nesigur<ph name="END_LINK" /> înainte ca programele periculoase să fie eliminate.</translation> <translation id="3738924763801731196"><ph name="OID" />:</translation> +<translation id="3739254215541673094">Deschizi <ph name="APPLICATION" />?</translation> <translation id="3739798227959604811">Durată înainte de repetare:</translation> <translation id="3741158646617793859"><ph name="DEVICE_NAME" /> va apărea în Consola de administrare</translation> <translation id="3741243925913727067">Fă backup pentru fotografiile și videoclipurile de pe dispozitivul media pe Google Drive.</translation> @@ -2152,7 +2152,7 @@ <translation id="3785308913036335955">Afișați comanda rapidă pentru aplicații</translation> <translation id="3785852283863272759">Trimite prin e-mail locația paginii</translation> <translation id="3786248819762334406">Strategia de memorare în cache a scripturilor în CacheStorage pentru motorul JavaScript V8.</translation> -<translation id="3786301125658655746">Sunteți offline</translation> +<translation id="3786301125658655746">Ești offline</translation> <translation id="3788401245189148511">Aceasta ar putea să:</translation> <translation id="3789841737615482174">Instalează</translation> <translation id="3790146417033334899"><ph name="PLUGIN_NAME" /> funcționează doar pe desktop.</translation> @@ -2351,7 +2351,6 @@ <translation id="4058793769387728514">Verifică acum documentul</translation> <translation id="4059285154003114015">&Printează cadrul...</translation> <translation id="406070391919917862">Aplicații în fundal</translation> -<translation id="4061502419206152498">Afișează-le numai pe cele nesecurizate, neanimate</translation> <translation id="4062251648694601778">Bucurați-vă de dispozitivul dvs. <ph name="SHORT_PRODUCT_NAME" />. Aveți întrebări? Puteți primi oricând ajutor dând clic pe „?” în bara de stare.</translation> <translation id="4065876735068446555">Rețeaua pe care o folosești (<ph name="NETWORK_ID" />) poate solicita accesarea paginii de conectare.</translation> <translation id="4068506536726151626">Această pagină conține elemente din următoarele site-uri care îți urmăresc locația:</translation> @@ -2390,7 +2389,6 @@ <translation id="4101878899871018532">Managerul de parole nu va oferi salvarea datelor de conectare folosite pentru sincronizare.</translation> <translation id="410351446219883937">Redare automată</translation> <translation id="4104163789986725820">E&xportă...</translation> -<translation id="4105523032910086267">Setează animația și vizibilitatea pentru detalierea securității în designul material.</translation> <translation id="4105563239298244027">Primiți 1 TB spațiu de stocare gratuit în Google Drive</translation> <translation id="4109135793348361820">Mutați fereastra la <ph name="USER_NAME" /> (<ph name="USER_EMAIL" />)</translation> <translation id="4110342520124362335">Cookie-urile de la <ph name="DOMAIN" /> au fost blocate.</translation> @@ -2441,6 +2439,7 @@ <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="4188447344915957833">Activează managerul stocării în Setările designului material.</translation> <translation id="4189406272289638749">O extensie, <b><ph name="EXTENSION_NAME" /></b>, controlează această setare.</translation> <translation id="4193154014135846272">Document Google</translation> <translation id="4193182321948161343">Activează managerul de utilizatori din designul material</translation> @@ -2648,6 +2647,7 @@ <translation id="4508765956121923607">Afișează s&ursa</translation> <translation id="4509017836361568632">Renunțați la fotografie</translation> <translation id="4509345063551561634">Locație:</translation> +<translation id="4513946894732546136">Feedback</translation> <translation id="4514542542275172126">Configurați un utilizator monitorizat nou</translation> <translation id="4514914692061505365">Forțează folosirea instrumentului de traducere rapidă Subzero din PNaCl pentru toate fișierele pexe.</translation> <translation id="451515744433878153">Elimină</translation> @@ -2746,6 +2746,7 @@ <translation id="4656293982926141856">Acest computer</translation> <translation id="4656631038341342120">Activează un shell pentru RV, dacă opțiunea este disponibilă pentru acest dispozitiv.</translation> <translation id="4657031070957997341">Permite întotdeauna pluginuri pe <ph name="HOST" /></translation> +<translation id="466008749075469935">Permite intervenția pentru a limita la 1% folosirea CPU de către temporizatoarele din fundal.</translation> <translation id="4663254525753315077">Atunci când este posibil, plasează conținutul derulant al unui element de derulare pe un strat compus, pentru derulare mai rapidă.</translation> <translation id="4664482161435122549">PKCS # 12 Eroare de export</translation> <translation id="4665014895760275686">Producător</translation> @@ -2814,6 +2815,7 @@ <translation id="4749157430980974800">Tastatură georgiană</translation> <translation id="4750394297954878236">Sugestii</translation> <translation id="475088594373173692">Primul utilizator</translation> +<translation id="4750892496809949692">Prefer conținutul HTML, ascunzând Flash din lista de pluginuri.</translation> <translation id="4750917950439032686">Informațiile tale (de exemplu, parolele și numerele cardurilor de credit) sunt private când sunt trimise la acest site.</translation> <translation id="4753602155423695878">Animația barei care indică progresul încărcării paginii pe telefoane Android</translation> <translation id="4755240240651974342">Tastatură finlandeză</translation> @@ -3088,6 +3090,7 @@ <translation id="5119450342834678097">Opțiunea de solicitare a site-ului optimizat pentru tablete în meniul de setări</translation> <translation id="5120068803556741301">Metodă de introducere a textului terță parte</translation> <translation id="5120421890733714118">Aveți încredere în acest certificat pentru identificarea site-urilor web.</translation> +<translation id="5120516977819314347">PIN sau parolă incorectă.</translation> <translation id="5121130586824819730">Hard diskul este plin. Salvați în altă locație sau eliberați mai mult spațiu pe hard disk.</translation> <translation id="5125751979347152379">Adresă URL nevalidă.</translation> <translation id="5127881134400491887">Gestionează conexiunile de rețea</translation> @@ -3095,6 +3098,7 @@ <translation id="512903556749061217">conectat</translation> <translation id="5129301143853688736">Conexiunea la acest site nu este privată. Atacatorii ar putea încerca să-ți fure informațiile (de exemplu, fotografii, parole, mesaje și carduri de credit) de pe <ph name="DOMAIN" />.</translation> <translation id="5129662217315786329">Poloneză</translation> +<translation id="5131347545782851480">Documente PDF</translation> <translation id="5134856901811723984">Designul material în interfața de utilizare a sistemului de operare Chrome</translation> <translation id="5135533361271311778">Elementul de marcaj nu a putut fi creat.</translation> <translation id="5136529877787728692">F7</translation> @@ -3263,6 +3267,7 @@ <translation id="5328031682234198929">8</translation> <translation id="5329858601952122676">&Șterge</translation> <translation id="5330145655348521461">Aceste fișiere au fost deschise pe alt desktop. Pentru a le vedea, treceți la <ph name="USER_NAME" /> (<ph name="MAIL_ADDRESS" />).</translation> +<translation id="5330512191124428349">Obține informații</translation> <translation id="5332624210073556029">Fus orar:</translation> <translation id="5333807720589685258">Cardul SIM va fi dezactivat definitiv dacă nu vei introduce cheia corectă de deblocare a codului PIN.</translation> @@ -3695,7 +3700,6 @@ <translation id="5892507820957994680">Suprascrie lista de redare software integrată și activează accelerarea cu GPU pentru configurațiile de sistem neacceptate.</translation> <translation id="5895138241574237353">Reîncepe</translation> <translation id="5895187275912066135">Emis la</translation> -<translation id="5898154795085152510">Serverul a afișat un certificat client nevalid. Eroare <ph name="ERROR_NUMBER" /> (<ph name="ERROR_NAME" />).</translation> <translation id="5900302528761731119">Fotografie de profil Google</translation> <translation id="590253956165195626">Oferă traducerea paginilor care nu sunt într-o limbă pe care o cunosc.</translation> <translation id="5904093760909470684">Configurare proxy</translation> @@ -3750,12 +3754,14 @@ <translation id="5984222099446776634">Recently visited (Vizitate recent)</translation> <translation id="5984814259619230127">Descoperirea prin Bluetooth Low Energy pentru Smart Lock</translation> <translation id="5986245990306121338">Dacă este activat, va fi afișat un comutator de file, chiar dacă opțiunea „îmbină filele și aplicațiile” este activată în setări.</translation> +<translation id="5989712527536636369"><ph name="BEGIN_PARAGRAPH1" />Acestea sunt informații generale despre dispozitiv și despre cum îl folosești, cum ar fi nivelul bateriei, cât de des folosești aplicațiile, calitatea și durata conexiunilor la rețea (cum ar fi Wi-Fi și Bluetooth) și rapoartele de blocare atunci când lucrurile nu funcționează așa cum ar trebui. Acestea vor fi folosite pentru îmbunătățirea produselor și serviciilor Google în beneficiul tuturor. Unele informații agregate vor ajuta partenerii, cum ar fi dezvoltatorii Android, să își îmbunătățească aplicațiile și produsele.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Poți să activezi sau să dezactivezi oricând această opțiune din Setările aplicațiilor Android. Astfel, nu va fi afectată capacitatea dispozitivului de a trimite informațiile necesare pentru a primi servicii esențiale, cum ar fi actualizările de sistem și de securitate. <ph name="END_PARAGRAPH2" /></translation> <translation id="5990198433782424697">Extensii pentru adresele URL chrome://</translation> <translation id="5990814808592353318">Generarea manuală a parolelor.</translation> <translation id="5991049340509704927">Mărește</translation> <translation id="5991774521050363748">Activează aspectele personalizate pentru Notificările web. Acestea vor avea îmbunătățiri subtile ale aspectului care nu ar fi posibile altfel.</translation> <translation id="5993332328670040093">Utilizarea datelor nu va mai fi măsurată.</translation> -<translation id="5998167623928667649">Rulează tot conținutul Flash când setarea pentru Flash este setată la „permite”</translation> +<translation id="5998167623928667649">Rulează tot conținutul Flash când setarea pentru Flash este „permite”</translation> <translation id="6003177993629630467">Este posibil ca <ph name="PRODUCT_NAME" /> să nu se poată menține la zi.</translation> <translation id="6003294706906016758">Activează cadrul cu stilul aplicațiilor web pentru aplicațiile găzduite</translation> <translation id="600424552813877586">Aplicație nevalidă.</translation> @@ -3763,6 +3769,7 @@ <translation id="6005695835120147974">Router media</translation> <translation id="6007237601604674381">Mutarea nu a reușit. <ph name="ERROR_MESSAGE" /></translation> <translation id="6008241731410823808">Trimite comenzi ping de verificare a hyperlinkurilor.</translation> +<translation id="6011449291337289699">Șterge datele site-ului</translation> <translation id="6015796118275082299">An</translation> <translation id="6016551720757758985">Confirmă Powerwash cu revenire la versiunea anterioară</translation> <translation id="6016809788585079594">Rostește „Ok Google” încă o dată</translation> @@ -3952,7 +3959,6 @@ <translation id="6276301056778294989">Asigură-te că telefonul afișează același cod.</translation> <translation id="6277105963844135994">Conectarea la rețea a expirat</translation> <translation id="6277518330158259200">F&aceți o captură de ecran</translation> -<translation id="6278428485366576908">Temă</translation> <translation id="6279183038361895380">Apasă pe |<ph name="ACCELERATOR" />| pentru a fi afișat cursorul</translation> <translation id="6280215091796946657">Conectează-te cu alt cont</translation> <translation id="6280912520669706465">ARC</translation> @@ -4204,6 +4210,7 @@ <translation id="6607272825297743757">Informațiile fișierului</translation> <translation id="6607831829715835317">Mai multe instru&mente</translation> <translation id="6608140561353073361">Toate cookie-urile și toate datele privind site-urile...</translation> +<translation id="6610183966322615106">Eroare la adăugarea imprimantei</translation> <translation id="6610610633807698299">Introduceți adresa URL...</translation> <translation id="6612358246767739896">Conținut protejat</translation> <translation id="6615455863669487791">Afișați</translation> @@ -4267,7 +4274,6 @@ <translation id="6708242697268981054">Origine:</translation> <translation id="6709357832553498500">Conectează-te folosind <ph name="EXTENSIONNAME" /></translation> <translation id="6710213216561001401">Înapoi</translation> -<translation id="6712158998835983046">Afișează-le pe toate, animate</translation> <translation id="6718273304615422081">Se arhivează...</translation> <translation id="671928215901716392">Blocați ecranul</translation> <translation id="6721972322305477112">&Fișier</translation> @@ -4539,7 +4545,6 @@ <translation id="7088434364990739311">Nu a reușit pornirea verificării actualizării (cod de eroare <ph name="ERROR" />).</translation> <translation id="708856090370082727">Activează compatibilitatea pentru derularea suplimentară pentru tastatura de pe ecran. Dacă activezi acest marcaj, tastatura de pe ecran va redimensiona numai spațiul vizibil.</translation> <translation id="7088674813905715446">Administratorul a trecut acest dispozitiv într-o stare de acces revocat. Pentru a-l activa pentru înscriere, solicitați administratorului să-l treacă într-o stare de așteptare.</translation> -<translation id="7089609847854449639">Managerul stocării</translation> <translation id="708969677220991657">Permite solicitările către gazda locală prin HTTPS chiar dacă se prezintă un certificat nevalid.</translation> <translation id="7092106376816104">Excepții privind ferestrele de tip pop-up</translation> <translation id="7093866338626856921">Fă schimb de date cu dispozitivele numite: <ph name="HOSTNAMES" /></translation> @@ -4579,7 +4584,7 @@ <translation id="715118844758971915">Imprimante clasice</translation> <translation id="7154130902455071009">Schimbați pagina de start la: <ph name="START_PAGE" /></translation> <translation id="7155171745945906037">Fotografie existentă din camera foto sau din fișier</translation> -<translation id="715568033737470079">Specifică pluginurile PPAPI care vor rula în cadrul politicii privind mediul de testare pentru blocarea Win32k (numai pentru Windows 10 sau versiuni ulterioare).</translation> +<translation id="7155226869555939647">Deschide întotdeauna linkurile pentru <ph name="APPLICATION" /></translation> <translation id="7156235233373189579">Acest fișier este creat pentru un computer care folosește software Windows. Nu este compatibil cu dispozitivul tău, care rulează sistemul de operare Chrome. Caută o aplicație adecvată similară în <ph name="BEGIN_LINK" />Magazinul web Chrome<ph name="END_LINK" />. <ph name="BEGIN_LINK_HELP" />Află mai multe<ph name="END_LINK_HELP" /></translation> <translation id="7157063064925785854">Dacă dați clic pe Continuați, sunteți de acord cu <ph name="LEGAL_DOC_LINK_TEXT_1" />, <ph name="LEGAL_DOC_LINK_TEXT_2" />, <ph name="LEGAL_DOC_LINK_TEXT_3" /> și <ph name="LEGAL_DOC_LINK_TEXT_4" />.</translation> <translation id="7158238151765743968">Încă se conectează la „<ph name="DEVICE_NAME" />”.</translation> @@ -4594,6 +4599,7 @@ <translation id="7175353351958621980">Încărcată de la:</translation> <translation id="7180611975245234373">Actualizați</translation> <translation id="7180865173735832675">Personalizează</translation> +<translation id="7181387261278441780">Șterge și resetează site-ul</translation> <translation id="7185078796915954712">TLS 1.3</translation> <translation id="7185690883425432021">Ascunde butoanele de închidere din filele inactive atunci când bara cu file se află în modul Stivuite.</translation> <translation id="7186088072322679094">Păstrează în bara de instrumente</translation> @@ -4626,7 +4632,6 @@ <translation id="7223775956298141902">Hopa... Nu aveți nicio extensie :-(</translation> <translation id="7224023051066864079">Mască de subrețea:</translation> <translation id="7225179976675429563">Lipsește tipul de rețea</translation> -<translation id="7230191962699768124">Afișează-le pe toate, neanimate</translation> <translation id="7230787553283372882">Personalizează dimensiunea textului</translation> <translation id="7231224339346098802">Precizează un număr de exemplare pentru printare (unul sau mai multe).</translation> <translation id="7238585580608191973">Amprentă digitală SHA-256</translation> @@ -4758,7 +4763,6 @@ <translation id="7409233648990234464">Relansați și porniți Powerwash</translation> <translation id="7409836189476010449">să ruleze Flash</translation> <translation id="7410344089573941623">Întreabă dacă <ph name="HOST" /> solicită acces la camera și microfonul meu</translation> -<translation id="7411343637221933631">{NUM_COOKIES,plural, =1{1 de pe acest site}few{# de pe acest site}other{# de pe acest site}}</translation> <translation id="7412226954991670867">Memorie GPU</translation> <translation id="7416362041876611053">Eroare de rețea necunoscută.</translation> <translation id="7417453074306512035">Tastatură etiopiană</translation> @@ -4880,6 +4884,7 @@ <translation id="756445078718366910">Deschide fereastra de browser</translation> <translation id="7564847347806291057">Oprește procesul</translation> <translation id="7566723889363720618">F12</translation> +<translation id="7567314848159753396">Cookie: <ph name="NAME" /></translation> <translation id="756809126120519699">Datele Chrome au fost șterse</translation> <translation id="7568790562536448087">Se actualizează</translation> <translation id="7573172247376861652">Încărcarea bateriei</translation> @@ -4920,6 +4925,7 @@ <translation id="7626009897377900107">Generarea parolelor</translation> <translation id="7627262197844840899">Acest site nu acceptă MasterCard.</translation> <translation id="7627790789328695202">Hopa, <ph name="FILE_NAME" /> există deja. Redenumiți și încercați din nou.</translation> +<translation id="7628127343934101653">Deschide fișierele PDF în aplicația prestabilită de vizualizare a fișierelor PDF.</translation> <translation id="762917759028004464">Browserul prestabilit este în prezent <ph name="BROWSER_NAME" />.</translation> <translation id="7629536005696009600">Permite completarea datelor de conectare stocate pentru aplicațiile Android pe site-urile aferente.</translation> <translation id="7629827748548208700">Fila: <ph name="TAB_NAME" /></translation> @@ -5148,6 +5154,7 @@ <translation id="7957513156576779045">Activează Bluetooth pentru a permite asocierea</translation> <translation id="7957615753207896812">Deschide setările dispozitivului privind tastatura</translation> <translation id="7959074893852789871">Fișierul a conținut mai multe certificate, unele dintre acestea nefiind importate:</translation> +<translation id="7959700692661109221"><ph name="BEGIN_PARAGRAPH" />Serviciul de localizare Google folosește surse cum ar fi rețeaua Wi-Fi pentru a estima mai rapid și mai precis locația dispozitivului. Când activezi serviciile de localizare Google, dispozitivul intră într-un mod care folosește Wi-Fi pentru a oferi informații despre locație. Poți să dezactivezi oricând această opțiune din setările privind locația.<ph name="END_PARAGRAPH" /></translation> <translation id="7961015016161918242">Niciodată</translation> <translation id="7964089325405904043">Importul și exportul parolelor</translation> <translation id="7965010376480416255">Memorie comună</translation> @@ -5298,6 +5305,7 @@ <translation id="8146793085009540321">Conectarea nu a reușit. Contactează administratorul sau încearcă din nou.</translation> <translation id="8148264977957212129">Metoda de introducere a textului Pinyin</translation> <translation id="8148913456785123871">Afișează carduri Google Now în lansator</translation> +<translation id="8150391391298684512">Dezactivează API-ul Windows Runtime MIDI</translation> <translation id="8151185429379586178">Instrumente dezvoltator</translation> <translation id="8151638057146502721">Configurați</translation> <translation id="8151639108075998630">Activați navigarea în calitate de invitat</translation> @@ -5578,6 +5586,7 @@ <translation id="8532294913309524834">Ordonează limbile pe baza preferințelor tale.</translation> <translation id="8535005006684281994">Adresă URL de reînnoire a certificatului Netscape</translation> <translation id="8539727552378197395">Nu (numai Http)</translation> +<translation id="8541084862688000575">Încarcă automat aplicațiile Android</translation> <translation id="8543181531796978784">Poți să <ph name="BEGIN_ERROR_LINK" />raportezi o problemă privind detectarea<ph name="END_ERROR_LINK" /> sau, dacă îți asumi riscurile de securitate, poți să <ph name="BEGIN_LINK" />accesezi acest site nesigur<ph name="END_LINK" />.</translation> <translation id="8545107379349809705">Ascundeți informațiile...</translation> <translation id="8545211332741562162">Activați utilizarea funcțiilor JavaScript experimentale în paginile web.</translation> @@ -5605,7 +5614,6 @@ <translation id="8569764466147087991">Selectează un fișier pentru a-l deschide</translation> <translation id="8571032220281885258">Când rostiți „Ok Google”, Chrome va căuta ceea ce rostiți în continuare.</translation> <translation id="8571108619753148184">Server 4</translation> -<translation id="8572832761467613633">Numai pentru Flash</translation> <translation id="8572981282494768930">Nu permite site-urilor să acceseze camera și microfonul</translation> <translation id="8574234089711453001">Permite afișarea unui buton de descărcare când deschizi o pagină cu o adresă URL media.</translation> <translation id="857779305329188634">Activați compatibilitatea cu protocolul experimental QUIC.</translation> @@ -5627,6 +5635,7 @@ <translation id="8600929685092827187">Pachete de activare</translation> <translation id="8601206103050338563">Autentificare client TLS WWW</translation> <translation id="8602851771975208551">Un alt program de pe computerul dvs. a adăugat o aplicație care poate schimba modul în care funcționează Chrome.</translation> +<translation id="8603912787021349466">Permite aplicațiilor Android să pornească automat după conectare.</translation> <translation id="8605428685123651449">Memorie SQLite</translation> <translation id="8605503133013456784">Deconectarea de la și anularea împerecherii cu „<ph name="DEVICE_NAME" />” a eșuat.</translation> <translation id="8606726445206553943">Folosească dispozitive MIDI</translation> @@ -5979,6 +5988,7 @@ <translation id="9053965862400494292">A apărut o eroare la configurarea sincronizării.</translation> <translation id="9056034633062863292">Actualizarea Chromeboxului</translation> <translation id="9056810968620647706">Nu s-a găsit nicio potrivire.</translation> +<translation id="9057119625587205566">Nu există imprimante în apropiere</translation> <translation id="9059868303873565140">Meniu stare</translation> <translation id="9064142312330104323">Fotografie de profil Google (se încarcă)</translation> <translation id="9064275926664971810">Activează completarea automată pentru a completa formularele cu un singur clic</translation> @@ -5989,6 +5999,7 @@ <translation id="9067401056540256169">Din cauza acestui marcaj, Chrome devine nesigur. Folosiți-l numai dacă îi înțelegeți efectele. Rețineți că acest marcaj poate fi eliminat fără notificare. Dacă este activat, cadrele provenite de la https pot să folosească WebSockets cu o adresă URL nesigură (ws://).</translation> <translation id="9068931793451030927">Calea:</translation> <translation id="9070219033670098627">Comută la altă persoană</translation> +<translation id="9070940116164932228">Limitează temporizatoarele din fundal cu consum ridicat</translation> <translation id="907148966137935206">Nu permite niciunui site să afișeze ferestre pop-up (recomandat)</translation> <translation id="9072550133391925347"><ph name="PASSWORD_MANAGER_BRAND" /> te conectează automat pe site-urile și la aplicațiile eligibile cu parolele pe care le-ai salvat.</translation> <translation id="9073281213608662541">PAP</translation> @@ -6022,6 +6033,7 @@ <translation id="9112614144067920641">Alege un cod PIN nou.</translation> <translation id="9112748030372401671">Schimbați imaginea de fundal</translation> <translation id="9112987648460918699">Caută...</translation> +<translation id="9114663181201435112">Conectează-te cu ușurință</translation> <translation id="9115487443206954631">Gestionează dispozitivele Cast</translation> <translation id="9115675100829699941">&Marcaje</translation> <translation id="9121814364785106365">Deschide ca filă fixată</translation> @@ -6116,7 +6128,6 @@ <translation id="952992212772159698">Neactivat</translation> <translation id="960719561871045870">Cod operator</translation> <translation id="960987915827980018">A mai rămas aproape 1 oră</translation> -<translation id="962778376131245616">Afișează-le numai pe cele nesecurizate, animate</translation> <translation id="96421021576709873">Rețea Wi-Fi</translation> <translation id="965490406356730238">Activează decodificarea mjpeg cu accelerare hardware pentru cadrul capturat, unde este disponibilă.</translation> <translation id="968174221497644223">Memoria cache a aplicației</translation>
diff --git a/chrome/app/resources/generated_resources_ru.xtb b/chrome/app/resources/generated_resources_ru.xtb index 58f0fa0..1bfb178 100644 --- a/chrome/app/resources/generated_resources_ru.xtb +++ b/chrome/app/resources/generated_resources_ru.xtb
@@ -18,7 +18,6 @@ <translation id="1029317248976101138">Масштаб</translation> <translation id="1029595648591494741">Запустить приложение "<ph name="EXTENSION_NAME" />"?</translation> <translation id="1031362278801463162">Загрузка данных для предварительного просмотра</translation> -<translation id="1031460590482534116">При попытке сохранить клиентский сертификат произошла ошибка: <ph name="ERROR_NUMBER" /> (<ph name="ERROR_NAME" />).</translation> <translation id="1031573127485938293">Спрашивать (управляется политикой)</translation> <translation id="103279545524624934">Чтобы запускать Android-приложения, освободите пространство на диске.</translation> <translation id="1033780634303702874">Доступ к последовательным устройствам</translation> @@ -101,6 +100,7 @@ <translation id="1128591060186966949">Изменить поисковую систему</translation> <translation id="1128987120443782698">Объем запоминающего устройства – <ph name="DEVICE_CAPACITY" />. Вставьте SD-карту или USB-накопитель объемом не менее 4 ГБ.</translation> <translation id="1137135726305341424">Состоялось событие DOMContentLoaded, а загрузка всех ресурсов началась до DOMContentLoaded (для основного фрейма и его окон iframe).</translation> +<translation id="1138663153846032155">Использовать HTML вместо Flash</translation> <translation id="1140351953533677694">Доступ к Bluetooth- и последовательным устройствам</translation> <translation id="114140604515785785">Корневой каталог расширения:</translation> <translation id="1143142264369994168">Подписчик сертификата</translation> @@ -252,6 +252,7 @@ <translation id="1351692861129622852">Импорт файлов (<ph name="FILE_COUNT" />)...</translation> <translation id="1352103415082130575">Тайская раскладка (Pattachote)</translation> <translation id="1353686479385938207"><ph name="NETWORK_NAME" /> (<ph name="PROVIDER_NAME" />)</translation> +<translation id="1353946958707294039">Менеджер хранилища (Material Design)</translation> <translation id="1353966721814789986">Страницы при запуске</translation> <translation id="1354868058853714482">Текущая версия Adobe Reader устарела. Ее использование может быть небезопасным.</translation> <translation id="1355408554203439639">Растеризатор 3D-программ</translation> @@ -422,7 +423,6 @@ <translation id="1533920822694388968">Выравнивание рамки экрана</translation> <translation id="15373452373711364">Большой курсор мыши</translation> <translation id="1543284117603151572">Импортированные из Microsoft Edge</translation> -<translation id="1544350195767834591">{NUM_COOKIES,plural, =1{1 на других сайтах}one{# на других сайтах}few{# на других сайтах}many{# на других сайтах}other{# на других сайтах}}</translation> <translation id="1545177026077493356">Автоматическое включение режима киоска</translation> <translation id="1545786162090505744">Ссылка с параметром %s вместо запроса</translation> <translation id="1546280085599573572">Расширение изменило страницу, которая открывается при нажатии кнопки "Главная страница".</translation> @@ -446,7 +446,6 @@ <translation id="1559235587769913376">Ввод символов Unicode</translation> <translation id="1561092721008294962">HarfBuzz для текста пользовательского интерфейса</translation> <translation id="1566049601598938765">Сайт</translation> -<translation id="1566958206723629112">Flash и PDF</translation> <translation id="1567723158593978621">Если этот параметр включен, входить в браузер нужно через GAIA с использованием пароля.</translation> <translation id="1567993339577891801">Консоль JavaScript</translation> <translation id="1568323446248056064">Открыть настройки экрана</translation> @@ -576,7 +575,6 @@ <translation id="1723940674997333416">Разрешить незащищенные соединения WebSocket, если источник подключен через https</translation> <translation id="1725149567830788547">Показать &управление</translation> <translation id="172612876728038702">Выполняется настройка доверенного платформенного модуля. Это может занять несколько минут.</translation> -<translation id="1727135806684246609">Информация о безопасности сайта</translation> <translation id="1729533290416704613">Кроме того, расширение изменило поисковую систему, используемую по умолчанию при вводе запроса в омнибокс.</translation> <translation id="1731346223650886555">Точка с запятой</translation> <translation id="1731589410171062430">Всего: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /> (<ph name="PAGE_OR_PAGES_LABEL" />: <ph name="NUMBER_OF_PAGES" />)</translation> @@ -872,6 +870,7 @@ <translation id="218492098606937156">Включить события сенсорного ввода</translation> <translation id="2187317261103489799">Определять (по умолчанию)</translation> <translation id="2187895286714876935">Ошибка при импорте сертификата сервера</translation> +<translation id="2188881192257509750">Открыть приложение "<ph name="APPLICATION" />"</translation> <translation id="2190069059097339078">Получение параметров доступа по Wi-Fi</translation> <translation id="219008588003277019">Модуль Native Client: <ph name="NEXE_NAME" /></translation> <translation id="2190355936436201913">(пусто)</translation> @@ -990,6 +989,7 @@ <translation id="2326606747676847821">Режим инкогнито</translation> <translation id="2326931316514688470">Пере&загрузить приложение</translation> <translation id="2327492829706409234">Включить приложение</translation> +<translation id="2328054044222305089">Все данные сайта <ph name="SITE" /> будут удалены с устройства, а его разрешения – сброшены. Продолжить?</translation> <translation id="2329597144923131178">Войдите, чтобы синхронизировать закладки, пароли, историю и т. д. на всех устройствах.</translation> <translation id="2332131598580221120">Открыть в Интернет-магазине</translation> <translation id="2332742915001411729">Масштаб по умолчанию</translation> @@ -1267,7 +1267,6 @@ <translation id="2675358154061544447">Экспериментальная функция. Позволяет визуализировать межсайтовые окна iframe в отдельных процессах. В этом режиме документы будут визуализироваться в одном процессе только в том случае, если они относятся к одному сайту.</translation> <translation id="2676946222714718093">Устройство:</translation> <translation id="2678063897982469759">Включить снова</translation> -<translation id="2678246812096664977">Все плагины</translation> <translation id="2679385451463308372">Показывать системное диалоговое окно при печати...</translation> <translation id="2680208403056680091">Ваше интернет-подключение уже не только ваше</translation> <translation id="268053382412112343">&История</translation> @@ -1441,7 +1440,6 @@ <translation id="287286579981869940">Добавить сеть <ph name="PROVIDER_NAME" />...</translation> <translation id="2872961005593481000">Завершить работу</translation> <translation id="2875698561019555027">(страницы ошибок в Chrome)</translation> -<translation id="2879560882721503072">Сертификат клиента, выданный <ph name="ISSUER" />, успешно сохранен.</translation> <translation id="288024221176729610">Чешский</translation> <translation id="288042212351694283">С доступом к устройствам Universal 2nd Factor</translation> <translation id="2881966438216424900">Последнее время доступа:</translation> @@ -1590,6 +1588,7 @@ <translation id="3057861065630527966">Создать резервные копии фото и видео</translation> <translation id="3058212636943679650">Для восстановления операционной системы вам понадобится SD-карта или USB-накопитель.</translation> <translation id="305932878998873762">Simple Cache для HTTP – это новая система кеширования, в которой место на диске выделяется средствами файловой системы.</translation> +<translation id="3060251871394327123">Все данные сайта <ph name="SITE" /> будут удалены с устройства. Продолжить?</translation> <translation id="3061650404498811439">Доступ к смайликам, а также к рукописному и голосовому вводу из меню настроек IME.</translation> <translation id="3062606427884046423">Разрешает использование уведомлений MediaStyle (Android) для мультимедийных уведомлений Chrome.</translation> <translation id="3063844757726132584">На этой панели запуска доступны все ваши приложения. Воспользуйтесь ей, когда захотите поиграть, пообщаться в видеочате, послушать музыку, открыть документ или скачать другие приложения.</translation> @@ -1639,6 +1638,7 @@ <translation id="3123569374670379335">(контролируемый)</translation> <translation id="3124111068741548686">USER-дескрипторы</translation> <translation id="3126026824346185272">Ctrl</translation> +<translation id="3127156390846601284">Все данные указанных сайтов будут удалены с устройства. Продолжить?</translation> <translation id="312759608736432009">Производитель устройства:</translation> <translation id="3127919023693423797">Проверка подлинности...</translation> <translation id="3128230619496333808">Вкладка 6</translation> @@ -1737,7 +1737,6 @@ <translation id="3264544094376351444">Шрифты без засечек</translation> <translation id="3264547943200567728">Не удалось настроить сеть Chromebox</translation> <translation id="3265459715026181080">Закрыть окно</translation> -<translation id="3267271790328635957">Только PDF</translation> <translation id="3267726687589094446">По-прежнему разрешать автоматическое скачивание нескольких файлов</translation> <translation id="3267998849713137817">Измененное время</translation> <translation id="3268451620468152448">Вкладки</translation> @@ -1983,6 +1982,7 @@ <translation id="3574210789297084292">войти</translation> <translation id="3574305903863751447"><ph name="CITY" />, <ph name="STATE" /> <ph name="COUNTRY" /></translation> <translation id="357479282490346887">Литовский</translation> +<translation id="3575927481544652747">Отключить Windows Runtime MIDI API для WebMIDI (используется по умолчанию в Windows 10 и более поздних версий)</translation> <translation id="3576324189521867626">Установлено</translation> <translation id="3578331450833904042">По умолчанию (передавать всё)</translation> <translation id="3578594933904494462">К контенту на этой вкладке открыт общий доступ</translation> @@ -2036,8 +2036,6 @@ <translation id="3627320433825461852">Осталось меньше минуты</translation> <translation id="3627588569887975815">Открыть ссылку в окне в режиме &инкогнито</translation> <translation id="3627671146180677314">Время обновления сертификата Netscape</translation> -<translation id="3629326610814700057">Включает инструмент управления локальным хранилищем.</translation> -<translation id="3630337581925712713"><ph name="PERMISSION_TYPE_LABEL" />:</translation> <translation id="3631337165634322335">Следующие исключения действуют только в текущем сеансе инкогнито.</translation> <translation id="3633586230741134985">Настройки панели запуска</translation> <translation id="3633997706330212530">Если требуется, эти службы можно отключить.</translation> @@ -2060,7 +2058,8 @@ <translation id="3654045516529121250">Чтение настроек специальных возможностей</translation> <translation id="3654092442379740616">Ошибка синхронизации. Программа <ph name="PRODUCT_NAME" /> устарела, обновите ее.</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{С постоянным доступом к 1 файлу.}one{С постоянным доступом к # файлу.}few{С постоянным доступом к # файлам.}many{С постоянным доступом к # файлам.}other{С постоянным доступом к # файла.}}</translation> -<translation id="3657468915905674858">Использовать закрытую среду Win32k для плагинов PPAPI</translation> +<translation id="365793796291733849"><ph name="BEGIN_PARAGRAPH1" />Если вы включите автоматическое резервное копирование, данные устройства и приложений будут периодически сохраняться в папке на Google Диске, доступной только вам. Обратите внимание, что данные приложений могут включать конфиденциальную информацию: контакты, сообщения, фотографии и другие файлы, сохраненные приложением на устройстве согласно настройкам разработчика.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Резервная копия данных не займет места на Google Диске. Большие файлы и те, которые разработчики запретили копировать, сохраняться не будут.<ph name="END_PARAGRAPH2" /></translation> <translation id="3660234220361471169">Недоверенный</translation> <translation id="3665589677786828986">Некоторые настройки Chrome недавно были изменены посторонней программой. Браузер восстановил их значения по умолчанию.</translation> <translation id="3665842570601375360">Безопасность:</translation> @@ -2115,6 +2114,7 @@ <translation id="3733127536501031542">SSL-сервер с повышением</translation> <translation id="3736520371357197498">Если вы готовы подвергнуть риску ваши личные данные, вы можете <ph name="BEGIN_LINK" />перейти на зараженный сайт<ph name="END_LINK" />, не дожидаясь удаления вредоносного ПО.</translation> <translation id="3738924763801731196"><ph name="OID" />:</translation> +<translation id="3739254215541673094">Открыть приложение "<ph name="APPLICATION" />"?</translation> <translation id="3739798227959604811">Задержка перед повторным вводом:</translation> <translation id="3741158646617793859"><ph name="DEVICE_NAME" /> появится в консоли администратора</translation> <translation id="3741243925913727067">Сохранение фото и видео с вашего устройства на Google Диске</translation> @@ -2353,7 +2353,6 @@ <translation id="4058793769387728514">Проверить документ</translation> <translation id="4059285154003114015">П&ечать фрейма...</translation> <translation id="406070391919917862">Фоновые приложения</translation> -<translation id="4061502419206152498">Показывать только небезопасный контент, без анимации</translation> <translation id="4062251648694601778">Надеемся, вам понравится работать на вашем новом устройстве <ph name="SHORT_PRODUCT_NAME" />! Если у вас возникнут вопросы, нажмите "?" на панели состояния, чтобы посмотреть справку.</translation> <translation id="4065876735068446555">Возможно, вам нужно перейти на страницу входа сети <ph name="NETWORK_ID" />.</translation> <translation id="4068506536726151626">Эта страница содержит элементы со следующих сайтов, которые отслеживают ваше местоположение:</translation> @@ -2392,7 +2391,6 @@ <translation id="4101878899871018532">Менеджер паролей не будет предлагать сохранить учетные данные, используемые для синхронизации.</translation> <translation id="410351446219883937">Автовоспроизведение</translation> <translation id="4104163789986725820">Э&кспорт...</translation> -<translation id="4105523032910086267">Настройка анимации и доступности информации о безопасности в Material Design</translation> <translation id="4105563239298244027">1 ТБ пространства в Google Диске бесплатно</translation> <translation id="4109135793348361820">Перенести окно на рабочий стол пользователя <ph name="USER_NAME" /> (<ph name="USER_EMAIL" />)</translation> <translation id="4110342520124362335">Файлы cookie с сайта <ph name="DOMAIN" /> заблокированы.</translation> @@ -2443,6 +2441,7 @@ <translation id="418179967336296930">Русская раскладка (фонетическая – YaZHert)</translation> <translation id="4181841719683918333">Языки</translation> <translation id="4187248015940562149">Включает Web Bluetooth и разрешает веб-сайтам подключаться к Bluetooth-устройствам, а также управлять ими.</translation> +<translation id="4188447344915957833">Включить инструмент управления хранилищем в настройках Material Design</translation> <translation id="4189406272289638749">Этот параметр управляется расширением <b><ph name="EXTENSION_NAME" /></b>.</translation> <translation id="4193154014135846272">Документ Google</translation> <translation id="4193182321948161343">Включение диспетчера пользователей Material Design</translation> @@ -2650,6 +2649,7 @@ <translation id="4508765956121923607">Исходный код страницы</translation> <translation id="4509017836361568632">Удалить фото</translation> <translation id="4509345063551561634">Расположение:</translation> +<translation id="4513946894732546136">Отзыв</translation> <translation id="4514542542275172126">Создать контролируемый профиль.</translation> <translation id="4514914692061505365">Включает принудительное использование быстрого преобразователя Subzero из PNaCl для всех файлов PEXE.</translation> <translation id="451515744433878153">Удалить</translation> @@ -2748,6 +2748,7 @@ <translation id="4656293982926141856">С компьютера</translation> <translation id="4656631038341342120">Включить оболочку виртуальной реальности на устройстве (если доступна).</translation> <translation id="4657031070957997341">Разрешить плагины на сайте <ph name="HOST" /></translation> +<translation id="466008749075469935">Разрешить вмешательство с целью ограничить использование процессором фоновых таймеров до 1%</translation> <translation id="4663254525753315077">Размещение прокручиваемых элементов в составном слое (по возможности) для ускорения прокрутки.</translation> <translation id="4664482161435122549">Ошибка экспорта PKCS #12</translation> <translation id="4665014895760275686">Производитель</translation> @@ -2816,6 +2817,7 @@ <translation id="4749157430980974800">Грузинская раскладка клавиатуры</translation> <translation id="4750394297954878236">Предложения</translation> <translation id="475088594373173692">Первый пользователь</translation> +<translation id="4750892496809949692">Убрать Flash из списка плагинов и выбирать HTML-контент</translation> <translation id="4750917950439032686">Информация, которую вы сообщаете этому сайту (например, пароли и номера банковских карт), защищена.</translation> <translation id="4753602155423695878">Анимация строки состояния при загрузке страницы телефона Android</translation> <translation id="4755240240651974342">Финская раскладка</translation> @@ -3090,6 +3092,7 @@ <translation id="5119450342834678097">Запрос версии сайта для планшетных ПК в меню настроек</translation> <translation id="5120068803556741301">Сторонние способы ввода</translation> <translation id="5120421890733714118">Доверять этому сертификату при идентификации сайтов.</translation> +<translation id="5120516977819314347">Неверный PIN-код или пароль</translation> <translation id="5121130586824819730">Недостаточно места на диске. Выберите другой каталог или освободите место на диске.</translation> <translation id="5125751979347152379">Недопустимый URL.</translation> <translation id="5127881134400491887">Управление сетевыми подключениями</translation> @@ -3097,6 +3100,7 @@ <translation id="512903556749061217">подключено</translation> <translation id="5129301143853688736">Подключение не защищено. Злоумышленники могут пытаться похитить ваши данные (например, пароли, сообщения или номера банковских карт) в домене <ph name="DOMAIN" />.</translation> <translation id="5129662217315786329">Польский</translation> +<translation id="5131347545782851480">PDF-файлы</translation> <translation id="5134856901811723984">Material Design в системном интерфейсе Chrome OS</translation> <translation id="5135533361271311778">Не удалось создать закладку.</translation> <translation id="5136529877787728692">F7</translation> @@ -3265,6 +3269,7 @@ <translation id="5328031682234198929">8</translation> <translation id="5329858601952122676">&Удалить</translation> <translation id="5330145655348521461">Эти файлы открыты на другом рабочем столе. Чтобы увидеть их, переключитесь на профиль пользователя <ph name="USER_NAME" /> (<ph name="MAIL_ADDRESS" />).</translation> +<translation id="5330512191124428349">Сведения о файле</translation> <translation id="5332624210073556029">Часовой пояс:</translation> <translation id="5333807720589685258">Если вы введете неправильный PUK-код, SIM-карта будет окончательно заблокирована.</translation> @@ -3697,7 +3702,6 @@ <translation id="5892507820957994680">Переопределяет встроенный список программного рендеринга и активирует графический ускоритель на неподдерживаемых системах.</translation> <translation id="5895138241574237353">Перезапустить</translation> <translation id="5895187275912066135">Дата выдачи</translation> -<translation id="5898154795085152510">Сервер возвратил недействительный клиентский сертификат. Ошибка <ph name="ERROR_NUMBER" /> (<ph name="ERROR_NAME" />).</translation> <translation id="5900302528761731119">Фотография профиля Google</translation> <translation id="590253956165195626">Предлагать перевод страниц, если их язык отличается от используемого в браузере.</translation> <translation id="5904093760909470684">Основные</translation> @@ -3752,6 +3756,8 @@ <translation id="5984222099446776634">Недавно посещенные страницы</translation> <translation id="5984814259619230127">Обнаружение устройств Smart Lock с помощью Bluetooth с низким энергопотреблением</translation> <translation id="5986245990306121338">Показывать переключатель вкладок, даже если в настройках включен режим "Вкладки в списке приложений"</translation> +<translation id="5989712527536636369"><ph name="BEGIN_PARAGRAPH1" />Мы будем получать общие сведения о работе устройства, которые помогут нам улучшить сервисы Google. Это могут быть, например, сведения об уровне заряда батареи, частоте использования приложений, качестве сигнала и продолжительности работы сетевых подключений (Wi-Fi или Bluetooth), а также отчеты о сбоях. Некоторыми данными смогут пользоваться наши партнеры, например разработчики Android, для совершенствования своих сервисов.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Вы сможете в любой момент включить или отключить функцию в настройках приложений Android. Это не повлияет на обновление и безопасность системы.<ph name="END_PARAGRAPH2" /></translation> <translation id="5990198433782424697">Запуск расширений на URL типа "chrome://"</translation> <translation id="5990814808592353318">Создание паролей вручную.</translation> <translation id="5991049340509704927">Увеличение</translation> @@ -3765,6 +3771,7 @@ <translation id="6005695835120147974">Медиамаршрутизатор</translation> <translation id="6007237601604674381">Не удалось выполнить перемещение. <ph name="ERROR_MESSAGE" /></translation> <translation id="6008241731410823808">Отправлять запросы для проверки гиперссылок.</translation> +<translation id="6011449291337289699">Удаление данных сайтов</translation> <translation id="6015796118275082299">Год</translation> <translation id="6016551720757758985">Подтверждение Powerwash и возврата к предыдущей версии</translation> <translation id="6016809788585079594">Скажите "О'кей, Google" последний раз</translation> @@ -3954,7 +3961,6 @@ <translation id="6276301056778294989">Убедитесь, что на устройстве показан тот же код.</translation> <translation id="6277105963844135994">Время ожидания сети истекло</translation> <translation id="6277518330158259200">С&делать снимок экрана</translation> -<translation id="6278428485366576908">Тема</translation> <translation id="6279183038361895380">Чтобы показать курсор, нажмите |<ph name="ACCELERATOR" />|</translation> <translation id="6280215091796946657">Войти в другой аккаунт</translation> <translation id="6280912520669706465">ARC</translation> @@ -4206,6 +4212,7 @@ <translation id="6607272825297743757">Информация о файле</translation> <translation id="6607831829715835317">Дополнительные инстру&менты</translation> <translation id="6608140561353073361">Все файлы cookie и данные сайтов...</translation> +<translation id="6610183966322615106">Не удалось добавить принтер</translation> <translation id="6610610633807698299">Введите URL</translation> <translation id="6612358246767739896">Защищенное содержание</translation> <translation id="6615455863669487791">Показать</translation> @@ -4269,7 +4276,6 @@ <translation id="6708242697268981054">Расположение:</translation> <translation id="6709357832553498500">Подключиться через <ph name="EXTENSIONNAME" /></translation> <translation id="6710213216561001401">Назад</translation> -<translation id="6712158998835983046">Показывать все, с анимацией</translation> <translation id="6718273304615422081">Архивирование…</translation> <translation id="671928215901716392">Блокировать экран</translation> <translation id="6721972322305477112">&Файл</translation> @@ -4542,7 +4548,6 @@ <translation id="7088434364990739311">Не удалось выполнить проверку обновлений (код ошибки: <ph name="ERROR" />).</translation> <translation id="708856090370082727">Если функция включена, то при достижении конца прокрутки будет меняться только размер области просмотра.</translation> <translation id="7088674813905715446">Это устройство отключено администратором. Чтобы можно было выполнить регистрацию, устройство следует перевести в состояние ожидания подключения.</translation> -<translation id="7089609847854449639">Менеджер хранилища</translation> <translation id="708969677220991657">Разрешать отправлять запросы на сервер localhost, даже если представлен недействительный сертификат.</translation> <translation id="7092106376816104">Исключения для всплывающих окон</translation> <translation id="7093866338626856921">Обмен данными с устройствами <ph name="HOSTNAMES" /></translation> @@ -4582,7 +4587,7 @@ <translation id="715118844758971915">Обычные принтеры</translation> <translation id="7154130902455071009">Смена стартовой страницы на <ph name="START_PAGE" /></translation> <translation id="7155171745945906037">Фото с камеры или из галереи</translation> -<translation id="715568033737470079">Позволяет указать плагины PPAPI, которые будут запускаться в закрытой для всех тестовой среде Win32k (только для Windows 10 и выше).</translation> +<translation id="7155226869555939647">Всегда открывать ссылки из приложения "<ph name="APPLICATION" />"</translation> <translation id="7156235233373189579">Этот файл предназначен для компьютера с ПО Windows. Он не совместим с устройством на базе Chrome OS. Найдите аналогичное приложение в <ph name="BEGIN_LINK" />Интернет-магазине Chrome<ph name="END_LINK" />. <ph name="BEGIN_LINK_HELP" />Подробнее...<ph name="END_LINK_HELP" /></translation> <translation id="7157063064925785854">Нажимая "Продолжить", вы принимаете следующие правила и условия: <ph name="LEGAL_DOC_LINK_TEXT_1" />, <ph name="LEGAL_DOC_LINK_TEXT_2" />, <ph name="LEGAL_DOC_LINK_TEXT_3" /> и <ph name="LEGAL_DOC_LINK_TEXT_4" />.</translation> <translation id="7158238151765743968">Выполняется подключение к устройству "<ph name="DEVICE_NAME" />".</translation> @@ -4597,6 +4602,7 @@ <translation id="7175353351958621980">Загружено из:</translation> <translation id="7180611975245234373">Обновить</translation> <translation id="7180865173735832675">Настроить</translation> +<translation id="7181387261278441780">Удаление данных и сброс разрешений сайтов</translation> <translation id="7185078796915954712">TLS 1.3</translation> <translation id="7185690883425432021">Скрывать значки для закрытия неактивных вкладок, расположенных каскадом.</translation> <translation id="7186088072322679094">Сохранить на Панели инструментов</translation> @@ -4629,7 +4635,6 @@ <translation id="7223775956298141902">Расширения отсутствуют</translation> <translation id="7224023051066864079">Маска подсети:</translation> <translation id="7225179976675429563">Не указан тип сети</translation> -<translation id="7230191962699768124">Показывать все, без анимации</translation> <translation id="7230787553283372882">Позволяет настроить размер текста</translation> <translation id="7231224339346098802">Укажите цифрами число копий для печати (1 или более).</translation> <translation id="7238585580608191973">Отпечаток SHA-256</translation> @@ -4761,7 +4766,6 @@ <translation id="7409233648990234464">Перезапустить и включить Powerwash</translation> <translation id="7409836189476010449">Запустить Flash</translation> <translation id="7410344089573941623">Запрашивать разрешение на доступ к камере и микрофону для сайта <ph name="HOST" /></translation> -<translation id="7411343637221933631">{NUM_COOKIES,plural, =1{1 на этом сайте}one{# на этом сайте}few{# на этом сайте}many{# на этом сайте}other{# на этом сайте}}</translation> <translation id="7412226954991670867">Память графического процессора</translation> <translation id="7416362041876611053">Неизвестная сетевая ошибка.</translation> <translation id="7417453074306512035">Эфиопская раскладка</translation> @@ -4883,6 +4887,7 @@ <translation id="756445078718366910">Открыть окно браузера</translation> <translation id="7564847347806291057">Завершить процесс</translation> <translation id="7566723889363720618">F12</translation> +<translation id="7567314848159753396">Файл cookie: <ph name="NAME" /></translation> <translation id="756809126120519699">Данные Chrome удалены</translation> <translation id="7568790562536448087">Обновление</translation> <translation id="7573172247376861652">Заряд батареи</translation> @@ -4923,6 +4928,7 @@ <translation id="7626009897377900107">Создание паролей</translation> <translation id="7627262197844840899">На этом сайте карты MasterCard не принимаются.</translation> <translation id="7627790789328695202">Файл "<ph name="FILE_NAME" />" уже существует. Задайте другое название и повторите попытку.</translation> +<translation id="7628127343934101653">Открывать PDF-файлы в приложении по умолчанию</translation> <translation id="762917759028004464">В настоящий момент браузером по умолчанию является <ph name="BROWSER_NAME" />.</translation> <translation id="7629536005696009600">Разрешает автоматически вводить учетные данные приложений Android на соответствующих веб-сайтах.</translation> <translation id="7629827748548208700">Вкладка: <ph name="TAB_NAME" /></translation> @@ -5151,6 +5157,7 @@ <translation id="7957513156576779045">Включить Bluetooth, чтобы разрешить соединение</translation> <translation id="7957615753207896812">Открыть настройки клавиатуры</translation> <translation id="7959074893852789871">Файл содержал несколько сертификатов, некоторые из которых не были импортированы:</translation> +<translation id="7959700692661109221"><ph name="BEGIN_PARAGRAPH" />Для более быстрого и точного определения вашего местоположения используются сигналы сетей Wi‑Fi. Этот режим активируется, когда вы включаете службы геопозиционирования Google. Его можно отключить в настройках местоположения.<ph name="END_PARAGRAPH" /></translation> <translation id="7961015016161918242">Нет</translation> <translation id="7964089325405904043">Импорт и экспорт паролей</translation> <translation id="7965010376480416255">Общая память</translation> @@ -5301,6 +5308,7 @@ <translation id="8146793085009540321">Не удалось выполнить вход. Обратитесь к системному администратору или повторите попытку.</translation> <translation id="8148264977957212129">раскладка пиньинь</translation> <translation id="8148913456785123871">Показывать подсказки Google Now на панели запуска</translation> +<translation id="8150391391298684512">Отключить Windows Runtime MIDI API</translation> <translation id="8151185429379586178">Инструменты разработчика</translation> <translation id="8151638057146502721">Настроить</translation> <translation id="8151639108075998630">Разрешить просмотр в гостевом режиме</translation> @@ -5581,6 +5589,7 @@ <translation id="8532294913309524834">Расположение языков в соответствие с вашими предпочтениями.</translation> <translation id="8535005006684281994">URL обновления сертификатов Netscape</translation> <translation id="8539727552378197395">Нет (HttpOnly)</translation> +<translation id="8541084862688000575">Автоматически загружать приложения Android</translation> <translation id="8543181531796978784"><ph name="BEGIN_ERROR_LINK" />Сообщите о зараженном сайте<ph name="END_ERROR_LINK" />. Если вы готовы подвергнуть риску личные данные, то можете <ph name="BEGIN_LINK" />перейти на страницу<ph name="END_LINK" />.</translation> <translation id="8545107379349809705">Скрыть сведения</translation> <translation id="8545211332741562162">Использование в веб-страницах элементов экспериментального JavaScript.</translation> @@ -5608,7 +5617,6 @@ <translation id="8569764466147087991">Выберите файл</translation> <translation id="8571032220281885258">Chrome записывает фразу, произнесенную после "О'кей, Google", и выполняет по ней поиск.</translation> <translation id="8571108619753148184">Сервер 4</translation> -<translation id="8572832761467613633">Только Flash</translation> <translation id="8572981282494768930">Запретить сайтам доступ к камере и микрофону</translation> <translation id="8574234089711453001">Показывает кнопку скачивания про просмотре страницы с URL мультимедиа.</translation> <translation id="857779305329188634">Поддержка экспериментального протокола QUIC.</translation> @@ -5630,6 +5638,7 @@ <translation id="8600929685092827187">Выход из спящего режима</translation> <translation id="8601206103050338563">Клиентская аутентификация TLS WWW</translation> <translation id="8602851771975208551">Одна из программ на вашем компьютере установила приложение, которое может влиять на работу Chrome.</translation> +<translation id="8603912787021349466">Разрешить автозапуск приложений Android после входа в аккаунт</translation> <translation id="8605428685123651449">Память SQLite</translation> <translation id="8605503133013456784">Не удалось отключить обмен данными с устройством "<ph name="DEVICE_NAME" />".</translation> <translation id="8606726445206553943">использование MIDI-устройств</translation> @@ -5982,6 +5991,7 @@ <translation id="9053965862400494292">Произошел сбой во время синхронизации.</translation> <translation id="9056034633062863292">Обновление Chromebox</translation> <translation id="9056810968620647706">Ничего не найдено</translation> +<translation id="9057119625587205566">Нет принтеров рядом</translation> <translation id="9059868303873565140">Меню "Статус"</translation> <translation id="9064142312330104323">Загрузка фотографии профиля Google</translation> <translation id="9064275926664971810">Включить автозаполнение для быстрого добавления данных в веб-формы</translation> @@ -5992,6 +6002,7 @@ <translation id="9067401056540256169">Если вы установите этот флажок, безопасность Chrome может оказаться под угрозой. Включайте эту функцию, только если точно знаете ее назначение. Она может быть удалена в любой момент. Когда она включена, фреймы, источником которых является https, могут использовать незащищенное подключение WebSocket (ws://).</translation> <translation id="9068931793451030927">Путь:</translation> <translation id="9070219033670098627">Сменить пользователя</translation> +<translation id="9070940116164932228">Ограничить использование фоновых таймеров</translation> <translation id="907148966137935206">Блокировать всплывающие окна на всех сайтах (рекомендуется)</translation> <translation id="9072550133391925347">С помощью <ph name="PASSWORD_MANAGER_BRAND" /> вы будете автоматически входить на сайты и в приложения, для которых сохранили пароли.</translation> <translation id="9073281213608662541">PAP</translation> @@ -6025,6 +6036,7 @@ <translation id="9112614144067920641">Выберите новый PIN-код.</translation> <translation id="9112748030372401671">Изменение обоев</translation> <translation id="9112987648460918699">Найти...</translation> +<translation id="9114663181201435112">Удобный вход</translation> <translation id="9115487443206954631">Устройства Google Cast</translation> <translation id="9115675100829699941">&Закладки</translation> <translation id="9121814364785106365">Открыть в закрепленной вкладке</translation> @@ -6119,7 +6131,6 @@ <translation id="952992212772159698">Не активировано</translation> <translation id="960719561871045870">Код оператора</translation> <translation id="960987915827980018">Осталось около часа</translation> -<translation id="962778376131245616">Показывать только безопасный контент, с анимацией</translation> <translation id="96421021576709873">Сеть Wi-Fi</translation> <translation id="965490406356730238">Включает аппаратное ускорение для декодирования MJPEG при захвате кадра (если возможно).</translation> <translation id="968174221497644223">Кеш приложения</translation>
diff --git a/chrome/app/resources/generated_resources_sk.xtb b/chrome/app/resources/generated_resources_sk.xtb index d6c973e..e733608 100644 --- a/chrome/app/resources/generated_resources_sk.xtb +++ b/chrome/app/resources/generated_resources_sk.xtb
@@ -18,7 +18,6 @@ <translation id="1029317248976101138">Lupa</translation> <translation id="1029595648591494741">Chcete skúsiť rozšírenie <ph name="EXTENSION_NAME" />?</translation> <translation id="1031362278801463162">Načítava sa ukážka</translation> -<translation id="1031460590482534116">Pri pokuse o uchovanie certifikátu klienta sa vyskytla chyba. Chyba <ph name="ERROR_NUMBER" /> (<ph name="ERROR_NAME" />).</translation> <translation id="1031573127485938293">Opýtať sa (na základe pravidla)</translation> <translation id="103279545524624934">Ak chcete spúšťať aplikácie pre Android, uvoľnite miesto na disku.</translation> <translation id="1033780634303702874">Mať prístup k zariadeniam pripojeným cez sériový port</translation> @@ -101,6 +100,7 @@ <translation id="1128591060186966949">Úprava vyhľadávača</translation> <translation id="1128987120443782698">Ukladací priestor zariadenia má kapacitu <ph name="DEVICE_CAPACITY" />. Vložte SD kartu alebo pamäťový kľúč USB s kapacitou minimálne 4 GB.</translation> <translation id="1137135726305341424">Načítanie prvku domContentLoaded a všetkých zdrojov sa začalo pred načítaním prvku domContentLoaded (hlavný rámec a prvky iframe rovnakého pôvodu).</translation> +<translation id="1138663153846032155">Preferovanie HTML pred obsahom Flash</translation> <translation id="1140351953533677694">Mať prístup k zariadeniam pripojeným cez Bluetooth a sériový port</translation> <translation id="114140604515785785">Hlavný adresár rozšírenia:</translation> <translation id="1143142264369994168">Podpisovateľ certifikátu</translation> @@ -252,6 +252,7 @@ <translation id="1351692861129622852">Importujú sa súbory (počet: <ph name="FILE_COUNT" />)...</translation> <translation id="1352103415082130575">Thajská klávesnica (Pattachote)</translation> <translation id="1353686479385938207"><ph name="PROVIDER_NAME" />: <ph name="NETWORK_NAME" /></translation> +<translation id="1353946958707294039">Správca úložiska pre vzhľad Material Design</translation> <translation id="1353966721814789986">Stránky pri spustení</translation> <translation id="1354868058853714482">Program Adobe Reader je zastaraný a môže mať problémy so zabezpečením.</translation> <translation id="1355408554203439639">Softvérový rasterizátor 3D</translation> @@ -423,7 +424,6 @@ <translation id="1533920822694388968">Zarovnanie televízie</translation> <translation id="15373452373711364">Veľký kurzor myši</translation> <translation id="1543284117603151572">Importované z prehliadača Edge</translation> -<translation id="1544350195767834591">{NUM_COOKIES,plural, =1{1 z iných webov}few{# z iných webov}many{# z iných webov}other{# z iných webov}}</translation> <translation id="1545177026077493356">Automatický režim verejného terminálu</translation> <translation id="1545786162090505744">URL s %s miesto dopytu</translation> <translation id="1546280085599573572">Toto rozšírenie zmenilo stránku, ktorá sa zobrazí po kliknutí na tlačidlo Domovská stránka.</translation> @@ -447,7 +447,6 @@ <translation id="1559235587769913376">Zadať znaky Unicode</translation> <translation id="1561092721008294962">HarfBuzz pre text používateľského rozhrania</translation> <translation id="1566049601598938765">Webové stránky</translation> -<translation id="1566958206723629112">Flash a PDF</translation> <translation id="1567723158593978621">Ak je tento príznak povolený, prihlásenie do prehliadača bude používať nový, heslom oddelený proces prihlásenia pomocou účtu GAIA.</translation> <translation id="1567993339577891801">Konzola JavaScript</translation> <translation id="1568323446248056064">Otvoriť nastavenia obrazovky</translation> @@ -576,7 +575,6 @@ <translation id="1723940674997333416">Povoliť nezabezpečený protokol WebSocket zo zdroja https</translation> <translation id="1725149567830788547">Zobraziť &ovládacie prvky</translation> <translation id="172612876728038702">Prebieha nastavenie modulu TPM. Buďte trpezliví, môže to trvať niekoľko minút.</translation> -<translation id="1727135806684246609">Podrobné informácie o zabezpečení rozhrania Material</translation> <translation id="1729533290416704613">Tiež určuje, ktorá stránka sa zobrazí pri vyhľadávaní pomocou všeobecného poľa.</translation> <translation id="1731346223650886555">Bodkočiarka</translation> <translation id="1731589410171062430">Celkom: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /> (<ph name="NUMBER_OF_PAGES" /> <ph name="PAGE_OR_PAGES_LABEL" />)</translation> @@ -874,6 +872,7 @@ <translation id="218492098606937156">Povoliť udalosti dotyku</translation> <translation id="2187317261103489799">Rozpoznávať (predvolené)</translation> <translation id="2187895286714876935">Chyba importovania certifikátu servera</translation> +<translation id="2188881192257509750">Otvoriť <ph name="APPLICATION" /></translation> <translation id="2190069059097339078">WiFi Credentials Getter</translation> <translation id="219008588003277019">Modul miestneho klienta: <ph name="NEXE_NAME" /></translation> <translation id="2190355936436201913">(prázdne)</translation> @@ -992,6 +991,7 @@ <translation id="2326606747676847821">Režim inkognito</translation> <translation id="2326931316514688470">&Znova načítať aplikáciu</translation> <translation id="2327492829706409234">Povoliť aplikáciu</translation> +<translation id="2328054044222305089">Táto akcia odstráni všetky dáta, ktoré web <ph name="SITE" /> uložil do zariadenia, a resetuje všetky povolenia, ktoré ste mu udelili. Chcete pokračovať?</translation> <translation id="2329597144923131178">Prihláste sa a získajte tak svoje záložky, históriu, heslá a ďalšie nastavenia na všetkých svojich zariadeniach.</translation> <translation id="2332131598580221120">Zobraziť v obchode</translation> <translation id="2332742915001411729">Obnoviť na predvolené hodnoty</translation> @@ -1267,7 +1267,6 @@ <translation id="2675358154061544447">Vysoko experimentálna podpora pre vykreslenie prvkov iframe na viacerých stránkach v samostatných procesoch. V tomto režime budú dokumenty zdieľať proces vykresľovania iba vtedy, keď pochádzajú z rovnakého webu.</translation> <translation id="2676946222714718093">Prehráva sa na zariadení</translation> <translation id="2678063897982469759">Znova povoliť</translation> -<translation id="2678246812096664977">Všetky doplnky</translation> <translation id="2679385451463308372">Tlačiť prostredníctvom dialógového okna systému...</translation> <translation id="2680208403056680091">Vaše internetové pripojenie je ovládané</translation> <translation id="268053382412112343">Hi&stória</translation> @@ -1441,7 +1440,6 @@ <translation id="287286579981869940">Pridať poskytovateľa <ph name="PROVIDER_NAME" />...</translation> <translation id="2872961005593481000">Vypnúť</translation> <translation id="2875698561019555027">(Chybové stránky prehliadača Chrome)</translation> -<translation id="2879560882721503072">Certifikát klienta vydaný <ph name="ISSUER" /> bol úspešne uložený.</translation> <translation id="288024221176729610">Čeština</translation> <translation id="288042212351694283">Prístup k vašim zariadeniam so štandardom Universal 2nd Factor</translation> <translation id="2881966438216424900">Dátum posledného prístupu:</translation> @@ -1590,6 +1588,7 @@ <translation id="3057861065630527966">Zálohovať fotky a videá</translation> <translation id="3058212636943679650">Ak budete niekedy musieť obnoviť operačný systém počítača, budete potrebovať SD kartu na obnovenie alebo pamäťový kľúč USB.</translation> <translation id="305932878998873762">Pamäť Simple Cache pre protokol HTTP bude novou vyrovnávacou pamäťou. Prideľovanie diskového priestoru prenecháva systému súborov.</translation> +<translation id="3060251871394327123">Táto akcia odstráni všetky dáta, ktoré web <ph name="SITE" /> uložil do zariadenia. Chcete pokračovať?</translation> <translation id="3061650404498811439">Povolenie prístupu k ikonám emodži, ručnému písaniu a hlasovému vstupu z prihlasovacej ponuky editora metód vstupu.</translation> <translation id="3062606427884046423">Používať upozornenia MediaStyle systému Android pre upozornenia médií Chromu.</translation> <translation id="3063844757726132584">Z tohto praktického spúšťača môžete pristupovať do všetkých aplikácií. Hrajte sa hry, uskutočňujte videohovory, počúvajte hudbu, upravujte dokumenty alebo získajte ďalšie aplikácie.</translation> @@ -1639,6 +1638,7 @@ <translation id="3123569374670379335">(kontrolovaný)</translation> <translation id="3124111068741548686">POUŽÍVATEĽ – popisovače</translation> <translation id="3126026824346185272">Ctrl</translation> +<translation id="3127156390846601284">Táto akcia odstráni všetky dáta uložené v zariadení pre všetky zobrazené weby. Chcete pokračovať?</translation> <translation id="312759608736432009">Výrobca zariadenia:</translation> <translation id="3127919023693423797">Overovanie...</translation> <translation id="3128230619496333808">Karta 6</translation> @@ -1737,7 +1737,6 @@ <translation id="3264544094376351444">Bezpätkové písmo</translation> <translation id="3264547943200567728">Nepodarilo sa nastaviť sieť pre vaše zariadenie Chromebox</translation> <translation id="3265459715026181080">Zatvoriť okno</translation> -<translation id="3267271790328635957">Iba PDF</translation> <translation id="3267726687589094446">Naďalej povoľovať automatické sťahovanie viacerých súborov súčasne</translation> <translation id="3267998849713137817">Čas zmeny</translation> <translation id="3268451620468152448">Otvorené karty</translation> @@ -1983,6 +1982,7 @@ <translation id="3574210789297084292">prihlásiť sa</translation> <translation id="3574305903863751447"><ph name="CITY" />, <ph name="STATE" /> <ph name="COUNTRY" /></translation> <translation id="357479282490346887">Litovčina</translation> +<translation id="3575927481544652747">Zakázať pre WebMIDI rozhranie Windows Runtime MIDI API, ktoré je v systéme Windows 10 a novších systémoch predvolene aktivované.</translation> <translation id="3576324189521867626">Úspešne nainštalovaná</translation> <translation id="3578331450833904042">Predvolené (zaznamenať všetko)</translation> <translation id="3578594933904494462">Obsah tejto karty sa zdieľa.</translation> @@ -2036,8 +2036,6 @@ <translation id="3627320433825461852">Zostáva menej ako 1 minúta</translation> <translation id="3627588569887975815">Otvoriť odkaz v okne inko&gnito</translation> <translation id="3627671146180677314">Netscape – čas pre obnovenie certifikátu</translation> -<translation id="3629326610814700057">Umožňuje správcovi pamäte ovládať miestne úložisko.</translation> -<translation id="3630337581925712713"><ph name="PERMISSION_TYPE_LABEL" />:</translation> <translation id="3631337165634322335">Výnimky uvedené nižšie platia len pre aktuálnu reláciu režimu inkognito.</translation> <translation id="3633586230741134985">Nastavenia Spúšťača aplikácií</translation> <translation id="3633997706330212530">Tieto služby je možné zakázať.</translation> @@ -2060,7 +2058,8 @@ <translation id="3654045516529121250">Čítať nastavenia dostupnosti</translation> <translation id="3654092442379740616">Chyba synchronizácie: Prehliadač <ph name="PRODUCT_NAME" /> je zastaraný a treba ho aktualizovať.</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{Aplikácia má trvalý prístup k jednému súboru.}few{Aplikácia má trvalý prístup k # súborom.}many{Aplikácia má trvalý prístup k # súboru.}other{Aplikácia má trvalý prístup k # súborom.}}</translation> -<translation id="3657468915905674858">Povoliť experiment PPAPI Win32k Lockdown.</translation> +<translation id="365793796291733849"><ph name="BEGIN_PARAGRAPH1" />Keď zapnete automatické zálohovanie, dáta zariadenia a aplikácií sa pravidelne ukladajú do vášho súkromného priečinka na Disku Google. Dáta aplikácií môžu byť ľubovoľné údaje uložené aplikáciou (na základe nastavení vývojára) vrátane potenciálne citlivých informácií, ako sú kontakty, správy a fotky.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Zálohované dáta nebudú znižovať kvótu vášho úložiska Disku. Súbory, ktoré sú príliš veľké, alebo také, ktoré vývojári vylúčili z danej služby, nebudú zálohované.<ph name="END_PARAGRAPH2" /></translation> <translation id="3660234220361471169">Nedôveryhodné</translation> <translation id="3665589677786828986">Chrome zistil, že niektoré nastavenia boli poškodené iným programom, a preto obnovil pôvodné predvolené nastavenia.</translation> <translation id="3665842570601375360">Zabezpečenie:</translation> @@ -2115,6 +2114,7 @@ <translation id="3733127536501031542">Server SSL s prestupom na vyššiu edíciu</translation> <translation id="3736520371357197498">Ak si uvedomujete bezpečnostné riziko, môžete <ph name="BEGIN_LINK" />tieto nebezpečné stránky navštíviť<ph name="END_LINK" /> ešte skôr, ako budú nebezpečné programy odstránené.</translation> <translation id="3738924763801731196"><ph name="OID" />:</translation> +<translation id="3739254215541673094">Otvoriť <ph name="APPLICATION" />?</translation> <translation id="3739798227959604811">Oneskorenie pred opakovaním:</translation> <translation id="3741158646617793859">Zariadenie <ph name="DEVICE_NAME" /> sa teraz zobrazí v Správcovskej konzole</translation> <translation id="3741243925913727067">Zálohujte si fotky a videá z mediálneho zariadenia na Disk Google.</translation> @@ -2353,7 +2353,6 @@ <translation id="4058793769387728514">Skontrolovať dokument</translation> <translation id="4059285154003114015">&Tlačiť rámec...</translation> <translation id="406070391919917862">Aplikácie na pozadí</translation> -<translation id="4061502419206152498">Zobrazovať iba nezabezpečené, neanimované</translation> <translation id="4062251648694601778">Užite si zariadenie <ph name="SHORT_PRODUCT_NAME" />. Máte otázky? Na stavovom paneli si môžete kedykoľvek zobraziť pomocníka kliknutím na tlačidlo „?“.</translation> <translation id="4065876735068446555">Sieť, ktorú používate (<ph name="NETWORK_ID" />), môže vyžadovať, aby ste navštívili jej prihlasovaciu stránku.</translation> <translation id="4068506536726151626">Táto stránka obsahuje prvky z nasledujúcich webov, ktoré sledujú vašu polohu:</translation> @@ -2392,7 +2391,6 @@ <translation id="4101878899871018532">Správca hesiel nebude ponúkať možnosť uložiť poverenia použité pri synchronizácii.</translation> <translation id="410351446219883937">Automatické prehrávanie</translation> <translation id="4104163789986725820">E&xportovať...</translation> -<translation id="4105523032910086267">Umožňuje nastaviť animáciu a viditeľnosť podrobných informácií o zabezpečení vo vzhľade Material Design.</translation> <translation id="4105563239298244027">Získajte 1 TB zadarmo so službou Disk Google</translation> <translation id="4109135793348361820">Presunúť okno k používateľovi <ph name="USER_NAME" /> (<ph name="USER_EMAIL" />)</translation> <translation id="4110342520124362335">Boli zablokované súbory cookie zo stránok <ph name="DOMAIN" />.</translation> @@ -2443,6 +2441,7 @@ <translation id="418179967336296930">Ruská fonetická (YaZHert) klávesnica</translation> <translation id="4181841719683918333">Jazyky</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="4188447344915957833">Aktivuje v nastaveniach vzhľadu Material Design správcu úložiska</translation> <translation id="4189406272289638749">Toto nastavenie spravuje rozšírenie <b><ph name="EXTENSION_NAME" /></b>.</translation> <translation id="4193154014135846272">Dokument Google</translation> <translation id="4193182321948161343">Povoliť správcu používateľov so vzhľadom Material Design</translation> @@ -2650,6 +2649,7 @@ <translation id="4508765956121923607">&Zobraziť zdrojový kód</translation> <translation id="4509017836361568632">Zahodiť fotografiu</translation> <translation id="4509345063551561634">Umiestnenie:</translation> +<translation id="4513946894732546136">Spätná väzba</translation> <translation id="4514542542275172126">Nastavenie nového kontrolovaného používateľa</translation> <translation id="4514914692061505365">Vynútiť používanie rýchleho prekladača Subzero využívajúceho technológiu PNaCl v prípade všetkých súborov pexe.</translation> <translation id="451515744433878153">Odstrániť</translation> @@ -2748,6 +2748,7 @@ <translation id="4656293982926141856">Tento počítač</translation> <translation id="4656631038341342120">Umožňuje povoliť prostredie VR shell, ak je dostupné pre toto zariadenie.</translation> <translation id="4657031070957997341">Vždy povoliť doplnky na stránkach <ph name="HOST" /></translation> +<translation id="466008749075469935">Povolí intervenciu na obmedzenie využitia časovačov na pozadí procesorom na 1 %.</translation> <translation id="4663254525753315077">Ak je to možné, posunovateľný obsah prvku sa umiestni do zloženej vrstvy, aby bolo posúvanie rýchlejšie.</translation> <translation id="4664482161435122549">Chyba exportovania súborov PKCS #12</translation> <translation id="4665014895760275686">Výrobca</translation> @@ -2816,6 +2817,7 @@ <translation id="4749157430980974800">Gruzínska klávesnica</translation> <translation id="4750394297954878236">Návrhy</translation> <translation id="475088594373173692">Prvý používateľ</translation> +<translation id="4750892496809949692">Preferovať obsah HTML tým, že v zozname doplnkov bude skrytý Flash.</translation> <translation id="4750917950439032686">Vaše informácie (napríklad heslá a čísla kreditných kariet) zostanú po odoslaní na tento web súkromné.</translation> <translation id="4753602155423695878">Animácia pre panel priebehu načítavania stránky v telefóne s Androidom</translation> <translation id="4755240240651974342">fínska klávesnica</translation> @@ -3090,6 +3092,7 @@ <translation id="5119450342834678097">Možnosť vyžiadania stránok pre tablety v ponuke nastavení</translation> <translation id="5120068803556741301">Metóda vstupu tretej strany</translation> <translation id="5120421890733714118">Dôverovať tomuto certifikátu na identifikáciu webových stránok.</translation> +<translation id="5120516977819314347">Nesprávny PIN alebo heslo.</translation> <translation id="5121130586824819730">Pevný disk je plný. Uložte inde alebo uvoľnite viac miesta na pevnom disku. </translation> <translation id="5125751979347152379">Neplatná webová adresa.</translation> <translation id="5127881134400491887">Spravovať sieťové pripojenia</translation> @@ -3097,6 +3100,7 @@ <translation id="512903556749061217">pripojené</translation> <translation id="5129301143853688736">Vaše pripojenie k týmto stránkam nie je súkromné. Útočníci sa môžu pokúsiť ukradnúť vaše informácie (napríklad fotky, heslá, správy a kreditné karty) z domény <ph name="DOMAIN" />.</translation> <translation id="5129662217315786329">Poľština</translation> +<translation id="5131347545782851480">Dokumenty PDF</translation> <translation id="5134856901811723984">Vzhľad Material Design v používateľskom rozhraní systému Chrome OS</translation> <translation id="5135533361271311778">Nepodarilo sa vytvoriť položku záložiek</translation> <translation id="5136529877787728692">F7</translation> @@ -3265,6 +3269,7 @@ <translation id="5328031682234198929">8</translation> <translation id="5329858601952122676">&Odstrániť</translation> <translation id="5330145655348521461">Tieto súbory sú otvorené na inej pracovnej ploche. Ak ich chcete zobraziť, prejdite do profilu <ph name="USER_NAME" /> (<ph name="MAIL_ADDRESS" />).</translation> +<translation id="5330512191124428349">Získať informácie</translation> <translation id="5332624210073556029">Časová zóna:</translation> <translation id="5333807720589685258">Ak nezadáte správny kľúč na odomknutie kódu PIN, vaša SIM karta bude natrvalo deaktivovaná.</translation> @@ -3697,7 +3702,6 @@ <translation id="5892507820957994680">Prepíše zabudovaný zoznam softvérového vykresľovania a povolí akceleráciu pomocou grafickej karty v systémoch s nepodporovanými konfiguráciami.</translation> <translation id="5895138241574237353">Reštartovať</translation> <translation id="5895187275912066135">Vydané dňa</translation> -<translation id="5898154795085152510">Server vrátil neplatný certifikát klienta. Chyba <ph name="ERROR_NUMBER" /> (<ph name="ERROR_NAME" />).</translation> <translation id="5900302528761731119">Fotografia profilu Google</translation> <translation id="590253956165195626">Ponúkať preklad stránok, ktorým by ste nemuseli rozumieť.</translation> <translation id="5904093760909470684">Konfigurácia servera proxy</translation> @@ -3752,6 +3756,8 @@ <translation id="5984222099446776634">Nedávno navštívené</translation> <translation id="5984814259619230127">Vyhľadávanie zariadení pomocou rozhrania Bluetooth Low Energy vo funkcii Smart Lock</translation> <translation id="5986245990306121338">Ak je tento príznak povolený, prepínač kariet sa bude zobrazovať aj pri zapnutej možnosti „Zlúčiť karty a aplikácie“ v nastaveniach.</translation> +<translation id="5989712527536636369"><ph name="BEGIN_PARAGRAPH1" />Ide o všeobecné informácie o vašom zariadení a jeho používaní, ako sú napríklad údaje o úrovni batérie, o tom, ako často používate aplikácie, o kvalite a trvaní sieťových pripojení (napr. Wi-Fi a Bluetooth) a ak sa vyskytnú problémy, aj správy o zlyhaní. Použijú sa na vylepšenie produktov a služieb Google pre všetkých. Niektoré súhrnné informácie tiež pomôžu našim partnerom (napríklad vývojárom systému Android) vylepšiť svoje aplikácie a produkty.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Túto funkciu môžete kedykoľvek zapnúť alebo vypnúť v Nastaveniach aplikácií pre Android. Neovplyvníte tým schopnosť zariadenia odosielať informácie potrebné na prijímanie základných služieb, ako sú aktualizácie systému a zabezpečenie.<ph name="END_PARAGRAPH2" /></translation> <translation id="5990198433782424697">Rozšírenia na webových adresách typu chrome://</translation> <translation id="5990814808592353318">Ručné generovanie hesla</translation> <translation id="5991049340509704927">Zväčšenie</translation> @@ -3765,6 +3771,7 @@ <translation id="6005695835120147974">Smerovač médií</translation> <translation id="6007237601604674381">Presun zlyhal. <ph name="ERROR_MESSAGE" /></translation> <translation id="6008241731410823808">Odosiela signály ping kontrolujúce hypertextové odkazy.</translation> +<translation id="6011449291337289699">Vymazanie dát webu</translation> <translation id="6015796118275082299">Rok</translation> <translation id="6016551720757758985">Potvrdenie obnovenia Powerwash s návratom k predchádzajúcej verzii</translation> <translation id="6016809788585079594">Ešte raz a naposledy vyslovte „Ok Google“</translation> @@ -3954,7 +3961,6 @@ <translation id="6276301056778294989">Uistite sa, že sa na zariadení zobrazuje rovnaký kód.</translation> <translation id="6277105963844135994">Časový limit siete</translation> <translation id="6277518330158259200">&Vytvoriť snímku obrazovky</translation> -<translation id="6278428485366576908">Motív</translation> <translation id="6279183038361895380">Stlačením klávesa |<ph name="ACCELERATOR" />| zobrazíte kurzor</translation> <translation id="6280215091796946657">Prihlásiť sa pomocou iného účtu</translation> <translation id="6280912520669706465">ARC</translation> @@ -4206,6 +4212,7 @@ <translation id="6607272825297743757">Informácie o súbore</translation> <translation id="6607831829715835317">Ďalšie nástro&je</translation> <translation id="6608140561353073361">Všetky súbory cookie a údaje stránok...</translation> +<translation id="6610183966322615106">Pri pridávaní tlačiarne sa vyskytla chyba</translation> <translation id="6610610633807698299">Zadajte webovú adresu...</translation> <translation id="6612358246767739896">Chránený obsah</translation> <translation id="6615455863669487791">Zobraziť</translation> @@ -4269,7 +4276,6 @@ <translation id="6708242697268981054">Pôvod:</translation> <translation id="6709357832553498500">Pripojiť sa pomocou rozšírenia <ph name="EXTENSIONNAME" /></translation> <translation id="6710213216561001401">Dozadu</translation> -<translation id="6712158998835983046">Zobrazovať všetky, animované</translation> <translation id="6718273304615422081">Prebieha komprimovanie...</translation> <translation id="671928215901716392">Uzamknúť obrazovku</translation> <translation id="6721972322305477112">&Súbor</translation> @@ -4541,7 +4547,6 @@ <translation id="7088434364990739311">Kontrolu aktualizácií sa nepodarilo spustiť (kód chyby: <ph name="ERROR" />).</translation> <translation id="708856090370082727">Tento príznak povolí podporu presahu posunutia OSK. Keď je tento príznak zapnutý, položka OSK iba zmení veľkosť vizuálnej oblasti zobrazenia.</translation> <translation id="7088674813905715446">Toto zariadenie bolo správcom uvedené do stavu odstránenia. Ak chcete povoliť jeho registráciu, požiadajte svojho správcu, aby zariadenie uviedol do stavu čakania.</translation> -<translation id="7089609847854449639">Správca úložiska</translation> <translation id="708969677220991657">Umožňuje odosielať žiadosti na lokálne hostenie (localhost) cez protokol HTTP, a to aj vtedy, keď je použitý neplatný certifikát.</translation> <translation id="7092106376816104">Výnimky kontextových okien</translation> <translation id="7093866338626856921">Vymieňať údaje so zariadeniami s nasledujúcimi názvami: <ph name="HOSTNAMES" /></translation> @@ -4581,7 +4586,7 @@ <translation id="715118844758971915">Klasické tlačiarne</translation> <translation id="7154130902455071009">Zmeniť úvodnú stránku na: <ph name="START_PAGE" /></translation> <translation id="7155171745945906037">Existujúca fotka z fotoaparátu alebo súboru</translation> -<translation id="715568033737470079">Určuje doplnky PPAPI, ktoré budú spustené v rámci pravidla karantény Win32k Lockdown (systémy Windows 10 a novšie).</translation> +<translation id="7155226869555939647">Vždy otvárať odkazy pre <ph name="APPLICATION" /></translation> <translation id="7156235233373189579">Tento súbor je určený pre počítač so softvérom Windows. Nie je kompatibilný s vaším zariadením používajúcim OS Chrome. Vyhľadajte vhodnú náhradnú aplikáciu v <ph name="BEGIN_LINK" />Internetovom obchode Chrome<ph name="END_LINK" />.<ph name="BEGIN_LINK_HELP" />Viac informácií<ph name="END_LINK_HELP" /></translation> <translation id="7157063064925785854">Kliknutím na položku Pokračovať vyjadrujete súhlas s dokumentmi <ph name="LEGAL_DOC_LINK_TEXT_1" />, <ph name="LEGAL_DOC_LINK_TEXT_2" />, <ph name="LEGAL_DOC_LINK_TEXT_3" /> a <ph name="LEGAL_DOC_LINK_TEXT_4" />.</translation> <translation id="7158238151765743968">Stále prebieha pripájanie k zariadeniu <ph name="DEVICE_NAME" />.</translation> @@ -4596,6 +4601,7 @@ <translation id="7175353351958621980">Načítané z:</translation> <translation id="7180611975245234373">Obnoviť</translation> <translation id="7180865173735832675">Prispôsobiť</translation> +<translation id="7181387261278441780">Vymazanie a resetovanie webu</translation> <translation id="7185078796915954712">TLS 1.3</translation> <translation id="7185690883425432021">Skryje tlačidlá na zatvorenie neaktívnych kariet počas ich zoskupovania na paneli kariet.</translation> <translation id="7186088072322679094">Ponechať na paneli s nástrojmi</translation> @@ -4628,7 +4634,6 @@ <translation id="7223775956298141902">Hm... Nemáte žiadne rozšírenia :-(</translation> <translation id="7224023051066864079">Maska podsiete:</translation> <translation id="7225179976675429563">Chýba typ siete</translation> -<translation id="7230191962699768124">Zobrazovať všetky, neanimované</translation> <translation id="7230787553283372882">Prispôsobiť veľkosť textu</translation> <translation id="7231224339346098802">Počet kópií, ktoré chcete vytlačiť, treba zadať číslovkou (1 alebo vyššia).</translation> <translation id="7238585580608191973">Odtlačok SHA-256</translation> @@ -4760,7 +4765,6 @@ <translation id="7409233648990234464">Znova spustiť a použiť funkciu Powerwash</translation> <translation id="7409836189476010449">spustiť obsah vo formáte Flash</translation> <translation id="7410344089573941623">Opýtať sa, ak stránky <ph name="HOST" /> chcú pristupovať ku kamere a mikrofónu</translation> -<translation id="7411343637221933631">{NUM_COOKIES,plural, =1{1 z tohto webu}few{# z tohto webu}many{# z tohto webu}other{# z tohto webu}}</translation> <translation id="7412226954991670867">Pamäť GPU</translation> <translation id="7416362041876611053">Neznáma chyba siete</translation> <translation id="7417453074306512035">Etiópska klávesnica</translation> @@ -4882,6 +4886,7 @@ <translation id="756445078718366910">Otvoriť okno prehliadača</translation> <translation id="7564847347806291057">Ukončiť proces</translation> <translation id="7566723889363720618">F12</translation> +<translation id="7567314848159753396">Súbor cookie: <ph name="NAME" /></translation> <translation id="756809126120519699">Údaje Chromu boli vymazané</translation> <translation id="7568790562536448087">Prebieha aktualizácia</translation> <translation id="7573172247376861652">Nabíjanie batérie</translation> @@ -4922,6 +4927,7 @@ <translation id="7626009897377900107">Generovanie hesla</translation> <translation id="7627262197844840899">Tieto stránky neprijímajú karty MasterCard.</translation> <translation id="7627790789328695202">Hops, súbor <ph name="FILE_NAME" /> už existuje. Premenujte ho a skúste to znova.</translation> +<translation id="7628127343934101653">Otvárať súbory PDF v predvolenej aplikácii na zobrazovanie súborov PDF</translation> <translation id="762917759028004464">Predvolený prehliadač je momentálne <ph name="BROWSER_NAME" /></translation> <translation id="7629536005696009600">Povoliť, aby sa poverenia ukladali pre aplikácie pre Android a následne doplňovali na príslušných webových stránkach.</translation> <translation id="7629827748548208700">Karta: <ph name="TAB_NAME" /></translation> @@ -5150,6 +5156,7 @@ <translation id="7957513156576779045">Zapnite Bluetooth, čím umožníte párovanie</translation> <translation id="7957615753207896812">Otvoriť nastavenia klávesnice</translation> <translation id="7959074893852789871">Súbor obsahoval viacero certifikátov a niektoré z nich neboli importované:</translation> +<translation id="7959700692661109221"><ph name="BEGIN_PARAGRAPH" />Služba určovania polohy Google pomáha odhadnúť polohu zariadenia rýchlejšie a presnejšie pomocou zdrojov, ako je napríklad sieť Wi-Fi. Keď zapnete služby určovania polohy Google, zariadenie prejde do režimu, ktorý poskytuje informácie o polohe pomocou siete Wi-Fi. Túto funkciu môžete kedykoľvek vypnúť v nastaveniach polohy.<ph name="END_PARAGRAPH" /></translation> <translation id="7961015016161918242">Nikdy</translation> <translation id="7964089325405904043">Import a export hesiel</translation> <translation id="7965010376480416255">Zdieľaná pamäť</translation> @@ -5300,6 +5307,7 @@ <translation id="8146793085009540321">Prihlásenie zlyhalo. Kontaktujte svojho správcu alebo to skúste znova.</translation> <translation id="8148264977957212129">Metóda vstupu Pinyin</translation> <translation id="8148913456785123871">Zobraziť karty Google Now v aplikácii launcher</translation> +<translation id="8150391391298684512">Zakázanie rozhrania Windows Runtime MIDI API</translation> <translation id="8151185429379586178">Nástroje pre vývojárov</translation> <translation id="8151638057146502721">Konfigurovať</translation> <translation id="8151639108075998630">Povoliť hosťovské prehliadanie</translation> @@ -5581,6 +5589,7 @@ <translation id="8532294913309524834">Objednajte si jazyky na základe svojich preferencií.</translation> <translation id="8535005006684281994">Netscape – webová adresa pre obnovenie certifikátu</translation> <translation id="8539727552378197395">Nie (HttpOnly)</translation> +<translation id="8541084862688000575">Automatické načítavanie aplikácií pre Android</translation> <translation id="8543181531796978784">Môžete buď <ph name="BEGIN_ERROR_LINK" />nahlásiť problém s zisťovaním<ph name="END_ERROR_LINK" />, alebo <ph name="BEGIN_LINK" />tieto nebezpečné stránky navštíviť<ph name="END_LINK" /> (ak si uvedomujete bezpečnostné riziko).</translation> <translation id="8545107379349809705">Skryť informácie...</translation> <translation id="8545211332741562162">Povolí webovým stránkam používať experimentálne funkcie jazyka JavaScript.</translation> @@ -5608,7 +5617,6 @@ <translation id="8569764466147087991">Vyberte súbor, ktorý chcete otvoriť</translation> <translation id="8571032220281885258">Keď poviete „Ok Google“, prehliadač Chrome vyhľadá výraz, ktorý následne vyslovíte.</translation> <translation id="8571108619753148184">Server 4</translation> -<translation id="8572832761467613633">Iba Flash</translation> <translation id="8572981282494768930">Nepovoliť webovým stránkam používať vašu kameru a mikrofón</translation> <translation id="8574234089711453001">Povolí zobrazenie tlačidla Stiahnuť pri otváraní stránky s webovou adresou médií.</translation> <translation id="857779305329188634">Povolí podporu experimentálneho protokolu QUIC.</translation> @@ -5630,6 +5638,7 @@ <translation id="8600929685092827187">Prebudenie pri prijatí paketov</translation> <translation id="8601206103050338563">Overenie WWW klienta protokolom TLS</translation> <translation id="8602851771975208551">Iný program v počítači pridal aplikáciu, ktorá môže zmeniť spôsob fungovania prehliadača Chrome.</translation> +<translation id="8603912787021349466">Povoliť automatické spúšťanie aplikácií pre Android po prihlásení.</translation> <translation id="8605428685123651449">Pamäť nástroja SQLite</translation> <translation id="8605503133013456784">Nepodarilo sa odpojiť a zrušiť párovanie so zariadením „<ph name="DEVICE_NAME" />“.</translation> <translation id="8606726445206553943">Používať zariadenia MIDI</translation> @@ -5982,6 +5991,7 @@ <translation id="9053965862400494292">Pri nastavení synchronizácie sa vyskytla chyba.</translation> <translation id="9056034633062863292">Aktualizácia zariadenia Chromebox</translation> <translation id="9056810968620647706">Nenašli sa žiadne zhody.</translation> +<translation id="9057119625587205566">V okolí sa nenašli žiadne tlačiarne</translation> <translation id="9059868303873565140">Ponuka stavov</translation> <translation id="9064142312330104323">Profilová fotografia Google (prebieha načítavanie)</translation> <translation id="9064275926664971810">Povoliť Automatické dopĺňanie na vyplňovanie formulárov jediným kliknutím</translation> @@ -5992,6 +6002,7 @@ <translation id="9067401056540256169">Tento príznak spôsobí, že prehliadač Chrome nebude bezpečný. Použite ho iba v prípade, že viete, čo robí. Upozorňujeme, že tento príznak môže byť odstránený bez akéhokoľvek upozornenia. Ak je povolený, rámce so zdrojom https môžu používať protokoly WebSocket s nezabezpečenou webovou adresou (ws://).</translation> <translation id="9068931793451030927">Cesta:</translation> <translation id="9070219033670098627">Prepnúť osobu</translation> +<translation id="9070940116164932228">Obmedzenie náročných časovačov na pozadí</translation> <translation id="907148966137935206">Nepovoliť žiadnym webovým stránkam zobrazovať kontextové okná (odporúča sa)</translation> <translation id="9072550133391925347"><ph name="PASSWORD_MANAGER_BRAND" /> vás automaticky prihlási na vhodných weboch a v aplikáciách pomocou hesiel, ktoré ste si uložili.</translation> <translation id="9073281213608662541">PAP</translation> @@ -6025,6 +6036,7 @@ <translation id="9112614144067920641">Zvoľte nový kód PIN.</translation> <translation id="9112748030372401671">Zmeniť tapetu</translation> <translation id="9112987648460918699">Nájsť...</translation> +<translation id="9114663181201435112">Jednoduché prihlásenie</translation> <translation id="9115487443206954631">Spravovať zariadenia Cast</translation> <translation id="9115675100829699941">&Záložky</translation> <translation id="9121814364785106365">Otvoriť ako pevnú kartu</translation> @@ -6119,7 +6131,6 @@ <translation id="952992212772159698">Neaktivované</translation> <translation id="960719561871045870">Kód operátora</translation> <translation id="960987915827980018">Zostáva približne 1 hodina</translation> -<translation id="962778376131245616">Zobrazovať iba nezabezpečené, animované</translation> <translation id="96421021576709873">Sieť Wi-Fi</translation> <translation id="965490406356730238">Táto možnosť povolí hardvérovo akcelerované dekódovanie formátu mjpeg pre zaznamenaný rámec (podľa dostupnosti).</translation> <translation id="968174221497644223">Vyrovnávacia pamäť aplikácie</translation>
diff --git a/chrome/app/resources/generated_resources_sl.xtb b/chrome/app/resources/generated_resources_sl.xtb index 6d5ec1d..bed2650a 100644 --- a/chrome/app/resources/generated_resources_sl.xtb +++ b/chrome/app/resources/generated_resources_sl.xtb
@@ -18,7 +18,6 @@ <translation id="1029317248976101138">Povečaj</translation> <translation id="1029595648591494741">Želite preskusiti razširitev »<ph name="EXTENSION_NAME" />«?</translation> <translation id="1031362278801463162">Nalaganje predogleda</translation> -<translation id="1031460590482534116">Napaka med shranjevanjem odjemalčevega potrdila. Napaka <ph name="ERROR_NUMBER" /> (<ph name="ERROR_NAME" />).</translation> <translation id="1031573127485938293">Zahteva (pravilnik)</translation> <translation id="103279545524624934">Če želite zagnati aplikacije za Android, sprostite prostor na disku.</translation> <translation id="1033780634303702874">Dostop do serijskih naprav</translation> @@ -101,6 +100,7 @@ <translation id="1128591060186966949">Urejanje iskalnika</translation> <translation id="1128987120443782698">Na napravi za shranjevanje je <ph name="DEVICE_CAPACITY" /> prostora. Vstavite kartico SD ali pomnilnik USB, na katerem je vsaj 4 GB prostora.</translation> <translation id="1137135726305341424">Dogodek »domContentLoaded« in vsa nalaganja sredstev so se začeli pred dogodkom »domContentLoaded« (glavni okvir in elementi »iframe« istega izvora).</translation> +<translation id="1138663153846032155">Prednostna uporaba HTML-ja namesto Flasha</translation> <translation id="1140351953533677694">Dostop do naprav Bluetooth in serijskih naprav</translation> <translation id="114140604515785785">Kor. imenik razširitve:</translation> <translation id="1143142264369994168">Podpisnik potrdila</translation> @@ -252,6 +252,7 @@ <translation id="1351692861129622852">Uvoz toliko datotek: <ph name="FILE_COUNT" /> ...</translation> <translation id="1352103415082130575">Tipkovnica za tajščino (Pattachote)</translation> <translation id="1353686479385938207"><ph name="PROVIDER_NAME" />: <ph name="NETWORK_NAME" /></translation> +<translation id="1353946958707294039">Upravitelj shrambe z materialnim oblikovanjem</translation> <translation id="1353966721814789986">Začetne strani</translation> <translation id="1354868058853714482">Adobe Reader je zastarel in morda ni varen.</translation> <translation id="1355408554203439639">Programski rasterizator 3D</translation> @@ -424,7 +425,6 @@ <translation id="1533920822694388968">Poravnava TV-ja</translation> <translation id="15373452373711364">Velik miškin kazalec</translation> <translation id="1543284117603151572">Uvoženo iz brskalnika Edge</translation> -<translation id="1544350195767834591">{NUM_COOKIES,plural, =1{1 z drugih spletnih mest}one{# z drugih spletnih mest}two{# z drugih spletnih mest}few{# z drugih spletnih mest}other{# z drugih spletnih mest}}</translation> <translation id="1545177026077493356">Samodejni način kiosk</translation> <translation id="1545786162090505744">URL z »%s« namesto poizvedbe</translation> <translation id="1546280085599573572">Zaradi te razširitve se je spremenila stran, ki je prikazana, ko kliknete gumb za začetno stran.</translation> @@ -448,7 +448,6 @@ <translation id="1559235587769913376">Vnos znakov Unicode</translation> <translation id="1561092721008294962">Mehanizem HarfBuzz za besedilo uporabniškega vmesnika</translation> <translation id="1566049601598938765">Spletno mesto</translation> -<translation id="1566958206723629112">Flash in PDF</translation> <translation id="1567723158593978621">Če je zastavica omogočena, bo za prijavo v brskalnik uporabljen nov potek prijave brez gesla za GAIO.</translation> <translation id="1567993339577891801">Konzola JavaScript</translation> <translation id="1568323446248056064">Odpiranje nastavitev zaslona v napravi</translation> @@ -577,7 +576,6 @@ <translation id="1723940674997333416">Omogočanje povezav WebSocket, ki niso varne, iz izvora https</translation> <translation id="1725149567830788547">Pokaži &kontrolnike</translation> <translation id="172612876728038702">Poteka nastavljanje TPM-ja. Bodite potrpežljivi, to lahko traja nekaj minut.</translation> -<translation id="1727135806684246609">Podrobni varnostni elementi v materialnem oblikovanju</translation> <translation id="1729533290416704613">Določa tudi, katera stran je prikazana, ko iščete v naslovni vrstici.</translation> <translation id="1731346223650886555">Podpičje</translation> <translation id="1731589410171062430">Skupaj: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /> (<ph name="NUMBER_OF_PAGES" /> <ph name="PAGE_OR_PAGES_LABEL" />)</translation> @@ -874,6 +872,7 @@ <translation id="218492098606937156">Omogoči dogodke dotika</translation> <translation id="2187317261103489799">Zaznava (privzeto)</translation> <translation id="2187895286714876935">Napaka pri uvozu strežniškega potrdila</translation> +<translation id="2188881192257509750">Odpri aplikacijo <ph name="APPLICATION" /></translation> <translation id="2190069059097339078">Pripomoček za pridobivanje poverilnic za WiFi</translation> <translation id="219008588003277019">Modul »Native Client«: <ph name="NEXE_NAME" /></translation> <translation id="2190355936436201913">(prazno)</translation> @@ -992,6 +991,7 @@ <translation id="2326606747676847821">Brskaj brez beleženja zgodovine</translation> <translation id="2326931316514688470">&Znova naloži aplikacijo</translation> <translation id="2327492829706409234">Omogoči aplikacijo</translation> +<translation id="2328054044222305089">S tem se bodo izbrisali podatki, ki jih je spletno mesto <ph name="SITE" /> shranilo v vaši napravi, in ponastavila se bodo dovoljenja, ki ste jih odobrili za izvajanje. Ali želite nadaljevati?</translation> <translation id="2329597144923131178">Prijavite se, da boste lahko dostopali do zaznamkov, zgodovine, gesel in drugih nastavitev v vseh napravah.</translation> <translation id="2332131598580221120">Ogled v trgovini</translation> <translation id="2332742915001411729">Ponastavi na privzeto</translation> @@ -1267,7 +1267,6 @@ <translation id="2675358154061544447">Strogo poskusna podpora za upodabljanje elementov iframe na več spletnih mestih v ločenih procesih. Dokumenti bodo v tem načinu souporabljali postopek upodabljalnika, samo če so z istega spletnega mesta.</translation> <translation id="2676946222714718093">Predvajanje v:</translation> <translation id="2678063897982469759">Znova omogoči</translation> -<translation id="2678246812096664977">Vsi vtičniki</translation> <translation id="2679385451463308372">Natisni iz sistemskega pogovornega okna ...</translation> <translation id="2680208403056680091">Vaša povezava z internetom je nadzorovana</translation> <translation id="268053382412112343">Z&godovina</translation> @@ -1441,7 +1440,6 @@ <translation id="287286579981869940">Dodajanje <ph name="PROVIDER_NAME" /> ...</translation> <translation id="2872961005593481000">Zaustavitev</translation> <translation id="2875698561019555027">(Chromove strani z napakami)</translation> -<translation id="2879560882721503072">Odjemalčevo potrdilo, ki ga je izdal <ph name="ISSUER" />, je shranjeno.</translation> <translation id="288024221176729610">češčina</translation> <translation id="288042212351694283">Dostop do naprav z univerzalnim drugim dejavnikom</translation> <translation id="2881966438216424900">Zadnji dostop:</translation> @@ -1590,6 +1588,7 @@ <translation id="3057861065630527966">Varnostno kopiranje fotografij videoposnetkov</translation> <translation id="3058212636943679650">Če boste morali kdaj obnoviti operacijski sistem računalnika, boste potrebovali obnovitveno kartico SD ali pomnilnik USB.</translation> <translation id="305932878998873762">Preprosti predpomnilnik za HTTP je novi predpomnilnik. Za dodeljevanje prostora na disku uporablja datotečni sistem.</translation> +<translation id="3060251871394327123">S tem se bodo izbrisali podatki, ki jih je spletno mesto <ph name="SITE" /> shranilo v vaši napravi. Ali želite nadaljevati?</translation> <translation id="3061650404498811439">Omogočanje dostopa do znakov »emoji«, rokopisa in glasovnega vnosa v meniju za UNV-je.</translation> <translation id="3062606427884046423">Uporaba obvestil Android MediaStyle za Chromova obvestila o predstavnosti.</translation> <translation id="3063844757726132584">S tem priročnim zaganjalnikom dostopajte do vseh aplikacij. Igrajte igre, uporabljajte videoklepet, poslušajte glasbo, urejajte dokumente ali namestite več aplikacij.</translation> @@ -1639,6 +1638,7 @@ <translation id="3123569374670379335">(Zaščiten)</translation> <translation id="3124111068741548686">Kode za dostop uporabnika USER</translation> <translation id="3126026824346185272">CTRL</translation> +<translation id="3127156390846601284">S tem se bodo izbrisali podatki, ki so jih prikazana spletna mesta shranila v vaši napravi. Ali želite nadaljevati?</translation> <translation id="312759608736432009">Proizvajalec naprave:</translation> <translation id="3127919023693423797">Preverjanje ...</translation> <translation id="3128230619496333808">Zavihek 6</translation> @@ -1737,7 +1737,6 @@ <translation id="3264544094376351444">Neserifna pisava</translation> <translation id="3264547943200567728">Nastavitev omrežja za Chromebox ni uspela</translation> <translation id="3265459715026181080">Zapri okno</translation> -<translation id="3267271790328635957">Samo PDF</translation> <translation id="3267726687589094446">Še naprej dovoli samodejni prenos več datotek</translation> <translation id="3267998849713137817">Ura spremembe</translation> <translation id="3268451620468152448">Odprti zavihki</translation> @@ -1983,6 +1982,7 @@ <translation id="3574210789297084292">prijava</translation> <translation id="3574305903863751447"><ph name="CITY" />, <ph name="STATE" /> <ph name="COUNTRY" /></translation> <translation id="357479282490346887">litovščina</translation> +<translation id="3575927481544652747">Onemogočanje API-ja MIDI izvajalnika sistema Windows za WebMIDI, ki je privzeto omogočen v sistemu Windows 10 ali novejših.</translation> <translation id="3576324189521867626">Uspešno nameščeno</translation> <translation id="3578331450833904042">Privzeto (zaznaj vse)</translation> <translation id="3578594933904494462">Vsebina tega zavihka je v skupni rabi.</translation> @@ -2036,8 +2036,6 @@ <translation id="3627320433825461852">Še manj kot minuta</translation> <translation id="3627588569887975815">Odpri povezavo v oknu brez bele&ženja zgodovine</translation> <translation id="3627671146180677314">Čas podaljšanja Netscapeovega potrdila</translation> -<translation id="3629326610814700057">Upravitelju shrambe omogoči upravljanje lokalne shrambe.</translation> -<translation id="3630337581925712713"><ph name="PERMISSION_TYPE_LABEL" />:</translation> <translation id="3631337165634322335">Spodnje izjeme veljajo samo za trenutno sejo brez beleženja zgodovine.</translation> <translation id="3633586230741134985">Nastavitve zaganjalnika aplikacij</translation> <translation id="3633997706330212530">Te storitve lahko po želji onemogočite.</translation> @@ -2060,7 +2058,8 @@ <translation id="3654045516529121250">Branje nastavitev za funkcije za ljudi s posebnimi potrebami</translation> <translation id="3654092442379740616">Napaka pri sinhronizaciji: <ph name="PRODUCT_NAME" /> je zastarel in ga je treba posodobiti.</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{Ima trajni dostop do ene datoteke.}one{Ima trajni dostop do # datoteke.}two{Ima trajni dostop do # datotek.}few{Ima trajni dostop do # datotek.}other{Ima trajni dostop do # datotek.}}</translation> -<translation id="3657468915905674858">Omogoči zaklepanje PPAPI Win32k.</translation> +<translation id="365793796291733849"><ph name="BEGIN_PARAGRAPH1" />Ko vklopite samodejno varnostno kopiranje, se podatki naprave in aplikacij redno shranjujejo v Google Drive v mapo, ki ni v skupni rabi. Podatki aplikacij so lahko kateri koli podatki, ki jih je shranila aplikacija (glede na nastavitve razvijalca), vključno z morebitnimi občutljivimi podatki, kot so stiki, sporočila in fotografije.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Varnostno kopirani podatki se ne bodo šteli v vašo omejitev prostora za shranjevanje. Velike datoteke ali datoteke, ki so jih razvijalci izključili iz storitve, ne bodo varnostno kopirane.<ph name="END_PARAGRAPH2" /></translation> <translation id="3660234220361471169">Ni vredno zaupanja</translation> <translation id="3665589677786828986">Chrome je zaznal, da je drug program spremenil nastavitve, in jih ponastavil na prvotne privzete nastavitve.</translation> <translation id="3665842570601375360">Varnost:</translation> @@ -2115,6 +2114,7 @@ <translation id="3733127536501031542">Strežnik SSL z nadgradnjo</translation> <translation id="3736520371357197498">Če se zavedate varnostnega tveganja, lahko <ph name="BEGIN_LINK" />obiščete to spletno mesto, ki ni varno<ph name="END_LINK" />, preden bodo nevarni programi odstranjeni.</translation> <translation id="3738924763801731196"><ph name="OID" />:</translation> +<translation id="3739254215541673094">Odpiranje aplikacije <ph name="APPLICATION" />?</translation> <translation id="3739798227959604811">Zakasnitev pred ponovitvijo:</translation> <translation id="3741158646617793859">Naprava <ph name="DEVICE_NAME" /> bo zdaj vidna v skrbniški konzoli</translation> <translation id="3741243925913727067">Varnostno kopiranje fotografij in videoposnetkov iz predstavnostne naprave v Google Drive.</translation> @@ -2353,7 +2353,6 @@ <translation id="4058793769387728514">Preveri dokument</translation> <translation id="4059285154003114015">&Okvir za tiskanje ...</translation> <translation id="406070391919917862">Programi v ozadju</translation> -<translation id="4061502419206152498">Prikazani naj bodo samo elementi, ki niso varni in niso animirani</translation> <translation id="4062251648694601778">Uživajte v napravi <ph name="SHORT_PRODUCT_NAME" />. Imate kakšno vprašanje? Pomoč je vedno na voljo, če v vrstici stanja kliknete »?«.</translation> <translation id="4065876735068446555">Omrežje, ki ga uporabljate (<ph name="NETWORK_ID" />), morda zahteva, da obiščete stran za prijavo.</translation> <translation id="4068506536726151626">Na tej strani so elementi iz teh spletnih mest, ki sledijo vaši lokaciji:</translation> @@ -2392,7 +2391,6 @@ <translation id="4101878899871018532">Upravitelj gesel ne bo več ponujal shranjevanja poverilnice za sinhronizacijo.</translation> <translation id="410351446219883937">Samodejno predvajanje</translation> <translation id="4104163789986725820">I&zvozi ...</translation> -<translation id="4105523032910086267">Nastavi animacijo in vidnost podrobnih varnostnih elementov v materialnem oblikovanju.</translation> <translation id="4105563239298244027">Zagotovite si 1 TB brezplačnega prostora za shranjevanje v storitvi Google Drive</translation> <translation id="4109135793348361820">Premakni okno uporabniku <ph name="USER_NAME" /> (<ph name="USER_EMAIL" />)</translation> <translation id="4110342520124362335">Piškotki s spletnega mesta <ph name="DOMAIN" /> so blokirani.</translation> @@ -2443,6 +2441,7 @@ <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="4188447344915957833">Omogoči upravitelja shrambe v nastavitvah materialnega oblikovanja.</translation> <translation id="4189406272289638749">Razširitev <b><ph name="EXTENSION_NAME" /></b> nadzira to nastavitev.</translation> <translation id="4193154014135846272">Googlov dokument</translation> <translation id="4193182321948161343">Omogoči upravitelja uporabnikov z materialnim oblikovanjem</translation> @@ -2650,6 +2649,7 @@ <translation id="4508765956121923607">Prikaz &izvorne kode</translation> <translation id="4509017836361568632">Zavrzi fotografijo</translation> <translation id="4509345063551561634">Lokacija</translation> +<translation id="4513946894732546136">Povratne informacije</translation> <translation id="4514542542275172126">Nastavi novega zaščitenega uporabnika</translation> <translation id="4514914692061505365">Vsili uporabo PNaCl-jevega hitrega prevajalnika Subzero za vse datoteke pexe.</translation> <translation id="451515744433878153">Odstrani</translation> @@ -2748,6 +2748,7 @@ <translation id="4656293982926141856">V tem računalniku</translation> <translation id="4656631038341342120">Omogočanje lupine za navidezno resničnost, če je na voljo za to napravo.</translation> <translation id="4657031070957997341">Vedno dovoli vtičnike na mestu <ph name="HOST" /></translation> +<translation id="466008749075469935">Omogoči posredovanje za omejevanje uporabe CPE-ja za izvajanje časovnikov v ozadju na 1 %.</translation> <translation id="4663254525753315077">Če je mogoče, postavi drsno vsebino presežnega drsnega elementa na sestavljen sloj in tako omogoči hitrejše drsenje.</translation> <translation id="4664482161435122549">Napaka pri izvozu PKCS #12</translation> <translation id="4665014895760275686">Proizvajalec</translation> @@ -2816,6 +2817,7 @@ <translation id="4749157430980974800">Gruzijska tipkovnica</translation> <translation id="4750394297954878236">Predlogi</translation> <translation id="475088594373173692">Prvi uporabnik</translation> +<translation id="4750892496809949692">Prednostno uporabi vsebino HTML, tako da skrije Flash na seznamu vtičnikov.</translation> <translation id="4750917950439032686">Vaši podatki (npr. gesla ali številke kreditnih kartic) so zasebni, kadar so poslani temu spletnemu mestu.</translation> <translation id="4753602155423695878">Animacija vrstice z napredkom nalaganja strani v telefonu Android.</translation> <translation id="4755240240651974342">Finska tipkovnica</translation> @@ -3090,6 +3092,7 @@ <translation id="5119450342834678097">Možnost za zahtevanje spletnega mesta za tablični računalnik v meniju z nastavitvami</translation> <translation id="5120068803556741301">Način vnosa drugega ponudnika</translation> <translation id="5120421890733714118">Zaupaj temu potrdilu za prepoznavanje spletnih mest.</translation> +<translation id="5120516977819314347">Ni pravilna koda PIN ali geslo.</translation> <translation id="5121130586824819730">Trdi disk je poln. Shranite na drugo mesto ali sprostite prostor na trdem disku.</translation> <translation id="5125751979347152379">Neveljaven spletni naslov.</translation> <translation id="5127881134400491887">Upravljanje omrežnih povezav</translation> @@ -3097,6 +3100,7 @@ <translation id="512903556749061217">priključena</translation> <translation id="5129301143853688736">Povezava s tem mestom ni zasebna. Napadalci morda poskušajo ukrasti vaše podatke (na primer fotografije, gesla, sporočila in podatke o kreditnih karticah) iz domene <ph name="DOMAIN" />.</translation> <translation id="5129662217315786329">poljščina</translation> +<translation id="5131347545782851480">Dokumenti PDF</translation> <translation id="5134856901811723984">Materialno oblikovanje v uporabniškem vmesniku sistema OS Chrome</translation> <translation id="5135533361271311778">Elementa zaznamka ni bilo mogoče ustvariti.</translation> <translation id="5136529877787728692">F7</translation> @@ -3265,6 +3269,7 @@ <translation id="5328031682234198929">8</translation> <translation id="5329858601952122676">&Izbriši</translation> <translation id="5330145655348521461">Te datoteke so odprte na drugem namizju. Če si jih želite ogledati, preklopite na uporabnika <ph name="USER_NAME" /> (<ph name="MAIL_ADDRESS" />).</translation> +<translation id="5330512191124428349">Pridobi podatke</translation> <translation id="5332624210073556029">Časovni pas:</translation> <translation id="5333807720589685258">Kartica SIM bo trajno onemogočena, če ne boste vnesli pravilne kode za odklepanje kode PIN.</translation> @@ -3698,7 +3703,6 @@ <translation id="5892507820957994680">Preglasi vgrajen seznam za programsko upodabljanje in omogoči strojno pospeševanje grafike v nepodprtih sistemskih konfiguracijah.</translation> <translation id="5895138241574237353">Znova zaženi</translation> <translation id="5895187275912066135">Izdano dne</translation> -<translation id="5898154795085152510">Strežnik je vrnil neveljavno odjemalčevo potrdilo. Napaka <ph name="ERROR_NUMBER" /> (<ph name="ERROR_NAME" />).</translation> <translation id="5900302528761731119">Fotografija profila Google</translation> <translation id="590253956165195626">Ponudi prevajanje strani, ki niso v vašem jeziku.</translation> <translation id="5904093760909470684">Konfiguracija strežnika proxy</translation> @@ -3753,6 +3757,8 @@ <translation id="5984222099446776634">Nedavno obiskano</translation> <translation id="5984814259619230127">Odkrivanje prek tehnologije Bluetooth Low Energy za funkcijo Smart Lock</translation> <translation id="5986245990306121338">Če je omogočeno, je preklop med zavihki prikazan tudi, če je v nastavitvah vklopljena možnost združevanja zavihkov in aplikacij.</translation> +<translation id="5989712527536636369"><ph name="BEGIN_PARAGRAPH1" />To so splošni podatki o tej napravi in tem, kako se uporablja, na primer raven napolnjenosti akumulatorja, kako pogosto so uporabljene aplikacije, kakovost in trajanje omrežnih povezav (na primer povezav z omrežjem Wi-Fi in povezav Bluetooth) ter poročila o zrušitvah, ko ne gre vse po načrtu. Uporabljeni so za izboljšanje Googlovih izdelkov in storitev za vse. Nekateri združeni podatki tudi pomagajo partnerjem, na primer razvijalcem za Android, izboljšati svoje izdelke.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />To lahko kadar koli vklopite ali izklopite nastavitvah aplikacij za Android. To ne vpliva na to, ali lahko naprava pošilja potrebne podatke za prejemanje ključnih storitev, na primer sistemskih posodobitev in varnosti.<ph name="END_PARAGRAPH2" /></translation> <translation id="5990198433782424697">Razširitve na URL-jih chrome://</translation> <translation id="5990814808592353318">Ročno ustvarjanje gesel</translation> <translation id="5991049340509704927">Povečava</translation> @@ -3766,6 +3772,7 @@ <translation id="6005695835120147974">Predstavnostni usmerjevalnik</translation> <translation id="6007237601604674381">Premikanje ni uspelo. <ph name="ERROR_MESSAGE" /></translation> <translation id="6008241731410823808">Pošlje pinge za nadzor hiperpovezave.</translation> +<translation id="6011449291337289699">Brisanje podatkov spletnih mest</translation> <translation id="6015796118275082299">Leto</translation> <translation id="6016551720757758985">Potrdite, da želite izvesti Powerwash in povrniti prejšnjo različico.</translation> <translation id="6016809788585079594">Še zadnjič izgovorite »Ok Google«</translation> @@ -3955,7 +3962,6 @@ <translation id="6276301056778294989">Naprava mora prikazovati isto kodo.</translation> <translation id="6277105963844135994">Potek časovne omejitve omrežja</translation> <translation id="6277518330158259200">N&aredi posnetek zaslona</translation> -<translation id="6278428485366576908">Tema</translation> <translation id="6279183038361895380">Pritisnite |<ph name="ACCELERATOR" />| za prikaz kazalca</translation> <translation id="6280215091796946657">Prijava z drugim računom</translation> <translation id="6280912520669706465">ARC</translation> @@ -4206,6 +4212,7 @@ <translation id="6607272825297743757">Podatki o datoteki</translation> <translation id="6607831829715835317">Več orodij</translation> <translation id="6608140561353073361">Vsi piškotki in podatki spletnih mest ...</translation> +<translation id="6610183966322615106">Napaka pri dodajanju tiskalnika</translation> <translation id="6610610633807698299">Vnesite URL ..</translation> <translation id="6612358246767739896">Zaščitena vsebina</translation> <translation id="6615455863669487791">Pokaži mi</translation> @@ -4269,7 +4276,6 @@ <translation id="6708242697268981054">Izvor:</translation> <translation id="6709357832553498500">Povezava z uporabo razširitve <ph name="EXTENSIONNAME" /></translation> <translation id="6710213216561001401">Nazaj</translation> -<translation id="6712158998835983046">Prikazani naj bodo vsi elementi in animirani elementi</translation> <translation id="6718273304615422081">Stiskanje ...</translation> <translation id="671928215901716392">Zakleni zaslon</translation> <translation id="6721972322305477112">&Datoteka</translation> @@ -4541,7 +4547,6 @@ <translation id="7088434364990739311">Zagon preverjanja posodobitve ni uspel (koda napake <ph name="ERROR" />).</translation> <translation id="708856090370082727">Omogočanje čezmernega pomikanja pri zaslonski tipkovnici. Če je ta zastavica nastavljena, zaslonska tipkovnica spremeni samo velikost vidnega območja.</translation> <translation id="7088674813905715446">Skrbnik je to napravo umaknil iz uporabe. Če jo želite omogočiti za včlanitev, naj jo skrbnik preklopi v stanje čakanja.</translation> -<translation id="7089609847854449639">Upravitelj shrambe</translation> <translation id="708969677220991657">Dovoli zahteve za »localhost« prek povezav HTTPS, tudi če je predloženo neveljavno potrdilo.</translation> <translation id="7092106376816104">Izjeme za pojavna okna</translation> <translation id="7093866338626856921">Izmenjava podatkov z napravami, imenovanimi: <ph name="HOSTNAMES" /></translation> @@ -4581,7 +4586,7 @@ <translation id="715118844758971915">Navadni tiskalniki</translation> <translation id="7154130902455071009">Sprememba začetne strani na: <ph name="START_PAGE" /></translation> <translation id="7155171745945906037">Obstoječa fotografija iz fotoaparata ali datoteke</translation> -<translation id="715568033737470079">Določanje vtičnikov PPAPI, ki se bodo izvajali v okviru pravilnika za zaklepanje peskovnika Win32k (samo sistem Windows 10 in novejši).</translation> +<translation id="7155226869555939647">Vedno odpri povezave za aplikacijo <ph name="APPLICATION" /></translation> <translation id="7156235233373189579">Ta datoteka je zasnovana za namizni računalnik, ki uporablja programsko opremo Windows. Ni združljiva z vašo napravo, ki uporablja sistem Chrome OS. Poiščite ustrezno nadomestno aplikacijo v <ph name="BEGIN_LINK" />Spletni trgovini Chrome<ph name="END_LINK" />.<ph name="BEGIN_LINK_HELP" />Več o tem<ph name="END_LINK_HELP" /></translation> <translation id="7157063064925785854">Če kliknete »Nadaljuj«, se strinjate s pogoji, ki jih določajo <ph name="LEGAL_DOC_LINK_TEXT_1" />, <ph name="LEGAL_DOC_LINK_TEXT_2" />, <ph name="LEGAL_DOC_LINK_TEXT_3" /> in <ph name="LEGAL_DOC_LINK_TEXT_4" />.</translation> <translation id="7158238151765743968">Povezava z napravo »<ph name="DEVICE_NAME" />« še vedno poteka.</translation> @@ -4596,6 +4601,7 @@ <translation id="7175353351958621980">Naloženo iz:</translation> <translation id="7180611975245234373">Osveži</translation> <translation id="7180865173735832675">Prilagodi</translation> +<translation id="7181387261278441780">Brisanje in ponastavitev podatkov spletnega mesta</translation> <translation id="7185078796915954712">TLS 1.3</translation> <translation id="7185690883425432021">Skrije gumbe za zapiranje na nedejavnih zavihkih, ko je vrstica zavihkov v zloženem načinu.</translation> <translation id="7186088072322679094">Ohrani v orodni vrstici</translation> @@ -4628,7 +4634,6 @@ <translation id="7223775956298141902">Ha ... Nimate razširitev :-(</translation> <translation id="7224023051066864079">Maska podomrežja:</translation> <translation id="7225179976675429563">Vrsta omrežja manjka</translation> -<translation id="7230191962699768124">Prikazani naj bodo vsi elementi in vsi neanimirani elementi</translation> <translation id="7230787553283372882">Prilagajanje velikosti besedila</translation> <translation id="7231224339346098802">Vnesite število izvodov, ki jih želite natisniti (1 ali več).</translation> <translation id="7238585580608191973">Prstni odtis SHA-256</translation> @@ -4760,7 +4765,6 @@ <translation id="7409233648990234464">Znova zaženi in izvedi funkcijo Powerwash</translation> <translation id="7409836189476010449">izvajati Flash</translation> <translation id="7410344089573941623">Vprašaj, če <ph name="HOST" /> zahteva dostop do kamere in mikrofona</translation> -<translation id="7411343637221933631">{NUM_COOKIES,plural, =1{1 s tega spletnega mesta}one{# s tega spletnega mesta}two{# s tega spletnega mesta}few{# s tega spletnega mesta}other{# s tega spletnega mesta}}</translation> <translation id="7412226954991670867">Pomnilnik grafičnega procesorja</translation> <translation id="7416362041876611053">Neznana napaka v omrežju.</translation> <translation id="7417453074306512035">Tipkovnica za etiopščino</translation> @@ -4882,6 +4886,7 @@ <translation id="756445078718366910">Odpri okno brskalnika</translation> <translation id="7564847347806291057">Končaj proces</translation> <translation id="7566723889363720618">F12</translation> +<translation id="7567314848159753396">Piškotek: <ph name="NAME" /></translation> <translation id="756809126120519699">Chromovi podatki so izbrisani.</translation> <translation id="7568790562536448087">Posodabljanje</translation> <translation id="7573172247376861652">Napolnjenost akumulatorja</translation> @@ -4922,6 +4927,7 @@ <translation id="7626009897377900107">Ustvarjanje gesel</translation> <translation id="7627262197844840899">To spletno mesto ne sprejema kartic MasterCard.</translation> <translation id="7627790789328695202">Ups, datoteka <ph name="FILE_NAME" /> že obstaja. Preimenujte jo in poskusite znova.</translation> +<translation id="7628127343934101653">Odpri datoteke PDF v privzeti aplikaciji za pregledovanje PDF-jev.</translation> <translation id="762917759028004464">Privzeti brskalnik je trenutno <ph name="BROWSER_NAME" />.</translation> <translation id="7629536005696009600">Dovoli izpolnjevanje ustreznih spletnih mest s poverilnicami, shranjenimi za aplikacije za Android.</translation> <translation id="7629827748548208700">Zavihek: <ph name="TAB_NAME" /></translation> @@ -5150,6 +5156,7 @@ <translation id="7957513156576779045">Vklop Bluetootha za omogočanje seznanjanja</translation> <translation id="7957615753207896812">Odpiranje nastavitev tipkovnice v napravi</translation> <translation id="7959074893852789871">Datoteka je vsebovala več potrdil in nekatera niso bila uvožena:</translation> +<translation id="7959700692661109221"><ph name="BEGIN_PARAGRAPH" />Googlova lokacijska storitev si pomaga z viri, kot so omrežja Wi-Fi, za hitrejše in natančnejše določanje lokacije. Ko vklopite Googlove lokacijske storitve, vaša naprava preklopi v način, ki uporablja omrežja Wi-Fi za posredovanje podatkov o lokaciji. To lahko kadar koli izklopite v nastavitvah lokacije.<ph name="END_PARAGRAPH" /></translation> <translation id="7961015016161918242">Nikoli</translation> <translation id="7964089325405904043">Uvoz in izvoz gesel</translation> <translation id="7965010376480416255">Pomnilnik za skupno rabo</translation> @@ -5300,6 +5307,7 @@ <translation id="8146793085009540321">Prijava ni uspela. Obrnite se na skrbnika in poskusite znova.</translation> <translation id="8148264977957212129">Način vnosa pinjin</translation> <translation id="8148913456785123871">Prikaz kartic Asistenta Google v zaganjalniku</translation> +<translation id="8150391391298684512">Onemogočanje API-ja MIDI izvajalnika sistema Windows</translation> <translation id="8151185429379586178">Orodja za razvijalce</translation> <translation id="8151638057146502721">Konfiguriraj</translation> <translation id="8151639108075998630">Omogoči brskanje gosta</translation> @@ -5582,6 +5590,7 @@ <translation id="8532294913309524834">Razvrstite jezike v želeni vrstni red.</translation> <translation id="8535005006684281994">Spletni naslov podaljšanja Netscapeovega potrdila</translation> <translation id="8539727552378197395">Ne (samo http)</translation> +<translation id="8541084862688000575">Samodejno nalaganje aplikacij za Android</translation> <translation id="8543181531796978784"><ph name="BEGIN_ERROR_LINK" />Prijavite lahko težavo z zaznavanjem<ph name="END_ERROR_LINK" />, če razumete varnostna tveganja, pa lahko <ph name="BEGIN_LINK" />obiščete to spletno mesto, ki ni varno<ph name="END_LINK" />.</translation> <translation id="8545107379349809705">Skrij informacije ...</translation> <translation id="8545211332741562162">Omogoči uporabo preskusnih funkcij JavaScripta na spletnih straneh.</translation> @@ -5609,7 +5618,6 @@ <translation id="8569764466147087991">Izberite datoteko, ki jo želite odpreti</translation> <translation id="8571032220281885258">Ko izgovorite »Ok Google« (V redu, Google), bo Chrome poiskal, kar izgovorite naslednje.</translation> <translation id="8571108619753148184">Strežnik 4</translation> -<translation id="8572832761467613633">Samo Flash</translation> <translation id="8572981282494768930">Ne dovoli spletnim mestom dostopa do kamere in mikrofona</translation> <translation id="8574234089711453001">Omogoči gumb za prenos, ki se prikaže pri odpiranju strani z URL-jem predstavnosti.</translation> <translation id="857779305329188634">Omogoči preizkusno podporo za protokol QUIC.</translation> @@ -5631,6 +5639,7 @@ <translation id="8600929685092827187">Preklop iz stanja pripravljenosti ob paketih</translation> <translation id="8601206103050338563">Preverjanje pristnosti odjemalca TLS WWW</translation> <translation id="8602851771975208551">Drug program v računalniku je dodal aplikacijo, ki lahko spremeni način delovanja Chroma.</translation> +<translation id="8603912787021349466">Omogočanje samodejnega zagona aplikacij za Android po prijavi.</translation> <translation id="8605428685123651449">Pomnilnik za SQLite</translation> <translation id="8605503133013456784">Ni bilo mogoče prekiniti povezave z napravo »<ph name="DEVICE_NAME" />«.</translation> <translation id="8606726445206553943">Uporaba naprav MIDI</translation> @@ -5983,6 +5992,7 @@ <translation id="9053965862400494292">Napaka pri nastavitvi sinhroniziranja.</translation> <translation id="9056034633062863292">Posodabljanje Chromeboxa</translation> <translation id="9056810968620647706">Ni ujemanj.</translation> +<translation id="9057119625587205566">Ni tiskalnikov v bližini</translation> <translation id="9059868303873565140">Meni stanja</translation> <translation id="9064142312330104323">Fotografija profila Google (nalaganje)</translation> <translation id="9064275926664971810">Omogoči samodejno izpolnjevanje za izpolnjevanje obrazcev z enim klikom</translation> @@ -5993,6 +6003,7 @@ <translation id="9067401056540256169">Če uporabljate to zastavico, Chrome ni varen. Uporabljajte jo samo, če se zavedate njenih posledic. Zastavica je lahko brez opozorila umaknjena. Če je omogočena, lahko okvirji z izvorom https uporabljajo povezave WebSocket z URL-jem, ki ni varen (ws://).</translation> <translation id="9068931793451030927">Pot:</translation> <translation id="9070219033670098627">Preklopi osebo</translation> +<translation id="9070940116164932228">Omejitev potratnih časovnikov v ozadju</translation> <translation id="907148966137935206">Ne dovoli nobenem mestu, da pokaže pojavna okna (priporočeno)</translation> <translation id="9072550133391925347"><ph name="PASSWORD_MANAGER_BRAND" /> vas z gesli, ki ste jih shranili, samodejno prijavi v ustrezna spletna mesta in aplikacije.</translation> <translation id="9073281213608662541">PAP</translation> @@ -6027,6 +6038,7 @@ <translation id="9112614144067920641">Izberite nov PIN.</translation> <translation id="9112748030372401671">Spreminjanje ozadja</translation> <translation id="9112987648460918699">Iskanje ...</translation> +<translation id="9114663181201435112">Preprosta prijava</translation> <translation id="9115487443206954631">Upravljanje naprav Cast</translation> <translation id="9115675100829699941">&Zaznamki</translation> <translation id="9121814364785106365">Odpri na pripetem zavihku</translation> @@ -6121,7 +6133,6 @@ <translation id="952992212772159698">Ni aktivirano</translation> <translation id="960719561871045870">Koda operaterja</translation> <translation id="960987915827980018">Še približno ena ura</translation> -<translation id="962778376131245616">Prikazani naj bodo samo elementi, ki niso varni, in so animirani</translation> <translation id="96421021576709873">Omrežje Wi-Fi</translation> <translation id="965490406356730238">Omogoči strojno pospešeno dekodiranje vsebine mjpeg za zajete sličice, kjer je to na voljo.</translation> <translation id="968174221497644223">Predpomnilnik aplikacij</translation>
diff --git a/chrome/app/resources/generated_resources_sr.xtb b/chrome/app/resources/generated_resources_sr.xtb index c48af8a9..93b7f3e 100644 --- a/chrome/app/resources/generated_resources_sr.xtb +++ b/chrome/app/resources/generated_resources_sr.xtb
@@ -18,7 +18,6 @@ <translation id="1029317248976101138">Зумирај</translation> <translation id="1029595648591494741">Желите ли да испробате апликацију „<ph name="EXTENSION_NAME" />“?</translation> <translation id="1031362278801463162">Учитавање прегледа</translation> -<translation id="1031460590482534116">Дошло је до грешке при покушају чувања сертификата клијента. Грешка <ph name="ERROR_NUMBER" /> (<ph name="ERROR_NAME" />).</translation> <translation id="1031573127485938293">Питај (контролишу смернице)</translation> <translation id="103279545524624934">Ослободите простор на диску да бисте покренули Android апликације.</translation> <translation id="1033780634303702874">Приступ серијским уређајима</translation> @@ -101,6 +100,7 @@ <translation id="1128591060186966949">Измена претраживача</translation> <translation id="1128987120443782698">Меморијски уређај има капацитет од <ph name="DEVICE_CAPACITY" />. Уметните SD картицу или USB меморијски уређај са најмање 4 GB капацитета.</translation> <translation id="1137135726305341424">domContentLoaded и сва учитавања ресурса започета пре domContentLoaded (главни оквир и исти iframe-ови порекла).</translation> +<translation id="1138663153846032155">Дај предност HTML-у над Flash-ом</translation> <translation id="1140351953533677694">Приступ Bluetooth и серијским уређајима</translation> <translation id="114140604515785785">Основни директ. додатка:</translation> <translation id="1143142264369994168">Потписник сертификата</translation> @@ -252,6 +252,7 @@ <translation id="1351692861129622852">Увозе се датотеке (<ph name="FILE_COUNT" />)...</translation> <translation id="1352103415082130575">Тајска тастатура (Pattachote)</translation> <translation id="1353686479385938207"><ph name="PROVIDER_NAME" />: <ph name="NETWORK_NAME" /></translation> +<translation id="1353946958707294039">Менаџер меморијског простора за материјални дизајн</translation> <translation id="1353966721814789986">Странице приликом покретања</translation> <translation id="1354868058853714482">Adobe Reader је застарео и можда није безбедан.</translation> <translation id="1355408554203439639">3D софтверска алатка за растеризацију</translation> @@ -420,7 +421,6 @@ <translation id="1533920822694388968">ТВ поравнање</translation> <translation id="15373452373711364">Велики курсор</translation> <translation id="1543284117603151572">Увезени из Edge-а</translation> -<translation id="1544350195767834591">{NUM_COOKIES,plural, =1{1 са других сајтова}one{# са других сајтова}few{# са других сајтова}other{# са других сајтова}}</translation> <translation id="1545177026077493356">Аутоматски режим киоска</translation> <translation id="1545786162090505744">URL са %s уместо упита</translation> <translation id="1546280085599573572">Овај додатак је променио страницу која се приказује када кликнете на дугме Почетна.</translation> @@ -444,7 +444,6 @@ <translation id="1559235587769913376">Унос Unicode знакова</translation> <translation id="1561092721008294962">HarfBuzz за текст корисничког интерфејса</translation> <translation id="1566049601598938765">Веб-сајт</translation> -<translation id="1566958206723629112">За Flash и PDF</translation> <translation id="1567723158593978621">Када је омогућено, за пријављивање ће се користити нови GAIA ток пријављивања са посебним уносом лозинке.</translation> <translation id="1567993339577891801">JavaScript конзола</translation> <translation id="1568323446248056064">Отвори подешавања уређаја за екран</translation> @@ -521,7 +520,7 @@ <translation id="1658424621194652532">Ова страница приступа микрофону.</translation> <translation id="1661245713600520330">Ова страница наводи све модуле учитане у главни процес и модуле регистроване за накнадно учитавање.</translation> <translation id="166179487779922818">Лозинка је прекратка.</translation> -<translation id="16620462294541761">Жао нам је, нисмо успели да верификујемо лозинку. Покушајте поново.</translation> +<translation id="16620462294541761">Жао нам је, нисмо успели да верификујемо лозинку. Пробајте поново.</translation> <translation id="166278006618318542">Алгоритам јавног кључа субјекта</translation> <translation id="1662837784918284394">(ништа)</translation> <translation id="1663298465081438178">Сјајне функције које функционишу беспрекорно.</translation> @@ -573,7 +572,6 @@ <translation id="1723940674997333416">Омогући небезбедни WebSocket са https пореклом</translation> <translation id="1725149567830788547">Прикажи &контроле</translation> <translation id="172612876728038702">TPM се подешава. Будите стрпљиви, ово може да потраје неколико минута.</translation> -<translation id="1727135806684246609">Опширан опис безбедности за материјални дизајн</translation> <translation id="1729533290416704613">Контролише и страницу која се приказује када претражујете из омнибокса.</translation> <translation id="1731346223650886555">Тачка и зарез</translation> <translation id="1731589410171062430">Укупно: <ph name="NUMBER_OF_SHEETS" /><ph name="SHEETS_LABEL" /> (<ph name="NUMBER_OF_PAGES" /> <ph name="PAGE_OR_PAGES_LABEL" />)</translation> @@ -609,7 +607,7 @@ <translation id="1779766957982586368">Затварање прозора</translation> <translation id="1781502536226964113">Отвори нову картицу</translation> <translation id="1782196717298160133">Тражимо телефон</translation> -<translation id="1782924894173027610">Сервер за синхронизацију је заузет. Покушајте поново касније.</translation> +<translation id="1782924894173027610">Сервер за синхронизацију је заузет. Пробајте поново касније.</translation> <translation id="1783075131180517613">Ажурирај приступну фразу за синхронизацију</translation> <translation id="1784849162047402014">Уређају понестаје простора на диску</translation> <translation id="1788636309517085411">Користи подразумевано</translation> @@ -870,6 +868,7 @@ <translation id="218492098606937156">Омогући догађаје са додиром</translation> <translation id="2187317261103489799">Откриј (подразумевано)</translation> <translation id="2187895286714876935">Грешка при увозу серверског сертификата</translation> +<translation id="2188881192257509750">Отвори <ph name="APPLICATION" /></translation> <translation id="2190069059097339078">Добијање акредитива за Wi-Fi</translation> <translation id="219008588003277019">Модул оригиналног клијента: <ph name="NEXE_NAME" /></translation> <translation id="2190355936436201913">(празно)</translation> @@ -988,6 +987,7 @@ <translation id="2326606747676847821">Пређи у режим без архивирања</translation> <translation id="2326931316514688470">&Поново учитај апликацију</translation> <translation id="2327492829706409234">Омогући апликацију</translation> +<translation id="2328054044222305089">Овим ћете избрисати све податке које је <ph name="SITE" /> сачувао на уређају и ресетоваћете све дозволе које сте доделили за покретање. Желите ли да наставите?</translation> <translation id="2329597144923131178">Пријавите се да би вам обележивачи, историја, лозинке и друга подешавања били доступни на свим уређајима.</translation> <translation id="2332131598580221120">Прикажи у продавници</translation> <translation id="2332742915001411729">Врати на подразумевану вредност</translation> @@ -1220,7 +1220,7 @@ <translation id="2620436844016719705">Систем</translation> <translation id="26224892172169984">Не дозволи ниједном сајту да рукује протоколима</translation> <translation id="2624142942574147739">Ова страница приступа камери и микрофону.</translation> -<translation id="2626799779920242286">Покушајте поново касније.</translation> +<translation id="2626799779920242286">Пробајте поново касније.</translation> <translation id="2630681426381349926">Повежите са Wi-Fi-јем да бисте започели</translation> <translation id="2631006050119455616">Сачувано</translation> <translation id="2631498379019108537">Приказуј опције уноса у полици</translation> @@ -1262,7 +1262,6 @@ <translation id="2675358154061544447">Рана експериментална фаза подршке за приказивање iframe-ова на више сајтова у одвојеним процесима. У овом режиму документи ће делити процес приказивача само ако потичу са истог веб-сајта.</translation> <translation id="2676946222714718093">Пуштено на</translation> <translation id="2678063897982469759">Поново омогући</translation> -<translation id="2678246812096664977">Све додатне компоненте</translation> <translation id="2679385451463308372">Одштампај помоћу системског дијалога…</translation> <translation id="2680208403056680091">Интернет веза се контролише</translation> <translation id="268053382412112343">Hi&story (Историја)</translation> @@ -1436,7 +1435,6 @@ <translation id="287286579981869940">Додај <ph name="PROVIDER_NAME" />...</translation> <translation id="2872961005593481000">Искључи</translation> <translation id="2875698561019555027">(Chrome странице са грешкама)</translation> -<translation id="2879560882721503072">Сертификат клијента је успешно ускладиштен <ph name="ISSUER" />.</translation> <translation id="288024221176729610">чешки</translation> <translation id="288042212351694283">Приступ универзалним уређајима за 2. фактор</translation> <translation id="2881966438216424900">Последњи приступ:</translation> @@ -1585,6 +1583,7 @@ <translation id="3057861065630527966">Направите резервне копије слика и видео снимака</translation> <translation id="3058212636943679650">Ако икада буде потребно да вратите оперативни систем рачунара биће вам потребна SD картица за обнављање или USB меморијски уређај.</translation> <translation id="305932878998873762">Једноставни кеш за HTTP је нови кеш. Ослања се на систем датотека за доделу простора на диску.</translation> +<translation id="3060251871394327123">Овим ћете избрисати све податке које је <ph name="SITE" /> сачувао на уређају. Желите ли да наставите?</translation> <translation id="3061650404498811439">Омогућава приступ емоџијима, рукопису и гласовном уносу у менију за омогућавање IME-ја.</translation> <translation id="3062606427884046423">Користи Android обавештења у стилу медија за Chrome обавештења о медијима.</translation> <translation id="3063844757726132584">Приступајте свим апликацијама из овог практичног покретача. Играјте игре, користите видео ћаскање, слушајте музику, мењајте документе или набавите још апликација.</translation> @@ -1634,6 +1633,7 @@ <translation id="3123569374670379335">(Под надзором)</translation> <translation id="3124111068741548686">КОРИСНИЧКИ надимци</translation> <translation id="3126026824346185272">Ctrl</translation> +<translation id="3127156390846601284">Овим ћете избрисати све податке сачуване на уређају за све приказане сајтове. Желите ли да наставите?</translation> <translation id="312759608736432009">Произвођач уређаја:</translation> <translation id="3127919023693423797">Потврђивање идентитета...</translation> <translation id="3128230619496333808">6. картица</translation> @@ -1732,7 +1732,6 @@ <translation id="3264544094376351444">Фонт Sans-serif</translation> <translation id="3264547943200567728">Нисмо успели да подесимо мрежу Chromebox-а</translation> <translation id="3265459715026181080">Затвори прозор</translation> -<translation id="3267271790328635957">Само за PDF</translation> <translation id="3267726687589094446">Настави да дозвољаваш аутоматска преузимања више датотека</translation> <translation id="3267998849713137817">Време измене</translation> <translation id="3268451620468152448">Отворене картице</translation> @@ -1978,6 +1977,7 @@ <translation id="3574210789297084292">пријави ме</translation> <translation id="3574305903863751447"><ph name="CITY" />, <ph name="STATE" /> <ph name="COUNTRY" /></translation> <translation id="357479282490346887">литвански</translation> +<translation id="3575927481544652747">Онемогућите Windows Runtime MIDI API за WebMIDI, који је подразумевано омогућен у Windows-у 10 или новијим верзијама.</translation> <translation id="3576324189521867626">Инсталирано је</translation> <translation id="3578331450833904042">Подразумевано (детектује све)</translation> <translation id="3578594933904494462">Садржај ове картице се дели.</translation> @@ -2031,8 +2031,6 @@ <translation id="3627320433825461852">Остало је мање од 1 минута</translation> <translation id="3627588569887975815">Отвори везу у прозору за прегледање без архивирања</translation> <translation id="3627671146180677314">Време за обнову Netscape сертификата</translation> -<translation id="3629326610814700057">Омогућава менаџеру меморијског простора да управља локалним меморијским простором.</translation> -<translation id="3630337581925712713"><ph name="PERMISSION_TYPE_LABEL" />:</translation> <translation id="3631337165634322335">Доленаведени изузеци примењују се само на тренутну сесију без архивирања.</translation> <translation id="3633586230741134985">Подешавања Покретача апликација</translation> <translation id="3633997706330212530">Можете опционално да онемогућите ове услуге.</translation> @@ -2055,7 +2053,8 @@ <translation id="3654045516529121250">Читање подешавања приступачности</translation> <translation id="3654092442379740616">Грешка при синхронизацији: Производ <ph name="PRODUCT_NAME" /> је застарео и треба да га ажурирате.</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{Има сталан приступ једној датотеци.}one{Има сталан приступ # датотеци.}few{Има сталан приступ за # датотеке.}other{Има сталан приступ за # датотека.}}</translation> -<translation id="3657468915905674858">Омогући Win32k закључавање за PPAPI.</translation> +<translation id="365793796291733849"><ph name="BEGIN_PARAGRAPH1" />Када укључите аутоматско прављење резервних копија, подаци уређаја и апликација се повремено чувају у приватном директоријуму на Google диску. Подаци апликација могу да буду било који подаци које је нека апликација сачувала (на основу подешавања програмера), укључујући потенцијално осетљиве податке као што су контакти, поруке и слике.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Резервне копије података не улазе у квоту меморијског простора Диска. За велике датотеке или датотеке које су одлуком програмера изузете из услуге не праве се резервне копије.<ph name="END_PARAGRAPH2" /></translation> <translation id="3660234220361471169">Непоуздани</translation> <translation id="3665589677786828986">Chrome је открио да је други програм оштетио нека од подешавања и ресетовао их је на првобитне подразумеване вредности.</translation> <translation id="3665842570601375360">Безбедност:</translation> @@ -2110,6 +2109,7 @@ <translation id="3733127536501031542">SSL сервер са могућношћу преласка на новију верзију</translation> <translation id="3736520371357197498">Ако разумете безбедносне ризике, можете да <ph name="BEGIN_LINK" />посетите овај небезбедни сајт<ph name="END_LINK" /> пре него што уклонимо опасне програме.</translation> <translation id="3738924763801731196"><ph name="OID" />:</translation> +<translation id="3739254215541673094">Желите ли да отворите <ph name="APPLICATION" />?</translation> <translation id="3739798227959604811">Одлагање пре понављања:</translation> <translation id="3741158646617793859"><ph name="DEVICE_NAME" /> ће се сада приказивати у Admin Console</translation> <translation id="3741243925913727067">Направите резервне копије слика и видео снимака са медијског уређаја на Google диску.</translation> @@ -2348,7 +2348,6 @@ <translation id="4058793769387728514">Провери документ одмах</translation> <translation id="4059285154003114015">&Одштампај оквир...</translation> <translation id="406070391919917862">Позадинске апликације</translation> -<translation id="4061502419206152498">Приказуј само небезбедно, неанимирано</translation> <translation id="4062251648694601778">Уживајте у <ph name="SHORT_PRODUCT_NAME" /> уређају. Имате питања? Увек можете да добијете помоћ кликом на „?“ у палети статуса.</translation> <translation id="4065876735068446555">Мрежа коју користите (<ph name="NETWORK_ID" />) ће можда захтевати да посетите страницу за пријављивање.</translation> <translation id="4068506536726151626">Ова страница садржи елементе са следећих сајтова који прате локацију на којој се налазите:</translation> @@ -2387,7 +2386,6 @@ <translation id="4101878899871018532">Менаџер лозинки неће нудити да чува акредитив који се користи за синхронизацију.</translation> <translation id="410351446219883937">Аутоплеј</translation> <translation id="4104163789986725820">И&звези...</translation> -<translation id="4105523032910086267">Подешава анимацију и видљивост опширног описа безбедности у материјалном дизајну.</translation> <translation id="4105563239298244027">Набавите 1 TB бесплатно на Google диску</translation> <translation id="4109135793348361820">Премести прозор код <ph name="USER_NAME" /> (<ph name="USER_EMAIL" />)</translation> <translation id="4110342520124362335">Колачићи хоста <ph name="DOMAIN" /> су блокирани.</translation> @@ -2438,6 +2436,7 @@ <translation id="418179967336296930">Руска фонетска тастатура (YaZHert)</translation> <translation id="4181841719683918333">Језици</translation> <translation id="4187248015940562149">Омогућава Bluetooth за веб који може да омогући веб-сајтовима да се повезују са Bluetooth уређајима око вас и да их контролишу.</translation> +<translation id="4188447344915957833">Омогућава менаџер меморијског простора у подешавањима материјалног дизајна.</translation> <translation id="4189406272289638749">Додатак, <b><ph name="EXTENSION_NAME" /></b>, контролише ово подешавање.</translation> <translation id="4193154014135846272">Google документ</translation> <translation id="4193182321948161343">Омогући менаџера корисника за материјални дизајн</translation> @@ -2645,6 +2644,7 @@ <translation id="4508765956121923607">Прикажи и&звор</translation> <translation id="4509017836361568632">Одбаци слику</translation> <translation id="4509345063551561634">Локација:</translation> +<translation id="4513946894732546136">Повратне информације</translation> <translation id="4514542542275172126">Подесите новог корисника под надзором</translation> <translation id="4514914692061505365">Принудно активира коришћење PNaCl-ов брзог Subzero преводиоца за све pexe датотеке.</translation> <translation id="451515744433878153">Уклони</translation> @@ -2657,7 +2657,7 @@ <translation id="4534166495582787863">Омогућава клик са три прста на тачпеду као средње дугме.</translation> <translation id="4534799089889278411">Реците „Ok Google“ на новој картици, на сајту google.com и у Покретачу апликација</translation> <translation id="4535127706710932914">Подразумевани профил</translation> -<translation id="4536418791685807335">Покушајте поново да се пријавите.</translation> +<translation id="4536418791685807335">Пробајте поново да се пријавите.</translation> <translation id="4538417792467843292">Брисање речи</translation> <translation id="4538684596480161368">Увек блокирај додатне компоненте које су изван заштићеног окружења на <ph name="HOST" /></translation> <translation id="4538792345715658285">Инсталирано је према смерницама за предузеће.</translation> @@ -2743,6 +2743,7 @@ <translation id="4656293982926141856">Овај рачунар</translation> <translation id="4656631038341342120">Омогућите командно окружење за виртуелну реалност ако је доступно за овај уређај.</translation> <translation id="4657031070957997341">Увек дозволи додатне компоненте на <ph name="HOST" /></translation> +<translation id="466008749075469935">Омогућава ограничавање тајмера у позадини тако да користе само 1% процесора.</translation> <translation id="4663254525753315077">Када је то могуће, ставља садржај за померање елемента за померање сувишног садржаја на композитни слој ради бржег померања.</translation> <translation id="4664482161435122549">Грешка при извозу PKCS #12 стандарда</translation> <translation id="4665014895760275686">Произвођач</translation> @@ -2811,6 +2812,7 @@ <translation id="4749157430980974800">Грузијска тастатура</translation> <translation id="4750394297954878236">Предлози</translation> <translation id="475088594373173692">Први корисник</translation> +<translation id="4750892496809949692">Дајте предност HTML садржају тако што ћете сакрити Flash са листе додатних компоненти.</translation> <translation id="4750917950439032686">Информације (на пример, лозинке или бројеви кредитних картица) су приватне када се шаљу овом сајту.</translation> <translation id="4753602155423695878">Анимација траке напретка за учитавање страница на Android телефонима</translation> <translation id="4755240240651974342">Језик тастатуре: фински</translation> @@ -2863,7 +2865,7 @@ ****НЕ МЕЊАЈТЕ СТАВКЕ ИСПОД ОВЕ ЛИНИЈЕ****</translation> <translation id="4820334425169212497">Не, не видим га</translation> -<translation id="4821086771593057290">Лозинка је промењена. Покушајте поново са новом лозинком.</translation> +<translation id="4821086771593057290">Лозинка је промењена. Пробајте поново са новом лозинком.</translation> <translation id="4821935166599369261">&Профилисање је омогућено</translation> <translation id="4823484602432206655">Читање и мењање подешавања корисника и уређаја</translation> <translation id="4824518112777153488">Подршка за додирне екране на којима је омогућено прелажење курсором</translation> @@ -3085,6 +3087,7 @@ <translation id="5119450342834678097">Опција Захтевај сајт таблета у менију подешавања</translation> <translation id="5120068803556741301">Метод уноса треће стране</translation> <translation id="5120421890733714118">Веруј овом сертификату за идентификацију веб сајтова.</translation> +<translation id="5120516977819314347">PIN или лозинка су нетачни.</translation> <translation id="5121130586824819730">Хард-диск је пун. Сачувајте на другу локацију или направите више простора на хард-диску.</translation> <translation id="5125751979347152379">Неважећа URL адреса.</translation> <translation id="5127881134400491887">Управљање мрежним везама</translation> @@ -3092,6 +3095,7 @@ <translation id="512903556749061217">прикључено</translation> <translation id="5129301143853688736">Веза са овим сајтом није приватна. Нападачи можда покушавају да вам украду податке (на пример, слике, лозинке, поруке и кредитне картице) са <ph name="DOMAIN" />.</translation> <translation id="5129662217315786329">пољски</translation> +<translation id="5131347545782851480">PDF документи</translation> <translation id="5134856901811723984">Материјални дизајн у корисничком интерфејсу за Chrome ОС</translation> <translation id="5135533361271311778">Није могуће направити обележивач.</translation> <translation id="5136529877787728692">F7</translation> @@ -3197,7 +3201,7 @@ <translation id="52550593576409946">Није могуће покренути киоск апликацију.</translation> <translation id="5255315797444241226">Приступна фраза коју сте унели је нетачна.</translation> <translation id="5258266922137542658">PPAPI (у процесу)</translation> -<translation id="5260508466980570042">Жао нам је, нисмо успели да верификујемо имејл или лозинку. Покушајте поново.</translation> +<translation id="5260508466980570042">Жао нам је, нисмо успели да верификујемо имејл или лозинку. Пробајте поново.</translation> <translation id="5262311848634918433"><ph name="MARKUP_1" />Приступајте датотекама било где, чак и офлајн.<ph name="MARKUP_2" /> Датотеке на Google диску су ажуриране и доступне са било ког уређаја.<ph name="MARKUP_3" /> <ph name="MARKUP_4" />Заштитите датотеке.<ph name="MARKUP_5" /> @@ -3251,7 +3255,7 @@ <translation id="5316716239522500219">Пресликавање монитора</translation> <translation id="5317780077021120954">Сачувај</translation> <translation id="5319782540886810524">Језик тастатуре: летонски</translation> -<translation id="532247166573571973">Сервер је можда недоступан. Покушајте поново касније.</translation> +<translation id="532247166573571973">Сервер је можда недоступан. Пробајте поново касније.</translation> <translation id="5323213332664049067">Латинска Америка</translation> <translation id="532360961509278431">Није могуће отворити „$1“: $2</translation> <translation id="5324780743567488672">Аутоматски подеси временску зону помоћу моје локације</translation> @@ -3260,6 +3264,7 @@ <translation id="5328031682234198929">8</translation> <translation id="5329858601952122676">&Избриши</translation> <translation id="5330145655348521461">Ове датотеке су отворене на другом профилу. Пређите на <ph name="USER_NAME" /> (<ph name="MAIL_ADDRESS" />) да бисте их погледали.</translation> +<translation id="5330512191124428349">Преузми податке</translation> <translation id="5332624210073556029">Временска зона:</translation> <translation id="5333807720589685258">SIM картица ће бити трајно онемогућена ако не унесете исправну шифру за откључавање PIN-а.</translation> @@ -3605,7 +3610,7 @@ <translation id="5778550464785688721">Потпуна контрола над MIDI уређајима</translation> <translation id="5780066559993805332">(Најбоља)</translation> <translation id="5780973441651030252">Приоритет процеса</translation> -<translation id="5783221160790377646">Корисник под надзором није направљен због грешке. Покушајте поново касније.</translation> +<translation id="5783221160790377646">Корисник под надзором није направљен због грешке. Пробајте поново касније.</translation> <translation id="57838592816432529">Искључи звук</translation> <translation id="5787146423283493983">Слагање кључа</translation> <translation id="5788367137662787332">Жао нам је, најмање једну партицију на уређају <ph name="DEVICE_LABEL" /> није било могуће укључити.</translation> @@ -3658,7 +3663,7 @@ <ph name="BEGIN_LINK_HELP" />Сазнајте више<ph name="END_LINK_HELP" /></translation> <translation id="5851063901794976166">Овде нема ничега...</translation> <translation id="5851868085455377790">Издавалац</translation> -<translation id="5852112051279473187">Упс! Дошло је до озбиљног проблема док смо пријављивали овај уређај. Покушајте поново или контактирајте представника подршке.</translation> +<translation id="5852112051279473187">Упс! Дошло је до озбиљног проблема док смо пријављивали овај уређај. Пробајте поново или контактирајте представника подршке.</translation> <translation id="5852137567692933493">Поново покрени и обави Powerwash</translation> <translation id="5854409662653665676">Ако често имате проблеме, можете да пробате следеће да бисте решили проблем са овим модулом:</translation> <translation id="5854912040170951372">Парче</translation> @@ -3694,7 +3699,6 @@ <translation id="5892507820957994680">Замењује листу за приказ уграђеног софтвера и омогућава GPU убрзање у неподржаним системским конфигурацијама.</translation> <translation id="5895138241574237353">Покрени поново</translation> <translation id="5895187275912066135">Издато</translation> -<translation id="5898154795085152510">Сервер је вратио неважећи сертификат клијента. Грешка <ph name="ERROR_NUMBER" /> (<ph name="ERROR_NAME" />).</translation> <translation id="5900302528761731119">Слика Google профила</translation> <translation id="590253956165195626">Нуди превод страница које нису на језику који читам.</translation> <translation id="5904093760909470684">Конфигурација проксија</translation> @@ -3749,6 +3753,8 @@ <translation id="5984222099446776634">Недавно посећено</translation> <translation id="5984814259619230127">Откривање за Smart Lock помоћу Bluetooth-а са ниском потрошњом</translation> <translation id="5986245990306121338">Ако омогућите ову опцију, пребацивач картица ће се приказивати чак и када је опција „Обједини картице и апликације“ укључена у подешавањима.</translation> +<translation id="5989712527536636369"><ph name="BEGIN_PARAGRAPH1" />Ово су општи подаци о уређају и начину на који га користите, на пример, ниво батерије, колико често користите апликације, квалитет и трајање мрежних веза (нпр. Wi-Fi и Bluetooth) и извештаји о отказивању када нешто не ради исправно. Ови подаци ће се користити за побољшање Google производа и услуга за све кориснике. Неке обједињене информације помажу и партнерима, попут Android програмера, да побољшају апликације и производе.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Ово можете да укључите и искључите у било ком тренутку у подешавањима Android апликација. То не утиче на могућност уређаја да шаље информације потребне за добијање основних услуга попут ажурирања система и безбедности.<ph name="END_PARAGRAPH2" /></translation> <translation id="5990198433782424697">Додаци на URL-овима chrome://</translation> <translation id="5990814808592353318">Ручно генерисање лозинки.</translation> <translation id="5991049340509704927">Увећање приказа</translation> @@ -3762,6 +3768,7 @@ <translation id="6005695835120147974">Рутер за медије</translation> <translation id="6007237601604674381">Премештање није успело. <ph name="ERROR_MESSAGE" /></translation> <translation id="6008241731410823808">Шаље пингове сигнала за проверу хиперлинкова.</translation> +<translation id="6011449291337289699">Обришите податке сајта</translation> <translation id="6015796118275082299">Година</translation> <translation id="6016551720757758985">Потврђивање Powerwash-а уз враћање на претходну верзију</translation> <translation id="6016809788585079594">Реците „ОК Google“ још само једном</translation> @@ -3951,7 +3958,6 @@ <translation id="6276301056778294989">Проверите да ли уређај приказује исти кôд.</translation> <translation id="6277105963844135994">Временско ограничење мреже</translation> <translation id="6277518330158259200">С&ними екран</translation> -<translation id="6278428485366576908">Тема</translation> <translation id="6279183038361895380">Притисните |<ph name="ACCELERATOR" />| да бисте приказали показивач</translation> <translation id="6280215091796946657">Пријави ме на други налог</translation> <translation id="6280912520669706465">ARC</translation> @@ -3974,7 +3980,7 @@ <translation id="6307722552931206656">Google сервери назива – <ph name="BEGIN_LINK" />Сазнајте више<ph name="END_LINK" /></translation> <translation id="6307990684951724544">Систем је заузет</translation> <translation id="6308937455967653460">Сачувај ве&зу као...</translation> -<translation id="6311220991371174222">Не можемо да покренемо Chrome јер је дошло до проблема при отварању профила. Покушајте поново да покренете Chrome.</translation> +<translation id="6311220991371174222">Не можемо да покренемо Chrome јер је дошло до проблема при отварању профила. Пробајте поново да покренете Chrome.</translation> <translation id="6314335155547195432">Генериши лозинку</translation> <translation id="6314819609899340042">Омогућили сте функције за отклањање грешака на овом <ph name="IDS_SHORT_PRODUCT_NAME" /> уређају.</translation> <translation id="6315493146179903667">Премести све напред</translation> @@ -4014,7 +4020,7 @@ <translation id="6370021412472292592">Учитавање манифеста није могуће.</translation> <translation id="637062427944097960">Ова датотека је отворена на другом профилу. Пређите на <ph name="USER_NAME" /> (<ph name="MAIL_ADDRESS" />) да бисте је погледали.</translation> <translation id="6374077068638737855">Iceweasel</translation> -<translation id="6374469231428023295">Покушај поново</translation> +<translation id="6374469231428023295">Пробај поново</translation> <translation id="6380143666419481200">Прихвати и настави</translation> <translation id="6380224340023442078">Подешавања садржаја...</translation> <translation id="6383194710567510941">Омогућава коришћење API-ја chrome.input.ime.</translation> @@ -4202,6 +4208,7 @@ <translation id="6607272825297743757">Информације о датотеци</translation> <translation id="6607831829715835317">Још а&латки</translation> <translation id="6608140561353073361">Сви колачићи и подаци о сајтовима...</translation> +<translation id="6610183966322615106">Грешка при додавању штампача</translation> <translation id="6610610633807698299">Унесите URL адресу...</translation> <translation id="6612358246767739896">Заштићени садржај</translation> <translation id="6615455863669487791">Покажи ми</translation> @@ -4265,7 +4272,6 @@ <translation id="6708242697268981054">Извор:</translation> <translation id="6709357832553498500">Повежи се помоћу <ph name="EXTENSIONNAME" /></translation> <translation id="6710213216561001401">Претходно</translation> -<translation id="6712158998835983046">Прикажи све, анимирано</translation> <translation id="6718273304615422081">Прављење zip датотеке...</translation> <translation id="671928215901716392">Закључај екран</translation> <translation id="6721972322305477112">&File (Датотека)</translation> @@ -4528,7 +4534,7 @@ <translation id="7075513071073410194">PKCS #1 MD5 са RSA шифровањем</translation> <translation id="7075625805486468288">Управљање HTTPS/SSL сертификатима и подешавањима</translation> <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="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="7078120482318506217">Све мреже</translation> <translation id="708060913198414444">К&опирај адресу аудио садржаја</translation> @@ -4537,7 +4543,6 @@ <translation id="7088434364990739311">Покретање провере ажурирања није успело (кôд грешке <ph name="ERROR" />).</translation> <translation id="708856090370082727">Омогућите померање преко ивице на тастатури на екрану. Ако укључите ову ознаку, тастатура на екрану ће променити величину само визуелне области приказа.</translation> <translation id="7088674813905715446">Администратор је уклонио овај уређај. Да бисте га омогућили за регистрацију, затражите од администратора да промени његов статус у „На чекању“.</translation> -<translation id="7089609847854449639">Менаџер меморијског простора</translation> <translation id="708969677220991657">Дозвољава локално хостовање захтева преко HTTPS-а чак и када се прикаже неважећи сертификат.</translation> <translation id="7092106376816104">Изузеци за искачуће прозоре</translation> <translation id="7093866338626856921">Размена података са уређајима следећих назива: <ph name="HOSTNAMES" /></translation> @@ -4545,7 +4550,7 @@ <translation id="7096108453481049031">Није могуће увести корисника под надзором. Проверите мрежну везу и покушајте поново касније.</translation> <translation id="7100897339030255923">Изабраних ставки: <ph name="COUNT" /></translation> <translation id="710227449793100220">Token Binding.</translation> -<translation id="7105578512429498960">Инсталирајте <ph name="PLUGIN_NAME" /> да бисте приказивали овај садржај</translation> +<translation id="7105578512429498960">Инсталирајте <ph name="PLUGIN_NAME" /> да бисте видели овај садржај</translation> <translation id="7106346894903675391">Купи још меморијског простора...</translation> <translation id="7108338896283013870">Сакриј</translation> <translation id="7108668606237948702">enter</translation> @@ -4573,11 +4578,11 @@ <translation id="7140928199327930795">Нема других доступних уређаја.</translation> <translation id="7141105143012495934">Пријављивање није успело јер нисмо успели да преузмемо детаље о налогу. Контактирајте администратора или покушајте поново.</translation> <translation id="7143207342074048698">Повезивање</translation> -<translation id="7144878232160441200">Покушај поново</translation> +<translation id="7144878232160441200">Пробај поново</translation> <translation id="715118844758971915">Класични штампачи</translation> <translation id="7154130902455071009">Промените почетну страницу у: <ph name="START_PAGE" /></translation> <translation id="7155171745945906037">Постојећа фотографија из камере или датотеке</translation> -<translation id="715568033737470079">Наводи PPAPI додатне компоненте које ће се покретати у оквиру смерница за заштићено окружење Win32k закључавања (само за Windows 10 и новије верзије).</translation> +<translation id="7155226869555939647">Увек отварај линкове за <ph name="APPLICATION" /></translation> <translation id="7156235233373189579">Ова датотека је дизајнирана за рачунар који користи Windows софтвер. Она није компатибилна са вашим уређајем који користи Chrome ОС. Претражите <ph name="BEGIN_LINK" />Chrome веб-продавницу<ph name="END_LINK" /> да бисте пронашли одговарајућу апликацију за замену.<ph name="BEGIN_LINK_HELP" />Сазнајте више<ph name="END_LINK_HELP" /></translation> <translation id="7157063064925785854">Кликом на Настави прихватате документе <ph name="LEGAL_DOC_LINK_TEXT_1" />, <ph name="LEGAL_DOC_LINK_TEXT_2" />, <ph name="LEGAL_DOC_LINK_TEXT_3" /> и <ph name="LEGAL_DOC_LINK_TEXT_4" />.</translation> <translation id="7158238151765743968">Повезивање са уређајем „<ph name="DEVICE_NAME" />“ је још увек у току.</translation> @@ -4592,6 +4597,7 @@ <translation id="7175353351958621980">Учитава се са:</translation> <translation id="7180611975245234373">Освежи</translation> <translation id="7180865173735832675">Прилагоди</translation> +<translation id="7181387261278441780">Обришите и ресетујте сајт</translation> <translation id="7185078796915954712">TLS 1.3</translation> <translation id="7185690883425432021">Крије дугмад за затварање на неактивним картицама када је трака са картицама у режиму групе.</translation> <translation id="7186088072322679094">Задржи на траци с алаткама</translation> @@ -4624,7 +4630,6 @@ <translation id="7223775956298141902">Уа... Немате додатака :-(</translation> <translation id="7224023051066864079">Маска подмреже:</translation> <translation id="7225179976675429563">Недостаје тип мреже</translation> -<translation id="7230191962699768124">Прикажи све, неанимирано</translation> <translation id="7230787553283372882">Прилагодите величину текста</translation> <translation id="7231224339346098802">Наведите број примерака за штампање (1 или више).</translation> <translation id="7238585580608191973">SHA-256 Fingerprint</translation> @@ -4690,7 +4695,7 @@ <translation id="7329154610228416156">Пријављивање није успело јер је конфигурисано за коришћење небезбедног URL-а (<ph name="BLOCKED_URL" />). Контактирајте администратора.</translation> <translation id="7331786426925973633">Веб прегледач направљен за брзину, једноставност и безбедност</translation> <translation id="733186066867378544">Изузеци за географску локацију</translation> -<translation id="7334190995941642545">Smart Lock тренутно није доступан. Покушајте поново касније.</translation> +<translation id="7334190995941642545">Smart Lock тренутно није доступан. Пробајте поново касније.</translation> <translation id="7339763383339757376">PKCS #7, један сертификат</translation> <translation id="7339785458027436441">Проверавај правопис током куцања</translation> <translation id="7339898014177206373">Нови прозор</translation> @@ -4750,7 +4755,6 @@ <translation id="7409233648990234464">Поново покрени и обави Powerwash</translation> <translation id="7409836189476010449">Покрене Flash</translation> <translation id="7410344089573941623">Питај да ли <ph name="HOST" /> жели да приступи камери и микрофону</translation> -<translation id="7411343637221933631">{NUM_COOKIES,plural, =1{1 са овог сајта}one{# са овог сајта}few{# са овог сајта}other{# са овог сајта}}</translation> <translation id="7412226954991670867">GPU меморија</translation> <translation id="7416362041876611053">Непозната грешка на мрежи.</translation> <translation id="7417453074306512035">Етиопљанска тастатура</translation> @@ -4872,6 +4876,7 @@ <translation id="756445078718366910">Отвори прозор прегледача</translation> <translation id="7564847347806291057">Заврши процес</translation> <translation id="7566723889363720618">F12</translation> +<translation id="7567314848159753396">Колачић: <ph name="NAME" /></translation> <translation id="756809126120519699">Chrome подаци су обрисани</translation> <translation id="7568790562536448087">Ажурирање</translation> <translation id="7573172247376861652">Напуњеност батерије</translation> @@ -4912,13 +4917,14 @@ <translation id="7626009897377900107">Генерисање лозинки</translation> <translation id="7627262197844840899">Овај сајт не прихвата MasterCard.</translation> <translation id="7627790789328695202">Упс, <ph name="FILE_NAME" /> већ постоји. Преименујте датотеку и покушајте поново.</translation> +<translation id="7628127343934101653">Отварај PDF датотеке у подразумеваној апликацији за преглед PDF-а.</translation> <translation id="762917759028004464">Подразумевани прегледач је тренутно <ph name="BROWSER_NAME" />.</translation> <translation id="7629536005696009600">Омогућава да се акредитиви сачувани за Android апликације уносе на одговарајуће веб-сајтове.</translation> <translation id="7629827748548208700">Картица: <ph name="TAB_NAME" /></translation> <translation id="7631887513477658702">&Увек отвори датотеке овог типа</translation> <translation id="7632948528260659758">Ажурирање следећих киоск апликација није успело:</translation> <translation id="7634554953375732414">Веза са овим сајтом није приватна.</translation> -<translation id="7634566076839829401">Нешто није у реду. Покушајте поново.</translation> +<translation id="7634566076839829401">Нешто није у реду. Пробајте поново.</translation> <translation id="7639178625568735185">Важи!</translation> <translation id="764017888128728"><ph name="PASSWORD_MANAGER_BRAND" /> вас аутоматски пријављује на сајтове који испуњавају услове помоћу лозинки које сте сачували.</translation> <translation id="7644029910725868934">Омогућите директоријум са обележивачима којима се управља за кориснике под надзором.</translation> @@ -5083,7 +5089,7 @@ <translation id="787150342916295244">Скенирање кредитних картица</translation> <translation id="7874357055309047713">Увек покрећи на свим сајтовима</translation> <translation id="7876243839304621966">Уклони све</translation> -<translation id="7877451762676714207">Непозната грешка сервера. Покушајте поново или контактирајте администратора сервера.</translation> +<translation id="7877451762676714207">Непозната грешка сервера. Пробајте поново или контактирајте администратора сервера.</translation> <translation id="7878999881405658917">Google је послао обавештење на овај телефон. Имајте на уму да, када користите Bluetooth, телефон може да откључава <ph name="DEVICE_TYPE" /> на удаљености од преко 9 метара. У случајевима где то може да представља проблем, можете <a>привремено да онемогућите ову функцију</a>.</translation> <translation id="7880836220014399562">„<ph name="BUNDLE_NAME" />“ додаје следеће апликације и додатке:</translation> <translation id="7881483672146086348">Прикажи налог</translation> @@ -5140,6 +5146,7 @@ <translation id="7957513156576779045">Укључи Bluetooth да би се омогућило упаривање</translation> <translation id="7957615753207896812">Отвори подешавања уређаја за тастатуру</translation> <translation id="7959074893852789871">Датотека садржи више сертификата, од којих неки нису увезени:</translation> +<translation id="7959700692661109221"><ph name="BEGIN_PARAGRAPH" />Google-ова услуга локације користи изворе попут Wi-Fi-ја да би брже и прецизније одредила приближну локацију уређаја. Када укључите Google-ове услуге локације, уређај улази у режим који користи Wi-Fi за пружање информација о локацији. Ово можете да искључите у било ком тренутку у подешавањима локације.<ph name="END_PARAGRAPH" /></translation> <translation id="7961015016161918242">Никад</translation> <translation id="7964089325405904043">Увоз и извоз лозинки</translation> <translation id="7965010376480416255">Дељена меморија</translation> @@ -5152,7 +5159,7 @@ <translation id="7972714317346275248">PKCS #1 SHA-384 са RSA шифровањем</translation> <translation id="7973320858902175766">Крпљење компонената</translation> <translation id="7974067550340408553">Добијајте обавештења на телефону сваки пут када Smart Lock откључа <ph name="DEVICE_TYPE" />.</translation> -<translation id="7974566588408714340">Покушај поново помоћу <ph name="EXTENSIONNAME" /></translation> +<translation id="7974566588408714340">Пробај поново помоћу <ph name="EXTENSIONNAME" /></translation> <translation id="7974936243149753750">Ивично подручје екрана</translation> <translation id="797610151583999923">Омогућава mus, mash итд.</translation> <translation id="7977551819349545646">Ажурира се Chromebox...</translation> @@ -5290,6 +5297,7 @@ <translation id="8146793085009540321">Пријављивање није успело. Контактирајте администратора или покушајте поново.</translation> <translation id="8148264977957212129">Пинјин метод уноса</translation> <translation id="8148913456785123871">Прикажи Картице за Google тренутно у покретачу</translation> +<translation id="8150391391298684512">Онемогући Windows Runtime MIDI API</translation> <translation id="8151185429379586178">Алатке за програмере</translation> <translation id="8151638057146502721">Конфигуриши</translation> <translation id="8151639108075998630">Омогући прегледање за госте</translation> @@ -5572,6 +5580,7 @@ <translation id="8532294913309524834">Распоредите језике по жељи.</translation> <translation id="8535005006684281994">URL адреса за обнову Netscape сертификата</translation> <translation id="8539727552378197395">Не (HttpOnly)</translation> +<translation id="8541084862688000575">Аутоматски учитавај Android апликације</translation> <translation id="8543181531796978784">Можете да <ph name="BEGIN_ERROR_LINK" />пријавите проблем са откривањем<ph name="END_ERROR_LINK" /> или, ако схватате безбедносне ризике, <ph name="BEGIN_LINK" />посетите овај небезбедан сајт<ph name="END_LINK" />.</translation> <translation id="8545107379349809705">Сакриј информације...</translation> <translation id="8545211332741562162">Омогућите веб страницама да користе функције експерименталног JavaScript-а.</translation> @@ -5599,7 +5608,6 @@ <translation id="8569764466147087991">Избор датотеке за отварање</translation> <translation id="8571032220281885258">Када кажете „Ok Google“, Chrome ће потражити оно што кажете после тога.</translation> <translation id="8571108619753148184">4. сервер</translation> -<translation id="8572832761467613633">Само за Flash</translation> <translation id="8572981282494768930">Не дозвољавај сајтовима да приступају мојој камери и микрофону</translation> <translation id="8574234089711453001">Омогућава да се дугме за преузимање прикаже при отварању странице помоћу URL-а медија.</translation> <translation id="857779305329188634">Омогућавање подршке за експериментални QUIC протокол.</translation> @@ -5621,6 +5629,7 @@ <translation id="8600929685092827187">Буђење при пријему пакета</translation> <translation id="8601206103050338563">TLS WWW потврда идентитета клијента</translation> <translation id="8602851771975208551">Други програм на рачунару је додао апликацију која може да промени начин на који Chrome функционише.</translation> +<translation id="8603912787021349466">Дозволите Android апликацијама да се аутоматски покрећу после пријављивања.</translation> <translation id="8605428685123651449">SQLite меморија</translation> <translation id="8605503133013456784">Прекид везе са уређајем „<ph name="DEVICE_NAME" />“ и отказивање упаривања са њим нису успели.</translation> <translation id="8606726445206553943">користи MIDI уређаје</translation> @@ -5718,7 +5727,7 @@ <translation id="8719653885894320876">Преузимање додатне компоненте <ph name="PLUGIN_NAME" /> није успело</translation> <translation id="8722421161699219904">Америчка интернационална тастатура</translation> <translation id="8724859055372736596">&Прикажи у директоријуму</translation> -<translation id="8725066075913043281">Покушајте поново</translation> +<translation id="8725066075913043281">Пробајте поново</translation> <translation id="8725178340343806893">Омиљено/Обележивачи</translation> <translation id="872537912056138402">хрватски</translation> <translation id="8726206820263995930">Грешка при преузимању подешавања смерница са сервера: <ph name="CLIENT_ERROR" />.</translation> @@ -5874,7 +5883,7 @@ <translation id="8933960630081805351">&Прикажи у Finder-у</translation> <translation id="8934732568177537184">Настави</translation> <translation id="8938356204940892126">Одустајем</translation> -<translation id="8940081510938872932">Рачунар тренутно ради превише ствари. Покушајте поново касније.</translation> +<translation id="8940081510938872932">Рачунар тренутно ради превише ствари. Пробајте поново касније.</translation> <translation id="8941173171815156065">Опозовите дозволу „<ph name="PERMISSION" />“</translation> <translation id="8941248009481596111">Веза са овим сајтом је приватна.</translation> <translation id="8941729603749328384">www.example.com</translation> @@ -5973,6 +5982,7 @@ <translation id="9053965862400494292">Дошло је до грешке при подешавању синхронизације.</translation> <translation id="9056034633062863292">Ажурирање Chromebox-а</translation> <translation id="9056810968620647706">Није пронађено ниједно подударање.</translation> +<translation id="9057119625587205566">Нема штампача у околини</translation> <translation id="9059868303873565140">Мени статуса</translation> <translation id="9064142312330104323">Слика Google профила (учитавање)</translation> <translation id="9064275926664971810">Омогућавање аутоматског попуњавања веб-образаца једним кликом</translation> @@ -5983,6 +5993,7 @@ <translation id="9067401056540256169">Ова ознака чини Chrome небезбедним. Користите је само ако разумете шта она ради. Имајте на уму да ова ознака може да буде уклоњена без икаквог обавештења. Ако је омогућите, оквири са https пореклом могу да користе WebSockets са небезбедним URL-ом (ws://).</translation> <translation id="9068931793451030927">Путања:</translation> <translation id="9070219033670098627">Други корисник</translation> +<translation id="9070940116164932228">Ограничи захтевне тајмере у позадини</translation> <translation id="907148966137935206">Не дозволи ниједном сајту да приказује искачуће прозоре (препоручено)</translation> <translation id="9072550133391925347"><ph name="PASSWORD_MANAGER_BRAND" /> вас аутоматски пријављује на сајтове и у апликације који испуњавају услове помоћу лозинки које сте сачували.</translation> <translation id="9073281213608662541">PAP</translation> @@ -6017,6 +6028,7 @@ <translation id="9112614144067920641">Изаберите нови PIN.</translation> <translation id="9112748030372401671">Промена позадине</translation> <translation id="9112987648460918699">Пронађи...</translation> +<translation id="9114663181201435112">Лако се пријављујте</translation> <translation id="9115487443206954631">Управљај Cast уређајима</translation> <translation id="9115675100829699941">&Обележивачи</translation> <translation id="9121814364785106365">Отвори као закачену картицу</translation> @@ -6111,7 +6123,6 @@ <translation id="952992212772159698">Није активирано</translation> <translation id="960719561871045870">Кôд мобилног оператера</translation> <translation id="960987915827980018">Остало је око сат времена</translation> -<translation id="962778376131245616">Прикажи само небезбедно, анимирано</translation> <translation id="96421021576709873">Wi-Fi мрежа</translation> <translation id="965490406356730238">Омогућите декодирање mjpeg формата уз хардверско убрзање за снимљене кадрове када је то доступно.</translation> <translation id="968174221497644223">Кеш апликације</translation>
diff --git a/chrome/app/resources/generated_resources_sv.xtb b/chrome/app/resources/generated_resources_sv.xtb index 32825aa2..90c05b8 100644 --- a/chrome/app/resources/generated_resources_sv.xtb +++ b/chrome/app/resources/generated_resources_sv.xtb
@@ -18,7 +18,6 @@ <translation id="1029317248976101138">Zooma in</translation> <translation id="1029595648591494741">Vill du testa <ph name="EXTENSION_NAME" />?</translation> <translation id="1031362278801463162">Läser in förhandsgranskning</translation> -<translation id="1031460590482534116">Ett fel uppstod när klientcertifikatet skulle sparas. Fel <ph name="ERROR_NUMBER" /> (<ph name="ERROR_NAME" />).</translation> <translation id="1031573127485938293">Fråga (utifrån princip)</translation> <translation id="103279545524624934">Frigör diskutrymme om du vill starta Android-appar.</translation> <translation id="1033780634303702874">Få åtkomst till dina seriella enheter</translation> @@ -101,6 +100,7 @@ <translation id="1128591060186966949">Redigera sökmotor</translation> <translation id="1128987120443782698">Lagringsenhetens kapacitet är <ph name="DEVICE_CAPACITY" />. Sätt i ett SD-kort eller anslut ett USB-minne med en kapacitet på minst 4 GB.</translation> <translation id="1137135726305341424">DOMContentLoaded och alla inlästa resurser som startades före DOMContentLoaded (huvudramen och iframes med samma ursprung).</translation> +<translation id="1138663153846032155">Föredra HTML framför Flash</translation> <translation id="1140351953533677694">Få åtkomst till dina Bluetooth-enheter och seriella enheter</translation> <translation id="114140604515785785">Tilläggets rotkatalog:</translation> <translation id="1143142264369994168">Certifikatsignerare</translation> @@ -252,6 +252,7 @@ <translation id="1351692861129622852">Importerar <ph name="FILE_COUNT" /> filer …</translation> <translation id="1352103415082130575">Tangentbord för thailändska (Pattachote)</translation> <translation id="1353686479385938207"><ph name="PROVIDER_NAME" />: <ph name="NETWORK_NAME" /></translation> +<translation id="1353946958707294039">Lagringshanteraren för Material Design</translation> <translation id="1353966721814789986">Startsidor</translation> <translation id="1354868058853714482">Adobe Reader är inte uppdaterat och kan vara osäkert.</translation> <translation id="1355408554203439639">3D-rastreringsprogramvara</translation> @@ -423,7 +424,6 @@ <translation id="1533920822694388968">TV-justering</translation> <translation id="15373452373711364">Stor muspekare</translation> <translation id="1543284117603151572">Importerade från Edge</translation> -<translation id="1544350195767834591">{NUM_COOKIES,plural, =1{1 från andra webbplatser}other{# från andra webbplatser}}</translation> <translation id="1545177026077493356">Automatiskt kioskläge</translation> <translation id="1545786162090505744">Webbadress med %s istället för sökfråga</translation> <translation id="1546280085599573572">Det här tillägget har ändrat vilken sida som visas när du klickar på knappen Startsida.</translation> @@ -447,7 +447,6 @@ <translation id="1559235587769913376">Ange Unicode-tecken</translation> <translation id="1561092721008294962">HarfBuzz för text i användargränssnittet</translation> <translation id="1566049601598938765">Webbplats</translation> -<translation id="1566958206723629112">Flash och PDF</translation> <translation id="1567723158593978621">När den här funktionen är aktiverad används det nya lösenordsseparerade inloggningsflödet för GAIA vid inloggning i webbläsaren.</translation> <translation id="1567993339577891801">JavaScript-konsol</translation> <translation id="1568323446248056064">Öppna enhetsinställningarna för skärm</translation> @@ -575,7 +574,6 @@ <translation id="1723940674997333416">Tillåt osäker WebSocket från HTTPS-källa</translation> <translation id="1725149567830788547">Visa &kontroller</translation> <translation id="172612876728038702">TPM installeras. Det kan ta några minuter.</translation> -<translation id="1727135806684246609">Säkerhetsindikering för Material Design</translation> <translation id="1729533290416704613">Det styr också vilken sida som visas när du söker i adressfältet.</translation> <translation id="1731346223650886555">Semikolon</translation> <translation id="1731589410171062430">Totalt: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /> (<ph name="NUMBER_OF_PAGES" /> <ph name="PAGE_OR_PAGES_LABEL" />)</translation> @@ -872,6 +870,7 @@ <translation id="218492098606937156">Aktivera pekskärmshändelser</translation> <translation id="2187317261103489799">Identifiera (standard)</translation> <translation id="2187895286714876935">Fel vid import av servercertifikat</translation> +<translation id="2188881192257509750">Öppna <ph name="APPLICATION" /></translation> <translation id="2190069059097339078">Hämtningsfunktion för Wi-Fi-användaruppgifter</translation> <translation id="219008588003277019">Native Client-modul: <ph name="NEXE_NAME" /></translation> <translation id="2190355936436201913">(tom)</translation> @@ -990,6 +989,7 @@ <translation id="2326606747676847821">Surfa inkognito</translation> <translation id="2326931316514688470">&Läs in appen igen</translation> <translation id="2327492829706409234">Aktivera app</translation> +<translation id="2328054044222305089">Det här raderar all data som <ph name="SITE" /> lagrat på enheten och återställer alla behörigheter som du har beviljat. Vill du fortsätta?</translation> <translation id="2329597144923131178">Logga in så blir bokmärken, historik, lösenord med mera tillgängligt på alla dina enheter.</translation> <translation id="2332131598580221120">Visa i butik</translation> <translation id="2332742915001411729">Återställ standardvärden</translation> @@ -1265,7 +1265,6 @@ <translation id="2675358154061544447">Mycket experimentellt stöd för att rendera iframe från olika webbplatser i separata processer. I det här läget delar dokumenten bara renderarprocess om de kommer från samma webbplats.</translation> <translation id="2676946222714718093">Spelas på</translation> <translation id="2678063897982469759">Aktivera igen</translation> -<translation id="2678246812096664977">Alla pluginprogram</translation> <translation id="2679385451463308372">Skriv ut via systemets dialogruta ...</translation> <translation id="2680208403056680091">Internetanslutningen kontrolleras</translation> <translation id="268053382412112343">Hi&storik</translation> @@ -1439,7 +1438,6 @@ <translation id="287286579981869940">Lägg till <ph name="PROVIDER_NAME" />...</translation> <translation id="2872961005593481000">Stäng av</translation> <translation id="2875698561019555027">(Felsidor i Chrome)</translation> -<translation id="2879560882721503072">Klientcertifikatet som utfärdats av <ph name="ISSUER" /> har sparats.</translation> <translation id="288024221176729610">tjeckiska</translation> <translation id="288042212351694283">Åtkomst till dina Universal 2nd Factor-enheter</translation> <translation id="2881966438216424900">Senast öppnad:</translation> @@ -1588,6 +1586,7 @@ <translation id="3057861065630527966">Säkerhetskopiera foton och videor</translation> <translation id="3058212636943679650">Om du någon gång skulle behöva återställa datorns operativsystem behöver du ett SD-kort eller USB-minne.</translation> <translation id="305932878998873762">Den enkla cachen för HTTP är en ny cache som bygger på filsystemet för diskutrymmesfördelning.</translation> +<translation id="3060251871394327123">Det här raderar all data som <ph name="SITE" /> lagrat på enheten. Vill du fortsätta?</translation> <translation id="3061650404498811439">Aktivera tillgång till emojier, handskrift och röstinmatning från alternativet IME-meny.</translation> <translation id="3062606427884046423">Använd aviseringar från Android MediaStyle för medieaviseringar från Chrome.</translation> <translation id="3063844757726132584">Få tillgång till alla appar från det här praktiska startprogrammet. Spela spel, videochatta, lyssna på musik, redigera dokument eller ladda ned fler appar.</translation> @@ -1637,6 +1636,7 @@ <translation id="3123569374670379335">(Kontrollerad)</translation> <translation id="3124111068741548686">USER-handtag</translation> <translation id="3126026824346185272">Ctrl</translation> +<translation id="3127156390846601284">Det här raderar all data som lagrats på enheten av alla webbplatser som visas. Vill du fortsätta?</translation> <translation id="312759608736432009">Enhetstillverkare:</translation> <translation id="3127919023693423797">Autentiserar...</translation> <translation id="3128230619496333808">Flik 6</translation> @@ -1735,7 +1735,6 @@ <translation id="3264544094376351444">Sans serif-teckensnitt</translation> <translation id="3264547943200567728">Det gick inte att konfigurera nätverket för Chromebox</translation> <translation id="3265459715026181080">Stäng fönster</translation> -<translation id="3267271790328635957">Endast PDF</translation> <translation id="3267726687589094446">Fortsätt att tillåta automatiska nedladdningar av flera filer</translation> <translation id="3267998849713137817">Modifierad tid</translation> <translation id="3268451620468152448">Öppna flikar</translation> @@ -1981,6 +1980,7 @@ <translation id="3574210789297084292">logga in</translation> <translation id="3574305903863751447"><ph name="CITY" />, <ph name="STATE" /> <ph name="COUNTRY" /></translation> <translation id="357479282490346887">litauiska</translation> +<translation id="3575927481544652747">Inaktivera Windows Runtime MIDI API för WebMIDI. Det är aktiverat som standard i Windows 10 eller senare.</translation> <translation id="3576324189521867626">Appen har installerats</translation> <translation id="3578331450833904042">Standard (ljud från alla riktningar tas upp)</translation> <translation id="3578594933904494462">Flikens innehåll delas.</translation> @@ -2034,8 +2034,6 @@ <translation id="3627320433825461852">Mindre än 1 minut kvar</translation> <translation id="3627588569887975815">Öppna länk i inko&gnitofönster</translation> <translation id="3627671146180677314">Förnyelsetid för Netscape-certifikat</translation> -<translation id="3629326610814700057">Aktiverar lagringshanteraren så att den hanterar det lokala lagringsutrymmet.</translation> -<translation id="3630337581925712713"><ph name="PERMISSION_TYPE_LABEL" />:</translation> <translation id="3631337165634322335">Undantagen nedan gäller endast den aktuella inkognitosessionen.</translation> <translation id="3633586230741134985">Inställningar för startprogrammet för appar</translation> <translation id="3633997706330212530">Du kan välja att inaktivera dessa tjänster.</translation> @@ -2058,7 +2056,8 @@ <translation id="3654045516529121250">Läsa tillgänglighetsinställningarna</translation> <translation id="3654092442379740616">Synkroniseringsfel. <ph name="PRODUCT_NAME" /> är inaktuellt och behöver uppdateras.</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{Den har permanent åtkomst till en fil.}other{Den har permanent åtkomst till # filer.}}</translation> -<translation id="3657468915905674858">Aktivera PPAPI-låsning under Win32k.</translation> +<translation id="365793796291733849"><ph name="BEGIN_PARAGRAPH1" />När du aktiverar automatisk säkerhetskopiering sparas enhets- och appdata regelbundet i en privat mapp på Google Drive. Appdata är all data som sparas i en app (utifrån utvecklarens inställningar), bland annat potentiellt känslig data som kontakter, meddelanden och foton.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Säkerhetskopierad data tar inte upp något av lagringsutrymmet som tilldelats dig på Drive. Stora filer eller filer som utvecklare har valt att utesluta från tjänsten säkerhetskopieras inte.<ph name="END_PARAGRAPH2" /></translation> <translation id="3660234220361471169">Opålitliga</translation> <translation id="3665589677786828986">Chrome har upptäckt att visa av inställningarna har skadats av ett annat program och återställer dem till standardinställningarna.</translation> <translation id="3665842570601375360">Säkerhet:</translation> @@ -2113,6 +2112,7 @@ <translation id="3733127536501031542">SSL-server med uppgradering</translation> <translation id="3736520371357197498">Om du är medveten om säkerhetsriskerna kan du <ph name="BEGIN_LINK" />besöka den här osäkra webbplatsen<ph name="END_LINK" /> innan de skadliga programmen har tagits bort.</translation> <translation id="3738924763801731196"><ph name="OID" />:</translation> +<translation id="3739254215541673094">Vill du öppna <ph name="APPLICATION" />?</translation> <translation id="3739798227959604811">Fördröjning före upprepning:</translation> <translation id="3741158646617793859"><ph name="DEVICE_NAME" /> visas nu i administratörskonsolen</translation> <translation id="3741243925913727067">Säkerhetskopiera foton och videor från mediaenheten till Google Drive.</translation> @@ -2351,7 +2351,6 @@ <translation id="4058793769387728514">Kontrollera dokumentet nu</translation> <translation id="4059285154003114015">&Skriv ut ram ...</translation> <translation id="406070391919917862">Bakgrundsappar</translation> -<translation id="4061502419206152498">Visa endast osäkra, inte animerade</translation> <translation id="4062251648694601778">Vi önskar dig mycket nöje med <ph name="SHORT_PRODUCT_NAME" />-enheten. Har du några frågor? Du kan få hjälp när som helst genom att klicka på ? i statusfältet.</translation> <translation id="4065876735068446555">Nätverket du använder (<ph name="NETWORK_ID" />) kanske kräver att du besöker dess inloggningssida.</translation> <translation id="4068506536726151626">På den här sidan finns komponenter från följande webbplatser som spårar din plats:</translation> @@ -2390,7 +2389,6 @@ <translation id="4101878899871018532">Lösenordshanteraren frågar inte om användaruppgifter som används vid synkronisering ska sparas.</translation> <translation id="410351446219883937">Automatisk uppspelning</translation> <translation id="4104163789986725820">E&xportera...</translation> -<translation id="4105523032910086267">Anger animation och synlighet för utförlig säkerhet i Material Design.</translation> <translation id="4105563239298244027">Få 1 TB gratis med Google Drive</translation> <translation id="4109135793348361820">Flytta fönster till <ph name="USER_NAME" /> (<ph name="USER_EMAIL" />)</translation> <translation id="4110342520124362335">Cookies från <ph name="DOMAIN" /> blockeras.</translation> @@ -2441,6 +2439,7 @@ <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="4188447344915957833">Aktiverar lagringshanteraren i Material Design-versionen av inställningssidan.</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> <translation id="4193182321948161343">Aktivera användarhanteraren med Material Design</translation> @@ -2648,6 +2647,7 @@ <translation id="4508765956121923607">Visa &källa</translation> <translation id="4509017836361568632">Ta bort fotot</translation> <translation id="4509345063551561634">Plats:</translation> +<translation id="4513946894732546136">Feedback</translation> <translation id="4514542542275172126">Skapa ny kontrollerad användare</translation> <translation id="4514914692061505365">Tvinga fram användning av PNaCl:s snabba Subzero-översättare för alla pexe-filer.</translation> <translation id="451515744433878153">Ta bort</translation> @@ -2746,6 +2746,7 @@ <translation id="4656293982926141856">Den här datorn</translation> <translation id="4656631038341342120">Aktivera VR-skal om det är tillgängligt för den här enheten.</translation> <translation id="4657031070957997341">Tillåt alltid pluginprogram på <ph name="HOST" /></translation> +<translation id="466008749075469935">Aktiverar begränsning av CPU-användningen för timer som körs i bakgrunden till 1 %.</translation> <translation id="4663254525753315077">Placerar innehållet i ett överflödande rullningselement i ett sammansatt lager för snabbare rullning, om det är möjligt.</translation> <translation id="4664482161435122549">Fel vid export av PKCS #12</translation> <translation id="4665014895760275686">Tillverkare</translation> @@ -2814,6 +2815,7 @@ <translation id="4749157430980974800">Georgiskt tangentbord</translation> <translation id="4750394297954878236">Förslag</translation> <translation id="475088594373173692">Första användare</translation> +<translation id="4750892496809949692">Föredra HTML-innehåll genom att dölja Flash i listan över pluginprogram.</translation> <translation id="4750917950439032686">Dina uppgifter (till exempel lösenord eller kreditkortsnummer) är privata när de skickas till den här webbplatsen.</translation> <translation id="4753602155423695878">Animering av förloppsindikatorn för inläsning av sidor på Android-mobiler</translation> <translation id="4755240240651974342">Finskt tangentbord</translation> @@ -3088,6 +3090,7 @@ <translation id="5119450342834678097">Alternativet Begär webbplats för surfplatta i inställningsmenyn</translation> <translation id="5120068803556741301">Inmatningsmetod från tredje part</translation> <translation id="5120421890733714118">Lita på detta certifikat för identifiering av webbplatser.</translation> +<translation id="5120516977819314347">Pinkoden eller lösenordet är fel.</translation> <translation id="5121130586824819730">Hårddisken är full. Spara på en annan plats eller gör mer plats på hårddisken.</translation> <translation id="5125751979347152379">Ogiltig webbadress.</translation> <translation id="5127881134400491887">Hantera nätverksanslutningar</translation> @@ -3095,6 +3098,7 @@ <translation id="512903556749061217">ansluten</translation> <translation id="5129301143853688736">Hackare kan försöka stjäla information (till exempel bilder, lösenord, meddelanden och kreditkortsuppgifter) från <ph name="DOMAIN" />.</translation> <translation id="5129662217315786329">polska</translation> +<translation id="5131347545782851480">PDF-dokument</translation> <translation id="5134856901811723984">Material Design i systemets användargränssnitt för Chrome OS</translation> <translation id="5135533361271311778">Det gick inte att skapa bokmärkesobjektet.</translation> <translation id="5136529877787728692">F7</translation> @@ -3263,6 +3267,7 @@ <translation id="5328031682234198929">8</translation> <translation id="5329858601952122676">&Ta bort</translation> <translation id="5330145655348521461">Filerna öppnades på ett annat skrivbord. Byt till <ph name="USER_NAME" /> (<ph name="MAIL_ADDRESS" />) om du vill visa dem.</translation> +<translation id="5330512191124428349">Mer information</translation> <translation id="5332624210073556029">Tidszon:</translation> <translation id="5333807720589685258">SIM-kortet inaktiveras permanent om du inte anger korrekt upplåsningskod för pinkoden.</translation> @@ -3695,7 +3700,6 @@ <translation id="5892507820957994680">Åsidosätter den inbyggda programrenderingslistan och aktiverar GPU-acceleration i systemkonfigurationer som inte stöds.</translation> <translation id="5895138241574237353">Starta om</translation> <translation id="5895187275912066135">Utfärdat den</translation> -<translation id="5898154795085152510">Servern returnerade ett ogiltigt klientcertifikat. Fel <ph name="ERROR_NUMBER" /> (<ph name="ERROR_NAME" />).</translation> <translation id="5900302528761731119">Profilbild i Google Profiler</translation> <translation id="590253956165195626">Erbjud att översätta sidor som inte är på ett språk du kan läsa.</translation> <translation id="5904093760909470684">Proxykonfiguration</translation> @@ -3750,6 +3754,8 @@ <translation id="5984222099446776634">Nyligen besökta</translation> <translation id="5984814259619230127">Identifiera mobiler via Bluetooth Low Energy med Smart Lock</translation> <translation id="5986245990306121338">Om inställningen är aktiverad visas flikbytesikonen även när alternativet Sammanfoga flikar och appar är aktiverat i inställningarna.</translation> +<translation id="5989712527536636369"><ph name="BEGIN_PARAGRAPH1" />Detta är allmän information om enheten och hur du använder den. Det kan till exempel vara information om batterinivå, hur ofta du använder apparna, nätverksanslutningarnas kvalitet och varaktighet (för t.ex. Wi-Fi och Bluetooth) samt kraschrapporter om fel som har uppstått. Google använder informationen för att förbättra produkter och tjänster. En del sammanställd information kan även hjälpa våra partner – till exempel Android-utvecklare – att förbättra sina appar och produkter.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Du kan när som helst aktivera eller inaktivera detta i inställningarna för Android-appar. Det här påverkar inte enhetens funktion när det gäller att skicka nödvändig information och ta emot viktiga tjänster, till exempel systemuppdateringar och säkerhet.<ph name="END_PARAGRAPH2" /></translation> <translation id="5990198433782424697">Tillägg på chrome://-webbadresser</translation> <translation id="5990814808592353318">Manuell lösenordsgenerering.</translation> <translation id="5991049340509704927">Förstora</translation> @@ -3763,6 +3769,7 @@ <translation id="6005695835120147974">Medierouter</translation> <translation id="6007237601604674381">Flytten misslyckades. <ph name="ERROR_MESSAGE" /></translation> <translation id="6008241731410823808">Skickar ping för kontroll av hyperlänkar.</translation> +<translation id="6011449291337289699">Rensa webbplatsdata</translation> <translation id="6015796118275082299">År</translation> <translation id="6016551720757758985">Bekräfta återställningen till den tidigare versionen med Powerwash</translation> <translation id="6016809788585079594">Säg ”Ok Google” en sista gång</translation> @@ -3952,7 +3959,6 @@ <translation id="6276301056778294989">Kontrollera att samma kod visas på enheten.</translation> <translation id="6277105963844135994">Tidsgräns för nätverket</translation> <translation id="6277518330158259200">T&a en skärmdump</translation> -<translation id="6278428485366576908">Tema</translation> <translation id="6279183038361895380">Tryck på |<ph name="ACCELERATOR" />| om du vill visa markören</translation> <translation id="6280215091796946657">Logga in med ett annat konto</translation> <translation id="6280912520669706465">ARC</translation> @@ -4204,6 +4210,7 @@ <translation id="6607272825297743757">Filinformation</translation> <translation id="6607831829715835317">Fler verkt&yg</translation> <translation id="6608140561353073361">Alla cookies och webbplatsdata...</translation> +<translation id="6610183966322615106">Det gick inte att lägga till skrivare</translation> <translation id="6610610633807698299">Ange webbadress ...</translation> <translation id="6612358246767739896">Skyddat innehåll</translation> <translation id="6615455863669487791">Visa mig</translation> @@ -4267,7 +4274,6 @@ <translation id="6708242697268981054">Ursprung:</translation> <translation id="6709357832553498500">Anslut med <ph name="EXTENSIONNAME" /></translation> <translation id="6710213216561001401">Föregående</translation> -<translation id="6712158998835983046">Visa alla, animerade</translation> <translation id="6718273304615422081">Komprimerar ...</translation> <translation id="671928215901716392">Lås skärmen</translation> <translation id="6721972322305477112">&Arkiv</translation> @@ -4539,7 +4545,6 @@ <translation id="7088434364990739311">Det gick inte att starta uppdateringskontrollen (felkod <ph name="ERROR" />).</translation> <translation id="708856090370082727">Aktivera stöd för överrullning för skärmtangentbord. När flaggan är vald ändrar skärmtangentbordet bara storlek på det synliga visningsområdet.</translation> <translation id="7088674813905715446">Den här enheten har avaktualiserats av administratören. Du måste be administratören sätta enheten som väntande innan du kan registrera den.</translation> -<translation id="7089609847854449639">Lagringshanteraren</translation> <translation id="708969677220991657">Tillåter begäranden till lokalvärd över HTTPS även när ett ogiltigt certifikat presenteras.</translation> <translation id="7092106376816104">Undantag för popup-fönster</translation> <translation id="7093866338626856921">Utväxla data med enheterna <ph name="HOSTNAMES" /></translation> @@ -4579,7 +4584,7 @@ <translation id="715118844758971915">Vanliga skrivare</translation> <translation id="7154130902455071009">Ändra startsida till: <ph name="START_PAGE" /></translation> <translation id="7155171745945906037">Befintligt foto från kamera eller fil</translation> -<translation id="715568033737470079">Ange vilka PPAPI-pluginprogram som ska köras med sandlådeprincipen för låsning under Win32k (endast Windows 10 och senare).</translation> +<translation id="7155226869555939647">Öppna alltid länkar för <ph name="APPLICATION" /></translation> <translation id="7156235233373189579">Den här filen är avsedd för en PC med Windows. Den är inte kompatibel med Chrome OS, det operativsystem som körs på din enhet. Sök på <ph name="BEGIN_LINK" />Chrome Web Store<ph name="END_LINK" /> efter en lämplig app att använda i stället.<ph name="BEGIN_LINK_HELP" />Läs mer<ph name="END_LINK_HELP" /></translation> <translation id="7157063064925785854">Genom att klicka på Fortsätt godkänner du <ph name="LEGAL_DOC_LINK_TEXT_1" />, <ph name="LEGAL_DOC_LINK_TEXT_2" />, <ph name="LEGAL_DOC_LINK_TEXT_3" /> och <ph name="LEGAL_DOC_LINK_TEXT_4" />.</translation> <translation id="7158238151765743968">Anslutning till <ph name="DEVICE_NAME" /> pågår.</translation> @@ -4594,6 +4599,7 @@ <translation id="7175353351958621980">Överförd från:</translation> <translation id="7180611975245234373">Uppdatera</translation> <translation id="7180865173735832675">Anpassa</translation> +<translation id="7181387261278441780">Rensa och återställ webbplatsen</translation> <translation id="7185078796915954712">TLS 1.3</translation> <translation id="7185690883425432021">Döljer stängningsknappen på inaktiva flikar när de är staplade.</translation> <translation id="7186088072322679094">Spara i verktygsfältet</translation> @@ -4626,7 +4632,6 @@ <translation id="7223775956298141902">Du har tyvärr inga tillägg :-(</translation> <translation id="7224023051066864079">Undernätsmask:</translation> <translation id="7225179976675429563">Nätverkstyp saknas</translation> -<translation id="7230191962699768124">Visa alla, inte animerade</translation> <translation id="7230787553283372882">Anpassa textstorleken</translation> <translation id="7231224339346098802">Använd ett nummer som anger hur många kopior som ska skrivas ut (1 eller fler).</translation> <translation id="7238585580608191973">SHA-256-fingeravtryck</translation> @@ -4757,7 +4762,6 @@ <translation id="7409233648990234464">Starta om och använd Powerwash</translation> <translation id="7409836189476010449">Kör Flash</translation> <translation id="7410344089573941623">Fråga om <ph name="HOST" /> vill använda kameran och mikrofonen</translation> -<translation id="7411343637221933631">{NUM_COOKIES,plural, =1{1 från den här webbplatsen}other{# från den här webbplatsen}}</translation> <translation id="7412226954991670867">GPU-minne</translation> <translation id="7416362041876611053">Okänt nätverksfel.</translation> <translation id="7417453074306512035">Tangentbord för etiopiska</translation> @@ -4879,6 +4883,7 @@ <translation id="756445078718366910">Öppna webbläsarfönster</translation> <translation id="7564847347806291057">Avsluta process</translation> <translation id="7566723889363720618">F12</translation> +<translation id="7567314848159753396">Cookie: <ph name="NAME" /></translation> <translation id="756809126120519699">Data i Chrome har rensats</translation> <translation id="7568790562536448087">Uppdaterar</translation> <translation id="7573172247376861652">Batteriladdning</translation> @@ -4919,6 +4924,7 @@ <translation id="7626009897377900107">Lösenordsgenerering</translation> <translation id="7627262197844840899">MasterCard godtas inte på den här webbplatsen.</translation> <translation id="7627790789328695202">Det finns redan en fil med namnet <ph name="FILE_NAME" />. Byt namn på filen och försök igen.</translation> +<translation id="7628127343934101653">Öppna PDF-filer i standardappen för att läsa PDF-filer.</translation> <translation id="762917759028004464">Standardwebbläsaren är för närvarande <ph name="BROWSER_NAME" />.</translation> <translation id="7629536005696009600">Tillåt att användaruppgifter som sparats för Android-appar fylls i på motsvarande webbplatser.</translation> <translation id="7629827748548208700">Flik: <ph name="TAB_NAME" /></translation> @@ -5147,6 +5153,7 @@ <translation id="7957513156576779045">Aktivera Bluetooth om du vill tillåta koppling</translation> <translation id="7957615753207896812">Öppna tangentbordsinställningarna</translation> <translation id="7959074893852789871">Filen innehöll flera certifikat och några av dem importerades inte:</translation> +<translation id="7959700692661109221"><ph name="BEGIN_PARAGRAPH" />Googles platstjänst använder källor som Wi-Fi för att uppskatta enhetens läge snabbare och mer exakt. När du aktiverar Googles platstjänster sätts enheten i ett läge som tillhandahåller platsinformation med hjälp av Wi-Fi. Du kan när som helst inaktivera detta i platsinställningarna.<ph name="END_PARAGRAPH" /></translation> <translation id="7961015016161918242">Aldrig</translation> <translation id="7964089325405904043">Importera och exportera lösenord</translation> <translation id="7965010376480416255">Delat minne</translation> @@ -5297,6 +5304,7 @@ <translation id="8146793085009540321">Inloggningen misslyckades. Kontakta administratören eller försök igen.</translation> <translation id="8148264977957212129">Inmatningsmetoden Pinyin</translation> <translation id="8148913456785123871">Visa Google Nu-kort i översikten</translation> +<translation id="8150391391298684512">Inaktivera Windows Runtime MIDI API</translation> <translation id="8151185429379586178">Verktyg för utvecklare</translation> <translation id="8151638057146502721">Konfigurera</translation> <translation id="8151639108075998630">Aktivera gästläsning</translation> @@ -5577,6 +5585,7 @@ <translation id="8532294913309524834">Sortera språk i prioriteringsordning.</translation> <translation id="8535005006684281994">Förnyelseadress för Netscape-certifikat</translation> <translation id="8539727552378197395">Nej (HttpOnly)</translation> +<translation id="8541084862688000575">Läs in Android-appar automatiskt</translation> <translation id="8543181531796978784">Du kan <ph name="BEGIN_ERROR_LINK" />rapportera ett identifieringsproblem<ph name="END_ERROR_LINK" /> eller <ph name="BEGIN_LINK" />besöka den här osäkra webbplatsen<ph name="END_LINK" /> om du är medveten om säkerhetsriskerna.</translation> <translation id="8545107379349809705">Dölj info ...</translation> <translation id="8545211332741562162">Gör så att webbsidor använder experimentella Javascript-funktioner.</translation> @@ -5604,7 +5613,6 @@ <translation id="8569764466147087991">Välj fil att öppna</translation> <translation id="8571032220281885258">När du säger Ok Google söker Chrome efter det du säger därefter.</translation> <translation id="8571108619753148184">Server 4</translation> -<translation id="8572832761467613633">Enbart Flash</translation> <translation id="8572981282494768930">Tillåt inte att webbplatser kommer åt kameran och mikrofonen</translation> <translation id="8574234089711453001">Tillåt att en nedladdningsknapp visas när du öppnar en sida med en medieadress.</translation> <translation id="857779305329188634">Aktivera experimentellt stöd för QUIC-protokollet.</translation> @@ -5626,6 +5634,7 @@ <translation id="8600929685092827187">Aktivera vid paket</translation> <translation id="8601206103050338563">TLS WWW-klientautentisering</translation> <translation id="8602851771975208551">Ett annat program i datorn har lagt till en app som kan ändra hur Chrome fungerar.</translation> +<translation id="8603912787021349466">Tillåt att Android-appar startas automatiskt när du har loggat in.</translation> <translation id="8605428685123651449">SQLite-minne</translation> <translation id="8605503133013456784">Det gick inte att koppla från och ta bort parkopplingen för <ph name="DEVICE_NAME" />.</translation> <translation id="8606726445206553943">Använda MIDI-enheter</translation> @@ -5978,6 +5987,7 @@ <translation id="9053965862400494292">Ett fel uppstod när synkronisering skulle ställas in.</translation> <translation id="9056034633062863292">Uppdaterar Chromebox</translation> <translation id="9056810968620647706">Inga träffar hittades.</translation> +<translation id="9057119625587205566">Det finns inga skrivare i närheten</translation> <translation id="9059868303873565140">Statusmeny</translation> <translation id="9064142312330104323">Profilbild i Google Profiler (läser in)</translation> <translation id="9064275926664971810">Aktivera Autofyll och fyll i formulär med ett enda klick</translation> @@ -5988,6 +5998,7 @@ <translation id="9067401056540256169">Den här flaggan gör webbläsaren Chrome osäker. Använd den endast om du förstår vad den kan göra. Observera att flaggan kan tas bort utan att du meddelas om detta. Om den har aktiverats kan ramar från en HTTPS-källa använda WebSocket med en osäker webbadress (ws://).</translation> <translation id="9068931793451030927">Sökväg:</translation> <translation id="9070219033670098627">Byt till ett annat konto</translation> +<translation id="9070940116164932228">Begränsa resurskrävande bakgrundstimer</translation> <translation id="907148966137935206">Tillåt inte att någon webbplats visar popup-fönster (rekommenderas)</translation> <translation id="9072550133391925347"><ph name="PASSWORD_MANAGER_BRAND" /> loggar automatiskt in på godkända webbplatser och appar med de lösenord du sparat.</translation> <translation id="9073281213608662541">PAP</translation> @@ -6022,6 +6033,7 @@ <translation id="9112614144067920641">Välj ny PIN.</translation> <translation id="9112748030372401671">Ändra bakgrund</translation> <translation id="9112987648460918699">Sök...</translation> +<translation id="9114663181201435112">Logga in enkelt</translation> <translation id="9115487443206954631">Hantera Cast-enheter</translation> <translation id="9115675100829699941">&Bokmärken</translation> <translation id="9121814364785106365">Öppna som en fast flik</translation> @@ -6116,7 +6128,6 @@ <translation id="952992212772159698">Inte aktiverat</translation> <translation id="960719561871045870">Operatörskod</translation> <translation id="960987915827980018">Ca 1 timme kvar</translation> -<translation id="962778376131245616">Visa endast osäkra, animerad</translation> <translation id="96421021576709873">Wi-Fi-nätverk</translation> <translation id="965490406356730238">Aktivera maskinvaruaccelererad MJPEG-avkodning för bilder där detta är tillgängligt.</translation> <translation id="968174221497644223">Programmets cacheminne</translation>
diff --git a/chrome/app/resources/generated_resources_sw.xtb b/chrome/app/resources/generated_resources_sw.xtb index f123aba..7cd0ff7 100644 --- a/chrome/app/resources/generated_resources_sw.xtb +++ b/chrome/app/resources/generated_resources_sw.xtb
@@ -18,7 +18,6 @@ <translation id="1029317248976101138">Kuza</translation> <translation id="1029595648591494741">Ungependa kujaribu "<ph name="EXTENSION_NAME" />"?</translation> <translation id="1031362278801463162">Inapakia nakala ya kuchungulia</translation> -<translation id="1031460590482534116">Kulikuwa na hitilafu wakati wa kujaribu kuhifadhi cheti cha mteja. Hitilafu <ph name="ERROR_NUMBER" /> (<ph name="ERROR_NAME" />).</translation> <translation id="1031573127485938293">Uliza (kulingana na sera)</translation> <translation id="103279545524624934">Futa maudhui katika hifadhi ya diski ili ufungue programu za Android.</translation> <translation id="1033780634303702874">Fikia vifaa vyako tambulishi</translation> @@ -101,6 +100,7 @@ <translation id="1128591060186966949">Badilisha mtambo wa kutafuta</translation> <translation id="1128987120443782698">Kifaa cha hifadhi kina ukubwa wa <ph name="DEVICE_CAPACITY" />. Tafadhali ingiza kadi ya SD au hifadhi ya kumbukumbu ya USB cha ukubwa wa angalau 4GB.</translation> <translation id="1137135726305341424">domContentLoaded na vipakiwa vya rasimali zote vilianza kabla ya mContentLoaded (fremu kuu na asili ya iframe sawa).</translation> +<translation id="1138663153846032155">Pendelea HTML badala ya Flash</translation> <translation id="1140351953533677694">Fikia vifaa vyako Tambulishi na Bluetooth</translation> <translation id="114140604515785785">Saraka msingi ya kiendelezi:</translation> <translation id="1143142264369994168">Mtia Sahihi kwenye Cheti</translation> @@ -252,6 +252,7 @@ <translation id="1351692861129622852">Inaleta faili <ph name="FILE_COUNT" />...</translation> <translation id="1352103415082130575">Kibodi ya Kithai (Pattachote)</translation> <translation id="1353686479385938207"><ph name="PROVIDER_NAME" />: <ph name="NETWORK_NAME" /></translation> +<translation id="1353946958707294039">Kidhibiti cha hifadhi ya Usanifu Bora</translation> <translation id="1353966721814789986">Kurasa za kuanza</translation> <translation id="1354868058853714482">Toleo hili la Adobe Reader halitumiki tena na huenda si salama.</translation> <translation id="1355408554203439639">Kiweka safu za picha cha programu ya 3D</translation> @@ -421,7 +422,6 @@ <translation id="1533920822694388968">Mpangilio wa Runinga</translation> <translation id="15373452373711364">Kishale kikubwa cha kipanya</translation> <translation id="1543284117603151572">Zilizoletwa Kutoka Kivinjari cha Edge</translation> -<translation id="1544350195767834591">{NUM_COOKIES,plural, =1{1 kutoka tovuti nyingine}other{# kutoka tovuti nyingine}}</translation> <translation id="1545177026077493356">Skrini Nzima Kiotomatiki</translation> <translation id="1545786162090505744">URL iliyo na %s katika nafasi ya hoja</translation> <translation id="1546280085599573572">Kiendelezi hiki kimebadilisha ukurasa unaoonyeshwa unapobofya kitufe cha Mwanzo.</translation> @@ -445,7 +445,6 @@ <translation id="1559235587769913376">Ingiza vibambo vya Msimbosare</translation> <translation id="1561092721008294962">HarfBuzz kwa maandishi ya Kiolesura</translation> <translation id="1566049601598938765">Tovuti</translation> -<translation id="1566958206723629112">Flash na PDF</translation> <translation id="1567723158593978621">Ikiwashwa, kuingia katika kivinjari kutatumia mtiririko mpya wa gaia wa kuingia katika akaunti uliotenganishwa kwa nenosiri.</translation> <translation id="1567993339577891801">Kidhibiti JavaScript</translation> <translation id="1568323446248056064">Fungua mipangilio ya kifaa ya onyesho</translation> @@ -574,7 +573,6 @@ <translation id="1723940674997333416">Ruhusu WebSocket zisizo salama kutoka asili ya https</translation> <translation id="1725149567830788547">Onyesha &Vidhibiti</translation> <translation id="172612876728038702">TPM inasanidiwa. Tafadhali vumilia; huenda hii ikachukua dakika chache.</translation> -<translation id="1727135806684246609">Maandishi ya Usalama wa Nyenzo</translation> <translation id="1729533290416704613">Pia inadhibiti ukurasa unaoonyeshwa unapotafuta kutoka Sanduku Kuu.</translation> <translation id="1731346223650886555">Semikoloni</translation> <translation id="1731589410171062430">Jumla: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /> (<ph name="NUMBER_OF_PAGES" /> <ph name="PAGE_OR_PAGES_LABEL" />)</translation> @@ -653,7 +651,7 @@ <translation id="1842969606798536927">Lipa</translation> <translation id="184456654378801210">(Asili)</translation> <translation id="1844692022597038441">Faili hii haipatikani nje ya mtandao.</translation> -<translation id="1846308012215045257">Bonyeza kitufe cha 'Control' ukibofya programu-jalizi ya <ph name="PLUGIN_NAME" /> ili kuitimia</translation> +<translation id="1846308012215045257">Shikilia kitufe cha 'Control' ukibofya programu-jalizi ya <ph name="PLUGIN_NAME" /> ili kuitimia</translation> <translation id="184633654410729720">Kibodi ya Kithai (Kedmanee)</translation> <translation id="1849186935225320012">Ukurasa huu una udhibiti kamili wa vifaa vya MIDI.</translation> <translation id="1850508293116537636">Zungusha kisaa</translation> @@ -871,6 +869,7 @@ <translation id="218492098606937156">Wezesha matukio ya mguso</translation> <translation id="2187317261103489799">Gundua (chaguo-msingi)</translation> <translation id="2187895286714876935">Hitilafu ya Kuleta Cheti cha Seva</translation> +<translation id="2188881192257509750">Fungua <ph name="APPLICATION" /></translation> <translation id="2190069059097339078">Kipataji cha Kitambulisho cha WiFi</translation> <translation id="219008588003277019">Sehemu Asili ya Seva-teja: <ph name="NEXE_NAME" /></translation> <translation id="2190355936436201913">(tupu)</translation> @@ -989,6 +988,7 @@ <translation id="2326606747676847821">Vinjari katika Hali Fiche</translation> <translation id="2326931316514688470">Pakia upya programu</translation> <translation id="2327492829706409234">Washa programu</translation> +<translation id="2328054044222305089">Hatua hii itafuta data yoyote <ph name="SITE" /> iliyohifadhiwa kwenye kifaa chako, na kuweka upya ruhusa zozote ulizotoa ili kutumia. Je, ungependa kuendelea?</translation> <translation id="2329597144923131178">Ingia katika akaunti ili upate alamisho, historia, manenosiri, na mipangilio yako mingine kwenye vifaa vyako vyote.</translation> <translation id="2332131598580221120">Angalia katika Duka la Wavuti</translation> <translation id="2332742915001411729">Rejesha kwenye chaguo-msingi</translation> @@ -1263,7 +1263,6 @@ <translation id="2675358154061544447">Utumiaji wa majaribio wa hali ya juu wa kuonyesha fremu za tovuti zote katika shughuli tofauti. Katika hali hii, hati zitashiriki mchakato wa kionyeshi ikiwa tu zimetoka kwenye tovuti sawa.</translation> <translation id="2676946222714718093">Inacheza kwenye</translation> <translation id="2678063897982469759">Washa tena</translation> -<translation id="2678246812096664977">Programu-jalizi zote</translation> <translation id="2679385451463308372">Chapisha kwa kutumia kidadisi cha mfumo…</translation> <translation id="2680208403056680091">Muunganisho Wako wa Intaneti Unadhibitiwa</translation> <translation id="268053382412112343">Historia</translation> @@ -1437,7 +1436,6 @@ <translation id="287286579981869940">Ongeza <ph name="PROVIDER_NAME" />...</translation> <translation id="2872961005593481000">Zima</translation> <translation id="2875698561019555027">(Kurasa za hitilafu kwenye Chrome)</translation> -<translation id="2879560882721503072">Cheti cha mteja kilichotolewa na <ph name="ISSUER" /> kimehifadhiwa.</translation> <translation id="288024221176729610">Kicheki</translation> <translation id="288042212351694283">Fikia vifaa vyako vya Ubia wa Hatua mbili</translation> <translation id="2881966438216424900">Ilitumiwa mwisho:</translation> @@ -1586,6 +1584,7 @@ <translation id="3057861065630527966">Weka hifadhi rudufu ya picha na video zako</translation> <translation id="3058212636943679650">Ikiwa unahitaji kabisa kurejesha upya mfumo wako wa uendeshaji kompyuta utahitaji kadi ya ufufuaji ya SD au kijiti kumbukumbu cha USB.</translation> <translation id="305932878998873762">Akiba Rahisi ya HTTP ni akiba mpya. Inategemea mfumo wa faili kwa ugawaji wa nafasi ya diski.</translation> +<translation id="3060251871394327123">Hatua hii itafuta data yoyote <ph name="SITE" /> iliyohifadhiwa kwenye kifaa chako. Je, ungependa kuendelea?</translation> <translation id="3061650404498811439">Washa kipengele cha kufikia emoji, mwandiko na kuweka data kwa kutamka kwenye menyu ya IME ya kuchagua kuingia.</translation> <translation id="3062606427884046423">Tumia arifa za Android MediaStyle kwa arifa za maudhui ya Chrome.</translation> <translation id="3063844757726132584">Fikia programu zako zote kutoka kwenye kifungua programu hiki. Cheza michezo, piga gumzo la video, sikiliza miziki, badilisha hati au upate programu zaidi.</translation> @@ -1635,6 +1634,7 @@ <translation id="3123569374670379335">(Unaosimamiwa)</translation> <translation id="3124111068741548686">Mishikilio ya MTUMIAJI</translation> <translation id="3126026824346185272">Ctrl</translation> +<translation id="3127156390846601284">Hatua hii itafuta data yoyote iliyohifadhiwa kwenye kifaa chako kwa tovuti zote zilizoonyeshwa. Je, ungependa kuendelea?</translation> <translation id="312759608736432009">Mtengenezaji wa kifaa:</translation> <translation id="3127919023693423797">Inathibitisha...</translation> <translation id="3128230619496333808">Kichupo cha 6</translation> @@ -1733,7 +1733,6 @@ <translation id="3264544094376351444">Fonti ya Sans-serif</translation> <translation id="3264547943200567728">Haijaweza kuweka mipangilio ya mtandao wa Chromebox yako</translation> <translation id="3265459715026181080">Funga Dirisha</translation> -<translation id="3267271790328635957">PDF pekee</translation> <translation id="3267726687589094446">Endelea kuruhusu upakuaji otomatiki wa faili nyingi</translation> <translation id="3267998849713137817">Saa Zilizorekebishwa</translation> <translation id="3268451620468152448">Fungua Vichupo</translation> @@ -1976,6 +1975,7 @@ <translation id="3574210789297084292">ingia</translation> <translation id="3574305903863751447"><ph name="CITY" />, <ph name="STATE" /> <ph name="COUNTRY" /></translation> <translation id="357479282490346887">Kilithuania</translation> +<translation id="3575927481544652747">Zima API ya Windows Runtime MIDI kwa WebMIDI, iliyowashwa kwa chaguo-msingi kwenye Windows 10 au matoleo mapya zaidi.</translation> <translation id="3576324189521867626">Imesakinishwa</translation> <translation id="3578331450833904042">Chaguo-msingi (nasa kila kitu)</translation> <translation id="3578594933904494462">Maudhui ya kichupo hiki yanashirikiwa</translation> @@ -2029,8 +2029,6 @@ <translation id="3627320433825461852">Imesalia chini ya dakika 1</translation> <translation id="3627588569887975815">Fungua kiungo katika dirisha fiche</translation> <translation id="3627671146180677314">Muda wa Ku</translation> -<translation id="3629326610814700057">Huwasha kipengele cha kidhibiti cha hifadhi ili kudhibiti hifadhi iliyo katika kifaa.</translation> -<translation id="3630337581925712713"><ph name="PERMISSION_TYPE_LABEL" />:</translation> <translation id="3631337165634322335">Vighairi vilivyo hapo chini vinaathiri tu katika kipindi cha sasa kinachoendelea katika hali fiche.</translation> <translation id="3633586230741134985">Mipangilio ya Kizindua Programu</translation> <translation id="3633997706330212530">Unaweza kulemaza huduma hizi kwa hiari.</translation> @@ -2053,7 +2051,8 @@ <translation id="3654045516529121250">Soma mipangilio yako ya ufikiaji</translation> <translation id="3654092442379740616">Hitilafu ya Kusawazisha: Muda wa <ph name="PRODUCT_NAME" /> umeisha na inahitaji kusasishwa.</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{Ina idhini ya ufikiaji wa kudumu wa faili moja.}other{Ina idhini ya ufikiaji wa kudumu wa faili #.}}</translation> -<translation id="3657468915905674858">Washa kipengee cha Kufunga PPAPI Win32k.</translation> +<translation id="365793796291733849"><ph name="BEGIN_PARAGRAPH1" />Unapowasha kipengee cha kuhifadhi nakala kiotomatiki, data iliyo kwenye kifaa na programu huhifadhiwa mara kwa mara kwenye folda ya faragha katika Hifadhi ya Google. Data ya programu inaweza kuwa data yoyote ambayo programu imehifadhi (kulingana na mipangilio ya msanidi programu), ikiwa ni pamoja na data inayoweza kuwa nyeti kama vile anwani, ujumbe na picha.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Data ya nakala rudufu haitahesabiwa katika nafasi inayotolewa bila malipo kwenye Hifadhi. Haitahifadhi nakala za faili kubwa au faili ambazo wasanidi programu wameamua kutojumuisha kwenye huduma hii.<ph name="END_PARAGRAPH2" /></translation> <translation id="3660234220361471169">Haviaminiki</translation> <translation id="3665589677786828986">Chrome imegundua kuwa baadhi ya mipangilio yako ilivurugwa na programu nyingine na ikairejesha kwenye mipangilio yake iliyotoka nayo kiwandani.</translation> <translation id="3665842570601375360">Usalama:</translation> @@ -2108,6 +2107,7 @@ <translation id="3733127536501031542">Seva ya SSL iliyo na Upandishaji</translation> <translation id="3736520371357197498">Ikiwa unaelewa kiwango cha hatari kinachoweza kutokea, unaweza <ph name="BEGIN_LINK" />kutembelea tovuti hii isiyo salama<ph name="END_LINK" /> kabla programu hatari hazijaondolewa.</translation> <translation id="3738924763801731196"><ph name="OID" />:</translation> +<translation id="3739254215541673094">Ungependa kufungua <ph name="APPLICATION" />?</translation> <translation id="3739798227959604811">Chelewesha kabla ya kurudia:</translation> <translation id="3741158646617793859">Sasa <ph name="DEVICE_NAME" /> itaonekana katika Admin Console</translation> <translation id="3741243925913727067">Hifadhi nakala ya picha na video za kifaa chako cha kuhifadhia data kwenye Hifadhi ya Google.</translation> @@ -2346,7 +2346,6 @@ <translation id="4058793769387728514">Kagua Andiko Sasa</translation> <translation id="4059285154003114015">Chapisha Fremu...</translation> <translation id="406070391919917862">Programu za Mandharinyuma</translation> -<translation id="4061502419206152498">Onyesha maandishi ambayo si salama, na ambayo hayajahuishwa pekee</translation> <translation id="4062251648694601778">Furahia kifaa chako cha <ph name="SHORT_PRODUCT_NAME" />. Je, una maswali? Unaweza kutegemea kupata usaidizi wakati wote kwa kubofya "?" katika treya ya hali.</translation> <translation id="4065876735068446555">Mtandao unaotumia (<ph name="NETWORK_ID" />) unaweza kukuhitaji utembelee ukurasa wake wa kuingia katika akaunti.</translation> <translation id="4068506536726151626">Ukurasa huu una vipengee kutoka tovuti zifuatazo ambazo zinafuatilia mahali ulipo:</translation> @@ -2383,7 +2382,6 @@ <translation id="4101878899871018532">Kisimamia nenosiri hakitajitolea kuhifadhi kitambulisho kilichotumiwa kusawazisha.</translation> <translation id="410351446219883937">Kucheza kiotomatiki</translation> <translation id="4104163789986725820">&Hamisha...</translation> -<translation id="4105523032910086267">Huweka uhuishaji na mwonekano wa maandishi ya usalama katika Usanifu Bora.</translation> <translation id="4105563239298244027">Pata TB 1 isiyolipiwa kutoka Hifadhi ya Google</translation> <translation id="4109135793348361820">Hamisha dirisha hadi kwa <ph name="USER_NAME" /> (<ph name="USER_EMAIL" />)</translation> <translation id="4110342520124362335">Vidakuzi kutoka <ph name="DOMAIN" /> vimezuiwa.</translation> @@ -2433,6 +2431,7 @@ <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="4188447344915957833">Huwasha kidhibiti cha hifadhi katika Mipangilio ya Usanifu Bora.</translation> <translation id="4189406272289638749">Kiendelezi, <b> <ph name="EXTENSION_NAME" /> </ b>, kinadhibiti mpangilio huu.</translation> <translation id="4193154014135846272">Hati za Google</translation> <translation id="4193182321948161343">Washa Kidhibiti cha Mtumiaji wa Usanifu Bora</translation> @@ -2640,6 +2639,7 @@ <translation id="4508765956121923607">Tazama &Asili</translation> <translation id="4509017836361568632">Tupa picha</translation> <translation id="4509345063551561634">Mahali:</translation> +<translation id="4513946894732546136">Mwitiko</translation> <translation id="4514542542275172126">Sanidi mtumiaji mpya anayesimamiwa</translation> <translation id="4514914692061505365">Lazimisha matumizi ya kitafsiri cha haraka cha Subzero cha PNaCl kwa faili zote za pexe.</translation> <translation id="451515744433878153">Ondoa</translation> @@ -2738,6 +2738,7 @@ <translation id="4656293982926141856">Kompyuta hii</translation> <translation id="4656631038341342120">Washa kipengele cha gamba la Uhalisia Pepe ikiwa kinapatikana kwa kifaa hiki.</translation> <translation id="4657031070957997341">Ruhusu programu-jalizi kwenye <ph name="HOST" /> wakati wowote</translation> +<translation id="466008749075469935">Huwasha kipengele cha kuzuia matumizi ya vipima muda chini chini ya kiini cha kompyuta (CPU) hadi 1%.</translation> <translation id="4663254525753315077">Inapowezekana, huweka maudhui ya kutembeza ya kipengele cha ziada cha kutembeza kwenye safu iliyounganishwa kwa ajili ya kutembeza haraka.</translation> <translation id="4664482161435122549">Hitilafu ya Kuhamisha ya PKCS #12</translation> <translation id="4665014895760275686">Mtengenezaji</translation> @@ -2806,6 +2807,7 @@ <translation id="4749157430980974800">Kibodi ya Kijojia</translation> <translation id="4750394297954878236">Mapendekezo</translation> <translation id="475088594373173692">Mtumiaji wa kwanza</translation> +<translation id="4750892496809949692">Chagua maudhui ya HTML kwa kuficha Flash dhidi ya orodha ya programu-jalizi.</translation> <translation id="4750917950439032686">Maelezo yako (kwa mfano, manenosiri, au nambari za kadi za mikopo) ni ya faragha yanapotumwa kwenye tovuti hii.</translation> <translation id="4753602155423695878">Uhuishaji wa upau wa maendeleo ya upakiaji wa ukurasa wa simu ya Android</translation> <translation id="4755240240651974342">Kibodi ya Kifini</translation> @@ -3079,6 +3081,7 @@ <translation id="5119450342834678097">Omba chaguo la tovuti la kompyuta kibao katika menyu ya mipangilio</translation> <translation id="5120068803556741301">Mbinu ya wengine ya kuingiza data</translation> <translation id="5120421890733714118">Amini cheti hiki kwa ajili ya kutambua tovuti.</translation> +<translation id="5120516977819314347">PIN au nenosiri si sahihi.</translation> <translation id="5121130586824819730">Diski yako kuu imejaa. Tafadhali hifadhi kwenye eneo jingine au utafute nafasi zaidi kwenye diski kuu.</translation> <translation id="5125751979347152379">URL batili.</translation> <translation id="5127881134400491887">Dhibiti miunganisho ya mtandao</translation> @@ -3086,12 +3089,13 @@ <translation id="512903556749061217">kimeambatishwa</translation> <translation id="5129301143853688736">Muunganisho wako kwenye tovuti hii si wa faragha. Huenda wavamizi wanajaribu kuiba maelezo yako (kwa mfano, picha, manenosiri, ujumbe na kadi za malipo) kutoka <ph name="DOMAIN" />.</translation> <translation id="5129662217315786329">Kipolandi</translation> +<translation id="5131347545782851480">Hati za PDF</translation> <translation id="5134856901811723984">Usanifu Bora katika Kiolesura cha Mfumo wa Uendeshaji wa Chrome</translation> <translation id="5135533361271311778">Isingeweza kuunda kipengee cha alamisho.</translation> <translation id="5136529877787728692">F7</translation> <translation id="5137501176474113045">Futa kipengee hiki</translation> <translation id="5137929532584371582">16</translation> -<translation id="5138177765054221193">Kwa tovuti ambazo zimewekwa mipangilio ya "ruhusu" maudhui ya Flash, tekelela maudhui yote ikiwa ni pamoja na yoyote ambayo yameainishwa kuwa si muhimu.</translation> +<translation id="5138177765054221193">Kwa tovuti ambazo zimewekwa mipangilio ya "ruhusu" maudhui ya Flash, tekeleza maudhui yote ikiwa ni pamoja na yoyote ambayo yameainishwa kuwa si muhimu.</translation> <translation id="5139955368427980650">&Fungua</translation> <translation id="5141240743006678641">Simba kwa njia fiche manenosiri yaliyosawazishwa ukitumia stakabadhi zako za Google</translation> <translation id="5143374789336132547">Kiendelezi "<ph name="EXTENSION_NAME" />" kimebadilisha ukurasa unaoonyeshwa unapobofya kitufe cha Mwanzo.</translation> @@ -3254,6 +3258,7 @@ <translation id="5328031682234198929">8</translation> <translation id="5329858601952122676">&Futa</translation> <translation id="5330145655348521461">Faili hizi zilifunguka kwenye eneo-kazi tofauti. Sogea kwenye <ph name="USER_NAME" /> ( <ph name="MAIL_ADDRESS" /> ) ili uzione.</translation> +<translation id="5330512191124428349">Pata maelezo</translation> <translation id="5332624210073556029">Saa za eneo:</translation> <translation id="5333807720589685258">SIM kadi yako itafungwa kabisa ikiwa hutaweka Ufunguo sahihi wa Kufungua PIN.</translation> @@ -3686,7 +3691,6 @@ <translation id="5892507820957994680">Inafuta orodha ya uonyeshaji ya programu iliyojengewa ndani na kuwezesha uharakishaji wa GPU katika usanidi wa mfumo usiohimiliwa.</translation> <translation id="5895138241574237353">Zzima na uwashe</translation> <translation id="5895187275912066135">Kilitolewa</translation> -<translation id="5898154795085152510">Seva ilirejesha cheti batili cha mteja. Hitilafu <ph name="ERROR_NUMBER" /> (<ph name="ERROR_NAME" />).</translation> <translation id="5900302528761731119">Picha ya Wasifu katika Google</translation> <translation id="590253956165195626">Toleo la kutafsiri kurasa ambazo ziko katika lugha usiyoisoma.</translation> <translation id="5904093760909470684">Usanidi wa Proksi</translation> @@ -3741,12 +3745,14 @@ <translation id="5984222099446776634">Vilivyotembelewa Hivi karibuni</translation> <translation id="5984814259619230127">Ugunduaji wa Smart Lock Bluetooth Low Energy</translation> <translation id="5986245990306121338">Ikiwashwa, kibadilisha kichupo kitaonekana hata wakati chaguo la 'unganisha vichupo na programu' itakuwa katika mipangilio.</translation> +<translation id="5989712527536636369"><ph name="BEGIN_PARAGRAPH1" />Haya ni maelezo ya jumla kuhusu kifaa chako na namna unavyokitumia, kama vile kiwango cha betri, idadi ya matumizi ya programu zako, ubora na muda wa miunganisho ya mtandao wako (kama Wi-Fi na Bluetooth), na ripoti za kuacha kufanya kazi mambo yanapoharibika. Yatatumiwa kuboresha bidhaa na huduma za Google kwa kila mtu. Baadhi ya maelezo yaliyojumuishwa yatasaidia washirika, kama vile wasanidi programu wa Android, kuboresha programu na bidhaa zao pia.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Unaweza kuwasha au kuzima kipengele hiki wakati wowote katika Mipangilio ya Android. Hili haliathiri uwezo wa kifaa chako kutuma maelezo inayohitaji ili kupokea huduma za msingi kama vile masasisho ya mfumo na usalama.<ph name="END_PARAGRAPH2" /></translation> <translation id="5990198433782424697">Viendelezi kwenye Chrome:// URLs</translation> <translation id="5990814808592353318">Kujiundia nenosiri mwenyewe.</translation> <translation id="5991049340509704927">Zidisha</translation> <translation id="5991774521050363748">Washa kipengee cha miundo maalum ya Arifa za Wavuti. Itakuwa na maboresho madogo ya miundo ambayo vinginevyo hayawezekani.</translation> <translation id="5993332328670040093">Matumizi yako ya data hayatapimwa tena.</translation> -<translation id="5998167623928667649">Tumia maudhui yote ya Flash mipangilio ya Flash inapowekwa kuwa "ruhusu"</translation> +<translation id="5998167623928667649">Tumia maudhui yote ya Flash, mipangilio ya Flash inapowekwa kuwa "ruhusu"</translation> <translation id="6003177993629630467"><ph name="PRODUCT_NAME" /> huenda isiwezi kujisasisha.</translation> <translation id="6003294706906016758">Huwasha fremu ya mtindo wa programu ya wavuti kwa programu zilizopangishwa</translation> <translation id="600424552813877586">programu batili.</translation> @@ -3754,6 +3760,7 @@ <translation id="6005695835120147974">Ruta ya Maudhui</translation> <translation id="6007237601604674381">Kusogezwa kumeshindika. <ph name="ERROR_MESSAGE" /></translation> <translation id="6008241731410823808">Hutuma mito ya ukaguzi wa kiungo.</translation> +<translation id="6011449291337289699">Futa data ya tovuti</translation> <translation id="6015796118275082299">Mwaka</translation> <translation id="6016551720757758985">Thibitisha Powerwash kwa kurejea kwenye toleo la awali</translation> <translation id="6016809788585079594">Sema "Ok Google" mara ya mwisho</translation> @@ -3943,7 +3950,6 @@ <translation id="6276301056778294989">Hakikisha kuwa kifaa kinaonyesha nambari sawa ya kuthibitisha.</translation> <translation id="6277105963844135994">Muda wa Mtandao Umekwisha</translation> <translation id="6277518330158259200">Piga Picha ya Skrini</translation> -<translation id="6278428485366576908">Mandhari</translation> <translation id="6279183038361895380">Bonyeza |<ph name="ACCELERATOR" />| ili kishale kionekane</translation> <translation id="6280215091796946657">Ingia kwa kutumia akaunti tofauti</translation> <translation id="6280912520669706465">ARC</translation> @@ -4195,6 +4201,7 @@ <translation id="6607272825297743757">Maelezo ya faili</translation> <translation id="6607831829715835317">Zana zaidi</translation> <translation id="6608140561353073361">Data yote ya vidakuzi na tovuti...</translation> +<translation id="6610183966322615106">Hitilafu imetokea wakati wa kuongeza printa</translation> <translation id="6610610633807698299">Ingiza URL...</translation> <translation id="6612358246767739896">Maudhui yanayolindwa</translation> <translation id="6615455863669487791">Nionyeshe</translation> @@ -4258,7 +4265,6 @@ <translation id="6708242697268981054">Asili:</translation> <translation id="6709357832553498500">Unganisha ukitumia <ph name="EXTENSIONNAME" /></translation> <translation id="6710213216561001401">Iliyotangulia</translation> -<translation id="6712158998835983046">Onyesha yote yaliyohuishwa</translation> <translation id="6718273304615422081">Inabanwa...</translation> <translation id="671928215901716392">Funga skrini</translation> <translation id="6721972322305477112">&Faili</translation> @@ -4530,7 +4536,6 @@ <translation id="7088434364990739311">Ukaguzi wa usasishaji ulishindwa kuanza (hitilafu ya msimbo <ph name="ERROR" /> ).</translation> <translation id="708856090370082727">Washa kipengele cha kusogeza cha OSK. Alama hii ikiwashwa, OSK itabadilisha tu ukubwa wa sehemu ya kuangalilia inayoonekana.</translation> <translation id="7088674813905715446">Kifaa hiki kimewekwa katika hali ya kutotumika na msimamizi. Ili kukiwezesha kwa uandikishaji, tafadhali mwambie msimamizi wako aweke kifaa katika hali ya kusubiri.</translation> -<translation id="7089609847854449639">Kidhibiti cha hifadhi</translation> <translation id="708969677220991657">Huruhusu maombi ya kupangisha karibu kwenye HTTPS hata cheti kisicho sahihi kikiwasilishwa.</translation> <translation id="7092106376816104">Vighairi madirisha ibukizi</translation> <translation id="7093866338626856921">Badilisha data kwa vifaa viitwavyo: <ph name="HOSTNAMES" /></translation> @@ -4570,7 +4575,7 @@ <translation id="715118844758971915">Printa za zamani</translation> <translation id="7154130902455071009">Badilisha ukurasa wako uwe: <ph name="START_PAGE" /></translation> <translation id="7155171745945906037">Picha iliyopo kutoka kwenye kamera au faili</translation> -<translation id="715568033737470079">Bainisha programu-jalizi za PPAPI ambazo zitatumiwa ndani ya sera ya sehemu ya majarabio ya Win32k (Windows 10 na matoleo ya baadaye).</translation> +<translation id="7155226869555939647">Fungua viungo vya <ph name="APPLICATION" /> kila wakati</translation> <translation id="7156235233373189579">Faili hii imeundwa kwa PC inayotumia programu ya Windows. Hii haioani na kifaa chako kinachotumia Chrome OS. Tafadhali tafuta <ph name="BEGIN_LINK" />Duka la Chrome Wavutini<ph name="END_LINK" /> kwa programu nyingine inayofaa.<ph name="BEGIN_LINK_HELP" />Pata Maelezo zaidi<ph name="END_LINK_HELP" /></translation> <translation id="7157063064925785854">Kwa kubofya Endelea unakubaliana na <ph name="LEGAL_DOC_LINK_TEXT_1" /> , <ph name="LEGAL_DOC_LINK_TEXT_2" /> , <ph name="LEGAL_DOC_LINK_TEXT_3" /> , na <ph name="LEGAL_DOC_LINK_TEXT_4" /> .</translation> <translation id="7158238151765743968">Muunganisho kwa "<ph name="DEVICE_NAME" />" bado unaendelea.</translation> @@ -4585,6 +4590,7 @@ <translation id="7175353351958621980">Imepakiwa kutoka:</translation> <translation id="7180611975245234373">Onyesha upya</translation> <translation id="7180865173735832675">Binafsisha</translation> +<translation id="7181387261278441780">Futa na uweke upya data ya tovuti</translation> <translation id="7185078796915954712">TLS 1.3</translation> <translation id="7185690883425432021">Huficha vitufe vya kufunga vya vichupo visivyotumika kidhibiti kikiwa katika hali ya kupangwa kwa rafu.</translation> <translation id="7186088072322679094">Weka katika Upau wa Vidhibiti</translation> @@ -4617,7 +4623,6 @@ <translation id="7223775956298141902">Boo... Huna viendelezi :-(</translation> <translation id="7224023051066864079">Kinyago cha mtandao mdogo:</translation> <translation id="7225179976675429563">Aina ya mtandao inakosekana</translation> -<translation id="7230191962699768124">Onyesha yote, ambayo hayajahuishwa</translation> <translation id="7230787553283372882">Badilisha ukubwa wa maandishi ukufae</translation> <translation id="7231224339346098802">Tumia nambari kuonyesha ni nakala ngapi za kuchapishwa (1 au zaidi).</translation> <translation id="7238585580608191973">Alama ya kidole ya SHA-256</translation> @@ -4701,7 +4706,7 @@ <translation id="7360183604634508679">Menyu ya alamisho</translation> <translation id="7361039089383199231">Baiti $1</translation> <translation id="736108944194701898">Kasi ya kipanya:</translation> -<translation id="7361297102842600584">Bofya kulia ili utumie <ph name="PLUGIN_NAME" /></translation> +<translation id="7361297102842600584">Bofya kitufe cha kulia cha kipanya ili utumie <ph name="PLUGIN_NAME" /></translation> <translation id="7361824946268431273">Kompyuta ya kasi, rahisi na salama zaidi</translation> <translation id="7364745943115323529">Tuma...</translation> <translation id="7364796246159120393">Chagua Faili</translation> @@ -4749,7 +4754,6 @@ <translation id="7409233648990234464">Zindua tena na Powerwash</translation> <translation id="7409836189476010449">Tumia Flash</translation> <translation id="7410344089573941623">Uliza iwapo <ph name="HOST" /> inataka kufikia kamera na maikrofoni yako</translation> -<translation id="7411343637221933631">{NUM_COOKIES,plural, =1{1 kutoka kwenye tovuti hii}other{# kutoka kwenye tovuti hii}}</translation> <translation id="7412226954991670867">Kumbukumbu ya GPU</translation> <translation id="7416362041876611053">Hitilafu ya mtandao isiyojulikana.</translation> <translation id="7417453074306512035">Kibodi ya Kiethiopia</translation> @@ -4871,6 +4875,7 @@ <translation id="756445078718366910">Fungua Dirisha la Kivinjari</translation> <translation id="7564847347806291057">Komesha shughuli</translation> <translation id="7566723889363720618">F12</translation> +<translation id="7567314848159753396">Kidakuzi: <ph name="NAME" /></translation> <translation id="756809126120519699">Data ya Chrome imefutwa</translation> <translation id="7568790562536448087">Inasasisha</translation> <translation id="7573172247376861652">Chaji ya Betri</translation> @@ -4911,6 +4916,7 @@ <translation id="7626009897377900107">Uundaji wa nenosiri</translation> <translation id="7627262197844840899">Tovuti hii haikubali MasterCard.</translation> <translation id="7627790789328695202">Lo, <ph name="FILE_NAME" /> tayari ipo. Ibadili jina na ujaribu tena.</translation> +<translation id="7628127343934101653">Fungua faili za PDF katika programu chaguo-msingi ya mtazamaji wa PDF.</translation> <translation id="762917759028004464">Kivinjari chaguo-msingi kwa sasa ni <ph name="BROWSER_NAME" />.</translation> <translation id="7629536005696009600">Ruhusu kitambulisho kilichohifadhiwa cha programu za Android kujazwa katika tovuti zinazolingana.</translation> <translation id="7629827748548208700">Kichupo: <ph name="TAB_NAME" /></translation> @@ -5140,6 +5146,7 @@ <translation id="7957513156576779045">Washa Bluetooth ili uruhusu kuoanisha</translation> <translation id="7957615753207896812">Fungua mipangilio ya kifaa ya kibodi</translation> <translation id="7959074893852789871">Faili ina vyeti anuwai, badhii ya vingine ambavyo havikuletwa:</translation> +<translation id="7959700692661109221"><ph name="BEGIN_PARAGRAPH" />Huduma ya Google ya mahali hutumia vyanzo kama Wi-Fi ili kusaidia kukisia mahali kifaa chako kilipo kwa haraka na kwa usahihi zaidi. Unapowasha huduma za Google za mahali, kifaa chako huingia katika hali ambayo hutumia Wi-Fi kutoa taarifa za mahali. Unaweza kuzima huduma hii kwenye mipangilio ya mahali wakati wowote.<ph name="END_PARAGRAPH" /></translation> <translation id="7961015016161918242">Katu</translation> <translation id="7964089325405904043">Kuleta na kuhamisha manenosiri</translation> <translation id="7965010376480416255">Kumbukumbu Iliyoshirikiwa</translation> @@ -5290,6 +5297,7 @@ <translation id="8146793085009540321">Haikufaulu kuingia katika akaunti. Tafadhali wasiliana na msimamizi wako au ujaribu tena.</translation> <translation id="8148264977957212129">Mbinu ingizo ya Pinyin</translation> <translation id="8148913456785123871">Onyesha kadi za Google Msaidizi katika kifungua programu</translation> +<translation id="8150391391298684512">Zima API ya Windows Runtime MIDI</translation> <translation id="8151185429379586178">Zana za wasanidi programu</translation> <translation id="8151638057146502721">Sanidi</translation> <translation id="8151639108075998630">Wezesha kuvinjari kwa mgeni</translation> @@ -5572,6 +5580,7 @@ <translation id="8532294913309524834">Panga lugha kulingana na mapendeleo yako.</translation> <translation id="8535005006684281994">URL ya </translation> <translation id="8539727552378197395">La (HttpOnly)</translation> +<translation id="8541084862688000575">Pakia programu za Android kiotomatiki</translation> <translation id="8543181531796978784">Unaweza <ph name="BEGIN_ERROR_LINK" />kuripoti tatizo la ugunduzi<ph name="END_ERROR_LINK" /> au, ikiwa unaelewa kiwango cha hatari kinachoweza kutokea, <ph name="BEGIN_LINK" />tembelea tovuti hii isiyo salama<ph name="END_LINK" />.</translation> <translation id="8545107379349809705">Ficha maelezo...</translation> <translation id="8545211332741562162">Inawezesha kurasa za wavuti kutumia vipengele vya JavaScript vya jaribio.</translation> @@ -5599,7 +5608,6 @@ <translation id="8569764466147087991">Chagua faili ya kufungua</translation> <translation id="8571032220281885258">Unaposema "Ok Google," Chrome itatafuta unachosema baada ya hapo.</translation> <translation id="8571108619753148184">Seva 4</translation> -<translation id="8572832761467613633">Flash pekee</translation> <translation id="8572981282494768930">Usiruhusu tovuti zifikie kamera na maikrofoni yako</translation> <translation id="8574234089711453001">Ruhusu kitufe cha kupakua kionekane unapofungua ukurasa wenye url ya maudhui.</translation> <translation id="857779305329188634">Washa matumizi ya itifaki ya majaribio ya QUIC.</translation> @@ -5621,6 +5629,7 @@ <translation id="8600929685092827187">Amsha Kwenye Pakiti</translation> <translation id="8601206103050338563">Uthibitishaji wa Teja wa TLS WWW</translation> <translation id="8602851771975208551">Programu nyingine kwenye kompyuta yako iliongeza programu ambayo inaweza kubadilisha jinsi Chrome inavyofanya kazi.</translation> +<translation id="8603912787021349466">Ruhusu programu za Android zianze kiotomatiki baada ya kuingia katika akaunti.</translation> <translation id="8605428685123651449">Kumbukumbu ya SQLite</translation> <translation id="8605503133013456784">Imeshindwa kukatisha muunganisho na kutooanisha kutoka "<ph name="DEVICE_NAME" />".</translation> <translation id="8606726445206553943">Tumia vifaa vyako vya MIDI</translation> @@ -5973,6 +5982,7 @@ <translation id="9053965862400494292">Hitilafu fulani imetokea wakati wa kujaribu kuweka usawazishaji.</translation> <translation id="9056034633062863292">Inasasisha Chromebox</translation> <translation id="9056810968620647706">Hakuna zinazolingana zilizopatikana.</translation> +<translation id="9057119625587205566">Hakuna printa zilizo karibu</translation> <translation id="9059868303873565140">Menyu ya hali</translation> <translation id="9064142312330104323">Picha ya Wasifu kwenye Google (inapakia)</translation> <translation id="9064275926664971810">Washa kipengele cha Kujaza otomatiki ili kujaza fomu kwa mbofyo mmoja</translation> @@ -5983,6 +5993,7 @@ <translation id="9067401056540256169">Ripoti hii inaifanya Chrome kutokuwa salama. Tumia tu ikiwa unaelewa kile inachofanya. Fahamu kuwa ripoti hii inaweza kuondolewa bila arifa yoyote. Ikiwashwa, fremu zilizo na asili ya htttps zinaweza kutumia WebSockets zilizo na URL isiyo salama (ws://).</translation> <translation id="9068931793451030927">Njia:</translation> <translation id="9070219033670098627">Badilisha wasifu</translation> +<translation id="9070940116164932228">Kaba vipima muda ghali vya chini chini</translation> <translation id="907148966137935206">Usiruhusu tovuti yoyote ionyeshe madirisha ibukizi (inapendekezwa)</translation> <translation id="9072550133391925347"><ph name="PASSWORD_MANAGER_BRAND" /> hukuwezesha kuingia katika tovuti na programu zinazofaa kiotomatiki kwa manenosiri uliyohifadhi.</translation> <translation id="9073281213608662541">PAP</translation> @@ -6017,6 +6028,7 @@ <translation id="9112614144067920641">Tafadhali chagua PIN mpya.</translation> <translation id="9112748030372401671">Badilisha mandhari yako</translation> <translation id="9112987648460918699">Pata...</translation> +<translation id="9114663181201435112">Ingia katika akaunti kwa urahisi</translation> <translation id="9115487443206954631">Dhibiti vifaa vya Kutuma</translation> <translation id="9115675100829699941">&Alamisho</translation> <translation id="9121814364785106365">Fungua kama kichupo kilichobanwa</translation> @@ -6111,7 +6123,6 @@ <translation id="952992212772159698">Haijaamilishwa</translation> <translation id="960719561871045870">Msimbo wa mtoa huduma</translation> <translation id="960987915827980018">Takriban saa 1 imesalia</translation> -<translation id="962778376131245616">Onyesha yasiyo salama na yaliyohuishwa pekee</translation> <translation id="96421021576709873">Mtandao wa Wi-Fi</translation> <translation id="965490406356730238">Washa mjpeg iliyoongezwa kasi kwa maunzi kusimbua fremu iliyopigwa picha inapopatikana.</translation> <translation id="968174221497644223">Akiba ya programu</translation>
diff --git a/chrome/app/resources/generated_resources_ta.xtb b/chrome/app/resources/generated_resources_ta.xtb index 3fb3788..746fd40 100644 --- a/chrome/app/resources/generated_resources_ta.xtb +++ b/chrome/app/resources/generated_resources_ta.xtb
@@ -18,7 +18,6 @@ <translation id="1029317248976101138">பெரிதாக்கு</translation> <translation id="1029595648591494741">"<ph name="EXTENSION_NAME" />" ஐ முயற்சிக்கவா?</translation> <translation id="1031362278801463162">மாதிரிக்காட்சியை ஏற்றுகிறது</translation> -<translation id="1031460590482534116">கிளையன்ட் சான்றிதழை சேமிக்க முயற்சிக்கையில் ஒரு பிழை ஏற்பட்டது. பிழை <ph name="ERROR_NUMBER" /> (<ph name="ERROR_NAME" />).</translation> <translation id="1031573127485938293">கேள் (கொள்கையின்படி)</translation> <translation id="103279545524624934">Android பயன்பாடுகளைத் துவக்க, சாதனத்தில் இடத்தைக் காலியாக்கவும்.</translation> <translation id="1033780634303702874">உங்கள் தொடர் சாதனங்களை அணுகலாம்</translation> @@ -101,6 +100,7 @@ <translation id="1128591060186966949">தேடல் இன்ஜினை மாற்று</translation> <translation id="1128987120443782698">சேகரிப்பு சாதனத்தில் <ph name="DEVICE_CAPACITY" /> நினைவகம் உள்ளது. 4GB திறன்கொண்ட SD கார்டு அல்லது USB நினைவகத்தைச் செருகவும்.</translation> <translation id="1137135726305341424">domContentLoaded மற்றும் domContentLoaded தொடங்குவதற்கு முன்பு தொடங்கிய பிற வளங்களின் ஏற்றம் முடிந்த பிறகு நிறைவு செய்யவும் (முதன்மை ஃபிரேம் மற்றும் அதே தொடக்கத்திலிருந்து உருவாகும் ஐஃபிரேம்கள்)</translation> +<translation id="1138663153846032155">ஃபிளாஷை மறைத்து HTMLஐத் தேர்வுசெய்தல்</translation> <translation id="1140351953533677694">உங்கள் Bluetooth மற்றும் தொடர் சாதனங்களை அணுகலாம்</translation> <translation id="114140604515785785">நீட்டிப்பு மூல கோப்பகம்:</translation> <translation id="1143142264369994168">சான்றிதழ் கையொப்பமிடுநர்</translation> @@ -252,6 +252,7 @@ <translation id="1351692861129622852"><ph name="FILE_COUNT" /> கோப்புகளைப் பதிவிறக்குகிறது...</translation> <translation id="1352103415082130575">தாய் விசைப்பலகை (பட்டாசொட்டே)</translation> <translation id="1353686479385938207"><ph name="PROVIDER_NAME" />: <ph name="NETWORK_NAME" /></translation> +<translation id="1353946958707294039">மெட்டீரியல் வடிவச் சேமிப்பக நிர்வாகி</translation> <translation id="1353966721814789986">தொடக்கப் பக்கங்கள்</translation> <translation id="1354868058853714482">Adobe Reader காலாவதியானது, பாதுகாப்பில்லாமல் இருக்கக்கூடும்.</translation> <translation id="1355408554203439639">3டி மென்பொருள் ராஸ்டரைசர்</translation> @@ -423,7 +424,6 @@ <translation id="1533920822694388968">டிவி சீரமைப்பு</translation> <translation id="15373452373711364">பெரிய மவுஸ் இடஞ்சுட்டி</translation> <translation id="1543284117603151572">Edge இலிருந்து இறக்கப்பட்டது</translation> -<translation id="1544350195767834591">{NUM_COOKIES,plural, =1{பிற தளங்களிலிருந்து 1 குக்கீ}other{பிற தளங்களிலிருந்து # குக்கீகள்}}</translation> <translation id="1545177026077493356">தானியங்கு கியோஸ்க் பயன்முறை</translation> <translation id="1545786162090505744">வினவலுக்கான இடத்தில் %s ஐக் கொண்ட URL</translation> <translation id="1546280085599573572">முகப்புப் பொத்தானைக் கிளிக் செய்யும் போது காண்பிக்கப்படும் பக்கத்தை இந்த நீட்டிப்பு மாற்றியுள்ளது.</translation> @@ -447,7 +447,6 @@ <translation id="1559235587769913376">யுனிக்கோட் எழுத்துகளை உள்ளிடுக</translation> <translation id="1561092721008294962">UI உரைக்கான HarfBuzz</translation> <translation id="1566049601598938765">இணையதளம்</translation> -<translation id="1566958206723629112">ஃப்ளாஷ் மற்றும் PDF</translation> <translation id="1567723158593978621">இயக்கப்படும் போது, உலாவியில் உள்நுழைவது புதிய gaia கடவுச்சொல் பிரிக்கப்பட்ட உள்நுழைவுப் பாய்வைப் பயன்படுத்தும்.</translation> <translation id="1567993339577891801">JavaScript கன்சோல்</translation> <translation id="1568323446248056064">திரை அமைப்புகளைத் திற</translation> @@ -576,7 +575,6 @@ <translation id="1723940674997333416">https மூலத்திலிருந்து பாதுகாப்பற்ற WebSocket ஐ அனுமதி</translation> <translation id="1725149567830788547">&கட்டுப்பாடுகளைக் காண்பி</translation> <translation id="172612876728038702">TPM அமைக்கப்படுகிறது. தயவுசெய்து காத்திருங்கள், இதற்கு சில நிமிடங்கள் ஆகலாம்.</translation> -<translation id="1727135806684246609">மெட்டீரியல் பாதுகாப்புக் குறிப்பு</translation> <translation id="1729533290416704613">சர்வபுலத்திலிருந்து தேடலை மேற்கொள்ளும்போது காண்பிக்கப்படும் பக்கத்தையும் இது கட்டுப்படுத்துகிறது.</translation> <translation id="1731346223650886555">அரைப்புள்ளி</translation> <translation id="1731589410171062430">மொத்தம்: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /> (<ph name="NUMBER_OF_PAGES" /> <ph name="PAGE_OR_PAGES_LABEL" />)</translation> @@ -872,6 +870,7 @@ <translation id="218492098606937156">தொடு நிகழ்வுகளை இயக்கு</translation> <translation id="2187317261103489799">கண்டறி (இயல்பு)</translation> <translation id="2187895286714876935">சேவையக சான்றிதழ் இறக்குமதி பிழை</translation> +<translation id="2188881192257509750"><ph name="APPLICATION" />ஐத் திற</translation> <translation id="2190069059097339078">வைஃபை கிரெடென்ஷியல் கெட்டர்</translation> <translation id="219008588003277019">இயல்பான கிளையண்ட் தொகுதிக்கூறு: <ph name="NEXE_NAME" /></translation> <translation id="2190355936436201913">(காலி)</translation> @@ -990,6 +989,7 @@ <translation id="2326606747676847821">மறைநிலைக்குச் செல்</translation> <translation id="2326931316514688470">&பயன்பாட்டை மீண்டும் ஏற்று</translation> <translation id="2327492829706409234">பயன்பாட்டை இயக்கு</translation> +<translation id="2328054044222305089">இவ்வாறு செய்வதால், உங்கள் சாதனத்தில் சேமித்த <ph name="SITE" /> தரவை நீக்குவதோடு, நீங்கள் இயக்குவதற்கு அனுமதியளித்த எல்லா அனுமதிகளையும் மீட்டமைக்கும். தொடரவா?</translation> <translation id="2329597144923131178">உங்கள் எல்லா சாதனங்களிலும் புத்தகக்குறிகள், வரலாறு, கடவுச்சொற்கள் மற்றும் பிற அமைப்புகளைப் பெற உள்நுழையவும்.</translation> <translation id="2332131598580221120">அங்காடியில் காட்டு</translation> <translation id="2332742915001411729">இயல்புநிலைக்கு மீட்டமை</translation> @@ -1266,7 +1266,6 @@ <translation id="2675358154061544447">கிராஸ் சைட் iframesஐத் தனித்தனிச் செயல்பாடுகளில் ரெண்டரிங் செய்வதற்கான உயர் சோதனை ஆதரவு. இந்தப் பயன்முறையில், ஆவணங்கள் ஒரே இணையதளத்திலிருந்து வந்திருந்தால் மட்டுமே, அவை ரெண்டரர் செயல்பாட்டைப் பகிரும்.</translation> <translation id="2676946222714718093">இதில் இயங்குகிறது</translation> <translation id="2678063897982469759">மீண்டும் இயக்கு</translation> -<translation id="2678246812096664977">எல்லா செருகுநிரல்களுக்கும்</translation> <translation id="2679385451463308372">கணினி உரையாடலைப் பயன்படுத்தி அச்சிடவும்…</translation> <translation id="2680208403056680091">உங்கள் இணைய இணைப்பு கட்டுப்படுத்தப்படுகிறது</translation> <translation id="268053382412112343">Hi&story</translation> @@ -1440,7 +1439,6 @@ <translation id="287286579981869940"><ph name="PROVIDER_NAME" />ஐச் சேர்...</translation> <translation id="2872961005593481000">நிறுத்து</translation> <translation id="2875698561019555027">(Chrome பிழைப் பக்கங்கள்)</translation> -<translation id="2879560882721503072"><ph name="ISSUER" /> வழங்கிய கிளையன்ட் சான்றிதழ் வெற்றிகரமாக சேமிக்கப்பட்டது.</translation> <translation id="288024221176729610">செக்</translation> <translation id="288042212351694283">உங்கள் யுனிவர்சல் 2ஆம் நிலை சாதனங்களை அணுகும்</translation> <translation id="2881966438216424900">கடைசியாக அணுகியது:</translation> @@ -1589,6 +1587,7 @@ <translation id="3057861065630527966">உங்கள் படங்கள் மற்றும் வீடியோக்களைக் காப்புப் பிரதியெடுக்கவும்</translation> <translation id="3058212636943679650">உங்கள் கணினியின் இயக்க முறைமையை எப்போதாவது மீட்டெடுக்க வேண்டுமெனில், உங்களுக்கு தேவையானதெல்லாம் மீட்பு SD அட்டை அல்லது USB நினைவகம் ஆகியவையே.</translation> <translation id="305932878998873762">HTTP க்கான எளிய தற்காலிகச் சேமிப்பு என்பது புதிய தற்காலிகச் சேமிப்புதான். வட்டு இடத்தின் ஒதுக்கீட்டிற்காக கோப்பு அமைப்பைச் சார்ந்திருக்கும்.</translation> +<translation id="3060251871394327123">இவ்வாறு செய்வதால், சாதனத்தில் சேமித்த எல்லா <ph name="SITE" /> தரவும் நீக்கப்படும். தொடரவா?</translation> <translation id="3061650404498811439">IMEஐத் தேர்வு செய்யும் மெனுவிலிருந்து ஈமோஜி, கையெழுத்து மற்றும் குரல் உள்ளீடு ஆகியவற்றை அணுகும் வசதியை இயக்கு.</translation> <translation id="3062606427884046423">Chrome மீடியா அறிவிப்புகளுக்கு Android மீடியா ஸ்டைல் அறிவிப்புகளைப் பயன்படுத்து.</translation> <translation id="3063844757726132584">இந்த எளிதான துவக்கியிலிருந்து உங்களின் எல்லா பயன்பாடுகளையும் அணுகலாம். கேம்கள் விளையாடலாம், வீடியோவின் மூலம் அரட்டையடிக்கலாம், இசையைக் கேட்கலாம், ஆவணங்களைத் திருத்தலாம் அல்லது கூடுதல் பயன்பாடுகளைப் பெறலாம்.</translation> @@ -1638,6 +1637,7 @@ <translation id="3123569374670379335">(கண்காணிக்கப்பட்டது)</translation> <translation id="3124111068741548686">USER ஹேண்டில்ஸ்</translation> <translation id="3126026824346185272">Ctrl</translation> +<translation id="3127156390846601284">இவ்வாறு செய்வதால், காட்டப்படும் எல்லாத் தளங்களுக்கும் உங்கள் சாதனத்தில் சேமித்த தரவு நீக்கப்படும். தொடரவா?</translation> <translation id="312759608736432009">சாதன உற்பத்தியாளர்:</translation> <translation id="3127919023693423797">அங்கீகரிக்கிறது...</translation> <translation id="3128230619496333808">தாவல் 6</translation> @@ -1736,7 +1736,6 @@ <translation id="3264544094376351444">Sans-Serif எழுத்துரு</translation> <translation id="3264547943200567728">உங்கள் Chromebox இன் நெட்வொர்க்கை அமைக்க முடியவில்லை</translation> <translation id="3265459715026181080">சாளரத்தை மூடு</translation> -<translation id="3267271790328635957">PDF மட்டும்</translation> <translation id="3267726687589094446">பல கோப்புகளைத் தானாக பதிவிறக்க, அனுமதிப்பதைத் தொடர்</translation> <translation id="3267998849713137817">மாற்றிய நேரம்</translation> <translation id="3268451620468152448">திறந்த தத்தல்கள்</translation> @@ -1981,6 +1980,7 @@ <translation id="3574210789297084292">உள்நுழைக</translation> <translation id="3574305903863751447"><ph name="CITY" />, <ph name="STATE" /> <ph name="COUNTRY" /></translation> <translation id="357479282490346887">லிதுவேனியன்</translation> +<translation id="3575927481544652747">WebMIDIக்கான (Windows 10 அல்லது அதற்குப் பிந்தைய பதிப்பில் இயல்பாக இயக்கப்பட்டிருக்கும்) Windows Runtime MIDI APIஐ முடக்கு.</translation> <translation id="3576324189521867626">நிறுவப்பட்டது</translation> <translation id="3578331450833904042">இயல்பு (அனைத்தையும் தேர்ந்தெடு)</translation> <translation id="3578594933904494462">இந்தத் தாவலில் உள்ள உள்ளடக்கமானது பகிரப்படுகிறது.</translation> @@ -2034,8 +2034,6 @@ <translation id="3627320433825461852">1 நிமிடத்திற்கும் குறைவாக உள்ளது</translation> <translation id="3627588569887975815">மறை&நிலை சாளரத்தில் இணைப்பைத்திற</translation> <translation id="3627671146180677314">Netscape சான்றிதழ் புதுப்பிப்பு நேரம்</translation> -<translation id="3629326610814700057">அகச் சேமிப்பகத்தை நிர்வகிக்க, சேமிப்பக நிர்வாகியை அனுமதிக்கும்.</translation> -<translation id="3630337581925712713"><ph name="PERMISSION_TYPE_LABEL" />:</translation> <translation id="3631337165634322335">நடப்பு மறைநிலை அமர்வுக்கு மட்டுமே பின்வரும் விதிவிலக்குகள் பொருந்தும்.</translation> <translation id="3633586230741134985">பயன்பாட்டுத் துவக்கியின் அமைப்புகள்</translation> <translation id="3633997706330212530">நீங்கள் விரும்பினால் இந்தச் சேவைகளை முடக்கிவிடலாம்.</translation> @@ -2058,7 +2056,8 @@ <translation id="3654045516529121250">உங்கள் அணுகல்தன்மை அமைப்புகளைப் படித்தல்</translation> <translation id="3654092442379740616">ஒத்திசைவுப் பிழை: <ph name="PRODUCT_NAME" /> காலாவதியானதால், அதைப் புதுப்பிக்க வேண்டும்.</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{ஒரு கோப்பிற்கு நிரந்தர அணுகலைக் கொண்டுள்ளது.}other{# கோப்புகளுக்கு நிரந்தர அணுகலைக் கொண்டுள்ளது.}}</translation> -<translation id="3657468915905674858">PPAPI Win32k பூட்டை இயக்கு.</translation> +<translation id="365793796291733849"><ph name="BEGIN_PARAGRAPH1" />தானியங்கு காப்புப் பிரதியை இயக்கும் போது, சாதனம் மற்றும் பயன்பாட்டுத் தரவானது குறிப்பிட்ட கால இடைவெளியில் Google இயக்ககத்தில் உள்ள தனிப்பட்ட கோப்புறையில் சேமிக்கப்படும். பயன்பாட்டுத் தரவு என்பது தொடர்புகள், செய்திகள், படங்கள் போன்ற மிகவும் முக்கியத் தரவு உட்பட, பயன்பாடு சேமித்த (டெவெலப்பர் அமைப்புகளைப் பொறுத்து) எந்தத் தரவாகவும் இருக்கலாம்.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />உங்கள் இயக்ககச் சேமிப்பக ஒதுக்கீட்டில் காப்புப் பிரதித் தரவு கணக்கிடப்படாது. பெரிய கோப்புகள் அல்லது சேவையிலிருந்து டெவெலப்பர்கள் விலக்கிய கோப்புகள் காப்புப் பிரதி எடுக்கப்படாது.<ph name="END_PARAGRAPH2" /></translation> <translation id="3660234220361471169">நம்பகமில்லாதது</translation> <translation id="3665589677786828986">மற்றொரு நிரலால் உங்கள் அமைப்புகளில் சில சிதைந்துள்ளதை Chrome கண்டறிந்ததுடன், அவற்றை அசல் இயல்புநிலைகளுக்கு மீட்டமைக்கிறது.</translation> <translation id="3665842570601375360">பாதுகாப்பு:</translation> @@ -2113,6 +2112,7 @@ <translation id="3733127536501031542">அதிகமாக்குதலுடனான SSL சேவையகம்</translation> <translation id="3736520371357197498">உங்கள் பாதுகாப்பிற்கான ஆபத்தைப் புரிந்துகொண்டால், தீங்கிழைக்கும் நிரல்கள் அகற்றப்படுவதற்கு முன் <ph name="BEGIN_LINK" />இந்தப் பாதுகாப்பற்ற தளத்தைப் பார்வையிடலாம்<ph name="END_LINK" />.</translation> <translation id="3738924763801731196"><ph name="OID" />:</translation> +<translation id="3739254215541673094"><ph name="APPLICATION" />ஐத் திறக்கவா?</translation> <translation id="3739798227959604811">மீள்செயலுக்கு முந்தைய தாமதம்:</translation> <translation id="3741158646617793859">இப்போது <ph name="DEVICE_NAME" />, Admin Console இல் தோன்றும்</translation> <translation id="3741243925913727067">மீடியா சாதனத்தின் படங்களையும் வீடியோக்களையும் Google இயக்ககத்தில் காப்புப் பிரதி எடுக்கும்.</translation> @@ -2352,7 +2352,6 @@ <translation id="4058793769387728514">ஆவணத்தை இப்போது சரிபார்</translation> <translation id="4059285154003114015">&சட்டத்தை அச்சிடு...</translation> <translation id="406070391919917862">பின்புல ஆப்ஸ்</translation> -<translation id="4061502419206152498">பாதுகாப்பற்றவை மற்றும் அனிமேஷன் செய்யாதவற்றை மட்டும் காட்டு</translation> <translation id="4062251648694601778">உங்கள் <ph name="SHORT_PRODUCT_NAME" /> சாதனத்துடன் மகிழ்ந்திருங்கள். கேள்விகள் உள்ளனவா? நிலைத் தட்டில் "?" ஐக் கிளிக் செய்வதன் மூலம் எப்போது வேண்டுமானாலும் உதவியைப் பெறலாம்.</translation> <translation id="4065876735068446555">பயன்படுத்திக் கொண்டிருக்கும் நெட்வொர்க் (<ph name="NETWORK_ID" />), அதன் உள்நுழைவுப் பக்கத்தை நீங்கள் பார்க்குமாறு கேட்கலாம்.</translation> <translation id="4068506536726151626">உங்கள் இருப்பிடத்தைத் தெரிந்து கொள்ளக் கூடிய பின்வரும் தளங்களின் கூறுகள் இந்தப் பக்கத்தில் உள்ளன:</translation> @@ -2391,7 +2390,6 @@ <translation id="4101878899871018532">ஒத்திசைவிற்குப் பயன்படுத்தும் நற்சான்றிதழைச் சேமிக்கவா எனக் கடவுச்சொல் நிர்வாகி கேட்காது.</translation> <translation id="410351446219883937">தானியங்கி</translation> <translation id="4104163789986725820">ஏற்று&மதி...</translation> -<translation id="4105523032910086267">மெட்டீரியல் வடிவத்தில் பாதுகாப்புக் குறிப்பின் அனிமேஷனையும் தெரிவுநிலையையும் அமைக்கும்.</translation> <translation id="4105563239298244027">Google இயக்ககம் மூலம் 1 டெ.பை. இலவசமாகப் பெறுக</translation> <translation id="4109135793348361820"><ph name="USER_NAME" /> (<ph name="USER_EMAIL" />) க்குச் சாளரத்தை நகர்த்து</translation> <translation id="4110342520124362335"><ph name="DOMAIN" /> இலிருந்து வரும் குக்கீகள் தடுக்கப்பட்டன.</translation> @@ -2442,6 +2440,7 @@ <translation id="418179967336296930">ரஷ்யன் ஒலிபெயர்ப்பு (YaZHert) விசைப்பலகை</translation> <translation id="4181841719683918333">மொழிகள்</translation> <translation id="4187248015940562149">உங்களைச் சுற்றியுள்ள புளூடூத் சாதனங்களுடன் இணைக்கவும் அவற்றைக் கட்டுப்படுத்தவும் இணையதளங்களை அனுமதிக்கக்கூடிய இணைய புளூடூத்தை இயக்கும்.</translation> +<translation id="4188447344915957833">மெட்டீரியல் வடிவ அமைப்புகளில் சேமிப்பக நிர்வாகியை இயக்கும்.</translation> <translation id="4189406272289638749"><b><ph name="EXTENSION_NAME" /></b> என்ற நீட்டிப்பு, இந்த அமைப்பைக் கட்டுப்படுத்துகிறது.</translation> <translation id="4193154014135846272">Google ஆவணம்</translation> <translation id="4193182321948161343">மெட்டீரியல் வடிவப் பயனர் நிர்வாகியை இயக்கு</translation> @@ -2649,6 +2648,7 @@ <translation id="4508765956121923607">ஆ&தாரத்தைக் காண்பி</translation> <translation id="4509017836361568632">புகைப்படத்தை நிராகரி</translation> <translation id="4509345063551561634">இருப்பிடம்:</translation> +<translation id="4513946894732546136">கருத்து</translation> <translation id="4514542542275172126">புதிய கண்காணிக்கப்படும் பயனரை அமை</translation> <translation id="4514914692061505365">எல்லா pexe கோப்புகளிலும் PNaCl இன் விரைவு சப்ஜீரோ மொழிபெயர்ப்பாளரின் உபயோகத்தைக் கட்டாயமாக்கும்.</translation> <translation id="451515744433878153">அகற்று</translation> @@ -2747,6 +2747,7 @@ <translation id="4656293982926141856">இந்தக் கணினி</translation> <translation id="4656631038341342120">இந்தச் சாதனத்தில் VR ஷெல் இருந்தால், அதை இயக்கும்.</translation> <translation id="4657031070957997341">செருகுநிரல்களை எப்போதும் <ph name="HOST" /> இல் அனுமதி</translation> +<translation id="466008749075469935">பின்புல டைமர்களின் CPU உபயோகத்தை 1%க்கு வரம்பிட, குறுக்கீட்டை இயக்கும்.</translation> <translation id="4663254525753315077">சாத்தியமாகும்போது, வேகமான உருட்டலுக்காக, அதிகமாக உருட்டும் கூறின் உருட்டும் உள்ளடக்கங்களை தொகுக்கப்பட்ட அடுக்கில் வைக்கவும்.</translation> <translation id="4664482161435122549">PKCS #12 ஏற்றுமதி பிழை</translation> <translation id="4665014895760275686">உற்பத்தியாளர்</translation> @@ -2812,6 +2813,7 @@ <translation id="4749157430980974800">ஜார்ஜியன் விசைப்பலகை</translation> <translation id="4750394297954878236">பரிந்துரைகள்</translation> <translation id="475088594373173692">முதல் பயனர்</translation> +<translation id="4750892496809949692">செருகுநிரல்கள் பட்டியலில் இருந்து ஃபிளாஷை மறைப்பதன் மூலம் HTML உள்ளடக்கத்தைத் தேர்வுசெய்யும்.</translation> <translation id="4750917950439032686">உங்கள் தகவலை (எடுத்துக்காட்டு: கடவுச்சொற்கள் அல்லது கிரெடிட் கார்டு எண்கள்) இந்தத் தளத்திற்கு அனுப்பும் போது, தனிப்பட்டதாக இருக்கும்.</translation> <translation id="4753602155423695878">Android ஃபோன் பக்கம் ஏற்றப்படும் செயல்நிலைப் பட்டியின் அனிமேஷன்</translation> <translation id="4755240240651974342">ஃபின்னிஷ் விசைப்பலகை</translation> @@ -3086,6 +3088,7 @@ <translation id="5119450342834678097">அமைப்புகள் மெனுவில் டேப்லெட் தள விருப்பத்தைக் கோரும்</translation> <translation id="5120068803556741301">மூன்றாம் தரப்பு உள்ளீட்டு முறை</translation> <translation id="5120421890733714118">வலைத்தளங்களை அடையாளம் காண இந்தச் சான்றிதழை நம்புக.</translation> +<translation id="5120516977819314347">பின் அல்லது கடவுச்சொல் தவறாக உள்ளது.</translation> <translation id="5121130586824819730">உங்கள் ஹார்டு டிஸ்க் நிரம்பியது. மற்றொரு இடத்தில் சேமிக்கவும் அல்லது ஹார்டு டிஸ்க்கில் கூடுதல் அறைகளை உருவாக்கவும்.</translation> <translation id="5125751979347152379">செல்லுபடியாகாத URL.</translation> <translation id="5127881134400491887">நெட்வொர்க் இணைப்புகளை நிர்வகி</translation> @@ -3093,6 +3096,7 @@ <translation id="512903556749061217">இணைக்கப்பட்டது</translation> <translation id="5129301143853688736">இந்தத் தளத்துடன் இணைப்பது தனிப்பட்டதல்ல. <ph name="DOMAIN" /> இலிருக்கும் உங்கள் தகவல்களை (அதாவது படங்கள், கடவுச்சொற்கள், செய்திகள் மற்றும் கிரெடிட் கார்டுகளின் தகவல்கள்) தீங்கிழைப்பவர்கள் திருட வாய்ப்புண்டு.</translation> <translation id="5129662217315786329">பொலிஷ்</translation> +<translation id="5131347545782851480">PDF ஆவணங்கள்</translation> <translation id="5134856901811723984">Chrome OS முறைமை இடைமுகத்தில் மெட்டீரியல் வடிவமைப்பு</translation> <translation id="5135533361271311778">புக்மார்க் உருப்படியை உருவாக்க முடியவில்லை.</translation> <translation id="5136529877787728692">F7</translation> @@ -3259,6 +3263,7 @@ <translation id="5328031682234198929">8</translation> <translation id="5329858601952122676">&நீக்கு</translation> <translation id="5330145655348521461">இந்தக் கோப்புகள் மற்றொரு டெஸ்க்டாப்பில் திறக்கப்பட்டன. இதைப் பார்க்க, <ph name="USER_NAME" /> (<ph name="MAIL_ADDRESS" />) க்கு நகர்த்தவும்.</translation> +<translation id="5330512191124428349">தகவலைப் பெறு</translation> <translation id="5332624210073556029">நேர மண்டலம்:</translation> <translation id="5333807720589685258">பின்னின் தடையை நீக்குவதற்கான சரியான குறியீட்டை உள்ளிடவில்லை எனில் உங்கள் சிம் கார்டு நிரந்தரமாக முடக்கப்படும்.</translation> @@ -3692,7 +3697,6 @@ <translation id="5892507820957994680">உள்ளமைக்கப்பட்ட மென்பொருள் ரெண்டரிங் பட்டியலை மீறிச்சென்று, ஆதரிக்கப்படாத முறைமை உள்ளமைப்புகளில் GPU- வேகப்படுத்துதலை செயலாக்குகிறது.</translation> <translation id="5895138241574237353">மறுதொடக்கம்</translation> <translation id="5895187275912066135">வழங்கப்பட்டது</translation> -<translation id="5898154795085152510">ஒரு செல்லுபடியாகாத கிளையன்ட் சான்றிதழை சேவையகம் வழங்கியது. பிழை <ph name="ERROR_NUMBER" /> (<ph name="ERROR_NAME" />).</translation> <translation id="5900302528761731119">Google சுயவிவரப் புகைப்படம்</translation> <translation id="590253956165195626">நான் படிக்கும் மொழியில் இல்லாத பக்கங்களை மொழிபெயர்க்கச் செய்.</translation> <translation id="5904093760909470684">ப்ராக்ஸி உள்ளமைவு</translation> @@ -3747,6 +3751,8 @@ <translation id="5984222099446776634">சமீபத்தில் பார்த்தவை</translation> <translation id="5984814259619230127">Smart Lock புளூடூத் லோ எனர்ஜி டிஸ்கவரி</translation> <translation id="5986245990306121338">இயக்கப்பட்டால், 'தாவல்களையும் பயன்பாடுகளையும் இணைக்கவும்' என்கிற விருப்பம் இயக்கத்தில் இருக்கும் போதும் தாவல் மாற்றி காட்டப்படும்.</translation> +<translation id="5989712527536636369"><ph name="BEGIN_PARAGRAPH1" />இது உங்கள் சாதனம் மற்றும் அதை எப்படிப் பயன்படுத்துகிறீர்கள் என்பது குறித்த பொதுவான தகவலாகும், அதாவது பேட்டரி அளவு, பயன்பாடுகளை எப்போது பயன்படுத்துகிறீர்கள், நெட்வொர்க் இணைப்புகளின் தரம் மற்றும் கால அளவு (வைஃபை மற்றும் புளுடூத் போன்றவை) மற்றும் சில விஷயங்கள் சரியாகச் செயல்படாத போது அனுப்பப்படும் சிதைவு அறிக்கைகள் போன்றவையாகும். எல்லோருக்காகவும் Google இன் தயாரிப்புகளையும் சேவைகளையும் மேம்படுத்த, தரவு பயன்படுத்தப்படும். ஒருங்கிணைக்கப்பட்ட சில தகவலானது கூட்டாளர்களுக்குத் (எ.கா. Android டெவெலப்பர்கள்) தங்கள் பயன்பாடுகளையும் தயாரிப்புகளையும் மேலும் சிறப்பாக்கவும் உதவும்.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />நீங்கள் எந்த நேரமும் Android பயன்பாடுகள் அமைப்புகளுக்குச் சென்று, இதை இயக்கலாம் அல்லது முடக்கலாம். இதனால் இயங்குதளப் புதுப்பிப்புகள், பாதுகாப்பு போன்ற அத்தியாவசிய சேவைகளைப் பெறத் தேவைப்படும் தகவலை அனுப்புவதற்கான சாதனத் திறனில் பாதிப்பு ஏற்படாது.<ph name="END_PARAGRAPH2" /></translation> <translation id="5990198433782424697">chrome:// URLகளில் நீட்டிப்புகள்</translation> <translation id="5990814808592353318">கைமுறை கடவுச்சொல் உருவாக்கம்.</translation> <translation id="5991049340509704927">பெரிதாக்கலாம்</translation> @@ -3760,6 +3766,7 @@ <translation id="6005695835120147974">மீடியா ரூட்டர்</translation> <translation id="6007237601604674381">நகர்வு தோல்வி. <ph name="ERROR_MESSAGE" /></translation> <translation id="6008241731410823808">மீத்தொடுப்புச் சரிபார்த்தல் பிங் செய்தல்களை அனுப்பும்.</translation> +<translation id="6011449291337289699">தளத் தரவை அழி</translation> <translation id="6015796118275082299">ஆண்டு</translation> <translation id="6016551720757758985">முந்தைய பதிப்பிற்கு மாற, பவர்வாஷை உறுதிப்படுத்தவும்</translation> <translation id="6016809788585079594">கடைசியாக ஒரு முறை "Ok Google" என்று கூறவும்</translation> @@ -3942,14 +3949,13 @@ <translation id="6268252012308737255"><ph name="APP" /> இல் திற</translation> <translation id="6268747994388690914">HTML கோப்பிலிருந்து புக்மார்க்குகளை இறக்குமதி செய்...</translation> <translation id="6270770586500173387"><ph name="BEGIN_LINK1" />சாதனம் மற்றும் பயன்பாட்டுத் தகவல்<ph name="END_LINK1" />, <ph name="BEGIN_LINK2" />அளவீடுகள்<ph name="END_LINK2" /> ஆகியவற்றை அனுப்பு</translation> -<translation id="6272643420381259437">செருகுநிரலைப் பயன்படுத்தும் போது, பிழை (<ph name="ERROR" />) ஏற்பட்டது</translation> +<translation id="6272643420381259437">செருகுநிரலைப் பதிவிறக்கும் போது, பிழை (<ph name="ERROR" />) ஏற்பட்டது</translation> <translation id="6272765239698781406">அக்ரசிவ் தற்காலிகச் சேமிப்பு நீக்க உத்தி</translation> <translation id="6273677812470008672">தரம்</translation> <translation id="62751439899495218">படத்தை மாற்று</translation> <translation id="6276301056778294989">சாதனமும் அதே குறியீட்டைக் காட்டுவதை உறுதிப்படுத்தவும்.</translation> <translation id="6277105963844135994">பிணைய நேரம் முடிந்தது</translation> <translation id="6277518330158259200">ஸ்கிரீன் ஷாட்டை எடு</translation> -<translation id="6278428485366576908">தீம்</translation> <translation id="6279183038361895380">உங்கள் சுட்டியைக் காட்ட |<ph name="ACCELERATOR" />| என்பதை அழுத்தவும்</translation> <translation id="6280215091796946657">வேறொரு கணக்கு மூலம் உள்நுழைக</translation> <translation id="6280912520669706465">ARC</translation> @@ -4201,6 +4207,7 @@ <translation id="6607272825297743757">கோப்புத் தகவல்</translation> <translation id="6607831829715835317">மேலும் கருவி&கள்</translation> <translation id="6608140561353073361">அனைத்து குக்கீகள் மற்றும் தள தரவு...</translation> +<translation id="6610183966322615106">பிரிண்டரைச் சேர்க்கும் போது பிழை</translation> <translation id="6610610633807698299">URL ஐ உள்ளிடு...</translation> <translation id="6612358246767739896">பாதுகாக்கப்பட்ட உள்ளடக்கம்</translation> <translation id="6615455863669487791">எனக்கு காண்பி</translation> @@ -4264,7 +4271,6 @@ <translation id="6708242697268981054">தோற்றம்:</translation> <translation id="6709357832553498500"><ph name="EXTENSIONNAME" />ஐப் பயன்படுத்தி இணை</translation> <translation id="6710213216561001401">முந்தையது</translation> -<translation id="6712158998835983046">அனைத்தையும், அனிமேஷனுடன் காட்டு</translation> <translation id="6718273304615422081">ஜிப் செய்கிறது...</translation> <translation id="671928215901716392">திரையைப் பூட்டு</translation> <translation id="6721972322305477112">&File</translation> @@ -4536,7 +4542,6 @@ <translation id="7088434364990739311">புதுப்பிப்பு சரிபார்த்தலை துவங்குவதில் தோல்வி. (பிழை குறியீடு <ph name="ERROR" />).</translation> <translation id="708856090370082727">OSK மிகைஉருட்டல் ஆதரவை இயக்கவும். இந்தக் கொடி இயக்கப்பட்டிருந்தால், விஷுவல் காட்சியின் அளவை மட்டுமே OSK மாற்றும்.</translation> <translation id="7088674813905715446">இந்தச் சாதனம் நிர்வாகியால் அணுகல் இல்லா தன்மையில் வைக்கப்பட்டுள்ளது. பதிவுசெய்வதற்காக அதை இயக்குவதற்கு, இந்தச் சாதனத்தை நிலுவை நிலையில் வைக்குமாறு உங்கள் நிர்வாகியிடம் கேட்கவும்.</translation> -<translation id="7089609847854449639">சேமிப்பக நிர்வாகி</translation> <translation id="708969677220991657">தவறான சான்றிதழ் இருந்தாலும் கூட, HTTPS வழியாக லோக்கல் ஹோஸ்ட்க்கான கோரிக்கைகளை அனுமதிக்கும்.</translation> <translation id="7092106376816104">பாப்-அப் விதிவிலக்குகள்</translation> <translation id="7093866338626856921">பின்வரும் பெயரிடப்பட்ட எந்தச் சாதனங்களுடனும் தரவைப் பரிமாறவும்: <ph name="HOSTNAMES" /></translation> @@ -4576,7 +4581,7 @@ <translation id="715118844758971915">கிளாசிக் பிரிண்டர்கள்</translation> <translation id="7154130902455071009">உங்கள் தொடக்கப் பக்கத்தை இதற்கு மாற்றவும்: <ph name="START_PAGE" /></translation> <translation id="7155171745945906037">கேமரா அல்லது கோப்பிலிருக்கும் படம்</translation> -<translation id="715568033737470079">Win32k லாக்டவுண் சாண்ட்பாக்ஸ் கொள்கைக்குள் இயங்கும் PPAPI செருகுநிரல்களைக் குறிப்பிடவும் (Windows 10 மற்றும் அதற்கு மேற்பட்ட பதிப்புக்கு மட்டும்).</translation> +<translation id="7155226869555939647"><ph name="APPLICATION" />க்கான இணைப்புகளை எப்போதும் திற</translation> <translation id="7156235233373189579">Windows மென்பொருள் பயன்படுத்தும் கணினிக்காக இந்தக் கோப்பு வடிவமைக்கப்பட்டது. இது Chrome OS இல் இயங்கும் உங்கள் சாதனத்திற்கு ஏற்றதல்ல. சரியான மாற்று பயன்பாட்டிற்காக <ph name="BEGIN_LINK" />Chrome இணைய அங்காடியில்<ph name="END_LINK" /> தேடவும்.<ph name="BEGIN_LINK_HELP" />மேலும் அறிக<ph name="END_LINK_HELP" /></translation> <translation id="7157063064925785854">தொடரவும் என்பதைக் கிளிக் செய்வதன் மூலம் <ph name="LEGAL_DOC_LINK_TEXT_1" />, <ph name="LEGAL_DOC_LINK_TEXT_2" />, <ph name="LEGAL_DOC_LINK_TEXT_3" />, மேலும் <ph name="LEGAL_DOC_LINK_TEXT_4" /> ஆகியவற்றை ஒப்புக்கொள்கிறீர்கள்.</translation> <translation id="7158238151765743968">"<ph name="DEVICE_NAME" />" க்கான இணைப்பு இன்னும் செயலில் உள்ளது.</translation> @@ -4591,6 +4596,7 @@ <translation id="7175353351958621980">இதிலிருந்து ஏற்றப்பட்டது:</translation> <translation id="7180611975245234373">புதுப்பி</translation> <translation id="7180865173735832675">தனிப்பயனாக்கு</translation> +<translation id="7181387261278441780">தளத்தை அழித்து, மீட்டமை</translation> <translation id="7185078796915954712">TLS 1.3</translation> <translation id="7185690883425432021">தாவல் பட்டியல் அடுக்கப்பட்ட பயன்முறையில் இருக்கும் போது, செயலற்ற தாவல்களின் மூடு பொத்தான்களை மறைக்கும்.</translation> <translation id="7186088072322679094">கருவிப்பட்டியில் வை</translation> @@ -4623,7 +4629,6 @@ <translation id="7223775956298141902">அச்சச்சோ... உங்களுக்கு நீட்டிப்புகள் இல்லை :-(</translation> <translation id="7224023051066864079">சப்நெட் மாஸ்க்:</translation> <translation id="7225179976675429563">நெட்வொர்க் வகை இல்லை</translation> -<translation id="7230191962699768124">அனைத்தையும், அனிமேஷன் இல்லாமல் காட்டு</translation> <translation id="7230787553283372882">உரை அளவைத் தனிப்பயனாக்கலாம்</translation> <translation id="7231224339346098802">எத்தனை நகல்கள் அச்சிட வேண்டுமென்பதைக் குறிக்க எண்ணைப் பயன்படுத்தவும் (1 அல்லது அதற்கு மேற்பட்டவை).</translation> <translation id="7238585580608191973">SHA-256 விரல்அச்சு</translation> @@ -4749,7 +4754,6 @@ <translation id="7409233648990234464">மீண்டும் தொடங்கி, பவர்வாஷ் செய்க</translation> <translation id="7409836189476010449">ஃபிளாஷை இயக்க</translation> <translation id="7410344089573941623">உங்கள் கேமராவையும் மைக்ரோஃபோனையும் <ph name="HOST" /> அணுக வேண்டுமெனில் கேட்கவும்</translation> -<translation id="7411343637221933631">{NUM_COOKIES,plural, =1{இந்தத் தளத்திலிருந்து 1 குக்கீ}other{இந்தத் தளத்திலிருந்து # குக்கீகள்}}</translation> <translation id="7412226954991670867">GPU நினைவகம்</translation> <translation id="7416362041876611053">அறியாத பிணையப் பிழை.</translation> <translation id="7417453074306512035">எத்தியோபிக் விசைப்பலகை</translation> @@ -4869,6 +4873,7 @@ <translation id="756445078718366910">உலாவி சாளரத்தைத் திற</translation> <translation id="7564847347806291057">செயலாக்கத்தை முடி</translation> <translation id="7566723889363720618">F12</translation> +<translation id="7567314848159753396">குக்கீ: <ph name="NAME" /></translation> <translation id="756809126120519699">Chrome தரவு அழிக்கப்பட்டது</translation> <translation id="7568790562536448087">புதுப்பிக்கிறது</translation> <translation id="7573172247376861652">பேட்டரி மின்னேற்றம்</translation> @@ -4909,6 +4914,7 @@ <translation id="7626009897377900107">கடவுச்சொல் உருவாக்கம்</translation> <translation id="7627262197844840899">இந்தத் தளம் MasterCard ஐ ஏற்காது.</translation> <translation id="7627790789328695202">அடடா, <ph name="FILE_NAME" /> ஏற்கனவே உள்ளது. இதற்கு மறுபெயரிட்டு மீண்டும் முயற்சிக்கவும்.</translation> +<translation id="7628127343934101653">இயல்புநிலை PDF வியூவர் பயன்பாட்டில் PDF கோப்புகளைத் திற.</translation> <translation id="762917759028004464">நடப்பு இயல்புநிலை உலாவி <ph name="BROWSER_NAME" /> ஆகும்.</translation> <translation id="7629536005696009600">Android பயன்பாடுகளுக்காகச் சேமிக்கப்பட்ட நற்சான்றுகளை, தொடர்புடைய இணையதளங்களில் நிரப்ப அனுமதிக்கும்.</translation> <translation id="7629827748548208700">தாவல்: <ph name="TAB_NAME" /></translation> @@ -5137,6 +5143,7 @@ <translation id="7957513156576779045">இணைப்பதை அனுமதிக்க, புளூடூத்தை இயக்கவும்</translation> <translation id="7957615753207896812">விசைப்பலகை அமைப்புகளைத் திற</translation> <translation id="7959074893852789871">இந்தக் கோப்பில் பல சான்றிதழ்கள் உள்ளன, அவற்றில் சில இறக்குமதி செய்யப்படவில்லை:</translation> +<translation id="7959700692661109221"><ph name="BEGIN_PARAGRAPH" />சாதன இடத்தை விரைவாகவும், மிகத் துல்லியமாகவும் கண்டறிய, வைஃபை போன்ற மூலங்களை Google இருப்பிடச் சேவை பயன்படுத்தும். Google இருப்பிடச் சேவைகளை இயக்கியிருக்கும் போது, இருப்பிடத் தகவலை வழங்க வைஃபையைப் பயன்படுத்தும் முறை சாதனத்தில் இயக்கப்படும். இதை இருப்பிட அமைப்புகளுக்குச் சென்று, எப்போது வேண்டுமானாலும் முடக்கலாம்.<ph name="END_PARAGRAPH" /></translation> <translation id="7961015016161918242">எப்போதும் இல்லை</translation> <translation id="7964089325405904043">கடவுச்சொல்லை இறக்கு மற்றும் ஏற்று</translation> <translation id="7965010376480416255">பகிரப்பட்ட நினைவகம்</translation> @@ -5287,6 +5294,7 @@ <translation id="8146793085009540321">உள்நுழைய முடியவில்லை. உங்கள் நிர்வாகியைத் தொடர்புகொள்ளவும் அல்லது மீண்டும் முயலவும்.</translation> <translation id="8148264977957212129">பின்யின் உள்ளீட்டு முறை</translation> <translation id="8148913456785123871">துவக்கியில், Google Now கார்டுகளைக் காட்டு</translation> +<translation id="8150391391298684512">Windows Runtime MIDI APIஐ முடக்கு</translation> <translation id="8151185429379586178">டெவெலப்பர் கருவிகள்</translation> <translation id="8151638057146502721">உள்ளமை</translation> <translation id="8151639108075998630">விருந்தினர் உலாவலைச் செயலாக்கு</translation> @@ -5568,6 +5576,7 @@ <translation id="8532294913309524834">உங்கள் விருப்பத்தின் அடிப்படையில் மொழிகளை வரிசைப்படுத்தவும்.</translation> <translation id="8535005006684281994">Netscape சான்றிதழ் புதுப்பிப்பு URL</translation> <translation id="8539727552378197395">இல்லை (Httpமட்டும்)</translation> +<translation id="8541084862688000575">Android பயன்பாடுகளைத் தானாக ஏற்று</translation> <translation id="8543181531796978784"><ph name="BEGIN_ERROR_LINK" />கண்டறிவதில் சிக்கல் இருப்பதைப் புகாரளிக்கலாம்<ph name="END_ERROR_LINK" /> அல்லது உங்கள் பாதுகாப்பிற்கு ஏற்படக்கூடிய ஆபத்துகளைப் புரிந்துகொண்டிருந்தால், <ph name="BEGIN_LINK" />இந்தப் பாதுகாப்பற்ற தளத்திற்குச் செல்லலாம்<ph name="END_LINK" />.</translation> <translation id="8545107379349809705">தகவலை மறை...</translation> <translation id="8545211332741562162">சோதனைக்குரிய JavaScript அம்சங்களைப் பயன்படுத்த வலைப் பக்கங்களை இயக்கலாம்.</translation> @@ -5595,7 +5604,6 @@ <translation id="8569764466147087991">திறப்பதற்கு ஒரு கோப்பைத் தேர்ந்தெடுக்கவும்</translation> <translation id="8571032220281885258">"Ok Google," என நீங்கள் சொல்லும்போது, நீங்கள் அடுத்து சொல்வதை Chrome தேடும்.</translation> <translation id="8571108619753148184">சேவையகம் 4</translation> -<translation id="8572832761467613633">ஃப்ளாஷ் மட்டும்</translation> <translation id="8572981282494768930">எனது கேமரா அல்லது மைக்ரோஃபோனை அணுக, தளங்களை அனுமதிக்க வேண்டாம்</translation> <translation id="8574234089711453001">மீடியா url கொண்டுள்ள பக்கத்தைத் திறக்கும் போது "பதிவிறக்கு" பொத்தானைக் காண்பிக்க அனுமதிக்கும்.</translation> <translation id="857779305329188634">பரிசோதனை QUIC நெறிமுறை ஆதரவை இயக்கு.</translation> @@ -5617,6 +5625,7 @@ <translation id="8600929685092827187">தொகுப்புகள் மூலம் இயக்கு</translation> <translation id="8601206103050338563">TLS WWW கிளையன்ட அங்கீகரிப்பு</translation> <translation id="8602851771975208551">உங்கள் கணினியில் உள்ள மற்றொரு நிரலானது, Chrome வேலைசெய்யும் வழியை மாற்றும் பயன்பாட்டைச் சேர்த்துள்ளது.</translation> +<translation id="8603912787021349466">உள்நுழைந்த பின், Android பயன்பாடுகளைத் தானாகத் தொடங்க அனுமதி.</translation> <translation id="8605428685123651449">SQLite நினைவகம்</translation> <translation id="8605503133013456784">"<ph name="DEVICE_NAME" />" இலிருந்து இணைப்பை நீக்குவதில் மற்றும் பிரித்தலில் தோல்வி.</translation> <translation id="8606726445206553943">MIDI சாதனங்களைப் பயன்படுத்தவும்</translation> @@ -5969,6 +5978,7 @@ <translation id="9053965862400494292">ஒத்திசைவை அமைக்க முயற்சிக்கும்போது ஒரு பிழை நேர்ந்தது.</translation> <translation id="9056034633062863292">Chromeboxஐப் புதுப்பிக்கிறது</translation> <translation id="9056810968620647706">பொருத்தங்கள் கண்டறியப்படவில்லை.</translation> +<translation id="9057119625587205566">அருகில் பிரிண்டர்கள் எதுவுமில்லை</translation> <translation id="9059868303873565140">நிலை மெனு</translation> <translation id="9064142312330104323">Google சுயவிவரப் புகைப்படம் (ஏற்றுகிறது)</translation> <translation id="9064275926664971810">ஒரே கிளிக்கில் படிவங்களை நிரப்ப, தானியங்கு நிரப்புதலை இயக்கு</translation> @@ -5979,6 +5989,7 @@ <translation id="9067401056540256169">இந்தக் கொடி Chrome ஐப் பாதுகாப்பற்றதாக்கும். இது என்ன செய்யும் என்பதை அறிந்த பின்னர் மட்டுமே பயன்படுத்தவும். அறிவிப்பு இல்லாமல் இந்தக் கொடி அகற்றப்படலாம் என்பதை நினைவில்கொள்ளவும். இயக்கப்பட்டால், https மூலத்துடன் கூடிய ஃப்ரேம்கள், பாதுகாப்பற்ற URL (ws://) உடன் கூடிய WebSockets ஐப் பயன்படுத்தலாம்.</translation> <translation id="9068931793451030927">பாதை:</translation> <translation id="9070219033670098627">பயனரை மாற்று</translation> +<translation id="9070940116164932228">த்ரோட்டில் எக்ஸ்பென்சிவ் பின்புல டைமர்கள்</translation> <translation id="907148966137935206">பாப்-அப்களைக் காண்பிக்க எந்த தளத்தையும் அனுமதிக்க வேண்டாம் (பரிந்துரைக்கப்பட்டது)</translation> <translation id="9072550133391925347"><ph name="PASSWORD_MANAGER_BRAND" /> நீங்கள் சேமித்த கடவுச்சொற்களைப் பயன்படுத்தி தகுதியுள்ள தளங்களிலும் பயன்பாடுகளிலும் உங்களைத் தானாக உள்நுழையச் செய்யும்.</translation> <translation id="9073281213608662541">PAP</translation> @@ -6012,6 +6023,7 @@ <translation id="9112614144067920641">ஒரு புதிய PIN ஐத் தேர்வுசெய்க.</translation> <translation id="9112748030372401671">உங்கள் வால்பேப்பரை மாற்றலாம்</translation> <translation id="9112987648460918699">கண்டுபிடி...</translation> +<translation id="9114663181201435112">எளிதாக உள்நுழையலாம்</translation> <translation id="9115487443206954631">அனுப்பும் சாதனங்களை நிர்வகி</translation> <translation id="9115675100829699941">&புக்மார்க்குகள்</translation> <translation id="9121814364785106365">பின்செய்யப்பட்ட தாவலாகத் திற</translation> @@ -6106,7 +6118,6 @@ <translation id="952992212772159698">செயலாக்கப்படவில்லை</translation> <translation id="960719561871045870">ஆபரேட்டர் குறியீடு</translation> <translation id="960987915827980018">1 மணிநேரம் உள்ளது</translation> -<translation id="962778376131245616">பாதுகாப்பற்றவை மட்டும் அனிமேஷனுடன் காட்டு</translation> <translation id="96421021576709873">வைஃபை நெட்வொர்க்</translation> <translation id="965490406356730238">கிடைக்கும் இடங்களில், படமெடுக்கப்பட்ட ஃப்ரேமுக்கு வன்பொருள் விரைவுப்படுத்தப்பட்ட mjpeg குறியிறக்கத்தை இயக்கவும்.</translation> <translation id="968174221497644223">பயன்பாட்டு தற்காலிக சேமிப்பு</translation>
diff --git a/chrome/app/resources/generated_resources_te.xtb b/chrome/app/resources/generated_resources_te.xtb index 16417ee..a990e1b 100644 --- a/chrome/app/resources/generated_resources_te.xtb +++ b/chrome/app/resources/generated_resources_te.xtb
@@ -18,7 +18,6 @@ <translation id="1029317248976101138">జూమ్ చెయ్యి:</translation> <translation id="1029595648591494741">"<ph name="EXTENSION_NAME" />"ను ప్రయత్నించాలా?</translation> <translation id="1031362278801463162">పరిదృశ్యం లోడ్ అవుతోంది</translation> -<translation id="1031460590482534116">క్లయింట్ సర్టిఫికెట్ను నిల్వ చేయడానికి ప్రయత్నిస్తున్న సమయంలో లోపం సంభవించింది. లోపం <ph name="ERROR_NUMBER" /> (<ph name="ERROR_NAME" />).</translation> <translation id="1031573127485938293">అడగాలి (విధానం ద్వారా)</translation> <translation id="103279545524624934">Android అనువర్తనాలను ప్రారంభించడానికి డిస్క్ స్థలాన్ని ఖాళీ చేయండి.</translation> <translation id="1033780634303702874">మీ క్రమానుసార పరికరాలను ప్రాప్యత చేయడం</translation> @@ -101,6 +100,7 @@ <translation id="1128591060186966949">శోధన ఇంజిన్ని సవరించండి</translation> <translation id="1128987120443782698">నిల్వ చేసే పరికరం <ph name="DEVICE_CAPACITY" /> సామర్థ్యాన్ని కలిగి ఉంది. దయచేసి కనీసం 4GB సామర్థ్యంతో ఉన్న SD కార్డ్ లేదా USB మెమరీ స్టిక్ని ఇన్సర్ట్ చెయ్యండి.</translation> <translation id="1137135726305341424">domContentLoaded మరియు అన్ని వనరుల లోడ్లు domContentLoadedకి (ప్రధాన ఫ్రేమ్ మరియు ఒకే మూలంలోని iframes) ముందే ప్రారంభమవుతాయి.</translation> +<translation id="1138663153846032155">Flash కంటే HTMLకి ప్రాధాన్యత</translation> <translation id="1140351953533677694">మీ బ్లూటూత్ మరియు క్రమానుసార పరికరాలను ప్రాప్యత చేయడం</translation> <translation id="114140604515785785">పొడిగింపు మూలం డైరెక్టరీ:</translation> <translation id="1143142264369994168">సర్టిఫికెట్ సంతకందారు</translation> @@ -252,6 +252,7 @@ <translation id="1351692861129622852"><ph name="FILE_COUNT" /> ఫైల్లను దిగుమతి చేస్తోంది...</translation> <translation id="1352103415082130575">థాయ్ కీబోర్డ్ (పటాచోట్)</translation> <translation id="1353686479385938207"><ph name="PROVIDER_NAME" />: <ph name="NETWORK_NAME" /></translation> +<translation id="1353946958707294039">విశిష్ట రూపకల్పన నిల్వ నిర్వాహికి</translation> <translation id="1353966721814789986">స్టార్ట్అప్ పేజీలు</translation> <translation id="1354868058853714482">Adobe Reader గడువు తేదీ ముగిసింది మరియు అసురక్షితమైనది కావచ్చు.</translation> <translation id="1355408554203439639">3D సాఫ్ట్వేర్ రేస్టరైజర్</translation> @@ -423,7 +424,6 @@ <translation id="1533920822694388968">టీవీ సమలేఖనం</translation> <translation id="15373452373711364">పెద్ద మౌస్ కర్సర్</translation> <translation id="1543284117603151572">Edge నుండి దిగుమతి చేసినవి</translation> -<translation id="1544350195767834591">{NUM_COOKIES,plural, =1{ఇతర సైట్ల నుండి 1}other{ఇతర సైట్ల నుండి #}}</translation> <translation id="1545177026077493356">స్వయంచాలక కియోస్క్ మోడ్</translation> <translation id="1545786162090505744">ప్రశ్న యొక్క ప్రదేశంలో %sతో URL</translation> <translation id="1546280085599573572">ఈ పొడిగింపు మీరు హోమ్ బటన్ను క్లిక్ చేసినప్పుడు చూపబడే పేజీని మార్చింది.</translation> @@ -447,7 +447,6 @@ <translation id="1559235587769913376">యునికోడ్ అక్షరాలను ఇన్పుట్ చెయ్యి</translation> <translation id="1561092721008294962">UI వచనం కోసం HarfBuzz</translation> <translation id="1566049601598938765">వెబ్సైట్</translation> -<translation id="1566958206723629112">ఫ్లాష్ మరియు PDF</translation> <translation id="1567723158593978621">ప్రారంభించబడినప్పుడు, బ్రౌజర్కి సైన్ ఇన్ చేస్తే కొత్త gaia పాస్వర్డ్ అననుబంధిత సైన్ ఇన్ విధానం ఉపయోగించబడుతుంది.</translation> <translation id="1567993339577891801">JavaScript కన్సోల్</translation> <translation id="1568323446248056064">ప్రదర్శన పరికరం సెట్టింగ్లను తెరవండి</translation> @@ -576,7 +575,6 @@ <translation id="1723940674997333416">https మూలం నుండి అసురక్షితమైన వెబ్సాకెట్ను అనుమతించండి</translation> <translation id="1725149567830788547">&నియంత్రణలను చూపించు</translation> <translation id="172612876728038702">TPM సెట్ అప్ చెయ్యబడుతోంది. దయచేసి సహనంతో ఉండండి; దీనికి కొన్ని నిమిషాల సమయం పట్టవచ్చు.</translation> -<translation id="1727135806684246609">అత్యంత విశేష భద్రత</translation> <translation id="1729533290416704613">ఇది ఓమ్నిపెట్టె నుండి శోధించేటప్పుడు చూపబడే పేజీని కూడా నియంత్రిస్తుంది.</translation> <translation id="1731346223650886555">సెమీకోలన్</translation> <translation id="1731589410171062430">మొత్తం: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /> (<ph name="NUMBER_OF_PAGES" /> <ph name="PAGE_OR_PAGES_LABEL" />)</translation> @@ -655,7 +653,7 @@ <translation id="1842969606798536927">చెల్లింపు</translation> <translation id="184456654378801210">(స్థానికం)</translation> <translation id="1844692022597038441">ఈ ఫైల్ ఆఫ్లైన్లో అందుబాటులో లేదు.</translation> -<translation id="1846308012215045257"><ph name="PLUGIN_NAME" />ని అముల చేయడానికి కంట్రోల్ నొక్కి, క్లిక్ చేయండి</translation> +<translation id="1846308012215045257"><ph name="PLUGIN_NAME" />ని అమలు చేయడానికి కంట్రోల్ నొక్కి, క్లిక్ చేయండి</translation> <translation id="184633654410729720">థాయ్ కీబోర్డ్ (కెడ్మానీ)</translation> <translation id="1849186935225320012">ఈ పేజీ MIDI పరికరాలకు పూర్తి నియంత్రణను కలిగి ఉంది.</translation> <translation id="1850508293116537636">&సవ్యదిశలో తిప్పు</translation> @@ -872,6 +870,7 @@ <translation id="218492098606937156">స్పర్శ ఈవెంట్లను ప్రారంభించు</translation> <translation id="2187317261103489799">గుర్తించు (డిఫాల్ట్)</translation> <translation id="2187895286714876935">సర్వర్ ప్రమాణపత్రం దిగుమతి లోపం</translation> +<translation id="2188881192257509750"><ph name="APPLICATION" />ని తెరువు</translation> <translation id="2190069059097339078">WiFi క్రెడెన్షియల్స్ గెట్టర్</translation> <translation id="219008588003277019">ప్రాంతీయ క్లయింట్ మాడ్యూల్: <ph name="NEXE_NAME" /></translation> <translation id="2190355936436201913">(ఖాళీ)</translation> @@ -990,6 +989,7 @@ <translation id="2326606747676847821">అజ్ఞాతంలోకి వెళ్లు</translation> <translation id="2326931316514688470">అనువర్తనాన్ని &మళ్లీ లోడ్ చేయి</translation> <translation id="2327492829706409234">అనువర్తనాన్ని ప్రారంభించు</translation> +<translation id="2328054044222305089">ఇది <ph name="SITE" /> మీ పరికరంలో నిల్వ చేసిన ఏ డేటాను అయినా తొలగిస్తుంది మరియు మీరు అమలు చేయడానికి మంజూరు చేసిన ఏవైనా అనుమతులను రీసెట్ చేస్తుంది. మీరు కొనసాగించదలిచారా?</translation> <translation id="2329597144923131178">మీ బుక్మార్క్లు, చరిత్ర, పాస్వర్డ్లు, ఇతర సెట్టింగ్లను మీ అన్ని పరికరాల్లో పొందడానికి సైన్ ఇన్ చేయండి.</translation> <translation id="2332131598580221120">స్టోర్లో వీక్షించండి</translation> <translation id="2332742915001411729">డిఫాల్ట్కు రీసెట్ చేయి</translation> @@ -1265,7 +1265,6 @@ <translation id="2675358154061544447">వేర్వేరు ప్రాసెస్ల్లో క్రాస్-సైట్ iframes అమలు చేయడం కోసం అత్యంత ప్రయోగాత్మక మద్దతు ఇస్తుంది. ఈ మోడ్లో, పత్రాలు ఒకే వెబ్ సైట్ నుండి అందించబడినప్పుడు మాత్రమే రెండెరెర్ ప్రాసెస్ను పంచుకుంటాయి.</translation> <translation id="2676946222714718093">ఇందులో ప్లే అవుతోంది</translation> <translation id="2678063897982469759">మళ్ళీ-ప్రారంభించు</translation> -<translation id="2678246812096664977">అన్ని ప్లగిన్లు</translation> <translation id="2679385451463308372">సిస్టమ్ డైలాగ్ ఉపయోగించి ముద్రించు...</translation> <translation id="2680208403056680091">మీ ఇంటర్నెట్ కనెక్షన్ నియంత్రించబడుతోంది</translation> <translation id="268053382412112343">&చరిత్ర</translation> @@ -1439,7 +1438,6 @@ <translation id="287286579981869940"><ph name="PROVIDER_NAME" />ని జోడించు...</translation> <translation id="2872961005593481000">షట్ డౌన్ చెయ్యండి</translation> <translation id="2875698561019555027">(Chrome లోప పేజీలు)</translation> -<translation id="2879560882721503072"><ph name="ISSUER" /> ద్వారా జారీ చెయ్యబడిన క్లయింట్ ప్రమాణపత్రం విజయవంతంగా నిల్వ చెయ్యబడింది.</translation> <translation id="288024221176729610">చెక్</translation> <translation id="288042212351694283">మీ సార్వత్రిక 2వ కారకం పరికరాలను ప్రాప్యత చేయండి</translation> <translation id="2881966438216424900">చివరగా ప్రాప్తి చేసింది:</translation> @@ -1588,6 +1586,7 @@ <translation id="3057861065630527966">మీ ఫోటోలను మరియు వీడియోలను బ్యాకప్ చేయండి</translation> <translation id="3058212636943679650">మీరు మీ కంప్యూటర్ యొక్క ఆపరేటింగ్ సిస్టమ్ని రీస్టోర్ చెయ్యాలనుకుంటే, మీకు రికవరీ SD కార్డ్ లేదా USB మెమరీ స్టిక్ అవసరం.</translation> <translation id="305932878998873762">HTTP కోసం సరళమైన కాష్ అనేది క్రొత్త కాష్. ఇది డిస్క్ స్థలం కేటాయింపు కోసం ఫైల్సిస్టమ్పై ఆధారపడుతుంది.</translation> +<translation id="3060251871394327123">ఇది <ph name="SITE" /> మీ పరికరంలో నిల్వ చేసిన ఏ డేటాను అయినా తొలగిస్తుంది. మీరు కొనసాగించదలిచారా?</translation> <translation id="3061650404498811439">ఎంచుకున్న IME మెనులో ఎమోజీలు, చేతివ్రాత మరియు వాయిస్ ఇన్పుట్ ప్రాప్యతను అనుమతిస్తుంది.</translation> <translation id="3062606427884046423">Chrome మీడియా నోటిఫికేషన్ల కోసం Android మీడియా శైలి నోటిఫికేషన్లను ఉపయోగిస్తుంది.</translation> <translation id="3063844757726132584">ఈ నిర్వాహక లాంచర్ నుండి మీ అన్ని అనువర్తనాలను ప్రాప్యత చేయండి. గేమ్లను ఆడండి, వీడియో చాట్ చేయండి, సంగీతం వినండి, పత్రాలను సవరించండి లేదా మరిన్ని అనువర్తనాలను పొందండి.</translation> @@ -1637,6 +1636,7 @@ <translation id="3123569374670379335">(పర్యవేక్షించబడింది)</translation> <translation id="3124111068741548686">వినియోగదారు నిర్వహించేవి</translation> <translation id="3126026824346185272">Ctrl</translation> +<translation id="3127156390846601284">దీని వలన చూపబడిన అన్ని సైట్ల కోసం మీ పరికరంలో నిల్వ చేయబడిన ఏ డేటా అయినా తొలగించబడుతుంది. మీరు కొనసాగించదలిచారా?</translation> <translation id="312759608736432009">పరికరం తయారీదారులు:</translation> <translation id="3127919023693423797">ప్రమాణీకరిస్తోంది...</translation> <translation id="3128230619496333808">ట్యాబ్ 6</translation> @@ -1735,7 +1735,6 @@ <translation id="3264544094376351444">Sans-Serif ఫాంట్</translation> <translation id="3264547943200567728">మీ Chromebox నెట్వర్క్ను సెటప్ చేయడంలో విఫలమైంది</translation> <translation id="3265459715026181080">విండో మూసివెయ్యి</translation> -<translation id="3267271790328635957">PDF మాత్రమే</translation> <translation id="3267726687589094446">బహుళ ఫైల్ల స్వయంచాలక డౌన్లోడ్లకు అనుమతిని కొనసాగించు</translation> <translation id="3267998849713137817">సవరించిన సమయం</translation> <translation id="3268451620468152448">ఓపెన్ టాబ్లు</translation> @@ -1981,6 +1980,7 @@ <translation id="3574210789297084292">సైన్ ఇన్ అవ్వండి</translation> <translation id="3574305903863751447"><ph name="CITY" />, <ph name="STATE" /> <ph name="COUNTRY" /></translation> <translation id="357479282490346887">లిథువేనియన్</translation> +<translation id="3575927481544652747">WebMIDI కోసం Windows అమలు సమయ MIDI APIని నిలిపివేస్తుంది, ఇది Windows 10 లేదా తదుపరి దానిలో డిఫాల్ట్గా ప్రారంభించబడి ఉంటుంది.</translation> <translation id="3576324189521867626">విజయవంతంగా ఇన్స్టాల్ చేయబడింది</translation> <translation id="3578331450833904042">డిఫాల్ట్ (అన్నీ వినగలదు)</translation> <translation id="3578594933904494462">ఈ ట్యాబ్ యొక్క కంటెంట్ భాగస్వామ్యం చేయబడుతోంది.</translation> @@ -2034,8 +2034,6 @@ <translation id="3627320433825461852">1 నిమిషం కంటే తక్కువ సమయం మిగిలి ఉంది</translation> <translation id="3627588569887975815">లింక్ను అజ్ఞా&త విండోలో తెరువు</translation> <translation id="3627671146180677314">Netscape సర్టిఫికెట్ పునరుద్ధరణ సమయం</translation> -<translation id="3629326610814700057">స్థానిక నిల్వను నిర్వహించడానికి నిల్వ నిర్వాహికిని ప్రారంభిస్తుంది.</translation> -<translation id="3630337581925712713"><ph name="PERMISSION_TYPE_LABEL" />:</translation> <translation id="3631337165634322335">క్రింద ఉన్న మినహాయింపులు మాత్రమే ప్రస్తుత అజ్ఞాత సెషన్కి వర్తించబడతాయి.</translation> <translation id="3633586230741134985">అనువర్తన లాంచర్ సెట్టింగ్లు</translation> <translation id="3633997706330212530">మీరు ఐచ్ఛికంగా ఈ సేవలను నిలిపివేయవచ్చు.</translation> @@ -2058,7 +2056,8 @@ <translation id="3654045516529121250">మీ ప్రాప్యత సెట్టింగ్లను చదవండి</translation> <translation id="3654092442379740616">సమకాలీకరణ లోపం: <ph name="PRODUCT_NAME" /> గడువు ముగిసింది మరియు నవీకరించాల్సి ఉంది.</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{ఇది ఒక ఫైల్కు శాశ్వత ప్రాప్యతను కలిగి ఉంది.}other{ఇది # ఫైల్లకు శాశ్వత ప్రాప్యతను కలిగి ఉంది.}}</translation> -<translation id="3657468915905674858">PPAPI Win32k లాక్డౌన్ను ప్రారంభించండి.</translation> +<translation id="365793796291733849"><ph name="BEGIN_PARAGRAPH1" />మీరు స్వయంచాలక బ్యాకప్ ఆన్ చేసినప్పుడు, పరికర మరియు అనువర్తన డేటా కాలానుగుణంగా Google డిస్క్లోని ప్రైవేట్ ఫోల్డర్లో సేవ్ చేయబడుతుంది. పరిచయాలు, సందేశాలు మరియు ఫోటోల వంటి సంభావ్య గోప్య డేటాతో సహా అనువర్తనం సేవ్ చేసిన ఎలాంటి డేటా అయినా (డెవలపర్ సెట్టింగ్ల ఆధారంగా) అనువర్తన డేటాగా పరిగణించబడుతుంది.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />బ్యాకప్ డేటా మీ డిస్క్ నిల్వ కోటాలో లెక్కించబడదు. పెద్ద ఫైల్లు లేదా డెవలపర్లు సేవ నుండి మినహాయించాలని ఎంపిక చేసిన ఫైల్లు బ్యాకప్ చేయబడవు.<ph name="END_PARAGRAPH2" /></translation> <translation id="3660234220361471169">అవిశ్వసనీయ</translation> <translation id="3665589677786828986">మీ సెట్టింగ్ల్లో కొన్నింటిని మరో ప్రోగ్రామ్ పాడు చేసినట్లుగా Chrome గుర్తించింది, తర్వాత వాటిని వాటి అసలు డిఫాల్ట్లకు రీసెట్ చేసింది.</translation> <translation id="3665842570601375360">భద్రత:</translation> @@ -2113,6 +2112,7 @@ <translation id="3733127536501031542">దశ-పైకితో SSL సర్వర్</translation> <translation id="3736520371357197498">మీ భద్రతకు వాటిల్లే ఆపదల గురించి మీకు అర్థం అయ్యి ఉంటే, ప్రమాదకరమైన ప్రోగ్రామ్లు తీసివేయబడటానికి ముందే <ph name="BEGIN_LINK" />ఈ అసురక్షితమైన సైట్ను సందర్శించవచ్చు<ph name="END_LINK" />.</translation> <translation id="3738924763801731196"><ph name="OID" />:</translation> +<translation id="3739254215541673094"><ph name="APPLICATION" />ని తెరవాలా?</translation> <translation id="3739798227959604811">పునరావృతం చేయడానికి ముందు జరగాల్సిన జాప్యం:</translation> <translation id="3741158646617793859"><ph name="DEVICE_NAME" /> ఇప్పుడు నిర్వాహక కన్సోల్లో కనిపిస్తుంది</translation> <translation id="3741243925913727067">మీ మీడియా పరికర ఫోటోలు మరియు వీడియోలను Google డిస్క్కి బ్యాకప్ చేయండి.</translation> @@ -2351,7 +2351,6 @@ <translation id="4058793769387728514">పత్రాన్ని ఇప్పుడు తనిఖీ చేయి</translation> <translation id="4059285154003114015">ఫ్రేమ్ను &ముద్రించు...</translation> <translation id="406070391919917862">నేపథ్య అనువర్తనాలు</translation> -<translation id="4061502419206152498">కేవలం అసురక్షిత, యానిమేషన్ యేతరం మాత్రమే చూపు</translation> <translation id="4062251648694601778">మీ <ph name="SHORT_PRODUCT_NAME" /> పరికరాన్ని ఆస్వాదించండి. సందేహాలు ఉన్నాయా? మీరు స్థితి ట్రేలోని "?"ని క్లిక్ చేయడం ద్వారా ఎల్లవేళలా సహాయం పొందవచ్చు.</translation> <translation id="4065876735068446555">మీరు ఉపయోగిస్తున్న నెట్వర్క్ (<ph name="NETWORK_ID" />)కి మీరు దాని లాగిన్ పేజీని సందర్శించడం అవసరం కావచ్చు.</translation> <translation id="4068506536726151626">ఈ పేజీలో మీ స్థానాన్ని ట్రాక్ చేస్తున్న క్రింది సైట్ల ఎలిమెంట్లు ఉన్నాయి:</translation> @@ -2390,7 +2389,6 @@ <translation id="4101878899871018532">పాస్వర్డ్ నిర్వాహికి సమకాలీకరణ కోసం ఉపయోగించే ఆధారం సేవ్ చేయడాన్ని ఆఫర్ చేయదు.</translation> <translation id="410351446219883937">స్వీయ ప్లే</translation> <translation id="4104163789986725820">ఎ&గుమతి...</translation> -<translation id="4105523032910086267">విశిష్ట రూపకల్పనలో భద్రతా విశేషం యానిమేషన్ను మరియు దృశ్యతను సెట్ చేస్తుంది.</translation> <translation id="4105563239298244027">Google డిస్క్తో 1 TB నిల్వని ఉచితంగా పొందండి</translation> <translation id="4109135793348361820">విండోను <ph name="USER_NAME" /> (<ph name="USER_EMAIL" />)కి తరలించండి</translation> <translation id="4110342520124362335"><ph name="DOMAIN" /> నుండి కుక్కీలు నిరోధించబడ్డాయి.</translation> @@ -2441,6 +2439,7 @@ <translation id="418179967336296930">రష్యన్ ఫొనెటిక్ (YaZHert) కీబోర్డ్</translation> <translation id="4181841719683918333">భాషలు</translation> <translation id="4187248015940562149">మీ చుట్టూ ఉన్న బ్లూటూత్ పరికరాలకు కనెక్ట్ చేయడానికి మరియు వాటిని నియంత్రించడానికి వెబ్సైట్లను అనుమతించే వెబ్ బ్లూటూత్ను ప్రారంభిస్తుంది.</translation> +<translation id="4188447344915957833">విశిష్ట రూపకల్పన సెట్టింగ్ల్లో నిల్వ నిర్వాహికిని ప్రారంభిస్తుంది.</translation> <translation id="4189406272289638749"><b><ph name="EXTENSION_NAME" /></b> అనే పొడిగింపు ఈ సెట్టింగ్ను నియంత్రిస్తోంది.</translation> <translation id="4193154014135846272">Google పత్రం</translation> <translation id="4193182321948161343">విశిష్ట రూపకల్పన వినియోగదారు నిర్వాహికిని ప్రారంభించు</translation> @@ -2648,6 +2647,7 @@ <translation id="4508765956121923607">&మూలాన్ని చూడండి</translation> <translation id="4509017836361568632">ఫోటోను విస్మరించు</translation> <translation id="4509345063551561634">స్థానం:</translation> +<translation id="4513946894732546136">అభిప్రాయం</translation> <translation id="4514542542275172126">కొత్త పర్యవేక్షించబడే వినియోగదారుని సెటప్ చేయండి</translation> <translation id="4514914692061505365">అన్ని pexe ఫైల్ల కోసం PNaCl వేగవంతమైన సబ్జీరో అనువాద సాధనాన్ని ఉపయోగించేలా నిర్బంధిస్తుంది.</translation> <translation id="451515744433878153">తీసివేయి</translation> @@ -2746,6 +2746,7 @@ <translation id="4656293982926141856">ఈ కంప్యూటర్</translation> <translation id="4656631038341342120">ఈ పరికరం కోసం VR షెల్ అందుబాటులో ఉంటే ప్రారంభిస్తుంది.</translation> <translation id="4657031070957997341">ఎల్లప్పుడూ <ph name="HOST" />లో ప్లగిన్లను అనుమతించు</translation> +<translation id="466008749075469935">నేపథ్య టైమర్ల CPU వినియోగాన్ని 1%కి పరిమితం చేసే ప్రమేయాన్ని ప్రారంభిస్తుంది.</translation> <translation id="4663254525753315077">సాధ్యమైనప్పుడు, అధిక స్క్రోలింగ్ మూలకం యొక్క స్క్రోలింగ్ కంటెంట్లను వేగవంతమైన స్క్రోలింగ్ కోసం మిశ్రమ లేయర్లో ఉంచుతుంది.</translation> <translation id="4664482161435122549">PKCS #12 ఎగుమతి లోపం</translation> <translation id="4665014895760275686">తయారీదారు</translation> @@ -2814,6 +2815,7 @@ <translation id="4749157430980974800">జార్జియన్ కీబోర్డ్</translation> <translation id="4750394297954878236">సూచనలు</translation> <translation id="475088594373173692">మొదటి వినియోగదారు</translation> +<translation id="4750892496809949692">ప్లగిన్ల జాబితా నుండి Flashని దాచడం ద్వారా HTML కంటెంట్కి ప్రాధాన్యమిస్తుంది.</translation> <translation id="4750917950439032686">మీ సమాచారాన్ని (ఉదాహరణకు, పాస్వర్డ్లు లేదా క్రెడిట్ కార్డ్ నంబర్లు) ఈ సైట్కి పంపినప్పుడు అది ప్రైవేట్గా ఉంచబడుతుంది.</translation> <translation id="4753602155423695878">Android ఫోన్ పేజీ లోడింగ్ పురోగతి పట్టీ యానిమేషన్</translation> <translation id="4755240240651974342">ఫిన్నిష్ కీబోర్డ్</translation> @@ -3088,6 +3090,7 @@ <translation id="5119450342834678097">సెట్టింగ్ల మెనులో టాబ్లెట్ సైట్ను అభ్యర్థించే ఎంపిక</translation> <translation id="5120068803556741301">మూడవ పక్ష ఇన్పుట్ పద్ధతి</translation> <translation id="5120421890733714118">వెబ్సైట్లను గుర్తించడానికి ఈ ప్రమాణపత్రాన్ని విశ్వసించండి.</translation> +<translation id="5120516977819314347">PIN లేదా పాస్వర్డ్ తప్పు.</translation> <translation id="5121130586824819730">మీ హార్డ్ డిస్క్ నిండింది. దయచేసి మరొక స్థానానికి సేవ్ చేయండి లేదా హార్డ్ డిస్క్లో ఎక్కువ ఖాళీ చేయండి.</translation> <translation id="5125751979347152379">చెల్లని URL.</translation> <translation id="5127881134400491887">నెట్వర్క్ కనెక్షన్లను నిర్వహించండి</translation> @@ -3095,6 +3098,7 @@ <translation id="512903556749061217">జోడించబడింది</translation> <translation id="5129301143853688736">ఈ సైట్కి మీ కనెక్షన్ ప్రైవేట్ కాదు. దాడి చేసే వారు <ph name="DOMAIN" /> నుండి మీ సమాచారాన్ని (ఉదాహరణకు, ఫోటోలు, పాస్వర్డ్లు, సందేశాలు మరియు క్రెడిట్ కార్డ్లు) దొంగిలించడానికి ప్రయత్నిస్తుండవచ్చు.</translation> <translation id="5129662217315786329">పోలిష్</translation> +<translation id="5131347545782851480">PDF పత్రాలు</translation> <translation id="5134856901811723984">Chrome OS సిస్టమ్ UIలో విశిష్ట రూపకల్పన</translation> <translation id="5135533361271311778">బుక్మార్క్ అంశాన్ని సృష్టించలేకపోయాము.</translation> <translation id="5136529877787728692">F7</translation> @@ -3263,6 +3267,7 @@ <translation id="5328031682234198929">8</translation> <translation id="5329858601952122676">&తొలగించు</translation> <translation id="5330145655348521461">ఈ ఫైల్లు వేరే డెస్క్టాప్లో తెరవబడ్డాయి. దీన్ని వీక్షించడానికి <ph name="USER_NAME" /> (<ph name="MAIL_ADDRESS" />)కి తరలించండి.</translation> +<translation id="5330512191124428349">సమాచారం పొందండి</translation> <translation id="5332624210073556029">టైమ్ జోన్:</translation> <translation id="5333807720589685258">మీరు సరైన PIN అన్లాక్ కీని నమోదు చేయలేకపోతే, మీ SIM కార్డ్ శాశ్వతంగా నిలిపివేయబడుతుంది.</translation> @@ -3695,7 +3700,6 @@ <translation id="5892507820957994680">అంతర్నిర్మాణ సాఫ్ట్వేర్ రెండరింగ్ జాబితాను భర్తీ చేస్తుంది మరియు మద్దతు ఇవ్వని సిస్టమ్ వద్ద GPU-త్వరణంను అనుమతిస్తుంది.</translation> <translation id="5895138241574237353">మళ్ళీ ప్రారంభించు</translation> <translation id="5895187275912066135">జారీ చేయబడినది</translation> -<translation id="5898154795085152510">సర్వర్ చెల్లని క్లయింట్ సర్టిఫికెట్ను తిరిగి తెచ్చింది. లోపం <ph name="ERROR_NUMBER" /> (<ph name="ERROR_NAME" />).</translation> <translation id="5900302528761731119">Google ప్రొఫైల్ ఫోటో</translation> <translation id="590253956165195626">మీరు చదివే భాషలో లేని పేజీలకు అనువాదాన్ని ఆఫర్ చేయాలి.</translation> <translation id="5904093760909470684">ప్రాక్సీ కాన్ఫిగరేషన్</translation> @@ -3750,6 +3754,8 @@ <translation id="5984222099446776634">ఇటీవల సందర్శించినవి</translation> <translation id="5984814259619230127">Smart Lock తక్కువ శక్తి వినియోగ బ్లూటూత్ శోధన</translation> <translation id="5986245990306121338">ప్రారంభిస్తే, సెట్టింగ్ల్లో 'ట్యాబ్లు మరియు అనువర్తనాలను విలీనం చేయి' ఎంపిక ఆన్ చేసి ఉన్నప్పటికీ ట్యాబ్ స్విచ్చర్ చూపబడుతుంది.</translation> +<translation id="5989712527536636369"><ph name="BEGIN_PARAGRAPH1" />ఇది మీ పరికరం గురించి మరియు మీరు దీన్ని ఉపయోగించే విధానం గురించి, ఉదా., బ్యాటరీ స్థాయి, మీరు అనువర్తనాలు ఎంత తరచుగా ఉపయోగిస్తుంటారు, మీ నెట్వర్క్ కనెక్షన్ల (Wi-Fi మరియు బ్లూటూత్ వంటివి) నాణ్యత మరియు వ్యవధి మరియు ఏవైనా సక్రమంగా పని చేయకుంటే వాటికి సంబంధించి అందించే క్రాష్ నివేదికల వంటి వాటి గురించి తెలిపే సాధారణ సమాచారం. ఆ సమాచారం అందరి కోసం Google ఉత్పత్తులు మరియు సేవలను మెరుగుపరచడానికి ఉపయోగించబడుతుంది. కొంత సమగ్ర సమాచారం Android డెవలపర్ల వంటి భాగస్వాములు వారి అనువర్తనాలు మరియు ఉత్పత్తులను మెరుగుపరచడంలో కూడా వారికి సహాయపడుతుంది.<ph name="END_PARAGRAPH1" /> +<ph name="BEGIN_PARAGRAPH2" />మీరు దీన్ని Android అనువర్తనాల సెట్టింగ్ల్లో ఎప్పుడైనా ఆన్ లేదా ఆఫ్ చేయవచ్చు. దీని వలన సిస్టమ్ నవీకరణలు మరియు భద్రత వంటి ఆవశ్యక సేవలను పొందడానికి అవసరమైన సమాచారాన్ని పంపగల మీ పరికర సామర్థ్యంపై ఎలాంటి ప్రభావం ఉండదు.<ph name="END_PARAGRAPH2" /></translation> <translation id="5990198433782424697">chrome:// URLల్లో పొడిగింపులు</translation> <translation id="5990814808592353318">మాన్యువల్ పాస్వర్డ్ ఉత్పాదన.</translation> <translation id="5991049340509704927">పెద్దదిగా చేయండి</translation> @@ -3763,6 +3769,7 @@ <translation id="6005695835120147974">మీడియా రూటర్</translation> <translation id="6007237601604674381">తరలింపు విఫలమైంది. <ph name="ERROR_MESSAGE" /></translation> <translation id="6008241731410823808">హైపర్లింక్ తనిఖీ పింగ్లను పంపుతుంది.</translation> +<translation id="6011449291337289699">సైట్ డేటాను తీసివేయండి</translation> <translation id="6015796118275082299">సంవత్సరం</translation> <translation id="6016551720757758985">మునుపటి సంస్కరణకు తిరిగి మార్చేలా పవర్వాష్ను నిర్ధారించండి</translation> <translation id="6016809788585079594">చివరిగా ఒకసారి "Ok Google" చెప్పండి</translation> @@ -3952,7 +3959,6 @@ <translation id="6276301056778294989">పరికరం ఒకే కోడ్ను చూపుతోందని నిర్ధారించుకోండి.</translation> <translation id="6277105963844135994">నెట్వర్క్ సమయం ముగిసింది</translation> <translation id="6277518330158259200">స్క్రీన్షాట్ను తీ&యి</translation> -<translation id="6278428485366576908">థీమ్</translation> <translation id="6279183038361895380">మీ కర్సర్ను చూపడానికి |<ph name="ACCELERATOR" />| నొక్కండి</translation> <translation id="6280215091796946657">వేరొక ఖాతాతో సైన్ ఇన్ చేయండి</translation> <translation id="6280912520669706465">ARC</translation> @@ -4204,6 +4210,7 @@ <translation id="6607272825297743757">ఫైల్ సమాచారం</translation> <translation id="6607831829715835317">మరిన్ని సాధనా&లు</translation> <translation id="6608140561353073361">అన్ని కుక్కీలు మరియు సైట్ డేటా...</translation> +<translation id="6610183966322615106">ప్రింటర్ను జోడించడంలో సమస్య ఏర్పడింది</translation> <translation id="6610610633807698299">URLని నమోదు చేయండి...</translation> <translation id="6612358246767739896">రక్షిత కంటెంట్</translation> <translation id="6615455863669487791">నాకు చూపించు</translation> @@ -4267,7 +4274,6 @@ <translation id="6708242697268981054">మూలం:</translation> <translation id="6709357832553498500"><ph name="EXTENSIONNAME" />ని ఉపయోగించి కనెక్ట్ చేయి</translation> <translation id="6710213216561001401">మునుపటి</translation> -<translation id="6712158998835983046">అన్నీ చూపు, యానిమేట్ చేసినవి</translation> <translation id="6718273304615422081">జిప్ చేస్తోంది...</translation> <translation id="671928215901716392">స్క్రీన్ను లాక్ చేయి</translation> <translation id="6721972322305477112">&ఫైల్</translation> @@ -4540,7 +4546,6 @@ <translation id="7088434364990739311">నవీకరణ తనిఖీ ప్రారంభం విఫలమైంది (లోపం కోడ్ <ph name="ERROR" />).</translation> <translation id="708856090370082727">OSK ఓవర్స్క్రోల్ మద్దతును ప్రారంభిస్తుంది. ఈ ఫ్లాగ్ ఆన్లో ఉన్నప్పుడు, OSK దృశ్య వీక్షణ పోర్ట్ పరిమాణాన్ని మాత్రమే మారుస్తుంది.</translation> <translation id="7088674813905715446">ఈ పరికరాన్ని నిర్వాహకులు కేటాయించబడని స్థితిలో ఉంచారు. దీన్ని నమోదు కోసం ప్రారంభించడానికి, దయచేసి మీ నిర్వాహకులు పరికరాన్ని పెండింగ్ స్థితిలో ఉంచేలా చేయండి.</translation> -<translation id="7089609847854449639">నిల్వ నిర్వాహికి</translation> <translation id="708969677220991657">చెల్లని ప్రమాణపత్రం అందించినప్పటికీ localhostకి HTTPS ద్వారా అభ్యర్థనలను అనుమతిస్తుంది.</translation> <translation id="7092106376816104">పాప్-అప్ మినహాయింపులు</translation> <translation id="7093866338626856921">ఈ పేర్లు గల పరికరాలతో డేటాను ఇచ్చిపుచ్చుకోవడానికి అనుమతి: <ph name="HOSTNAMES" /></translation> @@ -4580,7 +4585,7 @@ <translation id="715118844758971915">క్లాసిక్ ప్రింటర్లు</translation> <translation id="7154130902455071009">మీ ప్రారంభ పేజీని దీనికి మార్చండి: <ph name="START_PAGE" /></translation> <translation id="7155171745945906037">కెమెరా లేదా ఫైల్లో ఉన్న ఫోటో</translation> -<translation id="715568033737470079">Win32k లాక్డౌన్ శాండ్బాక్స్ విధానంలో అమలయ్యే PPAPI ప్లగిన్లను పేర్కొంటుంది (Windows 10 మరియు అధిక సంస్కరణలో మాత్రమే).</translation> +<translation id="7155226869555939647">ఎల్లప్పుడూ <ph name="APPLICATION" /> కోసం లింక్లను తెరువు</translation> <translation id="7156235233373189579">ఈ ఫైల్ Windows సాఫ్ట్వేర్ ఉపయోగించే PC కోసం రూపొందించబడింది. ఇది Chrome OSను అమలు చేసే మీ పరికరానికి అనుకూలమైనది కాదు. దయచేసి తగిన ప్రత్యామ్నాయ అనువర్తనం కోసం <ph name="BEGIN_LINK" />Chrome వెబ్ స్టోర్<ph name="END_LINK" />లో శోధించండి.<ph name="BEGIN_LINK_HELP" />మరింత తెలుసుకోండి<ph name="END_LINK_HELP" /></translation> <translation id="7157063064925785854">కొనసాగించు క్లిక్ చేయడం ద్వారా మీరు <ph name="LEGAL_DOC_LINK_TEXT_1" />, <ph name="LEGAL_DOC_LINK_TEXT_2" />, <ph name="LEGAL_DOC_LINK_TEXT_3" /> మరియు <ph name="LEGAL_DOC_LINK_TEXT_4" />కి అంగీకరిస్తారు.</translation> <translation id="7158238151765743968">"<ph name="DEVICE_NAME" />"కు కనెక్షన్ ఇప్పటికీ పురోగతిలో ఉంది.</translation> @@ -4595,6 +4600,7 @@ <translation id="7175353351958621980">దీని నుండి లోడ్ అయ్యింది:</translation> <translation id="7180611975245234373">రీఫ్రెష్ చేయి</translation> <translation id="7180865173735832675">అనుకూలీకరించు</translation> +<translation id="7181387261278441780">సైట్ డేటాను తీసివేసి, రీసెట్ చేయండి</translation> <translation id="7185078796915954712">TLS 1.3</translation> <translation id="7185690883425432021">ట్యాబ్స్ట్రిప్ స్టాక్ చేసిన మోడ్లో ఉన్నప్పుడు నిష్క్రియ ట్యాబ్ల మూసివేత బటన్లను దాస్తుంది.</translation> <translation id="7186088072322679094">సాధనపట్టీలో ఉంచండి</translation> @@ -4627,7 +4633,6 @@ <translation id="7223775956298141902">అయ్యో... మీకు పొడిగింపులు లేవు :-(</translation> <translation id="7224023051066864079">సబ్నెట్ మాస్క్:</translation> <translation id="7225179976675429563">నెట్వర్క్ రకం లేదు</translation> -<translation id="7230191962699768124">అన్నీ చూపు, యానిమేషన్ రహితమైనవి</translation> <translation id="7230787553283372882">మీ వచన పరిమాణాన్ని అనుకూలీకరించండి</translation> <translation id="7231224339346098802">ఎన్ని కాపీలు ముద్రించబడాలో సూచించడానికి సంఖ్యలను ఉపయోగించండి (1 లేదా మరిన్ని).</translation> <translation id="7238585580608191973">SHA-256 వేలిముద్ర</translation> @@ -4759,7 +4764,6 @@ <translation id="7409233648990234464">తిరిగి ప్రారంభించి, పవర్వాష్ చేయి</translation> <translation id="7409836189476010449">Flash అమలు చేయాలనుకుంటోంది</translation> <translation id="7410344089573941623"><ph name="HOST" /> మీ కెమెరా మరియు మైక్రోఫోన్ను ప్రాప్యత చేయాలని అనుకుంటే నాకు తెలియజేయి</translation> -<translation id="7411343637221933631">{NUM_COOKIES,plural, =1{ఈ సైట్ నుండి 1}other{ఈ సైట్ నుండి #}}</translation> <translation id="7412226954991670867">GPU మెమరీ</translation> <translation id="7416362041876611053">తెలియని నెట్వర్క్ లోపం.</translation> <translation id="7417453074306512035">ఇథియోపిక్ కీబోర్డ్</translation> @@ -4881,6 +4885,7 @@ <translation id="756445078718366910">బ్రౌజర్ విండోను తెరువు</translation> <translation id="7564847347806291057">ప్రాసెస్ని ముగించు</translation> <translation id="7566723889363720618">F12</translation> +<translation id="7567314848159753396">కుక్కీ: <ph name="NAME" /></translation> <translation id="756809126120519699">Chrome డేటా తీసివేయబడింది</translation> <translation id="7568790562536448087">నవీకరిస్తోంది</translation> <translation id="7573172247376861652">బ్యాటరీ ఛార్జ్</translation> @@ -4921,6 +4926,7 @@ <translation id="7626009897377900107">పాస్వర్డ్ ఉత్పాదన</translation> <translation id="7627262197844840899">ఈ సైట్ MasterCard కార్డ్ని ఆమోదించదు.</translation> <translation id="7627790789328695202">అయ్యో, <ph name="FILE_NAME" /> ఇప్పటికే ఉంది. దీని పేరు మార్చి, మళ్లీ ప్రయత్నించండి.</translation> +<translation id="7628127343934101653">డిఫాల్ట్ PDF వ్యూయర్ అనువర్తనంలో PDF ఫైల్లను తెరవండి.</translation> <translation id="762917759028004464">ప్రస్తుతం డిఫాల్ట్ బ్రౌజర్ <ph name="BROWSER_NAME" />.</translation> <translation id="7629536005696009600">Android అనువర్తనాల కోసం నిల్వ చేసిన ఆధారాలను సంబంధిత వెబ్సైట్ల్లో పూరించడానికి అనుమతిస్తుంది.</translation> <translation id="7629827748548208700">టాబ్: <ph name="TAB_NAME" /></translation> @@ -5149,6 +5155,7 @@ <translation id="7957513156576779045">జత చేయడాన్ని అనుమతించడానికి బ్లూటూత్ను ఆన్ చేయండి</translation> <translation id="7957615753207896812">కీబోర్డ్ పరికర సెట్టింగ్లను తెరవండి</translation> <translation id="7959074893852789871">ఫైల్ దిగుమతి చెయ్యని కొన్ని బహుళ ప్రమాణపత్రాలను కలిగి ఉంది:</translation> +<translation id="7959700692661109221"><ph name="BEGIN_PARAGRAPH" />Google స్థాన సేవ మీ పరికరం స్థానాన్ని వేగంగా మరియు మరింత ఖచ్చితంగా అంచనా వేయడంలో సహాయపడటానికి Wi-Fi వంటి మూలాధారాలను ఉపయోగిస్తుంది. మీరు Google స్థాన సేవలను ఆన్ చేసినప్పుడు, మీ పరికరం స్థాన సమాచారాన్ని అందించడానికి Wi-Fi ఉపయోగించే మోడ్లోకి ప్రవేశిస్తుంది. మీరు దీన్ని స్థాన సెట్టింగ్ల్లో ఎప్పుడైనా ఆఫ్ చేయవచ్చు.<ph name="END_PARAGRAPH" /></translation> <translation id="7961015016161918242">ఎప్పుడూ లేదు</translation> <translation id="7964089325405904043">పాస్వర్డ్ దిగుమతి మరియు ఎగుమతి</translation> <translation id="7965010376480416255">భాగస్వామ్యం చెయ్యబడిన మెమరీ</translation> @@ -5296,6 +5303,7 @@ <translation id="8146793085009540321">సైన్-ఇన్ విఫలమైంది. దయచేసి మీ నిర్వాహకులను సంప్రదించండి లేదా మళ్లీ ప్రయత్నించండి.</translation> <translation id="8148264977957212129">Pinyin ఇన్పుట్ పద్ధతి</translation> <translation id="8148913456785123871">లాంచర్లో Google Now కార్డ్లను చూపు</translation> +<translation id="8150391391298684512">Windows అమలు సమయ MIDI APIని నిలిపివేయండి</translation> <translation id="8151185429379586178">డెవలపర్ సాధనాలు</translation> <translation id="8151638057146502721">కాన్ఫిగర్ చేయి</translation> <translation id="8151639108075998630">అతిథి బ్రౌజింగ్ని ప్రారంభించు</translation> @@ -5576,6 +5584,7 @@ <translation id="8532294913309524834">భాషలను మీ ప్రాధాన్యత ఆధారంగా క్రమం చేయండి.</translation> <translation id="8535005006684281994">Netscape సర్టిఫికెట్ పునరుద్ధరణ URL</translation> <translation id="8539727552378197395">లేదు (Httpమాత్రమే)</translation> +<translation id="8541084862688000575">Android అనువర్తనాలను స్వయంచాలకంగా లోడ్ చేయండి</translation> <translation id="8543181531796978784">మీరు <ph name="BEGIN_ERROR_LINK" />గుర్తింపు సమస్యను నివేదించవచ్చు<ph name="END_ERROR_LINK" /> లేదా మీకు మీ భద్రతకు పొంచి ఉన్న ప్రమాదాలు అర్థం అయ్యి ఉంటే, <ph name="BEGIN_LINK" />ఈ అసురక్షిత సైట్ను సందర్శించండి<ph name="END_LINK" />.</translation> <translation id="8545107379349809705">సమాచారాన్ని దాచు...</translation> <translation id="8545211332741562162">ప్రయోగాత్మక JavaScript లక్షణాలను ఉపయోగించడానికి వెబ్ పేజీలను అనుమతించు.</translation> @@ -5603,7 +5612,6 @@ <translation id="8569764466147087991">తెరవడానికి ఫైల్ని ఎంచుకోండి</translation> <translation id="8571032220281885258">మీరు "Ok Google" అని చెప్పేటప్పుడు, Chrome మీరు తర్వాత చెప్పే అంశం కోసం శోధిస్తుంది.</translation> <translation id="8571108619753148184">సర్వర్ 4</translation> -<translation id="8572832761467613633">ఫ్లాష్ మాత్రమే</translation> <translation id="8572981282494768930">మీ కెమెరా మరియు మైక్రోఫోన్ను ప్రాప్యత చేయడానికి సైట్లను అనుమతించవద్దు</translation> <translation id="8574234089711453001">మీడియా url గల పేజీని తెరుస్తున్నప్పుడు డౌన్లోడ్ బటన్ చూపబడేలా అనుమతిస్తుంది.</translation> <translation id="857779305329188634">ప్రయోగాత్మక QUIC ప్రోటోకాల్ మద్దతును ప్రారంభించండి.</translation> @@ -5625,6 +5633,7 @@ <translation id="8600929685092827187">ప్యాకెట్లను స్వీకరించినప్పుడు సక్రియం చేయడం</translation> <translation id="8601206103050338563">TLS WWW క్లయింట్ ప్రామాణీకరణ</translation> <translation id="8602851771975208551">మీ కంప్యూటర్లోని మరో ప్రోగ్రామ్ జోడించిన అనువర్తనం కారణంగా Chrome పని చేసే విధానం మారవచ్చు.</translation> +<translation id="8603912787021349466">Android అనువర్తనాలు సైన్ ఇన్ చేసిన తర్వాత స్వయంచాలకంగా ప్రారంభమయ్యేలా అనుమతిస్తుంది.</translation> <translation id="8605428685123651449">SQLite మెమరీ</translation> <translation id="8605503133013456784">"<ph name="DEVICE_NAME" />" నుండి డిస్కనెక్ట్ చేయడం మరియు జతని తీసివేయడం విఫలమైంది.</translation> <translation id="8606726445206553943">మీ MIDI పరికరాలను ఉపయోగించాలనుకుంటోంది</translation> @@ -5977,6 +5986,7 @@ <translation id="9053965862400494292">సమకాలీకరణను సెటప్ చేయడానికి ప్రయత్నించేటప్పుడు ఒక లోపం ఏర్పడింది.</translation> <translation id="9056034633062863292">Chromeboxను నవీకరించడం</translation> <translation id="9056810968620647706">పోలికలు ఏవీ దొరకలేదు.</translation> +<translation id="9057119625587205566">సమీపంలో ప్రింటర్లు ఏవీ లేవు</translation> <translation id="9059868303873565140">స్థితి మెను</translation> <translation id="9064142312330104323">Google ప్రొఫైల్ ఫోటో (లోడ్ అవుతోంది)</translation> <translation id="9064275926664971810">ఫారమ్లను ఒకే క్లిక్లో నింపడానికి స్వీయపూరణను ప్రారంభిస్తుంది</translation> @@ -5987,6 +5997,7 @@ <translation id="9067401056540256169">ఈ ఫ్లాగ్ Chromeని అసురక్షితంగా చేస్తుంది. ఇది ఏమి చేస్తుందో అర్థం చేసుకున్న తర్వాత మాత్రమే దీన్ని ఉపయోగించండి. ఈ ఫ్లాగ్ ఎటువంటి నోటీసు లేకుండానే తీసివేయబడవచ్చని గుర్తుంచుకోండి. ప్రారంభించబడితే, https మూలం గల ఫ్రేమ్లు అసురక్షిత URL (ws://) గల వెబ్సాకెట్లను ఉపయోగించవచ్చు.</translation> <translation id="9068931793451030927">మార్గం:</translation> <translation id="9070219033670098627">వ్యక్తిని మార్చు</translation> +<translation id="9070940116164932228">వ్యయభరిత నేపథ్య టైమర్లను నిర్బంధించండి</translation> <translation id="907148966137935206">పాప్-అప్లను చూపించడానికి ఏ సైట్నూ అనుమతించవద్దు (సిఫార్సు చేయబడింది)</translation> <translation id="9072550133391925347"><ph name="PASSWORD_MANAGER_BRAND" /> మీరు సేవ్ చేసిన పాస్వర్డ్లతో అర్హత ఉన్న సైట్లు మరియు అనువర్తనాలకు మిమ్మల్ని స్వయంచాలకంగా సైన్ ఇన్ చేస్తుంది.</translation> <translation id="9073281213608662541">PAP</translation> @@ -6020,6 +6031,7 @@ <translation id="9112614144067920641">దయచేసి ఒక క్రొత్త పిన్ ఎంచుకోండి.</translation> <translation id="9112748030372401671">మీ వాల్పేపర్ను మార్చండి</translation> <translation id="9112987648460918699">కనుగొను...</translation> +<translation id="9114663181201435112">సులభంగా సైన్ ఇన్ చేయండి</translation> <translation id="9115487443206954631">Cast పరికరాలను నిర్వహించండి</translation> <translation id="9115675100829699941">&బుక్మార్క్లు</translation> <translation id="9121814364785106365">పిన్ చేసిన టాబ్ వలె తెరువు</translation> @@ -6114,7 +6126,6 @@ <translation id="952992212772159698">సక్రియం చెయ్యబడలేదు</translation> <translation id="960719561871045870">ఆపరేటర్ కోడ్</translation> <translation id="960987915827980018">సుమారు 1 గంట మిగిలి ఉంది</translation> -<translation id="962778376131245616">కేవలం భద్రతాయేతరమైన, యానిమేషన్ గలవి మాత్రమే చూపు</translation> <translation id="96421021576709873">Wi-Fi నెట్వర్క్</translation> <translation id="965490406356730238">క్యాప్చర్ చేసిన ఫ్రేమ్ కోసం అందుబాటులో ఉన్నప్పుడు హార్డ్వేర్ వేగవంతం చేసే mjpeg డీకోడ్ను ప్రారంభిస్తుంది.</translation> <translation id="968174221497644223">అనువర్తన కాష్</translation>
diff --git a/chrome/app/resources/generated_resources_th.xtb b/chrome/app/resources/generated_resources_th.xtb index 12723d35..9f08e2e 100644 --- a/chrome/app/resources/generated_resources_th.xtb +++ b/chrome/app/resources/generated_resources_th.xtb
@@ -18,7 +18,6 @@ <translation id="1029317248976101138">ซูม</translation> <translation id="1029595648591494741">ลองใช้ "<ph name="EXTENSION_NAME" />" ดูไหม</translation> <translation id="1031362278801463162">กำลังโหลดหน้าตัวอย่าง</translation> -<translation id="1031460590482534116">พบข้อผิดพลาดขณะพยายามจัดเก็บใบรับรองไคลเอ็นต์ ข้อผิดพลาด <ph name="ERROR_NUMBER" /> (<ph name="ERROR_NAME" />)</translation> <translation id="1031573127485938293">ขอ (โดยนโยบาย)</translation> <translation id="103279545524624934">เพิ่มพื้นที่ว่างในดิสก์เพื่อเปิดแอป Android</translation> <translation id="1033780634303702874">เข้าถึงอุปกรณ์ซีเรียล</translation> @@ -101,6 +100,7 @@ <translation id="1128591060186966949">แก้ไขเครื่องมือค้นหา</translation> <translation id="1128987120443782698">อุปกรณ์จัดเก็บข้อมูลมีความจุ <ph name="DEVICE_CAPACITY" /> โปรดเสียบการ์ด SD หรืออุปกรณ์หน่วยความจำ USB ที่มีความจุอย่างน้อย 4 GB</translation> <translation id="1137135726305341424">domContentLoaded และ domContentLoaded (เฟรมหลักและ iframes จากที่เดียวกัน)</translation> +<translation id="1138663153846032155">เลือก HTML แทน Flash</translation> <translation id="1140351953533677694">เข้าถึงอุปกรณ์บลูทูธและอุปกรณ์ซีเรียล</translation> <translation id="114140604515785785">ไดเรกทอรีหลักของส่วนขยาย:</translation> <translation id="1143142264369994168">ผู้เซ็นชื่อในใบรับรอง</translation> @@ -252,6 +252,7 @@ <translation id="1351692861129622852">กำลังนำเข้า <ph name="FILE_COUNT" /> ไฟล์...</translation> <translation id="1352103415082130575">แป้นพิมพ์ภาษาไทย (ปัตตะโชติ)</translation> <translation id="1353686479385938207"><ph name="PROVIDER_NAME" />: <ph name="NETWORK_NAME" /></translation> +<translation id="1353946958707294039">ตัวจัดการพื้นที่เก็บข้อมูลในดีไซน์ Material</translation> <translation id="1353966721814789986">หน้าเริ่มต้นใช้งาน</translation> <translation id="1354868058853714482">Adobe Reader ไม่ได้รับการอัปเดตและอาจไม่ปลอดภัย</translation> <translation id="1355408554203439639">โปรแกรมแรสเตอร์ซอฟต์แวร์ 3 มิติ</translation> @@ -423,7 +424,6 @@ <translation id="1533920822694388968">การจัดแนวทีวี</translation> <translation id="15373452373711364">เคอร์เซอร์เมาส์ขนาดใหญ่</translation> <translation id="1543284117603151572">นำเข้าจาก Edge</translation> -<translation id="1544350195767834591">{NUM_COOKIES,plural, =1{1 รายการจากเว็บไซต์อื่นๆ}other{# รายการจากเว็บไซต์อื่นๆ}}</translation> <translation id="1545177026077493356">โหมดคีออสก์อัตโนมัติ</translation> <translation id="1545786162090505744">URL ที่มี %s ในตำแหน่งข้อความค้นหา</translation> <translation id="1546280085599573572">ส่วนขยายนี้ได้เปลี่ยนหน้าที่จะแสดงเมื่อคุณคลิกปุ่มหน้าแรก</translation> @@ -447,7 +447,6 @@ <translation id="1559235587769913376">ป้อนอักขระ Unicode</translation> <translation id="1561092721008294962">HarfBuzz สำหรับข้อความ UI</translation> <translation id="1566049601598938765">เว็บไซต์</translation> -<translation id="1566958206723629112">Flash และ PDF</translation> <translation id="1567723158593978621">เมื่อเปิดใช้แล้ว การลงชื่อเข้าใช้เบราว์เซอร์จะใช้ขั้นตอนการลงชื่อเข้าใช้แบบใหม่ที่แยกรหัสผ่านของ GAIA</translation> <translation id="1567993339577891801">คอนโซล JavaScript</translation> <translation id="1568323446248056064">เปิดการตั้งค่าอุปกรณ์แสดงผล</translation> @@ -576,7 +575,6 @@ <translation id="1723940674997333416">อนุญาต WebSocket ที่ไม่ปลอดภัยจากต้นกำเนิดของ HTTPS</translation> <translation id="1725149567830788547">แสดง&การควบคุม</translation> <translation id="172612876728038702">กำลังตั้งค่า TPM โปรดรอสักครู่ ขั้นตอนนี้อาจใช้เวลา 2-3 นาที</translation> -<translation id="1727135806684246609">รายละเอียดความปลอดภัยแบบ Material</translation> <translation id="1729533290416704613">อีกทั้งยังควบคุมหน้าที่จะแสดงเมื่อคุณทำการค้นหาจากแถบอเนกประสงค์ด้วย</translation> <translation id="1731346223650886555">อัฒภาค</translation> <translation id="1731589410171062430">รวม: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /> หน้า (<ph name="NUMBER_OF_PAGES" /> <ph name="PAGE_OR_PAGES_LABEL" />)</translation> @@ -872,6 +870,7 @@ <translation id="218492098606937156">เปิดใช้งานกิจกรรมการสัมผัส</translation> <translation id="2187317261103489799">ตรวจหา (ค่าเริ่มต้น)</translation> <translation id="2187895286714876935">ข้อผิดพลาดในการนำเข้าใบรับรองเซิร์ฟเวอร์</translation> +<translation id="2188881192257509750">เปิด <ph name="APPLICATION" /></translation> <translation id="2190069059097339078">ตัวรับข้อมูลรับรอง Wi-Fi</translation> <translation id="219008588003277019">โมดูล Native Client: <ph name="NEXE_NAME" /></translation> <translation id="2190355936436201913">(ว่างเปล่า)</translation> @@ -990,6 +989,7 @@ <translation id="2326606747676847821">เข้าโหมดไม่ระบุตัวตน</translation> <translation id="2326931316514688470">โ&หลดแอปซ้ำ</translation> <translation id="2327492829706409234">เปิดใช้งานแอปพลิเคชัน</translation> +<translation id="2328054044222305089">การดำเนินการนี้จะลบข้อมูลที่ <ph name="SITE" /> เก็บไว้ในอุปกรณ์ และรีเซ็ตสิทธิ์ต่างๆ ที่คุณอนุญาตให้เรียกใช้ คุณต้องการดำเนินการต่อไหม</translation> <translation id="2329597144923131178">ลงชื่อเข้าใช้เพื่อรับบุ๊กมาร์ก ประวัติ รหัสผ่าน และการตั้งค่าอื่นๆ ในอุปกรณ์ทั้งหมด</translation> <translation id="2332131598580221120">ดูในสโตร์</translation> <translation id="2332742915001411729">รีเซ็ตเป็นค่าเริ่มต้น</translation> @@ -1265,7 +1265,6 @@ <translation id="2675358154061544447">การสนับสนุนเชิงทดสอบขั้นสูงสำหรับการแสดงผล iframe แบบข้ามเว็บไซต์ในขั้นตอนที่แยกต่างหาก ในโหมดนี้ เอกสารต่างๆ จะแชร์กระบวนการของโหมดแสดงภาพก็ต่อเมื่อเอกสารเหล่านั้นมาจากเว็บไซต์เดียวกัน</translation> <translation id="2676946222714718093">กำลังเล่นบน</translation> <translation id="2678063897982469759">เปิดการใช้งานอีกครั้ง</translation> -<translation id="2678246812096664977">ปลั๊กอินทั้งหมด</translation> <translation id="2679385451463308372">พิมพ์โดยใช้หน้าต่างระบบ…</translation> <translation id="2680208403056680091">กำลังมีการควบคุมการเชื่อมต่ออินเทอร์เน็ตของคุณ</translation> <translation id="268053382412112343">ประวั&ติ</translation> @@ -1439,7 +1438,6 @@ <translation id="287286579981869940">เพิ่ม <ph name="PROVIDER_NAME" />...</translation> <translation id="2872961005593481000">ปิด</translation> <translation id="2875698561019555027">(หน้าข้อผิดพลาดของ Chrome)</translation> -<translation id="2879560882721503072">จัดเก็บใบรับรองไคลเอ็นต์ที่ออกให้โดย <ph name="ISSUER" /> เรียบร้อยแล้ว</translation> <translation id="288024221176729610">เช็ก</translation> <translation id="288042212351694283">เข้าถึงอุปกรณ์ Universal 2nd Factor</translation> <translation id="2881966438216424900">เข้าถึงครั้งสุดท้ายเมื่อ:</translation> @@ -1588,6 +1586,7 @@ <translation id="3057861065630527966">สำรองรูปภาพและวิดีโอ</translation> <translation id="3058212636943679650">หากคุณจำเป็นต้องกู้คืนระบบปฏิบัติการของเครื่องคอมพิวเตอร์ คุณจะต้องมีการ์ด SD หรืออุปกรณ์หน่วยความจำ USB สำหรับการกู้คืน</translation> <translation id="305932878998873762">แคชพื้นฐานสำหรับ HTTP เป็นแคชใหม่ ซึ่งขึ้นอยู่กับระบบไฟล์สำหรับการจัดสรรเนื้อที่ในดิสก์</translation> +<translation id="3060251871394327123">การดำเนินการนี้จะลบข้อมูลที่ <ph name="SITE" /> เก็บไว้ในอุปกรณ์ คุณต้องการดำเนินการต่อไหม</translation> <translation id="3061650404498811439">เปิดใช้การเข้าถึงอีโมจิ ลายมือ และการป้อนข้อมูลด้วยเสียงจากการเลือกใช้เมนู IME</translation> <translation id="3062606427884046423">ใช้การแจ้งเตือน Android MediaStyle สำหรับการแจ้งเตือนสื่อของ Chrome</translation> <translation id="3063844757726132584">เข้าถึงทุกแอปของคุณจากตัวเรียกใช้งานที่ใช้ง่ายนี้ เล่นเกม วิดีโอแชท ฟังเพลง แก้ไขเอกสาร หรือรับแอปเพิ่ม</translation> @@ -1637,6 +1636,7 @@ <translation id="3123569374670379335">(อยู่ภายใต้การดูแล)</translation> <translation id="3124111068741548686">ผู้ใช้จัดการ</translation> <translation id="3126026824346185272">Ctrl</translation> +<translation id="3127156390846601284">การดำเนินการนี้จะลบข้อมูลของเว็บไซต์ทั้งหมดที่แสดงซึ่งเก็บไว้ในอุปกรณ์ คุณต้องการดำเนินการต่อไหม</translation> <translation id="312759608736432009">ผู้ผลิตอุปกรณ์:</translation> <translation id="3127919023693423797">กำลังตรวจสอบสิทธิ์...</translation> <translation id="3128230619496333808">แท็บ 6</translation> @@ -1735,7 +1735,6 @@ <translation id="3264544094376351444">แบบอักษร Sans-Serif</translation> <translation id="3264547943200567728">ไม่สามารถตั้งค่าเครือข่าย Chromebox ของคุณได้</translation> <translation id="3265459715026181080">ปิดหน้าต่าง</translation> -<translation id="3267271790328635957">PDF เท่านั้น</translation> <translation id="3267726687589094446">อนุญาตการดาวน์โหลดไฟล์หลายๆ ไฟล์โดยอัตโนมัติต่อไป</translation> <translation id="3267998849713137817">เวลาที่แก้ไข</translation> <translation id="3268451620468152448">แท็บที่เปิดอยู่</translation> @@ -1981,6 +1980,7 @@ <translation id="3574210789297084292">ลงชื่อเข้าใช้</translation> <translation id="3574305903863751447"><ph name="CITY" />, <ph name="STATE" /> <ph name="COUNTRY" /></translation> <translation id="357479282490346887">ลิทัวเนีย</translation> +<translation id="3575927481544652747">ปิดใช้ Windows Runtime MIDI API สำหรับ WebMIDI ซึ่งจะเปิดใช้อยู่โดยค่าเริ่มต้นใน Windows 10 ขึ้นไป</translation> <translation id="3576324189521867626">ติดตั้งเรียบร้อยแล้ว</translation> <translation id="3578331450833904042">ค่าเริ่มต้น (เลือกทั้งหมด)</translation> <translation id="3578594933904494462">เนื้อหาของแท็บนี้กำลังถูกแชร์</translation> @@ -2034,8 +2034,6 @@ <translation id="3627320433825461852">เหลือเวลาน้อยกว่า 1 นาที</translation> <translation id="3627588569887975815">เปิดลิงก์ในหน้าต่าง&ที่ไม่เก็บในประวัติ</translation> <translation id="3627671146180677314">เวลาการต่ออายุใบรับรองของ Netscape</translation> -<translation id="3629326610814700057">เปิดใช้ตัวจัดการพื้นที่เก็บข้อมูลเพื่อจัดการพื้นที่เก็บข้อมูลภายในเครื่อง</translation> -<translation id="3630337581925712713"><ph name="PERMISSION_TYPE_LABEL" />:</translation> <translation id="3631337165634322335">ข้อยกเว้นด้านล่างนี้ใช้ได้เฉพาะกับเซสชันไม่ระบุตัวตนในปัจจุบันเท่านั้น</translation> <translation id="3633586230741134985">การตั้งค่าตัวเรียกใช้งานแอป</translation> <translation id="3633997706330212530">คุณสามารถเลือกปิดใช้งานบริการเหล่านี้ได้</translation> @@ -2058,7 +2056,8 @@ <translation id="3654045516529121250">อ่านการตั้งค่าการเข้าถึง</translation> <translation id="3654092442379740616">การซิงค์มีข้อผิดพลาด: <ph name="PRODUCT_NAME" /> เก่าเกินไปและต้องมีการอัปเดต</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{แอปมีการเข้าถึงอย่างถาวรไปยัง 1 ไฟล์}other{แอปมีการเข้าถึงอย่างถาวรไปยัง # ไฟล์}}</translation> -<translation id="3657468915905674858">เปิดใช้ PPAPI Win32k Lockdown</translation> +<translation id="365793796291733849"><ph name="BEGIN_PARAGRAPH1" />เมื่อเปิดการสำรองข้อมูลอัตโนมัติ ระบบจะบันทึกข้อมูลอุปกรณ์และข้อมูลแอปไปยังโฟลเดอร์ส่วนตัวใน Google ไดรฟ์เป็นระยะๆ ข้อมูลแอปอาจเป็นข้อมูลอะไรก็ตามที่แอปบันทึกไว้ (ขึ้นอยู่กับการตั้งค่าของนักพัฒนาซอฟต์แวร์) ซึ่งรวมถึงข้อมูลที่อาจละเอียดอ่อน เช่น รายชื่อผู้ติดต่อ ข้อความ และรูปภาพ<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />ข้อมูลสำรองจะไม่นับรวมในโควต้าพื้นที่เก็บข้อมูลไดรฟ์ ไฟล์ขนาดใหญ่หรือไฟล์ที่นักพัฒนาซอฟต์แวร์เลือกไม่รวมไว้ในบริการจะไม่มีการสำรองไว้<ph name="END_PARAGRAPH2" /></translation> <translation id="3660234220361471169">ไม่น่าเชื่อถือ</translation> <translation id="3665589677786828986">Chrome ตรวจพบว่าการตั้งค่าของคุณบางส่วนได้รับความเสียหายจากโปรแกรมอื่น และรีเซ็ตการตั้งค่าเป็นค่าเริ่มต้นเดิม</translation> <translation id="3665842570601375360">ความปลอดภัย:</translation> @@ -2113,6 +2112,7 @@ <translation id="3733127536501031542">เซิร์ฟเวอร์ SSL ที่มีการยกระดับความปลอดภัย</translation> <translation id="3736520371357197498">หากคุณเข้าใจความเสี่ยงต่อความปลอดภัย คุณสามารถ<ph name="BEGIN_LINK" />ไปยังไซต์ที่ไม่ปลอดภัยนี้<ph name="END_LINK" /> ก่อนจะมีการนำโปรแกรมอันตรายออก</translation> <translation id="3738924763801731196"><ph name="OID" />:</translation> +<translation id="3739254215541673094">เปิด <ph name="APPLICATION" /> ไหม</translation> <translation id="3739798227959604811">ยืดเวลาออกไปก่อนทำซ้ำ:</translation> <translation id="3741158646617793859">ตอนนี้ <ph name="DEVICE_NAME" /> จะปรากฏในคอนโซลผู้ดูแลระบบ</translation> <translation id="3741243925913727067">สำรองรูปภาพและวิดีโอของอุปกรณ์สื่อไปยัง Google ไดรฟ์</translation> @@ -2351,7 +2351,6 @@ <translation id="4058793769387728514">ตรวจสอบเอกสารทันที</translation> <translation id="4059285154003114015">&พิมพ์เฟรม...</translation> <translation id="406070391919917862">แอปพลิเคชันพื้นหลัง</translation> -<translation id="4061502419206152498">แสดงเฉพาะรายการที่ไม่ปลอดภัย ไม่ใช่ภาพเคลื่อนไหว</translation> <translation id="4062251648694601778">สนุกกับอุปกรณ์ <ph name="SHORT_PRODUCT_NAME" /> ของคุณ หากมีคำถาม คุณสามารถขอความช่วยเหลือได้เสมอด้วยการคลิก "?" ในถาดสถานะ</translation> <translation id="4065876735068446555">เครือข่ายที่คุณใช้ (<ph name="NETWORK_ID" />) อาจต้องการให้คุณไปที่หน้าการเข้าสู่ระบบของตน</translation> <translation id="4068506536726151626">หน้าเว็บนี้มีองค์ประกอบจากไซต์ต่อไปนี้ ซึ่งกำลังติดตามตำแหน่งของคุณ:</translation> @@ -2390,7 +2389,6 @@ <translation id="4101878899871018532">ตัวจัดการรหัสผ่านจะไม่เสนอการบันทึกข้อมูลรับรองที่ใช้ในการซิงค์</translation> <translation id="410351446219883937">เล่นอัตโนมัติ</translation> <translation id="4104163789986725820">ส่ง&ออก</translation> -<translation id="4105523032910086267">ตั้งค่าภาพเคลื่อนไหวและการเปิดเผยรายละเอียดความปลอดภัยในดีไซน์ Material</translation> <translation id="4105563239298244027">รับ 1 TB ฟรีๆ ด้วย Google ไดรฟ์</translation> <translation id="4109135793348361820">ย้ายหน้าต่างไปยัง <ph name="USER_NAME" /> (<ph name="USER_EMAIL" />)</translation> <translation id="4110342520124362335">ปิดกั้นคุกกี้จาก <ph name="DOMAIN" /></translation> @@ -2441,6 +2439,7 @@ <translation id="418179967336296930">แป้นพิมพ์การถ่ายเสียงภาษารัสเซีย (YaZHert)</translation> <translation id="4181841719683918333">ภาษา</translation> <translation id="4187248015940562149">เปิดใช้เว็บบลูทูธซึ่งช่วยให้เว็บไซต์เชื่อมต่อและควบคุมอุปกรณ์บลูทูธรอบตัวคุณได้</translation> +<translation id="4188447344915957833">เปิดใช้ตัวจัดการพื้นที่เก็บข้อมูลในการตั้งค่าดีไซน์ Material</translation> <translation id="4189406272289638749">ส่วนขยาย <b><ph name="EXTENSION_NAME" /></b> กำลังควบคุมการตั้งค่านี้</translation> <translation id="4193154014135846272">เอกสารของ Google</translation> <translation id="4193182321948161343">เปิดใช้การจัดการผู้ใช้ในดีไซน์ Material</translation> @@ -2648,6 +2647,7 @@ <translation id="4508765956121923607">ดู&ต้นฉบับ</translation> <translation id="4509017836361568632">ยกเลิกรูปภาพ</translation> <translation id="4509345063551561634">ตำแหน่ง:</translation> +<translation id="4513946894732546136">ความคิดเห็น</translation> <translation id="4514542542275172126">ตั้งค่าผู้ใช้ภายใต้การดูแลใหม่</translation> <translation id="4514914692061505365">บังคับให้ใช้เครื่องมือแปลด่วน Subzero ของ PNaCl สำหรับไฟล์ pexe ทั้งหมด</translation> <translation id="451515744433878153">นำออก</translation> @@ -2746,6 +2746,7 @@ <translation id="4656293982926141856">คอมพิวเตอร์เครื่องนี้</translation> <translation id="4656631038341342120">เปิดใช้ VR shell หากพร้อมใช้งานสำหรับอุปกรณ์นี้</translation> <translation id="4657031070957997341">อนุญาตปลั๊กอินบน <ph name="HOST" /> เสมอ</translation> +<translation id="466008749075469935">เปิดใช้การแทรกแซงเพื่อจำกัดการใช้งานเครื่องควบคุมเวลาในพื้นหลังของ CPU เป็น 1%</translation> <translation id="4663254525753315077">เมื่อเป็นไปได้ ใส่เนื้อหาที่เลื่อนได้ของเอลิเมนต์ที่เลื่อนได้เพิ่มเติมลงในเลเยอร์แบบผสมสำหรับการเลื่อนที่เร็วขึ้น</translation> <translation id="4664482161435122549">ข้อผิดพลาดในการส่งออก PKCS #12</translation> <translation id="4665014895760275686">ผู้ผลิต</translation> @@ -2814,6 +2815,7 @@ <translation id="4749157430980974800">แป้นพิมพ์จอร์เจีย</translation> <translation id="4750394297954878236">คำแนะนำ</translation> <translation id="475088594373173692">ผู้ใช้แรก</translation> +<translation id="4750892496809949692">เลือกเนื้อหา HTML โดยซ่อน Flash จากรายการปลั๊กอิน</translation> <translation id="4750917950439032686">ข้อมูลของคุณ (ตัวอย่างเช่น รหัสผ่านหรือหมายเลขบัตรเครดิต) จะเป็นส่วนตัวเมื่อส่งมายังเว็บไซต์นี้</translation> <translation id="4753602155423695878">ภาพเคลื่อนไหวในแถบความคืบหน้าการโหลดหน้าเว็บของโทรศัพท์ Android</translation> <translation id="4755240240651974342">แป้นพิมพ์ภาษาฟินแลนด์</translation> @@ -3088,6 +3090,7 @@ <translation id="5119450342834678097">ตัวเลือกการขอเว็บไซต์สำหรับแท็บเล็ตในเมนูการตั้งค่า</translation> <translation id="5120068803556741301">วิธีป้อนข้อมูลของบุคคลที่สาม</translation> <translation id="5120421890733714118">เชื่อถือใบรับรองนี้ในการระบุเว็บไซต์</translation> +<translation id="5120516977819314347">PIN หรือรหัสผ่านไม่ถูกต้อง</translation> <translation id="5121130586824819730">ฮาร์ดดิสก์ของคุณเต็ม โปรดบันทึกลงในตำแหน่งอื่นหรือเพิ่มเนื้อที่ว่างในฮาร์ดดิสก์</translation> <translation id="5125751979347152379">URL ไม่ถูกต้อง</translation> <translation id="5127881134400491887">จัดการการเชื่อมต่อเครือข่าย</translation> @@ -3095,6 +3098,7 @@ <translation id="512903556749061217">ที่แนบมา</translation> <translation id="5129301143853688736">การเชื่อมต่อเว็บไซต์นี้ไม่เป็นส่วนตัว ผู้บุกรุกอาจพยายามขโมยข้อมูลของคุณ (เช่น รูปภาพ รหัสผ่าน ข้อความ และบัตรเครดิต) จาก <ph name="DOMAIN" /></translation> <translation id="5129662217315786329">โปแลนด์</translation> +<translation id="5131347545782851480">เอกสาร PDF</translation> <translation id="5134856901811723984">ดีไซน์ Material ใน UI ระบบ Chrome OS</translation> <translation id="5135533361271311778">ไม่สามารถสร้างรายการบุ๊กมาร์ก</translation> <translation id="5136529877787728692">F7</translation> @@ -3263,6 +3267,7 @@ <translation id="5328031682234198929">8</translation> <translation id="5329858601952122676">&ลบ</translation> <translation id="5330145655348521461">ไฟล์เหล่านี้เปิดอยู่บนเดสก์ท็อปเครื่องอื่น โปรดย้ายมายัง <ph name="USER_NAME" /> (<ph name="MAIL_ADDRESS" />) เพื่อดู</translation> +<translation id="5330512191124428349">รับข้อมูล</translation> <translation id="5332624210073556029">โซนเวลา:</translation> <translation id="5333807720589685258">ระบบจะปิดใช้ซิมการ์ดของคุณโดยถาวรหากคุณไม่สามารถป้อน คีย์ปลดล็อก PIN ที่ถูกต้อง</translation> @@ -3695,7 +3700,6 @@ <translation id="5892507820957994680">แทนที่รายการการแสดงผลของซอฟต์แวร์ภายในและเปิดใช้งานการเร่งสปีดของ GPU ในการกำหนดค่าของระบบที่ไม่ได้รับการสนับสนุน</translation> <translation id="5895138241574237353">ปิดแล้วเปิดอีกครั้ง</translation> <translation id="5895187275912066135">ออกเมื่อ</translation> -<translation id="5898154795085152510">เซิร์ฟเวอร์แสดงใบรับรองไคลเอ็นต์ที่ไม่ถูกต้อง ข้อผิดพลาด <ph name="ERROR_NUMBER" /> (<ph name="ERROR_NAME" />)</translation> <translation id="5900302528761731119">รูปภาพ Google โปรไฟล์</translation> <translation id="590253956165195626">ข้อเสนอในการแปลหน้าที่ไม่ได้อยู่ในภาษาที่คุณอ่านได้</translation> <translation id="5904093760909470684">การกำหนดค่าพร็อกซี</translation> @@ -3750,6 +3754,8 @@ <translation id="5984222099446776634">เข้าชมล่าสุด</translation> <translation id="5984814259619230127">การค้นหาด้วยบลูทูธพลังงานต่ำผ่าน Smart Lock</translation> <translation id="5986245990306121338">ตัวสลับแท็บจะแสดงขึ้นมาหากเปิดใช้ แม้ในตอนที่ตัวเลือก "รวมแท็บและแอป" จะเปิดอยู่ในการตั้งค่าก็ตาม</translation> +<translation id="5989712527536636369"><ph name="BEGIN_PARAGRAPH1" />นี่คือข้อมูลทั่วไปเกี่ยวกับอุปกรณ์ของคุณและวิธีที่คุณใช้งาน เช่น ระดับแบตเตอรี่ ความถี่ในการใช้แอป คุณภาพและความยาวในการเชื่อมต่อเครือข่าย (เช่น Wi-Fi และบลูทูธ) และรายงานข้อขัดข้องเมื่อสิ่งต่างๆ ทำงานผิดปกติ ระบบจะใช้ข้อมูลนี้เพื่อปรับปรุงผลิตภัณฑ์และบริการของ Google สำหรับทุกคน ข้อมูลที่รวบรวมไว้บางส่วนจะช่วยให้พาร์ทเนอร์ เช่น นักพัฒนาซอฟต์แวร์ Android สามารถทำให้แอปและผลิตภัณฑ์ของตนดีขึ้นได้ด้วย<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />คุณสามารถเปิดหรือปิดการตั้งค่านี้ได้ทุกเมื่อในการตั้งค่าแอป Android การตั้งค่านี้จะไม่ส่งผลต่อความสามารถในการส่งข้อมูลของอุปกรณ์เพื่อรับบริการที่จำเป็น เช่น การอัปเดตระบบและความปลอดภัย<ph name="END_PARAGRAPH2" /></translation> <translation id="5990198433782424697">ส่วนขยายใน chrome:// URL</translation> <translation id="5990814808592353318">การสร้างรหัสผ่านด้วยตนเอง</translation> <translation id="5991049340509704927">ขยาย</translation> @@ -3763,6 +3769,7 @@ <translation id="6005695835120147974">เราเตอร์สื่อ</translation> <translation id="6007237601604674381">การย้ายล้มเหลว <ph name="ERROR_MESSAGE" /></translation> <translation id="6008241731410823808">ส่งคำสั่ง ping สำหรับการตรวจสอบไฮเปอร์ลิงก์</translation> +<translation id="6011449291337289699">ล้างข้อมูลเว็บไซต์</translation> <translation id="6015796118275082299">ปี</translation> <translation id="6016551720757758985">ยืนยัน Powerwash และเปลี่ยนกลับเป็นเวอร์ชันก่อนหน้า</translation> <translation id="6016809788585079594">พูดว่า "Ok Google" เป็นครั้งสุดท้าย</translation> @@ -3952,7 +3959,6 @@ <translation id="6276301056778294989">โปรดตรวจสอบว่าอุปกรณ์กำลังแสดงรหัสเดียวกัน</translation> <translation id="6277105963844135994">ระยะหมดเวลาของเครือข่าย</translation> <translation id="6277518330158259200">จับ&ภาพหน้าจอ</translation> -<translation id="6278428485366576908">ธีม</translation> <translation id="6279183038361895380">กด |<ph name="ACCELERATOR" />| เพื่อแสดงเคอร์เซอร์ของคุณ</translation> <translation id="6280215091796946657">ลงชื่อเข้าใช้ด้วยบัญชีอื่น</translation> <translation id="6280912520669706465">ARC</translation> @@ -4204,6 +4210,7 @@ <translation id="6607272825297743757">ข้อมูลไฟล์</translation> <translation id="6607831829715835317">เ&ครื่องมือเพิ่มเติม</translation> <translation id="6608140561353073361">คุกกี้และข้อมูลไซต์ทั้งหมด...</translation> +<translation id="6610183966322615106">เกิดข้อผิดพลาดในการเพิ่มเครื่องพิมพ์</translation> <translation id="6610610633807698299">ป้อน URL...</translation> <translation id="6612358246767739896">เนื้อหาที่ได้รับความคุ้มครอง</translation> <translation id="6615455863669487791">แสดงให้ฉันเห็น</translation> @@ -4267,7 +4274,6 @@ <translation id="6708242697268981054">ต้นทาง:</translation> <translation id="6709357832553498500">เชื่อมต่อโดยใช้ <ph name="EXTENSIONNAME" /></translation> <translation id="6710213216561001401">ก่อนหน้า</translation> -<translation id="6712158998835983046">แสดงทั้งหมด เป็นภาพเคลื่อนไหว</translation> <translation id="6718273304615422081">กำลังซิป...</translation> <translation id="671928215901716392">ล็อกหน้าจอ</translation> <translation id="6721972322305477112">&ไฟล์</translation> @@ -4539,7 +4545,6 @@ <translation id="7088434364990739311">การเริ่มต้นการตรวจสอบการอัปเดตล้มเหลว (รหัสข้อผิดพลาด <ph name="ERROR" />)</translation> <translation id="708856090370082727">เปิดใช้การสนับสนุนเลื่อนไปจนสุดบนแป้นพิมพ์บนหน้าจอ เมื่อเปิดการตั้งค่าสถานะนี้ แป้นพิมพ์บนหน้าจอจะปรับขนาดเฉพาะวิวพอร์ตภาพเท่านั้น</translation> <translation id="7088674813905715446">ผู้ดูแลระบบนำอุปกรณ์นี้ไปไว้ในสถานะถูกยกเลิกการเตรียมใช้งาน หากต้องการเปิดใช้สำหรับการลงทะเบียน โปรดขอให้ผู้ดูแลระบบนำอุปกรณ์ไปไว้ในสถานะรอดำเนินการ</translation> -<translation id="7089609847854449639">ตัวจัดการพื้นที่เก็บข้อมูล</translation> <translation id="708969677220991657">อนุญาตให้ส่งคำขอไปยัง localhost ผ่าน HTTPS แม้ในเวลาที่มีใบรับรองที่ไม่ถูกต้อง</translation> <translation id="7092106376816104">ข้อยกเว้นป๊อปอัป</translation> <translation id="7093866338626856921">แลกเปลี่ยนข้อมูลกับอุปกรณ์ชื่อ <ph name="HOSTNAMES" /></translation> @@ -4579,7 +4584,7 @@ <translation id="715118844758971915">เครื่องพิมพ์แบบเดิม</translation> <translation id="7154130902455071009">เปลี่ยนหน้าเริ่มต้นของคุณเป็น: <ph name="START_PAGE" /></translation> <translation id="7155171745945906037">รูปภาพที่มีอยู่จากกล้องหรือไฟล์</translation> -<translation id="715568033737470079">ระบุปลั๊กอิน PPAPI ที่จะเรียกใช้ภายในนโยบายแซนด์บ็อกซ์แบบปิดล็อก Win32k (เฉพาะ Windows 10 ขึ้นไป)</translation> +<translation id="7155226869555939647">เปิดลิงก์ของ <ph name="APPLICATION" /> ทุกครั้ง</translation> <translation id="7156235233373189579">ไฟล์นี้ออกแบบมาสำหรับพีซีที่ใช้ซอฟต์แวร์บน Windows ซึ่งไม่สามารถเข้ากันได้กับอุปกรณ์ของคุณซึ่งใช้ Chrome OS โปรดค้นหาแอปทดแทนที่เหมาะสมบน <ph name="BEGIN_LINK" />Chrome เว็บสโตร์<ph name="END_LINK" /> <ph name="BEGIN_LINK_HELP" />เรียนรู้เพิ่มเติม<ph name="END_LINK_HELP" /></translation> <translation id="7157063064925785854">การคลิก "ดำเนินการต่อ" หมายถึงคุณตกลงตาม <ph name="LEGAL_DOC_LINK_TEXT_1" />, <ph name="LEGAL_DOC_LINK_TEXT_2" />, <ph name="LEGAL_DOC_LINK_TEXT_3" /> และ <ph name="LEGAL_DOC_LINK_TEXT_4" /></translation> <translation id="7158238151765743968">การเชื่อมต่อกับ "<ph name="DEVICE_NAME" />" ยังดำเนินการอยู่</translation> @@ -4594,6 +4599,7 @@ <translation id="7175353351958621980">โหลดจาก:</translation> <translation id="7180611975245234373">รีเฟรช</translation> <translation id="7180865173735832675">กำหนดค่า</translation> +<translation id="7181387261278441780">ล้างข้อมูลและรีเซ็ตเว็บไซต์</translation> <translation id="7185078796915954712">TLS 1.3</translation> <translation id="7185690883425432021">ซ่อนปุ่มปิดของแท็บที่ไม่ได้ใช้งานเมื่อแถบแท็บอยู่ในโหมดเรียงกันเป็นกลุ่ม</translation> <translation id="7186088072322679094">เก็บในแถบเครื่องมือ</translation> @@ -4626,7 +4632,6 @@ <translation id="7223775956298141902">แย่จัง... คุณไม่มีส่วนขยาย :-(</translation> <translation id="7224023051066864079">ซับเน็ตมาสก์:</translation> <translation id="7225179976675429563">ไม่มีประเภทเครือข่าย</translation> -<translation id="7230191962699768124">แสดงทั้งหมด ไม่ใช่ภาพเคลื่อนไหว</translation> <translation id="7230787553283372882">กำหนดขนาดข้อความของคุณ</translation> <translation id="7231224339346098802">ใช้ตัวเลขเพื่อระบุจำนวนสำเนาที่ต้องการพิมพ์ (1 หรือมากกว่า)</translation> <translation id="7238585580608191973">ลายนิ้วมือ SHA-256</translation> @@ -4758,7 +4763,6 @@ <translation id="7409233648990234464">เรียกใช้งานอีกครั้งและ Powerwash</translation> <translation id="7409836189476010449">เรียกใช้ Flash</translation> <translation id="7410344089573941623">ถามว่า <ph name="HOST" /> ต้องการเข้าถึงกล้องและไมโครโฟนของคุณหรือไม่</translation> -<translation id="7411343637221933631">{NUM_COOKIES,plural, =1{1 รายการจากเว็บไซต์นี้}other{# รายการจากเว็บไซต์นี้}}</translation> <translation id="7412226954991670867">หน่วยความจำ GPU</translation> <translation id="7416362041876611053">ข้อผิดพลาดของเครือข่ายที่ไม่รู้จัก</translation> <translation id="7417453074306512035">แป้นพิมพ์ภาษาเอธิโอเปีย</translation> @@ -4880,6 +4884,7 @@ <translation id="756445078718366910">เปิดหน้าต่างเบราว์เซอร์</translation> <translation id="7564847347806291057">สิ้นสุดกระบวนการ</translation> <translation id="7566723889363720618">F12</translation> +<translation id="7567314848159753396">คุกกี้: <ph name="NAME" /></translation> <translation id="756809126120519699">ล้างข้อมูล Chrome แล้ว</translation> <translation id="7568790562536448087">การอัปเดต</translation> <translation id="7573172247376861652">ชาร์จแบตเตอรี่</translation> @@ -4920,6 +4925,7 @@ <translation id="7626009897377900107">การสร้างรหัสผ่าน</translation> <translation id="7627262197844840899">ไซต์นี้ไม่ยอมรับ MasterCard</translation> <translation id="7627790789328695202">อ๊ะ มี <ph name="FILE_NAME" /> อยู่แล้ว เปลี่ยนชื่อแล้วลองอีกครั้ง</translation> +<translation id="7628127343934101653">เปิดไฟล์ PDF ในแอปพลิเคชันโปรแกรมดู PDF เริ่มต้น</translation> <translation id="762917759028004464">เบราว์เซอร์เริ่มต้น <ph name="BROWSER_NAME" /> ในขณะนี้</translation> <translation id="7629536005696009600">อนุญาตให้เติมข้อมูลรับรองที่จัดเก็บไว้สำหรับแอปพลิเคชัน Android ลงในเว็บไซต์ที่เกี่ยวข้อง</translation> <translation id="7629827748548208700">แท็บ: <ph name="TAB_NAME" /></translation> @@ -5148,6 +5154,7 @@ <translation id="7957513156576779045">เปิดบลูทูธเพื่อให้จับคู่กันได้</translation> <translation id="7957615753207896812">เปิดการตั้งค่าอุปกรณ์แป้นพิมพ์</translation> <translation id="7959074893852789871">ไฟล์มีใบรับรองหลายใบ แต่มีบางรายการที่ไม่ได้นำเข้า:</translation> +<translation id="7959700692661109221"><ph name="BEGIN_PARAGRAPH" />บริการตำแหน่งของ Google ใช้แหล่งข้อมูล เช่น Wi‑Fi เพื่อช่วยคาดเดาตำแหน่งของอุปกรณ์ได้เร็วขึ้นและแม่นยำมากขึ้น เมื่อคุณเปิดบริการตำแหน่งของ Google อุปกรณ์จะเข้าสู่โหมดที่ใช้ Wi‑Fi เพื่อระบุข้อมูลตำแหน่ง คุณสามารถปิดบริการตำแหน่งได้ทุกเมื่อในการตั้งค่า<ph name="END_PARAGRAPH" /></translation> <translation id="7961015016161918242">ไม่เคย</translation> <translation id="7964089325405904043">การนำเข้าและส่งออกรหัสผ่าน</translation> <translation id="7965010376480416255">หน่วยความจำที่ใช้ร่วมกัน</translation> @@ -5298,6 +5305,7 @@ <translation id="8146793085009540321">การลงชื่อเข้าใช้ไม่สำเร็จ โปรดติดต่อผู้ดูแลระบบหรือลองอีกครั้ง</translation> <translation id="8148264977957212129">วิธีป้อนข้อมูลแบบพินอิน</translation> <translation id="8148913456785123871">แสดงการ์ด Google Now ใน Launcher</translation> +<translation id="8150391391298684512">ปิดใช้ Windows Runtime MIDI API</translation> <translation id="8151185429379586178">เครื่องมือสำหรับนักพัฒนาซอฟต์แวร์</translation> <translation id="8151638057146502721">กำหนดค่า</translation> <translation id="8151639108075998630">เปิดใช้งานการท่องเว็บในฐานะผู้มาเยือน</translation> @@ -5578,6 +5586,7 @@ <translation id="8532294913309524834">เรียงลำดับภาษาตามความต้องการของคุณ</translation> <translation id="8535005006684281994">URL การต่ออายุใบรับรองของ Netscape</translation> <translation id="8539727552378197395">ไม่มี (HttpOnly)</translation> +<translation id="8541084862688000575">โหลดแอป Android โดยอัตโนมัติ</translation> <translation id="8543181531796978784">คุณสามารถ<ph name="BEGIN_ERROR_LINK" />รายงานปัญหาในการตรวจหา<ph name="END_ERROR_LINK" />ได้ หรือหากคุณเข้าใจถึงความเสี่ยงต่อความปลอดภัยของคุณ คุณสามารถ<ph name="BEGIN_LINK" />เข้าชมเว็บไซต์ที่ไม่ปลอดภัย<ph name="END_LINK" />ได้</translation> <translation id="8545107379349809705">ซ่อนข้อมูล...</translation> <translation id="8545211332741562162">เปิดใช้งานหน้าเว็บเพื่อใช้คุณลักษณะ JavaScript แบบทดลอง</translation> @@ -5605,7 +5614,6 @@ <translation id="8569764466147087991">เลือกไฟล์เพื่อเปิด</translation> <translation id="8571032220281885258">เมื่อคุณพูด "Ok Google" Chrome จะค้นหาสิ่งที่คุณพูดต่อจากนี้</translation> <translation id="8571108619753148184">เซิร์ฟเวอร์ 4</translation> -<translation id="8572832761467613633">Flash เท่านั้น</translation> <translation id="8572981282494768930">ไม่อนุญาตให้ไซต์เข้าถึงกล้องและไมโครโฟนของคุณ</translation> <translation id="8574234089711453001">อนุญาตให้แสดงปุ่มดาวน์โหลดเมื่อเปิดหน้าที่มี URL สื่อ</translation> <translation id="857779305329188634">เปิดใช้งานการสนับสนุนโปรโตคอลทดลอง QUIC</translation> @@ -5627,6 +5635,7 @@ <translation id="8600929685092827187">ปลุกในแพ็กเก็ต</translation> <translation id="8601206103050338563">การตรวจสอบสิทธิ์ไคลเอ็นต์ TLS WWW </translation> <translation id="8602851771975208551">โปรแกรมอื่นในคอมพิวเตอร์ของคุณเพิ่มแอปพลิเคชันที่อาจเปลี่ยนวิธีการทำงานของ Chrome</translation> +<translation id="8603912787021349466">อนุญาตให้แอป Android เริ่มต้นทำงานโดยอัตโนมัติหลังลงชื่อเข้าใช้</translation> <translation id="8605428685123651449">หน่วยความจำ SQLite</translation> <translation id="8605503133013456784">ไม่สามารถยกเลิกการเชื่อมต่อและการจับคู่กับ "<ph name="DEVICE_NAME" />"</translation> <translation id="8606726445206553943">ใช้อุปกรณ์ MIDI ของคุณ</translation> @@ -5979,6 +5988,7 @@ <translation id="9053965862400494292">เกิดข้อผิดพลาดขณะพยายามตั้งค่าการทำให้ข้อมูลตรงกัน</translation> <translation id="9056034633062863292">กำลังอัปเดต Chromebox</translation> <translation id="9056810968620647706">ไม่พบรายการที่ตรงกัน</translation> +<translation id="9057119625587205566">ไม่มีเครื่องพิมพ์ใกล้เคียง</translation> <translation id="9059868303873565140">เมนูสถานะ</translation> <translation id="9064142312330104323">รูปภาพ Google โปรไฟล์ (กำลังโหลด)</translation> <translation id="9064275926664971810">เปิดใช้การป้อนอัตโนมัติเพื่อกรอกฟอร์มด้วยการคลิกเพียงครั้งเดียว</translation> @@ -5989,6 +5999,7 @@ <translation id="9067401056540256169">ธงนี้ทำให้ Chrome ไม่ปลอดภัย ให้ใช้เฉพาะเมื่อคุณเข้าใจว่าสิ่งนี้ใช้ทำอะไร โปรดทราบว่าธงนี้อาจมีการนำออกออกโดยไม่มีการแจ้งให้ทราบล่วงหน้า ถ้าเปิดใช้แล้ว เฟรมที่มีต้นกำเนิด HTTPS สามารถใช้ WebSocket กับ URL ที่ไม่ปลอดภัย (ws://) ได้</translation> <translation id="9068931793451030927">เส้นทาง:</translation> <translation id="9070219033670098627">เปลี่ยนบุคคล</translation> +<translation id="9070940116164932228">ควบคุมเครื่องควบคุมเวลาค่าใช้จ่ายสูงในพื้นหลัง</translation> <translation id="907148966137935206">ไม่อนุญาตให้ไซต์ใดๆ แสดงป๊อปอัป (แนะนำ)</translation> <translation id="9072550133391925347"><ph name="PASSWORD_MANAGER_BRAND" /> ลงชื่อเข้าใช้ให้คุณในเว็บไซต์และแอปที่มีสิทธิ์โดยอัตโนมัติด้วยรหัสผ่านที่คุณบันทึกไว้</translation> <translation id="9073281213608662541">PAP</translation> @@ -6022,6 +6033,7 @@ <translation id="9112614144067920641">โปรดเลือก PIN ใหม่</translation> <translation id="9112748030372401671">เปลี่ยนวอลเปเปอร์ของคุณ</translation> <translation id="9112987648460918699">ค้นหา...</translation> +<translation id="9114663181201435112">ลงชื่อเข้าใช้ได้อย่างง่ายดาย</translation> <translation id="9115487443206954631">จัดการอุปกรณ์แคสต์</translation> <translation id="9115675100829699941">&บุ๊กมาร์ก</translation> <translation id="9121814364785106365">เปิดเป็นแท็บที่ปักหมุดไว้</translation> @@ -6116,7 +6128,6 @@ <translation id="952992212772159698">ไม่ได้เปิดการใช้งาน</translation> <translation id="960719561871045870">รหัสผู้ให้บริการ</translation> <translation id="960987915827980018">เหลือเวลาอีกประมาณ 1 ชั่วโมง</translation> -<translation id="962778376131245616">แสดงเฉพาะรายการที่ไม่ปลอดภัย เป็นภาพเคลื่อนไหว</translation> <translation id="96421021576709873">เครือข่าย WiFi</translation> <translation id="965490406356730238">เปิดใช้การถอดรหัส mjpeg ที่เร่งการแสดงผลด้วยฮาร์ดแวร์สำหรับเฟรมที่จับภาพซึ่งมีอยู่</translation> <translation id="968174221497644223">แคชของแอปพลิเคชัน</translation>
diff --git a/chrome/app/resources/generated_resources_tr.xtb b/chrome/app/resources/generated_resources_tr.xtb index ea61f34..8d27d3c 100644 --- a/chrome/app/resources/generated_resources_tr.xtb +++ b/chrome/app/resources/generated_resources_tr.xtb
@@ -18,7 +18,6 @@ <translation id="1029317248976101138">Yakınlaştır</translation> <translation id="1029595648591494741">"<ph name="EXTENSION_NAME" />" denensin mi?</translation> <translation id="1031362278801463162">Önizleme yükleniyor</translation> -<translation id="1031460590482534116">İstemci sertifikası depolanmaya çalışılırken hata oluştu. Hata: <ph name="ERROR_NUMBER" /> (<ph name="ERROR_NAME" />).</translation> <translation id="1031573127485938293">Sor (politika tarafından)</translation> <translation id="103279545524624934">Android uygulamalarını başlatmak için disk alanını boşaltın.</translation> <translation id="1033780634303702874">Seri cihazlarınıza erişme</translation> @@ -101,6 +100,7 @@ <translation id="1128591060186966949">Arama motorunu düzenleyin</translation> <translation id="1128987120443782698">Depolama cihazının <ph name="DEVICE_CAPACITY" /> kapasitesi var. Lütfen en az 4GB kapasitesi olan bir SD kart veya USB bellek çubuğu takın.</translation> <translation id="1137135726305341424">domContentLoaded ve domContentLoaded öncesinde başlatılan tüm kaynak yüklemeleri (ana çerçeve ve aynı kaynak iframe'ler).</translation> +<translation id="1138663153846032155">HTML'yi Flash'a tercih et</translation> <translation id="1140351953533677694">Bluetooth ve Seri cihazlarınıza erişme</translation> <translation id="114140604515785785">Uzantı kök dizini:</translation> <translation id="1143142264369994168">Sertifika İmza Sahibi</translation> @@ -252,6 +252,7 @@ <translation id="1351692861129622852"><ph name="FILE_COUNT" /> dosya içe aktarılıyor...</translation> <translation id="1352103415082130575">Tayca klavye (Pattachote)</translation> <translation id="1353686479385938207"><ph name="PROVIDER_NAME" />: <ph name="NETWORK_NAME" /></translation> +<translation id="1353946958707294039">Materyal Tasarım depolama yöneticisi</translation> <translation id="1353966721814789986">Başlangıç sayfaları</translation> <translation id="1354868058853714482">Adobe Reader'ın sürümü eski olduğundan güvenli olmayabilir.</translation> <translation id="1355408554203439639">3D yazılım tabanlı pikselleştirici</translation> @@ -423,7 +424,6 @@ <translation id="1533920822694388968">TV ayarlama</translation> <translation id="15373452373711364">Büyük fare imleci</translation> <translation id="1543284117603151572">Edge'den Aktarıldı</translation> -<translation id="1544350195767834591">{NUM_COOKIES,plural, =1{Diğer sitelerden 1 tane}other{Diğer sitelerden # tane}}</translation> <translation id="1545177026077493356">Otomatik Kiosk Modu</translation> <translation id="1545786162090505744">Sorgu yerine %s olan URL</translation> <translation id="1546280085599573572">Bu uzantı, Ana Sayfa düğmesini tıkladığınızda gösterilecek sayfayı değiştirdi.</translation> @@ -447,7 +447,6 @@ <translation id="1559235587769913376">Unicode karakterler girin</translation> <translation id="1561092721008294962">Kullanıcı arayüzü metni için HarfBuzz</translation> <translation id="1566049601598938765">Web sitesi</translation> -<translation id="1566958206723629112">Flash ve PDF</translation> <translation id="1567723158593978621">Etkinleştirildiğinde, tarayıcıda oturum açılırken GAIA şifresiyle ayrılmış yeni bir oturum açma akışı kullanılır.</translation> <translation id="1567993339577891801">JavaScript Konsolu</translation> <translation id="1568323446248056064">Ekran cihaz ayarlarını aç</translation> @@ -576,7 +575,6 @@ <translation id="1723940674997333416">https'den gelen güvenli olmayan WebSocket'e izin ver</translation> <translation id="1725149567830788547">&Denetimleri Göster</translation> <translation id="172612876728038702">TPM ayarlanıyor. Lütfen biraz bekleyin; bu işlem birkaç dakika sürebilir.</translation> -<translation id="1727135806684246609">Materyal Güvenlik Ayrıntısı</translation> <translation id="1729533290416704613">Ayrıca, Çok Amaçlı Adres Çubuğu'ndan arama yaptığınızda gösterilecek sayfayı da denetler.</translation> <translation id="1731346223650886555">Noktalı virgül</translation> <translation id="1731589410171062430">Toplam: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /> (<ph name="NUMBER_OF_PAGES" /> <ph name="PAGE_OR_PAGES_LABEL" />)</translation> @@ -873,6 +871,7 @@ <translation id="218492098606937156">Dokunmatik işlemleri etkinleştir</translation> <translation id="2187317261103489799">Algıla (varsayılan)</translation> <translation id="2187895286714876935">Sunucu Sertifikası İçe Aktarma Hatası</translation> +<translation id="2188881192257509750"><ph name="APPLICATION" /> adlı uygulamayı aç</translation> <translation id="2190069059097339078">WiFi Credentials Getter</translation> <translation id="219008588003277019">Özgün İstemci modülü: <ph name="NEXE_NAME" /></translation> <translation id="2190355936436201913">(boş)</translation> @@ -991,6 +990,7 @@ <translation id="2326606747676847821">Gizli mod</translation> <translation id="2326931316514688470">&Uygulamayı yeniden yükle</translation> <translation id="2327492829706409234">Uygulamayı etkinleştir</translation> +<translation id="2328054044222305089">Bu işlem, <ph name="SITE" /> sitesinin cihazınıza kaydettiği tüm verileri silecek ve çalışması için verdiğiniz tüm izinler sıfırlanacak. Devam etmek istiyor musunuz?</translation> <translation id="2329597144923131178">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="2332131598580221120">Mağazada görüntüle</translation> <translation id="2332742915001411729">Varsayılana sıfırla</translation> @@ -1266,7 +1266,6 @@ <translation id="2675358154061544447">Farklı süreçlerde, siteler arası iframe'ler oluşturulmasına yönelik deney aşamasında bir destek. Bu modda, dokümanlar yalnızca aynı web sitesinden olduklarında bir oluşturucu sürecini paylaşırlar.</translation> <translation id="2676946222714718093">Şurada oynatılıyor:</translation> <translation id="2678063897982469759">Tekrar etkinleştir</translation> -<translation id="2678246812096664977">Tüm eklentiler</translation> <translation id="2679385451463308372">Sistem iletişim kutusunu kullanarak yazdır…</translation> <translation id="2680208403056680091">İnternet Bağlantınız Kontrol Ediliyor</translation> <translation id="268053382412112343">Geç&miş</translation> @@ -1440,7 +1439,6 @@ <translation id="287286579981869940"><ph name="PROVIDER_NAME" /> Sağlayıcısını Ekle...</translation> <translation id="2872961005593481000">Kapat</translation> <translation id="2875698561019555027">(Chrome hata sayfaları)</translation> -<translation id="2879560882721503072"><ph name="ISSUER" /> tarafından verilen istemci sertifikası başarılı bir şekilde depolandı.</translation> <translation id="288024221176729610">Çek dili</translation> <translation id="288042212351694283">Evrensel 2. Faktör cihazlarınıza erişim</translation> <translation id="2881966438216424900">Son erişim zamanı:</translation> @@ -1589,6 +1587,7 @@ <translation id="3057861065630527966">Fotoğraflarınızı ve videolarınızı yedekleyin</translation> <translation id="3058212636943679650">Bilgisayarınızın işletim sistemini kurtarmanız gerekirse, kurtarma SD kartına veya USB bellek çubuğuna ihtiyacınız olacaktır.</translation> <translation id="305932878998873762">HTTP için Basit Önbellek yeni bir önbellektir. Disk alanı ayırmak için filesystem'a bağlı olarak çalışır.</translation> +<translation id="3060251871394327123">Bu işlem, <ph name="SITE" /> sitesinin cihazınıza kaydettiği tüm verileri silecek. Devam etmek istiyor musunuz?</translation> <translation id="3061650404498811439">Etkinleştirme IME menüsününden emoji, el yazısı ve ses girişine erişimi aç.</translation> <translation id="3062606427884046423">Chrome medya bildirimleri için Android MediaStyle bildirimlerini kullanın.</translation> <translation id="3063844757726132584">Bu kullanışlı başlatıcıdan tüm uygulamalarınıza erişin. Oyun oynayın, görüntülü sohbet edin, müzik dinleyin, dokümanları düzenleyin veya diğer uygulamaları edinin.</translation> @@ -1638,6 +1637,7 @@ <translation id="3123569374670379335">(Denetleniyor)</translation> <translation id="3124111068741548686">KULLANICI işleyicileri</translation> <translation id="3126026824346185272">Ctrl</translation> +<translation id="3127156390846601284">Bu işlem, gösterilen tüm sitelerin cihazınıza kaydettiği tüm verileri silecek. Devam etmek istiyor musunuz?</translation> <translation id="312759608736432009">Cihaz üreticisi:</translation> <translation id="3127919023693423797">Kimlik doğrulanıyor...</translation> <translation id="3128230619496333808">Sekme 6</translation> @@ -1736,7 +1736,6 @@ <translation id="3264544094376351444">Sans-serif yazı tipi</translation> <translation id="3264547943200567728">Chromebox'ınızın ağı yapılandırılamadı</translation> <translation id="3265459715026181080">Pencereyi Kapat</translation> -<translation id="3267271790328635957">Yalnızca PDF</translation> <translation id="3267726687589094446">Otomatik olarak birden fazla dosya indirilmesine izin vermeye devam et</translation> <translation id="3267998849713137817">Değiştirilme Zamanı</translation> <translation id="3268451620468152448">Açık Sekmeler</translation> @@ -1982,6 +1981,7 @@ <translation id="3574210789297084292">oturum aç</translation> <translation id="3574305903863751447"><ph name="CITY" />, <ph name="STATE" /> <ph name="COUNTRY" /></translation> <translation id="357479282490346887">Litvanca</translation> +<translation id="3575927481544652747">Windows 10 veya sonraki sürümlerde varsayılan olarak etkinleştirilen WebMIDI için Windows Runtime MIDI API'si devre dışı bırakılır.</translation> <translation id="3576324189521867626">Başarıyla yüklendi</translation> <translation id="3578331450833904042">Varsayılan (her şeyi dinle)</translation> <translation id="3578594933904494462">Bu sekmenin içeriği paylaşılıyor.</translation> @@ -2035,8 +2035,6 @@ <translation id="3627320433825461852">1 dakikadan az kaldı</translation> <translation id="3627588569887975815">&Bağlantıyı gizli pencerede aç</translation> <translation id="3627671146180677314">Netscape Sertifikası Yenileme Zamanı</translation> -<translation id="3629326610814700057">Depolama yöneticisinin yerel depolama alanını yönetmesini sağlar.</translation> -<translation id="3630337581925712713"><ph name="PERMISSION_TYPE_LABEL" />:</translation> <translation id="3631337165634322335">Aşağıdaki istisnalar yalnızca geçerli gizli oturum için geçerlidir.</translation> <translation id="3633586230741134985">Uygulama Başlatıcı Ayarları</translation> <translation id="3633997706330212530">İsterseniz, bu hizmetleri devre dışı bırakabilirsiniz.</translation> @@ -2059,7 +2057,8 @@ <translation id="3654045516529121250">Erişilebilirlik ayarlarınızı okuma</translation> <translation id="3654092442379740616">Senkronizasyon Hatası: <ph name="PRODUCT_NAME" /> eski ve güncellenmesi gerekiyor.</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{Bir dosyaya kalıcı erişimi vardır.}other{# dosyaya kalıcı erişimi vardır.}}</translation> -<translation id="3657468915905674858">PPAPI Win32k Tam Gizliliğini etkinleştir.</translation> +<translation id="365793796291733849"><ph name="BEGIN_PARAGRAPH1" />Otomatik yedekleme özelliğini açtığınızda, cihaz ve uygulama verileri düzenli olarak Google Drive'daki gizli bir klasöre kaydedilir. Uygulama verileri, bir uygulamanın kaydettiği her tür veri olabilir (geliştirici ayarlarına bağlıdır) ve bu veriler arasında kişiler, iletiler ve fotoğraflar gibi hassas olabilecek veriler de bulunabilir.<ph name="END_PARAGRAPH1" /> +<ph name="BEGIN_PARAGRAPH2" />Yedeklenen veriler, Drive Depolama Alanı kotanızdan düşülmez. Büyük dosyalar veya geliştiricilerin yedekleme haricinde tutmayı seçtiği dosyalar yedeklenmez.<ph name="END_PARAGRAPH2" /></translation> <translation id="3660234220361471169">Güvenilmeyen</translation> <translation id="3665589677786828986">Chrome, bazı ayarlarınızın başka bir program tarafından bozulduğunu algıladı ve onları orijinal varsayılan değerlerine sıfırladı.</translation> <translation id="3665842570601375360">Güvenlik:</translation> @@ -2114,6 +2113,7 @@ <translation id="3733127536501031542">İlerlemeli SSL Sunucusu</translation> <translation id="3736520371357197498">Güvenliğinizle ilgili riskleri anlıyorsanız tehlikeli programlar kaldırılmadan önce <ph name="BEGIN_LINK" />güvenli olmayan bu siteyi ziyaret edebilirsiniz<ph name="END_LINK" />.</translation> <translation id="3738924763801731196"><ph name="OID" />:</translation> +<translation id="3739254215541673094"><ph name="APPLICATION" /> açılsın mı?</translation> <translation id="3739798227959604811">Tekrardan önce gecikme:</translation> <translation id="3741158646617793859"><ph name="DEVICE_NAME" /> şimdi Yönetici Konsolu'nda görünecek</translation> <translation id="3741243925913727067">Medya cihazınızın fotoğraflarını ve videolarını Google Drive'a yedekleyin.</translation> @@ -2352,7 +2352,6 @@ <translation id="4058793769387728514">Dokümanı Şimdi Denetle</translation> <translation id="4059285154003114015">&Çerçeveyi yazdır...</translation> <translation id="406070391919917862">Arka Plan Uygulamaları</translation> -<translation id="4061502419206152498">Yalnızca güvenli olmayanları göster, animasyonsuz</translation> <translation id="4062251648694601778"><ph name="SHORT_PRODUCT_NAME" /> cihazınızın keyfini çıkarın. Sorularınız mı var? İstediğiniz zaman durum tepsisindeki "?" simgesini tıklayarak yardım alabilirsiniz.</translation> <translation id="4065876735068446555">Kullandığınız ağ (<ph name="NETWORK_ID" />) bir giriş sayfasını ziyaret etmenizi gerektiriyor olabilir.</translation> <translation id="4068506536726151626">Bu sayfa, konumunuzu izleyen şu sitelerden öğeler içeriyor:</translation> @@ -2391,7 +2390,6 @@ <translation id="4101878899871018532">Şifre yöneticisi senkronizasyon için kullanılan kimlik bilgilerini kaydetmeyi teklif etmez.</translation> <translation id="410351446219883937">Otomatik oynatma</translation> <translation id="4104163789986725820">&Dışa Aktar...</translation> -<translation id="4105523032910086267">Materyal Tasarım'da animasyonu ve güvenlik ayrıntısının görünürlüğünü ayarlar.</translation> <translation id="4105563239298244027">Google Drive ile 1 TB ücretsiz depolama alanı edinin.</translation> <translation id="4109135793348361820">Pencereyi <ph name="USER_NAME" /> (<ph name="USER_EMAIL" />) kullanıcısına taşı</translation> <translation id="4110342520124362335"><ph name="DOMAIN" /> tarafından gönderilen çerezler engellendi.</translation> @@ -2442,6 +2440,7 @@ <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="4188447344915957833">Materyal Tasarım Ayarları'nda depolama yöneticisini etkinleştirir.</translation> <translation id="4189406272289638749">Bu ayarı <b><ph name="EXTENSION_NAME" /></b> adlı uzantı kontrol ediyor.</translation> <translation id="4193154014135846272">Google dokümanı</translation> <translation id="4193182321948161343">Materyal Tasarım Kullanıcı Yöneticisini Etkinleştir</translation> @@ -2649,6 +2648,7 @@ <translation id="4508765956121923607">Ka&ynağı Görüntüle</translation> <translation id="4509017836361568632">Fotoğrafı sil</translation> <translation id="4509345063551561634">Konum:</translation> +<translation id="4513946894732546136">Geri Bildirim</translation> <translation id="4514542542275172126">Denetlenen yeni kullanıcı oluşturun</translation> <translation id="4514914692061505365">Tüm pexe dosyalarında PNaCI'nın hızlı Subzero çevirmeninin kullanılmasını zorlayın.</translation> <translation id="451515744433878153">Kaldır</translation> @@ -2747,6 +2747,7 @@ <translation id="4656293982926141856">Bu bilgisayar</translation> <translation id="4656631038341342120">Bu cihaz için kullanılabiliyorsa Sanal Gerçeklik kabuğunu etkinleştirin.</translation> <translation id="4657031070957997341"><ph name="HOST" /> sitesindeki eklentilere her zaman izin ver</translation> +<translation id="466008749075469935">Arka plan zamanlayıcılarının CPU kullanımını %1 olarak sınırlamak için müdahaleyi etkinleştirir.</translation> <translation id="4663254525753315077">Mümkün olduğunda daha hızlı kaydırma için, bir taşma kaydırma öğesinin kaydırma içeriğini birleştirilmiş katman üzerine koyar.</translation> <translation id="4664482161435122549">PKCS #12 Dışa Aktarma Hatası</translation> <translation id="4665014895760275686">Üretici</translation> @@ -2815,6 +2816,7 @@ <translation id="4749157430980974800">Gürcüce klavye</translation> <translation id="4750394297954878236">Öneriler</translation> <translation id="475088594373173692">İlk kullanıcı</translation> +<translation id="4750892496809949692">Eklenti listesinden Flash'ı gizleyerek HTML içeriği tercih edilir.</translation> <translation id="4750917950439032686">Bilgileriniz (örneğin şifreler veya kredi kartı numaraları), bu siteye gönderilirken gizli olur.</translation> <translation id="4753602155423695878">Android telefonda sayfa yükleme işlemine ilişkin ilerleme durumu çubuğu animasyonu</translation> <translation id="4755240240651974342">Fince klavye</translation> @@ -3089,6 +3091,7 @@ <translation id="5119450342834678097">Ayarlar menüsünde tablet sitesi isteğinde bulunma seçeneği</translation> <translation id="5120068803556741301">Üçüncü taraf giriş yöntemi</translation> <translation id="5120421890733714118">Web sitelerini tanımlamada bu sertifikaya güvenin.</translation> +<translation id="5120516977819314347">PIN veya şifre yanlış.</translation> <translation id="5121130586824819730">Sabit diskiniz dolu. Lütfen başka bir yere kaydedin veya sabit diskinizde yer açın.</translation> <translation id="5125751979347152379">Geçersiz URL.</translation> <translation id="5127881134400491887">Ağ bağlantılarını yönetma</translation> @@ -3096,12 +3099,13 @@ <translation id="512903556749061217">eklendi</translation> <translation id="5129301143853688736">Bu siteye bağlantınız gizli değil. Saldırganlar <ph name="DOMAIN" /> alan adından bilgilerinizi (ör. fotoğraflarınızı, şifrelerinizi, iletilerinizi ve kredi kartı bilgilerinizi) çalmaya çalışabilir.</translation> <translation id="5129662217315786329">Lehçe</translation> +<translation id="5131347545782851480">PDF Dokümanları</translation> <translation id="5134856901811723984">Chrome OS'nin sistem kullanıcı arayüzündeki Materyal Tasarım</translation> <translation id="5135533361271311778">Yer işareti öğesi oluşturulamadı.</translation> <translation id="5136529877787728692">F7</translation> <translation id="5137501176474113045">Bu öğeyi sil</translation> <translation id="5137929532584371582">16</translation> -<translation id="5138177765054221193">Flash içeriklerin kullanımı için "izin ver" ayarı seçilmiş sitelerde, önemsiz olduğu belirtilenler de dahil olmak üzere tüm içeriği çalıştırın.</translation> +<translation id="5138177765054221193">Flash içeriklerin kullanımı için "izin ver" ayarı seçilmiş sitelerde, önemsiz olduğu belirtilenler de dahil olmak üzere tüm içerik çalıştırılır.</translation> <translation id="5139955368427980650">&Aç</translation> <translation id="5141240743006678641">Senkronize edilen şifreleri Google kimlik bilgilerinizle şifreleyin</translation> <translation id="5143374789336132547">"<ph name="EXTENSION_NAME" />" uzantısı Ana Sayfa düğmesini tıkladığınızda gösterilecek sayfayı değiştirdi.</translation> @@ -3264,6 +3268,7 @@ <translation id="5328031682234198929">8</translation> <translation id="5329858601952122676">&Sil</translation> <translation id="5330145655348521461">Bu dosyalar farklı bir masaüstünde açıldı. Görüntülemek için <ph name="USER_NAME" /> (<ph name="MAIL_ADDRESS" />) adlı kullanıcıya geçin.</translation> +<translation id="5330512191124428349">Bilgi al</translation> <translation id="5332624210073556029">Saat dilimi:</translation> <translation id="5333807720589685258">Doğru PIN Kilit Açma Anahtarını giremezseniz SIM kartınız kalıcı olarak devre dışı bırakılacaktır.</translation> @@ -3697,7 +3702,6 @@ <translation id="5892507820957994680">Yerleşik yazılım oluşturma listesinin üzerine yazar ve desteklenmeyen sistem yapılandırmalarında GPU hızlandırmayı etkinleştirir.</translation> <translation id="5895138241574237353">Yeniden başlat</translation> <translation id="5895187275912066135">Verildiği Tarih</translation> -<translation id="5898154795085152510">Sunucu, geçersiz bir istemci sertifikası döndürdü. Hata: <ph name="ERROR_NUMBER" /> (<ph name="ERROR_NAME" />).</translation> <translation id="5900302528761731119">Google Profil fotoğrafı</translation> <translation id="590253956165195626">Okuduğum dilde olmayan sayfaları çevirmeyi öner.</translation> <translation id="5904093760909470684">Proxy yapılandırması</translation> @@ -3752,6 +3756,8 @@ <translation id="5984222099446776634">Yakın Zamanda Ziyaret Edilenler</translation> <translation id="5984814259619230127">Smart Lock Bluetooth Düşük Enerji Keşfi</translation> <translation id="5986245990306121338">Etkinleştirilirse, ayarlarda "sekmeleri ve uygulamaları birleştir" seçeneği açık olduğunda bile bir sekme değiştirici gösterilir.</translation> +<translation id="5989712527536636369"><ph name="BEGIN_PARAGRAPH1" />Bunlar pil düzeyi, uygulamalarınızı ne sıklıkta kullandığınız, ağ bağlantılarınızın (kablosuz ağ ve Bluetooth gibi) kalitesi ve süresi, öğeler olmaları gerektiği gibi çalışmadığında oluşturulan kilitlenme raporları gibi cihazınız ve cihazınızı nasıl kullandığınızla ilgili genel bilgilerdir. Bu veriler, Google'ın ürünlerini ve hizmetlerini herkes için daha iyi bir hale getirmek için kullanılır. Toplu haldeki bazı bilgiler Android geliştiricileri gibi iş ortaklarına da uygulamalarını ve ürünlerini daha iyi hale getirmelerinde yardımcı olur.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Bu özelliği istediğiniz zaman Android uygulamalarındaki Ayarlar'dan açabilir veya kapatabilirsiniz. Bu ayar, cihazın, sistem güncellemeleri ve güvenlik gibi önemli hizmetleri almak için ihtiyaç duyduğu bilgileri gönderme yeteneğini etkilemez.<ph name="END_PARAGRAPH2" /></translation> <translation id="5990198433782424697">chrome:// URL'lerinde uzantılar</translation> <translation id="5990814808592353318">Manuel şifre oluşturma.</translation> <translation id="5991049340509704927">Büyüt</translation> @@ -3765,6 +3771,7 @@ <translation id="6005695835120147974">Medya Yönlendiricisi</translation> <translation id="6007237601604674381">Taşıma başarısız oldu. <ph name="ERROR_MESSAGE" /></translation> <translation id="6008241731410823808">Köprü denetleme ping'leri gönderir.</translation> +<translation id="6011449291337289699">Site verilerini temizle</translation> <translation id="6015796118275082299">Yıl</translation> <translation id="6016551720757758985">Bir önceki sürüme geri dönüşü sağlayan Powerwash işlemini onaylayın</translation> <translation id="6016809788585079594">Son kez "Ok Google" deyin</translation> @@ -3954,7 +3961,6 @@ <translation id="6276301056778294989">Cihazın aynı kodu gösterdiğinden emin olun.</translation> <translation id="6277105963844135994">Ağ zaman aşımı</translation> <translation id="6277518330158259200">Ekr&an Görüntüsü Al</translation> -<translation id="6278428485366576908">Tema</translation> <translation id="6279183038361895380">İmlecinizi göstermek için |<ph name="ACCELERATOR" />| tuşuna basın</translation> <translation id="6280215091796946657">Farklı bir hesapla oturum aç</translation> <translation id="6280912520669706465">ARC</translation> @@ -4206,6 +4212,7 @@ <translation id="6607272825297743757">Dosya bilgileri</translation> <translation id="6607831829715835317">Diğer araç&lar</translation> <translation id="6608140561353073361">Tüm çerezler ve site verileri...</translation> +<translation id="6610183966322615106">Yazıcı eklenirken hata oluştu</translation> <translation id="6610610633807698299">URL girin...</translation> <translation id="6612358246767739896">Korunan içerik</translation> <translation id="6615455863669487791">Göster</translation> @@ -4269,7 +4276,6 @@ <translation id="6708242697268981054">Kaynak:</translation> <translation id="6709357832553498500"><ph name="EXTENSIONNAME" /> uzantısını kullanarak bağlan</translation> <translation id="6710213216561001401">Önceki</translation> -<translation id="6712158998835983046">Tümünü göster, animasyonlu</translation> <translation id="6718273304615422081">Sıkıştırılıyor...</translation> <translation id="671928215901716392">Kilit ekranı</translation> <translation id="6721972322305477112">&Dosya</translation> @@ -4332,7 +4338,7 @@ <translation id="6815551780062710681">düzenle</translation> <translation id="6817358880000653228">Bu site için kaydedilen şifreler:</translation> <translation id="6820687829547641339">Gzip sıkıştırılmış tar arşivi</translation> -<translation id="682123305478866682">Masaüstünü yayınlayın</translation> +<translation id="682123305478866682">Masaüstünü yayınla</translation> <translation id="6823506025919456619">Cihazlarınızı görebilmek için Chrome'da oturum açmanız gerekir.</translation> <translation id="6824564591481349393">&E-posta Adresini Kopyala</translation> <translation id="6824725898506587159">Dilleri yönetin</translation> @@ -4541,7 +4547,6 @@ <translation id="7088434364990739311">Güncelleme denetimi başlatılamadı (hata kodu <ph name="ERROR" />).</translation> <translation id="708856090370082727">OSK fazla kaydırma desteğini etkinleştirin. Bu işaret etkin olduğunda, OSK yalnızca görsel görünümü yeniden boyutlandırır.</translation> <translation id="7088674813905715446">Bu cihaz, yönetici tarafından "sağlanmıyor" durumuna alınmış. Kayıt için tekrar etkinleştirmek üzere lütfen yöneticinizden cihazı bekleme durumuna almasını isteyin.</translation> -<translation id="7089609847854449639">Depolama yöneticisi</translation> <translation id="708969677220991657">Geçersiz bir sertifika sunulsa dahi HTTPS üzerinden localhost'a yönelik isteklere izin verir.</translation> <translation id="7092106376816104">Pop-up istisnaları</translation> <translation id="7093866338626856921"><ph name="HOSTNAMES" /> adlı cihazlarla veri alışverişi</translation> @@ -4581,7 +4586,7 @@ <translation id="715118844758971915">Klasik yazıcılar</translation> <translation id="7154130902455071009">Başlangıç sayfanızı <ph name="START_PAGE" /> olarak değiştirme</translation> <translation id="7155171745945906037">Kameradan veya dosyadan mevcut fotoğraf</translation> -<translation id="715568033737470079">Win32k tam gizlilik korumalı alan politikasında çalıştırılacak PPAPI eklentilerini belirtin (yalnızca Windows 10 ve üzeri).</translation> +<translation id="7155226869555939647"><ph name="APPLICATION" /> uygulamasına ilişkin bağlantıları her zaman aç</translation> <translation id="7156235233373189579">Bu dosya Windows yazılımı kullanan bilgisayarlar için tasarlanmıştır. Dolayısıyla Chrome OS işletim sistemine sahip cihazınız ile uyumlu değildir. Yerine geçecek uygun bir uygulama için <ph name="BEGIN_LINK" />Chrome Web Mağazası<ph name="END_LINK" />'nda arama yapın.<ph name="BEGIN_LINK_HELP" />Daha fazla bilgi edinin<ph name="END_LINK_HELP" /></translation> <translation id="7157063064925785854">Devam Et'i tıklayarak şunları kabul etmiş olursunuz: <ph name="LEGAL_DOC_LINK_TEXT_1" />, <ph name="LEGAL_DOC_LINK_TEXT_2" />, <ph name="LEGAL_DOC_LINK_TEXT_3" /> ve <ph name="LEGAL_DOC_LINK_TEXT_4" />.</translation> <translation id="7158238151765743968">"<ph name="DEVICE_NAME" />" bağlantısı hâlâ devam ediyor.</translation> @@ -4596,6 +4601,7 @@ <translation id="7175353351958621980">Yükleme kaynağı:</translation> <translation id="7180611975245234373">Yenile</translation> <translation id="7180865173735832675">Özelleştir</translation> +<translation id="7181387261278441780">Siteyi temizle ve sıfırla</translation> <translation id="7185078796915954712">TLS 1.3</translation> <translation id="7185690883425432021">Sekme şeridi yığın modunda olduğunda etkin olmayan sekmelerin kapatma düğmelerini gizler.</translation> <translation id="7186088072322679094">Araç Çubuğunda Tut</translation> @@ -4628,7 +4634,6 @@ <translation id="7223775956298141902">Maalesef hiç uzantınız yok :-(</translation> <translation id="7224023051066864079">Alt ağ maskesi:</translation> <translation id="7225179976675429563">Ağ türü eksik</translation> -<translation id="7230191962699768124">Tümünü göster, animasyonsuz</translation> <translation id="7230787553283372882">Metin boyutunu özelleştir</translation> <translation id="7231224339346098802">Yazdırılacak kopya sayısını göstermek için rakam kullanın (1 veya daha fazla).</translation> <translation id="7238585580608191973">SHA-256 Parmak İzi</translation> @@ -4760,7 +4765,6 @@ <translation id="7409233648990234464">Yeniden başlat ve Powerwash işlemi yap</translation> <translation id="7409836189476010449">Flash öğesi çalıştırmak</translation> <translation id="7410344089573941623"><ph name="HOST" /> sitesi kamerama ve mikrofonuma erişmek isterse sor</translation> -<translation id="7411343637221933631">{NUM_COOKIES,plural, =1{Bu siteden 1 tane}other{Bu siteden # tane}}</translation> <translation id="7412226954991670867">GPU Belleği</translation> <translation id="7416362041876611053">Bilinmeyen ağ hatası.</translation> <translation id="7417453074306512035">Etiyopya dili klavye</translation> @@ -4882,6 +4886,7 @@ <translation id="756445078718366910">Tarayıcı Penceresini Aç</translation> <translation id="7564847347806291057">İşlemi bitir</translation> <translation id="7566723889363720618">F12</translation> +<translation id="7567314848159753396">Çerez: <ph name="NAME" /></translation> <translation id="756809126120519699">Chrome verileri temizlendi</translation> <translation id="7568790562536448087">Güncelleniyor</translation> <translation id="7573172247376861652">Pil Şarjı</translation> @@ -4922,6 +4927,7 @@ <translation id="7626009897377900107">Şifre oluşturma</translation> <translation id="7627262197844840899">Bu sitede MasterCard kabul edilmiyor.</translation> <translation id="7627790789328695202">Hata! <ph name="FILE_NAME" /> zaten mevcut. Yeniden adlandırın ve tekrar deneyin.</translation> +<translation id="7628127343934101653">PDF dosyalarını varsayılan PDF görüntüleyici uygulamasında aç.</translation> <translation id="762917759028004464">Varsayılan tarayıcı şu anda <ph name="BROWSER_NAME" />.</translation> <translation id="7629536005696009600">Android uygulamaları için depolanan kimlik bilgilerinin ilgili web sitelerinde doldurulmasına izin verin.</translation> <translation id="7629827748548208700">Sekme: <ph name="TAB_NAME" /></translation> @@ -5150,6 +5156,7 @@ <translation id="7957513156576779045">Eşlemeye izin vermek için Bluetooth'u açın</translation> <translation id="7957615753207896812">Klavye cihaz ayarlarını aç</translation> <translation id="7959074893852789871">Dosya birden çok sertifika içeriyordu, bunların bazıları içe aktarılmadı:</translation> +<translation id="7959700692661109221"><ph name="BEGIN_PARAGRAPH" />Google'ın konum hizmeti, cihazınızın konumunun daha hızlı ve doğru bir şekilde tahmin edilmesine yardımcı olmak için kablosuz ağlar gibi kaynaklardan yararlanır. Google'ın konum hizmetlerini açtığınızda, cihazınız konum bilgilerini sağlamak için kablosuz ağlardan yararlanan bir moda geçer. Bu modu konum ayarlarından istediğiniz zamana kapatabilirsiniz.<ph name="END_PARAGRAPH" /></translation> <translation id="7961015016161918242">Hiçbir Zaman</translation> <translation id="7964089325405904043">Şifre içe ve dışa aktarma</translation> <translation id="7965010376480416255">Paylaşılan Bellek</translation> @@ -5300,6 +5307,7 @@ <translation id="8146793085009540321">Oturum açma işlemi başarısız oldu. Lütfen yöneticinizle iletişime geçin veya tekrar deneyin.</translation> <translation id="8148264977957212129">Pinyin giriş yöntemi</translation> <translation id="8148913456785123871">Başlatıcıda Google Now kartlarını göster</translation> +<translation id="8150391391298684512">Windows Runtime MIDI API'sini devre dışı bırak</translation> <translation id="8151185429379586178">Geliştirici araçları</translation> <translation id="8151638057146502721">Yapılandır</translation> <translation id="8151639108075998630">Misafir olarak göz atmayı etkinleştir</translation> @@ -5582,6 +5590,7 @@ <translation id="8532294913309524834">Tercihinize dayalı diğer diller.</translation> <translation id="8535005006684281994">Netscape Sertifikası Yenileme URL'si</translation> <translation id="8539727552378197395">Hayır (HttpOnly)</translation> +<translation id="8541084862688000575">Android uygulamalarını otomatik olarak yükle</translation> <translation id="8543181531796978784"><ph name="BEGIN_ERROR_LINK" />Bir tespit sorununu bildirebilir<ph name="END_ERROR_LINK" /> veya güvenliğiniz açısından riskleri anlıyorsanız <ph name="BEGIN_LINK" />güvenli olmayan bu siteyi ziyaret edebilirsiniz<ph name="END_LINK" />.</translation> <translation id="8545107379349809705">Bilgileri gizle...</translation> <translation id="8545211332741562162">Web sayfalarının deneysel JavaScript özelliklerini kullanmasını etkinleştirin.</translation> @@ -5609,7 +5618,6 @@ <translation id="8569764466147087991">Açılacak dosyayı seçin</translation> <translation id="8571032220281885258">"OK Google" dediğinizde, Chrome söyleyeceğiniz bir sonraki ifadeyi arar.</translation> <translation id="8571108619753148184">Sunucu 4</translation> -<translation id="8572832761467613633">Yalnızca Flash</translation> <translation id="8572981282494768930">Sitelerin kamerama ve mikrofonuma erişmelerine izin verme</translation> <translation id="8574234089711453001">Bir sayfayı medya URL'si ile açarken indir düğmesinin gösterilmesine izin verin.</translation> <translation id="857779305329188634">Deneysel QUIC protokol desteğini etkinleştir.</translation> @@ -5631,6 +5639,7 @@ <translation id="8600929685092827187">Paketlerde Uyandır</translation> <translation id="8601206103050338563">TLS WWW İstemci Kimlik Doğrulaması</translation> <translation id="8602851771975208551">Bilgisayarınızdaki başka bir program, Chrome'un çalışma şeklini değiştirebilecek bir uygulama ekledi.</translation> +<translation id="8603912787021349466">Oturum açtıktan sonra Android uygulamalarının otomatik olarak başlatılmasına izin verilir.</translation> <translation id="8605428685123651449">SQLite Belleği</translation> <translation id="8605503133013456784">"<ph name="DEVICE_NAME" />" bağlantısı kesilemiyor ve eşleşmesi kaldırılamıyor.</translation> <translation id="8606726445206553943">MIDI cihazlarınızı kullanma</translation> @@ -5983,6 +5992,7 @@ <translation id="9053965862400494292">Senkronizasyonu ayarlamaya çalışırken bir hata oluştu.</translation> <translation id="9056034633062863292">Chromebox'u güncelleme</translation> <translation id="9056810968620647706">Eşleştirme bulunamadı.</translation> +<translation id="9057119625587205566">Yakın çevrenizde hiç yazıcı yok</translation> <translation id="9059868303873565140">Durum menüsü</translation> <translation id="9064142312330104323">Google Profil fotoğrafı (yükleniyor)</translation> <translation id="9064275926664971810">Formları tek bir tıklamayla doldurmak için Otomatik Doldur özelliğini etkinleştirir</translation> @@ -5993,6 +6003,7 @@ <translation id="9067401056540256169">Bu işaret Chrome'u güvensiz hale getirir. İşareti sadece, ne yaptığını anlıyorsanız kullanın. Bu işaretin herhangi bir bildirimde bulunulmadan kaldırılabileceğini unutmayın. İşaret etkinleştirilirse başlangıç noktası https olan çerçeveler güvenli olmayan bir URL'ye sahip WebSocket'leri kullanabilir (ws://).</translation> <translation id="9068931793451030927">Yol:</translation> <translation id="9070219033670098627">Kişi değiştir</translation> +<translation id="9070940116164932228">Fazla kaynak tüketen arka plan zamanlayıcılarını azalt</translation> <translation id="907148966137935206">Hiçbir sitede pop-up'lara izin verme (önerilen)</translation> <translation id="9072550133391925347"><ph name="PASSWORD_MANAGER_BRAND" />, kaydettiğiniz şifrelerle uygun sitelerde ve uygulamalarda otomatik olarak oturum açmanızı sağlar.</translation> <translation id="9073281213608662541">PAP</translation> @@ -6027,6 +6038,7 @@ <translation id="9112614144067920641">Lütfen yeni bir PIN seçin.</translation> <translation id="9112748030372401671">Duvar kağıdınızı değiştirme</translation> <translation id="9112987648460918699">Bul...</translation> +<translation id="9114663181201435112">Kolayca oturum açın</translation> <translation id="9115487443206954631">Cast cihazlarını yönet</translation> <translation id="9115675100829699941">&Yer İşaretleri</translation> <translation id="9121814364785106365">İğnelenmiş sekme olarak aç</translation> @@ -6121,7 +6133,6 @@ <translation id="952992212772159698">Etkin değil</translation> <translation id="960719561871045870">Operatör kodu</translation> <translation id="960987915827980018">Yaklaşık 1 saat kaldı</translation> -<translation id="962778376131245616">Yalnızca güvenli olmayanları göster, animasyonlu</translation> <translation id="96421021576709873">Kablosuz ağ</translation> <translation id="965490406356730238">Uygun olduğunda, yakalanan çerçevenin donanımla hızlandırılmış mjpeg kod çözümlemesini etkinleştirin.</translation> <translation id="968174221497644223">Uygulama önbelleği</translation>
diff --git a/chrome/app/resources/generated_resources_uk.xtb b/chrome/app/resources/generated_resources_uk.xtb index dbc2c019..d1eb4a2 100644 --- a/chrome/app/resources/generated_resources_uk.xtb +++ b/chrome/app/resources/generated_resources_uk.xtb
@@ -18,7 +18,6 @@ <translation id="1029317248976101138">Збільшити</translation> <translation id="1029595648591494741">Спробувати <ph name="EXTENSION_NAME" />?</translation> <translation id="1031362278801463162">Завантаження попереднього перегляду</translation> -<translation id="1031460590482534116">Під час спроби зберегти сертифікат клієнта виникла помилка. Помилка <ph name="ERROR_NUMBER" /> (<ph name="ERROR_NAME" />).</translation> <translation id="1031573127485938293">Запитувати (згідно з правилом)</translation> <translation id="103279545524624934">Щоб запускати додатки Android, звільніть місце на диску.</translation> <translation id="1033780634303702874">Отримувати доступ до серійних пристроїв</translation> @@ -101,6 +100,7 @@ <translation id="1128591060186966949">Змінити пошукову систему</translation> <translation id="1128987120443782698">Ємність пристрою пам’яті – <ph name="DEVICE_CAPACITY" />. Вставте карту SD чи карту флеш-пам’яті USB ємністю принаймні 4 Гб.</translation> <translation id="1137135726305341424">Правило domContentLoaded і всі завантаження ресурсів, початі до domContentLoaded (основний фрейм та компоненти iframe із того самого джерела).</translation> +<translation id="1138663153846032155">Надавати перевагу HTML перед Flash</translation> <translation id="1140351953533677694">Отримувати доступ до пристроїв Bluetooth і серійних пристроїв</translation> <translation id="114140604515785785">Кореневий каталог розширення:</translation> <translation id="1143142264369994168">Підписувач сертифіката</translation> @@ -252,6 +252,7 @@ <translation id="1351692861129622852">Імпортування файлів (<ph name="FILE_COUNT" />)…</translation> <translation id="1352103415082130575">Тайська клавіатура (паттачоте)</translation> <translation id="1353686479385938207"><ph name="PROVIDER_NAME" />: <ph name="NETWORK_NAME" /></translation> +<translation id="1353946958707294039">Адміністратор пам’яті матеріального дизайну</translation> <translation id="1353966721814789986">Сторінки запуску</translation> <translation id="1354868058853714482">Версія Adobe Reader застаріла й може бути незахищена.</translation> <translation id="1355408554203439639">3D-раструвальник програмного забезпечення</translation> @@ -423,7 +424,6 @@ <translation id="1533920822694388968">Вирівнювання, як ТБ</translation> <translation id="15373452373711364">Великий курсор миші</translation> <translation id="1543284117603151572">Імпортовано з Edge</translation> -<translation id="1544350195767834591">{NUM_COOKIES,plural, =1{1 з інших сайтів}one{# з інших сайтів}few{# з інших сайтів}many{# з інших сайтів}other{# з інших сайтів}}</translation> <translation id="1545177026077493356">Автоматичний режим термінала</translation> <translation id="1545786162090505744">URL-адреса з %s замість запита</translation> <translation id="1546280085599573572">Це розширення змінило сторінку, яка відкривається під час натискання кнопки "Домашня сторінка".</translation> @@ -447,7 +447,6 @@ <translation id="1559235587769913376">Введення символів Unicode</translation> <translation id="1561092721008294962">HarfBuzz для тексту інтерфейсу</translation> <translation id="1566049601598938765">Веб-сайт</translation> -<translation id="1566958206723629112">Flash і PDF</translation> <translation id="1567723158593978621">Якщо ввімкнути цю опцію, у веб-переглядачі діятиме нова процедура входу GAIA з окремими паролями.</translation> <translation id="1567993339577891801">Консоль JavaScript</translation> <translation id="1568323446248056064">Відкрити налаштування дисплея</translation> @@ -576,7 +575,6 @@ <translation id="1723940674997333416">Дозволити незахищений протокол WebSocket із джерел https</translation> <translation id="1725149567830788547">Показати &засоби керування</translation> <translation id="172612876728038702">Триває налаштування модуля TPM. Це може тривати декілька хвилин.</translation> -<translation id="1727135806684246609">Докладна інформація про безпеку в матеріальному дизайні</translation> <translation id="1729533290416704613">Розширення також змінило сторінку, яка відкривається під час пошуку в універсальному вікні пошуку.</translation> <translation id="1731346223650886555">Крапка з комою</translation> <translation id="1731589410171062430">Усього: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /> ( <ph name="NUMBER_OF_PAGES" /> <ph name="PAGE_OR_PAGES_LABEL" /> )</translation> @@ -872,6 +870,7 @@ <translation id="218492098606937156">Увімкнути сенсорні події</translation> <translation id="2187317261103489799">Визначати (за умовчанням)</translation> <translation id="2187895286714876935">Помилка імпортування сертифіката сервера</translation> +<translation id="2188881192257509750">Відкрити <ph name="APPLICATION" /></translation> <translation id="2190069059097339078">Засіб отримання облікових даних Wi-Fi</translation> <translation id="219008588003277019">Модуль Native Client: <ph name="NEXE_NAME" /></translation> <translation id="2190355936436201913">(пусто)</translation> @@ -990,6 +989,7 @@ <translation id="2326606747676847821">Відкрити в анонімному вікні</translation> <translation id="2326931316514688470">&Перезавантажити додаток</translation> <translation id="2327492829706409234">Увімкнути програму</translation> +<translation id="2328054044222305089">Буде видалено всі дані веб-сайту "<ph name="SITE" />" на пристрої та скинуто надані вами дозволи. Продовжити?</translation> <translation id="2329597144923131178">Увійдіть, щоб мати доступ до закладок, історії, паролів та інших налаштувань на всіх своїх пристроях.</translation> <translation id="2332131598580221120">Переглянути в магазині</translation> <translation id="2332742915001411729">Відновити масштаб за умовчанням</translation> @@ -1265,7 +1265,6 @@ <translation id="2675358154061544447">Експериментальна підтримка відтворення міжсайтових елементів iframe в окремих процесах. У цьому режимі документи мають спільний процес відтворення, лише якщо вони з одного веб-сайту.</translation> <translation id="2676946222714718093">Відтворюється на пристрої</translation> <translation id="2678063897982469759">Знову ввімкнути</translation> -<translation id="2678246812096664977">Усі плагіни</translation> <translation id="2679385451463308372">Друкувати за допомогою діалогового вікна системи...</translation> <translation id="2680208403056680091">Ваше з’єднання з Інтернетом контролюється</translation> <translation id="268053382412112343">Іс&торія</translation> @@ -1439,7 +1438,6 @@ <translation id="287286579981869940">Додати <ph name="PROVIDER_NAME" />…</translation> <translation id="2872961005593481000">Завершити роботу</translation> <translation id="2875698561019555027">(сторінки Chrome із повідомленням про помилку)</translation> -<translation id="2879560882721503072">Сертифікат клієнта, виданий <ph name="ISSUER" />, успішно збережено.</translation> <translation id="288024221176729610">Чеська</translation> <translation id="288042212351694283">Доступ до ваших пристроїв Universal 2nd Factor</translation> <translation id="2881966438216424900">Дата останнього доступу:</translation> @@ -1588,6 +1586,7 @@ <translation id="3057861065630527966">Створити резервні копії фотографій і відео</translation> <translation id="3058212636943679650">Щоб відновити операційну систему комп’ютера, вам знадобиться карта SD чи карта флеш-пам’яті USB для відновлення.</translation> <translation id="305932878998873762">Simple Cache для HTTP – це новий кеш. Він виконує розподіл місця на диску, використовуючи файлову систему.</translation> +<translation id="3060251871394327123">Буде видалено всі дані веб-сайту "<ph name="SITE" />" на пристрої. Продовжити?</translation> <translation id="3061650404498811439">Увімкнути доступ до смайлів, рукописного та голосового введення в меню IME.</translation> <translation id="3062606427884046423">Використовувати сповіщення Android MediaStyle для медійних сповіщень у Chrome.</translation> <translation id="3063844757726132584">Відкривайте всі свої додатки з цієї зручної панелі запуску. Грайте в ігри, спілкуйтеся у відеочатах, слухайте музику, редагуйте документи та завантажуйте інші додатки.</translation> @@ -1637,6 +1636,7 @@ <translation id="3123569374670379335">(контрольований)</translation> <translation id="3124111068741548686">Обробка КОРИСТУВАЧА</translation> <translation id="3126026824346185272">Ctrl</translation> +<translation id="3127156390846601284">Буде видалено всі дані вказаних веб-сайтів на пристрої. Продовжити?</translation> <translation id="312759608736432009">Виробник пристрою:</translation> <translation id="3127919023693423797">Автентифікація...</translation> <translation id="3128230619496333808">Вкладка 6</translation> @@ -1735,7 +1735,6 @@ <translation id="3264544094376351444">Шрифт Sans-serif</translation> <translation id="3264547943200567728">Не вдалося налаштувати мережу Chromebox</translation> <translation id="3265459715026181080">Закрити вікно</translation> -<translation id="3267271790328635957">Лише PDF</translation> <translation id="3267726687589094446">Надалі дозволяти автоматичне завантаження декількох файлів</translation> <translation id="3267998849713137817">Змінений час</translation> <translation id="3268451620468152448">Відкриті вкладки</translation> @@ -1981,6 +1980,7 @@ <translation id="3574210789297084292">увійти</translation> <translation id="3574305903863751447"><ph name="CITY" />, <ph name="STATE" /> <ph name="COUNTRY" /></translation> <translation id="357479282490346887">Литовська</translation> +<translation id="3575927481544652747">Вимикає API Windows Runtime MIDI для WebMIDI, увімкнене за умовчанням в ОС Windows 10 або пізніших версій.</translation> <translation id="3576324189521867626">Установлено</translation> <translation id="3578331450833904042">За умовчанням (слухати всі звуки)</translation> <translation id="3578594933904494462">До вмісту цієї вкладки надано доступ.</translation> @@ -2034,8 +2034,6 @@ <translation id="3627320433825461852">Залишилося менше 1 хв.</translation> <translation id="3627588569887975815">Відкрити посилання в аноні&мному вікні</translation> <translation id="3627671146180677314">Час відновлення сертифіката Netscape</translation> -<translation id="3629326610814700057">Дозволяє адміністратору пам’яті керувати локальною пам’яттю.</translation> -<translation id="3630337581925712713"><ph name="PERMISSION_TYPE_LABEL" />:</translation> <translation id="3631337165634322335">Указані нижче винятки застосовуються лише до поточного сеансу в режимі анонімного перегляду.</translation> <translation id="3633586230741134985">Налаштування панелі запуску програм</translation> <translation id="3633997706330212530">За бажанням ці служби можна вимкнути.</translation> @@ -2058,7 +2056,8 @@ <translation id="3654045516529121250">Переглядати налаштування доступності</translation> <translation id="3654092442379740616">Помилка синхронізації. Версія <ph name="PRODUCT_NAME" /> застаріла та потребує оновлення.</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{Має постійний доступ до одного файлу.}one{Має постійний доступ до # файлу.}few{Має постійний доступ до # файлів.}many{Має постійний доступ до # файлів.}other{Має постійний доступ до # файлу.}}</translation> -<translation id="3657468915905674858">Увімкнути блокування PPAPI Win32k.</translation> +<translation id="365793796291733849"><ph name="BEGIN_PARAGRAPH1" />Якщо ви ввімкнули автоматичне резервне копіювання, дані пристрою та додатка періодично зберігатимуться в приватній папці на Google Диску. Дані додатка – це будь-які дані, збережені додатком (відповідно до налаштувань розробника), зокрема потенційно конфіденційна інформація, як-от контакти, повідомлення та фотографії.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Резервні копії даних не займають місце на Диску. Великі файли або файли, які розробники не включили в цю службу, не копіюються.<ph name="END_PARAGRAPH2" /></translation> <translation id="3660234220361471169">Ненадійні</translation> <translation id="3665589677786828986">Chrome виявив, що інша програма пошкодила деякі ваші налаштування, і відновив початкові налаштування за умовчанням.</translation> <translation id="3665842570601375360">Безпека:</translation> @@ -2113,6 +2112,7 @@ <translation id="3733127536501031542">SSL-сервер із підвищенням</translation> <translation id="3736520371357197498">Якщо ви розумієте ризики, пов’язані з безпекою, <ph name="BEGIN_LINK" />перейдіть на цей ненадійний сайт<ph name="END_LINK" /> до того, як небезпечні програми буде видалено.</translation> <translation id="3738924763801731196"><ph name="OID" />:</translation> +<translation id="3739254215541673094">Відкрити додаток <ph name="APPLICATION" />?</translation> <translation id="3739798227959604811">Затримка перед повтором:</translation> <translation id="3741158646617793859"><ph name="DEVICE_NAME" /> тепер відображатиметься в Консолі адміністратора</translation> <translation id="3741243925913727067">Створення резервних копій фотографій і відео з носія на Google Диску.</translation> @@ -2351,7 +2351,6 @@ <translation id="4058793769387728514">Перевірити документ зараз</translation> <translation id="4059285154003114015">&Друкувати фрейм…</translation> <translation id="406070391919917862">Фонові програми</translation> -<translation id="4061502419206152498">Показувати лише незахищені та неанімовані</translation> <translation id="4062251648694601778">Маєте запитання? Перегляньте довідку, натиснувши знак "?" на панелі статусу. Насолоджуйтеся своїм пристроєм <ph name="SHORT_PRODUCT_NAME" />.</translation> <translation id="4065876735068446555">Можливо, щоб під’єднатися до цієї мережі (<ph name="NETWORK_ID" />), потрібно відвідати її сторінку входу.</translation> <translation id="4068506536726151626">Ця сторінка містить елементи з таких сайтів, які відстежують ваше місцезнаходження:</translation> @@ -2390,7 +2389,6 @@ <translation id="4101878899871018532">Диспетчер паролів не пропонуватиме зберегти облікові дані, які використовувалися для синхронізації.</translation> <translation id="410351446219883937">Автовідтворення</translation> <translation id="4104163789986725820">Е&кспортувати...</translation> -<translation id="4105523032910086267">Налаштовує анімацію та видимість докладної інформації про безпеку в матеріальному дизайні.</translation> <translation id="4105563239298244027">Отримайте безкоштовно 1 Тб на Диску Google</translation> <translation id="4109135793348361820">Перемістити вікно на робочий стіл користувача <ph name="USER_NAME" /> (<ph name="USER_EMAIL" />)</translation> <translation id="4110342520124362335">Файли cookie з домену <ph name="DOMAIN" /> заблоковано.</translation> @@ -2441,6 +2439,7 @@ <translation id="418179967336296930">Російська фонетична клавіатура (YaZHert)</translation> <translation id="4181841719683918333">Мови</translation> <translation id="4187248015940562149">Буде ввімкнено Web Bluetooth. Веб-сайти зможуть під’єднуватися до пристроїв Bluetooth поблизу та керувати ними.</translation> +<translation id="4188447344915957833">Вмикає адміністратора пам’яті в налаштуваннях матеріального дизайну.</translation> <translation id="4189406272289638749">Розширення <b><ph name="EXTENSION_NAME" /></b> контролює це налаштування.</translation> <translation id="4193154014135846272">Документ Google</translation> <translation id="4193182321948161343">Увімкнути матеріальний дизайн диспетчера користувачів</translation> @@ -2648,6 +2647,7 @@ <translation id="4508765956121923607">Переглянути д&жерело</translation> <translation id="4509017836361568632">Відхилити фото</translation> <translation id="4509345063551561634">:</translation> +<translation id="4513946894732546136">Відгуки</translation> <translation id="4514542542275172126">Створити нового контрольованого користувача</translation> <translation id="4514914692061505365">Примусово використовувати швидкий транслятор Subzero від PNaCl для всіх файлів pexe.</translation> <translation id="451515744433878153">Видалити</translation> @@ -2746,6 +2746,7 @@ <translation id="4656293982926141856">На цьому комп’ютері</translation> <translation id="4656631038341342120">Увімкнути оболонку віртуальної реальності, якщо вона доступна для цього пристрою.</translation> <translation id="4657031070957997341">Завжди дозволяти плагіни на хості <ph name="HOST" /></translation> +<translation id="466008749075469935">Вмикає втручання для обмеження використання центральним процесором таймерів у фоновому режимі до 1%.</translation> <translation id="4663254525753315077">Якщо можливо, переносить прокручуваний вміст із переповненого прокручуваного елемента на рівень компонування для швидшого прокручування.</translation> <translation id="4664482161435122549">Помилка експортування PKCS #12</translation> <translation id="4665014895760275686">Виробник</translation> @@ -2814,6 +2815,7 @@ <translation id="4749157430980974800">Грузинська клавіатура</translation> <translation id="4750394297954878236">Пропозиції</translation> <translation id="475088594373173692">Перший користувач</translation> +<translation id="4750892496809949692">Надавати перевагу вмісту HTML, приховуючи Flash у списку плагінів.</translation> <translation id="4750917950439032686">Ваша інформація (як-от паролі та номери кредитних карток) залишається конфіденційною, коли надсилається на цей сайт.</translation> <translation id="4753602155423695878">Анімація смуги завантаження сторінки на телефоні Android</translation> <translation id="4755240240651974342">Фінська розкладка</translation> @@ -3088,6 +3090,7 @@ <translation id="5119450342834678097">Опція запиту сайту для планшета в меню налаштувань</translation> <translation id="5120068803556741301">Метод введення від сторонніх розробників</translation> <translation id="5120421890733714118">Довіряйте цьому сертифікату для ідентифікації веб-сайтів.</translation> +<translation id="5120516977819314347">Неправильний PIN-код або пароль.</translation> <translation id="5121130586824819730">Ваш жорсткий диск заповнено. Збережіть в іншому місці чи звільніть місце на цьому жорстоку диску.</translation> <translation id="5125751979347152379">Недійсна URL-адреса.</translation> <translation id="5127881134400491887">Керувати мережевими з’єднаннями</translation> @@ -3095,6 +3098,7 @@ <translation id="512903556749061217">підключено</translation> <translation id="5129301143853688736">Ваше з’єднання з цим сайтом не конфіденційне. Зловмисники можуть намагатися викрасти ваші дані з домену <ph name="DOMAIN" /> (зокрема фотографії, паролі, повідомлення та дані кредитних карток).</translation> <translation id="5129662217315786329">Польська</translation> +<translation id="5131347545782851480">Документи PDF</translation> <translation id="5134856901811723984">Матеріальний дизайн в інтерфейсі ОС Chrome</translation> <translation id="5135533361271311778">Не вдалося створити закладку.</translation> <translation id="5136529877787728692">F7</translation> @@ -3263,6 +3267,7 @@ <translation id="5328031682234198929">8</translation> <translation id="5329858601952122676">&Видалити</translation> <translation id="5330145655348521461">Ці файли відкрито на іншому комп’ютері. Перейдіть до <ph name="USER_NAME" /> (<ph name="MAIL_ADDRESS" />), щоб переглянути їх.</translation> +<translation id="5330512191124428349">Отримати інформацію</translation> <translation id="5332624210073556029">Часовий пояс:</translation> <translation id="5333807720589685258">Вашу SIM-карту буде назавжди заблоковано, якщо ви не введете правильний ключ для розблокування PIN-коду.</translation> @@ -3695,7 +3700,6 @@ <translation id="5892507820957994680">Замінює вбудований список програмної візуалізації та вмикає прискорення графічного процесора на непідтримуваних налаштуваннях системи.</translation> <translation id="5895138241574237353">Перезапустити</translation> <translation id="5895187275912066135">Дата видачі</translation> -<translation id="5898154795085152510">Сервер повідомив про недійсний сертифікат клієнта. Помилка <ph name="ERROR_NUMBER" /> (<ph name="ERROR_NAME" />).</translation> <translation id="5900302528761731119">Фото профілю Googlе</translation> <translation id="590253956165195626">Пропонувати переклад сторінок, якщо їх мова відрізняється від мови у веб-переглядачі.</translation> <translation id="5904093760909470684">Конфігурація проксі-сервера</translation> @@ -3750,6 +3754,8 @@ <translation id="5984222099446776634">Нещодавно відвідані</translation> <translation id="5984814259619230127">Smart Lock для виявлення пристроїв за допомогою енергоощадної технології Bluetooth</translation> <translation id="5986245990306121338">Якщо ввімкнути цю опцію, перемикач вкладок відображатиметься, навіть якщо в налаштуваннях увімкнено параметр "Об’єднати вкладки та додатки".</translation> +<translation id="5989712527536636369"><ph name="BEGIN_PARAGRAPH1" />Це загальна інформація про пристрій і те, як ви його використовуєте, як-от про рівень заряду, частоту використання додатків, якість та тривалість з’єднань із мережею (наприклад, Wi-Fi та Bluetooth), а також звіти про аварійне завершення роботи, коли щось не працює належним чином. Ці дані використовуватимуться для покращення продуктів і служб Google. Деяка сукупна інформація допомагає нашим партнерам, зокрема розробникам Android, удосконалювати свої додатки та продукти.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Ви можете будь-коли ввімкнути або вимкнути цю функцію в налаштуваннях додатків Android. Пристрій усе одно зможе надсилати інформацію, потрібну для отримання важливих послуг, як-от оновлень системи та засобів безпеки.<ph name="END_PARAGRAPH2" /></translation> <translation id="5990198433782424697">Розширення на URL-адресах chrome://</translation> <translation id="5990814808592353318">Генерування пароля вручну.</translation> <translation id="5991049340509704927">Збільшити</translation> @@ -3763,6 +3769,7 @@ <translation id="6005695835120147974">Маршрутизатор медіавмісту</translation> <translation id="6007237601604674381">Помилка переміщення. <ph name="ERROR_MESSAGE" /></translation> <translation id="6008241731410823808">Надсилати запити ping для перевірки гіперпосилань.</translation> +<translation id="6011449291337289699">Очистити дані веб-сайту</translation> <translation id="6015796118275082299">Рік</translation> <translation id="6016551720757758985">Підтвердити Powerwash і повернення до попередньої версії</translation> <translation id="6016809788585079594">Скажіть "Ok Google" востаннє</translation> @@ -3952,7 +3959,6 @@ <translation id="6276301056778294989">Переконайтеся, що на пристрої показано такий самий код.</translation> <translation id="6277105963844135994">Час очікування мережі минув</translation> <translation id="6277518330158259200">З&робити знімок екрана</translation> -<translation id="6278428485366576908">Тема</translation> <translation id="6279183038361895380">Натисніть |<ph name="ACCELERATOR" />|, щоб побачити курсор</translation> <translation id="6280215091796946657">Увійти в інший обліковий запис</translation> <translation id="6280912520669706465">ARC</translation> @@ -4204,6 +4210,7 @@ <translation id="6607272825297743757">Інформація про файл</translation> <translation id="6607831829715835317">Інші інстру&менти</translation> <translation id="6608140561353073361">Усі файли cookie та дані із сайтів...</translation> +<translation id="6610183966322615106">Помилка додавання принтера</translation> <translation id="6610610633807698299">Вводити URL-адресу...</translation> <translation id="6612358246767739896">Захищений вміст</translation> <translation id="6615455863669487791">Показати</translation> @@ -4267,7 +4274,6 @@ <translation id="6708242697268981054">Джерело:</translation> <translation id="6709357832553498500">Під’єднатися за допомогою розширення <ph name="EXTENSIONNAME" /></translation> <translation id="6710213216561001401">Попереднє</translation> -<translation id="6712158998835983046">Показувати всі анімовані</translation> <translation id="6718273304615422081">Архівування…</translation> <translation id="671928215901716392">Блокування екрана</translation> <translation id="6721972322305477112">&Файл</translation> @@ -4474,7 +4480,7 @@ <translation id="7010160495478792664">Декодування відео з апаратним прискоренням, якщо це можливо.</translation> <translation id="7010400591230614821">Агресивна стратегія закривання вкладок</translation> <translation id="701080569351381435">Переглянути джерело</translation> -<translation id="7012372675181957985">У вашому обліковому записі Google на сторінці <ph name="BEGIN_LINK" />history.google.com<ph name="END_LINK" /> можуть бути інші форми історії веб-перегляду</translation> +<translation id="7012372675181957985">Історія веб-перегляду також може зберігатися у вашому обліковому записі Google на сторінці <ph name="BEGIN_LINK" />history.google.com<ph name="END_LINK" /></translation> <translation id="7012435537548305893">У режимі дотику розгортає список додатків на весь екран.</translation> <translation id="7013485839273047434">Інші розширення</translation> <translation id="7014174261166285193">Помилка встановлення.</translation> @@ -4540,7 +4546,6 @@ <translation id="7088434364990739311">Не вдалося запустити перевірку наявності оновлень (код помилки: <ph name="ERROR" />).</translation> <translation id="708856090370082727">Увімкнути підтримку прокручування екранної клавіатури. Якщо вибрати цю опцію, зміниться лише розмір візуальної області перегляду.</translation> <translation id="7088674813905715446">Адміністратор активував на цьому пристрої стан деініціалізації. Щоб увімкнути його для реєстрації, попросіть адміністратора перевести пристрій у стан очікування.</translation> -<translation id="7089609847854449639">Адміністратор пам’яті</translation> <translation id="708969677220991657">Дає змогу надсилати запити в локальний хост через протокол HTTPS, навіть якщо надано недійсний сертифікат.</translation> <translation id="7092106376816104">Винятки для спливаючих вікон</translation> <translation id="7093866338626856921">Обмінюватися даними з пристроями з назвами: <ph name="HOSTNAMES" /></translation> @@ -4580,7 +4585,7 @@ <translation id="715118844758971915">Типові принтери</translation> <translation id="7154130902455071009">Зробити <ph name="START_PAGE" /> домашньою сторінкою</translation> <translation id="7155171745945906037">Наявні фотографії з камери або файлу</translation> -<translation id="715568033737470079">Визначення плагінів PPAPI, які запускатимуться під час виконання тестового правила блокування Win32k (лише для Windows 10 і новіших версій).</translation> +<translation id="7155226869555939647">Завжди відкривати посилання для додатка <ph name="APPLICATION" /></translation> <translation id="7156235233373189579">Цей файл створено для ПК, на яких використовується програмне забезпечення Windows. Він несумісний із вашим пристроєм, оскільки на ньому встановлено ОС Chrome. Знайдіть відповідний додаток у <ph name="BEGIN_LINK" />Веб-магазині Chrome<ph name="END_LINK" />.<ph name="BEGIN_LINK_HELP" />Докладніше<ph name="END_LINK_HELP" /></translation> <translation id="7157063064925785854">Натискаючи "Продовжити", ви приймаєте такі документи: <ph name="LEGAL_DOC_LINK_TEXT_1" />, <ph name="LEGAL_DOC_LINK_TEXT_2" />, <ph name="LEGAL_DOC_LINK_TEXT_3" /> і <ph name="LEGAL_DOC_LINK_TEXT_4" />.</translation> <translation id="7158238151765743968">Під’єднання до пристрою "<ph name="DEVICE_NAME" />" досі триває.</translation> @@ -4595,6 +4600,7 @@ <translation id="7175353351958621980">Завантажено з:</translation> <translation id="7180611975245234373">Оновити</translation> <translation id="7180865173735832675">Налаштувати</translation> +<translation id="7181387261278441780">Очистити та скинути дані веб-сайту</translation> <translation id="7185078796915954712">TLS 1.3</translation> <translation id="7185690883425432021">Кнопка "Закрити" на неактивних вкладках ховається, коли для панелі вкладок увімкнено режим накладання.</translation> <translation id="7186088072322679094">Залишити на панелі інструментів</translation> @@ -4627,7 +4633,6 @@ <translation id="7223775956298141902">Шкода... У вас немає жодного розширення :-(</translation> <translation id="7224023051066864079">Маска підмережі:</translation> <translation id="7225179976675429563">Відсутній тип мережі</translation> -<translation id="7230191962699768124">Показувати всі неанімовані</translation> <translation id="7230787553283372882">Налаштувати розмір тексту</translation> <translation id="7231224339346098802">Використовуйте число, щоб указати кількість копій для друку (1 або більше).</translation> <translation id="7238585580608191973">Відбиток SHA-256</translation> @@ -4759,7 +4764,6 @@ <translation id="7409233648990234464">Перезапустити й виконати Powerwash</translation> <translation id="7409836189476010449">Запускати Flash</translation> <translation id="7410344089573941623">Запитувати, якщо хост <ph name="HOST" /> хоче отримати доступ до ваших камери та мікрофона</translation> -<translation id="7411343637221933631">{NUM_COOKIES,plural, =1{1 з цього сайту}one{# з цього сайту}few{# з цього сайту}many{# з цього сайту}other{# з цього сайту}}</translation> <translation id="7412226954991670867">Пам’ять GPU</translation> <translation id="7416362041876611053">Невідома помилка мережі.</translation> <translation id="7417453074306512035">Ефіопська клавіатура</translation> @@ -4881,6 +4885,7 @@ <translation id="756445078718366910">Відкрити вікно веб-переглядача</translation> <translation id="7564847347806291057">Завершити процес</translation> <translation id="7566723889363720618">F12</translation> +<translation id="7567314848159753396">Файл cookie: "<ph name="NAME" />"</translation> <translation id="756809126120519699">Дані Chrome видалено</translation> <translation id="7568790562536448087">Оновлення</translation> <translation id="7573172247376861652">Заряджання акумулятора</translation> @@ -4921,6 +4926,7 @@ <translation id="7626009897377900107">Генерування пароля</translation> <translation id="7627262197844840899">Цей сайт не приймає картки MasterCard.</translation> <translation id="7627790789328695202">Файл "<ph name="FILE_NAME" />" вже існує. Перейменуйте його та повторіть спробу.</translation> +<translation id="7628127343934101653">Відкривати файли PDF в додатку для перегляду файлів PDF за умовчанням.</translation> <translation id="762917759028004464">Наразі переглядачем за умовчанням є <ph name="BROWSER_NAME" />.</translation> <translation id="7629536005696009600">Дозволити вводити облікові дані додатків Android на відповідних веб-сайтах.</translation> <translation id="7629827748548208700">Вкладка: <ph name="TAB_NAME" /></translation> @@ -5149,6 +5155,7 @@ <translation id="7957513156576779045">Щоб підключити, увімкніть Bluetooth</translation> <translation id="7957615753207896812">Відкрити налаштування клавіатури</translation> <translation id="7959074893852789871">Файл містив декілька сертифікатів, деякі з яких не було імпортовано:</translation> +<translation id="7959700692661109221"><ph name="BEGIN_PARAGRAPH" />Служба локації Google використовує такі джерела як Wi-Fi, щоб швидше й точніше визначати місцезнаходження пристрою. Коли ви вмикаєте службу локації Google, пристрій переходить у режим, який використовує Wi-Fi для надання даних про місцезнаходження. Цей параметр можна будь-коли вимкнути в налаштуваннях.<ph name="END_PARAGRAPH" /></translation> <translation id="7961015016161918242">Ніколи</translation> <translation id="7964089325405904043">Імпорт і експорт паролів</translation> <translation id="7965010376480416255">Спільна пам’ять</translation> @@ -5299,6 +5306,7 @@ <translation id="8146793085009540321">Помилка під час входу. Зв’яжіться з адміністратором або повторіть спробу.</translation> <translation id="8148264977957212129">Метод введення для стандарту піньїнь китайської мови</translation> <translation id="8148913456785123871">Показувати підказки Google Асистента на панелі запуску</translation> +<translation id="8150391391298684512">Вимкнути API Windows Runtime MIDI</translation> <translation id="8151185429379586178">Інструменти розробника</translation> <translation id="8151638057146502721">Налаштувати</translation> <translation id="8151639108075998630">Увімкнути перегляд у режимі гостя</translation> @@ -5579,6 +5587,7 @@ <translation id="8532294913309524834">Мови замовлень на основі ваших налаштувань.</translation> <translation id="8535005006684281994">URL-адреса відновлення сертифікатів Netscape</translation> <translation id="8539727552378197395">Ні (HttpOnly)</translation> +<translation id="8541084862688000575">Завантажувати додатки Android автоматично</translation> <translation id="8543181531796978784">Ви можете <ph name="BEGIN_ERROR_LINK" />повідомити про проблему з пошуком<ph name="END_ERROR_LINK" /> або <ph name="BEGIN_LINK" />перейти на цей незахищений сайт<ph name="END_LINK" /> (якщо розумієте, наскільки це небезпечно).</translation> <translation id="8545107379349809705">Сховати інформацію...</translation> <translation id="8545211332741562162">Дозволити веб-сторінкам використовувати експериментальні функції JavaScript.</translation> @@ -5606,7 +5615,6 @@ <translation id="8569764466147087991">Виберіть файл, який потрібно відкрити</translation> <translation id="8571032220281885258">Коли ви скажете "OK Google", Chrome шукатиме те, що ви скажете далі.</translation> <translation id="8571108619753148184">Сервер 4</translation> -<translation id="8572832761467613633">Лише Flash</translation> <translation id="8572981282494768930">Заборонити сайтам отримувати доступ до вашої камери та мікрофону</translation> <translation id="8574234089711453001">Показувати кнопку "Завантажити", коли відкривається сторінка з URL-адресою медіафайлу.</translation> <translation id="857779305329188634">Увімкнути підтримку експериментального протоколу QUIC.</translation> @@ -5628,6 +5636,7 @@ <translation id="8600929685092827187">Прокидатися в разі отримання пакетів</translation> <translation id="8601206103050338563">Автентифікація клієнта TLS WWW</translation> <translation id="8602851771975208551">Інша програма на вашому комп’ютері додала програму, яка може змінити роботу Chrome.</translation> +<translation id="8603912787021349466">Дозволяє додаткам Android запускатися автоматично після входу</translation> <translation id="8605428685123651449">Пам’ять SQLite</translation> <translation id="8605503133013456784">Не вдалося від’єднатися від пристрою "<ph name="DEVICE_NAME" />" і скасувати з ним пару.</translation> <translation id="8606726445206553943">Використовувати ваші пристрої MIDI</translation> @@ -5980,6 +5989,7 @@ <translation id="9053965862400494292">Під час налаштування синхронізації сталася помилка.</translation> <translation id="9056034633062863292">Оновлення Chromebox</translation> <translation id="9056810968620647706">Збігів не знайдено.</translation> +<translation id="9057119625587205566">Немає принтерів поблизу</translation> <translation id="9059868303873565140">Меню стану</translation> <translation id="9064142312330104323">Фото профілю Google (завантаження)</translation> <translation id="9064275926664971810">Увімкнути "Автозаповнення", щоб заповнювати форми одним кліком</translation> @@ -5990,6 +6000,7 @@ <translation id="9067401056540256169">Цей параметр робить Chrome незахищеним. Використовуйте його, лише якщо розумієте, що він робить. Зауважте, що цей параметр може бути вимкнено без попередження. Якщо ввімкнути його, фрейми з джерел https можуть використовувати протокол WebSocket із незахищеною URL-адресою (ws://).</translation> <translation id="9068931793451030927">Путь:</translation> <translation id="9070219033670098627">Змінити користувача</translation> +<translation id="9070940116164932228">Регулювати дорогі таймери у фоновому режимі</translation> <translation id="907148966137935206">Заборонити всім сайтам відображати спливаючі вікна (рекомендовано)</translation> <translation id="9072550133391925347"><ph name="PASSWORD_MANAGER_BRAND" /> зберігає ваші паролі й автоматично входить в облікові записи на сайтах і в додатках.</translation> <translation id="9073281213608662541">PAP</translation> @@ -6023,6 +6034,7 @@ <translation id="9112614144067920641">Виберіть новий PIN-код</translation> <translation id="9112748030372401671">Змінювати фоновий малюнок</translation> <translation id="9112987648460918699">Знайти...</translation> +<translation id="9114663181201435112">Простий вхід</translation> <translation id="9115487443206954631">Керування пристроями Cast</translation> <translation id="9115675100829699941">&Закладки</translation> <translation id="9121814364785106365">Відкрити як закріплену вкладку</translation> @@ -6117,7 +6129,6 @@ <translation id="952992212772159698">Не активовано</translation> <translation id="960719561871045870">Код оператора</translation> <translation id="960987915827980018">Залишилася приблизно 1 год.</translation> -<translation id="962778376131245616">Показувати лише незахищені й анімовані</translation> <translation id="96421021576709873">Мережа Wi-Fi</translation> <translation id="965490406356730238">Коли доступно, вмикати для записаного кадру декодер mjpeg з апаратним прискоренням.</translation> <translation id="968174221497644223">Кеш програми</translation>
diff --git a/chrome/app/resources/generated_resources_vi.xtb b/chrome/app/resources/generated_resources_vi.xtb index cee0c17..9e65979 100644 --- a/chrome/app/resources/generated_resources_vi.xtb +++ b/chrome/app/resources/generated_resources_vi.xtb
@@ -18,7 +18,6 @@ <translation id="1029317248976101138">Thu phóng</translation> <translation id="1029595648591494741">Dùng thử "<ph name="EXTENSION_NAME" />"?</translation> <translation id="1031362278801463162">Đang tải chế độ xem trước</translation> -<translation id="1031460590482534116">Đã xảy ra lỗi khi cố gắng lưu trữ chứng chỉ máy khách. Lỗi <ph name="ERROR_NUMBER" /> (<ph name="ERROR_NAME" />).</translation> <translation id="1031573127485938293">Yêu cầu (bởi chính sách)</translation> <translation id="103279545524624934">Giải phóng dung lượng ổ đĩa để khởi chạy ứng dụng Android.</translation> <translation id="1033780634303702874">Truy cập thiết bị tuần tự của bạn</translation> @@ -101,6 +100,7 @@ <translation id="1128591060186966949">Chỉnh sửa công cụ tìm kiếm</translation> <translation id="1128987120443782698">Thiết bị lưu trữ có dung lượng <ph name="DEVICE_CAPACITY" />. Vui lòng lắp thẻ SD hoặc thẻ nhớ USB có dung lượng ít nhất 4GB.</translation> <translation id="1137135726305341424">domContentLoaded và tất cả các lượt tải tài nguyên đã bắt đầu trước domContentLoaded (khung chính và các iframe gốc tương tự).</translation> +<translation id="1138663153846032155">Thích HTML hơn Flash</translation> <translation id="1140351953533677694">Truy cập thiết bị tuần tự và Bluetooth của bạn</translation> <translation id="114140604515785785">Thư mục gốc của tiện ích:</translation> <translation id="1143142264369994168">Người ký Chứng chỉ</translation> @@ -252,6 +252,7 @@ <translation id="1351692861129622852">Đang nhập <ph name="FILE_COUNT" /> tệp...</translation> <translation id="1352103415082130575">Bàn phím tiếng Thái (Pattachote)</translation> <translation id="1353686479385938207"><ph name="PROVIDER_NAME" />: <ph name="NETWORK_NAME" /></translation> +<translation id="1353946958707294039">Trình quản lý bộ nhớ Material Design</translation> <translation id="1353966721814789986">Trang khởi động</translation> <translation id="1354868058853714482">Adobe Reader đã lỗi thời và có thể không an toàn.</translation> <translation id="1355408554203439639">Bộ quét trên phần mềm 3D</translation> @@ -424,7 +425,6 @@ <translation id="1533920822694388968">Căn chỉnh TV</translation> <translation id="15373452373711364">Con trỏ chuột lớn</translation> <translation id="1543284117603151572">Được nhập từ Edge</translation> -<translation id="1544350195767834591">{NUM_COOKIES,plural, =1{1 từ các trang web khác}other{# từ các trang web khác}}</translation> <translation id="1545177026077493356">Chế độ kiosk tự động</translation> <translation id="1545786162090505744">URL có %s thay thế truy vấn</translation> <translation id="1546280085599573572">Tiện ích này đã thay đổi trang nào sẽ hiển thị khi bạn nhấp vào nút Trang chủ.</translation> @@ -448,7 +448,6 @@ <translation id="1559235587769913376">Nhập các ký tự Unicode</translation> <translation id="1561092721008294962">HarfBuzz dành cho văn bản giao diện người dùng</translation> <translation id="1566049601598938765">Trang web</translation> -<translation id="1566958206723629112">Flash và PDF</translation> <translation id="1567723158593978621">Khi được bật, quá trình đăng nhập vào trình duyệt sẽ sử dụng luồng đăng nhập phân cách bằng mật khẩu gaia mới.</translation> <translation id="1567993339577891801">Bảng điều khiển JavaScript</translation> <translation id="1568323446248056064">Mở cài đặt thiết bị hiển thị</translation> @@ -577,7 +576,6 @@ <translation id="1723940674997333416">Cho phép WebSocket không an toàn từ nguồn gốc https</translation> <translation id="1725149567830788547">Hiển thị &Kiểm soát</translation> <translation id="172612876728038702">Đang cài đặt TPM. Vui lòng đợi; thao tác này có thể mất vài phút.</translation> -<translation id="1727135806684246609">Chi tiết bảo mật cụ thể</translation> <translation id="1729533290416704613">Tiện ích này cũng điều khiển trang nào được hiển thị khi bạn tìm kiếm từ Thanh địa chỉ.</translation> <translation id="1731346223650886555">Dấu chấm phẩy</translation> <translation id="1731589410171062430">Tổng số: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /> (<ph name="NUMBER_OF_PAGES" /> <ph name="PAGE_OR_PAGES_LABEL" />)</translation> @@ -874,6 +872,7 @@ <translation id="218492098606937156">Bật sự kiện chạm</translation> <translation id="2187317261103489799">Phát hiện (mặc định)</translation> <translation id="2187895286714876935">Lỗi nhập chứng chỉ máy chủ</translation> +<translation id="2188881192257509750">Mở <ph name="APPLICATION" /></translation> <translation id="2190069059097339078">Trình nhận thông tin đăng nhập WiFi</translation> <translation id="219008588003277019">Mô-đun Ứng dụng khách Gốc: <ph name="NEXE_NAME" /></translation> <translation id="2190355936436201913">(trống)</translation> @@ -992,6 +991,7 @@ <translation id="2326606747676847821">Truy cập ẩn danh</translation> <translation id="2326931316514688470">Tải &lại ứng dụng</translation> <translation id="2327492829706409234">Bật ứng dụng</translation> +<translation id="2328054044222305089">Thao tác này sẽ xóa mọi dữ liệu <ph name="SITE" /> được lưu trữ trên thiết bị của bạn và đặt lại bất kỳ quyền nào bạn đã cấp để chạy. Bạn có muốn tiếp tục không?</translation> <translation id="2329597144923131178">Đă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="2332131598580221120">Xem trong cửa hàng</translation> <translation id="2332742915001411729">Đặt lại về mặc định</translation> @@ -1267,7 +1267,6 @@ <translation id="2675358154061544447">Hỗ trợ mang tính thử nghiệm cao để kết xuất iframe giữa các trang web trong những quá trình riêng biệt. Ở chế độ này, các tài liệu sẽ chỉ chia sẻ quá trình kết xuất nếu các tài liệu đó đến từ cùng một trang web.</translation> <translation id="2676946222714718093">Đang phát trên</translation> <translation id="2678063897982469759">Kích hoạt lại</translation> -<translation id="2678246812096664977">Tất cả plugin</translation> <translation id="2679385451463308372">In bằng hộp thoại hệ thống...</translation> <translation id="2680208403056680091">Kết nối Internet của bạn đang bị kiểm soát</translation> <translation id="268053382412112343">Lị&ch sử</translation> @@ -1441,7 +1440,6 @@ <translation id="287286579981869940">Thêm <ph name="PROVIDER_NAME" />...</translation> <translation id="2872961005593481000">Tắt</translation> <translation id="2875698561019555027">(Các trang lỗi của Chrome)</translation> -<translation id="2879560882721503072">Đã lưu trữ thành công chứng chỉ ứng dụng khách bởi <ph name="ISSUER" />.</translation> <translation id="288024221176729610">Tiếng Séc</translation> <translation id="288042212351694283">Truy cập thiết bị Universal 2nd Factor</translation> <translation id="2881966438216424900">Truy cập lần cuối:</translation> @@ -1590,6 +1588,7 @@ <translation id="3057861065630527966">Sao lưu ảnh và video của bạn</translation> <translation id="3058212636943679650">Nếu bạn từng cần khôi phục hệ điều hành máy tính của mình, bạn sẽ cần thẻ SD hoặc thẻ nhớ USB khôi phục.</translation> <translation id="305932878998873762">Bộ nhớ cache đơn giản cho HTTP là bộ nhớ cache mới. Bộ nhớ cache này dựa trên hệ thống tệp cho phân bổ dung lượng đĩa.</translation> +<translation id="3060251871394327123">Thao tác này sẽ xóa mọi dữ liệu <ph name="SITE" /> được lưu trữ trên thiết bị của bạn. Bạn có muốn tiếp tục không?</translation> <translation id="3061650404498811439">Cho phép truy cập vào biểu tượng cảm xúc, chữ viết tay và menu IME chọn tham gia biểu mẫu nhập bằng giọng nói.</translation> <translation id="3062606427884046423">Sử dụng thông báo Android MediaStyle cho thông báo phương tiện Chrome.</translation> <translation id="3063844757726132584">Truy cập tất cả ứng dụng của bạn từ trình chạy tiện dụng này. Chơi trò chơi, trò chuyện video, nghe nhạc, chỉnh sửa tài liệu hoặc tải thêm ứng dụng.</translation> @@ -1639,6 +1638,7 @@ <translation id="3123569374670379335">(Được giám sát)</translation> <translation id="3124111068741548686">Quản lý NGƯỜI DÙNG</translation> <translation id="3126026824346185272">Ctrl</translation> +<translation id="3127156390846601284">Thao tác này sẽ xóa mọi dữ liệu được lưu trữ trên thiết bị của bạn cho tất cả trang web hiển thị. Bạn có muốn tiếp tục không?</translation> <translation id="312759608736432009">Nhà sản xuất thiết bị:</translation> <translation id="3127919023693423797">Đang xác thực...</translation> <translation id="3128230619496333808">Tab 6</translation> @@ -1737,7 +1737,6 @@ <translation id="3264544094376351444">Phông chữ Sans-serif</translation> <translation id="3264547943200567728">Không thiết lập được mạng Chromebox của bạn</translation> <translation id="3265459715026181080">Đóng Cửa sổ</translation> -<translation id="3267271790328635957">Chỉ PDF</translation> <translation id="3267726687589094446">Tiếp tục cho phép tự động tải nhiều tệp xuống</translation> <translation id="3267998849713137817">Thời gian sửa đổi</translation> <translation id="3268451620468152448">Tab đang mở</translation> @@ -1983,6 +1982,7 @@ <translation id="3574210789297084292">đăng nhập</translation> <translation id="3574305903863751447"><ph name="CITY" />, <ph name="STATE" /> <ph name="COUNTRY" /></translation> <translation id="357479282490346887">Tiếng Lithuania</translation> +<translation id="3575927481544652747">Tắt Windows Runtime MIDI API cho WebMIDI, được bật theo mặc định trên Windows 10 trở lên.</translation> <translation id="3576324189521867626">Đã cài đặt thành công</translation> <translation id="3578331450833904042">Mặc định (chọn mọi thứ)</translation> <translation id="3578594933904494462">Nội dung của tab này đang được chia sẻ.</translation> @@ -2036,8 +2036,6 @@ <translation id="3627320433825461852">Còn chưa đến 1 phút</translation> <translation id="3627588569887975815">Mở liên kết bằn&g cửa số ẩn danh</translation> <translation id="3627671146180677314">Thời gian Gia hạn Chứng chỉ Netscape</translation> -<translation id="3629326610814700057">Bật trình quản lý bộ nhớ để quản lý bộ nhớ cục bộ.</translation> -<translation id="3630337581925712713"><ph name="PERMISSION_TYPE_LABEL" />:</translation> <translation id="3631337165634322335">Những ngoại lệ dưới đây chỉ áp dụng cho phiên duyệt ẩn danh hiện thời.</translation> <translation id="3633586230741134985">Cài đặt trình chạy ứng dụng</translation> <translation id="3633997706330212530">Bạn có thể tùy ý tắt các dịch vụ này.</translation> @@ -2060,7 +2058,8 @@ <translation id="3654045516529121250">Đọc cài đặt trợ năng của bạn</translation> <translation id="3654092442379740616">Lỗi đồng bộ hóa: <ph name="PRODUCT_NAME" /> đã cũ và cần được cập nhật.</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{Ứng dụng có quyền truy cập vĩnh viễn vào một tệp.}other{Ứng dụng có quyền truy cập vĩnh viễn vào # tệp.}}</translation> -<translation id="3657468915905674858">Bật khóa PPAPI Win32k.</translation> +<translation id="365793796291733849"><ph name="BEGIN_PARAGRAPH1" />Khi bạn bật sao lưu tự động, dữ liệu ứng dụng và thiết bị sẽ được định kỳ lưu vào một thư mục riêng trong Google Drive. Dữ liệu ứng dụng có thể là bất kỳ dữ liệu nào mà ứng dụng đã lưu (dựa trên cài đặt của nhà phát triển), bao gồm dữ liệu có thể nhạy cảm chẳng hạn như danh bạ, tin nhắn và ảnh.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Dữ liệu sao lưu sẽ không tính vào hạn mức bộ nhớ Drive của bạn. Các tệp lớn hoặc các tệp mà nhà phát triển đã chọn để loại trừ khỏi dịch vụ sẽ không được sao lưu.<ph name="END_PARAGRAPH2" /></translation> <translation id="3660234220361471169">Không đáng tin cậy</translation> <translation id="3665589677786828986">Chrome phát hiện thấy rằng một số cài đặt của bạn đã bị lỗi do một chương trình khác gây ra và đặt lại các cài đặt đó về giá trị mặc định ban đầu.</translation> <translation id="3665842570601375360">Bảo mật:</translation> @@ -2115,6 +2114,7 @@ <translation id="3733127536501031542">Máy chủ SSL với Step-up</translation> <translation id="3736520371357197498">Nếu bạn hiểu các rủi ro bảo mật, bạn có thể <ph name="BEGIN_LINK" />truy cập trang web không an toàn này<ph name="END_LINK" /> trước khi các chương trình nguy hiểm bị xóa.</translation> <translation id="3738924763801731196"><ph name="OID" />:</translation> +<translation id="3739254215541673094">Mở <ph name="APPLICATION" />?</translation> <translation id="3739798227959604811">Độ trễ trước khi lặp lại:</translation> <translation id="3741158646617793859"><ph name="DEVICE_NAME" /> hiện không hiển thị trong Bảng điều khiển dành cho quản trị viên</translation> <translation id="3741243925913727067">Sao lưu ảnh và video trên thiết bị truyền thông của bạn vào Google Drive.</translation> @@ -2353,7 +2353,6 @@ <translation id="4058793769387728514">Kiểm tra Tài liệu Ngay bây giờ</translation> <translation id="4059285154003114015">&In khung...</translation> <translation id="406070391919917862">Ứng dụng nền</translation> -<translation id="4061502419206152498">Chỉ hiển thị nội dung không an toàn, tĩnh</translation> <translation id="4062251648694601778">Trải nghiệm thiết bị <ph name="SHORT_PRODUCT_NAME" /> của bạn. Bạn có câu hỏi? Bạn luôn có thể nhận trợ giúp bằng cách nhấp vào "?" trong khay trạng thái.</translation> <translation id="4065876735068446555">Mạng bạn đang sử dụng (<ph name="NETWORK_ID" />) có thể yêu cầu bạn truy cập vào trang đăng nhập của mạng đó.</translation> <translation id="4068506536726151626">Trang này chứa các yếu tố từ các trang web đang theo dõi vị trí của bạn:</translation> @@ -2392,7 +2391,6 @@ <translation id="4101878899871018532">Trình quản lý mật khẩu sẽ không đề xuất lưu thông tin đăng nhập được sử dụng để đồng bộ hóa.</translation> <translation id="410351446219883937">Tự động phát</translation> <translation id="4104163789986725820">X&uất...</translation> -<translation id="4105523032910086267">Đặt hoạt ảnh và mức độ hiển thị của chi tiết bảo mật trong Material Design.</translation> <translation id="4105563239298244027">Nhận 1 TB miễn phí với Google Drive</translation> <translation id="4109135793348361820">Di chuyển cửa sổ đến <ph name="USER_NAME" /> (<ph name="USER_EMAIL" />)</translation> <translation id="4110342520124362335">Đã chặn cookie từ <ph name="DOMAIN" />.</translation> @@ -2443,6 +2441,7 @@ <translation id="418179967336296930">Bàn phím ngữ âm tiếng Nga (YaZHert)</translation> <translation id="4181841719683918333">Ngôn ngữ</translation> <translation id="4187248015940562149">Bật Bluetooth cho web có thể cho phép trang web kết nối và kiểm soát thiết bị Bluetooth xung quanh bạn.</translation> +<translation id="4188447344915957833">Bật trình quản lý bộ nhớ trong Cài đặt Material Design.</translation> <translation id="4189406272289638749">Tiện ích, <b><ph name="EXTENSION_NAME" /></b>, đang kiểm soát cài đặt này.</translation> <translation id="4193154014135846272">Tài liệu Google</translation> <translation id="4193182321948161343">Bật trình quản lý người dùng thiết kế Material Design</translation> @@ -2650,6 +2649,7 @@ <translation id="4508765956121923607">Xem &Nguồn</translation> <translation id="4509017836361568632">Hủy ảnh</translation> <translation id="4509345063551561634">Vị trí:</translation> +<translation id="4513946894732546136">Phản hồi</translation> <translation id="4514542542275172126">Thiết lập người dùng được giám sát mới</translation> <translation id="4514914692061505365">Buộc sử dụng trình dịch nhanh Subzero của PNaCl cho tất cả các tệp pexe.</translation> <translation id="451515744433878153">Xóa</translation> @@ -2748,6 +2748,7 @@ <translation id="4656293982926141856">Máy tính này</translation> <translation id="4656631038341342120">Bật vỏ VR nếu khả dụng cho thiết bị này.</translation> <translation id="4657031070957997341">Luôn cho phép plugin trên <ph name="HOST" /></translation> +<translation id="466008749075469935">Cho phép can thiệp để giới hạn mức sử dụng CPU của bộ tính giờ trong nền ở 1%.</translation> <translation id="4663254525753315077">Khi có thể, đưa nội dung cuộn của phần tử cuộn bổ sung vào một lớp tổng hợp để cuộn nhanh hơn.</translation> <translation id="4664482161435122549">Lỗi xuất PKCS #12</translation> <translation id="4665014895760275686">Nhà sản xuất</translation> @@ -2816,6 +2817,7 @@ <translation id="4749157430980974800">Bàn phím chữ Georgia</translation> <translation id="4750394297954878236">Đề xuất</translation> <translation id="475088594373173692">Người dùng đầu tiên</translation> +<translation id="4750892496809949692">Thích nội dung HTML bằng cách ẩn Flash khỏi danh sách plugin.</translation> <translation id="4750917950439032686">Thông tin của bạn (ví dụ: mật khẩu hoặc số thẻ tín dụng) sẽ được bảo mật khi được gửi tới trang web này.</translation> <translation id="4753602155423695878">Hoạt ảnh trên thanh tiến trình tải trang trên điện thoại Android</translation> <translation id="4755240240651974342">Bàn phím tiếng Phần Lan</translation> @@ -3090,6 +3092,7 @@ <translation id="5119450342834678097">Tùy chọn yêu cầu trang web trên máy tính bảng trong menu cài đặt</translation> <translation id="5120068803556741301">Phương thức nhập của bên thứ ba</translation> <translation id="5120421890733714118">Tin tưởng vào chứng chỉ này khi nhận dạng trang web.</translation> +<translation id="5120516977819314347">Mã PIN hoặc mật khẩu không chính xác.</translation> <translation id="5121130586824819730">Đĩa cứng của bạn đã đầy. Hãy lưu vào một vị trí khác hoặc tạo thêm dung lượng trống trên đĩa cứng.</translation> <translation id="5125751979347152379">URL không hợp lệ.</translation> <translation id="5127881134400491887">Quản lý kết nối mạng</translation> @@ -3097,6 +3100,7 @@ <translation id="512903556749061217">được đính kèm</translation> <translation id="5129301143853688736">Kết nối của bạn tới trang web này không ở chế độ riêng tư. Những kẻ tấn công có thể tìm cách lấy cắp thông tin của bạn (ví dụ: ảnh, mật khẩu, tin nhắn và thẻ tín dụng) từ <ph name="DOMAIN" />.</translation> <translation id="5129662217315786329">Tiếng Ba Lan</translation> +<translation id="5131347545782851480">Tài liệu PDF</translation> <translation id="5134856901811723984">Thiết kế Material Design trong giao diện người dùng hệ thống của Chrome OS</translation> <translation id="5135533361271311778">Không thể tạo mục dấu trang.</translation> <translation id="5136529877787728692">F7</translation> @@ -3265,6 +3269,7 @@ <translation id="5328031682234198929">8</translation> <translation id="5329858601952122676">&Xoá</translation> <translation id="5330145655348521461">Những tệp này được mở trên máy tính khác. Chuyển tới <ph name="USER_NAME" /> (<ph name="MAIL_ADDRESS" />) để xem tệp đó.</translation> +<translation id="5330512191124428349">Nhận thông tin</translation> <translation id="5332624210073556029">Múi giờ:</translation> <translation id="5333807720589685258">Thẻ SIM của bạn sẽ bị vô hiệu hóa vĩnh viễn nếu bạn không thể nhập Khóa mở khóa mã PIN chính xác.</translation> @@ -3697,7 +3702,6 @@ <translation id="5892507820957994680">Ghi đè danh sách kết xuất phần mềm tích hợp sẵn và cho phép tăng tốc GPU trên cấu hình hệ thống không được hỗ trợ.</translation> <translation id="5895138241574237353">Khởi động lại</translation> <translation id="5895187275912066135">Cấp vào</translation> -<translation id="5898154795085152510">Máy chủ đã trả lại một chứng chỉ ứng dụng khách không hợp lệ. Lỗi <ph name="ERROR_NUMBER" /> (<ph name="ERROR_NAME" />).</translation> <translation id="5900302528761731119">Ảnh hồ sơ trên Google</translation> <translation id="590253956165195626">Đề xuất dịch các trang tiếng nước ngoài mà bạn không hiểu </translation> <translation id="5904093760909470684">Cấu hình Proxy</translation> @@ -3752,6 +3756,8 @@ <translation id="5984222099446776634">Truy cập gần đây</translation> <translation id="5984814259619230127">Tính năng khám phá qua Bluetooth Low Energy nhờ Smart Lock</translation> <translation id="5986245990306121338">Nếu được bật, trình chuyển đổi tab sẽ hiển thị ngay cả khi bạn bật tùy chọn 'hợp nhất tab và ứng dụng' trong cài đặt.</translation> +<translation id="5989712527536636369"><ph name="BEGIN_PARAGRAPH1" />Đây là thông tin chung về thiết bị của bạn và cách bạn sử dụng thiết bị đó, chẳng hạn như mức pin, tần suất bạn sử dụng các ứng dụng của mình, chất lượng và thời lượng kết nối mạng (như Wi-Fi và Bluetooth) cũng như báo cáo sự cố khi các tính năng không hoạt động như mong muốn. Google sẽ sử dụng thông tin này để cải thiện các sản phẩm và dịch vụ dành cho mọi người. Một số thông tin tổng hợp cũng sẽ giúp các đối tác, chẳng hạn như các nhà phát triển Android, cải thiện sản phẩm và ứng dụng của họ.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Bạn có thể bật hoặc tắt tính năng này bất cứ lúc nào trong Cài đặt ứng dụng Android. Việc này không ảnh hưởng đến khả năng thiết bị gửi thông tin cần thiết để nhận các dịch vụ quan trọng như bảo mật và cập nhật hệ thống.<ph name="END_PARAGRAPH2" /></translation> <translation id="5990198433782424697">Tiện ích trên URL chrome://</translation> <translation id="5990814808592353318">Tạo mật khẩu thủ công.</translation> <translation id="5991049340509704927">Phóng to</translation> @@ -3765,6 +3771,7 @@ <translation id="6005695835120147974">Bộ định tuyến phương tiện</translation> <translation id="6007237601604674381">Di chuyển không thành công. <ph name="ERROR_MESSAGE" /></translation> <translation id="6008241731410823808">Gửi ping kiểm tra siêu liên kết.</translation> +<translation id="6011449291337289699">Xóa dữ liệu trang web</translation> <translation id="6015796118275082299">Năm</translation> <translation id="6016551720757758985">Xác nhận Powerwash quay lại phiên bản trước</translation> <translation id="6016809788585079594">Nói "Ok Google" một lần cuối</translation> @@ -3954,7 +3961,6 @@ <translation id="6276301056778294989">Đảm bảo thiết bị đang hiển thị cùng một mã.</translation> <translation id="6277105963844135994">Hết thời gian chờ mạng</translation> <translation id="6277518330158259200">Chụp ảnh màn hình</translation> -<translation id="6278428485366576908">Chủ đề</translation> <translation id="6279183038361895380">Nhấn |<ph name="ACCELERATOR" />| để hiển thị con trỏ của bạn</translation> <translation id="6280215091796946657">Đăng nhập bằng tài khoản khác</translation> <translation id="6280912520669706465">ARC</translation> @@ -4206,6 +4212,7 @@ <translation id="6607272825297743757">Thông tin tệp</translation> <translation id="6607831829715835317">Côn&g cụ khác</translation> <translation id="6608140561353073361">Tất cả cookie và dữ liệu trang web...</translation> +<translation id="6610183966322615106">Lỗi khi thêm máy in</translation> <translation id="6610610633807698299">Nhập URL...</translation> <translation id="6612358246767739896">Nội dung được bảo vệ</translation> <translation id="6615455863669487791">Hiển thị cho tôi</translation> @@ -4269,7 +4276,6 @@ <translation id="6708242697268981054">Bản gốc:</translation> <translation id="6709357832553498500">Kết nối bằng <ph name="EXTENSIONNAME" /></translation> <translation id="6710213216561001401">Trước đó</translation> -<translation id="6712158998835983046">Hiển thị tất cả, động</translation> <translation id="6718273304615422081">Đang nén...</translation> <translation id="671928215901716392">Khóa màn hình</translation> <translation id="6721972322305477112">&Tệp</translation> @@ -4543,7 +4549,6 @@ <translation id="7088434364990739311">Không thể bắt đầu kiểm tra cập nhật (mã lỗi <ph name="ERROR" />).</translation> <translation id="708856090370082727">Bật tính năng hỗ trợ cuộn qua cho OSK. Khi cờ này bật, OSK sẽ chỉ đổi kích thước chế độ xem hình ảnh.</translation> <translation id="7088674813905715446">Thiết bị này đã được quản trị viên đặt sang trạng thái hủy cấp phép. Để cho phép đăng ký thiết bị, quản trị viên phải đặt thiết bị về trạng thái đang chờ xử lý.</translation> -<translation id="7089609847854449639">Trình quản lý bộ nhớ</translation> <translation id="708969677220991657">Cho phép yêu cầu đối với máy chủ cục bộ qua HTTPS ngay cả khi trình chứng chỉ không hợp lệ.</translation> <translation id="7092106376816104">Ngoại lệ cho cửa sổ bật lên</translation> <translation id="7093866338626856921">Trao đổi dữ liệu với thiết bị có tên: <ph name="HOSTNAMES" /></translation> @@ -4583,7 +4588,7 @@ <translation id="715118844758971915">Máy in cổ điển</translation> <translation id="7154130902455071009">Thay đổi trang chủ của bạn thành: <ph name="START_PAGE" /></translation> <translation id="7155171745945906037">Ảnh hiện có từ máy ảnh hoặc tệp</translation> -<translation id="715568033737470079">Chỉ định plugin PPAPI sẽ được chạy trong chính sách hộp cát khóa Win32k (Chỉ Windows 10 trở lên).</translation> +<translation id="7155226869555939647">Luôn mở liên kết cho <ph name="APPLICATION" /></translation> <translation id="7156235233373189579">Tệp này được thiết kế cho PC sử dụng phần mềm Windows. Tệp này không tương thích với thiết bị chạy Chrome OS của bạn. Hãy tìm kiếm ứng dụng thay thế phù hợp trên <ph name="BEGIN_LINK" />Cửa hàng Chrome trực tuyến<ph name="END_LINK" />. <ph name="BEGIN_LINK_HELP" />Tìm hiểu thêm<ph name="END_LINK_HELP" /></translation> <translation id="7157063064925785854">Bằng cách nhấp vào Tiếp tục, bạn đồng ý với <ph name="LEGAL_DOC_LINK_TEXT_1" />, <ph name="LEGAL_DOC_LINK_TEXT_2" />, <ph name="LEGAL_DOC_LINK_TEXT_3" /> và <ph name="LEGAL_DOC_LINK_TEXT_4" />.</translation> <translation id="7158238151765743968">Vẫn đang kết nối với "<ph name="DEVICE_NAME" />".</translation> @@ -4598,6 +4603,7 @@ <translation id="7175353351958621980">Được tải từ:</translation> <translation id="7180611975245234373">Làm mới</translation> <translation id="7180865173735832675">Tùy chỉnh</translation> +<translation id="7181387261278441780">Xóa và đặt lại trang web</translation> <translation id="7185078796915954712">TLS 1.3</translation> <translation id="7185690883425432021">Ẩn nút đóng của các tab không hoạt động khi thanh tab ở chế độ xếp chồng.</translation> <translation id="7186088072322679094">Giữ trong thanh công cụ</translation> @@ -4630,7 +4636,6 @@ <translation id="7223775956298141902">Này... Bạn không có tiện ích nào :-(</translation> <translation id="7224023051066864079">Mặt nạ mạng con:</translation> <translation id="7225179976675429563">Thiếu loại mạng</translation> -<translation id="7230191962699768124">Hiển thị tất cả, tĩnh</translation> <translation id="7230787553283372882">Tùy chỉnh kích thước văn bản của bạn</translation> <translation id="7231224339346098802">Sử dụng một số để cho biết cần in bao nhiêu bản (1 hoặc nhiều hơn).</translation> <translation id="7238585580608191973">SHA-256 Fingerprint</translation> @@ -4762,7 +4767,6 @@ <translation id="7409233648990234464">Chạy lại và Powerwash</translation> <translation id="7409836189476010449">Chạy Flash</translation> <translation id="7410344089573941623">Hỏi xem <ph name="HOST" /> có muốn truy cập vào máy ảnh và micrô của bạn không</translation> -<translation id="7411343637221933631">{NUM_COOKIES,plural, =1{1 từ trang web này}other{# từ trang web này}}</translation> <translation id="7412226954991670867">Bộ nhớ GPU</translation> <translation id="7416362041876611053">Lỗi mạng không xác định.</translation> <translation id="7417453074306512035">Bàn phím tiếng Ethiopic</translation> @@ -4884,6 +4888,7 @@ <translation id="756445078718366910">Mở Cửa sổ Trình duyệt</translation> <translation id="7564847347806291057">Kết thúc quá trình</translation> <translation id="7566723889363720618">F12</translation> +<translation id="7567314848159753396">Cookie: <ph name="NAME" /></translation> <translation id="756809126120519699">Đã xóa dữ liệu Chrome</translation> <translation id="7568790562536448087">Đang cập nhật</translation> <translation id="7573172247376861652">Sạc pin</translation> @@ -4924,6 +4929,7 @@ <translation id="7626009897377900107">Tạo mật khẩu</translation> <translation id="7627262197844840899">Trang web này không chấp nhận MasterCard.</translation> <translation id="7627790789328695202">Rất tiếc, <ph name="FILE_NAME" /> đã tồn tại. Hãy đổi tên tệp và thử lại.</translation> +<translation id="7628127343934101653">Mở các tệp PDF trong ứng dụng trình xem PDF mặc định.</translation> <translation id="762917759028004464">Trình duyệt mặc định hiện tại là <ph name="BROWSER_NAME" />.</translation> <translation id="7629536005696009600">Cho phép thông tin xác thực được lưu trữ cho ứng dụng Android được điền vào trang web tương ứng.</translation> <translation id="7629827748548208700">Tab: <ph name="TAB_NAME" /></translation> @@ -5152,6 +5158,7 @@ <translation id="7957513156576779045">Bật Bluetooth để cho phép ghép nối</translation> <translation id="7957615753207896812">Mở cài đặt thiết bị bàn phím</translation> <translation id="7959074893852789871">Tệp có chứa nhiều chứng chỉ, một vài chứng chỉ trong đó chưa được nhập:</translation> +<translation id="7959700692661109221"><ph name="BEGIN_PARAGRAPH" />Dịch vụ vị trí của Google sử dụng các nguồn như Wi-Fi để giúp ước đoán vị trí thiết bị của bạn nhanh hơn và chính xác hơn. Khi bạn bật dịch vụ vị trí của Google, thiết bị của bạn sẽ dùng chế độ sử dụng Wi-Fi để cung cấp thông tin vị trí. Bạn có thể tắt dịch vụ này trong cài đặt vị trí bất cứ lúc nào.<ph name="END_PARAGRAPH" /></translation> <translation id="7961015016161918242">Chưa bao giờ</translation> <translation id="7964089325405904043">Xuất và nhập mật khẩu</translation> <translation id="7965010376480416255">Bộ nhớ Dùng chung</translation> @@ -5302,6 +5309,7 @@ <translation id="8146793085009540321">Đăng nhập không thành công. Vui lòng liên hệ với quản trị viên của bạn hoặc thử lại.</translation> <translation id="8148264977957212129">Phương pháp nhập Pinyin</translation> <translation id="8148913456785123871">Hiển thị thẻ Google Hiện hành trong trình khởi chạy</translation> +<translation id="8150391391298684512">Tắt Windows Runtime MIDI API</translation> <translation id="8151185429379586178">Công cụ dành cho nhà phát triển</translation> <translation id="8151638057146502721">Định cấu hình</translation> <translation id="8151639108075998630">Bật duyệt với tư cách khách</translation> @@ -5582,6 +5590,7 @@ <translation id="8532294913309524834">Sắp xếp ngôn ngữ dựa trên tùy chọn của bạn.</translation> <translation id="8535005006684281994">URL Gia hạn Chứng chỉ của Netscape</translation> <translation id="8539727552378197395">Không (HttpOnly)</translation> +<translation id="8541084862688000575">Tải các ứng dụng Android tự động</translation> <translation id="8543181531796978784">Bạn có thể <ph name="BEGIN_ERROR_LINK" />báo cáo sự cố đã phát hiện<ph name="END_ERROR_LINK" /> hoặc nếu bạn hiểu rủi ro với bảo mật của mình, hãy <ph name="BEGIN_LINK" />truy cập trang web không an toàn này<ph name="END_LINK" />.</translation> <translation id="8545107379349809705">Ẩn thông tin...</translation> <translation id="8545211332741562162">Cho phép trang web sử dụng các tính năng JavaScript thử nghiệm.</translation> @@ -5609,7 +5618,6 @@ <translation id="8569764466147087991">Chọn tệp để mở</translation> <translation id="8571032220281885258">Khi bạn nói "Ok Google", Chrome sẽ tìm kiếm nội dung mà bạn nói tiếp theo.</translation> <translation id="8571108619753148184">Máy chủ 4</translation> -<translation id="8572832761467613633">Chỉ flash</translation> <translation id="8572981282494768930">Không cho phép các trang web truy cập vào máy ảnh và micrô của bạn</translation> <translation id="8574234089711453001">Cho phép nút tải xuống hiển thị khi mở trang bằng url phương tiện.</translation> <translation id="857779305329188634">Bật hỗ trợ giao thức QUIC thử nghiệm.</translation> @@ -5631,6 +5639,7 @@ <translation id="8600929685092827187">Đánh thức dựa trên gói</translation> <translation id="8601206103050338563">Xác thực Ứng dụng khách TLS WWW</translation> <translation id="8602851771975208551">Một chương trình khác trên máy tính của bạn đã thêm một ứng dụng có thể thay đổi cách Chrome hoạt động.</translation> +<translation id="8603912787021349466">Cho phép các ứng dụng Android khởi động tự động sau khi đăng nhập.</translation> <translation id="8605428685123651449">Bộ nhớ SQLite</translation> <translation id="8605503133013456784">Không thể ngắt kết nối và hủy ghép nối khỏi "<ph name="DEVICE_NAME" />".</translation> <translation id="8606726445206553943">Sử dụng các thiết bị MIDI của bạn</translation> @@ -5983,6 +5992,7 @@ <translation id="9053965862400494292">Đã xảy ra lỗi khi cố thiết lập đồng bộ hóa.</translation> <translation id="9056034633062863292">Đang cập nhật Chromebox</translation> <translation id="9056810968620647706">Không tìm thấy kết quả phù hợp nào.</translation> +<translation id="9057119625587205566">Không có máy in lân cận</translation> <translation id="9059868303873565140">Menu trạng thái</translation> <translation id="9064142312330104323">Ảnh hồ sơ trên Google (đang tải)</translation> <translation id="9064275926664971810">Bật Tự động điền để điền các biểu mẫu chỉ bằng một lần nhấp</translation> @@ -5993,6 +6003,7 @@ <translation id="9067401056540256169">Cờ này khiến Chrome không an toàn. Chỉ sử dụng nếu bạn hiểu ý nghĩa của cờ này. Lưu ý rằng cờ này có thể bị xóa mà không có bất cứ thông báo nào. Nếu được bật, các khung có nguồn gốc https có thể sử dụng WebSockets với URL không an toàn (ws://).</translation> <translation id="9068931793451030927">Đường dẫn:</translation> <translation id="9070219033670098627">Chuyển đổi người</translation> +<translation id="9070940116164932228">Giới hạn bộ tính giờ sử dụng nhiều bộ nhớ trong nền</translation> <translation id="907148966137935206">Không cho phép bất kỳ trang web nào hiển thị cửa sổ bật lên (nên chọn)</translation> <translation id="9072550133391925347"><ph name="PASSWORD_MANAGER_BRAND" /> tự động đăng nhập bạn vào các trang web và ứng dụng đủ điều kiện bằng mật khẩu bạn đã lưu.</translation> <translation id="9073281213608662541">PAP</translation> @@ -6027,6 +6038,7 @@ <translation id="9112614144067920641">Vui lòng chọn mã PIN mới.</translation> <translation id="9112748030372401671">Thay đổi hình nền của bạn</translation> <translation id="9112987648460918699">Tìm...</translation> +<translation id="9114663181201435112">Đăng nhập dễ dàng</translation> <translation id="9115487443206954631">Quản lý thiết bị Truyền</translation> <translation id="9115675100829699941">&Dấu trang</translation> <translation id="9121814364785106365">Mở dưới dạng tab được ghim</translation> @@ -6121,7 +6133,6 @@ <translation id="952992212772159698">Chưa được kích hoạt</translation> <translation id="960719561871045870">Mã của nhà mạng</translation> <translation id="960987915827980018">Còn khoảng 1 giờ</translation> -<translation id="962778376131245616">Chỉ hiển thị nội dung không an toàn, động</translation> <translation id="96421021576709873">Mạng Wi-Fi</translation> <translation id="965490406356730238">Bật giải mã mjpeg được tăng tốc bởi phần cứng cho khung đã chụp nếu có.</translation> <translation id="968174221497644223">Bộ nhớ cache của ứng dụng</translation>
diff --git a/chrome/app/resources/generated_resources_zh-CN.xtb b/chrome/app/resources/generated_resources_zh-CN.xtb index de3213e..87380df 100644 --- a/chrome/app/resources/generated_resources_zh-CN.xtb +++ b/chrome/app/resources/generated_resources_zh-CN.xtb
@@ -18,7 +18,6 @@ <translation id="1029317248976101138">缩放</translation> <translation id="1029595648591494741">要试用“<ph name="EXTENSION_NAME" />”吗?</translation> <translation id="1031362278801463162">正在加载预览</translation> -<translation id="1031460590482534116">在尝试存储客户端证书时出错。错误编号:<ph name="ERROR_NUMBER" /> (<ph name="ERROR_NAME" />)。</translation> <translation id="1031573127485938293">询问(依照政策)</translation> <translation id="103279545524624934">请释放磁盘空间以启动 Android 应用。</translation> <translation id="1033780634303702874">访问您的串行设备</translation> @@ -101,6 +100,7 @@ <translation id="1128591060186966949">修改搜索引擎</translation> <translation id="1128987120443782698">该存储设备的容量为 <ph name="DEVICE_CAPACITY" />。请插入容量至少为 4 GB 的 SD 卡或 USB 记忆棒。</translation> <translation id="1137135726305341424">domContentLoaded 以及在 domContentLoaded 之前开始的所有资源加载操作(主框架和来源相同的 iframe)。</translation> +<translation id="1138663153846032155">首选 HTML(而非 Flash)</translation> <translation id="1140351953533677694">访问您的蓝牙和串行设备</translation> <translation id="114140604515785785">扩展程序根目录:</translation> <translation id="1143142264369994168">证书签名人</translation> @@ -252,6 +252,7 @@ <translation id="1351692861129622852">正在导入 <ph name="FILE_COUNT" /> 个文件…</translation> <translation id="1352103415082130575">泰语键盘(Pattachote)</translation> <translation id="1353686479385938207"><ph name="PROVIDER_NAME" />:<ph name="NETWORK_NAME" /></translation> +<translation id="1353946958707294039">Material Design 存储空间管理器</translation> <translation id="1353966721814789986">启动页</translation> <translation id="1354868058853714482">Adobe Reader 已过期,可能不安全。</translation> <translation id="1355408554203439639">3D 软件光栅化处理程序</translation> @@ -420,7 +421,6 @@ <translation id="1533920822694388968">电视对齐</translation> <translation id="15373452373711364">大号鼠标光标</translation> <translation id="1543284117603151572">从 Edge 导入的书签</translation> -<translation id="1544350195767834591">{NUM_COOKIES,plural, =1{有 1 项来自其他网站}other{有 # 项来自其他网站}}</translation> <translation id="1545177026077493356">自动自助服务终端模式</translation> <translation id="1545786162090505744">网址(用“%s”代替搜索字词)</translation> <translation id="1546280085599573572">此扩展程序更改了您点击“主页”按钮后系统显示的页面。</translation> @@ -444,7 +444,6 @@ <translation id="1559235587769913376">请输入 Unicode 字符</translation> <translation id="1561092721008294962">用来呈现界面文字的 HarfBuzz</translation> <translation id="1566049601598938765">网站</translation> -<translation id="1566958206723629112">Flash 和 PDF</translation> <translation id="1567723158593978621">启用后,用户在登录浏览器时将使用全新的 GAIA 密码分离式登录流程。</translation> <translation id="1567993339577891801">JavaScript 控制台</translation> <translation id="1568323446248056064">打开显示设备设置</translation> @@ -573,7 +572,6 @@ <translation id="1723940674997333416">允许来自https来源的不安全WebSocket</translation> <translation id="1725149567830788547">显示控件(&C)</translation> <translation id="172612876728038702">正在设置 TPM。这可能需要几分钟,请耐心等待。</translation> -<translation id="1727135806684246609">Material 安全性详细标示</translation> <translation id="1729533290416704613">它还能够控制您通过多功能框进行搜索时系统显示的页面。</translation> <translation id="1731346223650886555">分号</translation> <translation id="1731589410171062430">总计:<ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /> (<ph name="NUMBER_OF_PAGES" /> <ph name="PAGE_OR_PAGES_LABEL" />)</translation> @@ -869,6 +867,7 @@ <translation id="218492098606937156">启用触摸事件</translation> <translation id="2187317261103489799">检测(默认)</translation> <translation id="2187895286714876935">服务器证书导入错误</translation> +<translation id="2188881192257509750">打开 <ph name="APPLICATION" /></translation> <translation id="2190069059097339078">WiFi 凭据获取工具</translation> <translation id="219008588003277019">Native Client 模块:<ph name="NEXE_NAME" /></translation> <translation id="2190355936436201913">(空)</translation> @@ -987,6 +986,7 @@ <translation id="2326606747676847821">进入隐身模式</translation> <translation id="2326931316514688470">重新加载应用(&R)</translation> <translation id="2327492829706409234">启用应用</translation> +<translation id="2328054044222305089">此操作会删除 <ph name="SITE" /> 在您的设备上存储的所有数据,并重置您授权运行的所有权限。要继续吗?</translation> <translation id="2329597144923131178">登录后可获取您所有设备上保存的书签、历史记录、密码和其他设置。</translation> <translation id="2332131598580221120">在应用店中查看</translation> <translation id="2332742915001411729">重置为默认设置</translation> @@ -1261,7 +1261,6 @@ <translation id="2675358154061544447">为在单独的进程中呈现跨网站 iframe 提供高度实验性支持。在此模式下,仅当来自同一网站时,多个文档才会共享一个渲染程序进程。</translation> <translation id="2676946222714718093">当前播放设备:</translation> <translation id="2678063897982469759">重新启用</translation> -<translation id="2678246812096664977">所有插件</translation> <translation id="2679385451463308372">使用系统对话框进行打印...</translation> <translation id="2680208403056680091">您的互联网连接受到控制</translation> <translation id="268053382412112343">历史记录(&S)</translation> @@ -1435,7 +1434,6 @@ <translation id="287286579981869940">添加“<ph name="PROVIDER_NAME" />”…</translation> <translation id="2872961005593481000">关机</translation> <translation id="2875698561019555027">(Chrome 错误页面)</translation> -<translation id="2879560882721503072">已成功存储由<ph name="ISSUER" />发布的客户端证书。</translation> <translation id="288024221176729610">捷克语</translation> <translation id="288042212351694283">访问您的 Universal 2nd Factor 设备</translation> <translation id="2881966438216424900">最后访问时间:</translation> @@ -1584,6 +1582,7 @@ <translation id="3057861065630527966">备份您的照片和视频</translation> <translation id="3058212636943679650">如果您要恢复计算机的操作系统,则需要使用恢复 SD 卡或 USB 记忆棒。</translation> <translation id="305932878998873762">Simple Cache for HTTP 是一种新的缓存,它依靠文件系统来分配磁盘空间。</translation> +<translation id="3060251871394327123">此操作会删除 <ph name="SITE" /> 在您的设备上存储的所有数据。要继续吗?</translation> <translation id="3061650404498811439">允许使用“启用 IME”菜单中的表情符号、手写输入和语音输入功能。</translation> <translation id="3062606427884046423">针对 Chrome 媒体通知使用 Android MediaStyle 通知。</translation> <translation id="3063844757726132584">通过这个便捷的启动器,您可以访问自己的所有应用,还能玩游戏、视频聊天、欣赏音乐、编辑文档或下载更多应用。</translation> @@ -1633,6 +1632,7 @@ <translation id="3123569374670379335">(受监管)</translation> <translation id="3124111068741548686">USER处理函数</translation> <translation id="3126026824346185272">Ctrl</translation> +<translation id="3127156390846601284">此操作会删除所显示的全部网站在您设备上存储的所有数据。要继续吗?</translation> <translation id="312759608736432009">设备制造商:</translation> <translation id="3127919023693423797">正在进行身份验证...</translation> <translation id="3128230619496333808">标签页 6</translation> @@ -1731,7 +1731,6 @@ <translation id="3264544094376351444">Sans-serif 字体</translation> <translation id="3264547943200567728">无法设置您的 Chromebox 的网络</translation> <translation id="3265459715026181080">关闭窗口</translation> -<translation id="3267271790328635957">仅限 PDF</translation> <translation id="3267726687589094446">继续允许自动下载多个文件</translation> <translation id="3267998849713137817">修改时间</translation> <translation id="3268451620468152448">打开的标签页</translation> @@ -1975,6 +1974,7 @@ <translation id="3574210789297084292">登录</translation> <translation id="3574305903863751447"><ph name="COUNTRY" /><ph name="STATE" /><ph name="CITY" /></translation> <translation id="357479282490346887">立陶宛语</translation> +<translation id="3575927481544652747">针对 WebMIDI 停用 Windows Runtime MIDI API(在运行 Windows 10 或更高版本的设备上默认启用)。</translation> <translation id="3576324189521867626">已成功安装</translation> <translation id="3578331450833904042">默认(听取所有声音)</translation> <translation id="3578594933904494462">此标签页的内容正在共享中。</translation> @@ -2028,8 +2028,6 @@ <translation id="3627320433825461852">还剩不到 1 分钟</translation> <translation id="3627588569887975815">在隐身窗口中打开链接(&G)</translation> <translation id="3627671146180677314">Netscape 证书续订时间</translation> -<translation id="3629326610814700057">启用存储空间管理器以管理本地存储空间。</translation> -<translation id="3630337581925712713"><ph name="PERMISSION_TYPE_LABEL" />:</translation> <translation id="3631337165634322335">以下例外情况仅适用于当前的隐身会话。</translation> <translation id="3633586230741134985">应用启动器设置</translation> <translation id="3633997706330212530">您可以视情况停用这些服务。</translation> @@ -2052,7 +2050,8 @@ <translation id="3654045516529121250">读取您的无障碍设置</translation> <translation id="3654092442379740616">发生同步错误:<ph name="PRODUCT_NAME" />已过期,需要更新。</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{此应用对 1 个文件拥有永久访问权限。}other{此应用对 # 个文件拥有永久访问权限。}}</translation> -<translation id="3657468915905674858">启用 PPAPI Win32k 锁定。</translation> +<translation id="365793796291733849"><ph name="BEGIN_PARAGRAPH1" />启用自动备份功能后,系统会定期将设备和应用数据保存到 Google 云端硬盘上的私人文件夹中。应用数据可以是应用根据开发者设置保存的任何数据,包括通讯录、邮件、消息、照片等可能具有敏感性的数据。<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />备份数据不会计入云端硬盘存储空间配额。此外,系统不会备份大型文件或开发者已选择从备份服务中排除的文件。<ph name="END_PARAGRAPH2" /></translation> <translation id="3660234220361471169">不可信</translation> <translation id="3665589677786828986">Chrome检测到您的部分设置被其他程序篡改了,因此已将这些设置重置为原始默认设置。</translation> <translation id="3665842570601375360">安全:</translation> @@ -2107,6 +2106,7 @@ <translation id="3733127536501031542">带有递升式验证机制的 SSL 服务器</translation> <translation id="3736520371357197498">如果您了解自己将面临的安全风险,则可以在危险程序被清除前<ph name="BEGIN_LINK" />访问这个不安全的网站<ph name="END_LINK" />。</translation> <translation id="3738924763801731196"><ph name="OID" />:</translation> +<translation id="3739254215541673094">要打开 <ph name="APPLICATION" /> 吗?</translation> <translation id="3739798227959604811">重复前的延迟时间:</translation> <translation id="3741158646617793859"><ph name="DEVICE_NAME" /> 现在将显示在管理控制台中</translation> <translation id="3741243925913727067">将您的媒体设备上的照片和视频备份到 Google 云端硬盘。</translation> @@ -2344,7 +2344,6 @@ <translation id="4058793769387728514">立即检查文稿</translation> <translation id="4059285154003114015">打印框架(&P)…</translation> <translation id="406070391919917862">后台应用</translation> -<translation id="4061502419206152498">仅显示不安全的内容(以非动画形式)</translation> <translation id="4062251648694601778">尽情享受<ph name="SHORT_PRODUCT_NAME" />设备给您带来的便利吧!如有任何问题,只需点击状态栏中的“?”,即可获得帮助。</translation> <translation id="4065876735068446555">您正在使用的网络 (<ph name="NETWORK_ID" />) 可能需要您访问其登录页面。</translation> <translation id="4068506536726151626">此网页包含来自以下网站的元素,这些网站正在追踪您的位置:</translation> @@ -2383,7 +2382,6 @@ <translation id="4101878899871018532">密码管理器将不会询问是否保存用于同步的凭据。</translation> <translation id="410351446219883937">自动播放</translation> <translation id="4104163789986725820">导出(&X)...</translation> -<translation id="4105523032910086267">设置 Material Design 安全性详细标示的动画和公开范围。</translation> <translation id="4105563239298244027">获取 1 TB 免费的 Google 云端硬盘存储空间</translation> <translation id="4109135793348361820">将窗口移至<ph name="USER_NAME" />(<ph name="USER_EMAIL" />)</translation> <translation id="4110342520124362335">已拦截来自 <ph name="DOMAIN" /> 的 Cookie。</translation> @@ -2434,6 +2432,7 @@ <translation id="418179967336296930">俄语注音 (YaZHert) 键盘</translation> <translation id="4181841719683918333">语言</translation> <translation id="4187248015940562149">启用网络蓝牙,允许网站连接到并控制附近的蓝牙设备。</translation> +<translation id="4188447344915957833">在 Material Design 设置中启用存储空间管理器。</translation> <translation id="4189406272289638749">此设置目前由扩展程序<b><ph name="EXTENSION_NAME" /></b>控制。</translation> <translation id="4193154014135846272">Google 文档</translation> <translation id="4193182321948161343">启用 Material Design 用户管理器</translation> @@ -2641,6 +2640,7 @@ <translation id="4508765956121923607">显示源代码(&O)</translation> <translation id="4509017836361568632">舍弃照片</translation> <translation id="4509345063551561634">位置:</translation> +<translation id="4513946894732546136">反馈</translation> <translation id="4514542542275172126">设置新的受监管用户</translation> <translation id="4514914692061505365">对所有 pexe 文件强制使用 PNaCl 的快速 Subzero 翻译器。</translation> <translation id="451515744433878153">移除</translation> @@ -2739,6 +2739,7 @@ <translation id="4656293982926141856">此计算机</translation> <translation id="4656631038341342120">启用虚拟现实壳(如果适用于此设备)。</translation> <translation id="4657031070957997341">始终允许 <ph name="HOST" /> 使用插件</translation> +<translation id="466008749075469935">启用干预功能,以将后台计时器的 CPU 使用率限制在 1% 以下。</translation> <translation id="4663254525753315077">尽可能将溢出的滚动元素的滚动内容放置在合成层上,以加快滚动速度。</translation> <translation id="4664482161435122549">PKCS #12 导出错误</translation> <translation id="4665014895760275686">制造商</translation> @@ -2804,6 +2805,7 @@ <translation id="4749157430980974800">格鲁吉亚语键盘</translation> <translation id="4750394297954878236">建议</translation> <translation id="475088594373173692">第 1 位用户</translation> +<translation id="4750892496809949692">通过在插件列表中隐藏 Flash,首选显示 HTML 内容。</translation> <translation id="4750917950439032686">您发送给这个网站的信息(例如密码或信用卡号)不会外泄。</translation> <translation id="4753602155423695878">Android 手机的网页加载进度条动画</translation> <translation id="4755240240651974342">芬兰语键盘</translation> @@ -3077,6 +3079,7 @@ <translation id="5119450342834678097">“设置”菜单中的“请求平板电脑网站”选项</translation> <translation id="5120068803556741301">第三方输入法</translation> <translation id="5120421890733714118">信任该证书,以标识网站的身份。</translation> +<translation id="5120516977819314347">PIN 码或密码不正确。</translation> <translation id="5121130586824819730">您的硬盘已满。请保存到其他位置或在硬盘上腾出更多空间。</translation> <translation id="5125751979347152379">网址无效。</translation> <translation id="5127881134400491887">管理网络连接</translation> @@ -3084,6 +3087,7 @@ <translation id="512903556749061217">已连接</translation> <translation id="5129301143853688736">您与此网站建立的不是私密连接。攻击者可能会试图从 <ph name="DOMAIN" /> 窃取您的信息(例如照片、密码、通讯内容和信用卡信息)。</translation> <translation id="5129662217315786329">波兰语</translation> +<translation id="5131347545782851480">PDF 文档</translation> <translation id="5134856901811723984">Chrome 操作系统界面中的 Material Design</translation> <translation id="5135533361271311778">无法创建书签项。</translation> <translation id="5136529877787728692">F7</translation> @@ -3245,6 +3249,7 @@ <translation id="5328031682234198929">8</translation> <translation id="5329858601952122676">删除(&D)</translation> <translation id="5330145655348521461">这些文件已在其他桌面打开。请转至<ph name="USER_NAME" />(<ph name="MAIL_ADDRESS" />)查看这些文件。</translation> +<translation id="5330512191124428349">获取信息</translation> <translation id="5332624210073556029">时区:</translation> <translation id="5333807720589685258">如果您无法输入正确的 PIN 码解锁密钥,您的 SIM 卡将被永久停用。</translation> <translation id="5333958554630697967">启用开发中的实验性网络平台功能。</translation> @@ -3676,7 +3681,6 @@ <translation id="5892507820957994680">覆盖内置的软件渲染列表,并对不支持的系统配置启用 GPU 加速。</translation> <translation id="5895138241574237353">重新启动</translation> <translation id="5895187275912066135">颁发日期</translation> -<translation id="5898154795085152510">该服务器返回了一个无效的客户端证书。错误编号:<ph name="ERROR_NUMBER" /> (<ph name="ERROR_NAME" />)。</translation> <translation id="5900302528761731119">Google 个人资料照片</translation> <translation id="590253956165195626">询问是否翻译非您所用语言的网页。</translation> <translation id="5904093760909470684">代理配置</translation> @@ -3731,6 +3735,8 @@ <translation id="5984222099446776634">最近访问过的内容</translation> <translation id="5984814259619230127">Smart Lock 蓝牙低功耗发现模式</translation> <translation id="5986245990306121338">启用后,系统将显示标签页切换器,即使已在设置中选中“一并显示标签页和应用”选项也不例外。</translation> +<translation id="5989712527536636369"><ph name="BEGIN_PARAGRAPH1" />这是关于您的设备及其使用情况的一般信息,例如,电池电量、各个应用的使用频率、WLAN 和蓝牙等网络连接的质量和时长,以及出现异常时的崩溃报告。我们会使用这些数据来改善 Google 的各项产品和服务,让所有用户都受惠。另外,部分汇总信息也有助于我们的合作伙伴(例如 Android 开发者)改善其应用和产品。<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />您可以随时在 Android 应用的“设置”中开启或关闭此设置,这不会影响此设备为获得基本服务(如系统更新和安全保护)而发送所需信息的功能。<ph name="END_PARAGRAPH2" /></translation> <translation id="5990198433782424697">chrome:// 网址下的扩展程序</translation> <translation id="5990814808592353318">手动生成密码。</translation> <translation id="5991049340509704927">放大</translation> @@ -3744,6 +3750,7 @@ <translation id="6005695835120147974">媒体路由器</translation> <translation id="6007237601604674381">移动失败。<ph name="ERROR_MESSAGE" /></translation> <translation id="6008241731410823808">发送超链接审核 Ping。</translation> +<translation id="6011449291337289699">清除网站数据</translation> <translation id="6015796118275082299">年</translation> <translation id="6016551720757758985">确认 Powerwash 是否将设备还原到之前的版本</translation> <translation id="6016809788585079594">最后说一遍“Ok Google”</translation> @@ -3933,7 +3940,6 @@ <translation id="6276301056778294989">确保该设备显示的是相同的验证码。</translation> <translation id="6277105963844135994">网络超时</translation> <translation id="6277518330158259200">屏幕截图(&A)</translation> -<translation id="6278428485366576908">主题背景</translation> <translation id="6279183038361895380">按 |<ph name="ACCELERATOR" />| 可显示鼠标光标</translation> <translation id="6280215091796946657">使用其他帐户登录</translation> <translation id="6280912520669706465">ARC</translation> @@ -4184,6 +4190,7 @@ <translation id="6607272825297743757">文件信息</translation> <translation id="6607831829715835317">更多工具(&L)</translation> <translation id="6608140561353073361">所有 Cookie 和网站数据...</translation> +<translation id="6610183966322615106">添加打印机时出错</translation> <translation id="6610610633807698299">输入网址...</translation> <translation id="6612358246767739896">受保护的内容</translation> <translation id="6615455863669487791">显示图标</translation> @@ -4247,7 +4254,6 @@ <translation id="6708242697268981054">来源:</translation> <translation id="6709357832553498500">使用“<ph name="EXTENSIONNAME" />”连接</translation> <translation id="6710213216561001401">上一个</translation> -<translation id="6712158998835983046">显示所有内容(以动画形式)</translation> <translation id="6718273304615422081">正在压缩…</translation> <translation id="671928215901716392">锁定屏幕</translation> <translation id="6721972322305477112">文件(&F)</translation> @@ -4519,7 +4525,6 @@ <translation id="7088434364990739311">无法启动更新检查(错误代码为 <ph name="ERROR" />)。</translation> <translation id="708856090370082727">启用 OSK 滚动反弹支持。此项处于选中状态时,OSK 将仅调整可见视口的尺寸。</translation> <translation id="7088674813905715446">管理员已将该设备设置为已取消配置的状态。要让该设备能够注册,请让管理员将其设置为待处理状态。</translation> -<translation id="7089609847854449639">存储空间管理器</translation> <translation id="708969677220991657">允许通过 HTTPS 向本地主机发送请求(即使提供的证书无效)。</translation> <translation id="7092106376816104">弹出式窗口例外情况</translation> <translation id="7093866338626856921">与具有下列名称的设备交换数据:<ph name="HOSTNAMES" /></translation> @@ -4559,7 +4564,7 @@ <translation id="715118844758971915">传统打印机</translation> <translation id="7154130902455071009">将您的初始页更改为:<ph name="START_PAGE" /></translation> <translation id="7155171745945906037">相机或文件中的现有照片</translation> -<translation id="715568033737470079">指定将在 Win32k 锁定沙盒政策框架内运行的 PPAPI 插件(仅限 Windows 10 和更高版本)。</translation> +<translation id="7155226869555939647">始终打开 <ph name="APPLICATION" /> 的链接</translation> <translation id="7156235233373189579">此文件适用于采用Windows软件的PC,不适用于运行Chrome操作系统的设备。请在<ph name="BEGIN_LINK" />Chrome网上应用店<ph name="END_LINK" />中搜索合适的替代应用。<ph name="BEGIN_LINK_HELP" />了解详情<ph name="END_LINK_HELP" /></translation> <translation id="7157063064925785854">点击“继续”,即表示您同意遵守<ph name="LEGAL_DOC_LINK_TEXT_1" />、<ph name="LEGAL_DOC_LINK_TEXT_2" />、<ph name="LEGAL_DOC_LINK_TEXT_3" />和<ph name="LEGAL_DOC_LINK_TEXT_4" />。</translation> <translation id="7158238151765743968">仍在连接“<ph name="DEVICE_NAME" />”。</translation> @@ -4574,6 +4579,7 @@ <translation id="7175353351958621980">加载来源:</translation> <translation id="7180611975245234373">刷新</translation> <translation id="7180865173735832675">自定义</translation> +<translation id="7181387261278441780">清除数据并重置网站</translation> <translation id="7185078796915954712">TLS 1.3</translation> <translation id="7185690883425432021">当标签栏处于堆叠模式时,隐藏不活动标签页上的关闭按钮。</translation> <translation id="7186088072322679094">固定在工具栏中</translation> @@ -4606,7 +4612,6 @@ <translation id="7223775956298141902">啊哦,您没有任何扩展程序 :-(</translation> <translation id="7224023051066864079">子网掩码:</translation> <translation id="7225179976675429563">缺少网络类型</translation> -<translation id="7230191962699768124">显示所有内容(以非动画形式)</translation> <translation id="7230787553283372882">自定义文字大小</translation> <translation id="7231224339346098802">用数字指明要打印多少份(1 份或多份)。</translation> <translation id="7238585580608191973">SHA-256 指纹</translation> @@ -4615,7 +4620,7 @@ <translation id="7243055093079293866">在新标签页和 google.com 中说“Ok Google”</translation> <translation id="7243632151880336635">清除并退出</translation> <translation id="7245628041916450754"><ph name="WIDTH" /> x <ph name="HEIGHT" />(最佳)</translation> -<translation id="724691107663265825">要访问的网站包含恶意软件</translation> +<translation id="724691107663265825">您要访问的网站包含恶意软件</translation> <translation id="7246947237293279874">FTP 代理</translation> <translation id="725109152065019550">抱歉,您的管理员已停用了您帐户上的外部存储功能。</translation> <translation id="7252661675567922360">不要加载</translation> @@ -4731,7 +4736,6 @@ <translation id="7409233648990234464">重新启动并执行 Powerwash</translation> <translation id="7409836189476010449">运行 Flash</translation> <translation id="7410344089573941623"><ph name="HOST" /> 想要使用摄像头和麦克风时询问我是否同意</translation> -<translation id="7411343637221933631">{NUM_COOKIES,plural, =1{有 1 项来自此网站}other{有 # 项来自此网站}}</translation> <translation id="7412226954991670867">GPU 内存</translation> <translation id="7416362041876611053">未知网络错误。</translation> <translation id="7417453074306512035">埃塞俄比亚语键盘</translation> @@ -4851,6 +4855,7 @@ <translation id="756445078718366910">打开浏览器窗口</translation> <translation id="7564847347806291057">结束进程</translation> <translation id="7566723889363720618">F12</translation> +<translation id="7567314848159753396">Cookie:<ph name="NAME" /></translation> <translation id="756809126120519699">已清除 Chrome 数据</translation> <translation id="7568790562536448087">更新</translation> <translation id="7573172247376861652">电池充电</translation> @@ -4891,6 +4896,7 @@ <translation id="7626009897377900107">密码生成功能</translation> <translation id="7627262197844840899">此网站不接受万事达卡。</translation> <translation id="7627790789328695202">糟糕,<ph name="FILE_NAME" />已存在。请改用其他名称并重试。</translation> +<translation id="7628127343934101653">在默认 PDF 查看器应用中打开 PDF 文件。</translation> <translation id="762917759028004464">目前的默认浏览器是 <ph name="BROWSER_NAME" />。</translation> <translation id="7629536005696009600">允许将存储的 Android 应用专用凭据填充到相应的网站。</translation> <translation id="7629827748548208700">标签页:<ph name="TAB_NAME" /></translation> @@ -5119,6 +5125,7 @@ <translation id="7957513156576779045">开启蓝牙功能以允许配对</translation> <translation id="7957615753207896812">打开键盘设备设置</translation> <translation id="7959074893852789871">该文件包含多个证书,其中部分证书未导入:</translation> +<translation id="7959700692661109221"><ph name="BEGIN_PARAGRAPH" />Google 的位置信息服务会使用 WLAN 等来源来帮助更快速、更准确地确定您设备所在的大致位置。当您打开 Google 的位置信息服务时,您的设备就会进入使用 WLAN 来提供位置信息的模式。您可以随时在位置信息设置中关闭此服务。<ph name="END_PARAGRAPH" /></translation> <translation id="7961015016161918242">一律不</translation> <translation id="7964089325405904043">密码导入和导出</translation> <translation id="7965010376480416255">共享内存</translation> @@ -5269,6 +5276,7 @@ <translation id="8146793085009540321">登录失败,请与管理员联系或重试。</translation> <translation id="8148264977957212129">拼音输入法</translation> <translation id="8148913456785123871">在启动器中显示 Google 即时贴</translation> +<translation id="8150391391298684512">停用 Windows Runtime MIDI API</translation> <translation id="8151185429379586178">开发者工具</translation> <translation id="8151638057146502721">配置</translation> <translation id="8151639108075998630">启用访客浏览</translation> @@ -5549,6 +5557,7 @@ <translation id="8532294913309524834">根据您的偏好设置对语言进行排序。</translation> <translation id="8535005006684281994">Netscape 证书续订网址</translation> <translation id="8539727552378197395">否(仅 Http)</translation> +<translation id="8541084862688000575">自动加载 Android 应用</translation> <translation id="8543181531796978784">您可以<ph name="BEGIN_ERROR_LINK" />报告检测问题<ph name="END_ERROR_LINK" />;或者,如果您了解自己将面临的安全风险,则可以<ph name="BEGIN_LINK" />访问这个不安全的网站<ph name="END_LINK" />。</translation> <translation id="8545107379349809705">隐藏信息...</translation> <translation id="8545211332741562162">允许网页使用实验性 JavaScript 功能。</translation> @@ -5576,7 +5585,6 @@ <translation id="8569764466147087991">选择要打开的文件</translation> <translation id="8571032220281885258">听到您说“Ok Google”后,Chrome将搜索您接下来所说的内容。</translation> <translation id="8571108619753148184">服务器 4</translation> -<translation id="8572832761467613633">仅限 Flash</translation> <translation id="8572981282494768930">不允许网站使用您的摄像头和麦克风</translation> <translation id="8574234089711453001">允许在通过媒体网址打开网页时显示下载按钮。</translation> <translation id="857779305329188634">启用实验性 QUIC 协议支持。</translation> @@ -5598,6 +5606,7 @@ <translation id="8600929685092827187">唤醒数据包</translation> <translation id="8601206103050338563">TLS WWW 客户端身份验证</translation> <translation id="8602851771975208551">您计算机上的其他程序添加了一个应用,该应用可能会改变 Chrome 的工作方式。</translation> +<translation id="8603912787021349466">允许 Android 应用在用户登录后自动启动。</translation> <translation id="8605428685123651449">SQLite 使用的内存</translation> <translation id="8605503133013456784">无法与“<ph name="DEVICE_NAME" />”取消配对并断开连接。</translation> <translation id="8606726445206553943">使用您的 MIDI 设备</translation> @@ -5950,6 +5959,7 @@ <translation id="9053965862400494292">尝试设置同步时发生错误。</translation> <translation id="9056034633062863292">正在更新 Chromebox</translation> <translation id="9056810968620647706">未找到匹配项。</translation> +<translation id="9057119625587205566">附近没有打印机</translation> <translation id="9059868303873565140">状态菜单</translation> <translation id="9064142312330104323">Google 个人资料照片(正在加载)</translation> <translation id="9064275926664971810">启用自动填充功能后,只需点击一次即可填写多个表单</translation> @@ -5960,6 +5970,7 @@ <translation id="9067401056540256169">启用此项会导致Chrome不安全。除非您了解其作用,否则请不要使用它。请注意:此项日后可能会被弃用,恕不另行通知。如果您启用了此项,来自https来源的框架将可以使用来自不安全网址(ws://)的WebSocket。</translation> <translation id="9068931793451030927">路径:</translation> <translation id="9070219033670098627">切换用户</translation> +<translation id="9070940116164932228">对 CPU 占用较多的后台计时器进行限制</translation> <translation id="907148966137935206">不允许任何网站显示弹出式窗口(推荐)</translation> <translation id="9072550133391925347"><ph name="PASSWORD_MANAGER_BRAND" /> 会使用您保存的密码让您自动登录到符合条件的网站和应用。</translation> <translation id="9073281213608662541">PAP</translation> @@ -5993,6 +6004,7 @@ <translation id="9112614144067920641">请选择新的 PIN。</translation> <translation id="9112748030372401671">更换您的壁纸</translation> <translation id="9112987648460918699">查找...</translation> +<translation id="9114663181201435112">轻松登录</translation> <translation id="9115487443206954631">管理投射设备</translation> <translation id="9115675100829699941">书签(&B)</translation> <translation id="9121814364785106365">在固定标签页中打开</translation> @@ -6087,7 +6099,6 @@ <translation id="952992212772159698">未激活</translation> <translation id="960719561871045870">运营商代码</translation> <translation id="960987915827980018">约剩 1 小时</translation> -<translation id="962778376131245616">仅显示不安全的内容(以动画形式)</translation> <translation id="96421021576709873">Wi-Fi 网络</translation> <translation id="965490406356730238">为捕获的帧启用硬件加速 mjpeg 解码功能(若适用)。</translation> <translation id="968174221497644223">应用缓存</translation>
diff --git a/chrome/app/resources/generated_resources_zh-TW.xtb b/chrome/app/resources/generated_resources_zh-TW.xtb index 25cef78b..1a3c4f9 100644 --- a/chrome/app/resources/generated_resources_zh-TW.xtb +++ b/chrome/app/resources/generated_resources_zh-TW.xtb
@@ -18,7 +18,6 @@ <translation id="1029317248976101138">縮放</translation> <translation id="1029595648591494741">您要試用「<ph name="EXTENSION_NAME" />」嗎?</translation> <translation id="1031362278801463162">正在載入預覽畫面</translation> -<translation id="1031460590482534116">嘗試儲存用戶端憑證時發生錯誤,錯誤碼: <ph name="ERROR_NUMBER" /> (<ph name="ERROR_NAME" />)。</translation> <translation id="1031573127485938293">詢問 (依政策)</translation> <translation id="103279545524624934">請釋出磁碟空間以啟動 Android 應用程式。</translation> <translation id="1033780634303702874">存取您的序列裝置</translation> @@ -101,6 +100,7 @@ <translation id="1128591060186966949">編輯搜尋引擎</translation> <translation id="1128987120443782698">儲存裝置的容量為 <ph name="DEVICE_CAPACITY" />,請插入 4GB 以上容量的 SD 卡或 USB 隨身碟。</translation> <translation id="1137135726305341424">domContentLoaded 和 domContentLoaded 之前開始載入的所有資源 (主頁框和來源相同的 iframe)。</translation> +<translation id="1138663153846032155">讓 HTML 優先於 Flash</translation> <translation id="1140351953533677694">存取您的藍牙和序列裝置</translation> <translation id="114140604515785785">擴充功能根目錄:</translation> <translation id="1143142264369994168">憑證簽署者</translation> @@ -252,6 +252,7 @@ <translation id="1351692861129622852">正在匯入 <ph name="FILE_COUNT" /> 個檔案...</translation> <translation id="1352103415082130575">泰文鍵盤 (Pattachote)</translation> <translation id="1353686479385938207"><ph name="PROVIDER_NAME" />:<ph name="NETWORK_NAME" /></translation> +<translation id="1353946958707294039">Material Design 儲存空間管理員</translation> <translation id="1353966721814789986">起始網頁</translation> <translation id="1354868058853714482">Adobe Reader 版本過舊,可能會導致安全性問題。</translation> <translation id="1355408554203439639">3D 軟體點陣圖轉換器</translation> @@ -423,7 +424,6 @@ <translation id="1533920822694388968">電視畫面校正</translation> <translation id="15373452373711364">大型滑鼠游標</translation> <translation id="1543284117603151572">從 Edge 匯入的書籤</translation> -<translation id="1544350195767834591">{NUM_COOKIES,plural, =1{1 個 Cookie (來自其他網站)}other{# 個 Cookie (來自其他網站)}}</translation> <translation id="1545177026077493356">自動 Kiosk 模式</translation> <translation id="1545786162090505744">網址 (以 %s 取代查詢)</translation> <translation id="1546280085599573572">這個擴充功能已變更您點選 [首頁] 按鈕時所顯示的網頁。</translation> @@ -447,7 +447,6 @@ <translation id="1559235587769913376">輸入 Unicode 字元</translation> <translation id="1561092721008294962">針對使用者介面文字啟用 HarfBuzz</translation> <translation id="1566049601598938765">網站</translation> -<translation id="1566958206723629112">Flash 和 PDF</translation> <translation id="1567723158593978621">啟用後,登入瀏覽器時將使用全新的 GAIA 密碼分離式登入流程。</translation> <translation id="1567993339577891801">JavaScript 控制台</translation> <translation id="1568323446248056064">開啟顯示裝置設定</translation> @@ -576,7 +575,6 @@ <translation id="1723940674997333416">允許 https 來源的不安全 WebSocket</translation> <translation id="1725149567830788547">顯示控制介面(&C)</translation> <translation id="172612876728038702">正在設定可信任平台模組 (TPM),可能需要幾分鐘的時間,請耐心等候。</translation> -<translation id="1727135806684246609">Material Design 安全性詳細資訊</translation> <translation id="1729533290416704613">這個擴充功能也會控管您使用網址列搜尋時所顯示的網頁。</translation> <translation id="1731346223650886555">分號</translation> <translation id="1731589410171062430">總計:<ph name="NUMBER_OF_SHEETS" /> 張,<ph name="SHEETS_LABEL" /> (<ph name="NUMBER_OF_PAGES" /> 頁,<ph name="PAGE_OR_PAGES_LABEL" />)</translation> @@ -872,6 +870,7 @@ <translation id="218492098606937156">啟用觸控事件</translation> <translation id="2187317261103489799">偵測 (預設)</translation> <translation id="2187895286714876935">伺服器憑證匯入錯誤</translation> +<translation id="2188881192257509750">開啟「<ph name="APPLICATION" />」</translation> <translation id="2190069059097339078">WiFi 憑證擷取工具</translation> <translation id="219008588003277019">Native Client 模組:<ph name="NEXE_NAME" /></translation> <translation id="2190355936436201913">(空白)</translation> @@ -990,6 +989,7 @@ <translation id="2326606747676847821">進入無痕模式</translation> <translation id="2326931316514688470">重新載入應用程式(&R)</translation> <translation id="2327492829706409234">啟用應用程式</translation> +<translation id="2328054044222305089">這會將 <ph name="SITE" /> 儲存在你裝置上的資料全部刪除,並重設你授予的所有權限。你要繼續操作嗎?</translation> <translation id="2329597144923131178">登入後,即可從您使用的任何裝置取得自己的書籤、歷史紀錄、密碼和其他設定。</translation> <translation id="2332131598580221120">前往商店查看</translation> <translation id="2332742915001411729">重設為預設值</translation> @@ -1265,7 +1265,6 @@ <translation id="2675358154061544447">(高度實驗性) 支援在其他處理程序中轉譯跨網站 iframe。在這個模式中,只有來自相同網站的文件才能共用轉譯程序。</translation> <translation id="2676946222714718093">目前播放裝置:</translation> <translation id="2678063897982469759">重新啟用</translation> -<translation id="2678246812096664977">所有外掛程式</translation> <translation id="2679385451463308372">使用系統對話方塊列印…</translation> <translation id="2680208403056680091">您的網際網路連線目前受到控制</translation> <translation id="268053382412112343">記錄(&S)</translation> @@ -1439,7 +1438,6 @@ <translation id="287286579981869940">新增 <ph name="PROVIDER_NAME" />...</translation> <translation id="2872961005593481000">關閉</translation> <translation id="2875698561019555027">(Chrome 錯誤頁面)</translation> -<translation id="2879560882721503072">成功儲存 <ph name="ISSUER" /> 發出的用戶端憑證。</translation> <translation id="288024221176729610">捷克文</translation> <translation id="288042212351694283">存取您的 Universal 2nd Factor 裝置</translation> <translation id="2881966438216424900">最後存取日期;</translation> @@ -1475,7 +1473,7 @@ <translation id="2918322085844739869">4</translation> <translation id="2918583523892407401">使用 Chrome 同步沙箱</translation> <translation id="291886813706048071">您可以從這裡使用 <ph name="SEARCH_ENGINE" /> 進行搜尋</translation> -<translation id="2921081876747860777">請建立密碼,保護你的本機資料。</translation> +<translation id="2921081876747860777">請設定密碼,保護你的本機資料。</translation> <translation id="2923240520113693977">愛沙尼亞</translation> <translation id="29232676912973978">管理連線...</translation> <translation id="2924296707677495905">音譯 (namaskaram → ನಮಸ್ಕಾರ)</translation> @@ -1588,6 +1586,7 @@ <translation id="3057861065630527966">備份您的相片和影片</translation> <translation id="3058212636943679650">如果您需要還原電腦的作業系統,請準備復原系統所需的 SD 卡或 USB 隨身碟。</translation> <translation id="305932878998873762">HTTP 簡易快取是一種新的快取檔案,必須透過檔案系統配置磁碟空間。</translation> +<translation id="3060251871394327123">這會將 <ph name="SITE" /> 儲存在你裝置上的資料全部刪除。你要繼續操作嗎?</translation> <translation id="3061650404498811439">允許選擇透過輸入法編輯器選單存取表情符號、手寫輸入和語音輸入。</translation> <translation id="3062606427884046423">讓 Chrome 媒體通知使用 Android MediaStyle 通知。</translation> <translation id="3063844757726132584">這個便捷的啟動器能讓您存取所有應用程式。您可以從這裡選擇玩遊戲、進行視訊通訊、聆聽音樂、編輯文件,或是下載更多應用程式。</translation> @@ -1637,6 +1636,7 @@ <translation id="3123569374670379335">(受監管)</translation> <translation id="3124111068741548686">USER 控制代碼</translation> <translation id="3126026824346185272">Ctrl</translation> +<translation id="3127156390846601284">這會將顯示的所有網站儲存在你裝置上的資料全部刪除。你要繼續操作嗎?</translation> <translation id="312759608736432009">裝置製造商:</translation> <translation id="3127919023693423797">驗證中...</translation> <translation id="3128230619496333808">分頁 6</translation> @@ -1735,7 +1735,6 @@ <translation id="3264544094376351444">Sans-serif 字型</translation> <translation id="3264547943200567728">無法設定 Chromebox 的網路</translation> <translation id="3265459715026181080">關閉視窗</translation> -<translation id="3267271790328635957">僅限 PDF</translation> <translation id="3267726687589094446">繼續允許自動下載多個檔案</translation> <translation id="3267998849713137817">上次修改時間</translation> <translation id="3268451620468152448">開啟的分頁</translation> @@ -1981,6 +1980,7 @@ <translation id="3574210789297084292">登入</translation> <translation id="3574305903863751447"><ph name="COUNTRY" />,<ph name="STATE" />,<ph name="CITY" /></translation> <translation id="357479282490346887">立陶宛文</translation> +<translation id="3575927481544652747">針對 WebMIDI 停用 Windows Runtime MIDI API (在 Windows 10 以上版本的作業系統預設為啟用)。</translation> <translation id="3576324189521867626">已成功安裝</translation> <translation id="3578331450833904042">預設 (拾取所有聲音)</translation> <translation id="3578594933904494462">正在分享這個分頁的內容。</translation> @@ -2034,8 +2034,6 @@ <translation id="3627320433825461852">剩下不到 1 分鐘</translation> <translation id="3627588569887975815">在無痕式視窗中開啟連結(&G)</translation> <translation id="3627671146180677314">Netscape 憑證更新時間</translation> -<translation id="3629326610814700057">允許儲存空間管理員管理本機儲存空間。</translation> -<translation id="3630337581925712713"><ph name="PERMISSION_TYPE_LABEL" />:</translation> <translation id="3631337165634322335">下列的例外情形僅適用於目前的無痕模式工作階段。</translation> <translation id="3633586230741134985">應用程式啟動器設定</translation> <translation id="3633997706330212530">您可以選擇停用這些服務。</translation> @@ -2058,7 +2056,8 @@ <translation id="3654045516529121250">讀取您的協助工具設定</translation> <translation id="3654092442379740616">同步功能發生錯誤:<ph name="PRODUCT_NAME" /> 版本過舊,必須更新。</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{應用程式可永久存取 1 個檔案。}other{應用程式可永久存取 # 個檔案。}}</translation> -<translation id="3657468915905674858">啟用 PPAPI Win32k 鎖定。</translation> +<translation id="365793796291733849"><ph name="BEGIN_PARAGRAPH1" />開啟自動備份功能後,系統會定期將裝置和應用程式資料儲存到 Google 雲端硬碟中的私人資料夾。應用程式資料泛指應用程式依據開發人員設定所儲存的任何資料,可能包括聯絡人、訊息和相片這類機密資料。<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />備份資料不會計入雲端硬碟儲存空間配額。此外,系統不會備份大型檔案或開發人員選擇排除在服務外的檔案。<ph name="END_PARAGRAPH2" /></translation> <translation id="3660234220361471169">不受信任</translation> <translation id="3665589677786828986">Chrome 偵測到另一個程式竄改了部分瀏覽器設定,現已將這些設定重設為原始預設值。</translation> <translation id="3665842570601375360">安全性:</translation> @@ -2113,6 +2112,7 @@ <translation id="3733127536501031542">具有 Step-Up 功能的 SSL 伺服器</translation> <translation id="3736520371357197498">如果您瞭解安全性風險,也可以選擇在危險程式尚未遭到移除的狀態下<ph name="BEGIN_LINK" />造訪這個不安全的網站<ph name="END_LINK" />。</translation> <translation id="3738924763801731196"><ph name="OID" />:</translation> +<translation id="3739254215541673094">要開啟「<ph name="APPLICATION" />」嗎?</translation> <translation id="3739798227959604811">重複延遲時間:</translation> <translation id="3741158646617793859"><ph name="DEVICE_NAME" /> 會顯示在管理員控制台中</translation> <translation id="3741243925913727067">將您媒體裝置上的相片和影片備份到 Google 雲端硬碟。</translation> @@ -2350,7 +2350,6 @@ <translation id="4058793769387728514">立即檢查文件</translation> <translation id="4059285154003114015">列印頁框(&P)...</translation> <translation id="406070391919917862">背景應用程式</translation> -<translation id="4061502419206152498">僅顯示不安全的內容,非動畫項目</translation> <translation id="4062251648694601778">祝您使用 <ph name="SHORT_PRODUCT_NAME" /> 裝置愉快!如有任何問題,只要按一下狀態匣中的 [?],我們將隨時為您提供協助。</translation> <translation id="4065876735068446555">目前使用的網路 (<ph name="NETWORK_ID" />) 可能會要求您造訪登入網頁。</translation> <translation id="4068506536726151626">這個網頁包含來自下列網站的元素,且這些元素正在追蹤您的位置:</translation> @@ -2389,7 +2388,6 @@ <translation id="4101878899871018532">密碼管理員將不再詢問您是否要儲存同步處理所需的憑證。</translation> <translation id="410351446219883937">自動播放</translation> <translation id="4104163789986725820">匯出(&X)...</translation> -<translation id="4105523032910086267">設定 Material Design 動畫與安全性詳細資訊的顯示設定。</translation> <translation id="4105563239298244027">取得 1 TB 的免費 Google 雲端硬碟空間</translation> <translation id="4109135793348361820">將視窗傳送給 <ph name="USER_NAME" /> (<ph name="USER_EMAIL" />)</translation> <translation id="4110342520124362335">系統已封鎖 <ph name="DOMAIN" /> 的 Cookie。</translation> @@ -2440,6 +2438,7 @@ <translation id="418179967336296930">俄文語音 (YaZHert) 鍵盤</translation> <translation id="4181841719683918333">語言</translation> <translation id="4187248015940562149">啟用網路藍牙,允許網站與附近的藍牙裝置連線並控制這些裝置。</translation> +<translation id="4188447344915957833">在 Material Design 設定中啟用儲存空間管理員。</translation> <translation id="4189406272289638749"><b><ph name="EXTENSION_NAME" /></b> 擴充功能正在控制這項設定。</translation> <translation id="4193154014135846272">Google 文件</translation> <translation id="4193182321948161343">啟用 Material Design 使用者管理工具</translation> @@ -2647,6 +2646,7 @@ <translation id="4508765956121923607">檢視原始碼(&O)</translation> <translation id="4509017836361568632">捨棄相片</translation> <translation id="4509345063551561634">位置:</translation> +<translation id="4513946894732546136">意見回饋</translation> <translation id="4514542542275172126">設定新的受監管使用者</translation> <translation id="4514914692061505365">針對所有 pexe 檔強制使用 PNaCl 的快速 Subzero 轉譯器。</translation> <translation id="451515744433878153">移除</translation> @@ -2745,6 +2745,7 @@ <translation id="4656293982926141856">這台電腦</translation> <translation id="4656631038341342120">啟用 VR 殼層 (如果適用於這個裝置的話)。</translation> <translation id="4657031070957997341">一律允許在 <ph name="HOST" /> 執行外掛程式</translation> +<translation id="466008749075469935">啟用節流設定,將背景計時器的 CPU 使用率限於 1%。</translation> <translation id="4663254525753315077">在可能的情況下,將溢位捲動元素的捲動內容放置至複合式圖層上,以提升捲動速度。</translation> <translation id="4664482161435122549">PKCS #12 匯出錯誤</translation> <translation id="4665014895760275686">製造商</translation> @@ -2811,6 +2812,7 @@ <translation id="4749157430980974800">喬治亞文鍵盤</translation> <translation id="4750394297954878236">建議</translation> <translation id="475088594373173692">第一位使用者</translation> +<translation id="4750892496809949692">在外掛程式清單中隱藏 Flash,優先使用 HTML 內容。</translation> <translation id="4750917950439032686">你傳送給這個網站的資訊 (例如密碼或信用卡號碼) 不會外洩。</translation> <translation id="4753602155423695878">Android 手機的網頁載入進度列動畫</translation> <translation id="4755240240651974342">芬蘭文鍵盤</translation> @@ -3084,6 +3086,7 @@ <translation id="5119450342834678097">設定選單中的要求顯示平板電腦版網站選項</translation> <translation id="5120068803556741301">第三方輸入法</translation> <translation id="5120421890733714118">信任這個用來識別網站的憑證。</translation> +<translation id="5120516977819314347">PIN 或密碼不正確。</translation> <translation id="5121130586824819730">您的硬碟已滿。請選擇其他儲存位置,或清出足夠的硬碟空間。</translation> <translation id="5125751979347152379">網址無效。</translation> <translation id="5127881134400491887">管理網路連線</translation> @@ -3091,6 +3094,7 @@ <translation id="512903556749061217">已附加</translation> <translation id="5129301143853688736">您與這個網站之間的連線不是私人連線。攻擊者可能會嘗試從 <ph name="DOMAIN" /> 竊取您的資訊 (例如相片、密碼、郵件和信用卡資訊)。</translation> <translation id="5129662217315786329">波蘭文</translation> +<translation id="5131347545782851480">PDF 文件</translation> <translation id="5134856901811723984">在 Chrome 作業系統使用者介面啟用/停用 Material Design</translation> <translation id="5135533361271311778">無法建立書籤項目。</translation> <translation id="5136529877787728692">F7</translation> @@ -3258,6 +3262,7 @@ <translation id="5328031682234198929">8</translation> <translation id="5329858601952122676">刪除(&D)</translation> <translation id="5330145655348521461">這些檔案已在其他電腦上開啟。前往 <ph name="USER_NAME" /> (<ph name="MAIL_ADDRESS" />) 查看。</translation> +<translation id="5330512191124428349">取得資訊</translation> <translation id="5332624210073556029">時區:</translation> <translation id="5333807720589685258">如果無法輸入正確的 PIN 解鎖金鑰, SIM 卡會遭到永久停用。</translation> @@ -3690,7 +3695,6 @@ <translation id="5892507820957994680">覆寫內建的軟體轉譯清單,並針對不受支援的系統設定啟用 GPU 加速處理功能。</translation> <translation id="5895138241574237353">重新啟動</translation> <translation id="5895187275912066135">發行日期</translation> -<translation id="5898154795085152510">伺服器傳回無效的用戶端憑證,錯誤碼:<ph name="ERROR_NUMBER" /> (<ph name="ERROR_NAME" />)。</translation> <translation id="5900302528761731119">Google 個人資料相片</translation> <translation id="590253956165195626">詢問是否將網頁翻譯成您所用的語言。</translation> <translation id="5904093760909470684">Proxy 設定</translation> @@ -3745,6 +3749,8 @@ <translation id="5984222099446776634">最近造訪的網站</translation> <translation id="5984814259619230127">Smart Lock 藍牙低功耗技術 (Bluetooth Low Energy) 探索功能</translation> <translation id="5986245990306121338">啟用後,即使設定中的「合併分頁與應用程式」選項已開啟,仍會顯示分頁切換工具。</translation> +<translation id="5989712527536636369"><ph name="BEGIN_PARAGRAPH1" />這是關於你的裝置與使用行為的一般資訊,包括電池電量、應用程式使用頻率、網路連線 (例如 Wi-Fi 和藍牙) 品質與連線時間,以及功能無法正常執行時的當機報告。這些資料將用於改善 Google 的各項產品與服務,讓所有使用者受惠。此外,部分匯總資訊也有助於合作夥伴 (例如 Android 開發人員) 改善其應用程式和產品。<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />你隨時可以在 Android 應用程式設定中開啟或關閉這項設定,這不會對裝置傳送必要資訊以取得基本服務 (例如系統更新與安全性) 的功能造成影響。<ph name="END_PARAGRAPH2" /></translation> <translation id="5990198433782424697">針對 chrome:// 網址的擴充功能</translation> <translation id="5990814808592353318">手動產生密碼。</translation> <translation id="5991049340509704927">放大</translation> @@ -3758,6 +3764,7 @@ <translation id="6005695835120147974">媒體路由器</translation> <translation id="6007237601604674381">移動失敗,<ph name="ERROR_MESSAGE" /></translation> <translation id="6008241731410823808">傳送超連結稽核偵測。</translation> +<translation id="6011449291337289699">清除網站資料</translation> <translation id="6015796118275082299">年</translation> <translation id="6016551720757758985">確認執行 Powerwash 並還原至上一個版本</translation> <translation id="6016809788585079594">說最後一次「Ok Google」</translation> @@ -3947,7 +3954,6 @@ <translation id="6276301056778294989">請確定裝置顯示相同的安全代碼。</translation> <translation id="6277105963844135994">網路逾時</translation> <translation id="6277518330158259200">擷取螢幕畫面(&A)</translation> -<translation id="6278428485366576908">主題</translation> <translation id="6279183038361895380">按下 |<ph name="ACCELERATOR" />| 即可顯示游標</translation> <translation id="6280215091796946657">以其他帳戶登入</translation> <translation id="6280912520669706465">ARC</translation> @@ -4198,6 +4204,7 @@ <translation id="6607272825297743757">檔案資訊</translation> <translation id="6607831829715835317">更多工具(&L)</translation> <translation id="6608140561353073361">所有 Cookie 和網站資料...</translation> +<translation id="6610183966322615106">新增印表機時發生錯誤</translation> <translation id="6610610633807698299">輸入網址...</translation> <translation id="6612358246767739896">受保護內容</translation> <translation id="6615455863669487791">顯示</translation> @@ -4261,7 +4268,6 @@ <translation id="6708242697268981054">來源:</translation> <translation id="6709357832553498500">使用「<ph name="EXTENSIONNAME" />」連線</translation> <translation id="6710213216561001401">返回</translation> -<translation id="6712158998835983046">全部顯示,動畫項目</translation> <translation id="6718273304615422081">壓縮中...</translation> <translation id="671928215901716392">鎖定螢幕</translation> <translation id="6721972322305477112">檔案(&F)</translation> @@ -4533,7 +4539,6 @@ <translation id="7088434364990739311">無法啟動更新檢查 (錯誤代碼 <ph name="ERROR" />)。</translation> <translation id="708856090370082727">啟用 OSK 邊界捲動支援功能。啟用這項標記後,OSK 只會調整檢視點大小。</translation> <translation id="7088674813905715446">管理員已將這個裝置設為取消佈建狀態。如要讓裝置符合註冊資格,請要求您的管理員將裝置設為待處理狀態。</translation> -<translation id="7089609847854449639">儲存空間管理員</translation> <translation id="708969677220991657">即使憑證無效,仍允許透過 HTTPS 傳送要求給本機主機。</translation> <translation id="7092106376816104">彈出式視窗例外</translation> <translation id="7093866338626856921">與下列名稱的裝置交換資料:<ph name="HOSTNAMES" /></translation> @@ -4573,7 +4578,7 @@ <translation id="715118844758971915">傳統印表機</translation> <translation id="7154130902455071009">將您的起始網頁變更為:<ph name="START_PAGE" /></translation> <translation id="7155171745945906037">現有的相機相片或圖庫相片</translation> -<translation id="715568033737470079">指定將在 Win32k 鎖定沙箱政策中執行的 PPAPI 外掛程式 (僅限 Windows 10 以上版本的系統)。</translation> +<translation id="7155226869555939647">一律開啟「<ph name="APPLICATION" />」的連結</translation> <translation id="7156235233373189579">這個檔案是專為使用 Windows 軟體的 PC 電腦所設計,與搭載 Chrome 作業系統的裝置不相容。請前往 <ph name="BEGIN_LINK" />Chrome 線上應用程式商店<ph name="END_LINK" />尋找適合的替代應用程式。<ph name="BEGIN_LINK_HELP" />瞭解詳情<ph name="END_LINK_HELP" /></translation> <translation id="7157063064925785854">按一下 [繼續] 即表示您同意接受《<ph name="LEGAL_DOC_LINK_TEXT_1" />》、《<ph name="LEGAL_DOC_LINK_TEXT_2" />》、《<ph name="LEGAL_DOC_LINK_TEXT_3" />》和《<ph name="LEGAL_DOC_LINK_TEXT_4" />》中的各項規定。</translation> <translation id="7158238151765743968">仍在連線至「<ph name="DEVICE_NAME" />」。</translation> @@ -4588,6 +4593,7 @@ <translation id="7175353351958621980">載入來源:</translation> <translation id="7180611975245234373">重新整理</translation> <translation id="7180865173735832675">自訂</translation> +<translation id="7181387261278441780">清除網站資料並重設權限</translation> <translation id="7185078796915954712">TLS 1.3</translation> <translation id="7185690883425432021">在分頁列處於堆疊模式時隱藏閒置分頁的關閉按鈕。</translation> <translation id="7186088072322679094">固定在工具列中</translation> @@ -4620,7 +4626,6 @@ <translation id="7223775956298141902">唉... 您沒有任何擴充程式 :-(</translation> <translation id="7224023051066864079">子網路遮罩:</translation> <translation id="7225179976675429563">找不到網路類型</translation> -<translation id="7230191962699768124">全部顯示,非動畫項目</translation> <translation id="7230787553283372882">自訂文字大小</translation> <translation id="7231224339346098802">使用數字指定列印份數 (1 或多份)。</translation> <translation id="7238585580608191973">SHA-256 指紋</translation> @@ -4750,7 +4755,6 @@ <translation id="7409233648990234464">重新啟動並執行 Powerwash</translation> <translation id="7409836189476010449">執行 Flash</translation> <translation id="7410344089573941623">當 <ph name="HOST" /> 要求存取攝影機和麥克風時詢問我。</translation> -<translation id="7411343637221933631">{NUM_COOKIES,plural, =1{1 個 Cookie (來自這個網站)}other{# 個 Cookie (來自這個網站)}}</translation> <translation id="7412226954991670867">GPU 記憶體</translation> <translation id="7416362041876611053">不明的網路錯誤。</translation> <translation id="7417453074306512035">衣索比亞文鍵盤</translation> @@ -4871,6 +4875,7 @@ <translation id="756445078718366910">開啟瀏覽器視窗</translation> <translation id="7564847347806291057">結束處理程序</translation> <translation id="7566723889363720618">F12</translation> +<translation id="7567314848159753396">Cookie:<ph name="NAME" /></translation> <translation id="756809126120519699">已清除 Chrome 資料</translation> <translation id="7568790562536448087">更新</translation> <translation id="7573172247376861652">電池充電</translation> @@ -4911,6 +4916,7 @@ <translation id="7626009897377900107">產生密碼</translation> <translation id="7627262197844840899">這個網站不接受 MasterCard 信用卡。</translation> <translation id="7627790789328695202">糟糕!已存在名為 <ph name="FILE_NAME" /> 的檔案。請重新命名檔案並再試一次。</translation> +<translation id="7628127343934101653">在預設的 PDF 檢視器應用程式中開啟 PDF 檔案。</translation> <translation id="762917759028004464">預設瀏覽器目前是 <ph name="BROWSER_NAME" />。</translation> <translation id="7629536005696009600">允許使用 Android 應用程式儲存的憑證填入對應的網站。</translation> <translation id="7629827748548208700">分頁:<ph name="TAB_NAME" /></translation> @@ -5139,6 +5145,7 @@ <translation id="7957513156576779045">如要允許配對,請開啟藍牙功能</translation> <translation id="7957615753207896812">開啟鍵盤裝置設定</translation> <translation id="7959074893852789871">檔案含有多個憑證,但某些無法匯入:</translation> +<translation id="7959700692661109221"><ph name="BEGIN_PARAGRAPH" />Google 的定位服務會使用 Wi‑Fi 這類資源,以便快速精確地判斷裝置的所在位置。開啟 Google 的定位服務後,裝置將會進入使用 Wi‑Fi 提供位置資訊的模式。你隨時可以在位置資訊設定中關閉這個模式。<ph name="END_PARAGRAPH" /></translation> <translation id="7961015016161918242">一律不要</translation> <translation id="7964089325405904043">密碼匯入/匯出</translation> <translation id="7965010376480416255">共用記憶體</translation> @@ -5289,6 +5296,7 @@ <translation id="8146793085009540321">登入失敗,請與您的管理員聯絡或再試一次。</translation> <translation id="8148264977957212129">拼音輸入法</translation> <translation id="8148913456785123871">在啟動器中顯示 Google 即時資訊卡</translation> +<translation id="8150391391298684512">停用 Windows Runtime MIDI API</translation> <translation id="8151185429379586178">開發人員工具</translation> <translation id="8151638057146502721">設定</translation> <translation id="8151639108075998630">啟用訪客瀏覽</translation> @@ -5569,6 +5577,7 @@ <translation id="8532294913309524834">根據您的偏好排列語言順序。</translation> <translation id="8535005006684281994">Netscape 憑證更新網址</translation> <translation id="8539727552378197395">否 (限 Http)</translation> +<translation id="8541084862688000575">自動載入 Android 應用程式</translation> <translation id="8543181531796978784">您可以<ph name="BEGIN_ERROR_LINK" />回報偵測問題<ph name="END_ERROR_LINK" />。或者在您瞭解安全性風險後,仍然可以<ph name="BEGIN_LINK" />前往這個不安全的網站<ph name="END_LINK" />。</translation> <translation id="8545107379349809705">隱藏資訊...</translation> <translation id="8545211332741562162">讓網頁使用實驗性 JavaScript 功能。</translation> @@ -5596,7 +5605,6 @@ <translation id="8569764466147087991">選取要開啟的檔案</translation> <translation id="8571032220281885258">當您說出「Ok Google」啟動字詞,Chrome 就會搜尋您接下來所說的內容。</translation> <translation id="8571108619753148184">伺服器 4</translation> -<translation id="8572832761467613633">僅限 Flash</translation> <translation id="8572981282494768930">不允許任何網站使用您的攝影機和麥克風</translation> <translation id="8574234089711453001">開啟含有媒體檔案的網頁時允許顯示下載按鈕。</translation> <translation id="857779305329188634">啟用實驗性 QUIC 通訊協定支援。</translation> @@ -5618,6 +5626,7 @@ <translation id="8600929685092827187">喚醒封包</translation> <translation id="8601206103050338563">TLS WWW 用戶端驗證</translation> <translation id="8602851771975208551">電腦中其他程式所新增的應用程式可能會變更 Chrome 的運作方式。</translation> +<translation id="8603912787021349466">允許 Android 應用程式在登入後自動啟動。</translation> <translation id="8605428685123651449">SQLite 記憶體使用量</translation> <translation id="8605503133013456784">無法中斷與「<ph name="DEVICE_NAME" />」的連線並解除配對。</translation> <translation id="8606726445206553943">使用您的 MIDI 裝置</translation> @@ -5970,6 +5979,7 @@ <translation id="9053965862400494292">嘗試設定同步功能時發生錯誤。</translation> <translation id="9056034633062863292">更新 Chromebox</translation> <translation id="9056810968620647706">找不到相符項目。</translation> +<translation id="9057119625587205566">附近沒有印表機</translation> <translation id="9059868303873565140">狀態選單</translation> <translation id="9064142312330104323">Google 個人資料相片 (載入中)</translation> <translation id="9064275926664971810">啟用自動填入功能,輕鬆一按即可填妥表單</translation> @@ -5980,6 +5990,7 @@ <translation id="9067401056540256169">這個標記會使 Chrome 變得不安全,請務必瞭解這個標記的功能再使用。請注意,我們可隨時移除這個標記,恕不另行通知。啟用後,https 來源的框架即可使用 WebSockets 搭配不安全的網址 (ws://)。</translation> <translation id="9068931793451030927">路徑:</translation> <translation id="9070219033670098627">切換使用者</translation> +<translation id="9070940116164932228">防止背景計時器耗用過多資源</translation> <translation id="907148966137935206">不允許任何網站顯示彈出式視窗 (建議)</translation> <translation id="9072550133391925347"><ph name="PASSWORD_MANAGER_BRAND" /> 會使用您儲存的密碼,讓您自動登入符合資格的網站和應用程式。</translation> <translation id="9073281213608662541">PAP</translation> @@ -6013,6 +6024,7 @@ <translation id="9112614144067920641">請選擇新 PIN。</translation> <translation id="9112748030372401671">變更您的桌布</translation> <translation id="9112987648460918699">尋找...</translation> +<translation id="9114663181201435112">輕鬆登入</translation> <translation id="9115487443206954631">管理投放裝置</translation> <translation id="9115675100829699941">書籤(&B)</translation> <translation id="9121814364785106365">在固定分頁中開啟</translation> @@ -6107,7 +6119,6 @@ <translation id="952992212772159698">未啟用</translation> <translation id="960719561871045870">行動通訊業者代碼</translation> <translation id="960987915827980018">剩下約 1 個小時</translation> -<translation id="962778376131245616">僅顯示不安全的內容,動畫項目</translation> <translation id="96421021576709873">Wi-Fi 網路</translation> <translation id="965490406356730238">針對擷取的影格啟用硬體加速 mjpeg 解碼功能 (如適用)。</translation> <translation id="968174221497644223">應用程式快取</translation>
diff --git a/chrome/app/resources/google_chrome_strings_am.xtb b/chrome/app/resources/google_chrome_strings_am.xtb index 0d42245..d4290f8 100644 --- a/chrome/app/resources/google_chrome_strings_am.xtb +++ b/chrome/app/resources/google_chrome_strings_am.xtb
@@ -137,6 +137,7 @@ <translation id="4771048833395599659">ይህ ፋይል አደገኛ ሊሆን ስለሚችል Chrome አግዶታል።</translation> <translation id="4794050651896644714">ዝርዝሮችን Chrome ውስጥ አስቀምጥ</translation> <translation id="4891791193823137474">Google Chrome በጀርባ ውስጥ ይሂድ</translation> +<translation id="4901390485477164536">Google Chrome ነባሪ አሳሽዎ ነው። ወንዳታ!</translation> <translation id="4921569541910214635">ኮምፒውተር ይጋራሉ? አሁን Chromeን ልክ እንደሚፈልጉት አድርገው ማዋቀር ይችላሉ።</translation> <translation id="4925019873400497719"><ph name="ISSUER" /> የዚህን የድር ጣቢያ ምስክር ወረቀት እንደሰጠ Chrome አረጋግጧል። አገልጋዩ የምስክር ወረቀት ግልፅነት መረጃን አቅርቧል፣ ሆኖም ግን ልክ ያልሆነ ነበር።</translation> <translation id="4953650215774548573">Google Chromeን እንደ ነባሪ አሳሽዎ አድርገው ያቀናብሩ</translation> @@ -263,6 +264,7 @@ <translation id="8290100596633877290">ኧረ ገዳይ! Google Chrome ተሰናክሏል። አሁን እንደገና ይጀመር?</translation> <translation id="8342675569599923794">ይህ ፋይል አደገኛ ስለሆነ Chrome አግዶታል።</translation> <translation id="8406086379114794905">Chrome የተሻለ እንዲሆን ያግዙ</translation> +<translation id="8410645163819739900">Google Chrome OS ይህን ገጽ መክፈት አይችልም።</translation> <translation id="8455999171311319804">ከተፈለገ፦ የምርመራ እና የአጠቃቀም ውሂብ ወደ Google በራስ-ሰር በመላክ Chrome OS የተሻለ እንዲሆን ያግዙ።</translation> <translation id="853189717709780425">በሚተዳደር መለያ እየገቡ ነው፣ እና አስተዳዳሪው በGoogle Chrome መገለጫዎ ላይ ቁጥጥር እየሰጡት ነው። እንደ መተግበሪያዎችዎ፣ ዕልባቶችዎ፣ ታሪክዎ፣ የይለፍ ቃላትዎ እና ሌሎች ቅንብሮችዎ ያሉ የGoogle Chrome ውሂብዎ እስከመጨረሻው ከ<ph name="USER_NAME" /> ጋር የተያያዙ ይሆናሉ። ይህን ውሂብ በGoogle የመለያዎች ዳሽቦርዱ አማካኝነት ሊሰርዙት ይችላሉ፣ ነገር ግን ይህን ውሂብ ከሌላ መለያ ጋር ሊያጎዳኙት አይችሉም።</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ar.xtb b/chrome/app/resources/google_chrome_strings_ar.xtb index b1711c9..b40570c3 100644 --- a/chrome/app/resources/google_chrome_strings_ar.xtb +++ b/chrome/app/resources/google_chrome_strings_ar.xtb
@@ -135,6 +135,7 @@ <translation id="4771048833395599659">قد يكون هذا الملف ضارًا، لذلك فقد حظره Chrome.</translation> <translation id="4794050651896644714">حفظ التفاصيل في Chrome</translation> <translation id="4891791193823137474">دع Google Chrome يعمل في الخلفية</translation> +<translation id="4901390485477164536">Google Chrome هو متصفحك الافتراضي. مع أطيب التمنيات.</translation> <translation id="4921569541910214635">هل تشارك جهاز كمبيوتر؟ يمكنك الآن إعداد Chrome بالطريقة التي تعجبك تمامًا.</translation> <translation id="4925019873400497719">تحقق Chrome من أن <ph name="ISSUER" /> أصدر شهادة موقع الويب هذا. وقدم الخادم معلومات شفافية الشهادة، ولكنها غير صالحة.</translation> <translation id="4953650215774548573">تعيين Google Chrome المتصفح الافتراضي</translation> @@ -259,6 +260,7 @@ <translation id="8290100596633877290">للأسف! تعطل Google Chrome. هل تريد إعادة التشغيل الآن؟</translation> <translation id="8342675569599923794">هذا الملف ضار، لذلك فقد حظره Chrome.</translation> <translation id="8406086379114794905">ساهم في تحسين Chrome</translation> +<translation id="8410645163819739900">يتعذر على نظام تشغيل Google Chrome فتح هذه الصفحة.</translation> <translation id="8455999171311319804">اختياري: ساعد في تحسين نظام التشغيل Chrome عن طريق إرسال بيانات التشخيص والاستخدام إلى Google تلقائيًا.</translation> <translation id="853189717709780425">أنت تسجل الدخول بحساب يخضع لإدارة شخص آخر وتمنح مشرفه إمكانية التحكم في ملفك الشخصي في Google Chrome. سيتم ربط بياناتك في Chrome دائمًا بالحساب <ph name="USER_NAME" /> مثل تطبيقاتك وإشاراتك المرجعية وسجلك وكلمات المرور التابعة لك والإعدادات الأخرى. وستتمكن من حذف هذه البيانات عبر لوحة تحكم حسابات Google، ولكنك لن تتمكن من إقران هذه البيانات بحساب آخر.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_bg.xtb b/chrome/app/resources/google_chrome_strings_bg.xtb index d0dc554..928400a 100644 --- a/chrome/app/resources/google_chrome_strings_bg.xtb +++ b/chrome/app/resources/google_chrome_strings_bg.xtb
@@ -135,6 +135,7 @@ <translation id="4771048833395599659">Chrome блокира този файл, тъй като може да е опасен.</translation> <translation id="4794050651896644714">Подробностите да се запазват в Chrome</translation> <translation id="4891791193823137474">Google Chrome да се изпълнява на заден план</translation> +<translation id="4901390485477164536">Google Chrome е браузърът ви по подразбиране. Браво.</translation> <translation id="4921569541910214635">Споделяте компютър? Вече можете да настроите Chrome точно по свой вкус.</translation> <translation id="4925019873400497719">Chrome потвърди, че сертификатът на този уебсайт е издаден от <ph name="ISSUER" />. Сървърът предостави информация за прозрачност на сертификата, но тя бе невалидна.</translation> <translation id="4953650215774548573">Задаване на Google Chrome като браузър по подразбиране</translation> @@ -257,6 +258,7 @@ <translation id="8290100596633877290">О, не! Google Chrome претърпя срив. Да се стартира ли отново сега?</translation> <translation id="8342675569599923794">Chrome блокира този файл, тъй като е опасен.</translation> <translation id="8406086379114794905">Помогнете за подобряването на Chrome</translation> +<translation id="8410645163819739900">Google Chrome OS не може да отвори тази страница.</translation> <translation id="8455999171311319804">По избор: Помогнете за подобряването на Chrome OS, като автоматично изпращате до Google данни за диагностиката и употребата.</translation> <translation id="853189717709780425">Влизате с управляван профил и давате на администратора му контрол над потребителския си профил в Google Chrome. Данните ви в браузъра, като например приложения, отметки, история, пароли и други настройки, ще се свържат за постоянно с/ъс <ph name="USER_NAME" />. Ще можете да ги изтриете чрез таблото за управление на Google Профили, но няма да сте в състояние да ги свържете с друг профил.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_bn.xtb b/chrome/app/resources/google_chrome_strings_bn.xtb index 9f64793..5f647b0 100644 --- a/chrome/app/resources/google_chrome_strings_bn.xtb +++ b/chrome/app/resources/google_chrome_strings_bn.xtb
@@ -135,6 +135,7 @@ <translation id="4771048833395599659">এই ফাইলটি বিপজ্জনক হতে পারে, তাই Chrome এটিকে অবরুদ্ধ করেছে।</translation> <translation id="4794050651896644714">Chrome এ বিবরণ সংরক্ষণ করুন</translation> <translation id="4891791193823137474">Google Chrome-কে পশ্চাদপটে চালতে দিন</translation> +<translation id="4901390485477164536">Google Chrome আপনার ডিফল্ট ব্রাউজার। ধন্যবাদ।</translation> <translation id="4921569541910214635">একটি কম্পিউটার শেয়ার করবেন? এখন আপনি আপনার পছন্দমতো উপায়ে Chrome কে সেট আপ করতে পারেন৷</translation> <translation id="4925019873400497719">Chrome যাচাই করেছে যে <ph name="ISSUER" /> এই ওয়েবসাইটের শংসাপত্র জারি করেছে। সার্ভারটি শংসাপত্র স্বচ্ছতা তথ্য সরবরাহ করেছে, কিন্তু এটি অবৈধ।</translation> <translation id="4953650215774548573">আপনার ডিফল্ট ব্রাউজার হিসাবে Google Chrome কে সেট করুন</translation> @@ -259,6 +260,7 @@ <translation id="8290100596633877290">হোয়া! Google Chrome ক্র্যাশ হয়েছে৷ এখনই পুনঃলঞ্চ করবেন?</translation> <translation id="8342675569599923794">এই ফাইলটি বিপজ্জনক, তাই Chrome এটিকে অবরুদ্ধ করেছে।</translation> <translation id="8406086379114794905">Chrome কে সর্বোত্তম করে তুলতে সাহায্য করুন</translation> +<translation id="8410645163819739900">Google Chrome OS এই পৃষ্ঠা খুলতে পারবে না।</translation> <translation id="8455999171311319804">ঐচ্ছিক: ডায়াগনস্টিক ও ব্যবহারের ডেটা স্বয়ংক্রিয়ভাবে Google এ পাঠিয়ে Chrome OS কে আরো ভাল করে তুলতে সাহায্য করুন।</translation> <translation id="853189717709780425">আপনি একটি পরিচালিত অ্যাকাউন্টের মাধ্যমে প্রবেশ করুন করছেন এবং এর প্রশাসককে আপনার Google Chrome প্রোফাইলের উপরে নিয়ন্ত্রণ দিয়েছেন৷ আপনার Chrome ডেটা, যেমন অ্যাপ্লিকেশানগুলি, বুকমার্কগুলি, ইতিহাস, পাসওয়ার্ডগুলি এবং অন্যান্য সেটিংস <ph name="USER_NAME" /> এতে স্থায়ীভাবে আবদ্ধ হবে৷ আপনি Google অ্যাকাউন্টগুলির ড্যাশবোর্ডের মাধ্যমে এই ডেটাগুলি মুছতে সক্ষম হবেন, কিন্তু অন্য অ্যাকাউন্টের সাথে এই ডেটা সংশ্লিষ্ট করতে পারবেন না৷</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ca.xtb b/chrome/app/resources/google_chrome_strings_ca.xtb index 677d3cb..c664bf5b 100644 --- a/chrome/app/resources/google_chrome_strings_ca.xtb +++ b/chrome/app/resources/google_chrome_strings_ca.xtb
@@ -133,6 +133,7 @@ <translation id="4771048833395599659">Chrome ha bloquejat aquest fitxer perquè pot ser perillós.</translation> <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="4901390485477164536">Google Chrome és el navegador predeterminat. Gaudeix-ne.</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 Transparència de certificats, però no era vàlida.</translation> <translation id="4953650215774548573">Defineix Google Chrome com a navegador predeterminat</translation> @@ -255,6 +256,7 @@ <translation id="8290100596633877290">Google Chrome s'ha bloquejat. Voleu tornar-lo a iniciar?</translation> <translation id="8342675569599923794">Chrome ha bloquejat aquest fitxer perquè és perillós.</translation> <translation id="8406086379114794905">Ajudeu a millorar Chrome</translation> +<translation id="8410645163819739900">Google Chrome OS no pot obrir aquesta pàgina.</translation> <translation id="8455999171311319804">Opcional: ajuda'ns a millorar Chrome OS enviant automàticament dades de diagnòstic i d'ús a Google.</translation> <translation id="853189717709780425">Esteu iniciant la sessió amb un compte gestionat i atorgant el control del vostre perfil de Google Chrome a l'administrador corresponent. Les dades de Chrome, com ara aplicacions, adreces d'interès, historial, contrasenyes i altres configuracions, s'enllaçaran permanentment amb <ph name="USER_NAME" />. Aquestes dades es podran suprimir a través del tauler de control de comptes de Google, però no es podran associar amb un altre compte.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_cs.xtb b/chrome/app/resources/google_chrome_strings_cs.xtb index 7018ac9..462163a 100644 --- a/chrome/app/resources/google_chrome_strings_cs.xtb +++ b/chrome/app/resources/google_chrome_strings_cs.xtb
@@ -137,6 +137,7 @@ <translation id="4771048833395599659">Tento soubor může být nebezpečný, proto jej Chrome zablokoval.</translation> <translation id="4794050651896644714">Ukládat údaje do prohlížeče Chrome</translation> <translation id="4891791193823137474">Nechat aplikaci Google Chrome spuštěnou na pozadí</translation> +<translation id="4901390485477164536">Vaším výchozím prohlížečem je Google Chrome. Paráda!</translation> <translation id="4921569541910214635">Sdílíte počítač s dalšími uživateli? Nyní si Chrome můžete nastavit podle svých představ.</translation> <translation id="4925019873400497719">Chrome ověřil, že certifikát tohoto webu byl vydán vydavatelem <ph name="ISSUER" />. Server poskytl údaje Certificate Transparency, byly však neplatné.</translation> <translation id="4953650215774548573">Nastavit Google Chrome jako výchozí prohlížeč</translation> @@ -263,6 +264,7 @@ <translation id="8290100596633877290">Ouha! Prohlížeč Google Chrome spadl. Restartovat?</translation> <translation id="8342675569599923794">Tento soubor je nebezpečný, proto jej Chrome zablokoval.</translation> <translation id="8406086379114794905">Pomozte nám Chrome zlepšit</translation> +<translation id="8410645163819739900">Google Chrome OS tuto stránku nedokáže otevřít.</translation> <translation id="8455999171311319804">Volitelné: Pomozte zlepšit operační systém Chrome OS tím, že budete společnosti Google automaticky zasílat diagnostické údaje a údaje o využití.</translation> <translation id="853189717709780425">Přihlašujete se pomocí spravovaného účtu, jehož administrátorovi tak dáváte kontrolu nad vaším profilem Google Chrome. Vaše data prohlížeče Chrome (například aplikace, záložky, historie, hesla a další nastavení) budou trvale propojena s účtem <ph name="USER_NAME" />. Tato data budete moci smazat pomocí Hlavního panelu v Účtech Google, ale nebudete je moci propojit s jiným účtem.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_da.xtb b/chrome/app/resources/google_chrome_strings_da.xtb index 05bf81ffc..36127b7a 100644 --- a/chrome/app/resources/google_chrome_strings_da.xtb +++ b/chrome/app/resources/google_chrome_strings_da.xtb
@@ -133,6 +133,7 @@ <translation id="4771048833395599659">Denne fil kan være farlig, så Chrome har blokeret den.</translation> <translation id="4794050651896644714">Gem oplysninger i Chrome</translation> <translation id="4891791193823137474">Lad Google Chrome køre i baggrunden</translation> +<translation id="4901390485477164536">Google Chrome er din standardbrowser.</translation> <translation id="4921569541910214635">Deler du computer med andre? Nu kan du konfigurere Chrome, præcist som du vil.</translation> <translation id="4925019873400497719">Chrome bekræftede, at <ph name="ISSUER" /> har udstedt certifikatet for dette website. Serveren leverede Certificate Transparency-oplysninger, men de var ugyldige.</translation> <translation id="4953650215774548573">Angiv Google Chrome som din standardbrowser</translation> @@ -255,6 +256,7 @@ <translation id="8290100596633877290">Hovsa! Google Chrome er gået ned. Vil du genstarte nu?</translation> <translation id="8342675569599923794">Denne fil er farlig, så Chrome har blokeret den.</translation> <translation id="8406086379114794905">Hjælp med at forbedre Chrome</translation> +<translation id="8410645163819739900">Google Chrome OS kan ikke åbne denne side.</translation> <translation id="8455999171311319804">Valgfrit: Hjælp med at gøre Chrome OS bedre ved automatisk at sende diagnostik og brugsdata til Google.</translation> <translation id="853189717709780425">Du er ved at logge ind med en administreret konto og give dens administrator kontrol over din Google Chrome-profil. Dine Chrome-data, som f.eks. dine apps, bogmærker, historik, adgangskoder og andre indstillinger, knyttes permanent til <ph name="USER_NAME" />. Du kan slette disse data via Betjeningspanelet for Google Konti, men du kan ikke knytte disse data sammen med en anden konto.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_de.xtb b/chrome/app/resources/google_chrome_strings_de.xtb index 89353f8..3a7381a9 100644 --- a/chrome/app/resources/google_chrome_strings_de.xtb +++ b/chrome/app/resources/google_chrome_strings_de.xtb
@@ -133,6 +133,7 @@ <translation id="4771048833395599659">Diese Datei ist eventuell schädlich und wurde von Chrome blockiert.</translation> <translation id="4794050651896644714">Details in Chrome speichern</translation> <translation id="4891791193823137474">Google Chrome im Hintergrund ausführen</translation> +<translation id="4901390485477164536">Google Chrome ist Ihr Standardbrowser. Super!</translation> <translation id="4921569541910214635">Sie nutzen einen Computer gemeinsam mit anderen? Jetzt können Sie Chrome nach Ihren Wünschen einrichten.</translation> <translation id="4925019873400497719">Chrome hat verifiziert, dass <ph name="ISSUER" /> das Zertifikat dieser Website ausgestellt hat. Zwar hat der Server Informationen zur Zertifikatstransparenz bereitgestellt, diese waren jedoch ungültig.</translation> <translation id="4953650215774548573">Google Chrome als Standardbrowser festlegen</translation> @@ -255,6 +256,7 @@ <translation id="8290100596633877290">Google Chrome ist abgestürzt. Jetzt neu starten?</translation> <translation id="8342675569599923794">Diese Datei ist schädlich und wurde von Chrome blockiert.</translation> <translation id="8406086379114794905">Zur Verbesserung von Chrome beitragen</translation> +<translation id="8410645163819739900">Google Chrome OS kann diese Seite nicht öffnen.</translation> <translation id="8455999171311319804">Optional: Diagnose- und Nutzungsdaten zur Verbesserung von Chrome OS automatisch an Google senden.</translation> <translation id="853189717709780425">Sie melden sich mit einem verwalteten Konto an und ermöglichen dessen Administrator Zugriff auf Ihr Google Chrome-Profil. Ihre Chrome-Daten, wie Apps, Lesezeichen, Verlauf, Passwörter und andere Einstellungen, werden dauerhaft mit <ph name="USER_NAME" /> verknüpft. Sie können diese Daten über das Google Dashboard löschen, aber nicht mit einem anderen Konto verknüpfen.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_el.xtb b/chrome/app/resources/google_chrome_strings_el.xtb index fd7fe1a..b0be3ee4 100644 --- a/chrome/app/resources/google_chrome_strings_el.xtb +++ b/chrome/app/resources/google_chrome_strings_el.xtb
@@ -135,6 +135,7 @@ <translation id="4771048833395599659">Αυτό το αρχείο ενδέχεται να είναι επικίνδυνο και έχει αποκλειστεί από το Chrome.</translation> <translation id="4794050651896644714">Αποθήκευση λεπτομερειών στο Chrome</translation> <translation id="4891791193823137474">Να επιτρέπεται στο Google Chrome να εκτελείται στο παρασκήνιο</translation> +<translation id="4901390485477164536">Το Google Chrome είναι το προεπιλεγμένο πρόγραμμα περιήγησης. Τέλεια!</translation> <translation id="4921569541910214635">Μοιράζεστε έναν υπολογιστή; Τώρα μπορείτε να ρυθμίσετε το Chrome όπως ακριβώς σας αρέσει.</translation> <translation id="4925019873400497719">Το Chrome επαλήθευσε ότι το πιστοποιητικό του ιστότοπου εκδόθηκε από το <ph name="ISSUER" />. Παρασχέθηκαν πληροφορίες διαφάνειας πιστοποιητικού από το διακομιστή αλλά δεν ήταν έγκυρες.</translation> <translation id="4953650215774548573">Ορίστε το Google Chrome ως προεπιλεγμένο πρόγραμμα περιήγησης</translation> @@ -259,6 +260,7 @@ <translation id="8290100596633877290">Πω πω! Το Google Chrome παρουσίασε σφάλμα. Επανεκκίνηση τώρα;</translation> <translation id="8342675569599923794">Αυτό το αρχείο είναι επικίνδυνο και έχει αποκλειστεί από το Chrome.</translation> <translation id="8406086379114794905">Βοηθήστε μας να κάνουμε καλύτερο το Chrome</translation> +<translation id="8410645163819739900">Το Google Chrome OS δεν μπορεί να ανοίξει αυτήν τη σελίδα.</translation> <translation id="8455999171311319804">Προαιρετικό: Συμβάλετε στη βελτίωση του Chrome OS στέλνοντας αυτόματα στην Google διαγνωστικά και δεδομένα χρήσης.</translation> <translation id="853189717709780425">Είστε συνδεδεμένοι με έναν διαχειριζόμενο λογαριασμό και δίνετε στο διαχειριστή του τον έλεγχο του προφίλ σας στο Google Chrome. Τα δεδομένα σας στο Chrome, όπως οι εφαρμογές, οι σελιδοδείκτες, το ιστορικό, οι κωδικοί πρόσβασης και άλλες ρυθμίσεις θα είναι μόνιμα συνδεδεμένες με το <ph name="USER_NAME" />. Θα μπορείτε να διαγράψετε αυτά τα δεδομένα μέσω του Πίνακα ελέγχου των Λογαριασμών Google, αλλά δεν θα μπορείτε να συσχετίσετε αυτά τα δεδομένα με άλλο λογαριασμό.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_en-GB.xtb b/chrome/app/resources/google_chrome_strings_en-GB.xtb index 989b65f..a3756ca1 100644 --- a/chrome/app/resources/google_chrome_strings_en-GB.xtb +++ b/chrome/app/resources/google_chrome_strings_en-GB.xtb
@@ -137,6 +137,7 @@ <translation id="4771048833395599659">This file may be dangerous, so Chrome has blocked it.</translation> <translation id="4794050651896644714">Save details in Chrome</translation> <translation id="4891791193823137474">Let Google Chrome run in the background</translation> +<translation id="4901390485477164536">Google Chrome is your default browser. Cheers.</translation> <translation id="4921569541910214635">Share a computer? Now you can set up Chrome just the way you like it.</translation> <translation id="4925019873400497719">Chrome verified that <ph name="ISSUER" /> issued this website's certificate. The server supplied Certificate Transparency information, but it was invalid.</translation> <translation id="4953650215774548573">Set Google Chrome as your default browser</translation> @@ -263,6 +264,7 @@ <translation id="8290100596633877290">Whoa! Google Chrome has crashed. Relaunch now?</translation> <translation id="8342675569599923794">This file is dangerous, so Chrome has blocked it.</translation> <translation id="8406086379114794905">Help make Chrome better</translation> +<translation id="8410645163819739900">Google Chrome OS cannot open this page.</translation> <translation id="8455999171311319804">Optional: Help make Chrome OS better by automatically sending diagnostic and usage data to Google.</translation> <translation id="853189717709780425">You are signing in with a managed account and giving its administrator control over your Google Chrome profile. Your Chrome data, such as your apps, bookmarks, history, passwords, and other settings will become permanently tied to <ph name="USER_NAME" />. You will be able to delete this data via the Google Accounts Dashboard, but you will not be able to associate this data with another account.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_es-419.xtb b/chrome/app/resources/google_chrome_strings_es-419.xtb index 3b4442e..5ab9977 100644 --- a/chrome/app/resources/google_chrome_strings_es-419.xtb +++ b/chrome/app/resources/google_chrome_strings_es-419.xtb
@@ -130,9 +130,10 @@ <translation id="4743926867934016338">Aceptar y buscar</translation> <translation id="4751441238232965030">Esta computadora pronto dejará de recibir actualizaciones de Google Chrome de 32 bits. Actualiza a Google Chrome de 64 bits.</translation> <translation id="4754614261631455953">Google Chrome Canary (tráfico mDNS entrante)</translation> -<translation id="4771048833395599659">Chrome bloqueó este archivo porque es posible que sea peligroso.</translation> +<translation id="4771048833395599659">Chrome bloqueó este archivo porque podría ser peligroso.</translation> <translation id="4794050651896644714">Guardar los detalles en Google Chrome</translation> <translation id="4891791193823137474">Permitir que Google Chrome se ejecute en segundo plano</translation> +<translation id="4901390485477164536">Google Chrome es tu navegador predeterminado.</translation> <translation id="4921569541910214635">¿Compartes una computadora? Ahora puedes configurar Chrome como a ti te gusta.</translation> <translation id="4925019873400497719">Chrome verificó que <ph name="ISSUER" /> emitió el certificado de este sitio web. El servidor proporcionó información de transparencia de certificados que no era válida.</translation> <translation id="4953650215774548573">Establecer Google Chrome como navegador predeterminado</translation> @@ -255,7 +256,8 @@ <translation id="8290100596633877290">¡Vaya! Se ha producido un bloqueo en Google Chrome. ¿Quieres reiniciar el navegador ahora?</translation> <translation id="8342675569599923794">Chrome bloqueó este archivo porque es peligroso.</translation> <translation id="8406086379114794905">Ayudar a mejorar Chrome</translation> -<translation id="8455999171311319804">Opcional: Para ayudarnos a mejorar el Sistema operativo Chrome, envía datos de uso y diagnóstico a Google.</translation> +<translation id="8410645163819739900">El Sistema operativo Google Chrome no puede abrir esta página.</translation> +<translation id="8455999171311319804">Opcional: Para ayudarnos a mejorar el sistema operativo Chrome, envía datos de uso y diagnóstico a Google.</translation> <translation id="853189717709780425">Accediste con una cuenta administrada y le diste a su administrador el control sobre tu perfil de Google Chrome. Tus datos de Google Chrome, como las aplicaciones, los marcadores, el historial, las contraseñas y otros parámetros de configuración quedarán vinculados a <ph name="USER_NAME" /> de forma permanente. Podrás eliminar estos datos a través del Panel de control de cuentas de Google, pero no podrás relacionarlos con otra cuenta.</translation> <translation id="8540666473246803645">Google Chrome</translation> <translation id="8547799825197623713">Selector de aplicaciones de Google Chrome Canary</translation>
diff --git a/chrome/app/resources/google_chrome_strings_es.xtb b/chrome/app/resources/google_chrome_strings_es.xtb index 63d0e1da..fa45faf 100644 --- a/chrome/app/resources/google_chrome_strings_es.xtb +++ b/chrome/app/resources/google_chrome_strings_es.xtb
@@ -137,6 +137,7 @@ <translation id="4771048833395599659">Es posible que este archivo sea peligroso, por lo que Chrome lo ha bloqueado.</translation> <translation id="4794050651896644714">Guardar detalles en Chrome</translation> <translation id="4891791193823137474">Permitir que Google Chrome se ejecute en segundo plano</translation> +<translation id="4901390485477164536">Google Chrome es tu navegador predeterminado.</translation> <translation id="4921569541910214635">Si compartes un ordenador, ahora puedes configurar Chrome como quieras.</translation> <translation id="4925019873400497719">Chrome ha verificado que <ph name="ISSUER" /> emitió el certificado de este sitio web. El servidor ha proporcionado información de Transparencia de certificados, pero no era válida.</translation> <translation id="4953650215774548573">Establecer Google Chrome como navegador predeterminado</translation> @@ -263,6 +264,7 @@ <translation id="8290100596633877290">¡Vaya! Se ha producido un fallo en Google Chrome. ¿Quieres reiniciar el navegador ahora?</translation> <translation id="8342675569599923794">Este archivo es peligroso, por lo que Chrome lo ha bloqueado.</translation> <translation id="8406086379114794905">Ayuda a mejorar Chrome</translation> +<translation id="8410645163819739900">Google Chrome OS no puede abrir esta página.</translation> <translation id="8455999171311319804">Opcional: Envía datos de uso y diagnóstico automáticamente a Google para ayudarnos a mejorar Chrome OS.</translation> <translation id="853189717709780425">Estas iniciando sesión con una cuenta administrada, por lo que concedes a su administrador el control sobre tu perfil de Google Chrome. Tus datos de Chrome, como aplicaciones, marcadores, historial, contraseñas y otras opciones quedarán vinculados de forma permanente a <ph name="USER_NAME" />. Podrás eliminar estos datos mediante el panel de control de cuentas de Google, pero no podrás asociarlos a otra cuenta.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_et.xtb b/chrome/app/resources/google_chrome_strings_et.xtb index a7e336d..abe85ee 100644 --- a/chrome/app/resources/google_chrome_strings_et.xtb +++ b/chrome/app/resources/google_chrome_strings_et.xtb
@@ -135,6 +135,7 @@ <translation id="4771048833395599659">Chrome blokeeris faili, kuna see võib olla ohtlik.</translation> <translation id="4794050651896644714">Salvesta üksikasjad Chrome'i</translation> <translation id="4891791193823137474">Luba Google Chrome'i töötamine taustal</translation> +<translation id="4901390485477164536">Google Chrome on teie vaikebrauser. Täname!</translation> <translation id="4921569541910214635">Kas jagage arvutit? Saate nüüd seadistada Chrome'i just nii, nagu teile meeldib.</translation> <translation id="4925019873400497719">Chrome kinnitas, et selle veebisaidi sertifikaadi andis välja väljaandja <ph name="ISSUER" />. Server esitas sertifikaadi läbipaistvuse teabe, aga see oli kehtetu.</translation> <translation id="4953650215774548573">Määra Google Chrome vaikebrauseriks</translation> @@ -259,6 +260,7 @@ <translation id="8290100596633877290">Tohoh! Google Chrome jooksis kokku. Kas soovite kohe taaskäivitada?</translation> <translation id="8342675569599923794">Chrome blokeeris faili, kuna see on ohtlik.</translation> <translation id="8406086379114794905">Aidake Chrome'i täiustada</translation> +<translation id="8410645163819739900">Google Chrome OS ei saa lehte avada.</translation> <translation id="8455999171311319804">Valikuline: aitate Chrome OS-i täiustada, kui lubate diagnostika- ja kasutusandmete automaatse saatmise Google'ile.</translation> <translation id="853189717709780425">Logite sisse hallatud kontoga ja annate selle administraatorile üle oma Google Chrome'i profiili juhtimise. Teie Chrome'i andmed, nagu rakendused, järjehoidjad, ajalugu, paroolid ja muud seaded, jäävad püsivalt seotuks kasutajaga <ph name="USER_NAME" />. Saate need andmed kustutada Google'i kontode juhtpaneeli kaudu, kuid te ei saa neid andmeid seostada teise kontoga.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_fa.xtb b/chrome/app/resources/google_chrome_strings_fa.xtb index 5d0dd96..f8f1294b 100644 --- a/chrome/app/resources/google_chrome_strings_fa.xtb +++ b/chrome/app/resources/google_chrome_strings_fa.xtb
@@ -134,6 +134,7 @@ <translation id="4771048833395599659">این فایل ممکن است خطرناک باشد، بنابراین Chrome آن را مسدود کرده است.</translation> <translation id="4794050651896644714">ذخیره جزئیات در Chrome</translation> <translation id="4891791193823137474">اجازه به Google Chrome برای اجرا در پسزمینه</translation> +<translation id="4901390485477164536">Google Chrome مرورگر پیشفرضتان است. هورا.</translation> <translation id="4921569541910214635">از رایانه بهطور مشترک استفاده میکنید؟ اکنون میتوانید Chrome را هر طور که دوست دارید، تنظیم کنید.</translation> <translation id="4925019873400497719">Chrome تأیید کرد <ph name="ISSUER" /> گواهینامه این وبسایت را صادر کرده است. سرور، اطلاعات «شفافیت گواهینامه» را ارائه کرد اما این اطلاعات نامعتبر بود.</translation> <translation id="4953650215774548573">تنظیم Google Chrome به عنوان مرورگر پیشفرضتان</translation> @@ -256,6 +257,7 @@ <translation id="8290100596633877290">اوه! Google Chrome با اشکال مواجه شده است. دوباره راهاندازی شود؟</translation> <translation id="8342675569599923794">این فایل خطرناک است، بنابراین Chrome آن را مسدود کرده است.</translation> <translation id="8406086379114794905">به بهبود Chrome کمک کنید</translation> +<translation id="8410645163819739900">سیستم عامل Google Chrome نمیتواند این صفحه را باز کند.</translation> <translation id="8455999171311319804">اختیاری: با ارسال خودکار دادههای تشخیصی و میزان استفاده به Google، به بهبود سیستم عامل Chrome کمک کنید.</translation> <translation id="853189717709780425">شما با حساب مدیریتشده وارد سیستم میشوید و به سرپرست اجازه کنترل نمایه Google Chrome خود را میدهید. دادههای Chrome شما مانند برنامهها، نشانکها، سابقه، گذرواژهها و سایر تنظیمات شما برای همیشه به <ph name="USER_NAME" /> مرتبط میشوند. شما میتوانید این دادهها را از طریق داشبورد حسابهای Google خود حذف کنید اما نمیتوانید این دادهها را به حساب دیگری مرتبط کنید.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_fi.xtb b/chrome/app/resources/google_chrome_strings_fi.xtb index 9494566..0a27ee39 100644 --- a/chrome/app/resources/google_chrome_strings_fi.xtb +++ b/chrome/app/resources/google_chrome_strings_fi.xtb
@@ -134,6 +134,7 @@ <translation id="4771048833395599659">Tämä tiedosto voi olla vaarallinen, joten Chrome on estänyt sen.</translation> <translation id="4794050651896644714">Tallenna tiedot Chromeen</translation> <translation id="4891791193823137474">Jätä Google Chrome käyntiin taustalle</translation> +<translation id="4901390485477164536">Hienoa! Google Chrome on nyt oletusselaimesi.</translation> <translation id="4921569541910214635">Jaatko tietokoneen jonkun kanssa? Nyt voit määrittää Chromen juuri sellaiseksi kuin haluat.</translation> <translation id="4925019873400497719">Chrome vahvisti, että <ph name="ISSUER" /> on myöntänyt tämän sivuston varmenteen. Palvelin lähetti Certificate Transparency -tiedot, mutta ne eivät pidä paikkaansa.</translation> <translation id="4953650215774548573">Aseta Google Chrome oletusselaimeksi</translation> @@ -256,6 +257,7 @@ <translation id="8290100596633877290">Hups! Google Chrome kaatui. Käynnistetäänkö uudelleen?</translation> <translation id="8342675569599923794">Tämä tiedosto on vaarallinen, joten Chrome on estänyt sen.</translation> <translation id="8406086379114794905">Auta parantamaan Chromea</translation> +<translation id="8410645163819739900">Google Chrome ‑käyttöjärjestelmä ei voi avata tätä sivua.</translation> <translation id="8455999171311319804">Valinnainen: Lähetä automaattisesti diagnostiikka- ja käyttötietoja Googlelle Chrome-käyttöjärjestelmän kehittämiseksi.</translation> <translation id="853189717709780425">Olet kirjautumassa sisään hallinnoidulla tilillä ja antamassa tilin järjestelmänvalvojalle oikeuden hallita Google Chrome -profiiliasi. Chrome-tietosi, kuten sovelluksesi, kirjanmerkkisi, historiasi, salasanasi ja muut asetuksesi, yhdistetään pysyvästi käyttäjätiliin <ph name="USER_NAME" />. Voit poistaa nämä tiedot Google-tilien hallintapaneelissa, mutta et voi liittää tietoja toiseen tiliin.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_fil.xtb b/chrome/app/resources/google_chrome_strings_fil.xtb index e9329c3..7e56d2a 100644 --- a/chrome/app/resources/google_chrome_strings_fil.xtb +++ b/chrome/app/resources/google_chrome_strings_fil.xtb
@@ -137,6 +137,7 @@ <translation id="4771048833395599659">Maaaring mapanganib ang file na ito, kaya na-block ito ng Chrome.</translation> <translation id="4794050651896644714">I-save ang mga detalye sa Chrome</translation> <translation id="4891791193823137474">Hayaan ang Google Chrome na tumakbo sa background</translation> +<translation id="4901390485477164536">Google Chrome ang iyong default na browser. Magsaya.</translation> <translation id="4921569541910214635">Magbabahagi ng computer? Ngayon, maaari mong i-set up ang Chrome sa paraang gusto mo.</translation> <translation id="4925019873400497719">Na-verify ng Chrome na ang <ph name="ISSUER" /> ang nagbigay sa certificate ng website na ito. Nagbigay ang server ng impormasyon tungkol sa Certificate Transparency, ngunit hindi iyon wasto.</translation> <translation id="4953650215774548573">Itakda ang Google Chrome bilang iyong default na browser</translation> @@ -263,6 +264,7 @@ <translation id="8290100596633877290">Whoa! Nag-crash ang Google Chrome. Ilunsad muli ngayon?</translation> <translation id="8342675569599923794">Mapanganib ang file na ito, kaya na-block ito ng Chrome.</translation> <translation id="8406086379114794905">Tulungang pahusayin ang Chrome</translation> +<translation id="8410645163819739900">Hindi mabubuksan ng Google Chrome OS ang page na ito.</translation> <translation id="8455999171311319804">Opsyonal: Tulungang mas pahusayin ang Chrome OS sa pamamagitan ng awtomatikong pagpapadala ng data ng diagnostic at paggamit sa Google.</translation> <translation id="853189717709780425">Nagsa-sign in ka gamit ang isang pinamamahalaang account at ibinibigay mo ang kontrol ng administrator nito sa iyong profile sa Google Chrome. Permanenteng mauugnay sa <ph name="USER_NAME" /> ang iyong data sa Chrome, gaya ng iyong apps, mga bookmark, kasaysayan, mga password, at iba pang mga setting. Matatanggal mo ang data na ito sa pamamagitan ng Dashboard ng Mga Google Account, ngunit hindi mo maiuugnay ang data na ito sa isa pang account.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_fr.xtb b/chrome/app/resources/google_chrome_strings_fr.xtb index 2fd8b67..a61a2b9 100644 --- a/chrome/app/resources/google_chrome_strings_fr.xtb +++ b/chrome/app/resources/google_chrome_strings_fr.xtb
@@ -137,6 +137,7 @@ <translation id="4771048833395599659">Chrome a bloqué ce fichier, car ce dernier peut être dangereux.</translation> <translation id="4794050651896644714">Enregistrer les détails dans Google Chrome</translation> <translation id="4891791193823137474">Laisser Google Chrome s'exécuter en arrière-plan</translation> +<translation id="4901390485477164536">Google Chrome est votre navigateur par défaut. Félicitations !</translation> <translation id="4921569541910214635">Vous partagez un ordinateur ? Vous pouvez désormais configurer Chrome selon vos besoins.</translation> <translation id="4925019873400497719">Il a été confirmé dans Chrome que le certificat de ce site a bien été fourni par <ph name="ISSUER" />. Des informations relatives à la transparence du certificat ont été fournies via le serveur, mais celles-ci ne sont pas valides.</translation> <translation id="4953650215774548573">Définir Google Chrome en tant que navigateur par défaut</translation> @@ -263,6 +264,7 @@ <translation id="8290100596633877290">Google Chrome est bloqué. Voulez-vous le relancer maintenant ?</translation> <translation id="8342675569599923794">Chrome a bloqué ce fichier, car ce dernier est dangereux.</translation> <translation id="8406086379114794905">Aidez-nous à améliorer Chrome</translation> +<translation id="8410645163819739900">Impossible d'ouvrir cette page dans Google Chrome OS</translation> <translation id="8455999171311319804">Facultatif : contribuez à améliorer Google Chrome OS en envoyant automatiquement des données de diagnostic et d'utilisation à Google.</translation> <translation id="853189717709780425">Vous vous connectez à un compte géré et donnez le contrôle de votre profil Google Chrome à son administrateur. Vos données Google Chrome (applications, favoris, historique, mots de passe et d'autres paramètres) seront définitivement liées à <ph name="USER_NAME" />. Vous pourrez supprimer ces données via le tableau de bord Comptes Google, mais vous ne pourrez pas les associer à un autre compte.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_gu.xtb b/chrome/app/resources/google_chrome_strings_gu.xtb index 25853d3..2c95920 100644 --- a/chrome/app/resources/google_chrome_strings_gu.xtb +++ b/chrome/app/resources/google_chrome_strings_gu.xtb
@@ -137,6 +137,7 @@ <translation id="4771048833395599659">આ ફાઇલ જોખમી હોઈ શકે છે, તેથી Chrome એ તેને અવરોધિત કરેલ છે.</translation> <translation id="4794050651896644714">Chrome માં વિગતો સાચવો</translation> <translation id="4891791193823137474">Google Chrome ને પૃષ્ટભૂમિમાં ચાલવા દો</translation> +<translation id="4901390485477164536">Google Chrome તમારું ડિફૉલ્ટ બ્રાઉઝર છે. વાહ.</translation> <translation id="4921569541910214635">કમ્પ્યુટર શેર કરીએ? હવે તમે તમને ગમે તે રીતે Chrome ને સેટ કરી શકો છો.</translation> <translation id="4925019873400497719">Chrome એ ચકાસ્યું કે <ph name="ISSUER" /> એ આ વેબસાઇટનું પ્રમાણપત્ર ઇસ્યુ કર્યું છે. સર્વરે પ્રમાણપત્ર પારદર્શિતા માહિતી પૂરી પાડેલી, પરંતુ તે અમાન્ય હતી.</translation> <translation id="4953650215774548573">Google Chrome ને તમારા ડિફોલ્ટ બ્રાઉઝર તરીકે સેટ કરો</translation> @@ -263,6 +264,7 @@ <translation id="8290100596633877290">ઓહ! Google Chrome ક્રેશ થઈ ગયું. હમણાં ફરીથી લોંચ કરીએ?</translation> <translation id="8342675569599923794">આ ફાઇલ જોખમી છે, તેથી Chrome એ તેને અવરોધિત કરેલ છે.</translation> <translation id="8406086379114794905">Chrome ને બહેતર બનાવવામાં સહાય કરો</translation> +<translation id="8410645163819739900">Google Chrome OS આ પૃષ્ઠને ખોલી શકતું નથી.</translation> <translation id="8455999171311319804">વૈકલ્પિક: Google ને નિદાન અને વપરાશ ડેટા આપમેળે મોકલીને Chrome OS ને બહેતર બનાવવામાં સહાય કરો.</translation> <translation id="853189717709780425">તમે સંચાલિત કરેલ એકાઉન્ટ સાથે સાઇન ઇન કરી રહ્યાં છો અને તમારી Google Chrome પ્રોફાઇલ પર સંચાલક તેનું નિયંત્રણ કરે છે. તમારા ઍપ્લિકેશનો, બુકમાર્ક્સ, ઇતિહાસ, પાસવર્ડ્સ અને અન્ય સેટિંગ્સ જેમ કે Chromium ડેટા, કાયમ માટે <ph name="USER_NAME" /> પર બંધાયેલ છે. તમે Google એકાઉન્ટ્સ ડેશબોર્ડથી આ માહિતી કાઢી શકશો, પરંતુ તમે અન્ય એકાઉન્ટ સાથે આ માહિતી સાંકળી શકશો નહિં.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_hi.xtb b/chrome/app/resources/google_chrome_strings_hi.xtb index f741de2..9b1ada3 100644 --- a/chrome/app/resources/google_chrome_strings_hi.xtb +++ b/chrome/app/resources/google_chrome_strings_hi.xtb
@@ -133,6 +133,7 @@ <translation id="4771048833395599659">यह फ़ाइल खतरनाक हो सकती है, इसलिए Chrome ने इसे अवरुद्ध कर दिया है.</translation> <translation id="4794050651896644714">Chrome में विवरण सहेजें</translation> <translation id="4891791193823137474">Google Chrome को पृष्ठभूमि में चलने दें</translation> +<translation id="4901390485477164536">Google Chrome आपका डिफ़ॉल्ट ब्राउज़र है. क्या बात है.</translation> <translation id="4921569541910214635">कंप्यूटर साझा करते हैं? अब आप Chrome जैसा चाहें वैसा सेट कर सकते हैं.</translation> <translation id="4925019873400497719">Chrome ने सत्यापित किया है कि <ph name="ISSUER" /> ने इस वेबसाइट का प्रमाणपत्र जारी किया है. सर्वर ने प्रमाणपत्र पारदर्शिता जानकारी प्रदान की, लेकिन वह अमान्य थी.</translation> <translation id="4953650215774548573">Google Chrome को अपने डिफ़ॉल्ट ब्राउज़र के रूप में सेट करना</translation> @@ -257,6 +258,7 @@ <translation id="8290100596633877290">रुकिए! Google Chrome क्रैश हो गया है. अभी पुन: लॉन्च करें?</translation> <translation id="8342675569599923794">यह फ़ाइल खतरनाक है, इसलिए Chrome ने इसे अवरुद्ध कर दिया है.</translation> <translation id="8406086379114794905">Chrome को बेहतर बनाने में सहायता करें</translation> +<translation id="8410645163819739900">Google Chrome OS यह पृष्ठ नहीं खोल सकता.</translation> <translation id="8455999171311319804">वैकल्पिक: Google को निदान और उपयोग डेटा अपने आप भेजकर Chrome OS को बेहतर बनाने में सहायता करें.</translation> <translation id="853189717709780425">आप प्रबंधित खाते से प्रवेश कर रहे हैं और अपने Google Chrome प्रोफ़ाइल पर उसके व्यवस्थापक नियंत्रण दे रहे हैं. आपके ऐप्स , बुकमार्क, इतिहास, पासवर्ड, और अन्य सेटिंग जैसा Chrome डेटा <ph name="USER_NAME" /> से स्थायी रूप से जुड़ जाएगा. आप इस डेटा को Google खाते डैशबोर्ड के माध्यम से हटा सकेंगे, लेकिन आप इस डेटा को किसी अन्य खाते से संबद्ध नहीं कर सकेंगे.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_hr.xtb b/chrome/app/resources/google_chrome_strings_hr.xtb index 0e109e5..8a81d96 100644 --- a/chrome/app/resources/google_chrome_strings_hr.xtb +++ b/chrome/app/resources/google_chrome_strings_hr.xtb
@@ -133,6 +133,7 @@ <translation id="4771048833395599659">Datoteka je možda opasna i Chrome ju je blokirao.</translation> <translation id="4794050651896644714">Spremi pojedinosti u sustavu Chrome</translation> <translation id="4891791193823137474">Neka Google Chrome radi u pozadini</translation> +<translation id="4901390485477164536">Google Chrome vaš je zadani preglednik. Živjeli.</translation> <translation id="4921569541910214635">Dijelite računalo? Sada možete prilagoditi Chrome baš kako želite.</translation> <translation id="4925019873400497719">Chromium je potvrdio da je <ph name="ISSUER" /> izdavač certifikata web-lokacije. Informacije o transparentnosti certifikata pružio je poslužitelj, no nisu bile važeće.</translation> <translation id="4953650215774548573">Postavite Google Chrome kao svoj zadani preglednik</translation> @@ -255,6 +256,7 @@ <translation id="8290100596633877290">Opa! Google Chrome je pao. Ponovo pokrenuti sada?</translation> <translation id="8342675569599923794">Datoteka je opasna i Chrome ju je blokirao.</translation> <translation id="8406086379114794905">Pomozite nam da poboljšamo Chrome</translation> +<translation id="8410645163819739900">OS Google Chrome ne može otvoriti ovu stranicu.</translation> <translation id="8455999171311319804">Dodatno: automatskim slanjem podataka o upotrebi i dijagnostici Googleu pomognite nam da poboljšamo OS Chrome.</translation> <translation id="853189717709780425">Prijavljujete se upravljanim računom i dajete administratoru kontrolu nad svojim profilom u sustavu Google Chrome. Vaši podaci u sustavu Chrome, primjerice, aplikacije, oznake, povijest, zaporke i ostale postavke, trajno će se povezati s korisnikom <ph name="USER_NAME" />. Moći ćete izbrisati te podatke putem Nadzorne ploče Google računa, ali ih nećete moći povezati s nekim drugim računom.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_hu.xtb b/chrome/app/resources/google_chrome_strings_hu.xtb index 3f718ce..2dd82a2 100644 --- a/chrome/app/resources/google_chrome_strings_hu.xtb +++ b/chrome/app/resources/google_chrome_strings_hu.xtb
@@ -133,6 +133,7 @@ <translation id="4771048833395599659">Ez a fájl veszélyes lehet, ezért a Chrome letiltotta.</translation> <translation id="4794050651896644714">Részletek mentése a Chrome-ban</translation> <translation id="4891791193823137474">A Google Chrome futhat a háttérben</translation> +<translation id="4901390485477164536">A Google Chrome az alapértelmezett böngésző. Hurrá!</translation> <translation id="4921569541910214635">Közösen használ valakivel egy számítógépet? Mostantól úgy állíthatja be a Chrome-ot, ahogy Ön szeretné.</translation> <translation id="4925019873400497719">A Chrome megerősítette, hogy a(z) <ph name="ISSUER" /> állította ki ennek a webhelynek a tanúsítványát. A szerver megadott tanúsítványátláthatósági adatokat, de azok érvénytelenek.</translation> <translation id="4953650215774548573">A Google Chrome beállítása alapértelmezett böngészőként</translation> @@ -255,6 +256,7 @@ <translation id="8290100596633877290">Hmm. A Google Chrome összeomlott. Újraindítja most?</translation> <translation id="8342675569599923794">Ez a fájl veszélyes, ezért a Chrome letiltotta.</translation> <translation id="8406086379114794905">Segítsen a Chrome tökéletesítésében</translation> +<translation id="8410645163819739900">A Google Chrome OS nem tudja megnyitni ezt az oldalt.</translation> <translation id="8455999171311319804">Nem kötelező: Segítse a Chrome OS fejlesztését azzal, hogy automatikusan elküldi a diagnosztikai és használati adatokat a Google-nak.</translation> <translation id="853189717709780425">Felügyelt fiókkal jelentkezik be, és annak adminisztrátora számára hozzáférést biztosít Chrome-profiljához. Chrome-adatait – például alkalmazásait, könyvjelzőit, előzményeit, jelszavait és más beállításait – a rendszer véglegesen társítja a(z) <ph name="USER_NAME" /> fiókhoz. Ezen adatokat a Google-fiók Irányítópultján törölheti, ám más fiókhoz nem társíthatja őket.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_id.xtb b/chrome/app/resources/google_chrome_strings_id.xtb index d4a9dc2..b68c117 100644 --- a/chrome/app/resources/google_chrome_strings_id.xtb +++ b/chrome/app/resources/google_chrome_strings_id.xtb
@@ -133,6 +133,7 @@ <translation id="4771048833395599659">File ini mungkin berbahaya, jadi Chrome telah memblokirnya.</translation> <translation id="4794050651896644714">Simpan detail di Chrome</translation> <translation id="4891791193823137474">Jalankan Google Chrome di latar belakang</translation> +<translation id="4901390485477164536">Google Chrome adalah browser default Anda. Hore!</translation> <translation id="4921569541910214635">Membagikan komputer? Kini Anda dapat menyiapkan Chrome seperti yang Anda inginkan.</translation> <translation id="4925019873400497719">Chrome memverifikasi bahwa <ph name="ISSUER" /> menerbitkan sertifikat situs web ini. Server memberikan informasi Transparansi Sertifikat, namun informasi tersebut tidak valid.</translation> <translation id="4953650215774548573">Setel Google Chrome sebagai browser default Anda</translation> @@ -255,6 +256,7 @@ <translation id="8290100596633877290">Aduh! Google Chrome ngadat. Luncurkan ulang sekarang?</translation> <translation id="8342675569599923794">File ini berbahaya, jadi Chrome telah memblokirnya.</translation> <translation id="8406086379114794905">Bantu kami membuat Chrome jadi lebih baik</translation> +<translation id="8410645163819739900">Google Chrome OS tidak dapat membuka laman ini.</translation> <translation id="8455999171311319804">Opsional: Bantu Chrome OS menjadi lebih baik dengan mengirimkan data diagnostik dan penggunaan secara otomatis ke Google.</translation> <translation id="853189717709780425">Anda masuk dengan akun yang dikelola dan memberikan administratornya kendali atas profil Chrome Anda. Data Chrome Anda, seperti aplikasi, bookmark, riwayat, sandi, dan setelan lain selamanya akan dikaitkan ke <ph name="USER_NAME" />. Anda dapat menghapus data ini melalui Dasbor Akun Google, namun Anda tidak akan dapat mengaitkan data ini dengan akun yang lain.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_it.xtb b/chrome/app/resources/google_chrome_strings_it.xtb index a76575b..19dc486 100644 --- a/chrome/app/resources/google_chrome_strings_it.xtb +++ b/chrome/app/resources/google_chrome_strings_it.xtb
@@ -134,6 +134,7 @@ <translation id="4771048833395599659">Questo file potrebbe essere pericoloso, pertanto è stato bloccato da Chrome.</translation> <translation id="4794050651896644714">Salva dati in Chrome</translation> <translation id="4891791193823137474">Lascia Google Chrome in esecuzione in background</translation> +<translation id="4901390485477164536">Google Chrome è il tuo browser predefinito.</translation> <translation id="4921569541910214635">Condividi un computer con altre persone? Ora puoi configurare Chrome come preferisci.</translation> <translation id="4925019873400497719">Chrome ha verificato che <ph name="ISSUER" /> ha rilasciato il certificato del sito web. Le informazioni su Certificate Transparency fornite dal server non sono valide.</translation> <translation id="4953650215774548573">Imposta Google Chrome come browser predefinito</translation> @@ -256,6 +257,7 @@ <translation id="8290100596633877290">Spiacenti, si è verificato un arresto anomalo di Google Chrome. Riavviarlo ora?</translation> <translation id="8342675569599923794">Questo file è pericoloso, pertanto è stato bloccato da Chrome.</translation> <translation id="8406086379114794905">Contribuisci a migliorare Chrome</translation> +<translation id="8410645163819739900">Impossibile aprire questa pagina in Google Chrome OS.</translation> <translation id="8455999171311319804">Facoltativo. Aiutaci a migliorare Chrome OS inviando automaticamente a Google dati di diagnostica e utilizzo.</translation> <translation id="853189717709780425">Stai per accedere con un account gestito e per dare al relativo amministratore il controllo del tuo profilo Google Chrome. I tuoi dati di Chrome, come app, Preferiti, cronologia, password e altre impostazioni, verranno collegati definitivamente a <ph name="USER_NAME" />. Potrai eliminare questi dati tramite la Dashboard di Google Account, ma non potrai associare questi dati a un altro account.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_iw.xtb b/chrome/app/resources/google_chrome_strings_iw.xtb index 382d161..803b442 100644 --- a/chrome/app/resources/google_chrome_strings_iw.xtb +++ b/chrome/app/resources/google_chrome_strings_iw.xtb
@@ -133,6 +133,7 @@ <translation id="4771048833395599659">Chrome חסם את הקובץ הזה כי הוא עלול להיות מסוכן.</translation> <translation id="4794050651896644714">שמור פרטים ב-Chrome</translation> <translation id="4891791193823137474">אפשר ל-Google Chrome לפעול ברקע</translation> +<translation id="4901390485477164536">נהדר, Google Chrome הוא דפדפן ברירת המחדל שלך.</translation> <translation id="4921569541910214635">משתף את המחשב? עכשיו תוכל להגדיר את Chrome בדיוק כמו שאתה אוהב.</translation> <translation id="4925019873400497719">Chrome אימת שהגורם שהנפיק את אישור האתר הזה הוא <ph name="ISSUER" />. השרת סיפק פרטים על שקיפות האישור, אבל הם אינם חוקיים.</translation> <translation id="4953650215774548573">הגדר את Google Chrome כדפדפן ברירת המחדל</translation> @@ -255,6 +256,7 @@ <translation id="8290100596633877290">וואו! Google Chrome קרס. להפעיל מחדש עכשיו?</translation> <translation id="8342675569599923794">Chrome חסם את הקובץ הזה כי הוא מסוכן.</translation> <translation id="8406086379114794905">עזור לשפר את Chrome</translation> +<translation id="8410645163819739900">לא ניתן לפתוח דף זה ב-Google Chrome OS.</translation> <translation id="8455999171311319804">אופציונלי: שלח אל Google נתוני אבחון ושימוש באופן אוטומטי ועזור לשפר את מערכת ההפעלה של Chrome.</translation> <translation id="853189717709780425">אתה נכנס עם חשבון מנוהל ונותן למנהל המערכת שלו שליטה על הפרופיל שלך ב-Chrome. הנתונים שלך ב-Chrome, כמו יישומים, סימניות, היסטוריה, סיסמאות והגדרות אחרות ייקשרו באופן קבוע ל-<ph name="USER_NAME" />. תוכל למחוק את הנתונים האלה באמצעות לוח הבקרה של חשבונות Google, אבל לא תוכל לשייך את הנתונים האלה לחשבון אחר.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ja.xtb b/chrome/app/resources/google_chrome_strings_ja.xtb index 8d1d2bd..a314eadc 100644 --- a/chrome/app/resources/google_chrome_strings_ja.xtb +++ b/chrome/app/resources/google_chrome_strings_ja.xtb
@@ -133,6 +133,7 @@ <translation id="4771048833395599659">このファイルは危険なファイルの可能性があるため、Chrome でブロックしました。</translation> <translation id="4794050651896644714">Chrome で詳細を保存する</translation> <translation id="4891791193823137474">Google Chrome のバックグラウンドでの実行を許可する</translation> +<translation id="4901390485477164536">Google Chrome は既定のブラウザです。</translation> <translation id="4921569541910214635">共有パソコンにするなど、Chrome をお好みの方法で設定できるようになりました。</translation> <translation id="4925019873400497719">Chrome で <ph name="ISSUER" /> がこのウェブサイトの証明書を発行したことを確認しました。証明書の透明性に関する情報がサーバーから提供されましたが無効でした。</translation> <translation id="4953650215774548573">Google Chrome を既定のブラウザとして設定する</translation> @@ -255,6 +256,7 @@ <translation id="8290100596633877290">エラー: Google Chrome で問題が発生しました。今すぐ再起動しますか?</translation> <translation id="8342675569599923794">このファイルは危険なファイルであるため、Chrome でブロックしました。</translation> <translation id="8406086379114794905">Chrome の品質向上にご協力ください</translation> +<translation id="8410645163819739900">Google Chrome OS ではこのページを開けません。</translation> <translation id="8455999171311319804">オプション: 診断と使用状況のデータを Google に自動送信して Chrome OS の機能向上に役立てる。</translation> <translation id="853189717709780425">現在、管理対象アカウントでログインし、管理者に Google Chrome プロフィールの管理を委ねています。アプリ、ブックマーク、履歴、パスワード、その他の設定などの Chrome データは <ph name="USER_NAME" /> に永続的に関連付けられます。このデータは、Google アカウントのダッシュボードで削除できますが、別のアカウントに関連付けることはできません。</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_kn.xtb b/chrome/app/resources/google_chrome_strings_kn.xtb index 38af7db78..6cdaa1f 100644 --- a/chrome/app/resources/google_chrome_strings_kn.xtb +++ b/chrome/app/resources/google_chrome_strings_kn.xtb
@@ -135,6 +135,7 @@ <translation id="4771048833395599659">ಈ ಫೈಲ್ ಅಪಾಯಕಾರಿಯಾಗಿರಬಹುದು, ಹೀಗಾಗಿ Chrome ಇದನ್ನು ನಿರ್ಬಂಧಿಸಿದೆ.</translation> <translation id="4794050651896644714">Chrome ನಲ್ಲಿ ವಿವರಣೆಗಳನ್ನು ಉಳಿಸಿ</translation> <translation id="4891791193823137474">Google Chrome ಹಿನ್ನೆಲೆಯಲ್ಲಿ ಚಾಲನೆಯಾಗಲು ಅನುಮತಿಸಿ</translation> +<translation id="4901390485477164536">Google Chrome ನಿಮ್ಮ ಡಿಫಾಲ್ಟ್ ಬ್ರೌಸರ್ ಆಗಿದೆ. ಚೀರ್ಸ್.</translation> <translation id="4921569541910214635">ಕಂಪ್ಯೂಟರ್ ಅನ್ನು ಹಂಚಿಕೊಳ್ಳುವುದೇ? ಇದೀಗ ನೀವು ಇಷ್ಟಪಡುವ ಮಾರ್ಗದ ಮೂಲಕ ಇದೀಗ ನೀವು Chrome ಹೊಂದಿಸಬಹುದು.</translation> <translation id="4925019873400497719">ಈ ವೆಬ್ಸೈಟ್ನ ಪ್ರಮಾಣಪತ್ರವನ್ನು <ph name="ISSUER" /> ನೀಡಿದೆ ಎಂಬುದಾಗಿ Chrome ಪರಿಶೀಲಿಸಿದೆ. ಪ್ರಮಾಣಪತ್ರ ಪಾರದರ್ಶಕತೆ ಮಾಹಿತಿಯನ್ನು ಸರ್ವರ್ ಪೂರೈಸಿದೆ, ಆದರೆ ಅದು ಅಮಾನ್ಯವಾಗಿದೆ.</translation> <translation id="4953650215774548573">Google Chrome ಅನ್ನು ನಿಮ್ಮ ಡಿಫಾಲ್ಟ್ ಬ್ರೌಸರ್ ರೂಪದಲ್ಲಿ ಹೊಂದಿಸಿ</translation> @@ -257,6 +258,7 @@ <translation id="8290100596633877290">ಓಹ್! Google Chrome ಕ್ರ್ಯಾಶ್ ಆಗಿದೆ.ಇದೀಗ ಮರುಪ್ರಾರಂಭಿಸುವುದೆ?</translation> <translation id="8342675569599923794">ಈ ಫೈಲ್ ಅಪಾಯಕಾರಿಯಾಗಿದೆ, ಹೀಗಾಗಿ Chrome ಇದನ್ನು ನಿರ್ಬಂಧಿಸಿದೆ.</translation> <translation id="8406086379114794905">Chrome ಉತ್ತಮಗೊಳಿಸುವಲ್ಲಿ ಸಹಾಯ ಮಾಡಿ.</translation> +<translation id="8410645163819739900">Google Chrome OS ಗೆ ಈ ಪುಟವನ್ನು ತೆರೆಯಲಾಗುವುದಿಲ್ಲ.</translation> <translation id="8455999171311319804">ಐಚ್ಛಿಕ: Google ಗೆ ಡಯಾಗ್ನಸ್ಟಿಕ್ ಮತ್ತು ಡೇಟಾ ಬಳಕೆಯನ್ನು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಕಳುಹಿಸುವ ಮೂಲಕ Chrome OS ಅನ್ನು ಉತ್ತಮಗೊಳಿಸಲು ಸಹಾಯ ಮಾಡಿ.</translation> <translation id="853189717709780425">ನಿರ್ವಹಿಸಲಾದ ಖಾತೆ ಮತ್ತು ನಿಮ್ಮ Google Chrome ಪ್ರೊಫೈಲ್ನಾದ್ಯಂತ ಅದರ ನಿರ್ವಾಹಕ ನಿಯಂತ್ರಣವನ್ನು ನೀಡುವುದರ ಮೂಲಕ ನೀವು ಸೈನ್ ಇನ್ ಮಾಡಿರುವಿರಿ. ನಿಮ್ಮ ಅಪ್ಲಿಕೇಶನ್ಗಳು, ಬುಕ್ಮಾರ್ಕ್ಗಳು, ಇತಿಹಾಸ, ಪಾಸ್ವರ್ಡ್ಗಳು, ಹಾಗೂ ಇತರ ಸೆಟ್ಟಿಂಗ್ಗಳಂತಹ ನಿಮ್ಮ Chrome ಡೇಟಾವನ್ನು <ph name="USER_NAME" /> ಅವರಿಗೆ ಶಾಶ್ವತವಾಗಿ ಬಂಧಿಸಲಾಗುತ್ತದೆ. Google ಖಾತೆಗಳ ಡ್ಯಾಶ್ಬೋರ್ಡ್ ಮೂಲಕ ಈ ಡೇಟಾವನ್ನು ಅಳಿಸಲು ನಿಮಗೆ ಸಾಧ್ಯ, ಆದರೆ ಬೇರೊಂದು ಖಾತೆಯೊಂದಿಗೆ ಈ ಡೇಟಾವನ್ನು ಸಂಯೋಜಿಸಲು ನಿಮಗೆ ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ko.xtb b/chrome/app/resources/google_chrome_strings_ko.xtb index 72df42ae..f15e2d2e 100644 --- a/chrome/app/resources/google_chrome_strings_ko.xtb +++ b/chrome/app/resources/google_chrome_strings_ko.xtb
@@ -137,6 +137,7 @@ <translation id="4771048833395599659">이 파일은 위험할 수있으므로 Chrome에서 차단했습니다.</translation> <translation id="4794050651896644714">Chrome에 세부정보 저장</translation> <translation id="4891791193823137474">백그라운드에서 Chrome을 실행</translation> +<translation id="4901390485477164536">Chrome이 기본 브라우저입니다.</translation> <translation id="4921569541910214635">컴퓨터를 공유하시겠습니까? 이제 원하는 대로 Chrome을 설정할 수 있습니다.</translation> <translation id="4925019873400497719">Chrome에서 <ph name="ISSUER" />이(가) 이 웹사이트의 인증서를 발행했음을 확인했습니다. 서버에서 인증서 투명성 정보를 제공했으나, 올바르지 않았습니다.</translation> <translation id="4953650215774548573">Chrome을 기본 브라우저로 설정</translation> @@ -263,6 +264,7 @@ <translation id="8290100596633877290">Chrome이 다운되었습니다. 다시 시작하시겠습니까?</translation> <translation id="8342675569599923794">이 파일은 위험하므로 Chrome에서 차단했습니다.</translation> <translation id="8406086379114794905">더 나은 Chrome을 만들 수 있도록 도와주세요.</translation> +<translation id="8410645163819739900">Chrome OS에서 이 페이지를 열 수 없음</translation> <translation id="8455999171311319804">선택사항: 진단 및 사용 데이터가 Google로 자동 전송되도록 선택하면 Chrome OS 개선에 도움이 됩니다.</translation> <translation id="853189717709780425">관리 계정으로 로그인하고 관리자에게 Chrome 프로필에 대한 제어권을 부여하려고 합니다. 이렇게 하면 앱, 북마크, 방문 기록, 비밀번호 및 기타 설정과 같은 Chrome 데이터가 <ph name="USER_NAME" />에 영구적으로 연결됩니다. Google 계정 대시보드를 통해 이 데이터를 삭제할 수 있지만 다른 계정에 연결할 수는 없습니다.</translation> <translation id="8540666473246803645">Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_lt.xtb b/chrome/app/resources/google_chrome_strings_lt.xtb index f14d52d..66ef2c9 100644 --- a/chrome/app/resources/google_chrome_strings_lt.xtb +++ b/chrome/app/resources/google_chrome_strings_lt.xtb
@@ -138,6 +138,7 @@ <translation id="4771048833395599659">Šis failas gali būti pavojingas, todėl „Chrome“ jį užblokavo.</translation> <translation id="4794050651896644714">Išsaugoti išsamią informaciją „Chrome“</translation> <translation id="4891791193823137474">Paleisti „Google Chrome“ fone</translation> +<translation id="4901390485477164536">„Google Chrome“ yra numatytoji naršyklė. Puiku.</translation> <translation id="4921569541910214635">Bendrinate kompiuterį? Dabar galite nustatyti „Chrome“ kaip tik norite.</translation> <translation id="4925019873400497719">„Chrome“ patvirtino, kad „<ph name="ISSUER" />“ išdavė šį svetainės sertifikatą. Serveris pateikė sertifikato skaidrumo informaciją, bet ji negalioja.</translation> <translation id="4953650215774548573">Nustatyti „Google Chrome“ kaip numatytąją naršyklę</translation> @@ -264,6 +265,7 @@ <translation id="8290100596633877290">Oi! „Google Chrome“ užstrigo. Paleisti iš naujo dabar?</translation> <translation id="8342675569599923794">Šis failas pavojingas, todėl „Chrome“ jį užblokavo.</translation> <translation id="8406086379114794905">Padėkite tobulinti „Chrome“</translation> +<translation id="8410645163819739900">„Google Chrome“ OS negali atidaryti šio puslapio.</translation> <translation id="8455999171311319804">Pasirenkama: padėkite patobulinti „Chrome“ OS automatiškai siųsdami diagnostikos ir naudojimo duomenis į sistemą „Google“.</translation> <translation id="853189717709780425">Prisijungiate su tvarkoma paskyra ir leidžiate jos administratoriui valdyti jūsų „Google Chrome“ profilį. „Chrome“ duomenys, pvz., programos, žymės, istorija, slaptažodžiai ir kiti nustatymai, bus visam laikui susieti su <ph name="USER_NAME" />. Galėsite ištrinti šiuos duomenis naudodami „Google“ paskyrų informacijos suvestinę, bet negalėsite susieti šių duomenų su kita paskyra.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_lv.xtb b/chrome/app/resources/google_chrome_strings_lv.xtb index 18282f7..4f31b83 100644 --- a/chrome/app/resources/google_chrome_strings_lv.xtb +++ b/chrome/app/resources/google_chrome_strings_lv.xtb
@@ -135,6 +135,7 @@ <translation id="4771048833395599659">Šis fails var būt bīstams, tāpēc Chrome to bloķēja.</translation> <translation id="4794050651896644714">Saglabāt informāciju pārlūkā Chrome</translation> <translation id="4891791193823137474">Ļaut Google Chrome darboties fonā</translation> +<translation id="4901390485477164536">Google Chrome ir jūsu noklusējuma pārlūks.</translation> <translation id="4921569541910214635">Vai datoru izmanto vairāki lietotāji? Tagad varat iestatīt pārlūku Chrome atbilstoši savām vajadzībām.</translation> <translation id="4925019873400497719">Chrome verificēja, ka <ph name="ISSUER" /> izsniedza šīs vietnes sertifikātu. Serveris sniedza Certificate Transparency informāciju, taču tā nebija derīga.</translation> <translation id="4953650215774548573">Iestatīt Google Chrome kā manu noklusējuma pārlūku</translation> @@ -259,6 +260,7 @@ <translation id="8290100596633877290">Eh! Google Chrome ir avarējis. Vai restartēt to tūlīt?</translation> <translation id="8342675569599923794">Šis fails ir bīstams, tāpēc Chrome to bloķēja.</translation> <translation id="8406086379114794905">Palīdziet uzlabot Chrome</translation> +<translation id="8410645163819739900">Problēma ar lapas atvēršanu pārlūkā Google Chrome OS</translation> <translation id="8455999171311319804">Neobligāti: palīdziet uzlabot Chrome OS, automātiski nosūtot Google serveriem diagnostikas un lietojuma datus.</translation> <translation id="853189717709780425">Jūs pierakstāties pārvaldītā kontā, kura administrators var kontrolēt jūsu Google Chrome profilu. Jūsu Chrome dati, piemēram, lietotnes, grāmatzīmes, vēsture, paroles un citi iestatījumi, tiks neatgriezeniski saistīti ar lietotājvārdu <ph name="USER_NAME" />. Varēsiet dzēst šos datus, izmantojot Google kontu informācijas paneli, taču nevarēsiet šos datus saistīt ar citu kontu.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ml.xtb b/chrome/app/resources/google_chrome_strings_ml.xtb index 22ebdcb6..0020c12 100644 --- a/chrome/app/resources/google_chrome_strings_ml.xtb +++ b/chrome/app/resources/google_chrome_strings_ml.xtb
@@ -137,6 +137,7 @@ <translation id="4771048833395599659">ഈ ഫയൽ അപകടകരമാകാൻ ഇടയുള്ളതിനാൽ Chrome ഇതിനെ ബ്ലോക്കുചെയ്തു.</translation> <translation id="4794050651896644714">Chrome-ൽ വിശദാംശങ്ങൾ സംരക്ഷിക്കുക</translation> <translation id="4891791193823137474">പശ്ചാത്തലത്തില് Google Chrome പ്രവര്ത്തിക്കാന് അനുവദിക്കുക</translation> +<translation id="4901390485477164536">Google Chrome നിങ്ങളുടെ ഡിഫോൾട്ട് ബ്രൗസറാണ്. കൊള്ളാം.</translation> <translation id="4921569541910214635">ഒരു കമ്പ്യൂട്ടർ പങ്കിടണോ? ഇപ്പോൾ നിങ്ങൾക്ക് ഇഷ്ടപ്പെട്ട രീതിയിൽ Chrome സജ്ജീകരിക്കാനാകും.</translation> <translation id="4925019873400497719">ഈ വെബ്സൈറ്റിന്റെ സർട്ടിഫിക്കറ്റ് <ph name="ISSUER" /> നൽകിയതാണെന്ന് Chrome പരിശോധിച്ചുറപ്പിച്ചു. സെർവർ, സർട്ടിഫിക്കറ്റ് സുതാര്യത വിവരം നൽകിയെങ്കിലും, അത് അസാധുവായിരുന്നു.</translation> <translation id="4953650215774548573">Google Chrome-നെ നിങ്ങളുടെ സ്ഥിര ബ്രൗസറായി സജ്ജീകരിക്കുക</translation> @@ -263,6 +264,7 @@ <translation id="8290100596633877290">ഓ! Google Chrome ക്രാഷുചെയ്തു. ഇപ്പോള് വീണ്ടും സമാരംഭിക്കണോ?</translation> <translation id="8342675569599923794">ഈ ഫയൽ അപകടകരമായതിനാൽ Chrome ഇതിനെ ബ്ലോക്കുചെയ്തു.</translation> <translation id="8406086379114794905">Chrome-നെ മികച്ചതാക്കാൻ സഹായിക്കുക</translation> +<translation id="8410645163819739900">Google Chrome OS-ന് ഈ പേജ് തുറക്കാനാവില്ല.</translation> <translation id="8455999171311319804">ഓപ്ഷണൽ: ഡയഗണോസ്റ്റിക്, ഉപയോഗ വിവരങ്ങൾ Google-ന് സ്വയം അയച്ചുകൊണ്ട് Chrome OS മെച്ചപ്പെടുത്താൻ സഹായിക്കുക.</translation> <translation id="853189717709780425">നിങ്ങൾ ഒരു നിയന്ത്രിത അക്കൗണ്ട് ഉപയോഗിച്ച് സൈൻ ഇൻ ചെയ്ത് അതിന്റെ അഡ്മിനിസ്ട്രേറ്റർക്ക് നിങ്ങളുടെ Google Chrome പ്രൊഫൈലിന്റെ നിയന്ത്രണം നൽകിയിരിക്കുന്നു. നിങ്ങളുടെ അപ്ലിക്കേഷനുകൾ, ബുക്ക്മാർക്കുകൾ, ചരിത്രം, പാസ്വേഡുകൾ, മറ്റ് ക്രമീകരണങ്ങൾ എന്നിവ പോലെയുള്ള Chrome ഡാറ്റ <ph name="USER_NAME" /> എന്നതുമായി ശാശ്വതമായി ബന്ധിപ്പിച്ചതായിത്തീരും. Google അക്കൗണ്ട്സ് ഡാഷ്ബോർഡ് വഴി നിങ്ങൾക്ക് ഈ ഡാറ്റ ഇല്ലാതാക്കാൻ കഴിയുമെങ്കിലും ഈ ഡാറ്റ മറ്റൊരു അക്കൗണ്ടുമായി ബന്ധപ്പെടുത്താനാകില്ല.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_mr.xtb b/chrome/app/resources/google_chrome_strings_mr.xtb index 55940fc..08ede22 100644 --- a/chrome/app/resources/google_chrome_strings_mr.xtb +++ b/chrome/app/resources/google_chrome_strings_mr.xtb
@@ -135,6 +135,7 @@ <translation id="4771048833395599659">ही फाईल कदाचित धोकादायक असू शकते, त्यामुळे Chrome ने ती अवरोधित केली आहे.</translation> <translation id="4794050651896644714">Chrome मध्ये तपशील जतन करा</translation> <translation id="4891791193823137474">पार्श्वभूमीत Google Chrome चालू द्या</translation> +<translation id="4901390485477164536">Google Chrome आपला डीफॉल्ट ब्राउझर आहे. आनंद घ्या!</translation> <translation id="4921569541910214635">एक संगणक सामायिक करायचा? आपल्याला आवडते त्या प्रकारे आपण आता Chrome सेट करू शकता.</translation> <translation id="4925019873400497719">Chrome ने सत्यापित केले की <ph name="ISSUER" /> ने या वेबसाइटचे प्रमाणपत्र जारी केले. सर्व्हरने प्रमाणपत्र पारदर्शकता माहिती पुरविली परंतु ती अवैध होती.</translation> <translation id="4953650215774548573">आपला डीफॉल्ट ब्राउझर म्हणून Google Chrome सेट करा</translation> @@ -260,6 +261,7 @@ <translation id="8290100596633877290">अरेरे! Google Chrome क्रॅश झाला. त्वरित पुन्हा लाँच करायचा?</translation> <translation id="8342675569599923794">ही फाईल धोकादायक आहे, त्यामुळे Chrome ने ती अवरोधित केली आहे.</translation> <translation id="8406086379114794905">Chrome उत्कृष्ट बनविण्यात मदत करा</translation> +<translation id="8410645163819739900">Google Chrome OS हे पृष्ठ उघडू शकत नाही.</translation> <translation id="8455999171311319804">पर्यायी: निदान आणि वापर डेटा Google कडे स्वयंचलितपणे पाठवून Chrome OS ला आणखी चांगले बनविण्यात मदत करा.</translation> <translation id="853189717709780425">आपण एका व्यवस्थापित खात्यासह साइन इन करत आहात आणि त्याच्या प्रशासकास आपल्या Google Chrome प्रोफाईलवर नियंत्रण देत आहात. आपला Chrome डेटा, जसे की आपले अॅप्स, बुकमार्क, इतिहास, संकेतशब्द आणि अन्य सेटिंग्ज <ph name="USER_NAME" /> वर कायमचे बद्ध राहतील. आपण Google खाती डॅशबोर्ड द्वारे हा डेटा हटविण्यात सक्षम व्हाल, परंतु आपण दुसऱ्या खात्यासह हा डेटा संबद्ध करण्यात सक्षम होणार नाही.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ms.xtb b/chrome/app/resources/google_chrome_strings_ms.xtb index 0c4ac4f..3f1d787f 100644 --- a/chrome/app/resources/google_chrome_strings_ms.xtb +++ b/chrome/app/resources/google_chrome_strings_ms.xtb
@@ -133,6 +133,7 @@ <translation id="4771048833395599659">Fail ini mungkin berbahaya, maka Chrome telah menyekatnya.</translation> <translation id="4794050651896644714">Simpan butiran di Chrome</translation> <translation id="4891791193823137474">Biarkan Google Chrome dijalankan di latar belakang</translation> +<translation id="4901390485477164536">Google Chrome ialah penyemak imbas lalai anda. Bergembiralah.</translation> <translation id="4921569541910214635">Berkongsi komputer? Kini anda boleh sediakan Chrome menurut cara yang anda suka.</translation> <translation id="4925019873400497719">Chrome mengesahkan bahawa <ph name="ISSUER" /> mengeluarkan sijil tapak web ini. Pelayan membekalkan maklumat Ketelusan Sijil, tetapi tidak sah.</translation> <translation id="4953650215774548573">Tetapkan Google Chrome sebagai penyemak imbas lalai anda</translation> @@ -255,6 +256,7 @@ <translation id="8290100596633877290">Alamak! Google Chrome mengalami ranap sistem. Lancarkan semula sekarang?</translation> <translation id="8342675569599923794">Fail ini berbahaya, maka Chrome telah menyekatnya.</translation> <translation id="8406086379114794905">Bantu mempertingkat Chrome</translation> +<translation id="8410645163819739900">OS Google Chrome tidak boleh membuka halaman ini.</translation> <translation id="8455999171311319804">Pilihan: Bantu jadikan OS Chrome lebih baik dengan menghantar data diagnostik dan penggunaan kepada Google secara automatik.</translation> <translation id="853189717709780425">Anda log masuk dengan akaun terurus dan memberikan pentadbirnya kawalan terhadap profil Google Chrome anda. Data Chrome anda, seperti apl, penanda halaman, sejarah, kata laluan dan tetapan anda yang lain akan terikat kepada <ph name="USER_NAME" /> secara kekal. Anda akan dapat memadamkan data ini melalui Papan Pemuka Akaun Google, tetapi anda tidak akan dapat mengaitkan data ini dengan akaun lain.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_nl.xtb b/chrome/app/resources/google_chrome_strings_nl.xtb index a318f3c2b..ab97a0f 100644 --- a/chrome/app/resources/google_chrome_strings_nl.xtb +++ b/chrome/app/resources/google_chrome_strings_nl.xtb
@@ -137,6 +137,7 @@ <translation id="4771048833395599659">Dit bestand kan gevaarlijk zijn en is daarom door Chrome geblokkeerd.</translation> <translation id="4794050651896644714">Details opslaan in Chrome</translation> <translation id="4891791193823137474">Google Chrome op de achtergrond laten uitvoeren</translation> +<translation id="4901390485477164536">Google Chrome is je standaardbrowser.</translation> <translation id="4921569541910214635">Deel je een computer? Je kunt Chrome nu precies instellen zoals jij dat wilt.</translation> <translation id="4925019873400497719">Chrome heeft geverifieerd dat <ph name="ISSUER" /> het certificaat van deze website heeft uitgegeven. De server heeft certificaattransparantiegegevens geleverd, maar deze waren ongeldig.</translation> <translation id="4953650215774548573">Google Chrome instellen als je standaardbrowser</translation> @@ -261,6 +262,7 @@ <translation id="8290100596633877290">Oeps! Google Chrome is vastgelopen. Nu opnieuw starten?</translation> <translation id="8342675569599923794">Dit bestand is gevaarlijk en is daarom door Chrome geblokkeerd.</translation> <translation id="8406086379114794905">Help ons Chrome te verbeteren</translation> +<translation id="8410645163819739900">Google Chrome OS kan deze pagina niet openen.</translation> <translation id="8455999171311319804">Optioneel: Help Chrome OS beter te maken door automatisch diagnostische en gebruiksgegevens te verzenden naar Google.</translation> <translation id="853189717709780425">Je logt in met een beheerd account en geeft de beheerderscontrole over aan je Google Chrome-profiel. Je Chrome-gegevens zoals je apps, bladwijzers, geschiedenis, wachtwoorden en andere instellingen worden permanent gekoppeld aan <ph name="USER_NAME" />. Je kunt deze gegevens verwijderen via het Google Accounts Dashboard, maar je kunt deze gegevens niet koppelen aan een ander account.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_no.xtb b/chrome/app/resources/google_chrome_strings_no.xtb index 0b97657a..319b4704 100644 --- a/chrome/app/resources/google_chrome_strings_no.xtb +++ b/chrome/app/resources/google_chrome_strings_no.xtb
@@ -133,6 +133,7 @@ <translation id="4771048833395599659">Denne filen kan være farlig, så Chrome har blokkert den.</translation> <translation id="4794050651896644714">Lagre detaljer i Chrome</translation> <translation id="4891791193823137474">La Google Chrome kjøre i bakgrunnen</translation> +<translation id="4901390485477164536">Google Chrome er standardnettleseren din. Hurra!</translation> <translation id="4921569541910214635">Deler du datamaskinen din med andre? Nå kan du konfigurere Chrome akkurat slik du vil.</translation> <translation id="4925019873400497719">Chrome bekreftet at sertifikatet for dette nettstedet er utstedt av <ph name="ISSUER" />. Tjeneren oppga informasjon om sertifikatåpenhet, men den var ugyldig.</translation> <translation id="4953650215774548573">Bruk Google Chrome som standard nettleser</translation> @@ -255,6 +256,7 @@ <translation id="8290100596633877290">Google Chrome har fått et programstopp. Vil du starte på nytt nå?</translation> <translation id="8342675569599923794">Denne filen er farlig, så Chrome har blokkert den.</translation> <translation id="8406086379114794905">Bidra til å gjøre Chrome bedre</translation> +<translation id="8410645163819739900">Google Chrome OS kan ikke åpne denne siden.</translation> <translation id="8455999171311319804">Valgfritt: Bidra til å gjøre Chrome OS bedre ved å sende diagnostikk og brukerdata automatisk til Google.</translation> <translation id="853189717709780425">Du er i ferd med å logge deg på med en administrert konto og gir administratoren kontroll over Chrome-profilen din. Chrome-dataene dine, som apper, bokmerker, loggen, passord og andre innstillinger, blir permanent knyttet til <ph name="USER_NAME" />. Du kan slette disse dataene via Google Konto-oversikten, men du kan ikke knytte disse dataene til en annen konto.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_pl.xtb b/chrome/app/resources/google_chrome_strings_pl.xtb index d325bfb..848f308d 100644 --- a/chrome/app/resources/google_chrome_strings_pl.xtb +++ b/chrome/app/resources/google_chrome_strings_pl.xtb
@@ -134,6 +134,7 @@ <translation id="4771048833395599659">Ten plik może być niebezpieczny, dlatego został zablokowany przez Chrome.</translation> <translation id="4794050651896644714">Zapisz szczegóły w Chrome</translation> <translation id="4891791193823137474">Zezwalaj przeglądarce Google Chrome na działanie w tle</translation> +<translation id="4901390485477164536">Google Chrome jest domyślną przeglądarką. Hura!</translation> <translation id="4921569541910214635">Używasz komputera, z którego korzystają inne osoby? Teraz możesz skonfigurować Chrome tak, jak chcesz.</translation> <translation id="4925019873400497719">Chrome sprawdził, że wydawcą certyfikatu tej witryny jest <ph name="ISSUER" />. Serwer dostarczył informacje o certyfikacie, korzystając z protokołu Certificate Transparency, ale były one nieprawidłowe.</translation> <translation id="4953650215774548573">Ustaw Google Chrome jako domyślną przeglądarkę</translation> @@ -256,6 +257,7 @@ <translation id="8290100596633877290">O kurczę! Przeglądarka Google Chrome uległa awarii. Uruchomić ją teraz ponownie?</translation> <translation id="8342675569599923794">Ten plik jest niebezpieczny, dlatego został zablokowany przez Chrome.</translation> <translation id="8406086379114794905">Pomóż ulepszać Chrome</translation> +<translation id="8410645163819739900">System operacyjny Google Chrome nie może otworzyć tej strony.</translation> <translation id="8455999171311319804">Opcjonalnie: pomóż ulepszyć system operacyjny Chrome OS, automatycznie wysyłając do Google dane diagnostyczne i informacje o użytkowaniu.</translation> <translation id="853189717709780425">Logujesz się na konto zarządzane i przyznajesz jego administratorowi kontrolę nad swoim profilem Google Chrome. Twoje dane Chrome, takie jak aplikacje, zakładki, historia, hasła i inne ustawienia, zostaną trwale powiązane z użytkownikiem <ph name="USER_NAME" />. Będzie je można usunąć w sekcji kont Panelu Google, ale nie będzie można powiązać ich z innym kontem.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_pt-BR.xtb b/chrome/app/resources/google_chrome_strings_pt-BR.xtb index 25cb8f9..50fcbb6 100644 --- a/chrome/app/resources/google_chrome_strings_pt-BR.xtb +++ b/chrome/app/resources/google_chrome_strings_pt-BR.xtb
@@ -134,6 +134,7 @@ <translation id="4771048833395599659">Esse arquivo pode ser perigoso, por isso ele foi bloqueado pelo Chrome.</translation> <translation id="4794050651896644714">Salvar detalhes no Google Chrome</translation> <translation id="4891791193823137474">Executar o Google Chrome em segundo plano</translation> +<translation id="4901390485477164536">Parabéns! O Google Chrome é seu navegador padrão.</translation> <translation id="4921569541910214635">Você compartilha um computador? Agora é possível configurar o Google Chrome do jeito que você gosta.</translation> <translation id="4925019873400497719">O Chrome verificou que <ph name="ISSUER" /> emitiu o certificado deste website. O servidor forneceu informações de Transparência de certificado, mas elas eram inválidas.</translation> <translation id="4953650215774548573">Definir o Google Chrome como seu navegador padrão</translation> @@ -256,6 +257,7 @@ <translation id="8290100596633877290">Nossa! Houve uma falha no Google Chrome. Reiniciar agora?</translation> <translation id="8342675569599923794">Esse arquivo é perigoso, por isso ele foi bloqueado pelo Chrome.</translation> <translation id="8406086379114794905">Ajudar a melhorar o Google Chrome</translation> +<translation id="8410645163819739900">O Google Chrome OS não pode abrir esta página.</translation> <translation id="8455999171311319804">Opcional: Ajude a melhorar o Chrome OS enviando automaticamente dados de uso e diagnóstico ao Google.</translation> <translation id="853189717709780425">Você está fazendo login com uma conta gerenciada e concedendo ao administrador da conta o controle sobre seu perfil do Google Chrome. Seus dados do Google Chrome, como aplicativos, favoritos, histórico, senhas e outras configurações serão permanentemente vinculados a <ph name="USER_NAME" />. Você pode excluir esses dados pelo painel das Contas do Google, mas não pode associar esses dados a outra conta.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_pt-PT.xtb b/chrome/app/resources/google_chrome_strings_pt-PT.xtb index 9a66da3..76c9eb7 100644 --- a/chrome/app/resources/google_chrome_strings_pt-PT.xtb +++ b/chrome/app/resources/google_chrome_strings_pt-PT.xtb
@@ -133,6 +133,7 @@ <translation id="4771048833395599659">Este ficheiro pode ser perigoso. Como tal, o Chrome bloqueou-o.</translation> <translation id="4794050651896644714">Guardar os detalhes no Chrome</translation> <translation id="4891791193823137474">Permitir que o Google Chrome seja executado em segundo plano</translation> +<translation id="4901390485477164536">O Google Chrome é o seu navegador predefinido. Viva!</translation> <translation id="4921569541910214635">Partilha um computador? Agora pode configurar o Chrome exatamente como pretende.</translation> <translation id="4925019873400497719">O Chrome confirmou que <ph name="ISSUER" /> emitiu o certificado deste Website. O servidor forneceu informações de Transparência do certificado, mas estas eram inválidas.</translation> <translation id="4953650215774548573">Definir o Google Chrome como o navegador predefinido</translation> @@ -255,6 +256,7 @@ <translation id="8290100596633877290">Ups! O Google Chrome falhou. Reiniciar agora?</translation> <translation id="8342675569599923794">Este ficheiro é perigoso. Como tal, o Chrome bloqueou-o.</translation> <translation id="8406086379114794905">Ajude a melhorar o Chrome</translation> +<translation id="8410645163819739900">O Google Chrome SO não consegue abrir esta página.</translation> <translation id="8455999171311319804">Opcional: ajude a melhorar o SO Chrome ao enviar automaticamente dados de diagnóstico e de utilização para a Google.</translation> <translation id="853189717709780425">Está a iniciar sessão com uma conta gerida e a permitir que o administrador controle o seu perfil do Google Chrome. Os seus dados do Chrome, como aplicações, marcadores, histórico, palavras-passe e outras definições ficarão permanentemente associados a <ph name="USER_NAME" />. Poderá eliminar estes dados através do Painel de Controlo das Contas Google mas não poderá associar estes dados a outra conta.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ro.xtb b/chrome/app/resources/google_chrome_strings_ro.xtb index 1fd4958a..6c8ea0ff 100644 --- a/chrome/app/resources/google_chrome_strings_ro.xtb +++ b/chrome/app/resources/google_chrome_strings_ro.xtb
@@ -133,6 +133,7 @@ <translation id="4771048833395599659">Este posibil ca fișierul să fie periculos, așadar Chrome l-a blocat.</translation> <translation id="4794050651896644714">Salvați detaliile în Chrome</translation> <translation id="4891791193823137474">Permite ca Google Chrome să ruleze în fundal</translation> +<translation id="4901390485477164536">Google Chrome este browserul prestabilit. Felicitări.</translation> <translation id="4921569541910214635">Folosești un computer în comun? Acum poți să configurezi Chrome exact cum îți place.</translation> <translation id="4925019873400497719">Chrome s-a asigurat că certificatul acestui site a fost emis de <ph name="ISSUER" />. Serverul a oferit informații privind Certificate Transparency, însă acestea nu au fost valide.</translation> <translation id="4953650215774548573">Setați Google Chrome ca browser prestabilit</translation> @@ -255,6 +256,7 @@ <translation id="8290100596633877290">Hopa! Google Chrome s-a blocat. Repornești acum?</translation> <translation id="8342675569599923794">Fișierul este periculos, așadar Chrome l-a blocat.</translation> <translation id="8406086379114794905">Contribuie la îmbunătățirea Chrome</translation> +<translation id="8410645163819739900">Sistemul de operare Google Chrome nu poate deschide pagina.</translation> <translation id="8455999171311319804">Opțional: contribuie la îmbunătățirea sistemului de operare Chrome trimițând automat date de diagnosticare și de utilizare la Google.</translation> <translation id="853189717709780425">Vă conectați cu un cont gestionat și îi permiteți administratorului acestuia controlul asupra profilului dvs. Google Chrome. Datele dvs. Chrome, cum ar fi aplicațiile, marcajele, istoricul, parolele și alte setări vor fi asociate definitiv cu <ph name="USER_NAME" />. Veți putea să ștergeți aceste date prin intermediul Tabloului de bord pentru Conturi Google, însă nu veți putea să asociați aceste date cu un alt cont.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ru.xtb b/chrome/app/resources/google_chrome_strings_ru.xtb index 50135cc..e88845d 100644 --- a/chrome/app/resources/google_chrome_strings_ru.xtb +++ b/chrome/app/resources/google_chrome_strings_ru.xtb
@@ -133,6 +133,7 @@ <translation id="4771048833395599659">Chrome заблокировал этот файл как потенциально опасный.</translation> <translation id="4794050651896644714">Сохранять данные в Chrome</translation> <translation id="4891791193823137474">Разрешить работу Google Chrome в фоновом режиме</translation> +<translation id="4901390485477164536">Google Chrome используется как браузер по умолчанию. Ура!</translation> <translation id="4921569541910214635">Пользуетесь компьютером вместе с коллегой или другом? Теперь каждый из вас сможет настроить Chrome по своему вкусу.</translation> <translation id="4925019873400497719">Данные Chrome подтверждают, что издатель сертификата сайта – <ph name="ISSUER" />. Сервер предоставил временные метки сертификата, однако они недействительны.</translation> <translation id="4953650215774548573">Сделать Google Chrome браузером по умолчанию</translation> @@ -255,6 +256,7 @@ <translation id="8290100596633877290">Произошел сбой Google Chrome. Перезапустить?</translation> <translation id="8342675569599923794">Chrome заблокировал этот файл как опасный.</translation> <translation id="8406086379114794905">Помогите сделать Chrome безопаснее</translation> +<translation id="8410645163819739900">Не удалось открыть страницу</translation> <translation id="8455999171311319804">Автоматически отправлять статистику использования и данные диагностики в Google, чтобы помочь улучшить Chrome OS (необязательно)</translation> <translation id="853189717709780425">Вы входите в управляемый аккаунт, администратор которого сможет контролировать ваш профиль Google Chrome. Ваши приложения, закладки, история, пароли, настройки и прочие данные Chrome будут связаны с аккаунтом <ph name="USER_NAME" />. Вы можете удалить эти данные в Личном кабинете Google Аккаунтов, но не можете связать их с другим аккаунтом.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sk.xtb b/chrome/app/resources/google_chrome_strings_sk.xtb index 72adbc07..f0a65735 100644 --- a/chrome/app/resources/google_chrome_strings_sk.xtb +++ b/chrome/app/resources/google_chrome_strings_sk.xtb
@@ -135,6 +135,7 @@ <translation id="4771048833395599659">Tento súbor môže byť nebezpečný, a preto ho Chrome zablokoval.</translation> <translation id="4794050651896644714">Uložiť podrobnosti v prehliadači Chrome</translation> <translation id="4891791193823137474">Povoliť prehliadaču Google Chrome spustenie na pozadí</translation> +<translation id="4901390485477164536">Google Chrome je vaším predvoleným prehliadačom. Skvelé!</translation> <translation id="4921569541910214635">Zdieľať počítač? Teraz si môžete prehliadač Chrome nastaviť podľa vlastných predstáv.</translation> <translation id="4925019873400497719">Chrome overil, že certifikát tohto webu bol vydaný vydavateľom <ph name="ISSUER" />. Server poskytol informácie o transparentnosti certifikátu, boli však neplatné.</translation> <translation id="4953650215774548573">Nastaviť Google Chrome ako predvolený prehliadač</translation> @@ -261,6 +262,7 @@ <translation id="8290100596633877290">Google Chrome zlyhal. Chcete ho spustiť znova?</translation> <translation id="8342675569599923794">Tento súbor je nebezpečný, a preto ho Chrome zablokoval.</translation> <translation id="8406086379114794905">Pomôžte nám prehliadač Chrome zlepšiť</translation> +<translation id="8410645163819739900">Google Chrome OS nedokáže túto stránku otvoriť.</translation> <translation id="8455999171311319804">Voliteľné: Pomáhať s vylepšením systému Chrome OS automatickým odosielaním diagnostík a údajov o využívaní Googlu.</translation> <translation id="853189717709780425">Prihlasujete sa pomocou spravovaného účtu a jeho správcovi dávate kontrolu nad vaším profilom prehliadača Chrome. Vaše údaje prehliadača Chrome, ako sú aplikácie, záložky, história, heslá a iné nastavenia, sa natrvalo priradia k účtu <ph name="USER_NAME" />. Tieto údaje budete môcť odstrániť len pomocou služby Dashboard v Účtoch Google, ale nebudete ich môcť priradiť k inému účtu.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sl.xtb b/chrome/app/resources/google_chrome_strings_sl.xtb index 8868819..b12ecb7 100644 --- a/chrome/app/resources/google_chrome_strings_sl.xtb +++ b/chrome/app/resources/google_chrome_strings_sl.xtb
@@ -137,6 +137,7 @@ <translation id="4771048833395599659">Ta datoteka je morda nevarna, zato jo je Chrome blokiral.</translation> <translation id="4794050651896644714">Shrani podrobnosti v Chrome</translation> <translation id="4891791193823137474">Naj se Google Chrome izvaja v ozadju</translation> +<translation id="4901390485477164536">Google Chrome je privzeti brskalnik. Super.</translation> <translation id="4921569541910214635">Imate računalnik v skupni rabi? Zdaj lahko nastavite Chrome po svojih željah.</translation> <translation id="4925019873400497719">Chrome je preveril, da je potrdilo tega spletnega mesta izdal izdajatelj <ph name="ISSUER" />. Strežnik je poslal podatke o preglednosti potrdila, vendar so bili neveljavni.</translation> <translation id="4953650215774548573">Nastavitev Google Chroma za privzeti brskalnik</translation> @@ -263,6 +264,7 @@ <translation id="8290100596633877290">Opa! Google Chrome se je zrušil. Ga želite znova zagnati?</translation> <translation id="8342675569599923794">Ta datoteka je nevarna, zato jo je Chrome blokiral.</translation> <translation id="8406086379114794905">Pomagajte izboljšati Chrome</translation> +<translation id="8410645163819739900">Googlov OS Chrome ne more odpreti te strani.</translation> <translation id="8455999171311319804">Izbirno: pomagajte izboljšati OS Chrome s samodejnim pošiljanjem diagnostičnih podatkov in podatkov o uporabi Googlu.</translation> <translation id="853189717709780425">Prijavljate se z upravljanim računom in s tem njegovemu skrbniku omogočate nadziranje vašega profila v Google Chromu. Vaši podatki v Chromu, na primer aplikacije, zaznamki, zgodovina, gesla in druge nastavitve, bodo postali trajno povezani z uporabnikom <ph name="USER_NAME" />. Te podatke boste lahko izbrisali z nadzorno ploščo za Google Račune, vendar jih ne boste mogli povezati z drugim računom.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sr.xtb b/chrome/app/resources/google_chrome_strings_sr.xtb index 3b0af60..b1394d6e 100644 --- a/chrome/app/resources/google_chrome_strings_sr.xtb +++ b/chrome/app/resources/google_chrome_strings_sr.xtb
@@ -121,7 +121,7 @@ <translation id="437002079035561265">Овај рачунар више неће добијати ажурирања за Google Chrome јер овај Linux систем више није подржан.</translation> <translation id="4407807842708586359">Google Chrome OS</translation> <translation id="4458285410772214805">Одјавите се и поново се пријавите да би ова промена ступила на снагу.</translation> -<translation id="4458462641685292929">Друга радња у Google Chrome-у је у току. Покушајте поново касније.</translation> +<translation id="4458462641685292929">Друга радња у Google Chrome-у је у току. Пробајте поново касније.</translation> <translation id="4480040274068703980">Chrome ОС не може да синхронизује податке због грешке при пријављивању.</translation> <translation id="4519152997629025674">Google Chrome може да користи <ph name="BEGIN_LINK" />веб-услуге<ph name="END_LINK" /> да би побољшао искуство прегледања. Ако желите, можете да онемогућите ове услуге у било ком тренутку.</translation> <translation id="4561051373932531560">Google Chrome вам омогућава да кликнете на број телефона на вебу и да га позовете помоћу Skype-а!</translation> @@ -137,6 +137,7 @@ <translation id="4771048833395599659">Ова датотека може да буде опасна, па ју је Chrome блокирао.</translation> <translation id="4794050651896644714">Сачувај детаље у Chrome-у</translation> <translation id="4891791193823137474">Нека Google Chrome ради у позадини</translation> +<translation id="4901390485477164536">Google Chrome је подразумевани прегледач. Сјајно.</translation> <translation id="4921569541910214635">Делите рачунар? Сада можете да подесите Chrome баш онако како вама одговара.</translation> <translation id="4925019873400497719">Chrome је верификовао да је <ph name="ISSUER" /> издао сертификат овог сајта. Сервер је послао информације о транспарентности сертификата, али оне су неважеће.</translation> <translation id="4953650215774548573">Подеси Google Chrome као подразумевани прегледач</translation> @@ -263,6 +264,7 @@ <translation id="8290100596633877290">Опа! Google Chrome је отказао. Желите ли да га одмах поново покренете?</translation> <translation id="8342675569599923794">Ова датотека је опасна, па ју је Chrome блокирао.</translation> <translation id="8406086379114794905">Помозите нам да побољшамо Chrome</translation> +<translation id="8410645163819739900">Google Chrome ОС не може да отвори ову страницу.</translation> <translation id="8455999171311319804">Опционално: Помозите нам да побољшамо Chrome ОС тако што ћете аутоматски слати Google-у дијагностику и податке о коришћењу.</translation> <translation id="853189717709780425">Пријављујете се помоћу налога којим се управља и дајете његовом администратору контролу над Google Chrome профилом. Chrome подаци, као што су апликације, обележивачи, историја, лозинке и друга подешавања, биће трајно повезани са корисником <ph name="USER_NAME" />. Моћи ћете да избришете те податке преко Контролне табле Google налога, али нећете моћи да их повежете са неким другим налогом.</translation> <translation id="8540666473246803645">Google Chrome</translation> @@ -279,7 +281,7 @@ <translation id="8823341990149967727">Chrome је застарео</translation> <translation id="884296878221830158">Контролише и страницу која се приказује када покренете Chrome или кликнете на дугме Почетна.</translation> <translation id="8851136666856101339">main</translation> -<translation id="8862326446509486874">Немате одговарајућа права за инсталацију на нивоу система. Покушајте поново да покренете програм за инсталацију, овога пута као администратор.</translation> +<translation id="8862326446509486874">Немате одговарајућа права за инсталацију на нивоу система. Пробајте поново да покренете програм за инсталацију, овога пута као администратор.</translation> <translation id="8914504000324227558">Поново покрени Chrome</translation> <translation id="9026991721384951619">Chrome ОС не може да синхронизује податке зато што су подаци за пријављивање на налог застарели.</translation> <translation id="9067395829937117663">За Google Chrome је потребан Windows 7 или новија верзија.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sv.xtb b/chrome/app/resources/google_chrome_strings_sv.xtb index 2a2f9bbd..f14ed060 100644 --- a/chrome/app/resources/google_chrome_strings_sv.xtb +++ b/chrome/app/resources/google_chrome_strings_sv.xtb
@@ -137,6 +137,7 @@ <translation id="4771048833395599659">Filen kan vara farlig och har blockerats av Chrome.</translation> <translation id="4794050651896644714">Spara information i Chrome</translation> <translation id="4891791193823137474">Låt Google Chrome köras i bakgrunden</translation> +<translation id="4901390485477164536">Google Chrome är din standardwebbläsare.</translation> <translation id="4921569541910214635">Delar du dator? Nu kan du konfigurera Chrome precis som du vill.</translation> <translation id="4925019873400497719">Chrome har verifierat att webbplatsens certifikat har utfärdats av <ph name="ISSUER" />. De certifikattransparensuppgifter som skickades från servern är ogiltiga.</translation> <translation id="4953650215774548573">Ange Google Chrome som standardwebbläsare</translation> @@ -263,6 +264,7 @@ <translation id="8290100596633877290">Hoppsan! Google Chrome har kraschat. Vill du starta om nu?</translation> <translation id="8342675569599923794">Filen är farlig och har blockerats av Chrome.</translation> <translation id="8406086379114794905">Hjälp till att göra Chrome bättre</translation> +<translation id="8410645163819739900">Det går inte att öppna den här sidan i Google Chrome OS.</translation> <translation id="8455999171311319804">Valfritt: Hjälp oss att göra Chrome bättre genom att automatiskt skicka diagnostik- och användningsdata till Google.</translation> <translation id="853189717709780425">Du loggar in med ett hanterat konto och ger dess administratör kontroll över din profil i Google Chrome. Dina uppgifter i Chrome, till exempel appar, bokmärken, historik, lösenord och andra inställningar, kopplas permanent till <ph name="USER_NAME" />. Du kan ta bort dessa uppgifter i översikten för ditt Google-konto, men du kan inte koppla dem till något annat konto.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sw.xtb b/chrome/app/resources/google_chrome_strings_sw.xtb index 02d4674..a3048c71 100644 --- a/chrome/app/resources/google_chrome_strings_sw.xtb +++ b/chrome/app/resources/google_chrome_strings_sw.xtb
@@ -137,6 +137,7 @@ <translation id="4771048833395599659">Huenda faili hii ni hatari, kwa hivyo Chrome imeizuia.</translation> <translation id="4794050651896644714">Hifadhi maelezo katika Chrome</translation> <translation id="4891791193823137474">Ruhusu Google Chrome iendeshe katika mandharinyuma</translation> +<translation id="4901390485477164536">Google Chrome ni kivinjari chako chaguo-msingi. Furahia!</translation> <translation id="4921569541910214635">Ungependa kushiriki kompyuta? Sasa unaweza kusanidi Chrome kama tu unavyoipenda.</translation> <translation id="4925019873400497719">Chrome ilithibitisha kuwa <ph name="ISSUER" /> ndiye mtoa cheti cha tovuti hii. Seva ilitoa maelezo ya Cheti cha Uwazi, lakini hayakuwa sahihi.</translation> <translation id="4953650215774548573">Weka Google Chrome iwe kivinjari chako chaguo-msingi</translation> @@ -263,6 +264,7 @@ <translation id="8290100596633877290">Ho! Google Chrome imezimika. Ianzishe tena sasa?</translation> <translation id="8342675569599923794">Faili hii ni hatari, kwa hivyo Chrome imeizuia.</translation> <translation id="8406086379114794905">Saidia kuboresha Chrome</translation> +<translation id="8410645163819739900">Mfumo wa Uendeshaji wa Google Chrome hauwezi kufungua ukurasa huu.</translation> <translation id="8455999171311319804">Hiari: Saidia kuboresha Mfumo wa Uendeshaji wa Chrome kwa kutuma data ya uchunguzi na matumizi kwa Google kiotomatiki.</translation> <translation id="853189717709780425">Unaingia kwa kutumia akaunti inayodhibitiwa na kutoa ruhusa msimamizi wake adhibiti wasifu wako kwenye Chrome. Data yako kwenye Chrome, kama vile programu, alamisho, historia, manenosiri yako, na mipangilio mingine itasalia kabisa kwenye <ph name="USER_NAME" />. Utaweza kufuta data hii kupitia Dashibodi ya Akaunti ya Google, lakini hutaweza kuhusisha data hii na akaunti nyingine.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ta.xtb b/chrome/app/resources/google_chrome_strings_ta.xtb index 4f8eec68..760b175d 100644 --- a/chrome/app/resources/google_chrome_strings_ta.xtb +++ b/chrome/app/resources/google_chrome_strings_ta.xtb
@@ -133,6 +133,7 @@ <translation id="4771048833395599659">இந்தக் கோப்பு ஆபத்தானதாக இருக்கக்கூடும் என்பதால், அதை Chrome தடுத்துள்ளது.</translation> <translation id="4794050651896644714">விவரங்களை Chrome இல் சேமி</translation> <translation id="4891791193823137474">பின்னணியில் Google Chrome ஐ இயக்கு</translation> +<translation id="4901390485477164536">அருமை, இயல்புநிலை உலாவி Google Chrome ஆகும்.</translation> <translation id="4921569541910214635">கணினியைப் பகிர்ந்து கொண்டுள்ளீர்களா? இப்போது நீங்கள் விரும்பும் விதத்தில் Chromeஐ அமைக்கலாம்.</translation> <translation id="4925019873400497719">இந்த இணையதளத்தின் சான்றிதழ் <ph name="ISSUER" /> ஆல் வழங்கப்பட்டதா என Chrome சரிபார்த்தது. சான்றிதழின் வெளிப்படைத்தன்மைத் தகவலைச் சேவையகம் வழங்கியது, ஆனால் அது செல்லுபடியாகாததாக இருந்தது.</translation> <translation id="4953650215774548573">Google Chrome ஐ உங்கள் இயல்புநிலை உலாவியாக அமைக்கவும்</translation> @@ -255,6 +256,7 @@ <translation id="8290100596633877290">அச்சச்சோ! Google Chrome செயலிழந்தது. இப்போது மீண்டும் தொடங்கவா?</translation> <translation id="8342675569599923794">இந்தக் கோப்பு ஆபத்தானது என்பதால், அதை Chrome தடுத்துள்ளது.</translation> <translation id="8406086379114794905">Chrome ஐ மேலும் சிறப்பாக்க உதவவும்</translation> +<translation id="8410645163819739900">Google Chrome OS ஆல் இந்தப் பக்கத்தைத் திறக்க முடியாது.</translation> <translation id="8455999171311319804">விருப்பத்தேர்வுக்குரியது: பிழை அறிக்கையையும் உபயோகத் தரவையும் Googleக்குத் தானாக அனுப்புவதன் மூலம், Chrome OSஐ இன்னும் சிறப்பாக்க உதவவும்.</translation> <translation id="853189717709780425">நிர்வகிக்கப்படும் கணக்கு மூலம் உள்நுழைந்துள்ளீர்கள் மேலும் அதன் நிர்வாகி கட்டுப்பாட்டை உங்கள் Google Chrome சுயவிவரம் முழுவதும் கொடுக்கிறீர்கள். உங்கள் பயன்பாடுகள், புக்மார்க்குகள், வரலாறு, கடவுச்சொற்கள் போன்ற உங்கள் Chrome தரவு மற்றும் பிற அமைப்புகள் <ph name="USER_NAME" /> உடன் நிரந்தரமாக இணைக்கப்படும். இந்தத் தரவை Google கணக்குகளின் டாஷ்போர்டு வழியாக நீக்க முடியும், ஆனால் இந்தத் தரவை வேறொரு கணக்குடன் தொடர்புபடுத்த முடியாது.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_te.xtb b/chrome/app/resources/google_chrome_strings_te.xtb index bf300543..92f061fd 100644 --- a/chrome/app/resources/google_chrome_strings_te.xtb +++ b/chrome/app/resources/google_chrome_strings_te.xtb
@@ -133,6 +133,7 @@ <translation id="4771048833395599659">ఈ ఫైల్ అపాయకరం కావచ్చు, కాబట్టి Chrome దీన్ని బ్లాక్ చేసింది.</translation> <translation id="4794050651896644714">వివరాలను Chromeలో సేవ్ చేయి</translation> <translation id="4891791193823137474">Google Chromeను నేపథ్యంలో అమలు అయ్యేలా అనుమతించండి</translation> +<translation id="4901390485477164536">Google Chrome మీ డిఫాల్ట్ బ్రౌజర్. ఆనందించండి.</translation> <translation id="4921569541910214635">కంప్యూటర్ను భాగస్వామ్యం చేయాలా? ఇప్పుడు మీరు కోరుకున్న విధంగా Chromeను సెటప్ చేయవచ్చు.</translation> <translation id="4925019873400497719">Chrome ఈ వెబ్సైట్ ప్రమాణపత్రాన్ని <ph name="ISSUER" /> జారీ చేసినట్లు ధృవీకరించింది. సర్వర్ ప్రమాణపత్ర పారదర్శకత సమాచారాన్ని అందించింది, కానీ అది చెల్లదు.</translation> <translation id="4953650215774548573">Google Chromeను మీ డిఫాల్ట్ బ్రౌజర్గా సెట్ చేయండి</translation> @@ -255,6 +256,7 @@ <translation id="8290100596633877290">ఆపండి! Google Chrome క్రాష్ అయ్యింది. ఇప్పుడు మళ్ళీ ప్రారంభించాల?</translation> <translation id="8342675569599923794">ఈ ఫైల్ అపాయకరమైనది, కాబట్టి Chrome దీన్ని బ్లాక్ చేసింది.</translation> <translation id="8406086379114794905">Chromeని మెరుగుపరచడంలో సహాయపడండి</translation> +<translation id="8410645163819739900">Google Chrome OS ఈ పేజీని తెరవలేదు.</translation> <translation id="8455999171311319804">ఐచ్ఛికం: విశ్లేషణ మరియు వినియోగ డేటాను స్వయంచాలకంగా Googleకి పంపడం ద్వారా Chrome OSని మెరుగుపరచడంలో సహాయం అందించండి.</translation> <translation id="853189717709780425">మీరు నిర్వహించబడే ఖాతాతో సైన్ ఇన్ చేస్తున్నారు మరియు దాని నిర్వాహకుడికి మీ Google Chrome ప్రొఫైల్పై నియంత్రణను ఇస్తున్నారు. మీ అనువర్తనాలు, బుక్మార్క్లు, చరిత్ర, పాస్వర్డ్ల మరియు ఇతర సెట్టింగ్లు వంటి మీ Chrome డేటా శాశ్వతంగా <ph name="USER_NAME" />కు అనుబంధించబడుతుంది. మీరు ఈ డేటాను Google ఖాతాల డాష్బోర్డ్ ద్వారా తొలగించగలరు, కానీ ఈ డేటాను మరో ఖాతాకు అనుబంధించలేరు.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_th.xtb b/chrome/app/resources/google_chrome_strings_th.xtb index eaf8540..f6e420c 100644 --- a/chrome/app/resources/google_chrome_strings_th.xtb +++ b/chrome/app/resources/google_chrome_strings_th.xtb
@@ -134,6 +134,7 @@ <translation id="4771048833395599659">ไฟล์นี้อาจเป็นอันตราย Chrome จึงบล็อกไว้</translation> <translation id="4794050651896644714">บันทึกรายละเอียดใน Chrome</translation> <translation id="4891791193823137474">ให้ Google Chrome ทำงานในเบื้องหลัง</translation> +<translation id="4901390485477164536">Google Chrome เป็นเบราว์เซอร์เริ่มต้นของคุณ ไชโย</translation> <translation id="4921569541910214635">หากต้องการแชร์คอมพิวเตอร์ ตอนนี้คุณสามารถตั้งค่า Chrome ในแบบที่คุณชอบได้แล้ว</translation> <translation id="4925019873400497719">Chrome ยืนยันว่า <ph name="ISSUER" /> ได้ออกใบรับรองของเว็บไซต์นี้ เซิร์ฟเวอร์ได้ให้ข้อมูลความโปร่งใสของใบรับรองแล้ว แต่ข้อมูลไม่ถูกต้อง</translation> <translation id="4953650215774548573">ตั้ง Google Chrome เป็นเบราว์เซอร์เริ่มต้นของคุณ</translation> @@ -256,6 +257,7 @@ <translation id="8290100596633877290">อ๊ะ! Google Chrome ขัดข้อง เปิดใหม่ตอนนี้หรือไม่</translation> <translation id="8342675569599923794">ไฟล์นี้อันตราย Chrome จึงบล็อกไว้</translation> <translation id="8406086379114794905">ช่วยปรับปรุง Chrome ให้ดีขึ้น</translation> +<translation id="8410645163819739900">Google Chrome OS ไม่สามารถเปิดหน้านี้</translation> <translation id="8455999171311319804">ไม่บังคับ: ช่วยทำให้ Chrome OS ดียิ่งขึ้นโดยการส่งข้อมูลการวินิจฉัยและการใช้งานไปยัง Google โดยอัตโนมัติ</translation> <translation id="853189717709780425">คุณกำลังลงชื่อเข้าใช้ด้วยบัญชีที่มีการจัดการ และให้อำนาจผู้ดูแลระบบของบัญชีดังกล่าวในการควบคุมโปรไฟล์ Google Chrome ของคุณ ข้อมูล Chrome เช่น แอป บุ๊กมาร์ก ประวัติการเข้าชม รหัสผ่าน และการตั้งค่าอื่นๆ จะถูกผูกติดกับ <ph name="USER_NAME" /> อย่างถาวร คุณจะสามารถลบข้อมูลนี้ผ่านแดชบอร์ด Google Accounts ได้ แต่คุณจะไม่สามารถเชื่อมโยงข้อมูลนี้กับบัญชีอื่นได้</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_tr.xtb b/chrome/app/resources/google_chrome_strings_tr.xtb index 909c1cc..022110c 100644 --- a/chrome/app/resources/google_chrome_strings_tr.xtb +++ b/chrome/app/resources/google_chrome_strings_tr.xtb
@@ -134,6 +134,7 @@ <translation id="4771048833395599659">Bu dosya tehlikeli olabileceği için Chrome tarafından engellendi.</translation> <translation id="4794050651896644714">Ayrıntıları Chrome'a kaydet</translation> <translation id="4891791193823137474">Google Chrome'un arka planda çalışmasına izin ver</translation> +<translation id="4901390485477164536">Google Chrome varsayılan tarayıcınız oldu. Tebrikler.</translation> <translation id="4921569541910214635">Bilgisayarı paylaşıyor musunuz? Artık Chrome'u tam olarak istediğiniz gibi kurabilirsiniz.</translation> <translation id="4925019873400497719">Chrome, bu web sitesi sertifikasının <ph name="ISSUER" /> tarafından yayınlandığını doğruladı. Sunucu Sertifika Şeffaflığı bilgilerini sağladı, ancak bu bilgiler geçersizdi.</translation> <translation id="4953650215774548573">Google Chrome'u varsayılan tarayıcım olarak ayarla</translation> @@ -258,6 +259,7 @@ <translation id="8290100596633877290">Hata! Google Chrome kilitlendi. Şimdi yeniden başlatılsın mı?</translation> <translation id="8342675569599923794">Bu dosya tehlikeli olduğu için Chrome tarafından engellendi.</translation> <translation id="8406086379114794905">Chrome'u daha iyi hale getirmeye yardımcı olun</translation> +<translation id="8410645163819739900">Google Chrome OS bu sayfayı açamıyor.</translation> <translation id="8455999171311319804">İsteğe bağlı: Teşhis ve kullanım verilerini Google'a otomatik olarak gönderin ve Chrome OS'in iyileştirilmesine yardımcı olun.</translation> <translation id="853189717709780425">Yönetilen bir hesapla oturum açıyor ve hesabın yöneticisine Google Chrome profilinizi denetleme izni veriyorsunuz. Uygulamalarınız, yer işaretleriniz, geçmişiniz, şifreleriniz ve diğer ayarlarınız gibi Chrome verileriniz kalıcı olarak <ph name="USER_NAME" /> ile bağlantılandırılacaktır. İstediğinizde Google Hesapları Hesap Özeti'ni kullanarak bu verileri silebilecek, ancak bu verileri başka bir hesapla ilişkilendiremeyeceksiniz.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_uk.xtb b/chrome/app/resources/google_chrome_strings_uk.xtb index 5a08cff..0b66299 100644 --- a/chrome/app/resources/google_chrome_strings_uk.xtb +++ b/chrome/app/resources/google_chrome_strings_uk.xtb
@@ -133,6 +133,7 @@ <translation id="4771048833395599659">Цей файл може бути небезпечним, тому Chrome заблокував його.</translation> <translation id="4794050651896644714">Зберігати дані в Chrome</translation> <translation id="4891791193823137474">Дозволити Google Chrome працювати у фоновому режимі</translation> +<translation id="4901390485477164536">Google Chrome установлено веб-переглядачем за умовчанням.</translation> <translation id="4921569541910214635">Користуєтеся комп’ютером спільно з іншими? Тепер ви можете налаштувати Chrome на свій смак.</translation> <translation id="4925019873400497719">Chrome підтвердив, що компанія <ph name="ISSUER" /> видала сертифікат цього веб-сайту. Сервер надав інформацію про прозорість сертифіката, але вона недійсна.</translation> <translation id="4953650215774548573">Зробити Google Chrome веб-переглядачем за умовчанням</translation> @@ -255,6 +256,7 @@ <translation id="8290100596633877290">Відбулося аварійне завершення роботи Google Chrome. Перезапустити зараз?</translation> <translation id="8342675569599923794">Цей файл небезпечний, тому Chrome заблокував його.</translation> <translation id="8406086379114794905">Допоможіть покращити Chrome</translation> +<translation id="8410645163819739900">Неможливо відкрити цю сторінку в ОС Google Chrome</translation> <translation id="8455999171311319804">Додатково. Допоможіть покращити ОС Chrome, автоматично надсилаючи в Google дані про діагностику та використання.</translation> <translation id="853189717709780425">Ви входите, використовуючи дані керованого облікового запису, що дає його адміністратору можливість контролювати ваш профіль Google Chrome. Ваші дані Chrome, як-от програми, закладки, історія, паролі й інші налаштування, буде назавжди пов’язано з обліковим записом <ph name="USER_NAME" />. Ви зможете видалити ці дані на інформаційній панелі облікових записів Google, але не зможете пов’язати їх з іншим обліковим записом.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_vi.xtb b/chrome/app/resources/google_chrome_strings_vi.xtb index 674bf5e..dd14fe2 100644 --- a/chrome/app/resources/google_chrome_strings_vi.xtb +++ b/chrome/app/resources/google_chrome_strings_vi.xtb
@@ -136,6 +136,7 @@ <translation id="4771048833395599659">Tệp này có thể nguy hiểm, do đó Chrome đã chặn tệp.</translation> <translation id="4794050651896644714">Lưu chi tiết trong Chrome</translation> <translation id="4891791193823137474">Để Google Chrome chạy trên nền</translation> +<translation id="4901390485477164536">Google Chrome là trình duyệt mặc định của bạn. Xin chúc mừng!</translation> <translation id="4921569541910214635">Bạn muốn chia sẻ máy tính? Giờ đây, bạn có thể thiết lập Chrome theo cách mình muốn.</translation> <translation id="4925019873400497719">Chrome đã xác minh rằng <ph name="ISSUER" /> cấp chứng chỉ của trang web này. Máy chủ cung cấp thông tin về Tính minh mạch của chứng chỉ nhưng thông tin này không hợp lệ.</translation> <translation id="4953650215774548573">Đặt Google Chrome làm trình duyệt mặc định của bạn</translation> @@ -260,6 +261,7 @@ <translation id="8290100596633877290">Chà! Google Chrome đã bị lỗi. Mở lại bây giờ không? </translation> <translation id="8342675569599923794">Tệp này nguy hiểm, do đó Chrome đã chặn tệp.</translation> <translation id="8406086379114794905">Giúp cải thiện Chrome tốt hơn</translation> +<translation id="8410645163819739900">Google Chrome OS không mở được trang này.</translation> <translation id="8455999171311319804">Tùy chọn: Giúp cải thiện Chrome OS bằng cách tự động gửi dữ liệu chẩn đoán và dữ liệu sử dụng cho Google.</translation> <translation id="853189717709780425">Bạn đang đăng nhập bằng tài khoản được quản lý và cấp cho quản trị viên của tài khoản quyền kiểm soát hồ sơ Google Chrome của bạn. Dữ liệu Chrome của bạn, chẳng hạn như ứng dụng, dấu trang, lịch sử, mật khẩu và các cài đặt khác sẽ vĩnh viễn gắn với <ph name="USER_NAME" />. Bạn có thể xóa dữ liệu này qua Trang tổng quan của tài khoản Google nhưng không thể liên kết dữ liệu này với tài khoản khác.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_zh-CN.xtb b/chrome/app/resources/google_chrome_strings_zh-CN.xtb index 01401c0e..ba4cf84 100644 --- a/chrome/app/resources/google_chrome_strings_zh-CN.xtb +++ b/chrome/app/resources/google_chrome_strings_zh-CN.xtb
@@ -134,6 +134,7 @@ <translation id="4771048833395599659">此文件可能存在危险,因此 Chrome 已将其拦截。</translation> <translation id="4794050651896644714">在 Chrome 中保存详细信息</translation> <translation id="4891791193823137474">让 Google Chrome 浏览器在后台运行</translation> +<translation id="4901390485477164536">太棒了!Google Chrome 已设为您的默认浏览器。</translation> <translation id="4921569541910214635">与其他人共用计算机?现在,您可以随心所欲地设置Chrome。</translation> <translation id="4925019873400497719">Chrome 已证实此网站的证书是由<ph name="ISSUER" />签发的。服务器提供了 Certificate Transparency 信息,但这些信息无效。</translation> <translation id="4953650215774548573">将Google Chrome设为默认浏览器</translation> @@ -256,6 +257,7 @@ <translation id="8290100596633877290">哎呀!Google Chrome 浏览器崩溃了。是否立即重新启动?</translation> <translation id="8342675569599923794">此文件存在危险,因此 Chrome 已将其拦截。</translation> <translation id="8406086379114794905">帮助我们改进Chrome</translation> +<translation id="8410645163819739900">Google Chrome 操作系统无法打开此网页。</translation> <translation id="8455999171311319804">可选:将诊断数据和使用情况数据自动发送给 Google,协助我们改进 Chrome 操作系统。</translation> <translation id="853189717709780425">您目前是以托管帐户登录,该帐户的管理员将能够控制您的 Google Chrome 个人资料。您的 Chrome 数据(例如您的应用、书签、历史记录、密码和其他设置)将永久绑定到 <ph name="USER_NAME" />。您可以通过 Google 帐户信息中心删除这些数据,但无法将这些数据关联到其他帐户。</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_zh-TW.xtb b/chrome/app/resources/google_chrome_strings_zh-TW.xtb index e47ac87..364dced 100644 --- a/chrome/app/resources/google_chrome_strings_zh-TW.xtb +++ b/chrome/app/resources/google_chrome_strings_zh-TW.xtb
@@ -133,6 +133,7 @@ <translation id="4771048833395599659">這個檔案可能不安全,因此遭到 Chrome 封鎖。</translation> <translation id="4794050651896644714">在 Chrome 中儲存詳細資料</translation> <translation id="4891791193823137474">讓 Google Chrome 在背景執行</translation> +<translation id="4901390485477164536">太好了!Google Chrome 現已成為你的預設瀏覽器。</translation> <translation id="4921569541910214635">如果您與他人共用電腦,現在可以依自己的喜好和習慣設定 Chrome。</translation> <translation id="4925019873400497719">Chrome 已驗證這個網站的憑證核發者是 <ph name="ISSUER" />。該伺服器提供了 Certificate Transparency 資訊,但該資訊無效。</translation> <translation id="4953650215774548573">將 Google Chrome 設為預設瀏覽器</translation> @@ -257,6 +258,7 @@ <translation id="8290100596633877290">真糟糕!Google Chrome 當掉了,要立即重新啟動嗎?</translation> <translation id="8342675569599923794">這個檔案並不安全,因此遭到 Chrome 封鎖。</translation> <translation id="8406086379114794905">協助改善 Chrome 的服務品質</translation> +<translation id="8410645163819739900">Google Chrome 作業系統無法開啟這個網頁。</translation> <translation id="8455999171311319804">選擇性:自動將診斷資料和使用情況資料傳送給 Google,協助我們讓 Chrome 作業系統更臻完善。</translation> <translation id="853189717709780425">您已登入管理化環境下的帳戶,並將管理控制權授予您的 Chrome 設定檔。您的 Chrome 資料 (例如應用程式、書籤、紀錄、密碼和其他設定) 均將永久與 <ph name="USER_NAME" /> 建立關聯。您可以透過 Google 帳戶資訊主頁刪除這些資料,但您無法將這些資料與其他帳戶建立關聯。</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/theme/theme_resources.grd b/chrome/app/theme/theme_resources.grd index 2cafc15..5cf7999 100644 --- a/chrome/app/theme/theme_resources.grd +++ b/chrome/app/theme/theme_resources.grd
@@ -347,8 +347,6 @@ <structure type="chrome_scaled_image" name="IDR_OMNIBOX_EV_BUBBLE_TOP_LEFT" file="common/omnibox_ev_bubble_top_left.png" /> <structure type="chrome_scaled_image" name="IDR_OMNIBOX_EV_BUBBLE_TOP_RIGHT" file="common/omnibox_ev_bubble_top_right.png" /> </if> - <structure type="chrome_scaled_image" name="IDR_OMNIBOX_EXTENSION_APP_SELECTED" file="common/omnibox_extension_app_selected.png" /> - <structure type="chrome_scaled_image" name="IDR_OMNIBOX_HTTP_SELECTED" file="common/omnibox_http_selected.png" /> <if expr="is_macosx or is_ios"> <structure type="chrome_scaled_image" name="IDR_OMNIBOX_KEYWORD_HINT_TAB" file="mac/omnibox_keyword_hint_tab.png" /> </if> @@ -373,10 +371,6 @@ <structure type="chrome_scaled_image" name="IDR_OMNIBOX_SELECTED_KEYWORD_BUBBLE_TOP" file="common/omnibox_selected_keyword_bubble_top.png" /> <structure type="chrome_scaled_image" name="IDR_OMNIBOX_SELECTED_KEYWORD_BUBBLE_TOP_LEFT" file="common/omnibox_selected_keyword_bubble_top_left.png" /> <structure type="chrome_scaled_image" name="IDR_OMNIBOX_SELECTED_KEYWORD_BUBBLE_TOP_RIGHT" file="common/omnibox_selected_keyword_bubble_top_right.png" /> - <structure type="chrome_scaled_image" name="IDR_OMNIBOX_STAR" file="common/omnibox_star.png" /> - <structure type="chrome_scaled_image" name="IDR_OMNIBOX_STAR_SELECTED" file="common/omnibox_star_selected.png" /> - <structure type="chrome_scaled_image" name="IDR_OMNIBOX_TTS" file="common/omnibox_tts.png" /> - <structure type="chrome_scaled_image" name="IDR_OMNIBOX_TTS_SELECTED" file="common/omnibox_tts_selected.png" /> <if expr="toolkit_views and not is_macosx"> <!-- This image is not used in Material Design and can be removed when that mode is default. --> <if expr="not use_ash">
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn index e22b2d26..3b4d968 100644 --- a/chrome/browser/BUILD.gn +++ b/chrome/browser/BUILD.gn
@@ -841,12 +841,12 @@ "predictors/resource_prefetcher_manager.h", "prefs/browser_prefs.cc", "prefs/browser_prefs.h", + "prefs/chrome_command_line_pref_store.cc", + "prefs/chrome_command_line_pref_store.h", "prefs/chrome_pref_model_associator_client.cc", "prefs/chrome_pref_model_associator_client.h", "prefs/chrome_pref_service_factory.cc", "prefs/chrome_pref_service_factory.h", - "prefs/command_line_pref_store.cc", - "prefs/command_line_pref_store.h", "prefs/incognito_mode_prefs.cc", "prefs/incognito_mode_prefs.h", "prefs/origin_trial_prefs.cc", @@ -1355,6 +1355,7 @@ "//components/policy:generated", "//components/policy/core/browser", "//components/policy/proto", + "//components/prefs:prefs", "//components/previews/core", "//components/profile_metrics", "//components/proxy_config", @@ -1418,6 +1419,7 @@ "//crypto:platform", "//device/base", "//device/bluetooth:mojo", + "//device/power_save_blocker", "//device/usb/mojo", "//device/usb/public/interfaces", "//google_apis", @@ -1881,6 +1883,10 @@ "plugins/flash_download_interception.h", "plugins/flash_permission_context.cc", "plugins/flash_permission_context.h", + "plugins/flash_temporary_permission_tracker.cc", + "plugins/flash_temporary_permission_tracker.h", + "plugins/flash_temporary_permission_tracker_factory.cc", + "plugins/flash_temporary_permission_tracker_factory.h", "plugins/plugin_data_remover_helper.cc", "plugins/plugin_data_remover_helper.h", "plugins/plugin_finder.cc", @@ -1893,6 +1899,8 @@ "plugins/plugin_metadata.h", "plugins/plugin_observer.cc", "plugins/plugin_observer.h", + "plugins/plugin_policy_handler.cc", + "plugins/plugin_policy_handler.h", "plugins/plugin_prefs.cc", "plugins/plugin_prefs.h", "plugins/plugin_prefs_factory.cc", @@ -3338,6 +3346,7 @@ ":delta_file_proto", ":jni_headers", "//blimp/client/public", + "//blimp/client/support/resources", "//chrome/browser/android/webapk:proto", "//components/data_usage/android", "//components/precache/content",
diff --git a/chrome/browser/DEPS b/chrome/browser/DEPS index 4da1a9a..ee71baa 100644 --- a/chrome/browser/DEPS +++ b/chrome/browser/DEPS
@@ -18,6 +18,7 @@ "+device/geolocation", "+device/hid", "+device/media_transfer_protocol", + "+device/power_save_blocker", "+device/usb", "+extensions/browser", "+extensions/common",
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc index b2ee923f..e9bf8c06 100644 --- a/chrome/browser/about_flags.cc +++ b/chrome/browser/about_flags.cc
@@ -600,6 +600,19 @@ switches::kSecurityChipAnimationAll}, }; +#if defined(ENABLE_WEBRTC) +const FeatureEntry::Choice kDisableWebRtcHWEncodingChoices[] = { + {IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", ""}, + {IDS_FLAGS_WEBRTC_HW_ENCODING_ALL, switches::kDisableWebRtcHWEncoding, ""}, + {IDS_FLAGS_WEBRTC_HW_ENCODING_VPX, switches::kDisableWebRtcHWEncoding, + switches::kDisableWebRtcHWEncodingVPx}, + {IDS_FLAGS_WEBRTC_HW_ENCODING_H264, switches::kDisableWebRtcHWEncoding, + switches::kDisableWebRtcHWEncodingH264}, + {IDS_FLAGS_WEBRTC_HW_ENCODING_NONE, switches::kDisableWebRtcHWEncoding, + switches::kDisableWebRtcHWEncodingNone}, +}; +#endif + // RECORDING USER METRICS FOR FLAGS: // ----------------------------------------------------------------------------- // The first line of the entry is the internal name. @@ -656,7 +669,7 @@ SINGLE_DISABLE_VALUE_TYPE(switches::kDisableWebRtcHWDecoding)}, {"disable-webrtc-hw-encoding", IDS_FLAGS_WEBRTC_HW_ENCODING_NAME, IDS_FLAGS_WEBRTC_HW_ENCODING_DESCRIPTION, kOsAndroid | kOsCrOS, - SINGLE_DISABLE_VALUE_TYPE(switches::kDisableWebRtcHWEncoding)}, + MULTI_VALUE_TYPE(kDisableWebRtcHWEncodingChoices)}, {"enable-webrtc-stun-origin", IDS_FLAGS_WEBRTC_STUN_ORIGIN_NAME, IDS_FLAGS_WEBRTC_STUN_ORIGIN_DESCRIPTION, kOsAll, SINGLE_VALUE_TYPE(switches::kEnableWebRtcStunOrigin)},
diff --git a/chrome/browser/android/DEPS b/chrome/browser/android/DEPS index 6666c84..152f1d1 100644 --- a/chrome/browser/android/DEPS +++ b/chrome/browser/android/DEPS
@@ -1,5 +1,6 @@ include_rules = [ "+blimp/client/public", + "+blimp/client/support/resources", "-components/devtools_bridge", "+cc/layers/layer.h", "+cc/output/context_provider.h",
diff --git a/chrome/browser/android/blimp/chrome_blimp_client_context_delegate.cc b/chrome/browser/android/blimp/chrome_blimp_client_context_delegate.cc index aa5c14da4..cbf9d670 100644 --- a/chrome/browser/android/blimp/chrome_blimp_client_context_delegate.cc +++ b/chrome/browser/android/blimp/chrome_blimp_client_context_delegate.cc
@@ -10,6 +10,7 @@ #include "blimp/client/public/blimp_client_context.h" #include "blimp/client/public/blimp_client_context_delegate.h" #include "blimp/client/public/contents/blimp_contents.h" +#include "blimp/client/support/resources/blimp_strings.h" #include "chrome/browser/android/blimp/blimp_client_context_factory.h" #include "chrome/browser/android/blimp/blimp_contents_profile_attachment.h" #include "chrome/browser/profiles/profile.h" @@ -18,6 +19,7 @@ #include "components/signin/core/browser/profile_identity_provider.h" #include "components/signin/core/browser/signin_manager.h" #include "net/base/net_errors.h" +#include "ui/base/l10n/l10n_util.h" ChromeBlimpClientContextDelegate::ChromeBlimpClientContextDelegate( Profile* profile) @@ -45,8 +47,10 @@ // TODO(xingliu): All strings shown in the UI should be accessed through grd // files. https://crbug.com/630687 std::stringstream ss; - ss << "Blimp: Assignment failed, reason: " << result << "."; - ShowMessage(base::UTF8ToUTF16(ss.str()), false); + ss << "Assignment failed, reason: " << result << "."; + base::string16 message = + blimp::string::BlimpPrefix(base::UTF8ToUTF16(ss.str())); + ShowMessage(message, false); } std::unique_ptr<IdentityProvider> @@ -60,11 +64,15 @@ void ChromeBlimpClientContextDelegate::OnAuthenticationError( const GoogleServiceAuthError& error) { LOG(ERROR) << "GoogleAuth error : " << error.ToString(); - ShowMessage(base::UTF8ToUTF16("Blimp: Failed to get OAuth2 token."), false); + base::string16 message = blimp::string::BlimpPrefix( + l10n_util::GetStringUTF16(IDS_BLIMP_SIGNIN_GET_TOKEN_FAILED)); + ShowMessage(message, false); } void ChromeBlimpClientContextDelegate::OnConnected() { - ShowMessage(base::UTF8ToUTF16("Blimp: Connected."), true); + base::string16 message = blimp::string::BlimpPrefix( + l10n_util::GetStringUTF16(IDS_BLIMP_NETWORK_CONNECTED)); + ShowMessage(message, true); } void ChromeBlimpClientContextDelegate::OnEngineDisconnected(int result) { @@ -81,7 +89,7 @@ void ChromeBlimpClientContextDelegate::OnDisconnected( const base::string16& reason) { - std::stringstream ss; - ss << "Blimp: Disconnected(" << reason << ")."; - ShowMessage(base::UTF8ToUTF16(ss.str()), false); + ShowMessage(blimp::string::BlimpPrefix(l10n_util::GetStringFUTF16( + IDS_BLIMP_NETWORK_DISCONNECTED, reason)), + false); }
diff --git a/chrome/browser/android/compositor/layer/contextual_search_layer.cc b/chrome/browser/android/compositor/layer/contextual_search_layer.cc index e44efff..e97ad125 100644 --- a/chrome/browser/android/compositor/layer/contextual_search_layer.cc +++ b/chrome/browser/android/compositor/layer/contextual_search_layer.cc
@@ -70,7 +70,9 @@ float search_bar_margin_side, float search_bar_height, float search_context_opacity, + float search_text_layer_min_height, float search_term_opacity, + float search_term_caption_spacing, float search_caption_animation_percentage, bool search_caption_visible, bool search_bar_border_visible, @@ -90,11 +92,6 @@ float progress_bar_opacity, int progress_bar_completion) { - // Grabs the dynamic Search Context resource. - ui::ResourceManager::Resource* search_context_resource = - resource_manager_->GetResource(ui::ANDROID_RESOURCE_TYPE_DYNAMIC, - search_context_resource_id); - // Round values to avoid pixel gap between layers. search_bar_height = floor(search_bar_height); @@ -231,76 +228,18 @@ } // --------------------------------------------------------------------------- - // Search Context + // Search Term, Context and Search Caption // --------------------------------------------------------------------------- - if (search_context_resource) { - // Centers the text vertically in the Search Bar. - float search_bar_padding_top = - search_bar_top + - search_bar_height / 2 - - search_context_resource->size.height() / 2; - search_context_->SetUIResourceId( - search_context_resource->ui_resource->id()); - search_context_->SetBounds(search_context_resource->size); - search_context_->SetPosition(gfx::PointF(0.f, search_bar_padding_top)); - search_context_->SetOpacity(search_context_opacity); - } - - // ----------------------------------------------------------------- - // Search Caption Text - // ----------------------------------------------------------------- - // We don't want to load the resource if it won't ever be used, and since - // captions are still rare, we only load if visible. - ui::ResourceManager::Resource* search_caption_resource = nullptr; - if (search_caption_visible) { - // Grabs the dynamic Search Caption resource so we can get a snapshot. - search_caption_resource = resource_manager_->GetResource( - ui::ANDROID_RESOURCE_TYPE_DYNAMIC, search_caption_resource_id); - } - // Once a valid snapshot is available, the caller will set the animation - // percentage so the caption can actually be seen by the user. - if (search_caption_visible && search_caption_animation_percentage != 0.f - && search_caption_.get()) { - if (search_caption_->parent() != text_container_) { - AddBarTextLayer(search_caption_); - } - if (search_caption_resource) { - // Calculate position of the Caption and offset the main bar text and - // Search Context to allow for it. - // Without a caption they are not moved from their default centered - // positions. When there is a Caption interpolate their positions between - // the default and adjusted (moved up by the size of the caption and - // margin). - float bar_text_height = bar_text_->bounds().height(); - float search_caption_height = search_caption_resource->size.height(); - float text_margin = floor( - (search_bar_height - bar_text_height - search_caption_height) / 5); - float search_caption_top = - search_bar_top + bar_text_height + text_margin * 2; - // Get the current centered position set up by the OverlayPanelLayer. - float bar_text_top_centered = bar_text_->position().y(); - float bar_text_adjust = - search_caption_animation_percentage * - (search_caption_height + text_margin) / 2; - float bar_text_top = bar_text_top_centered - bar_text_adjust; - // Move the main bar text up. - bar_text_->SetPosition(gfx::PointF(0.f, bar_text_top)); - // Move the Search Context up. - if (search_context_resource) { - float search_context_top = - search_context_->position().y() - bar_text_adjust; - search_context_->SetPosition(gfx::PointF(0.f, search_context_top)); - } - // Add the caption - search_caption_->SetUIResourceId( - search_caption_resource->ui_resource->id()); - search_caption_->SetBounds(search_caption_resource->size); - search_caption_->SetPosition(gfx::PointF(0.f, search_caption_top)); - search_caption_->SetOpacity(search_caption_animation_percentage); - } - } else if (search_caption_.get() && search_caption_->parent()) { - search_caption_->RemoveFromParent(); - } + SetupTextLayer( + search_bar_top, + search_bar_height, + search_text_layer_min_height, + search_caption_resource_id, + search_caption_visible, + search_caption_animation_percentage, + search_context_resource_id, + search_context_opacity, + search_term_caption_spacing); // --------------------------------------------------------------------------- // Arrow Icon @@ -508,6 +447,133 @@ } } +void ContextualSearchLayer::SetupTextLayer( + float bar_top, + float bar_height, + float search_text_layer_min_height, + int caption_resource_id, + bool caption_visible, + float animation_percentage, + int context_resource_id, + float context_opacity, + float term_caption_spacing) { + // --------------------------------------------------------------------------- + // Setup the Drawing Hierarchy + // --------------------------------------------------------------------------- + // Search Term + if (bar_text_->parent() != text_layer_) + text_layer_->AddChild(bar_text_); + + // Search Context + ui::ResourceManager::Resource* context_resource = + resource_manager_->GetResource( + ui::ANDROID_RESOURCE_TYPE_DYNAMIC, context_resource_id); + if (context_resource) { + search_context_->SetUIResourceId(context_resource->ui_resource->id()); + search_context_->SetBounds(context_resource->size); + } + + // Search Caption + ui::ResourceManager::Resource* caption_resource = nullptr; + if (caption_visible) { + // Grabs the dynamic Search Caption resource so we can get a snapshot. + caption_resource = resource_manager_->GetResource( + ui::ANDROID_RESOURCE_TYPE_DYNAMIC, caption_resource_id); + } + + if (caption_visible && animation_percentage != 0.f) { + if (search_caption_->parent() != text_layer_) { + text_layer_->AddChild(search_caption_); + } + if (caption_resource) { + search_caption_->SetUIResourceId(caption_resource->ui_resource->id()); + search_caption_->SetBounds(caption_resource->size); + } + } else if (search_caption_->parent()) { + search_caption_->RemoveFromParent(); + } + + // --------------------------------------------------------------------------- + // Calculate Text Layer Size + // --------------------------------------------------------------------------- + // If space allows, the Term, Context and Caption should occupy a Text + // section of fixed size. + // We may not be able to fit these inside the ideal size as the user may have + // their Font Size set to large. + + // The search_caption_ may not have had it's resource set by this point, if so + // the bounds will be zero and everything will still work. + float term_height = bar_text_->bounds().height(); + float caption_height = search_caption_->bounds().height(); + + float layer_height = std::max(search_text_layer_min_height, + term_height + caption_height + term_caption_spacing); + float layer_width = std::max(bar_text_->bounds().width(), + search_caption_->bounds().width()); + + float layer_top = bar_top + (bar_height - layer_height) / 2; + text_layer_->SetBounds(gfx::Size(layer_width, layer_height)); + text_layer_->SetPosition(gfx::PointF(0.f, layer_top)); + text_layer_->SetMasksToBounds(true); + + // --------------------------------------------------------------------------- + // Layout Text Layer + // --------------------------------------------------------------------------- + // ---Top of Search Bar--- <- bar_top + // + // ---Top of Text Layer--- <- layer_top + // } remaining_height / 2 + // Term & Context } term_height + // } term_caption_spacing + // Caption } caption_height + // } remaining_height / 2 + // --Bottom of Text Layer- + // + // --Bottom of Search Bar- + // If the Caption is not visible the Term is centered in this space, when + // the Caption becomes visible it is animated sliding up into it's position + // with the spacings determined by UI. + // The Term and the Context are assumed to be the same height and will be + // positioned one on top of the other. When the Context is resolved it will + // fade out and the Term will fade in. + + search_context_->SetOpacity(context_opacity); + bar_text_->SetOpacity(1.f - context_opacity); + + // If there is no caption, just vertically center the Search Term. + float term_top = (layer_height - term_height) / 2; + + // If we aren't displaying the caption we're done. + if (!caption_visible || animation_percentage == 0.f || !caption_resource) { + bar_text_->SetPosition(gfx::PointF(0.f, term_top)); + search_context_->SetPosition(gfx::PointF(0.f, term_top)); + return; + } + + // Calculate the positions for the Term and Caption when the Caption + // animation is complete. + float remaining_height = layer_height + - term_height + - term_caption_spacing + - caption_height; + + float term_top_end = remaining_height / 2; + float caption_top_end = term_top_end + term_height + term_caption_spacing; + + // Interpolate between the animation start and end positions (short cut + // if the animation is at the end or start). + term_top = term_top * (1.f - animation_percentage) + + term_top_end * animation_percentage; + + // The Caption starts off the bottom of the Text Layer. + float caption_top = layer_height * (1.f - animation_percentage) + + caption_top_end * animation_percentage; + + bar_text_->SetPosition(gfx::PointF(0.f, term_top)); + search_context_->SetPosition(gfx::PointF(0.f, term_top)); + search_caption_->SetPosition(gfx::PointF(0.f, caption_top)); +} + void ContextualSearchLayer::SetThumbnail(const SkBitmap* thumbnail) { // Determine the scaled thumbnail width and height. If both the height and // width of |thumbnail| are larger than |thumbnail_size_|, the thumbnail will @@ -599,7 +665,8 @@ peek_promo_text_(cc::UIResourceLayer::Create()), progress_bar_(cc::NinePatchLayer::Create()), progress_bar_background_(cc::NinePatchLayer::Create()), - search_caption_(cc::UIResourceLayer::Create()) { + search_caption_(cc::UIResourceLayer::Create()), + text_layer_(cc::UIResourceLayer::Create()) { // Search Peek Promo peek_promo_container_->SetIsDrawable(true); peek_promo_container_->SetBackgroundColor(kSearchBarBackgroundColor); @@ -611,8 +678,6 @@ // Search Bar Text search_context_->SetIsDrawable(true); - // NOTE(mdjones): This can be called multiple times to add other text layers. - AddBarTextLayer(search_context_); // Search Bar Caption search_caption_->SetIsDrawable(true); @@ -640,6 +705,12 @@ // Thumbnail thumbnail_layer_->SetIsDrawable(true); + + // Content layer + text_layer_->SetIsDrawable(true); + // NOTE(mdjones): This can be called multiple times to add other text layers. + AddBarTextLayer(text_layer_); + text_layer_->AddChild(search_context_); } ContextualSearchLayer::~ContextualSearchLayer() {
diff --git a/chrome/browser/android/compositor/layer/contextual_search_layer.h b/chrome/browser/android/compositor/layer/contextual_search_layer.h index b50ad9f..c045194 100644 --- a/chrome/browser/android/compositor/layer/contextual_search_layer.h +++ b/chrome/browser/android/compositor/layer/contextual_search_layer.h
@@ -65,7 +65,9 @@ float search_bar_margin_side, float search_bar_height, float search_context_opacity, + float search_text_layer_min_height, float search_term_opacity, + float search_term_caption_spacing, float search_caption_animation_percentage, bool search_caption_visible, bool search_bar_border_visible, @@ -101,6 +103,19 @@ bool thumbnail_visible, float thumbnail_visibility_percentage); + // Sets up |text_layer_|, which contains |bar_text_|, |search_context_| and + // |search_caption_|. + void SetupTextLayer( + float search_bar_top, + float search_bar_height, + float search_text_layer_min_height, + int search_caption_resource_id, + bool search_caption_visible, + float search_caption_animation_percentage, + int search_context_resource_id, + float search_context_opacity, + float search_term_caption_spacing); + int thumbnail_size_; float thumbnail_side_margin_; float thumbnail_top_margin_; @@ -118,6 +133,7 @@ scoped_refptr<cc::NinePatchLayer> progress_bar_; scoped_refptr<cc::NinePatchLayer> progress_bar_background_; scoped_refptr<cc::UIResourceLayer> search_caption_; + scoped_refptr<cc::UIResourceLayer> text_layer_; }; } // namespace android
diff --git a/chrome/browser/android/compositor/scene_layer/contextual_search_scene_layer.cc b/chrome/browser/android/compositor/scene_layer/contextual_search_scene_layer.cc index 495a182..e01e40cf 100644 --- a/chrome/browser/android/compositor/scene_layer/contextual_search_scene_layer.cc +++ b/chrome/browser/android/compositor/scene_layer/contextual_search_scene_layer.cc
@@ -92,7 +92,9 @@ jfloat search_bar_margin_side, jfloat search_bar_height, jfloat search_context_opacity, + jfloat search_text_layer_min_height, jfloat search_term_opacity, + jfloat search_term_caption_spacing, jfloat search_caption_animation_percentage, jboolean search_caption_visible, jboolean search_bar_border_visible, @@ -178,7 +180,9 @@ search_bar_margin_side, search_bar_height, search_context_opacity, + search_text_layer_min_height, search_term_opacity, + search_term_caption_spacing, search_caption_animation_percentage, search_caption_visible, search_bar_border_visible,
diff --git a/chrome/browser/android/compositor/scene_layer/contextual_search_scene_layer.h b/chrome/browser/android/compositor/scene_layer/contextual_search_scene_layer.h index 342a9adb..1d71463 100644 --- a/chrome/browser/android/compositor/scene_layer/contextual_search_scene_layer.h +++ b/chrome/browser/android/compositor/scene_layer/contextual_search_scene_layer.h
@@ -72,7 +72,9 @@ jfloat search_bar_margin_side, jfloat search_bar_height, jfloat search_context_opacity, + jfloat search_text_layer_min_height, jfloat search_term_opacity, + jfloat search_term_caption_spacing, jfloat search_caption_animation_percentage, jboolean search_caption_visible, jboolean search_bar_border_visible,
diff --git a/chrome/browser/android/devtools_manager_delegate_android.cc b/chrome/browser/android/devtools_manager_delegate_android.cc index 561f163..705eb98 100644 --- a/chrome/browser/android/devtools_manager_delegate_android.cc +++ b/chrome/browser/android/devtools_manager_delegate_android.cc
@@ -259,7 +259,12 @@ IDR_DEVTOOLS_DISCOVERY_PAGE_HTML).as_string(); } -void DevToolsManagerDelegateAndroid::DevToolsAgentStateChanged( - DevToolsAgentHost* agent_host, bool attached) { - network_protocol_handler_->DevToolsAgentStateChanged(agent_host, attached); +void DevToolsManagerDelegateAndroid::DevToolsAgentHostAttached( + content::DevToolsAgentHost* agent_host) { + network_protocol_handler_->DevToolsAgentStateChanged(agent_host, true); +} + +void DevToolsManagerDelegateAndroid::DevToolsAgentHostDetached( + content::DevToolsAgentHost* agent_host) { + network_protocol_handler_->DevToolsAgentStateChanged(agent_host, false); }
diff --git a/chrome/browser/android/devtools_manager_delegate_android.h b/chrome/browser/android/devtools_manager_delegate_android.h index 90f4e07..8b9f817 100644 --- a/chrome/browser/android/devtools_manager_delegate_android.h +++ b/chrome/browser/android/devtools_manager_delegate_android.h
@@ -9,18 +9,20 @@ #include "base/compiler_specific.h" #include "base/macros.h" +#include "content/public/browser/devtools_agent_host_observer.h" #include "content/public/browser/devtools_manager_delegate.h" class DevToolsNetworkProtocolHandler; -class DevToolsManagerDelegateAndroid : public content::DevToolsManagerDelegate { +class DevToolsManagerDelegateAndroid : + public content::DevToolsManagerDelegate, + public content::DevToolsAgentHostObserver { public: DevToolsManagerDelegateAndroid(); ~DevToolsManagerDelegateAndroid() override; + private: // content::DevToolsManagerDelegate implementation. - void DevToolsAgentStateChanged(content::DevToolsAgentHost* agent_host, - bool attached) override; base::DictionaryValue* HandleCommand( content::DevToolsAgentHost* agent_host, base::DictionaryValue* command_dict) override; @@ -32,7 +34,12 @@ const GURL& url) override; std::string GetDiscoveryPageHTML() override; - private: + // content::DevToolsAgentHostObserver overrides. + void DevToolsAgentHostAttached( + content::DevToolsAgentHost* agent_host) override; + void DevToolsAgentHostDetached( + content::DevToolsAgentHost* agent_host) override; + std::unique_ptr<DevToolsNetworkProtocolHandler> network_protocol_handler_; DISALLOW_COPY_AND_ASSIGN(DevToolsManagerDelegateAndroid);
diff --git a/chrome/browser/android/ntp/most_visited_sites_bridge.cc b/chrome/browser/android/ntp/most_visited_sites_bridge.cc index aef8e07..dc7d732 100644 --- a/chrome/browser/android/ntp/most_visited_sites_bridge.cc +++ b/chrome/browser/android/ntp/most_visited_sites_bridge.cc
@@ -25,6 +25,7 @@ #include "chrome/browser/supervised_user/supervised_user_url_filter.h" #include "chrome/browser/thumbnails/thumbnail_list_source.h" #include "components/history/core/browser/top_sites.h" +#include "components/ntp_tiles/metrics.h" #include "components/ntp_tiles/popular_sites.h" #include "components/safe_json/safe_json_parser.h" #include "content/public/browser/browser_thread.h" @@ -41,6 +42,7 @@ using base::android::ToJavaArrayOfStrings; using base::android::ToJavaIntArray; using content::BrowserThread; +using ntp_tiles::metrics::MostVisitedTileType; using ntp_tiles::MostVisitedSites; using ntp_tiles::MostVisitedSitesSupervisor; using ntp_tiles::NTPTileSource; @@ -209,10 +211,9 @@ const JavaParamRef<jintArray>& jsources) { std::vector<int> int_tile_types; base::android::JavaIntArrayToIntVector(env, jtile_types, &int_tile_types); - std::vector<MostVisitedSites::MostVisitedTileType> tile_types; + std::vector<MostVisitedTileType> tile_types; for (int source : int_tile_types) { - tile_types.push_back( - static_cast<MostVisitedSites::MostVisitedTileType>(source)); + tile_types.push_back(static_cast<MostVisitedTileType>(source)); } std::vector<int> int_sources; @@ -222,7 +223,7 @@ sources.push_back(static_cast<NTPTileSource>(source)); } - most_visited_.RecordTileTypeMetrics(tile_types, sources); + ntp_tiles::metrics::RecordImpressionTileTypes(tile_types, sources); } void MostVisitedSitesBridge::RecordOpenedMostVisitedItem( @@ -231,9 +232,9 @@ jint index, jint tile_type, jint source) { - most_visited_.RecordOpenedMostVisitedItem( - index, static_cast<MostVisitedSites::MostVisitedTileType>(tile_type), - static_cast<NTPTileSource>(source)); + ntp_tiles::metrics::RecordClick(index, + static_cast<MostVisitedTileType>(tile_type), + static_cast<NTPTileSource>(source)); } // static
diff --git a/chrome/browser/android/webapk/webapk_installer.cc b/chrome/browser/android/webapk/webapk_installer.cc index 82c0c47..af35755 100644 --- a/chrome/browser/android/webapk/webapk_installer.cc +++ b/chrome/browser/android/webapk/webapk_installer.cc
@@ -36,10 +36,7 @@ // The default WebAPK server URL. const char kDefaultWebApkServerUrl[] = - "https://webapk.googleapis.com/v1alpha/webApks/"; - -// The response format type expected from the WebAPK server. -const char kDefaultWebApkServerUrlResponseType[] = "?alt=proto"; + "https://webapk.googleapis.com/v1alpha/webApks/?alt=proto"; // The MIME type of the POST data sent to the server. const char kProtoMimeType[] = "application/x-protobuf"; @@ -125,13 +122,6 @@ base::SequencedWorkerPool::SKIP_ON_SHUTDOWN); } -GURL GetServerUrlForUpdate(const GURL& server_url, - const std::string& webapk_package) { - // crbug.com/636552. Simplify the server URL. - return GURL(server_url.spec() + webapk_package + "/" + - kDefaultWebApkServerUrlResponseType); -} - // Creates a directory depending on the type of the task, and set permissions. // It also creates any parent directory along the path if doesn't exist, // and sets permissions as well. @@ -353,8 +343,7 @@ void WebApkInstaller::SendCreateWebApkRequest( std::unique_ptr<webapk::WebApk> webapk) { - GURL server_url(server_url_.spec() + kDefaultWebApkServerUrlResponseType); - SendRequest(std::move(webapk), net::URLFetcher::POST, server_url); + SendRequest(std::move(webapk), net::URLFetcher::POST, server_url_); } void WebApkInstaller::SendUpdateWebApkRequest( @@ -362,8 +351,7 @@ webapk->set_package_name(webapk_package_); webapk->set_version(std::to_string(webapk_version_)); - SendRequest(std::move(webapk), net::URLFetcher::PUT, - GetServerUrlForUpdate(server_url_, webapk_package_)); + SendRequest(std::move(webapk), net::URLFetcher::PUT, server_url_); } void WebApkInstaller::SendRequest(std::unique_ptr<webapk::WebApk> request_proto,
diff --git a/chrome/browser/android/webapk/webapk_installer_unittest.cc b/chrome/browser/android/webapk/webapk_installer_unittest.cc index 646d2fb..d084243 100644 --- a/chrome/browser/android/webapk/webapk_installer_unittest.cc +++ b/chrome/browser/android/webapk/webapk_installer_unittest.cc
@@ -43,9 +43,6 @@ // that the file is not an image. const char* kIconUrl = "/simple.html"; -// The response format type expected from the WebAPK server. -const char* kWebApkServerUrlResponseType = "?alt=proto"; - // URL of file to download from the WebAPK server. We use a random file in the // test data directory. const char* kDownloadUrl = "/simple.html"; @@ -236,25 +233,11 @@ std::unique_ptr<net::test_server::HttpResponse> HandleWebApkRequest( const net::test_server::HttpRequest& request) { - return (request.relative_url == GetServerUrlForCreateWebApk() || - request.relative_url == GetServerUrlForUpdateWebApk()) + return (request.relative_url == kServerUrl) ? webapk_response_builder_.Run() : std::unique_ptr<net::test_server::HttpResponse>(); } - std::string GetServerUrlForCreateWebApk() const { - std::string url(kServerUrl); - return url.append(kWebApkServerUrlResponseType); - } - - std::string GetServerUrlForUpdateWebApk() const { - std::string url(kServerUrl); - url.append(kDownloadedWebApkPackageName); - url.append("/"); - url.append(kWebApkServerUrlResponseType); - return url; - } - content::TestBrowserThreadBundle thread_bundle_; net::EmbeddedTestServer test_server_;
diff --git a/chrome/browser/autofill/android/personal_data_manager_android.cc b/chrome/browser/autofill/android/personal_data_manager_android.cc index ad2750d..f71b114 100644 --- a/chrome/browser/autofill/android/personal_data_manager_android.cc +++ b/chrome/browser/autofill/android/personal_data_manager_android.cc
@@ -392,8 +392,8 @@ PersonalDataManagerAndroid::GetProfileLabelsToSuggest( JNIEnv* env, const JavaParamRef<jobject>& unused_obj, - jboolean include_name) { - return GetProfileLabels(env, true, include_name, + jboolean include_name_in_label) { + return GetProfileLabels(env, true, include_name_in_label, personal_data_manager_->GetProfilesToSuggest()); } @@ -752,13 +752,13 @@ ScopedJavaLocalRef<jobjectArray> PersonalDataManagerAndroid::GetProfileLabels( JNIEnv* env, bool address_only, - bool include_name, + bool include_name_in_label, std::vector<AutofillProfile*> profiles) { std::unique_ptr<std::vector<ServerFieldType>> suggested_fields; size_t minimal_fields_shown = 2; if (address_only) { suggested_fields.reset(new std::vector<ServerFieldType>); - if (include_name) + if (include_name_in_label) suggested_fields->push_back(NAME_FULL); suggested_fields->push_back(COMPANY_NAME); suggested_fields->push_back(ADDRESS_HOME_LINE1); @@ -772,7 +772,8 @@ minimal_fields_shown = suggested_fields->size(); } - ServerFieldType excluded_field = include_name ? UNKNOWN_TYPE : NAME_FULL; + ServerFieldType excluded_field = + include_name_in_label ? UNKNOWN_TYPE : NAME_FULL; std::vector<base::string16> labels; AutofillProfile::CreateInferredLabels(
diff --git a/chrome/browser/autofill/android/personal_data_manager_android.h b/chrome/browser/autofill/android/personal_data_manager_android.h index c6d15c79f..66e7b8c2 100644 --- a/chrome/browser/autofill/android/personal_data_manager_android.h +++ b/chrome/browser/autofill/android/personal_data_manager_android.h
@@ -79,12 +79,12 @@ // useful for distinguishing the profiles from one another. // // The labels never contain the email address, or phone numbers. The - // |include_name| argument controls whether the name is included. All other - // fields are included in the label. + // |include_name_in_label| argument controls whether the name is included. + // All other fields are included in the label. base::android::ScopedJavaLocalRef<jobjectArray> GetProfileLabelsToSuggest( JNIEnv* env, const base::android::JavaParamRef<jobject>& unused_obj, - jboolean include_name); + jboolean include_name_in_label); // Returns the label of the given profile for PaymentRequest. This label does // not contain the full name or the email address. All other fields are @@ -328,7 +328,7 @@ base::android::ScopedJavaLocalRef<jobjectArray> GetProfileLabels( JNIEnv* env, bool address_only, - bool include_name, + bool include_name_in_label, std::vector<AutofillProfile*> profiles); // Pointer to the java counterpart.
diff --git a/chrome/browser/browser_resources.grd b/chrome/browser/browser_resources.grd index fad4f7c4..da861da 100644 --- a/chrome/browser/browser_resources.grd +++ b/chrome/browser/browser_resources.grd
@@ -163,6 +163,8 @@ <include name="IDR_MD_EXTENSIONS_DETAIL_VIEW_JS" file="resources\md_extensions\detail_view.js" type="BINDATA" /> <include name="IDR_MD_EXTENSIONS_DROP_OVERLAY_HTML" file="resources\md_extensions\drop_overlay.html" type="BINDATA" /> <include name="IDR_MD_EXTENSIONS_DROP_OVERLAY_JS" file="resources\md_extensions\drop_overlay.js" type="BINDATA" /> + <include name="IDR_MD_EXTENSIONS_ERROR_PAGE_HTML" file="resources\md_extensions\error_page.html" flattenhtml="true" type="BINDATA" /> + <include name="IDR_MD_EXTENSIONS_ERROR_PAGE_JS" file="resources\md_extensions\error_page.js" type="BINDATA" /> <include name="IDR_MD_EXTENSIONS_KEYBOARD_SHORTCUTS_HTML" file="resources\md_extensions\keyboard_shortcuts.html" type="BINDATA" /> <include name="IDR_MD_EXTENSIONS_KEYBOARD_SHORTCUTS_JS" file="resources\md_extensions\keyboard_shortcuts.js" type="BINDATA" /> <include name="IDR_MD_EXTENSIONS_MANAGER_HTML" file="resources\md_extensions\manager.html" type="BINDATA" /> @@ -215,7 +217,7 @@ <include name="IDR_SUPERVISED_USER_INTERNALS_HTML" file="resources\supervised_user_internals.html" allowexternalscript="true" compress="gzip" type="BINDATA" /> <include name="IDR_SUPERVISED_USER_INTERNALS_CSS" file="resources\supervised_user_internals.css" compress="gzip" type="BINDATA" /> <include name="IDR_SUPERVISED_USER_INTERNALS_JS" file="resources\supervised_user_internals.js" compress="gzip" type="BINDATA" /> - <if expr="_google_chrome or enable_hangout_services_extension"> + <if expr="enable_hangout_services_extension"> <!-- Hangout Services extension, included in Google Chrome builds only. --> <include name="IDR_HANGOUT_SERVICES_MANIFEST" file="resources\hangout_services\manifest.json" type="BINDATA" /> </if>
diff --git a/chrome/browser/chrome_browser_main.cc b/chrome/browser/chrome_browser_main.cc index 30cd670..19814e2 100644 --- a/chrome/browser/chrome_browser_main.cc +++ b/chrome/browser/chrome_browser_main.cc
@@ -81,8 +81,8 @@ #include "chrome/browser/performance_monitor/performance_monitor.h" #include "chrome/browser/plugins/plugin_prefs.h" #include "chrome/browser/power/process_power_collector.h" +#include "chrome/browser/prefs/chrome_command_line_pref_store.h" #include "chrome/browser/prefs/chrome_pref_service_factory.h" -#include "chrome/browser/prefs/command_line_pref_store.h" #include "chrome/browser/prefs/incognito_mode_prefs.h" #include "chrome/browser/prefs/pref_metrics_service.h" #include "chrome/browser/printing/cloud_print/cloud_print_proxy_service.h" @@ -1190,7 +1190,7 @@ #endif // OS_WIN local_state_->UpdateCommandLinePrefStore( - new CommandLinePrefStore(base::CommandLine::ForCurrentProcess())); + new ChromeCommandLinePrefStore(base::CommandLine::ForCurrentProcess())); // Reset the command line in the crash report details, since we may have // just changed it to include experiments.
diff --git a/chrome/browser/chromeos/arc/arc_auth_service_browsertest.cc b/chrome/browser/chromeos/arc/arc_auth_service_browsertest.cc index ad3228e..b8a19fc 100644 --- a/chrome/browser/chromeos/arc/arc_auth_service_browsertest.cc +++ b/chrome/browser/chromeos/arc/arc_auth_service_browsertest.cc
@@ -31,7 +31,7 @@ #include "chromeos/dbus/session_manager_client.h" #include "components/arc/arc_bridge_service_impl.h" #include "components/arc/arc_service_manager.h" -#include "components/arc/test/fake_arc_bridge_bootstrap.h" +#include "components/arc/test/fake_arc_session.h" #include "components/policy/core/common/policy_switches.h" #include "components/prefs/pref_member.h" #include "components/prefs/pref_service.h" @@ -140,8 +140,7 @@ // Mock out ARC bridge. auto service = base::MakeUnique<ArcBridgeServiceImpl>(); - service->SetArcBridgeBootstrapFactoryForTesting( - base::Bind(FakeArcBridgeBootstrap::Create)); + service->SetArcSessionFactoryForTesting(base::Bind(FakeArcSession::Create)); ArcServiceManager::SetArcBridgeServiceForTesting(std::move(service)); }
diff --git a/chrome/browser/chromeos/arc/arc_support_host.cc b/chrome/browser/chromeos/arc/arc_support_host.cc index 5dbbfb89..7867122 100644 --- a/chrome/browser/chromeos/arc/arc_support_host.cc +++ b/chrome/browser/chromeos/arc/arc_support_host.cc
@@ -31,15 +31,10 @@ namespace { constexpr char kAction[] = "action"; constexpr char kArcManaged[] = "arcManaged"; -constexpr char kCanEnable[] = "canEnable"; constexpr char kData[] = "data"; constexpr char kDeviceId[] = "deviceId"; -constexpr char kEnabled[] = "enabled"; -constexpr char kManaged[] = "managed"; -constexpr char kOn[] = "on"; constexpr char kPage[] = "page"; constexpr char kStatus[] = "status"; -constexpr char kText[] = "text"; constexpr char kActionInitialize[] = "initialize"; constexpr char kActionSetMetricsMode[] = "setMetricsMode"; constexpr char kActionBackupAndRestoreMode[] = "setBackupAndRestoreMode"; @@ -48,6 +43,10 @@ constexpr char kActionCloseWindow[] = "closeWindow"; constexpr char kActionShowPage[] = "showPage"; +// The preference update should have those two fields. +constexpr char kEnabled[] = "enabled"; +constexpr char kManaged[] = "managed"; + // The JSON data sent from the extension should have at least "event" field. // Each event data is defined below. // The key of the event type. @@ -201,6 +200,18 @@ "termsOfService", l10n_util::GetStringUTF16(IDS_ARC_OPT_IN_DIALOG_TERMS_OF_SERVICE)); loadtime_data->SetString( + "textMetricsEnabled", + l10n_util::GetStringUTF16(IDS_ARC_OPT_IN_DIALOG_METRICS_ENABLED)); + loadtime_data->SetString( + "textMetricsDisabled", + l10n_util::GetStringUTF16(IDS_ARC_OPT_IN_DIALOG_METRICS_DISABLED)); + loadtime_data->SetString( + "textMetricsManagedEnabled", + l10n_util::GetStringUTF16(IDS_ARC_OPT_IN_DIALOG_METRICS_MANAGED_ENABLED)); + loadtime_data->SetString("textMetricsManagedDisabled", + l10n_util::GetStringUTF16( + IDS_ARC_OPT_IN_DIALOG_METRICS_MANAGED_DISABLED)); + loadtime_data->SetString( "textBackupRestore", l10n_util::GetStringUTF16(IDS_ARC_OPT_IN_DIALOG_BACKUP_RESTORE)); loadtime_data->SetString( @@ -235,6 +246,9 @@ const std::string device_id = user_manager::known_user::GetDeviceId( multi_user_util::GetAccountIdFromProfile(arc_auth_service->profile())); DCHECK(!device_id.empty()); + loadtime_data->SetBoolean( + "isOwnerProfile", + chromeos::ProfileHelper::IsOwnerProfile(arc_auth_service->profile())); base::DictionaryValue request; std::string request_string; @@ -273,52 +287,10 @@ } void ArcSupportHost::SendMetricsMode() { - arc::ArcAuthService* arc_auth_service = arc::ArcAuthService::Get(); - DCHECK(arc_auth_service && arc_auth_service->IsAllowed()); - const Profile* profile = arc_auth_service->profile(); - - const bool metrics_managed = IsMetricsReportingPolicyManaged(); - const bool owner_profile = - profile && chromeos::ProfileHelper::IsOwnerProfile(profile); - const bool metrics_on = - ChromeMetricsServiceAccessor::IsMetricsAndCrashReportingEnabled(); - - int message_id; - if (metrics_managed || !owner_profile) { - message_id = metrics_on ? IDS_ARC_OPT_IN_DIALOG_METRICS_MANAGED_ENABLED - : IDS_ARC_OPT_IN_DIALOG_METRICS_MANAGED_DISABLED; - } else { - message_id = metrics_on ? IDS_ARC_OPT_IN_DIALOG_METRICS_ENABLED - : IDS_ARC_OPT_IN_DIALOG_METRICS_DISABLED; - } - - base::DictionaryValue request; - std::string request_string; - request.SetString(kAction, kActionSetMetricsMode); - request.SetString(kText, l10n_util::GetStringUTF16(message_id)); - request.SetBoolean(kCanEnable, - !metrics_on && !metrics_managed && owner_profile); - request.SetBoolean(kOn, metrics_on); - base::JSONWriter::Write(request, &request_string); - client_->PostMessageFromNativeHost(request_string); -} - -void ArcSupportHost::SendOptionMode(const std::string& action_name, - const std::string& pref_name) { - const arc::ArcAuthService* arc_auth_service = arc::ArcAuthService::Get(); - DCHECK(arc_auth_service); - const bool enabled = - arc_auth_service->profile()->GetPrefs()->GetBoolean(pref_name); - const bool managed = - arc_auth_service->profile()->GetPrefs()->IsManagedPreference(pref_name); - - base::DictionaryValue request; - std::string request_string; - request.SetString(kAction, action_name); - request.SetBoolean(kEnabled, enabled); - request.SetBoolean(kManaged, managed); - base::JSONWriter::Write(request, &request_string); - client_->PostMessageFromNativeHost(request_string); + SendPreferenceUpdate( + kActionSetMetricsMode, + ChromeMetricsServiceAccessor::IsMetricsAndCrashReportingEnabled(), + IsMetricsReportingPolicyManaged()); } void ArcSupportHost::SendBackupAndRestoreMode() { @@ -329,6 +301,28 @@ SendOptionMode(kActionLocationServiceMode, prefs::kArcLocationServiceEnabled); } +void ArcSupportHost::SendOptionMode(const std::string& action_name, + const std::string& pref_name) { + const arc::ArcAuthService* arc_auth_service = arc::ArcAuthService::Get(); + DCHECK(arc_auth_service); + SendPreferenceUpdate( + action_name, + arc_auth_service->profile()->GetPrefs()->GetBoolean(pref_name), + arc_auth_service->profile()->GetPrefs()->IsManagedPreference(pref_name)); +} + +void ArcSupportHost::SendPreferenceUpdate(const std::string& action_name, + bool is_enabled, + bool is_managed) { + base::DictionaryValue request; + std::string request_string; + request.SetString(kAction, action_name); + request.SetBoolean(kEnabled, is_enabled); + request.SetBoolean(kManaged, is_managed); + base::JSONWriter::Write(request, &request_string); + client_->PostMessageFromNativeHost(request_string); +} + void ArcSupportHost::OnOptInUIClose() { Close(); }
diff --git a/chrome/browser/chromeos/arc/arc_support_host.h b/chrome/browser/chromeos/arc/arc_support_host.h index acd6bdaa..114caa9 100644 --- a/chrome/browser/chromeos/arc/arc_support_host.h +++ b/chrome/browser/chromeos/arc/arc_support_host.h
@@ -52,11 +52,25 @@ void OnMetricsPreferenceChanged(); void OnBackupAndRestorePreferenceChanged(); void OnLocationServicePreferenceChanged(); + + // Utilities on preference update. void SendMetricsMode(); void SendBackupAndRestoreMode(); void SendLocationServicesMode(); void SendOptionMode(const std::string& action_name, const std::string& pref_name); + + // Sends a preference update to the extension. + // The message will be + // { + // 'action': action_name, + // 'enabled': is_enabled, + // 'managed': is_managed + // } + void SendPreferenceUpdate(const std::string& action_name, + bool is_enabled, + bool is_managed); + void EnableMetrics(bool is_enabled); void EnableBackupRestore(bool is_enabled); void EnableLocationService(bool is_enabled);
diff --git a/chrome/browser/chromeos/chrome_browser_main_chromeos.cc b/chrome/browser/chromeos/chrome_browser_main_chromeos.cc index 9ca3889f..6fd01a4 100644 --- a/chrome/browser/chromeos/chrome_browser_main_chromeos.cc +++ b/chrome/browser/chromeos/chrome_browser_main_chromeos.cc
@@ -683,8 +683,10 @@ // available. idle_action_warning_observer_.reset(new IdleActionWarningObserver()); - // Start watching for low disk space events to notify the user. - low_disk_notification_.reset(new LowDiskNotification()); + // Start watching for low disk space events to notify the user if it is not a + // guest profile. + if (!user_manager::UserManager::Get()->IsLoggedInAsGuest()) + low_disk_notification_.reset(new LowDiskNotification()); // Authenticate the user for PIN quick unlock. PinStorage* pin_storage = PinStorageFactory::GetForProfile(profile());
diff --git a/chrome/browser/chromeos/extensions/device_local_account_management_policy_provider.cc b/chrome/browser/chromeos/extensions/device_local_account_management_policy_provider.cc index d35ec8a..dc4703ef 100644 --- a/chrome/browser/chromeos/extensions/device_local_account_management_policy_provider.cc +++ b/chrome/browser/chromeos/extensions/device_local_account_management_policy_provider.cc
@@ -17,6 +17,7 @@ #include "extensions/common/extension.h" #include "extensions/common/manifest.h" #include "extensions/common/manifest_constants.h" +#include "extensions/common/manifest_handlers/app_isolation_info.h" #include "ui/base/l10n/l10n_util.h" namespace chromeos { @@ -790,14 +791,22 @@ if (ArrayContains(kSafePermissionStrings, permission_string)) { continue; } - // Allow arbitrary web requests. Don't include <all_urls> because that - // also matches file:// schemes. + // Web requests (origin permissions). Don't include <all_urls> because + // that also matches file:// schemes. if (base::StartsWith(permission_string, "https://", base::CompareCase::SENSITIVE) || base::StartsWith(permission_string, "http://", base::CompareCase::SENSITIVE) || base::StartsWith(permission_string, "ftp://", base::CompareCase::SENSITIVE)) { + // Allow origin permissions if the extension is isolated from the main + // browser session (so it can't access user cookies, etc.). + if (!extensions::AppIsolationInfo::HasIsolatedStorage(extension)) { + LOG(ERROR) << extension->id() << " does not have isolated storage " + "and it requested origin permission: " + << permission_string; + safe = false; + } continue; } LOG(ERROR) << extension->id()
diff --git a/chrome/browser/chromeos/extensions/device_local_account_management_policy_provider_unittest.cc b/chrome/browser/chromeos/extensions/device_local_account_management_policy_provider_unittest.cc index 9e976aed..897a08a 100644 --- a/chrome/browser/chromeos/extensions/device_local_account_management_policy_provider_unittest.cc +++ b/chrome/browser/chromeos/extensions/device_local_account_management_policy_provider_unittest.cc
@@ -415,6 +415,27 @@ error.clear(); } + // Verify that an extension with remote URL permissions cannot be installed. + { + base::ListValue* const permissions = new base::ListValue(); + permissions->AppendString("https://example.com/"); + permissions->AppendString("http://example.com/"); + permissions->AppendString("ftp://example.com/"); + base::DictionaryValue values; + values.Set(extensions::manifest_keys::kPermissions, permissions); + + extension = CreateExtensionFromValues( + std::string(), + extensions::Manifest::EXTERNAL_POLICY, + &values, + extensions::Extension::NO_FLAGS); + ASSERT_TRUE(extension); + + EXPECT_FALSE(provider.UserMayLoad(extension.get(), &error)); + EXPECT_NE(base::string16(), error); + error.clear(); + } + // Verify that a platform app with a local URL permission cannot be installed. { base::ListValue* const permissions = new base::ListValue();
diff --git a/chrome/browser/chromeos/file_manager/path_util_unittest.cc b/chrome/browser/chromeos/file_manager/path_util_unittest.cc index 0e00841..f7ad121 100644 --- a/chrome/browser/chromeos/file_manager/path_util_unittest.cc +++ b/chrome/browser/chromeos/file_manager/path_util_unittest.cc
@@ -5,8 +5,14 @@ #include "chrome/browser/chromeos/file_manager/path_util.h" #include "base/files/file_path.h" +#include "chrome/browser/chromeos/login/users/fake_chrome_user_manager.h" +#include "chrome/browser/chromeos/login/users/scoped_user_manager_enabler.h" +#include "chrome/browser/chromeos/profiles/profile_helper.h" #include "chrome/browser/download/download_prefs.h" +#include "chrome/test/base/testing_browser_process.h" #include "chrome/test/base/testing_profile.h" +#include "chrome/test/base/testing_profile_manager.h" +#include "components/signin/core/account_id/account_id.h" #include "content/public/test/test_browser_thread_bundle.h" #include "testing/gtest/include/gtest/gtest.h" @@ -48,6 +54,54 @@ &path)); } +TEST(FileManagerPathUtilTest, ConvertPathToArcUrl) { + content::TestBrowserThreadBundle thread_bundle; + + // Test SetUp -- add two user-profile pairs and their fake managers. + TestingProfileManager testing_profile_manager( + TestingBrowserProcess::GetGlobal()); + ASSERT_TRUE(testing_profile_manager.SetUp()); + + chromeos::FakeChromeUserManager* const fake_user_manager = + new chromeos::FakeChromeUserManager; + chromeos::ScopedUserManagerEnabler user_manager_enabler(fake_user_manager); + + const AccountId account_id( + AccountId::FromUserEmailGaiaId("user@gmail.com", "1111111111")); + const AccountId account_id_2( + AccountId::FromUserEmailGaiaId("user2@gmail.com", "2222222222")); + fake_user_manager->AddUser(account_id); + fake_user_manager->LoginUser(account_id); + fake_user_manager->AddUser(account_id_2); + fake_user_manager->LoginUser(account_id_2); + ASSERT_TRUE(testing_profile_manager.CreateTestingProfile("user@gmail.com")); + ASSERT_TRUE(testing_profile_manager.CreateTestingProfile("user2@gmail.com")); + + GURL url; + + // Conversion of paths for removable storages. + EXPECT_TRUE(ConvertPathToArcUrl( + base::FilePath::FromUTF8Unsafe("/media/removable/a/b/c"), &url)); + EXPECT_EQ(GURL("content://org.chromium.arc.removablemediaprovider/a/b/c"), + url); + + EXPECT_FALSE(ConvertPathToArcUrl( + base::FilePath::FromUTF8Unsafe("/media/removable_foobar"), &url)); + + // Conversion of paths under the primary profile's downloads folder. + const base::FilePath downloads = GetDownloadsFolderForProfile( + chromeos::ProfileHelper::Get()->GetProfileByUserIdHash( + "user@gmail.com-hash")); + EXPECT_TRUE(ConvertPathToArcUrl(downloads.AppendASCII("a/b/c"), &url)); + EXPECT_EQ(GURL("file:///sdcard/Download/a/b/c"), url); + + // Non-primary profile's downloads folder is not supported for ARC yet. + const base::FilePath downloads2 = GetDownloadsFolderForProfile( + chromeos::ProfileHelper::Get()->GetProfileByUserIdHash( + "user2@gmail.com-hash")); + EXPECT_FALSE(ConvertPathToArcUrl(downloads2.AppendASCII("a/b/c"), &url)); +} + } // namespace } // namespace util } // namespace file_manager
diff --git a/chrome/browser/chromeos/login/session/kiosk_auto_launcher_session_manager_delegate.cc b/chrome/browser/chromeos/login/session/kiosk_auto_launcher_session_manager_delegate.cc index e9e4a68..6c6bf8d 100644 --- a/chrome/browser/chromeos/login/session/kiosk_auto_launcher_session_manager_delegate.cc +++ b/chrome/browser/chromeos/login/session/kiosk_auto_launcher_session_manager_delegate.cc
@@ -23,7 +23,7 @@ void KioskAutoLauncherSessionManagerDelegate::Start() { // Kiosk app launcher starts with login state. session_manager_->SetSessionState( - session_manager::SESSION_STATE_LOGIN_PRIMARY); + session_manager::SessionState::LOGIN_PRIMARY); ShowLoginWizard(chromeos::WizardController::kAppLaunchSplashScreenName);
diff --git a/chrome/browser/chromeos/login/session/restore_after_crash_session_manager_delegate.cc b/chrome/browser/chromeos/login/session/restore_after_crash_session_manager_delegate.cc index a3ae19f2..12dc85a5 100644 --- a/chrome/browser/chromeos/login/session/restore_after_crash_session_manager_delegate.cc +++ b/chrome/browser/chromeos/login/session/restore_after_crash_session_manager_delegate.cc
@@ -35,7 +35,7 @@ void RestoreAfterCrashSessionManagerDelegate::Start() { base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); - session_manager_->SetSessionState(session_manager::SESSION_STATE_ACTIVE); + session_manager_->SetSessionState(session_manager::SessionState::ACTIVE); // TODO(nkostylev): Identify tests that do not set this kLoginUser flag but // still rely on "stub user" session. Keeping existing behavior to avoid
diff --git a/chrome/browser/chromeos/login/session/stub_login_session_manager_delegate.cc b/chrome/browser/chromeos/login/session/stub_login_session_manager_delegate.cc index 18b17e7..ca801388 100644 --- a/chrome/browser/chromeos/login/session/stub_login_session_manager_delegate.cc +++ b/chrome/browser/chromeos/login/session/stub_login_session_manager_delegate.cc
@@ -22,7 +22,7 @@ } void StubLoginSessionManagerDelegate::Start() { - session_manager_->SetSessionState(session_manager::SESSION_STATE_ACTIVE); + session_manager_->SetSessionState(session_manager::SessionState::ACTIVE); // For dev machines and stub user emulate as if sync has been initialized. SigninManagerFactory::GetForProfile(profile())
diff --git a/chrome/browser/chromeos/login/session/user_session_manager.cc b/chrome/browser/chromeos/login/session/user_session_manager.cc index 751d50e..5c8a14df 100644 --- a/chrome/browser/chromeos/login/session/user_session_manager.cc +++ b/chrome/browser/chromeos/login/session/user_session_manager.cc
@@ -1136,7 +1136,7 @@ profile->OnLogin(); g_browser_process->platform_part()->SessionManager()->SetSessionState( - session_manager::SESSION_STATE_LOGGED_IN_NOT_ACTIVE); + session_manager::SessionState::LOGGED_IN_NOT_ACTIVE); // Send the notification before creating the browser so additional objects // that need the profile (e.g. the launcher) can be created first.
diff --git a/chrome/browser/chromeos/login/session_login_browsertest.cc b/chrome/browser/chromeos/login/session_login_browsertest.cc index 3d75aa0c..5fac8db 100644 --- a/chrome/browser/chromeos/login/session_login_browsertest.cc +++ b/chrome/browser/chromeos/login/session_login_browsertest.cc
@@ -39,16 +39,16 @@ IN_PROC_BROWSER_TEST_F(BrowserLoginTest, PRE_BrowserActive) { RegisterUser(kTestUser); - EXPECT_EQ(ash::SessionStateDelegate::SESSION_STATE_LOGIN_PRIMARY, + EXPECT_EQ(session_manager::SessionState::LOGIN_PRIMARY, ash::WmShell::Get()->GetSessionStateDelegate()->GetSessionState()); chromeos::StartupUtils::MarkOobeCompleted(); } IN_PROC_BROWSER_TEST_F(BrowserLoginTest, BrowserActive) { - EXPECT_EQ(ash::SessionStateDelegate::SESSION_STATE_LOGIN_PRIMARY, + EXPECT_EQ(session_manager::SessionState::LOGIN_PRIMARY, ash::WmShell::Get()->GetSessionStateDelegate()->GetSessionState()); LoginUser(kTestUser); - EXPECT_EQ(ash::SessionStateDelegate::SESSION_STATE_ACTIVE, + EXPECT_EQ(session_manager::SessionState::ACTIVE, ash::WmShell::Get()->GetSessionStateDelegate()->GetSessionState()); Browser* browser =
diff --git a/chrome/browser/chromeos/login/ui/login_display_host_impl.cc b/chrome/browser/chromeos/login/ui/login_display_host_impl.cc index 24e2053..d7fe65f 100644 --- a/chrome/browser/chromeos/login/ui/login_display_host_impl.cc +++ b/chrome/browser/chromeos/login/ui/login_display_host_impl.cc
@@ -1275,8 +1275,8 @@ g_browser_process->platform_part()->SessionManager()->SetSessionState( StartupUtils::IsOobeCompleted() - ? session_manager::SESSION_STATE_LOGIN_PRIMARY - : session_manager::SESSION_STATE_OOBE); + ? session_manager::SessionState::LOGIN_PRIMARY + : session_manager::SessionState::OOBE); LoginDisplayHostImpl* display_host = new LoginDisplayHostImpl(screen_bounds);
diff --git a/chrome/browser/chromeos/login/ui/user_adding_screen.cc b/chrome/browser/chromeos/login/ui/user_adding_screen.cc index 293fba11..018d19c 100644 --- a/chrome/browser/chromeos/login/ui/user_adding_screen.cc +++ b/chrome/browser/chromeos/login/ui/user_adding_screen.cc
@@ -56,7 +56,7 @@ base::Unretained(this))); g_browser_process->platform_part()->SessionManager()->SetSessionState( - session_manager::SESSION_STATE_LOGIN_SECONDARY); + session_manager::SessionState::LOGIN_SECONDARY); for (auto& observer : observers_) observer.OnUserAddingStarted(); } @@ -92,7 +92,7 @@ display_host_ = NULL; g_browser_process->platform_part()->SessionManager()->SetSessionState( - session_manager::SESSION_STATE_ACTIVE); + session_manager::SessionState::ACTIVE); for (auto& observer : observers_) observer.OnUserAddingFinished(); }
diff --git a/chrome/browser/chromeos/login/ui/user_adding_screen_browsertest.cc b/chrome/browser/chromeos/login/ui/user_adding_screen_browsertest.cc index 2dbed90..63b95c03 100644 --- a/chrome/browser/chromeos/login/ui/user_adding_screen_browsertest.cc +++ b/chrome/browser/chromeos/login/ui/user_adding_screen_browsertest.cc
@@ -111,25 +111,25 @@ IN_PROC_BROWSER_TEST_F(UserAddingScreenTest, CancelAdding) { EXPECT_EQ(3u, user_manager::UserManager::Get()->GetUsers().size()); EXPECT_EQ(0u, user_manager::UserManager::Get()->GetLoggedInUsers().size()); - EXPECT_EQ(ash::SessionStateDelegate::SESSION_STATE_LOGIN_PRIMARY, + EXPECT_EQ(session_manager::SessionState::LOGIN_PRIMARY, ash::WmShell::Get()->GetSessionStateDelegate()->GetSessionState()); LoginUser(kTestUsers[0]); EXPECT_EQ(1u, user_manager::UserManager::Get()->GetLoggedInUsers().size()); - EXPECT_EQ(ash::SessionStateDelegate::SESSION_STATE_ACTIVE, + EXPECT_EQ(session_manager::SessionState::ACTIVE, ash::WmShell::Get()->GetSessionStateDelegate()->GetSessionState()); UserAddingScreen::Get()->Start(); content::RunAllPendingInMessageLoop(); EXPECT_EQ(1, user_adding_started()); - EXPECT_EQ(ash::SessionStateDelegate::SESSION_STATE_LOGIN_SECONDARY, + EXPECT_EQ(session_manager::SessionState::LOGIN_SECONDARY, ash::WmShell::Get()->GetSessionStateDelegate()->GetSessionState()); UserAddingScreen::Get()->Cancel(); WaitUntilUserAddingFinishedOrCancelled(); content::RunAllPendingInMessageLoop(); EXPECT_EQ(1, user_adding_finished()); - EXPECT_EQ(ash::SessionStateDelegate::SESSION_STATE_ACTIVE, + EXPECT_EQ(session_manager::SessionState::ACTIVE, ash::WmShell::Get()->GetSessionStateDelegate()->GetSessionState()); EXPECT_TRUE(LoginDisplayHost::default_host() == nullptr); @@ -147,10 +147,10 @@ IN_PROC_BROWSER_TEST_F(UserAddingScreenTest, AddingSeveralUsers) { ash::WmShell* wm_shell = ash::WmShell::Get(); - EXPECT_EQ(ash::SessionStateDelegate::SESSION_STATE_LOGIN_PRIMARY, + EXPECT_EQ(session_manager::SessionState::LOGIN_PRIMARY, wm_shell->GetSessionStateDelegate()->GetSessionState()); LoginUser(kTestUsers[0]); - EXPECT_EQ(ash::SessionStateDelegate::SESSION_STATE_ACTIVE, + EXPECT_EQ(session_manager::SessionState::ACTIVE, wm_shell->GetSessionStateDelegate()->GetSessionState()); user_manager::UserManager* user_manager = user_manager::UserManager::Get(); @@ -159,19 +159,19 @@ UserAddingScreen::Get()->Start(); content::RunAllPendingInMessageLoop(); EXPECT_EQ(i, user_adding_started()); - EXPECT_EQ(ash::SessionStateDelegate::SESSION_STATE_LOGIN_SECONDARY, + EXPECT_EQ(session_manager::SessionState::LOGIN_SECONDARY, wm_shell->GetSessionStateDelegate()->GetSessionState()); AddUser(kTestUsers[i]); WaitUntilUserAddingFinishedOrCancelled(); content::RunAllPendingInMessageLoop(); EXPECT_EQ(i, user_adding_finished()); - EXPECT_EQ(ash::SessionStateDelegate::SESSION_STATE_ACTIVE, + EXPECT_EQ(session_manager::SessionState::ACTIVE, wm_shell->GetSessionStateDelegate()->GetSessionState()); EXPECT_TRUE(LoginDisplayHost::default_host() == nullptr); ASSERT_EQ(unsigned(i + 1), user_manager->GetLoggedInUsers().size()); } - EXPECT_EQ(ash::SessionStateDelegate::SESSION_STATE_ACTIVE, + EXPECT_EQ(session_manager::SessionState::ACTIVE, wm_shell->GetSessionStateDelegate()->GetSessionState()); // Now check how unlock policy works for these users.
diff --git a/chrome/browser/chromeos/options/network_config_view.cc b/chrome/browser/chromeos/options/network_config_view.cc index 77f30605..2208aa05 100644 --- a/chrome/browser/chromeos/options/network_config_view.cc +++ b/chrome/browser/chromeos/options/network_config_view.cc
@@ -20,21 +20,22 @@ #include "chrome/browser/ui/browser_window.h" #include "chrome/grit/generated_resources.h" #include "chrome/grit/locale_settings.h" -#include "chrome/grit/theme_resources.h" #include "chromeos/login/login_state.h" #include "chromeos/network/network_state.h" #include "chromeos/network/network_state_handler.h" #include "components/device_event_log/device_event_log.h" -#include "components/grit/components_scaled_resources.h" #include "components/user_manager/user.h" #include "ui/accessibility/ax_view_state.h" #include "ui/aura/window_event_dispatcher.h" #include "ui/base/l10n/l10n_util.h" -#include "ui/base/resource/resource_bundle.h" +#include "ui/gfx/color_palette.h" #include "ui/gfx/geometry/rect.h" #include "ui/gfx/image/image.h" +#include "ui/gfx/paint_vector_icon.h" +#include "ui/gfx/vector_icons_public.h" #include "ui/views/controls/button/md_text_button.h" #include "ui/views/controls/image_view.h" +#include "ui/views/layout/fill_layout.h" #include "ui/views/layout/layout_constants.h" #include "ui/views/widget/widget.h" @@ -312,49 +313,25 @@ // ControlledSettingIndicatorView -ControlledSettingIndicatorView::ControlledSettingIndicatorView() - : managed_(false), image_view_(nullptr) { - Init(); -} - ControlledSettingIndicatorView::ControlledSettingIndicatorView( const NetworkPropertyUIData& ui_data) - : managed_(false), image_view_(nullptr) { - Init(); - Update(ui_data); + : managed_(ui_data.IsManaged()), image_view_(nullptr) { + image_view_ = new views::ImageView(); + // Disable |image_view_| so mouse events propagate to the parent. + image_view_->SetEnabled(false); + image_view_->SetImage(gfx::CreateVectorIcon(gfx::VectorIconId::BUSINESS, 16, + gfx::kChromeIconGrey)); + image_view_->SetTooltipText( + l10n_util::GetStringUTF16(IDS_OPTIONS_CONTROLLED_SETTING_POLICY)); + AddChildView(image_view_); + SetLayoutManager(new views::FillLayout()); } ControlledSettingIndicatorView::~ControlledSettingIndicatorView() {} -void ControlledSettingIndicatorView::Update( - const NetworkPropertyUIData& ui_data) { - if (managed_ == ui_data.IsManaged()) - return; - - managed_ = ui_data.IsManaged(); - PreferredSizeChanged(); -} - gfx::Size ControlledSettingIndicatorView::GetPreferredSize() const { return (managed_ && visible()) ? image_view_->GetPreferredSize() : gfx::Size(); } -void ControlledSettingIndicatorView::Layout() { - image_view_->SetBounds(0, 0, width(), height()); -} - -void ControlledSettingIndicatorView::Init() { - image_ = ResourceBundle::GetSharedInstance() - .GetImageNamed(IDR_OMNIBOX_HTTPS_POLICY_WARNING) - .ToImageSkia(); - image_view_ = new views::ImageView(); - // Disable |image_view_| so mouse events propagate to the parent. - image_view_->SetEnabled(false); - image_view_->SetImage(image_); - image_view_->SetTooltipText( - l10n_util::GetStringUTF16(IDS_OPTIONS_CONTROLLED_SETTING_POLICY)); - AddChildView(image_view_); -} - } // namespace chromeos
diff --git a/chrome/browser/chromeos/options/network_config_view.h b/chrome/browser/chromeos/options/network_config_view.h index 526b606..9d83221 100644 --- a/chrome/browser/chromeos/options/network_config_view.h +++ b/chrome/browser/chromeos/options/network_config_view.h
@@ -160,25 +160,16 @@ // control. class ControlledSettingIndicatorView : public views::View { public: - ControlledSettingIndicatorView(); explicit ControlledSettingIndicatorView(const NetworkPropertyUIData& ui_data); ~ControlledSettingIndicatorView() override; - // Updates the view based on |ui_data|. - void Update(const NetworkPropertyUIData& ui_data); - protected: // views::View: gfx::Size GetPreferredSize() const override; - void Layout() override; private: - // Initializes the view. - void Init(); - bool managed_; views::ImageView* image_view_; - const gfx::ImageSkia* image_; DISALLOW_COPY_AND_ASSIGN(ControlledSettingIndicatorView); };
diff --git a/chrome/browser/chromeos/policy/device_status_collector.cc b/chrome/browser/chromeos/policy/device_status_collector.cc index 56bbbf3..89cdc66 100644 --- a/chrome/browser/chromeos/policy/device_status_collector.cc +++ b/chrome/browser/chromeos/policy/device_status_collector.cc
@@ -472,7 +472,8 @@ running_kiosk_app_subscription_ = cros_settings_->AddSettingsObserver( chromeos::kReportRunningKioskApp, callback); - report_arc_status_pref_.Init(prefs::kReportArcStatus, local_state_, callback); + report_arc_status_pref_.Init(prefs::kReportArcStatusEnabled, local_state_, + callback); // Fetch the current values of the policies. UpdateReportingSettings(); @@ -500,7 +501,7 @@ void DeviceStatusCollector::RegisterPrefs(PrefRegistrySimple* registry) { registry->RegisterDictionaryPref(prefs::kDeviceActivityTimes, new base::DictionaryValue); - registry->RegisterBooleanPref(prefs::kReportArcStatus, true); + registry->RegisterBooleanPref(prefs::kReportArcStatusEnabled, true); } void DeviceStatusCollector::CheckIdleState() { @@ -554,7 +555,8 @@ report_kiosk_session_status_ = true; } - report_android_status_ = local_state_->GetBoolean(prefs::kReportArcStatus); + report_android_status_ = + local_state_->GetBoolean(prefs::kReportArcStatusEnabled); if (!report_hardware_status_) { ClearCachedResourceUsage();
diff --git a/chrome/browser/chromeos/policy/device_status_collector_browsertest.cc b/chrome/browser/chromeos/policy/device_status_collector_browsertest.cc index a2629d0e..1fe6032 100644 --- a/chrome/browser/chromeos/policy/device_status_collector_browsertest.cc +++ b/chrome/browser/chromeos/policy/device_status_collector_browsertest.cc
@@ -1019,7 +1019,7 @@ base::Bind(&GetFakeAndroidStatus, kArcStatus, kDroidGuardInfo)); - prefs_.SetBoolean(prefs::kReportArcStatus, false); + prefs_.SetBoolean(prefs::kReportArcStatusEnabled, false); // Mock Kiosk app, so some session status is reported status_collector_->set_kiosk_account( base::MakeUnique<DeviceLocalAccount>(fake_device_local_account_)); @@ -1033,7 +1033,7 @@ TEST_F(DeviceStatusCollectorTest, NoSessionStatusIfNotKioskAndNoArcReporting) { // Should not report session status if we don't have an active kiosk app. settings_helper_.SetBoolean(chromeos::kReportDeviceSessionStatus, true); - prefs_.SetBoolean(prefs::kReportArcStatus, false); + prefs_.SetBoolean(prefs::kReportArcStatusEnabled, false); GetStatus(); EXPECT_FALSE(got_session_status_); } @@ -1043,7 +1043,7 @@ settings_helper_.SetBoolean(chromeos::kReportDeviceSessionStatus, false); // ReportDeviceSessionStatus only controls Kiosk reporting, ARC reporting // has to be disabled serarately. - prefs_.SetBoolean(prefs::kReportArcStatus, false); + prefs_.SetBoolean(prefs::kReportArcStatusEnabled, false); status_collector_->set_kiosk_account( base::MakeUnique<policy::DeviceLocalAccount>(fake_device_local_account_)); // Set up a device-local account for single-app kiosk mode.
diff --git a/chrome/browser/component_updater/sw_reporter_installer_win.cc b/chrome/browser/component_updater/sw_reporter_installer_win.cc index 7f83281..fbec145 100644 --- a/chrome/browser/component_updater/sw_reporter_installer_win.cc +++ b/chrome/browser/component_updater/sw_reporter_installer_win.cc
@@ -13,6 +13,7 @@ #include <utility> #include <vector> +#include "base/base64.h" #include "base/base_paths.h" #include "base/bind.h" #include "base/command_line.h" @@ -23,8 +24,11 @@ #include "base/metrics/histogram_macros.h" #include "base/metrics/sparse_histogram.h" #include "base/path_service.h" +#include "base/rand_util.h" +#include "base/strings/string_number_conversions.h" #include "base/strings/string_tokenizer.h" #include "base/strings/string_util.h" +#include "base/strings/utf_string_conversions.h" #include "base/threading/thread_task_runner_handle.h" #include "base/threading/worker_pool.h" #include "base/time/time.h" @@ -69,6 +73,8 @@ const base::FilePath::CharType kSwReporterExeName[] = FILE_PATH_LITERAL("software_reporter_tool.exe"); +constexpr char kSessionIdSwitch[] = "session-id"; + // SRT registry keys and value names. const wchar_t kCleanerSuffixRegistryKey[] = L"Cleaner"; const wchar_t kExitCodeValueName[] = L"ExitCode"; @@ -145,6 +151,13 @@ }); } +std::string GenerateSessionId() { + std::string session_id; + base::Base64Encode(base::RandBytesAsString(30), &session_id); + DCHECK(!session_id.empty()); + return session_id; +} + // Add |behaviour_flag| to |supported_behaviours| if |behaviour_name| is found // in the dictionary. Returns false on error. bool GetOptionalBehaviour( @@ -190,6 +203,8 @@ return; } + const std::string session_id = GenerateSessionId(); + safe_browsing::SwReporterQueue invocations; for (const auto& iter : *parameter_list) { const base::DictionaryValue* invocation_params = nullptr; @@ -234,6 +249,17 @@ base::CommandLine command_line(argv); + // Add a random session id to link experimental reporter runs together. + command_line.AppendSwitchASCII(kSessionIdSwitch, session_id); + + const std::string experiment_group = + variations::GetVariationParamValueByFeature( + kExperimentalEngineFeature, "experiment_group_for_reporting"); + command_line.AppendSwitchNative("engine-experiment-group", + experiment_group.empty() + ? L"missing_experiment_group" + : base::UTF8ToUTF16(experiment_group)); + // Add the histogram suffix to the command-line as well, so that the // reporter will add the same suffix to registry keys where it writes // metrics. @@ -302,7 +328,9 @@ RunExperimentalSwReporter(exe_path, version, std::move(manifest), reporter_runner_); } else { - auto invocation = SwReporterInvocation::FromFilePath(exe_path); + base::CommandLine command_line(exe_path); + command_line.AppendSwitchASCII(kSessionIdSwitch, GenerateSessionId()); + auto invocation = SwReporterInvocation::FromCommandLine(command_line); invocation.supported_behaviours = SwReporterInvocation::BEHAVIOUR_LOG_TO_RAPPOR | SwReporterInvocation::BEHAVIOUR_LOG_EXIT_CODE_TO_PREFS |
diff --git a/chrome/browser/component_updater/sw_reporter_installer_win_unittest.cc b/chrome/browser/component_updater/sw_reporter_installer_win_unittest.cc index 997e4ce..d8fbb38f 100644 --- a/chrome/browser/component_updater/sw_reporter_installer_win_unittest.cc +++ b/chrome/browser/component_updater/sw_reporter_installer_win_unittest.cc
@@ -31,7 +31,12 @@ namespace { +constexpr char kExperimentGroupName[] = "my_test_engine_group"; + +constexpr char kEngineExperimentGroupSwitch[] = "engine-experiment-group"; constexpr char kRegistrySuffixSwitch[] = "registry-suffix"; +constexpr char kSessionIdSwitch[] = "session-id"; + constexpr char kErrorHistogramName[] = "SoftwareReporter.ExperimentErrors"; constexpr char kExperimentTag[] = "experiment_tag"; constexpr char kMissingTag[] = "missing_tag"; @@ -70,7 +75,8 @@ EXPECT_TRUE(attributes.empty()); } - // Expects that the SwReporter was launched exactly once, with no arguments. + // Expects that the SwReporter was launched exactly once, with a session-id + // switch. void ExpectDefaultInvocation() const { EXPECT_EQ(default_version_, launched_version_); ASSERT_EQ(1U, launched_invocations_.size()); @@ -78,7 +84,10 @@ const SwReporterInvocation& invocation = launched_invocations_.front(); EXPECT_EQ(MakeTestFilePath(default_path_), invocation.command_line.GetProgram()); - EXPECT_TRUE(invocation.command_line.GetSwitches().empty()); + EXPECT_EQ(1U, invocation.command_line.GetSwitches().size()); + EXPECT_EQ( + 40U, + invocation.command_line.GetSwitchValueASCII(kSessionIdSwitch).size()); EXPECT_TRUE(invocation.command_line.GetArgs().empty()); EXPECT_TRUE(invocation.suffix.empty()); EXPECT_EQ(SwReporterInvocation::BEHAVIOUR_LOG_TO_RAPPOR | @@ -128,22 +137,24 @@ void CreateFeatureWithParams( const std::map<std::string, std::string>& params) { - constexpr char kExperimentGroupName[] = "ExperimentalSwReporterEngine"; + constexpr char kFeatureName[] = "ExperimentalSwReporterEngine"; + + std::map<std::string, std::string> params_with_group = params; + params_with_group["experiment_group_for_reporting"] = kExperimentGroupName; // Assign the given variation params to the experiment group until // |variations_| goes out of scope when the test exits. This will also // create a FieldTrial for this group. variations_ = std::make_unique<variations::testing::VariationParamsManager>( - kExperimentGroupName, params); + kFeatureName, params_with_group); // Create a feature list containing only the field trial for this group, // and enable it for the length of the test. - base::FieldTrial* trial = base::FieldTrialList::Find(kExperimentGroupName); + base::FieldTrial* trial = base::FieldTrialList::Find(kFeatureName); ASSERT_TRUE(trial); auto feature_list = std::make_unique<base::FeatureList>(); feature_list->RegisterFieldTrialOverride( - kExperimentGroupName, base::FeatureList::OVERRIDE_ENABLE_FEATURE, - trial); + kFeatureName, base::FeatureList::OVERRIDE_ENABLE_FEATURE, trial); scoped_feature_list_.InitWithFeatureList(std::move(feature_list)); } @@ -156,10 +167,11 @@ } // Expects that the SwReporter was launched exactly once, with the given - // |expected_suffix| and one |expected_additional_argument| on the - // command-line. (|expected_additional_argument| mainly exists to test that - // arguments are included at all, so there is no need to test for - // combinations of multiple arguments and switches in this function.) + // |expected_suffix|, an experiment group, a session-id, and one + // |expected_additional_argument| on the command-line. + // (|expected_additional_argument| mainly exists to test that arguments are + // included at all, so there is no need to test for combinations of multiple + // arguments and switches in this function.) void ExpectExperimentalInvocation( const std::string& expected_suffix, const base::string16& expected_additional_argument) { @@ -169,12 +181,17 @@ const SwReporterInvocation& invocation = launched_invocations_.front(); EXPECT_EQ(MakeTestFilePath(default_path_), invocation.command_line.GetProgram()); + EXPECT_EQ( + 40U, + invocation.command_line.GetSwitchValueASCII(kSessionIdSwitch).size()); + EXPECT_EQ(kExperimentGroupName, invocation.command_line.GetSwitchValueASCII( + kEngineExperimentGroupSwitch)); if (expected_suffix.empty()) { - EXPECT_TRUE(invocation.command_line.GetSwitches().empty()); + EXPECT_EQ(2U, invocation.command_line.GetSwitches().size()); EXPECT_TRUE(invocation.suffix.empty()); } else { - EXPECT_EQ(1U, invocation.command_line.GetSwitches().size()); + EXPECT_EQ(3U, invocation.command_line.GetSwitches().size()); EXPECT_EQ(expected_suffix, invocation.command_line.GetSwitchValueASCII( kRegistrySuffixSwitch)); EXPECT_EQ(expected_suffix, invocation.suffix); @@ -198,7 +215,8 @@ void ExpectExperimentalInvocationInSeries( const std::string& expected_suffix, const std::string& expected_engine, - SwReporterInvocation::Behaviours expected_behaviours) { + SwReporterInvocation::Behaviours expected_behaviours, + std::string* out_session_id) { SCOPED_TRACE("Invocation with suffix " + expected_suffix); SwReporterInvocation invocation = launched_invocations_.front(); launched_invocations_.pop(); @@ -206,11 +224,16 @@ invocation.command_line.GetProgram()); // There should be one switch added from the manifest, plus registry-suffix // added automatically. - EXPECT_EQ(2U, invocation.command_line.GetSwitches().size()); + EXPECT_EQ(4U, invocation.command_line.GetSwitches().size()); EXPECT_EQ(expected_engine, invocation.command_line.GetSwitchValueASCII("engine")); EXPECT_EQ(expected_suffix, invocation.command_line.GetSwitchValueASCII( kRegistrySuffixSwitch)); + *out_session_id = + invocation.command_line.GetSwitchValueASCII(kSessionIdSwitch); + EXPECT_EQ(40U, out_session_id->size()); + EXPECT_EQ(kExperimentGroupName, invocation.command_line.GetSwitchValueASCII( + kEngineExperimentGroupSwitch)); ASSERT_TRUE(invocation.command_line.GetArgs().empty()); EXPECT_EQ(expected_suffix, invocation.suffix); EXPECT_EQ(expected_behaviours, invocation.supported_behaviours); @@ -317,11 +340,16 @@ const SwReporterInvocation& invocation = launched_invocations_.front(); EXPECT_EQ(MakeTestFilePath(default_path_), invocation.command_line.GetProgram()); - EXPECT_EQ(2U, invocation.command_line.GetSwitches().size()); + EXPECT_EQ(4U, invocation.command_line.GetSwitches().size()); EXPECT_EQ("experimental", invocation.command_line.GetSwitchValueASCII("engine")); EXPECT_EQ("TestSuffix", invocation.command_line.GetSwitchValueASCII(kRegistrySuffixSwitch)); + EXPECT_EQ( + 40U, + invocation.command_line.GetSwitchValueASCII(kSessionIdSwitch).size()); + EXPECT_EQ(kExperimentGroupName, invocation.command_line.GetSwitchValueASCII( + kEngineExperimentGroupSwitch)); ASSERT_EQ(1U, invocation.command_line.GetArgs().size()); EXPECT_EQ(L"random argument", invocation.command_line.GetArgs()[0]); EXPECT_EQ("TestSuffix", invocation.suffix); @@ -367,16 +395,30 @@ // The SwReporter should be launched four times with the given arguments. EXPECT_EQ(default_version_, launched_version_); ASSERT_EQ(4U, launched_invocations_.size()); + std::string out_session_id; ExpectExperimentalInvocationInSeries( "TestSuffix", "experimental", - SwReporterInvocation::BEHAVIOUR_ALLOW_SEND_REPORTER_LOGS); + SwReporterInvocation::BEHAVIOUR_ALLOW_SEND_REPORTER_LOGS, + &out_session_id); + + const std::string first_session_id(out_session_id); + ExpectExperimentalInvocationInSeries( - "SecondSuffix", "second", SwReporterInvocation::BEHAVIOUR_TRIGGER_PROMPT); - ExpectExperimentalInvocationInSeries("ThirdSuffix", "third", 0U); + "SecondSuffix", "second", SwReporterInvocation::BEHAVIOUR_TRIGGER_PROMPT, + &out_session_id); + EXPECT_EQ(first_session_id, out_session_id); + + ExpectExperimentalInvocationInSeries("ThirdSuffix", "third", 0U, + &out_session_id); + EXPECT_EQ(first_session_id, out_session_id); + ExpectExperimentalInvocationInSeries( "FourthSuffix", "fourth", SwReporterInvocation::BEHAVIOUR_ALLOW_SEND_REPORTER_LOGS | - SwReporterInvocation::BEHAVIOUR_TRIGGER_PROMPT); + SwReporterInvocation::BEHAVIOUR_TRIGGER_PROMPT, + &out_session_id); + EXPECT_EQ(first_session_id, out_session_id); + histograms_.ExpectTotalCount(kErrorHistogramName, 0); }
diff --git a/chrome/browser/devtools/chrome_devtools_manager_delegate.cc b/chrome/browser/devtools/chrome_devtools_manager_delegate.cc index 48a5aa44..ffd5687 100644 --- a/chrome/browser/devtools/chrome_devtools_manager_delegate.cc +++ b/chrome/browser/devtools/chrome_devtools_manager_delegate.cc
@@ -184,10 +184,14 @@ return content::DevToolsFrontendHost::GetFrontendResource(path).as_string(); } -void ChromeDevToolsManagerDelegate::DevToolsAgentStateChanged( - DevToolsAgentHost* agent_host, - bool attached) { - network_protocol_handler_->DevToolsAgentStateChanged(agent_host, attached); +void ChromeDevToolsManagerDelegate::DevToolsAgentHostAttached( + content::DevToolsAgentHost* agent_host) { + network_protocol_handler_->DevToolsAgentStateChanged(agent_host, true); +} + +void ChromeDevToolsManagerDelegate::DevToolsAgentHostDetached( + content::DevToolsAgentHost* agent_host) { + network_protocol_handler_->DevToolsAgentStateChanged(agent_host, false); } std::unique_ptr<base::DictionaryValue>
diff --git a/chrome/browser/devtools/chrome_devtools_manager_delegate.h b/chrome/browser/devtools/chrome_devtools_manager_delegate.h index 567fcb5e..8292d8b 100644 --- a/chrome/browser/devtools/chrome_devtools_manager_delegate.h +++ b/chrome/browser/devtools/chrome_devtools_manager_delegate.h
@@ -11,12 +11,15 @@ #include "base/compiler_specific.h" #include "base/macros.h" #include "chrome/browser/devtools/device/devtools_android_bridge.h" +#include "content/public/browser/devtools_agent_host_observer.h" #include "content/public/browser/devtools_manager_delegate.h" #include "net/base/host_port_pair.h" class DevToolsNetworkProtocolHandler; -class ChromeDevToolsManagerDelegate : public content::DevToolsManagerDelegate { +class ChromeDevToolsManagerDelegate : + public content::DevToolsManagerDelegate, + public content::DevToolsAgentHostObserver { public: static char kTypeApp[]; static char kTypeBackgroundPage[]; @@ -25,10 +28,9 @@ ChromeDevToolsManagerDelegate(); ~ChromeDevToolsManagerDelegate() override; + private: // content::DevToolsManagerDelegate implementation. void Inspect(content::DevToolsAgentHost* agent_host) override; - void DevToolsAgentStateChanged(content::DevToolsAgentHost* agent_host, - bool attached) override; bool DiscoverTargets( const content::DevToolsAgentHost::DiscoveryCallback& callback) override; base::DictionaryValue* HandleCommand( @@ -41,7 +43,12 @@ std::string GetDiscoveryPageHTML() override; std::string GetFrontendResource(const std::string& path) override; - private: + // content::DevToolsAgentHostObserver overrides. + void DevToolsAgentHostAttached( + content::DevToolsAgentHost* agent_host) override; + void DevToolsAgentHostDetached( + content::DevToolsAgentHost* agent_host) override; + void DevicesAvailable( const content::DevToolsAgentHost::DiscoveryCallback& callback, const DevToolsAndroidBridge::CompleteDevices& devices);
diff --git a/chrome/browser/devtools/devtools_window.cc b/chrome/browser/devtools/devtools_window.cc index 2c5a4e70..0f93220c 100644 --- a/chrome/browser/devtools/devtools_window.cc +++ b/chrome/browser/devtools/devtools_window.cc
@@ -205,10 +205,8 @@ url_string += "&experiments=true"; if (command_line->HasSwitch(switches::kDevToolsFlags)) { - std::string flags = command_line->GetSwitchValueASCII( - switches::kDevToolsFlags); - flags = net::EscapeQueryParamValue(flags, false); - url_string += "&flags=" + flags; + url_string += "&" + command_line->GetSwitchValueASCII( + switches::kDevToolsFlags); } #if defined(DEBUG_DEVTOOLS) @@ -905,7 +903,7 @@ } if (can_dock) url_string += "&can_dock=true"; - return GURL(url_string); + return DevToolsUI::SanitizeFrontendURL(GURL(url_string)); } // static
diff --git a/chrome/browser/extensions/activity_log/OWNERS b/chrome/browser/extensions/activity_log/OWNERS index 3bc4f5a..ef93f9b 100644 --- a/chrome/browser/extensions/activity_log/OWNERS +++ b/chrome/browser/extensions/activity_log/OWNERS
@@ -1,4 +1,4 @@ # If you are editing this file, please also update # chrome/browser/extensions/api/activity_log_private/OWNERS rdevlin.cronin@chromium.org -felt@chromium.org +asargent@chromium.org
diff --git a/chrome/browser/extensions/api/activity_log_private/OWNERS b/chrome/browser/extensions/api/activity_log_private/OWNERS index 9091c448..e3ff774e 100644 --- a/chrome/browser/extensions/api/activity_log_private/OWNERS +++ b/chrome/browser/extensions/api/activity_log_private/OWNERS
@@ -1,4 +1,4 @@ # If you are editing this file, please also update # chrome/browser/extensions/activity_log/OWNERS rdevlin.cronin@chromium.org -felt@chromium.org +asargent@chromium.org
diff --git a/chrome/browser/extensions/api/declarative_webrequest/webrequest_action_unittest.cc b/chrome/browser/extensions/api/declarative_webrequest/webrequest_action_unittest.cc index 5a79994..348d2c8 100644 --- a/chrome/browser/extensions/api/declarative_webrequest/webrequest_action_unittest.cc +++ b/chrome/browser/extensions/api/declarative_webrequest/webrequest_action_unittest.cc
@@ -150,7 +150,8 @@ std::list<LinkedPtrEventResponseDelta> deltas; scoped_refptr<net::HttpResponseHeaders> headers( new net::HttpResponseHeaders("")); - WebRequestData request_data(regular_request.get(), stage, headers.get()); + WebRequestData request_data(regular_request.get(), stage, nullptr, + headers.get()); std::set<std::string> ignored_tags; WebRequestAction::ApplyInfo apply_info = { extension_info_map_.get(), request_data,
diff --git a/chrome/browser/extensions/api/settings_private/settings_private_api.cc b/chrome/browser/extensions/api/settings_private/settings_private_api.cc index e2b2374..a73f78f 100644 --- a/chrome/browser/extensions/api/settings_private/settings_private_api.cc +++ b/chrome/browser/extensions/api/settings_private/settings_private_api.cc
@@ -106,37 +106,36 @@ } //////////////////////////////////////////////////////////////////////////////// -// SettingsPrivateGetDefaultZoomPercentFunction +// SettingsPrivateGetDefaultZoomFunction //////////////////////////////////////////////////////////////////////////////// -SettingsPrivateGetDefaultZoomPercentFunction:: - ~SettingsPrivateGetDefaultZoomPercentFunction() { +SettingsPrivateGetDefaultZoomFunction:: + ~SettingsPrivateGetDefaultZoomFunction() { } ExtensionFunction::ResponseAction - SettingsPrivateGetDefaultZoomPercentFunction::Run() { + SettingsPrivateGetDefaultZoomFunction::Run() { SettingsPrivateDelegate* delegate = SettingsPrivateDelegateFactory::GetForBrowserContext(browser_context()); if (delegate == nullptr) return RespondNow(Error(kDelegateIsNull)); else - return RespondNow(OneArgument(delegate->GetDefaultZoomPercent())); + return RespondNow(OneArgument(delegate->GetDefaultZoom())); } //////////////////////////////////////////////////////////////////////////////// -// SettingsPrivateSetDefaultZoomPercentFunction +// SettingsPrivateSetDefaultZoomFunction //////////////////////////////////////////////////////////////////////////////// -SettingsPrivateSetDefaultZoomPercentFunction:: - ~SettingsPrivateSetDefaultZoomPercentFunction() { +SettingsPrivateSetDefaultZoomFunction:: + ~SettingsPrivateSetDefaultZoomFunction() { } ExtensionFunction::ResponseAction - SettingsPrivateSetDefaultZoomPercentFunction::Run() { - std::unique_ptr<api::settings_private::SetDefaultZoomPercent::Params> - parameters = - api::settings_private::SetDefaultZoomPercent::Params::Create(*args_); + SettingsPrivateSetDefaultZoomFunction::Run() { + std::unique_ptr<api::settings_private::SetDefaultZoom::Params> parameters = + api::settings_private::SetDefaultZoom::Params::Create(*args_); EXTENSION_FUNCTION_VALIDATE(parameters.get()); SettingsPrivateDelegate* delegate = @@ -144,7 +143,7 @@ if (delegate == nullptr) return RespondNow(Error(kDelegateIsNull)); - delegate->SetDefaultZoomPercent(parameters->percent); + delegate->SetDefaultZoom(parameters->zoom); return RespondNow( OneArgument(base::MakeUnique<base::FundamentalValue>(true))); }
diff --git a/chrome/browser/extensions/api/settings_private/settings_private_api.h b/chrome/browser/extensions/api/settings_private/settings_private_api.h index 07a03ece..e61e09a4 100644 --- a/chrome/browser/extensions/api/settings_private/settings_private_api.h +++ b/chrome/browser/extensions/api/settings_private/settings_private_api.h
@@ -60,38 +60,38 @@ DISALLOW_COPY_AND_ASSIGN(SettingsPrivateGetPrefFunction); }; -// Implements the chrome.settingsPrivate.getDefaultZoomPercent method. -class SettingsPrivateGetDefaultZoomPercentFunction +// Implements the chrome.settingsPrivate.getDefaultZoom method. +class SettingsPrivateGetDefaultZoomFunction : public UIThreadExtensionFunction { public: - SettingsPrivateGetDefaultZoomPercentFunction() {} - DECLARE_EXTENSION_FUNCTION("settingsPrivate.getDefaultZoomPercent", - SETTINGSPRIVATE_GETDEFAULTZOOMPERCENTFUNCTION); + SettingsPrivateGetDefaultZoomFunction() {} + DECLARE_EXTENSION_FUNCTION("settingsPrivate.getDefaultZoom", + SETTINGSPRIVATE_GETDEFAULTZOOMFUNCTION); protected: - ~SettingsPrivateGetDefaultZoomPercentFunction() override; + ~SettingsPrivateGetDefaultZoomFunction() override; // AsyncExtensionFunction overrides. ResponseAction Run() override; - DISALLOW_COPY_AND_ASSIGN(SettingsPrivateGetDefaultZoomPercentFunction); + DISALLOW_COPY_AND_ASSIGN(SettingsPrivateGetDefaultZoomFunction); }; -// Implements the chrome.settingsPrivate.setDefaultZoomPercent method. -class SettingsPrivateSetDefaultZoomPercentFunction +// Implements the chrome.settingsPrivate.setDefaultZoom method. +class SettingsPrivateSetDefaultZoomFunction : public UIThreadExtensionFunction { public: - SettingsPrivateSetDefaultZoomPercentFunction() {} - DECLARE_EXTENSION_FUNCTION("settingsPrivate.setDefaultZoomPercent", - SETTINGSPRIVATE_SETDEFAULTZOOMPERCENTFUNCTION); + SettingsPrivateSetDefaultZoomFunction() {} + DECLARE_EXTENSION_FUNCTION("settingsPrivate.setDefaultZoom", + SETTINGSPRIVATE_SETDEFAULTZOOMFUNCTION); protected: - ~SettingsPrivateSetDefaultZoomPercentFunction() override; + ~SettingsPrivateSetDefaultZoomFunction() override; // AsyncExtensionFunction overrides. ResponseAction Run() override; - DISALLOW_COPY_AND_ASSIGN(SettingsPrivateSetDefaultZoomPercentFunction); + DISALLOW_COPY_AND_ASSIGN(SettingsPrivateSetDefaultZoomFunction); }; } // namespace extensions
diff --git a/chrome/browser/extensions/api/settings_private/settings_private_delegate.cc b/chrome/browser/extensions/api/settings_private/settings_private_delegate.cc index 299ce59..13ed8a8 100644 --- a/chrome/browser/extensions/api/settings_private/settings_private_delegate.cc +++ b/chrome/browser/extensions/api/settings_private/settings_private_delegate.cc
@@ -58,16 +58,16 @@ return prefs_util_->SetPref(pref_name, value); } -std::unique_ptr<base::Value> SettingsPrivateDelegate::GetDefaultZoomPercent() { +std::unique_ptr<base::Value> SettingsPrivateDelegate::GetDefaultZoom() { double zoom = content::ZoomLevelToZoomFactor( profile_->GetZoomLevelPrefs()->GetDefaultZoomLevelPref()); std::unique_ptr<base::Value> value(new base::FundamentalValue(zoom)); return value; } -PrefsUtil::SetPrefResult SettingsPrivateDelegate::SetDefaultZoomPercent( - double percent) { - double zoom_factor = content::ZoomFactorToZoomLevel(percent); +PrefsUtil::SetPrefResult SettingsPrivateDelegate::SetDefaultZoom( + double zoom) { + double zoom_factor = content::ZoomFactorToZoomLevel(zoom); profile_->GetZoomLevelPrefs()->SetDefaultZoomLevelPref(zoom_factor); return PrefsUtil::SetPrefResult::SUCCESS; }
diff --git a/chrome/browser/extensions/api/settings_private/settings_private_delegate.h b/chrome/browser/extensions/api/settings_private/settings_private_delegate.h index 93bbb9d..752c2f0 100644 --- a/chrome/browser/extensions/api/settings_private/settings_private_delegate.h +++ b/chrome/browser/extensions/api/settings_private/settings_private_delegate.h
@@ -45,10 +45,10 @@ virtual std::unique_ptr<base::Value> GetAllPrefs(); // Gets the value. - virtual std::unique_ptr<base::Value> GetDefaultZoomPercent(); + virtual std::unique_ptr<base::Value> GetDefaultZoom(); // Sets the pref. - virtual PrefsUtil::SetPrefResult SetDefaultZoomPercent(double percent); + virtual PrefsUtil::SetPrefResult SetDefaultZoom(double zoom); protected: Profile* profile_; // weak; not owned by us
diff --git a/chrome/browser/extensions/api/web_request/web_request_permissions_unittest.cc b/chrome/browser/extensions/api/web_request/web_request_permissions_unittest.cc index 6addaada..4165bb6 100644 --- a/chrome/browser/extensions/api/web_request/web_request_permissions_unittest.cc +++ b/chrome/browser/extensions/api/web_request/web_request_permissions_unittest.cc
@@ -107,7 +107,8 @@ std::unique_ptr<net::URLRequest> request( context.CreateRequest(sensitive_url, net::DEFAULT_PRIORITY, NULL)); EXPECT_TRUE(WebRequestPermissions::HideRequest( - extension_info_map_.get(), request.get())) << sensitive_urls[i]; + extension_info_map_.get(), request.get(), nullptr)) << + sensitive_urls[i]; } // Check that requests are accepted if they don't touch sensitive urls. for (size_t i = 0; i < arraysize(non_sensitive_urls); ++i) { @@ -115,7 +116,8 @@ std::unique_ptr<net::URLRequest> request( context.CreateRequest(non_sensitive_url, net::DEFAULT_PRIORITY, NULL)); EXPECT_FALSE(WebRequestPermissions::HideRequest( - extension_info_map_.get(), request.get())) << non_sensitive_urls[i]; + extension_info_map_.get(), request.get(), nullptr)) << + non_sensitive_urls[i]; } // Check protection of requests originating from the frame showing the Chrome @@ -125,7 +127,7 @@ std::unique_ptr<net::URLRequest> non_sensitive_request( context.CreateRequest(non_sensitive_url, net::DEFAULT_PRIORITY, NULL)); EXPECT_FALSE(WebRequestPermissions::HideRequest( - extension_info_map_.get(), non_sensitive_request.get())); + extension_info_map_.get(), non_sensitive_request.get(), nullptr)); // If the origin is labeled by the WebStoreAppId, it becomes protected. { int process_id = 42; @@ -147,7 +149,7 @@ extension_info_map_->RegisterExtensionProcess( extensions::kWebStoreAppId, process_id, site_instance_id); EXPECT_TRUE(WebRequestPermissions::HideRequest( - extension_info_map_.get(), sensitive_request.get())); + extension_info_map_.get(), sensitive_request.get(), nullptr)); } }
diff --git a/chrome/browser/extensions/api/webrtc_audio_private/webrtc_audio_private_browsertest.cc b/chrome/browser/extensions/api/webrtc_audio_private/webrtc_audio_private_browsertest.cc index 1b4c61b..2463eb8 100644 --- a/chrome/browser/extensions/api/webrtc_audio_private/webrtc_audio_private_browsertest.cc +++ b/chrome/browser/extensions/api/webrtc_audio_private/webrtc_audio_private_browsertest.cc
@@ -400,7 +400,7 @@ } }; -#if defined(GOOGLE_CHROME_BUILD) || BUILDFLAG(ENABLE_HANGOUT_SERVICES_EXTENSION) +#if BUILDFLAG(ENABLE_HANGOUT_SERVICES_EXTENSION) IN_PROC_BROWSER_TEST_F(HangoutServicesBrowserTest, RunComponentExtensionTest) { // This runs the end-to-end JavaScript test for the Hangout Services @@ -437,6 +437,6 @@ g_browser_process->webrtc_log_uploader()->OverrideUploadWithBufferForTesting( NULL); } -#endif // defined(GOOGLE_CHROME_BUILD) || BUILDFLAG(ENABLE_HANGOUT_SERVICES_EXTENSION) +#endif // BUILDFLAG(ENABLE_HANGOUT_SERVICES_EXTENSION) } // namespace extensions
diff --git a/chrome/browser/extensions/chrome_content_browser_client_extensions_part.cc b/chrome/browser/extensions/chrome_content_browser_client_extensions_part.cc index 78d3299..73dc5a2 100644 --- a/chrome/browser/extensions/chrome_content_browser_client_extensions_part.cc +++ b/chrome/browser/extensions/chrome_content_browser_client_extensions_part.cc
@@ -29,6 +29,7 @@ #include "content/public/browser/render_view_host.h" #include "content/public/browser/resource_dispatcher_host.h" #include "content/public/browser/site_instance.h" +#include "content/public/browser/storage_partition.h" #include "content/public/browser/vpn_service_proxy.h" #include "content/public/browser/web_contents.h" #include "content/public/common/content_switches.h" @@ -560,7 +561,8 @@ host->AddFilter(new ExtensionsGuestViewMessageFilter(id, profile)); if (extensions::ExtensionsClient::Get() ->ExtensionAPIEnabledInExtensionServiceWorkers()) { - host->AddFilter(new ExtensionServiceWorkerMessageFilter(id, profile)); + host->AddFilter(new ExtensionServiceWorkerMessageFilter( + id, profile, host->GetStoragePartition()->GetServiceWorkerContext())); } extension_web_request_api_helpers::SendExtensionWebRequestStatusToHost(host); }
diff --git a/chrome/browser/extensions/component_extensions_whitelist/whitelist.cc b/chrome/browser/extensions/component_extensions_whitelist/whitelist.cc index 662dc94..08d33cd 100644 --- a/chrome/browser/extensions/component_extensions_whitelist/whitelist.cc +++ b/chrome/browser/extensions/component_extensions_whitelist/whitelist.cc
@@ -84,7 +84,7 @@ #if defined(ENABLE_GOOGLE_NOW) case IDR_GOOGLE_NOW_MANIFEST: #endif -#if defined(GOOGLE_CHROME_BUILD) || BUILDFLAG(ENABLE_HANGOUT_SERVICES_EXTENSION) +#if BUILDFLAG(ENABLE_HANGOUT_SERVICES_EXTENSION) case IDR_HANGOUT_SERVICES_MANIFEST: #endif #if defined(ENABLE_HOTWORDING)
diff --git a/chrome/browser/extensions/component_loader.cc b/chrome/browser/extensions/component_loader.cc index 7f66fb6..7566a1fa 100644 --- a/chrome/browser/extensions/component_loader.cc +++ b/chrome/browser/extensions/component_loader.cc
@@ -336,7 +336,7 @@ } void ComponentLoader::AddHangoutServicesExtension() { -#if defined(GOOGLE_CHROME_BUILD) || BUILDFLAG(ENABLE_HANGOUT_SERVICES_EXTENSION) +#if BUILDFLAG(ENABLE_HANGOUT_SERVICES_EXTENSION) Add(IDR_HANGOUT_SERVICES_MANIFEST, base::FilePath(FILE_PATH_LITERAL("hangout_services"))); #endif
diff --git a/chrome/browser/extensions/extension_context_menu_model.cc b/chrome/browser/extensions/extension_context_menu_model.cc index 773a28b..61863ad 100644 --- a/chrome/browser/extensions/extension_context_menu_model.cc +++ b/chrome/browser/extensions/extension_context_menu_model.cc
@@ -43,7 +43,10 @@ #include "extensions/common/manifest_url_handlers.h" #include "ui/base/l10n/l10n_util.h" #include "ui/base/resource/resource_bundle.h" +#include "ui/gfx/color_palette.h" #include "ui/gfx/image/image.h" +#include "ui/gfx/paint_vector_icon.h" +#include "ui/gfx/vector_icons_public.h" namespace extensions { @@ -327,8 +330,8 @@ if (is_required_by_policy) { int uninstall_index = GetIndexOfCommandId(UNINSTALL); SetIcon(uninstall_index, - ui::ResourceBundle::GetSharedInstance().GetImageNamed( - IDR_OMNIBOX_HTTPS_POLICY_WARNING)); + gfx::Image(gfx::CreateVectorIcon(gfx::VectorIconId::BUSINESS, 16, + gfx::kChromeIconGrey))); } }
diff --git a/chrome/browser/extensions/extension_tabs_apitest.cc b/chrome/browser/extensions/extension_tabs_apitest.cc index 015c264..48b8276 100644 --- a/chrome/browser/extensions/extension_tabs_apitest.cc +++ b/chrome/browser/extensions/extension_tabs_apitest.cc
@@ -29,13 +29,6 @@ #define MAYBE_UpdateWindowShowState UpdateWindowShowState #endif // defined(USE_AURA) || defined(OS_MACOSX) -// http://crbug.com/145639 -#if defined(OS_LINUX) || defined(OS_WIN) -#define MAYBE_TabEvents DISABLED_TabEvents -#else -#define MAYBE_TabEvents TabEvents -#endif - class ExtensionApiNewTabTest : public ExtensionApiTest { public: ExtensionApiNewTabTest() {} @@ -111,7 +104,7 @@ ASSERT_TRUE(RunExtensionSubtest("tabs/basics", "move.html")) << message_; } -IN_PROC_BROWSER_TEST_F(ExtensionApiTest, MAYBE_TabEvents) { +IN_PROC_BROWSER_TEST_F(ExtensionApiTest, TabEvents) { ASSERT_TRUE(RunExtensionSubtest("tabs/basics", "events.html")) << message_; }
diff --git a/chrome/browser/extensions/service_worker_apitest.cc b/chrome/browser/extensions/service_worker_apitest.cc index 227584f..9db618f 100644 --- a/chrome/browser/extensions/service_worker_apitest.cc +++ b/chrome/browser/extensions/service_worker_apitest.cc
@@ -24,6 +24,8 @@ #include "content/public/browser/navigation_controller.h" #include "content/public/browser/navigation_entry.h" #include "content/public/browser/permission_type.h" +#include "content/public/browser/service_worker_context.h" +#include "content/public/browser/storage_partition.h" #include "content/public/browser/web_contents.h" #include "content/public/common/content_switches.h" #include "content/public/common/origin_util.h" @@ -162,6 +164,24 @@ return ExtractInnerText(Navigate(url)); } + size_t GetWorkerRefCount(const GURL& origin) { + content::ServiceWorkerContext* sw_context = + content::BrowserContext::GetDefaultStoragePartition( + browser()->profile()) + ->GetServiceWorkerContext(); + base::RunLoop run_loop; + size_t ref_count = 0; + auto set_ref_count = [](size_t* ref_count, base::RunLoop* run_loop, + size_t external_request_count) { + *ref_count = external_request_count; + run_loop->Quit(); + }; + sw_context->CountExternalRequestsForTest( + origin, base::Bind(set_ref_count, &ref_count, &run_loop)); + run_loop.Run(); + return ref_count; + } + private: // Sets the channel to "stable". // Not useful after we've opened extension Service Workers to stable @@ -630,6 +650,63 @@ EXPECT_EQ(starting_tab_count, browser()->tab_strip_model()->count()); } +// Tests that worker ref count increments while extension API function is +// active. +IN_PROC_BROWSER_TEST_F(ServiceWorkerTest, WorkerRefCount) { + // Extensions APIs from SW are only enabled on trunk. + ScopedCurrentChannel current_channel_override(version_info::Channel::UNKNOWN); + const Extension* extension = LoadExtensionWithFlags( + test_data_dir_.AppendASCII("service_worker/api_worker_ref_count"), + kFlagNone); + ASSERT_TRUE(extension); + ui_test_utils::NavigateToURL(browser(), + extension->GetResourceURL("page.html")); + content::WebContents* web_contents = + browser()->tab_strip_model()->GetActiveWebContents(); + + ExtensionTestMessageListener worker_start_listener("WORKER STARTED", false); + worker_start_listener.set_failure_message("FAILURE"); + ASSERT_TRUE( + content::ExecuteScript(web_contents, "window.runServiceWorker()")); + ASSERT_TRUE(worker_start_listener.WaitUntilSatisfied()); + + // Service worker should have no pending requests because it hasn't peformed + // any extension API request yet. + EXPECT_EQ(0u, GetWorkerRefCount(extension->url())); + + ExtensionTestMessageListener worker_listener("CHECK_REF_COUNT", true); + worker_listener.set_failure_message("FAILURE"); + ASSERT_TRUE(content::ExecuteScript(web_contents, "window.testSendMessage()")); + ASSERT_TRUE(worker_listener.WaitUntilSatisfied()); + + // Service worker should have exactly one pending request because + // chrome.test.sendMessage() API call is in-flight. + EXPECT_EQ(1u, GetWorkerRefCount(extension->url())); + + // Peform another extension API request while one is ongoing. + { + ExtensionTestMessageListener listener("CHECK_REF_COUNT", true); + listener.set_failure_message("FAILURE"); + ASSERT_TRUE( + content::ExecuteScript(web_contents, "window.testSendMessage()")); + ASSERT_TRUE(listener.WaitUntilSatisfied()); + + // Service worker currently has two extension API requests in-flight. + EXPECT_EQ(2u, GetWorkerRefCount(extension->url())); + // Finish executing the nested chrome.test.sendMessage() first. + listener.Reply("Hello world"); + } + + ExtensionTestMessageListener extension_listener("SUCCESS", false); + extension_listener.set_failure_message("FAILURE"); + // Finish executing chrome.test.sendMessage(). + worker_listener.Reply("Hello world"); + ASSERT_TRUE(extension_listener.WaitUntilSatisfied()); + + // The ref count should drop to 0. + EXPECT_EQ(0u, GetWorkerRefCount(extension->url())); +} + // This test loads a web page that has an iframe pointing to a // chrome-extension:// URL. The URL is listed in the extension's // web_accessible_resources. Initially the iframe is served from the extension's
diff --git a/chrome/browser/history/history_utils.cc b/chrome/browser/history/history_utils.cc index cbb66d4f..1efb0ef8 100644 --- a/chrome/browser/history/history_utils.cc +++ b/chrome/browser/history/history_utils.cc
@@ -25,7 +25,7 @@ url.SchemeIs(dom_distiller::kDomDistillerScheme)) return false; - if (url == GURL(url::kAboutBlankURL)) + if (url == url::kAboutBlankURL) return false; return true;
diff --git a/chrome/browser/media/webrtc/native_desktop_media_list.cc b/chrome/browser/media/webrtc/native_desktop_media_list.cc index 1e4e54a..caa3a79 100644 --- a/chrome/browser/media/webrtc/native_desktop_media_list.cc +++ b/chrome/browser/media/webrtc/native_desktop_media_list.cc
@@ -185,13 +185,13 @@ case DesktopMediaID::TYPE_SCREEN: if (!screen_capturer_->SelectScreen(id.id)) continue; - screen_capturer_->Capture(webrtc::DesktopRegion()); + screen_capturer_->CaptureFrame(); break; case DesktopMediaID::TYPE_WINDOW: if (!window_capturer_->SelectWindow(id.id)) continue; - window_capturer_->Capture(webrtc::DesktopRegion()); + window_capturer_->CaptureFrame(); break; default:
diff --git a/chrome/browser/media/webrtc/native_desktop_media_list_unittest.cc b/chrome/browser/media/webrtc/native_desktop_media_list_unittest.cc index a627643e..29e42720 100644 --- a/chrome/browser/media/webrtc/native_desktop_media_list_unittest.cc +++ b/chrome/browser/media/webrtc/native_desktop_media_list_unittest.cc
@@ -66,7 +66,7 @@ // webrtc::ScreenCapturer implementation. void Start(Callback* callback) override { callback_ = callback; } - void Capture(const webrtc::DesktopRegion& region) override { + void CaptureFrame() override { DCHECK(callback_); std::unique_ptr<webrtc::DesktopFrame> frame( new webrtc::BasicDesktopFrame(webrtc::DesktopSize(10, 10))); @@ -115,7 +115,7 @@ // webrtc::WindowCapturer implementation. void Start(Callback* callback) override { callback_ = callback; } - void Capture(const webrtc::DesktopRegion& region) override { + void CaptureFrame() override { DCHECK(callback_); base::AutoLock lock(frame_values_lock_);
diff --git a/chrome/browser/mouseleave_browsertest.cc b/chrome/browser/mouseleave_browsertest.cc index fd9e8738..c0708666 100644 --- a/chrome/browser/mouseleave_browsertest.cc +++ b/chrome/browser/mouseleave_browsertest.cc
@@ -107,14 +107,14 @@ } #endif -#if defined(OS_MACOSX) +#if defined(OS_MACOSX) || defined(OS_WIN) // Test that a mouseleave is not triggered when showing the context menu. // If the test is failed, it means that Blink gets the mouseleave event // when showing the context menu and it could make the unexpecting // content behavior such as clearing the hover status. // Please refer to the below issue for understanding what happens . // TODO: Make test pass on OS_WIN and OS_MACOSX -// OS_WIN: http://crbug.com/450138 +// OS_WIN: Flaky. See http://crbug.com/656101. // OS_MACOSX: Missing automation provider support: http://crbug.com/45892. #define MAYBE_ContextMenu DISABLED_ContextMenu #else
diff --git a/chrome/browser/notifications/native_notification_display_service.cc b/chrome/browser/notifications/native_notification_display_service.cc index d7271b0..2de879d 100644 --- a/chrome/browser/notifications/native_notification_display_service.cc +++ b/chrome/browser/notifications/native_notification_display_service.cc
@@ -80,13 +80,13 @@ NotificationCommon::Type notification_type, const std::string& origin, const std::string& notification_id, - int action_index) { + int action_index, + const base::NullableString16& reply) { NotificationHandler* handler = GetNotificationHandler(notification_type); CHECK(handler); switch (operation) { case NotificationCommon::CLICK: - handler->OnClick(profile_, origin, notification_id, action_index, - base::NullableString16() /* reply */); + handler->OnClick(profile_, origin, notification_id, action_index, reply); break; case NotificationCommon::CLOSE: handler->OnClose(profile_, origin, notification_id, true /* by_user */);
diff --git a/chrome/browser/notifications/native_notification_display_service.h b/chrome/browser/notifications/native_notification_display_service.h index 211e221..e0240fe 100644 --- a/chrome/browser/notifications/native_notification_display_service.h +++ b/chrome/browser/notifications/native_notification_display_service.h
@@ -14,6 +14,10 @@ #include "chrome/browser/notifications/notification_common.h" #include "chrome/browser/notifications/notification_display_service.h" +namespace base { +class NullableString16; +} + class Notification; class NotificationHandler; class NotificationPlatformBridge; @@ -41,7 +45,8 @@ NotificationCommon::Type notification_type, const std::string& origin, const std::string& notification_id, - int action_index); + int action_index, + const base::NullableString16& reply); // Registers an implementation object to handle notification operations // for |notification_type|.
diff --git a/chrome/browser/notifications/notification_interactive_uitest.cc b/chrome/browser/notifications/notification_interactive_uitest.cc index ac99acb..611fdd44 100644 --- a/chrome/browser/notifications/notification_interactive_uitest.cc +++ b/chrome/browser/notifications/notification_interactive_uitest.cc
@@ -32,6 +32,7 @@ #include "chrome/browser/ui/browser_tabstrip.h" #include "chrome/browser/ui/browser_window.h" #include "chrome/browser/ui/exclusive_access/exclusive_access_context.h" +#include "chrome/browser/ui/exclusive_access/exclusive_access_manager.h" #include "chrome/browser/ui/tabs/tab_strip_model.h" #include "chrome/common/chrome_features.h" #include "chrome/test/base/in_process_browser_test.h"
diff --git a/chrome/browser/notifications/notification_platform_bridge_android.cc b/chrome/browser/notifications/notification_platform_bridge_android.cc index 5b279fe..ad1d3a5 100644 --- a/chrome/browser/notifications/notification_platform_bridge_android.cc +++ b/chrome/browser/notifications/notification_platform_bridge_android.cc
@@ -12,6 +12,7 @@ #include "base/command_line.h" #include "base/files/file_path.h" #include "base/logging.h" +#include "base/strings/nullable_string16.h" #include "base/strings/utf_string_conversions.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/notifications/native_notification_display_service.h" @@ -33,6 +34,7 @@ using base::android::AttachCurrentThread; using base::android::ConvertJavaStringToUTF8; +using base::android::ConvertJavaStringToUTF16; using base::android::ConvertUTF16ToJavaString; using base::android::ConvertUTF8ToJavaString; using base::android::JavaParamRef; @@ -71,6 +73,7 @@ const std::string& origin, const std::string& notification_id, int action_index, + const base::NullableString16& reply, Profile* profile) { if (!profile) { // TODO(miguelg): Add UMA for this condition. @@ -84,7 +87,7 @@ static_cast<NativeNotificationDisplayService*>(display_service) ->ProcessNotificationOperation(operation, notification_type, origin, - notification_id, action_index); + notification_id, action_index, reply); } } // namespace @@ -121,13 +124,19 @@ jboolean incognito, const JavaParamRef<jstring>& java_tag, const JavaParamRef<jstring>& java_webapk_package, - jint action_index) { + jint action_index, + const JavaParamRef<jstring>& java_reply) { std::string notification_id = ConvertJavaStringToUTF8(env, java_notification_id); std::string tag = ConvertJavaStringToUTF8(env, java_tag); std::string profile_id = ConvertJavaStringToUTF8(env, java_profile_id); std::string webapk_package = ConvertJavaStringToUTF8(env, java_webapk_package); + base::NullableString16 reply = + java_reply + ? base::NullableString16(ConvertJavaStringToUTF16(env, java_reply), + false /* is_null */) + : base::NullableString16(); GURL origin(ConvertJavaStringToUTF8(env, java_origin)); regenerated_notification_infos_[notification_id] = @@ -140,7 +149,7 @@ profile_id, incognito, base::Bind(&ProfileLoadedCallback, NotificationCommon::CLICK, NotificationCommon::PERSISTENT, origin.spec(), notification_id, - action_index)); + action_index, reply)); } void NotificationPlatformBridgeAndroid::OnNotificationClosed( @@ -167,7 +176,7 @@ base::Bind(&ProfileLoadedCallback, NotificationCommon::CLOSE, NotificationCommon::PERSISTENT, ConvertJavaStringToUTF8(env, java_origin), notification_id, - -1 /* action index */)); + -1 /* action index */, base::NullableString16() /* reply */)); } void NotificationPlatformBridgeAndroid::Display(
diff --git a/chrome/browser/notifications/notification_platform_bridge_android.h b/chrome/browser/notifications/notification_platform_bridge_android.h index ac0e6ed..301338de 100644 --- a/chrome/browser/notifications/notification_platform_bridge_android.h +++ b/chrome/browser/notifications/notification_platform_bridge_android.h
@@ -47,7 +47,8 @@ jboolean incognito, const base::android::JavaParamRef<jstring>& java_tag, const base::android::JavaParamRef<jstring>& java_webapk_package, - jint action_index); + jint action_index, + const base::android::JavaParamRef<jstring>& java_reply); // Called by the Java implementation when the notification has been closed. void OnNotificationClosed(
diff --git a/chrome/browser/notifications/notification_platform_bridge_mac.mm b/chrome/browser/notifications/notification_platform_bridge_mac.mm index 5890dc3..b32e39c 100644 --- a/chrome/browser/notifications/notification_platform_bridge_mac.mm +++ b/chrome/browser/notifications/notification_platform_bridge_mac.mm
@@ -12,6 +12,7 @@ #include "base/mac/foundation_util.h" #include "base/mac/mac_util.h" #include "base/mac/scoped_nsobject.h" +#include "base/strings/nullable_string16.h" #include "base/strings/string_number_conversions.h" #include "base/strings/sys_string_conversions.h" #include "chrome/browser/browser_process.h" @@ -75,7 +76,8 @@ static_cast<NativeNotificationDisplayService*>(display_service) ->ProcessNotificationOperation(operation, notification_type, origin, - notification_id, action_index); + notification_id, action_index, + base::NullableString16() /* reply */); } // Loads the profile and process the Notification response
diff --git a/chrome/browser/notifications/notification_test_util.cc b/chrome/browser/notifications/notification_test_util.cc index a04690e6..ad254f2 100644 --- a/chrome/browser/notifications/notification_test_util.cc +++ b/chrome/browser/notifications/notification_test_util.cc
@@ -6,6 +6,7 @@ #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/exclusive_access/exclusive_access_context.h" +#include "chrome/browser/ui/exclusive_access/exclusive_access_manager.h" #include "content/public/test/test_utils.h" MockNotificationDelegate::MockNotificationDelegate(const std::string& id)
diff --git a/chrome/browser/notifications/web_notification_delegate.cc b/chrome/browser/notifications/web_notification_delegate.cc index 6c64504e..8f2660b2 100644 --- a/chrome/browser/notifications/web_notification_delegate.cc +++ b/chrome/browser/notifications/web_notification_delegate.cc
@@ -12,6 +12,7 @@ #include "chrome/browser/ui/browser_list.h" #include "chrome/browser/ui/browser_window.h" #include "chrome/browser/ui/exclusive_access/exclusive_access_context.h" +#include "chrome/browser/ui/exclusive_access/exclusive_access_manager.h" #include "chrome/browser/ui/tabs/tab_strip_model.h" #include "content/public/browser/web_contents.h" #include "ui/message_center/notifier_settings.h"
diff --git a/chrome/browser/page_load_metrics/metrics_web_contents_observer.cc b/chrome/browser/page_load_metrics/metrics_web_contents_observer.cc index 937a8ed..c58e4d51 100644 --- a/chrome/browser/page_load_metrics/metrics_web_contents_observer.cc +++ b/chrome/browser/page_load_metrics/metrics_web_contents_observer.cc
@@ -65,8 +65,6 @@ "PageLoad.Internal.ClientRedirect.FirstPaintToNavigation"; const char kClientRedirectWithoutPaint[] = "PageLoad.Internal.ClientRedirect.NavigationWithoutPaint"; -const char kCommitToCompleteNoTimingIPCs[] = - "PageLoad.Internal.CommitToComplete.NoTimingIPCs"; const char kPageLoadCompletedAfterAppBackground[] = "PageLoad.Internal.PageLoadCompleted.AfterAppBackground"; @@ -302,8 +300,7 @@ : did_stop_tracking_(false), app_entered_background_(false), navigation_start_(navigation_handle->NavigationStart()), - url_(navigation_handle->GetURL()), - start_url_(url_), + start_url_(navigation_handle->GetURL()), abort_type_(ABORT_NONE), abort_user_initiated_(false), started_in_foreground_(in_foreground), @@ -337,7 +334,7 @@ if (did_stop_tracking_) return; - if (commit_time_.is_null()) { + if (committed_url_.is_empty()) { if (!failed_provisional_load_info_) RecordInternalError(ERR_NO_COMMIT_OR_FAILED_PROVISIONAL_LOAD); @@ -349,15 +346,13 @@ } } else if (timing_.IsEmpty()) { RecordInternalError(ERR_NO_IPCS_RECEIVED); - PAGE_LOAD_HISTOGRAM(internal::kCommitToCompleteNoTimingIPCs, - base::TimeTicks::Now() - commit_time_); } const PageLoadExtraInfo info = ComputePageLoadExtraInfo(); for (const auto& observer : observers_) { if (failed_provisional_load_info_) { observer->OnFailedProvisionalLoad(*failed_provisional_load_info_, info); - } else if (info.time_to_commit) { + } else if (!info.committed_url.is_empty()) { observer->OnComplete(timing_, info); } } @@ -379,7 +374,7 @@ } // The following is only executed for committing trackers. - DCHECK(!commit_time_.is_null()); + DCHECK(!committed_url_.is_empty()); // Note that histograms could be separated out by this commit's transition // type, but for simplicity they will all be bucketed together. @@ -452,11 +447,7 @@ } void PageLoadTracker::Commit(content::NavigationHandle* navigation_handle) { - // TODO(bmcquade): To improve accuracy, consider adding commit time to - // NavigationHandle. Taking a timestamp here should be close enough for now. - commit_time_ = base::TimeTicks::Now(); - ClampBrowserTimestampIfInterProcessTimeTickSkew(&commit_time_); - url_ = navigation_handle->GetURL(); + committed_url_ = navigation_handle->GetURL(); // Some transitions (like CLIENT_REDIRECT) are only known at commit time. page_transition_ = navigation_handle->GetPageTransition(); user_gesture_ = navigation_handle->HasUserGesture(); @@ -527,7 +518,7 @@ metadata_.behavior_flags; if (IsValidPageLoadTiming(new_timing) && valid_timing_descendent && valid_behavior_descendent) { - DCHECK(!commit_time_.is_null()); // OnCommit() must be called first. + DCHECK(!committed_url_.is_empty()); // OnCommit() must be called first. // There are some subtle ordering constraints here. GetPageLoadMetricsInfo() // must be called before DispatchObserverTimingCallbacks, but its // implementation depends on the state of metadata_, so we need to update @@ -598,7 +589,6 @@ base::Optional<base::TimeDelta> first_background_time; base::Optional<base::TimeDelta> first_foreground_time; base::Optional<base::TimeDelta> time_to_abort; - base::Optional<base::TimeDelta> time_to_commit; if (!background_time_.is_null()) { DCHECK_GE(background_time_, navigation_start_); @@ -617,18 +607,13 @@ DCHECK(abort_time_.is_null()); } - if (!commit_time_.is_null()) { - DCHECK_GE(commit_time_, navigation_start_); - time_to_commit = commit_time_ - navigation_start_; - } - // abort_type_ == ABORT_NONE implies !abort_user_initiated_. DCHECK(abort_type_ != ABORT_NONE || !abort_user_initiated_); return PageLoadExtraInfo( first_background_time, first_foreground_time, started_in_foreground_, - user_gesture_, commit_time_.is_null() ? GURL() : url_, start_url_, - time_to_commit, abort_type_, abort_user_initiated_, time_to_abort, - num_cache_requests_, num_network_requests_, metadata_); + user_gesture_, committed_url_, start_url_, abort_type_, + abort_user_initiated_, time_to_abort, num_cache_requests_, + num_network_requests_, metadata_); } void PageLoadTracker::NotifyAbort(UserAbortType abort_type, @@ -671,8 +656,8 @@ content::NavigationHandle* navigation_handle) { // Neither navigation should have committed. DCHECK(!navigation_handle->HasCommitted()); - DCHECK(commit_time_.is_null()); - return navigation_handle->GetURL() == url_; + DCHECK(committed_url_.is_empty()); + return navigation_handle->GetURL() == start_url_; } void PageLoadTracker::UpdateAbortInternal(UserAbortType abort_type,
diff --git a/chrome/browser/page_load_metrics/metrics_web_contents_observer.h b/chrome/browser/page_load_metrics/metrics_web_contents_observer.h index d52a54c..3d6daece 100644 --- a/chrome/browser/page_load_metrics/metrics_web_contents_observer.h +++ b/chrome/browser/page_load_metrics/metrics_web_contents_observer.h
@@ -201,8 +201,8 @@ // Only valid to call post-commit. const GURL& committed_url() const { - DCHECK(!commit_time_.is_null()); - return url_; + DCHECK(!committed_url_.is_empty()); + return committed_url_; } base::TimeTicks navigation_start() const { return navigation_start_; } @@ -242,13 +242,8 @@ // The navigation start in TimeTicks, not the wall time reported by Blink. const base::TimeTicks navigation_start_; - // Time this page load was committed. If this page load hasn't committed, - // |commit_time_| will be zero. - base::TimeTicks commit_time_; - - // The URL of this page load. This is the provisional url before commit - // (before redirects), and the committed url after commit. - GURL url_; + // The committed URL of this page load. + GURL committed_url_; // The start URL for this page load (before redirects). GURL start_url_;
diff --git a/chrome/browser/page_load_metrics/observers/core_page_load_metrics_observer.cc b/chrome/browser/page_load_metrics/observers/core_page_load_metrics_observer.cc index a1c27e2..5c0d8a0 100644 --- a/chrome/browser/page_load_metrics/observers/core_page_load_metrics_observer.cc +++ b/chrome/browser/page_load_metrics/observers/core_page_load_metrics_observer.cc
@@ -73,11 +73,6 @@ namespace internal { -const char kHistogramCommit[] = "PageLoad.Timing2.NavigationToCommit"; - -const char kBackgroundHistogramCommit[] = - "PageLoad.Timing2.NavigationToCommit.Background"; - const char kHistogramDomContentLoaded[] = "PageLoad.DocumentTiming.NavigationToDOMContentLoadedEventFired"; const char kBackgroundHistogramDomContentLoaded[] = @@ -558,14 +553,6 @@ void CorePageLoadMetricsObserver::RecordTimingHistograms( const page_load_metrics::PageLoadTiming& timing, const page_load_metrics::PageLoadExtraInfo& info) { - const base::TimeDelta time_to_commit = info.time_to_commit.value(); - if (WasStartedInForegroundOptionalEventInForeground(info.time_to_commit, - info)) { - PAGE_LOAD_HISTOGRAM(internal::kHistogramCommit, time_to_commit); - } else { - PAGE_LOAD_HISTOGRAM(internal::kBackgroundHistogramCommit, time_to_commit); - } - // Log time to first foreground / time to first background. Log counts that we // started a relevant page load in the foreground / background. if (!info.started_in_foreground) { @@ -594,9 +581,8 @@ rappor::RapporService* rappor_service = g_browser_process->rappor_service(); if (!rappor_service) return; - if (!info.time_to_commit) + if (info.committed_url.is_empty()) return; - DCHECK(!info.committed_url.is_empty()); // Log the eTLD+1 of sites that show poor loading performance. if (WasStartedInForegroundOptionalEventInForeground(
diff --git a/chrome/browser/page_load_metrics/observers/core_page_load_metrics_observer.h b/chrome/browser/page_load_metrics/observers/core_page_load_metrics_observer.h index d40f5f7..06094182 100644 --- a/chrome/browser/page_load_metrics/observers/core_page_load_metrics_observer.h +++ b/chrome/browser/page_load_metrics/observers/core_page_load_metrics_observer.h
@@ -13,7 +13,6 @@ // specified by the ".Background" suffix. For these events, we put them into the // background histogram if the web contents was ever in the background from // navigation start to the event in question. -extern const char kHistogramCommit[]; extern const char kHistogramFirstLayout[]; extern const char kHistogramFirstPaint[]; extern const char kHistogramFirstTextPaint[]; @@ -26,7 +25,6 @@ extern const char kHistogramParseBlockedOnScriptExecution[]; extern const char kHistogramParseStartToFirstMeaningfulPaint[]; -extern const char kBackgroundHistogramCommit[]; extern const char kBackgroundHistogramFirstLayout[]; extern const char kBackgroundHistogramFirstTextPaint[]; extern const char kBackgroundHistogramDomContentLoaded[];
diff --git a/chrome/browser/page_load_metrics/observers/core_page_load_metrics_observer_unittest.cc b/chrome/browser/page_load_metrics/observers/core_page_load_metrics_observer_unittest.cc index b36d82e..712466a 100644 --- a/chrome/browser/page_load_metrics/observers/core_page_load_metrics_observer_unittest.cc +++ b/chrome/browser/page_load_metrics/observers/core_page_load_metrics_observer_unittest.cc
@@ -53,13 +53,8 @@ SimulateTimingUpdate(timing); NavigateAndCommit(GURL(kDefaultTestUrlAnchor)); - // A same page navigation shouldn't trigger logging UMA for the original. - histogram_tester().ExpectTotalCount(internal::kHistogramCommit, 0); - // But we should keep the timing info and log it when we get another - // navigation. NavigateAndCommit(GURL(kDefaultTestUrl2)); - histogram_tester().ExpectTotalCount(internal::kHistogramCommit, 1); histogram_tester().ExpectTotalCount(internal::kHistogramDomContentLoaded, 0); histogram_tester().ExpectTotalCount(internal::kHistogramLoad, 0); histogram_tester().ExpectTotalCount(internal::kHistogramFirstLayout, 1); @@ -90,12 +85,9 @@ NavigateAndCommit(GURL(kDefaultTestUrl)); SimulateTimingUpdate(timing); - histogram_tester().ExpectTotalCount(internal::kHistogramCommit, 0); - // Navigate again to force histogram recording. NavigateAndCommit(GURL(kDefaultTestUrl2)); - histogram_tester().ExpectTotalCount(internal::kHistogramCommit, 1); histogram_tester().ExpectTotalCount(internal::kHistogramDomContentLoaded, 0); histogram_tester().ExpectTotalCount(internal::kHistogramLoad, 0); histogram_tester().ExpectTotalCount(internal::kHistogramFirstLayout, 1); @@ -152,8 +144,6 @@ NavigateAndCommit(GURL(kDefaultTestUrl)); - histogram_tester().ExpectTotalCount(internal::kHistogramCommit, 2); - histogram_tester().ExpectTotalCount(internal::kHistogramFirstLayout, 2); histogram_tester().ExpectBucketCount(internal::kHistogramFirstLayout, first_layout_1.InMilliseconds(), 1); @@ -197,7 +187,6 @@ // Navigate again to force histogram recording. NavigateAndCommit(GURL(kDefaultTestUrl2)); - histogram_tester().ExpectTotalCount(internal::kBackgroundHistogramCommit, 1); histogram_tester().ExpectTotalCount( internal::kBackgroundHistogramDomContentLoaded, 0); histogram_tester().ExpectTotalCount(internal::kBackgroundHistogramLoad, 0); @@ -209,54 +198,12 @@ histogram_tester().ExpectTotalCount( internal::kBackgroundHistogramFirstTextPaint, 0); - histogram_tester().ExpectTotalCount(internal::kHistogramCommit, 0); histogram_tester().ExpectTotalCount(internal::kHistogramDomContentLoaded, 0); histogram_tester().ExpectTotalCount(internal::kHistogramLoad, 0); histogram_tester().ExpectTotalCount(internal::kHistogramFirstLayout, 0); histogram_tester().ExpectTotalCount(internal::kHistogramFirstTextPaint, 0); } -TEST_F(CorePageLoadMetricsObserverTest, - BackgroundCommitHistogramClockResolutionNonDeterministic) { - base::TimeDelta first_layout = base::TimeDelta::FromMilliseconds(1); - - page_load_metrics::PageLoadTiming timing; - timing.navigation_start = base::Time::FromDoubleT(1); - timing.first_layout = first_layout; - PopulateRequiredTimingFields(&timing); - - // Start a provisional load. - GURL url(kDefaultTestUrl2); - content::RenderFrameHostTester* rfh_tester = - content::RenderFrameHostTester::For(main_rfh()); - rfh_tester->SimulateNavigationStart(url); - - // Background and then commit. - web_contents()->WasHidden(); - rfh_tester->SimulateNavigationCommit(url); - SimulateTimingUpdate(timing); - rfh_tester->SimulateNavigationStop(); - - page_load_metrics::PageLoadExtraInfo info = - GetPageLoadExtraInfoForCommittedLoad(); - - // Navigate again to force histograms to be logged. - NavigateAndCommit(GURL(kDefaultTestUrl)); - - // If the system clock is low resolution PageLoadTracker's commit_time_ may - // be = first_background_time_. - if (page_load_metrics::WasStartedInForegroundOptionalEventInForeground( - info.time_to_commit, info)) { - histogram_tester().ExpectTotalCount(internal::kBackgroundHistogramCommit, - 0); - histogram_tester().ExpectTotalCount(internal::kHistogramCommit, 1); - } else { - histogram_tester().ExpectTotalCount(internal::kBackgroundHistogramCommit, - 1); - histogram_tester().ExpectTotalCount(internal::kHistogramCommit, 0); - } -} - TEST_F(CorePageLoadMetricsObserverTest, OnlyBackgroundLaterEvents) { page_load_metrics::PageLoadTiming timing; timing.navigation_start = base::Time::FromDoubleT(1); @@ -287,8 +234,6 @@ // Navigate again to force histogram recording. NavigateAndCommit(GURL(kDefaultTestUrl2)); - histogram_tester().ExpectTotalCount(internal::kBackgroundHistogramCommit, 0); - if (page_load_metrics::WasStartedInForegroundOptionalEventInForeground( timing.dom_content_loaded_event_start, info)) { histogram_tester().ExpectTotalCount(internal::kHistogramDomContentLoaded, @@ -312,7 +257,6 @@ internal::kBackgroundHistogramFirstTextPaint, timing.first_text_paint.value().InMilliseconds(), 1); - histogram_tester().ExpectTotalCount(internal::kHistogramCommit, 1); histogram_tester().ExpectTotalCount(internal::kHistogramLoad, 0); histogram_tester().ExpectTotalCount(internal::kHistogramFirstTextPaint, 0); } @@ -342,7 +286,6 @@ // Navigate again to see if the timing updated for the foregrounded load. NavigateAndCommit(GURL(kDefaultTestUrl)); - histogram_tester().ExpectTotalCount(internal::kHistogramCommit, 1); histogram_tester().ExpectTotalCount(internal::kHistogramDomContentLoaded, 0); histogram_tester().ExpectTotalCount(internal::kHistogramLoad, 0); histogram_tester().ExpectTotalCount(internal::kHistogramFirstLayout, 1); @@ -359,7 +302,6 @@ rfh_tester->SimulateNavigationError(url, net::ERR_TIMED_OUT); rfh_tester->SimulateNavigationStop(); - histogram_tester().ExpectTotalCount(internal::kHistogramCommit, 0); histogram_tester().ExpectTotalCount(internal::kHistogramDomContentLoaded, 0); histogram_tester().ExpectTotalCount(internal::kHistogramLoad, 0); histogram_tester().ExpectTotalCount(internal::kHistogramFirstLayout, 0);
diff --git a/chrome/browser/page_load_metrics/observers/https_engagement_metrics/https_engagement_page_load_metrics_observer.cc b/chrome/browser/page_load_metrics/observers/https_engagement_metrics/https_engagement_page_load_metrics_observer.cc index d9722f2..94dc550 100644 --- a/chrome/browser/page_load_metrics/observers/https_engagement_metrics/https_engagement_page_load_metrics_observer.cc +++ b/chrome/browser/page_load_metrics/observers/https_engagement_metrics/https_engagement_page_load_metrics_observer.cc
@@ -45,8 +45,10 @@ void HttpsEngagementPageLoadMetricsObserver::OnComplete( const page_load_metrics::PageLoadTiming& timing, const page_load_metrics::PageLoadExtraInfo& extra_info) { - if (!extra_info.committed_url.is_valid() || !extra_info.time_to_commit) + if (!extra_info.committed_url.is_valid() || + extra_info.committed_url.is_empty()) { return; + } // Don't record anything if the user never saw it. if (!currently_in_foreground_ && foreground_time_.is_zero())
diff --git a/chrome/browser/page_load_metrics/page_load_metrics_browsertest.cc b/chrome/browser/page_load_metrics/page_load_metrics_browsertest.cc index 53b2055..aa2381b 100644 --- a/chrome/browser/page_load_metrics/page_load_metrics_browsertest.cc +++ b/chrome/browser/page_load_metrics/page_load_metrics_browsertest.cc
@@ -114,7 +114,6 @@ NavigateToUntrackedUrl(); // We expect one histogram sample for each navigation to title1.html. - histogram_tester_.ExpectTotalCount(internal::kHistogramCommit, 2); histogram_tester_.ExpectTotalCount(internal::kHistogramDomContentLoaded, 2); histogram_tester_.ExpectTotalCount(internal::kHistogramLoad, 2); histogram_tester_.ExpectTotalCount(internal::kHistogramFirstLayout, 2);
diff --git a/chrome/browser/page_load_metrics/page_load_metrics_observer.cc b/chrome/browser/page_load_metrics/page_load_metrics_observer.cc index 04fc547..effb9aa 100644 --- a/chrome/browser/page_load_metrics/page_load_metrics_observer.cc +++ b/chrome/browser/page_load_metrics/page_load_metrics_observer.cc
@@ -13,7 +13,6 @@ bool user_gesture, const GURL& committed_url, const GURL& start_url, - const base::Optional<base::TimeDelta>& time_to_commit, UserAbortType abort_type, bool abort_user_initiated, const base::Optional<base::TimeDelta>& time_to_abort, @@ -26,7 +25,6 @@ user_gesture(user_gesture), committed_url(committed_url), start_url(start_url), - time_to_commit(time_to_commit), abort_type(abort_type), abort_user_initiated(abort_user_initiated), time_to_abort(time_to_abort),
diff --git a/chrome/browser/page_load_metrics/page_load_metrics_observer.h b/chrome/browser/page_load_metrics/page_load_metrics_observer.h index bf5df59f..3ce5eaf8 100644 --- a/chrome/browser/page_load_metrics/page_load_metrics_observer.h +++ b/chrome/browser/page_load_metrics/page_load_metrics_observer.h
@@ -73,7 +73,6 @@ bool user_gesture, const GURL& committed_url, const GURL& start_url, - const base::Optional<base::TimeDelta>& time_to_commit, UserAbortType abort_type, bool abort_user_initiated, const base::Optional<base::TimeDelta>& time_to_abort, @@ -105,9 +104,6 @@ // The URL that started the navigation, before redirects. const GURL start_url; - // Time from navigation start until commit. - const base::Optional<base::TimeDelta> time_to_commit; - // The abort time and time to abort for this page load. If the page was not // aborted, |abort_type| will be |ABORT_NONE|. const UserAbortType abort_type; @@ -234,10 +230,10 @@ // the application may be killed at any time after this method is invoked // without further notification. Note that this may be called both for // provisional loads as well as committed loads. Implementations that only - // want to track committed loads should check extra_info.time_to_commit to - // determine if the load had committed. If the implementation returns - // CONTINUE_OBSERVING, this method may be called multiple times per observer, - // once for each time that the application enters the backround. + // want to track committed loads should check whether extra_info.committed_url + // is empty to determine if the load had committed. If the implementation + // returns CONTINUE_OBSERVING, this method may be called multiple times per + // observer, once for each time that the application enters the backround. // // The default implementation does nothing, and returns CONTINUE_OBSERVING. virtual ObservePolicy FlushMetricsOnAppEnterBackground(
diff --git a/chrome/browser/password_manager/native_backend_gnome_x_unittest.cc b/chrome/browser/password_manager/native_backend_gnome_x_unittest.cc index 0118504..1a34312 100644 --- a/chrome/browser/password_manager/native_backend_gnome_x_unittest.cc +++ b/chrome/browser/password_manager/native_backend_gnome_x_unittest.cc
@@ -1210,11 +1210,13 @@ PasswordStoreChangeList changes; BrowserThread::PostTaskAndReplyWithResult( BrowserThread::DB, FROM_HERE, - base::Bind(&NativeBackendGnome::DisableAutoSignInForOrigins, - base::Unretained(&backend), - base::Bind(&GURL::operator==, - base::Unretained(&form_facebook_.origin)), - &changes), + base::Bind( + &NativeBackendGnome::DisableAutoSignInForOrigins, + base::Unretained(&backend), + base::Bind( + static_cast<bool (*)(const GURL&, const GURL&)>(operator==), + form_facebook_.origin), + &changes), base::Bind(&CheckPasswordChangesWithResult, &expected_changes, &changes)); RunBothThreads();
diff --git a/chrome/browser/password_manager/native_backend_kwallet_x_unittest.cc b/chrome/browser/password_manager/native_backend_kwallet_x_unittest.cc index 7f8520f..7aaece0 100644 --- a/chrome/browser/password_manager/native_backend_kwallet_x_unittest.cc +++ b/chrome/browser/password_manager/native_backend_kwallet_x_unittest.cc
@@ -1029,11 +1029,13 @@ PasswordStoreChangeList changes; BrowserThread::PostTaskAndReplyWithResult( BrowserThread::DB, FROM_HERE, - base::Bind(&NativeBackendKWallet::DisableAutoSignInForOrigins, - base::Unretained(&backend), - base::Bind(&GURL::operator==, - base::Unretained(&form_google_.origin)), - &changes), + base::Bind( + &NativeBackendKWallet::DisableAutoSignInForOrigins, + base::Unretained(&backend), + base::Bind( + static_cast<bool (*)(const GURL&, const GURL&)>(operator==), + form_google_.origin), + &changes), base::Bind(&CheckPasswordChangesWithResult, &expected_changes, &changes)); RunDBThread();
diff --git a/chrome/browser/password_manager/native_backend_libsecret_unittest.cc b/chrome/browser/password_manager/native_backend_libsecret_unittest.cc index 50ee221e..e71a340a 100644 --- a/chrome/browser/password_manager/native_backend_libsecret_unittest.cc +++ b/chrome/browser/password_manager/native_backend_libsecret_unittest.cc
@@ -908,7 +908,8 @@ PasswordStoreChangeList changes; EXPECT_TRUE(backend.DisableAutoSignInForOrigins( - base::Bind(&GURL::operator==, base::Unretained(&form_facebook_.origin)), + base::Bind(static_cast<bool (*)(const GURL&, const GURL&)>(operator==), + form_facebook_.origin), &changes)); CheckPasswordChanges(expected_changes, changes);
diff --git a/chrome/browser/password_manager/password_store_mac_unittest.cc b/chrome/browser/password_manager/password_store_mac_unittest.cc index 9895e4f..96ae6b84 100644 --- a/chrome/browser/password_manager/password_store_mac_unittest.cc +++ b/chrome/browser/password_manager/password_store_mac_unittest.cc
@@ -1798,8 +1798,9 @@ EXPECT_FALSE(forms[1]->skip_zero_click); store()->DisableAutoSignInForOrigins( - base::Bind(&GURL::operator==, base::Unretained(&form_google->origin)), - base::Closure()); + base::Bind(static_cast<bool (*)(const GURL&, const GURL&)>(operator==), + form_google->origin), + base::Closure()); FinishAsyncProcessing(); EXPECT_TRUE(login_db()->GetAutoSignInLogins(&forms));
diff --git a/chrome/browser/plugins/chrome_plugin_service_filter.cc b/chrome/browser/plugins/chrome_plugin_service_filter.cc index a7728e97..cdb0cc8c 100644 --- a/chrome/browser/plugins/chrome_plugin_service_filter.cc +++ b/chrome/browser/plugins/chrome_plugin_service_filter.cc
@@ -12,6 +12,7 @@ #include "chrome/browser/chrome_notification_types.h" #include "chrome/browser/content_settings/host_content_settings_map_factory.h" #include "chrome/browser/engagement/site_engagement_service.h" +#include "chrome/browser/plugins/flash_temporary_permission_tracker.h" #include "chrome/browser/plugins/plugin_finder.h" #include "chrome/browser/plugins/plugin_metadata.h" #include "chrome/browser/plugins/plugin_utils.h" @@ -64,14 +65,15 @@ // ChromePluginServiceFilter inner struct definitions. struct ChromePluginServiceFilter::ContextInfo { - ContextInfo( - const scoped_refptr<PluginPrefs>& plugin_prefs, - const scoped_refptr<HostContentSettingsMap>& host_content_settings_map, - Profile* profile); + ContextInfo(scoped_refptr<PluginPrefs> pp, + scoped_refptr<HostContentSettingsMap> hcsm, + scoped_refptr<FlashTemporaryPermissionTracker> ftpm, + Profile* profile); ~ContextInfo(); scoped_refptr<PluginPrefs> plugin_prefs; scoped_refptr<HostContentSettingsMap> host_content_settings_map; + scoped_refptr<FlashTemporaryPermissionTracker> permission_tracker; ProfileContentSettingObserver observer; private: @@ -79,12 +81,14 @@ }; ChromePluginServiceFilter::ContextInfo::ContextInfo( - const scoped_refptr<PluginPrefs>& plugin_prefs, - const scoped_refptr<HostContentSettingsMap>& host_content_settings_map, + scoped_refptr<PluginPrefs> pp, + scoped_refptr<HostContentSettingsMap> hcsm, + scoped_refptr<FlashTemporaryPermissionTracker> ftpm, Profile* profile) - : plugin_prefs(plugin_prefs), - host_content_settings_map(host_content_settings_map), - observer(ProfileContentSettingObserver(profile)) { + : plugin_prefs(std::move(pp)), + host_content_settings_map(std::move(hcsm)), + permission_tracker(std::move(ftpm)), + observer(profile) { host_content_settings_map->AddObserver(&observer); } @@ -126,7 +130,7 @@ resource_context_map_[context] = base::MakeUnique<ContextInfo>( PluginPrefs::GetForProfile(profile), HostContentSettingsMapFactory::GetForProfile(profile), - profile); + FlashTemporaryPermissionTracker::Get(profile), profile); } void ChromePluginServiceFilter::UnregisterResourceContext( @@ -237,14 +241,19 @@ UMA_HISTOGRAM_COUNTS_100(kEngagementNoSettingHistogram, engagement); - // The content setting is neither ALLOW or BLOCK. Check whether the site - // meets the engagement cutoff for making Flash available without a prompt. - // This should only happen if the setting isn't being enforced by an - // enterprise policy. - if (is_managed || - engagement < PluginsFieldTrial::GetSiteEngagementThresholdForFlash()) { - return false; + // If the content setting is being managed by enterprise policy and is an + // ASK setting, we check to see if it has been temporarily granted. + if (is_managed) { + return context_info_it->second->permission_tracker->IsFlashEnabled( + main_frame_origin.GetURL()); } + + // If the content setting isn't managed by enterprise policy, but is ASK, + // check whether the site meets the engagement cutoff for making Flash + // available without a prompt.This should only happen if the setting isn't + // being enforced by an enterprise policy. + if (engagement < PluginsFieldTrial::GetSiteEngagementThresholdForFlash()) + return false; } return true;
diff --git a/chrome/browser/plugins/chrome_plugin_service_filter_unittest.cc b/chrome/browser/plugins/chrome_plugin_service_filter_unittest.cc index 78d11fc..db6684eb 100644 --- a/chrome/browser/plugins/chrome_plugin_service_filter_unittest.cc +++ b/chrome/browser/plugins/chrome_plugin_service_filter_unittest.cc
@@ -19,6 +19,7 @@ #include "chrome/browser/content_settings/host_content_settings_map_factory.h" #include "chrome/browser/engagement/site_engagement_score.h" #include "chrome/browser/engagement/site_engagement_service.h" +#include "chrome/browser/plugins/flash_temporary_permission_tracker.h" #include "chrome/browser/plugins/plugin_finder.h" #include "chrome/browser/plugins/plugin_metadata.h" #include "chrome/browser/plugins/plugin_prefs.h" @@ -396,10 +397,7 @@ incognito->GetResourceContext(), flash_plugin)); } -// If there is an enterprise managed setting, we fall back to the behavior that -// would occur if kPreferHtmlOverPlugins was disabled (i.e. click-to-play). -// Flash should be advertised to the page. -TEST_F(ChromePluginServiceFilterTest, C2PIfManagedSetting) { +TEST_F(ChromePluginServiceFilterTest, ManagedSetting) { content::WebPluginInfo flash_plugin( base::ASCIIToUTF16(content::kFlashPluginName), flash_plugin_path_, base::ASCIIToUTF16("1"), base::ASCIIToUTF16("The Flash plugin.")); @@ -413,19 +411,25 @@ map->SetDefaultContentSetting(CONTENT_SETTINGS_TYPE_PLUGINS, CONTENT_SETTING_DETECT_IMPORTANT_CONTENT); - SiteEngagementService* service = SiteEngagementService::Get(profile()); - GURL url("http://www.google.com"); - url::Origin main_frame_origin(url); - // 0 engagement would usually ensure that flash isn't advertised to the page. - service->ResetScoreForURL(url, 0); - EXPECT_FALSE(IsPluginAvailable( - url, main_frame_origin, profile()->GetResourceContext(), flash_plugin)); - - // Enterprise ASK setting should result in C2P behavior. syncable_prefs::TestingPrefServiceSyncable* prefs = profile()->GetTestingPrefService(); prefs->SetManagedPref(prefs::kManagedDefaultPluginsSetting, new base::FundamentalValue(CONTENT_SETTING_ASK)); + + SiteEngagementService* service = SiteEngagementService::Get(profile()); + GURL url("http://www.google.com"); + url::Origin main_frame_origin(url); + NavigateAndCommit(url); + + service->ResetScoreForURL(url, 30.0); + // Reaching 30.0 engagement would usually allow Flash, but not for enterprise. + service->ResetScoreForURL(url, 0); + EXPECT_FALSE(IsPluginAvailable( + url, main_frame_origin, profile()->GetResourceContext(), flash_plugin)); + + // Allow flash temporarily. + FlashTemporaryPermissionTracker::Get(profile())->FlashEnabledForWebContents( + web_contents()); EXPECT_TRUE(IsPluginAvailable(url, main_frame_origin, profile()->GetResourceContext(), flash_plugin)); }
diff --git a/chrome/browser/plugins/flash_permission_context.cc b/chrome/browser/plugins/flash_permission_context.cc index f0185c6c..d54b81fe 100644 --- a/chrome/browser/plugins/flash_permission_context.cc +++ b/chrome/browser/plugins/flash_permission_context.cc
@@ -6,8 +6,11 @@ #include "chrome/browser/content_settings/host_content_settings_map_factory.h" #include "chrome/browser/permissions/permission_request_id.h" +#include "chrome/browser/plugins/flash_temporary_permission_tracker.h" #include "chrome/browser/plugins/plugin_utils.h" #include "chrome/browser/plugins/plugins_field_trial.h" +#include "chrome/browser/profiles/profile.h" +#include "chrome/browser/ui/webui/site_settings_helper.h" #include "components/content_settings/core/browser/host_content_settings_map.h" #include "components/content_settings/core/common/content_settings_pattern.h" #include "content/public/browser/navigation_controller.h" @@ -15,6 +18,18 @@ #include "content/public/browser/web_contents.h" #include "url/origin.h" +namespace { + +bool PluginsEnterpriseSettingEnabled( + HostContentSettingsMap* host_content_settings_map) { + std::string provider_id; + host_content_settings_map->GetDefaultContentSetting( + CONTENT_SETTINGS_TYPE_PLUGINS, &provider_id); + return provider_id == site_settings::kPolicyProviderId; +} + +} // namespace + FlashPermissionContext::FlashPermissionContext(Profile* profile) : PermissionContextBase(profile, content::PermissionType::FLASH, @@ -31,7 +46,7 @@ host_content_settings_map, url::Origin(embedding_origin), requesting_origin, nullptr); flash_setting = PluginsFieldTrial::EffectiveContentSetting( - host_content_settings_map, CONTENT_SETTINGS_TYPE_PLUGINS, flash_setting); + host_content_settings_map, content_settings_type(), flash_setting); if (flash_setting == CONTENT_SETTING_DETECT_IMPORTANT_CONTENT) return CONTENT_SETTING_ASK; return flash_setting; @@ -42,11 +57,20 @@ bool allowed) { if (!allowed) return; - // Automatically refresh the page. + content::WebContents* web_contents = content::WebContents::FromRenderFrameHost( content::RenderFrameHost::FromID(id.render_process_id(), id.render_frame_id())); + + if (PluginsEnterpriseSettingEnabled( + HostContentSettingsMapFactory::GetForProfile(profile()))) { + // Enable the grant temporarily. + FlashTemporaryPermissionTracker::Get(profile())->FlashEnabledForWebContents( + web_contents); + } + + // Automatically refresh the page. web_contents->GetController().Reload(true /* check_for_repost */); } @@ -59,17 +83,22 @@ DCHECK(content_setting == CONTENT_SETTING_ALLOW || content_setting == CONTENT_SETTING_BLOCK); + HostContentSettingsMap* host_content_settings_map = + HostContentSettingsMapFactory::GetForProfile(profile()); + // If there is an enterprise ASK setting in effect, don't store the setting as + // it won't have any effect anyway. + if (PluginsEnterpriseSettingEnabled(host_content_settings_map)) + return; + // If the request was for a file scheme, allow or deny all file:/// URLs. ContentSettingsPattern pattern; if (embedding_origin.SchemeIsFile()) pattern = ContentSettingsPattern::FromString("file:///*"); else pattern = ContentSettingsPattern::FromURLNoWildcard(embedding_origin); - - HostContentSettingsMapFactory::GetForProfile(profile()) - ->SetContentSettingCustomScope( - pattern, ContentSettingsPattern::Wildcard(), content_settings_type(), - std::string(), content_setting); + host_content_settings_map->SetContentSettingCustomScope( + pattern, ContentSettingsPattern::Wildcard(), content_settings_type(), + std::string(), content_setting); } bool FlashPermissionContext::IsRestrictedToSecureOrigins() const {
diff --git a/chrome/browser/plugins/flash_temporary_permission_tracker.cc b/chrome/browser/plugins/flash_temporary_permission_tracker.cc new file mode 100644 index 0000000..a36340b --- /dev/null +++ b/chrome/browser/plugins/flash_temporary_permission_tracker.cc
@@ -0,0 +1,139 @@ +// 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/plugins/flash_temporary_permission_tracker.h" + +#include "base/memory/ptr_util.h" +#include "base/stl_util.h" +#include "chrome/browser/plugins/flash_temporary_permission_tracker_factory.h" +#include "chrome/browser/profiles/profile.h" +#include "content/public/browser/browser_thread.h" +#include "content/public/browser/navigation_handle.h" +#include "content/public/browser/plugin_service.h" +#include "content/public/browser/render_frame_host.h" +#include "content/public/browser/web_contents.h" +#include "content/public/browser/web_contents_observer.h" +#include "ui/base/page_transition_types.h" + +class FlashTemporaryPermissionTracker::GrantObserver + : content::WebContentsObserver { + public: + GrantObserver(content::WebContents* web_contents, + const GURL& origin, + FlashTemporaryPermissionTracker* owner); + + private: + // content::WebContentsObserver + void DidFinishNavigation( + content::NavigationHandle* navigation_handle) override; + void FrameDeleted(content::RenderFrameHost* render_frame_host) override; + void RenderFrameHostChanged(content::RenderFrameHost* old_host, + content::RenderFrameHost* new_host) override; + + GURL origin_; + content::RenderFrameHost* original_rfh_; + + bool refreshed_; + FlashTemporaryPermissionTracker* owner_; + + DISALLOW_COPY_AND_ASSIGN(GrantObserver); +}; + +// static +scoped_refptr<FlashTemporaryPermissionTracker> +FlashTemporaryPermissionTracker::Get(Profile* profile) { + return FlashTemporaryPermissionTrackerFactory::GetForProfile(profile); +} + +FlashTemporaryPermissionTracker::FlashTemporaryPermissionTracker( + Profile* profile) + : profile_(profile) {} + +FlashTemporaryPermissionTracker::~FlashTemporaryPermissionTracker() {} + +bool FlashTemporaryPermissionTracker::IsFlashEnabled(const GURL& url) { + base::AutoLock lock(granted_origins_lock_); + return base::ContainsKey(granted_origins_, url.GetOrigin()); +} + +void FlashTemporaryPermissionTracker::FlashEnabledForWebContents( + content::WebContents* web_contents) { + DCHECK_CURRENTLY_ON(content::BrowserThread::UI); + // In some infrequent circumstances (for example, if two permission bubbles + // were being displayed and answered) we may receive a grant for an origin + // that's already enabled. We just ignore the grant in this case. + GURL origin = web_contents->GetLastCommittedURL().GetOrigin(); + { + base::AutoLock lock(granted_origins_lock_); + if (!base::ContainsKey(granted_origins_, origin)) { + granted_origins_[origin] = + base::MakeUnique<GrantObserver>(web_contents, origin, this); + } + } + content::PluginService::GetInstance()->PurgePluginListCache(profile_, false); +} + +void FlashTemporaryPermissionTracker::RevokeAccess(const GURL& origin) { + { + base::AutoLock lock(granted_origins_lock_); + granted_origins_.erase(origin); + } + content::PluginService::GetInstance()->PurgePluginListCache(profile_, false); +} + +void FlashTemporaryPermissionTracker::ShutdownOnUIThread() { + DCHECK(granted_origins_.empty()); +} + +FlashTemporaryPermissionTracker::GrantObserver::GrantObserver( + content::WebContents* web_contents, + const GURL& origin, + FlashTemporaryPermissionTracker* owner) + : content::WebContentsObserver(web_contents), + origin_(origin), + original_rfh_(web_contents->GetMainFrame()), + refreshed_(false), + owner_(owner) {} + +void FlashTemporaryPermissionTracker::GrantObserver::DidFinishNavigation( + content::NavigationHandle* navigation_handle) { + // Ignore navigations not associated with the main frame. + if (!navigation_handle->IsInMainFrame()) + return; + + // Ignore unsuccesful navigations. + if (!navigation_handle->HasCommitted()) + return; + + // If the page has already refreshed once, revoke access. + if (refreshed_) { + owner_->RevokeAccess(origin_); + return; + } + + // Don't revoke access to the page if it is being refreshed. Refreshing the + // page happens as a part of answering the permission prompt so we don't + // want that to revoke access. We verify the refresh is happening on the + // same origin for security purposes. + if (navigation_handle->GetPageTransition() == ui::PAGE_TRANSITION_RELOAD && + origin_ == navigation_handle->GetURL().GetOrigin()) { + refreshed_ = true; + } else { + // All other navigation should revoke access. + owner_->RevokeAccess(origin_); + } +} + +void FlashTemporaryPermissionTracker::GrantObserver::FrameDeleted( + content::RenderFrameHost* render_frame_host) { + if (render_frame_host == original_rfh_) + owner_->RevokeAccess(origin_); +} + +void FlashTemporaryPermissionTracker::GrantObserver::RenderFrameHostChanged( + content::RenderFrameHost* old_host, + content::RenderFrameHost* new_host) { + if (old_host == original_rfh_) + owner_->RevokeAccess(origin_); +}
diff --git a/chrome/browser/plugins/flash_temporary_permission_tracker.h b/chrome/browser/plugins/flash_temporary_permission_tracker.h new file mode 100644 index 0000000..a7f23bb --- /dev/null +++ b/chrome/browser/plugins/flash_temporary_permission_tracker.h
@@ -0,0 +1,68 @@ +// 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_PLUGINS_FLASH_TEMPORARY_PERMISSION_TRACKER_H_ +#define CHROME_BROWSER_PLUGINS_FLASH_TEMPORARY_PERMISSION_TRACKER_H_ + +#include <map> + +#include "base/synchronization/lock.h" +#include "components/keyed_service/core/refcounted_keyed_service.h" +#include "url/gurl.h" + +class Profile; + +namespace content { +class WebContents; +} // namespace content + +// This class tracks temporary permission grants to allow flash to run on web +// pages. This is used when the enterprise plugins setting is set to ASK. After +// permission has been given to use flash, the page is automatically refreshed +// so we need to make sure we don't revoke access when the page is first +// refreshed. But any subsequent navigations or destroying the render frame +// should revoke access. |IsFlashEnabled| can be called from any thread. +class FlashTemporaryPermissionTracker : public RefcountedKeyedService { + public: + static scoped_refptr<FlashTemporaryPermissionTracker> Get(Profile* profile); + + // Returns true if flash is enabled for a given |url|. Can be called from any + // thread. + bool IsFlashEnabled(const GURL& url); + + // Call if flash was enabled in the main frame of a given |web_contents|. + // Must be called on the UI thread. + void FlashEnabledForWebContents(content::WebContents* web_contents); + + private: + friend class FlashTemporaryPermissionTrackerFactory; + friend class FlashTemporaryPermissionTrackerTest; + + class GrantObserver; + + explicit FlashTemporaryPermissionTracker(Profile* profile); + ~FlashTemporaryPermissionTracker() override; + + // Revoke access from the given origin. + void RevokeAccess(const GURL& origin); + + // RefCountedProfileKeyedBase method override. + void ShutdownOnUIThread() override; + + Profile* profile_; + + // We use GURLs to store the origins because we need to support the file: + // scheme comparing equal to itself. + // TODO(raymes): Revisit this after we decide what to do with plugins on file: + // URLs. + std::map<GURL, std::unique_ptr<GrantObserver>> granted_origins_; + + // Lock to protect |granted_origins_|. This is needed because IsFlashEnabled + // may be called from any thread via the ChromePluginServiceFilter. + base::Lock granted_origins_lock_; + + DISALLOW_COPY_AND_ASSIGN(FlashTemporaryPermissionTracker); +}; + +#endif // CHROME_BROWSER_PLUGINS_FLASH_TEMPORARY_PERMISSION_TRACKER_H_
diff --git a/chrome/browser/plugins/flash_temporary_permission_tracker_factory.cc b/chrome/browser/plugins/flash_temporary_permission_tracker_factory.cc new file mode 100644 index 0000000..b17d5e33 --- /dev/null +++ b/chrome/browser/plugins/flash_temporary_permission_tracker_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 "chrome/browser/plugins/flash_temporary_permission_tracker_factory.h" + +#include "chrome/browser/profiles/incognito_helpers.h" +#include "chrome/browser/profiles/profile.h" +#include "components/keyed_service/content/browser_context_dependency_manager.h" + +// static +scoped_refptr<FlashTemporaryPermissionTracker> +FlashTemporaryPermissionTrackerFactory::GetForProfile(Profile* profile) { + return static_cast<FlashTemporaryPermissionTracker*>( + GetInstance()->GetServiceForBrowserContext(profile, true).get()); +} + +// static +FlashTemporaryPermissionTrackerFactory* +FlashTemporaryPermissionTrackerFactory::GetInstance() { + return base::Singleton<FlashTemporaryPermissionTrackerFactory>::get(); +} + +FlashTemporaryPermissionTrackerFactory::FlashTemporaryPermissionTrackerFactory() + : RefcountedBrowserContextKeyedServiceFactory( + "FlashTemporaryPermissionTrackerFactory", + BrowserContextDependencyManager::GetInstance()) {} + +FlashTemporaryPermissionTrackerFactory:: + ~FlashTemporaryPermissionTrackerFactory() {} + +scoped_refptr<RefcountedKeyedService> +FlashTemporaryPermissionTrackerFactory::BuildServiceInstanceFor( + content::BrowserContext* context) const { + return new FlashTemporaryPermissionTracker( + Profile::FromBrowserContext(context)); +} + +content::BrowserContext* +FlashTemporaryPermissionTrackerFactory::GetBrowserContextToUse( + content::BrowserContext* context) const { + return chrome::GetBrowserContextOwnInstanceInIncognito(context); +}
diff --git a/chrome/browser/plugins/flash_temporary_permission_tracker_factory.h b/chrome/browser/plugins/flash_temporary_permission_tracker_factory.h new file mode 100644 index 0000000..5fc392f --- /dev/null +++ b/chrome/browser/plugins/flash_temporary_permission_tracker_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 CHROME_BROWSER_PLUGINS_FLASH_TEMPORARY_PERMISSION_TRACKER_FACTORY_H_ +#define CHROME_BROWSER_PLUGINS_FLASH_TEMPORARY_PERMISSION_TRACKER_FACTORY_H_ + +#include "base/macros.h" +#include "base/memory/ref_counted.h" +#include "base/memory/singleton.h" +#include "chrome/browser/plugins/flash_temporary_permission_tracker.h" +#include "components/keyed_service/content/refcounted_browser_context_keyed_service_factory.h" + +namespace content { +class BrowserContext; +} + +class FlashTemporaryPermissionTracker; +class Profile; + +class FlashTemporaryPermissionTrackerFactory + : public RefcountedBrowserContextKeyedServiceFactory { + public: + static scoped_refptr<FlashTemporaryPermissionTracker> GetForProfile( + Profile* profile); + static FlashTemporaryPermissionTrackerFactory* GetInstance(); + + private: + friend struct base::DefaultSingletonTraits< + FlashTemporaryPermissionTrackerFactory>; + + FlashTemporaryPermissionTrackerFactory(); + ~FlashTemporaryPermissionTrackerFactory() override; + + // RefcountedBrowserContextKeyedServiceFactory methods: + scoped_refptr<RefcountedKeyedService> BuildServiceInstanceFor( + content::BrowserContext* context) const override; + + // BrowserContextKeyedBaseFactory methods: + content::BrowserContext* GetBrowserContextToUse( + content::BrowserContext* context) const override; + + DISALLOW_COPY_AND_ASSIGN(FlashTemporaryPermissionTrackerFactory); +}; + +#endif // CHROME_BROWSER_PLUGINS_FLASH_TEMPORARY_PERMISSION_TRACKER_FACTORY_H_
diff --git a/chrome/browser/plugins/flash_temporary_permission_tracker_unittest.cc b/chrome/browser/plugins/flash_temporary_permission_tracker_unittest.cc new file mode 100644 index 0000000..5092fe9 --- /dev/null +++ b/chrome/browser/plugins/flash_temporary_permission_tracker_unittest.cc
@@ -0,0 +1,104 @@ +// 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/plugins/flash_temporary_permission_tracker.h" +#include "chrome/test/base/chrome_render_view_host_test_harness.h" +#include "chrome/test/base/testing_profile.h" +#include "content/public/browser/permission_type.h" +#include "content/public/browser/render_frame_host.h" +#include "content/public/browser/web_contents.h" +#include "content/public/test/test_renderer_host.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "url/gurl.h" + +namespace { + +const char* kOrigin1 = "https://google.com"; +const char* kOrigin2 = "https://maps.google.com"; +const char* kOrigin3 = "https://example.com"; + +} // namespace + +class FlashTemporaryPermissionTrackerTest + : public ChromeRenderViewHostTestHarness { + public: + void SetUp() override { + ChromeRenderViewHostTestHarness::SetUp(); + tracker_ = new FlashTemporaryPermissionTracker(profile()); + } + + protected: + FlashTemporaryPermissionTracker* tracker() { return tracker_.get(); } + + content::RenderFrameHost* GetMainRFH(const char* origin) { + content::RenderFrameHost* result = web_contents()->GetMainFrame(); + content::RenderFrameHostTester::For(result) + ->InitializeRenderFrameIfNeeded(); + content::RenderFrameHostTester::For(result)->SimulateNavigationCommit( + GURL(origin)); + return result; + } + + content::RenderFrameHost* AddChildRFH(content::RenderFrameHost* parent, + const char* origin) { + content::RenderFrameHost* result = + content::RenderFrameHostTester::For(parent)->AppendChild(""); + content::RenderFrameHostTester::For(result) + ->InitializeRenderFrameIfNeeded(); + content::RenderFrameHostTester::For(result)->SimulateNavigationCommit( + GURL(origin)); + return result; + } + + private: + scoped_refptr<FlashTemporaryPermissionTracker> tracker_; +}; + +TEST_F(FlashTemporaryPermissionTrackerTest, Basic) { + GetMainRFH(kOrigin1); + + // Flash shouldn't be enabled initially. + EXPECT_FALSE(tracker()->IsFlashEnabled(GURL(kOrigin1))); + tracker()->FlashEnabledForWebContents(web_contents()); + + // Flash should be enabled now. + EXPECT_TRUE(tracker()->IsFlashEnabled(GURL(kOrigin1))); + + // Refresh the page. + Reload(); + // Flash should still be enabled after a single refresh. + EXPECT_TRUE(tracker()->IsFlashEnabled(GURL(kOrigin1))); + + // Refresh again. + Reload(); + // Flash shouldn't be enabled anymore. + EXPECT_FALSE(tracker()->IsFlashEnabled(GURL(kOrigin1))); +} + +TEST_F(FlashTemporaryPermissionTrackerTest, NavigateAway) { + content::RenderFrameHost* rfh = GetMainRFH(kOrigin1); + + tracker()->FlashEnabledForWebContents(web_contents()); + Reload(); + EXPECT_TRUE(tracker()->IsFlashEnabled(GURL(kOrigin1))); + + // Navigate to another origin. Flash shouldn't be enabled anymore. + content::RenderFrameHostTester::For(rfh)->SimulateNavigationCommit( + GURL(kOrigin2)); + EXPECT_FALSE(tracker()->IsFlashEnabled(GURL(kOrigin1))); +} + +TEST_F(FlashTemporaryPermissionTrackerTest, NavigateChildFrame) { + content::RenderFrameHost* rfh = GetMainRFH(kOrigin1); + content::RenderFrameHost* child = AddChildRFH(rfh, kOrigin2); + + tracker()->FlashEnabledForWebContents(web_contents()); + Reload(); + EXPECT_TRUE(tracker()->IsFlashEnabled(GURL(kOrigin1))); + + // Navigate the child frame. Flash should still be enabled after this. + content::RenderFrameHostTester::For(child)->SimulateNavigationCommit( + GURL(kOrigin3)); + EXPECT_TRUE(tracker()->IsFlashEnabled(GURL(kOrigin1))); +}
diff --git a/chrome/browser/plugins/plugin_policy_handler.cc b/chrome/browser/plugins/plugin_policy_handler.cc new file mode 100644 index 0000000..06556d1 --- /dev/null +++ b/chrome/browser/plugins/plugin_policy_handler.cc
@@ -0,0 +1,119 @@ +// 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/plugins/plugin_policy_handler.h" + +#include <string> + +#include "base/memory/ptr_util.h" +#include "base/strings/pattern.h" +#include "base/strings/string_util.h" +#include "base/values.h" +#include "chrome/browser/plugins/plugin_prefs.h" +#include "chrome/common/chrome_content_client.h" +#include "chrome/common/pref_names.h" +#include "components/content_settings/core/common/pref_names.h" +#include "components/policy/core/browser/policy_error_map.h" +#include "components/strings/grit/components_strings.h" +#include "content/public/common/content_constants.h" + +namespace { + +const char kAdobeFlashPlayerName[] = "Adobe Flash Player"; + +// Retrieves a list typed policy or nullptr if not present or not a list. +const base::ListValue* GetListPolicy(const policy::PolicyMap& policies, + const std::string& policy) { + const base::Value* value = policies.GetValue(policy); + if (!value) + return nullptr; + + const base::ListValue* policy_value = nullptr; + value->GetAsList(&policy_value); + return policy_value; +} + +} // namespace + +PluginPolicyHandler::PluginPolicyHandler() {} + +PluginPolicyHandler::~PluginPolicyHandler() {} + +void PluginPolicyHandler::ProcessPolicy(const policy::PolicyMap& policies, + PrefValueMap* prefs, + const std::string& policy, + bool disable_pdf_plugin, + ContentSetting flash_content_setting) { + const base::ListValue* plugins = GetListPolicy(policies, policy); + if (!plugins) + return; + + const int size = plugins->GetSize(); + for (int i = 0; i < size; ++i) { + std::string plugin; + if (!plugins->GetString(i, &plugin)) + continue; + if (base::MatchPattern(ChromeContentClient::kPDFPluginName, plugin) && + !policies.GetValue(policy::key::kAlwaysOpenPdfExternally)) { + prefs->SetValue( + prefs::kPluginsAlwaysOpenPdfExternally, + base::MakeUnique<base::FundamentalValue>(disable_pdf_plugin)); + } + if ((base::MatchPattern(kAdobeFlashPlayerName, plugin) || + base::MatchPattern(content::kFlashPluginName, plugin)) && + !policies.GetValue(policy::key::kDefaultPluginsSetting)) { + prefs->SetValue( + prefs::kManagedDefaultPluginsSetting, + base::MakeUnique<base::FundamentalValue>(flash_content_setting)); + } + } +} + +bool PluginPolicyHandler::CheckPolicySettings(const policy::PolicyMap& policies, + policy::PolicyErrorMap* errors) { + const std::string checked_policies[] = { + policy::key::kEnabledPlugins, policy::key::kDisabledPlugins, + policy::key::kDisabledPluginsExceptions}; + bool ok = true; + for (size_t i = 0; i < arraysize(checked_policies); ++i) { + const base::Value* value = policies.GetValue(checked_policies[i]); + if (value && !value->IsType(base::Value::TYPE_LIST)) { + errors->AddError(checked_policies[i], IDS_POLICY_TYPE_ERROR, + base::Value::GetTypeName(base::Value::TYPE_LIST)); + ok = false; + } + } + return ok; +} + +void PluginPolicyHandler::ApplyPolicySettings(const policy::PolicyMap& policies, + PrefValueMap* prefs) { + // This order makes enabled plugins take precedence as is now. + ProcessPolicy(policies, prefs, policy::key::kDisabledPlugins, true, + CONTENT_SETTING_BLOCK); + ProcessPolicy(policies, prefs, policy::key::kEnabledPlugins, false, + CONTENT_SETTING_ALLOW); + + // Finally check if any of the two is in the exceptions list and remove the + // policy changes. + const base::ListValue* plugins = + GetListPolicy(policies, policy::key::kDisabledPluginsExceptions); + if (!plugins) + return; + const int size = plugins->GetSize(); + for (int i = 0; i < size; ++i) { + std::string plugin; + if (!plugins->GetString(i, &plugin)) + continue; + if (base::MatchPattern(ChromeContentClient::kPDFPluginName, plugin) && + !policies.GetValue(policy::key::kAlwaysOpenPdfExternally)) { + prefs->RemoveValue(prefs::kPluginsAlwaysOpenPdfExternally); + } + if ((base::MatchPattern(kAdobeFlashPlayerName, plugin) || + base::MatchPattern(content::kFlashPluginName, plugin)) && + !policies.GetValue(policy::key::kDefaultPluginsSetting)) { + prefs->RemoveValue(prefs::kManagedDefaultPluginsSetting); + } + } +}
diff --git a/chrome/browser/plugins/plugin_policy_handler.h b/chrome/browser/plugins/plugin_policy_handler.h new file mode 100644 index 0000000..2ef5863 --- /dev/null +++ b/chrome/browser/plugins/plugin_policy_handler.h
@@ -0,0 +1,44 @@ +// 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 CHROME_BROWSER_PLUGINS_PLUGIN_POLICY_HANDLER_H_ +#define CHROME_BROWSER_PLUGINS_PLUGIN_POLICY_HANDLER_H_ + +#include <map> +#include <set> +#include <vector> + +#include "base/macros.h" +#include "chrome/browser/plugins/plugin_prefs.h" +#include "components/content_settings/core/common/content_settings.h" +#include "components/policy/core/browser/configuration_policy_handler.h" +#include "components/policy/policy_constants.h" +#include "components/prefs/pref_value_map.h" + +// Migrates values of deprecated plugin policies into their new counterpars. +// It reads the set of EnabledPlugins and DisabledPlugins and updates the Flash +// default behavior and PDF plugin behavior. All other values in the list are +// ignored. +class PluginPolicyHandler : public policy::ConfigurationPolicyHandler { + public: + PluginPolicyHandler(); + ~PluginPolicyHandler() override; + + protected: + bool CheckPolicySettings(const policy::PolicyMap& policies, + policy::PolicyErrorMap* errors) override; + void ApplyPolicySettings(const policy::PolicyMap& policies, + PrefValueMap* prefs) override; + + private: + void ProcessPolicy(const policy::PolicyMap& policies, + PrefValueMap* prefs, + const std::string& policy, + bool disable_pdf_plugin, + ContentSetting flash_content_setting); + + DISALLOW_COPY_AND_ASSIGN(PluginPolicyHandler); +}; + +#endif // CHROME_BROWSER_PLUGINS_PLUGIN_POLICY_HANDLER_H_
diff --git a/chrome/browser/plugins/plugin_utils.cc b/chrome/browser/plugins/plugin_utils.cc index cb99e80..966da495 100644 --- a/chrome/browser/plugins/plugin_utils.cc +++ b/chrome/browser/plugins/plugin_utils.cc
@@ -5,7 +5,6 @@ #include "chrome/browser/plugins/plugin_utils.h" #include "base/values.h" -#include "chrome/browser/ui/webui/site_settings_helper.h" #include "chrome/common/chrome_features.h" #include "chrome/common/plugin_utils.h" #include "components/content_settings/core/browser/host_content_settings_map.h" @@ -113,17 +112,5 @@ // static bool PluginUtils::ShouldPreferHtmlOverPlugins( const HostContentSettingsMap* host_content_settings_map) { - std::string provider_id; - ContentSetting default_setting = - host_content_settings_map->GetDefaultContentSetting( - CONTENT_SETTINGS_TYPE_PLUGINS, &provider_id); - ALLOW_UNUSED_LOCAL(default_setting); - - // Working around a policy issue - do not allow PreferHtml if there is any - // policy for the plugin default setting. crbug.com/654072. - if (provider_id == site_settings::kPolicyProviderId) - return false; - - // Fine. No policy interferes. return base::FeatureList::IsEnabled(features::kPreferHtmlOverPlugins); }
diff --git a/chrome/browser/policy/cloud/component_cloud_policy_browsertest.cc b/chrome/browser/policy/cloud/component_cloud_policy_browsertest.cc index a22c7035..5e91066 100644 --- a/chrome/browser/policy/cloud/component_cloud_policy_browsertest.cc +++ b/chrome/browser/policy/cloud/component_cloud_policy_browsertest.cc
@@ -23,6 +23,7 @@ #include "components/policy/core/browser/browser_policy_connector.h" #include "components/policy/core/common/cloud/cloud_policy_constants.h" #include "components/policy/core/common/cloud/mock_cloud_policy_client.h" +#include "components/policy/core/common/cloud/policy_builder.h" #include "components/policy/core/common/policy_service.h" #include "components/policy/core/common/policy_switches.h" #include "components/policy/core/common/policy_test_utils.h" @@ -99,8 +100,8 @@ // ExtensionBrowserTest sets the login users to a non-managed value; // replace it. This is the default username sent in policy blobs from the // testserver. - command_line->AppendSwitchASCII( - ::chromeos::switches::kLoginUser, "user@example.com"); + command_line->AppendSwitchASCII(::chromeos::switches::kLoginUser, + PolicyBuilder::kFakeUsername); #endif } @@ -175,7 +176,8 @@ SigninManager* signin_manager = SigninManagerFactory::GetForProfile(browser()->profile()); ASSERT_TRUE(signin_manager); - signin_manager->SetAuthenticatedAccountInfo("12345", "user@example.com"); + signin_manager->SetAuthenticatedAccountInfo("12345", + PolicyBuilder::kFakeUsername); UserCloudPolicyManager* policy_manager = UserCloudPolicyManagerFactory::GetForBrowserContext(
diff --git a/chrome/browser/policy/configuration_policy_handler_list_factory.cc b/chrome/browser/policy/configuration_policy_handler_list_factory.cc index c0b7e83..a64f12c 100644 --- a/chrome/browser/policy/configuration_policy_handler_list_factory.cc +++ b/chrome/browser/policy/configuration_policy_handler_list_factory.cc
@@ -79,6 +79,10 @@ #include "extensions/common/manifest.h" #endif +#if defined(ENABLE_PLUGINS) +#include "chrome/browser/plugins/plugin_policy_handler.h" +#endif + #if defined(ENABLE_SPELLCHECK) #include "components/spellcheck/browser/pref_names.h" #endif @@ -138,15 +142,6 @@ { key::kApplicationLocaleValue, prefs::kApplicationLocale, base::Value::TYPE_STRING }, - { key::kDisabledPlugins, - prefs::kPluginsDisabledPlugins, - base::Value::TYPE_LIST }, - { key::kDisabledPluginsExceptions, - prefs::kPluginsDisabledPluginsExceptions, - base::Value::TYPE_LIST }, - { key::kEnabledPlugins, - prefs::kPluginsEnabledPlugins, - base::Value::TYPE_LIST }, { key::kAlwaysOpenPdfExternally, prefs::kPluginsAlwaysOpenPdfExternally, base::Value::TYPE_BOOLEAN }, @@ -539,8 +534,8 @@ { key::kArcBackupRestoreEnabled, prefs::kArcBackupRestoreEnabled, base::Value::TYPE_BOOLEAN }, - { key::kReportArcStatus, - prefs::kReportArcStatus, + { key::kReportArcStatusEnabled, + prefs::kReportArcStatusEnabled, base::Value::TYPE_BOOLEAN }, #endif // defined(OS_CHROMEOS) @@ -935,6 +930,10 @@ handlers->AddHandler(base::WrapUnique(new DefaultGeolocationPolicyHandler())); #endif // defined(OS_CHROMEOS) +#if defined(ENABLE_PLUGINS) + handlers->AddHandler(base::MakeUnique<PluginPolicyHandler>()); +#endif // defined(ENABLE_PLUGINS) + return handlers; }
diff --git a/chrome/browser/policy/policy_browsertest.cc b/chrome/browser/policy/policy_browsertest.cc index cf6c889..b50ff9e 100644 --- a/chrome/browser/policy/policy_browsertest.cc +++ b/chrome/browser/policy/policy_browsertest.cc
@@ -216,7 +216,7 @@ #include "components/arc/arc_bridge_service.h" #include "components/arc/arc_bridge_service_impl.h" #include "components/arc/arc_service_manager.h" -#include "components/arc/test/fake_arc_bridge_bootstrap.h" +#include "components/arc/test/fake_arc_session.h" #include "components/signin/core/account_id/account_id.h" #include "components/user_manager/user_manager.h" #include "ui/keyboard/keyboard_util.h" @@ -4191,8 +4191,8 @@ fake_session_manager_client_)); auto service = base::MakeUnique<arc::ArcBridgeServiceImpl>(); - service->SetArcBridgeBootstrapFactoryForTesting( - base::Bind(arc::FakeArcBridgeBootstrap::Create)); + service->SetArcSessionFactoryForTesting( + base::Bind(arc::FakeArcSession::Create)); arc::ArcServiceManager::SetArcBridgeServiceForTesting(std::move(service)); }
diff --git a/chrome/browser/policy/test/policy_testserver.py b/chrome/browser/policy/test/policy_testserver.py index 62b0ee4b..62ba27c 100644 --- a/chrome/browser/policy/test/policy_testserver.py +++ b/chrome/browser/policy/test/policy_testserver.py
@@ -919,7 +919,7 @@ else: # If the correct |username| is unknown, rely on a manually-configured # username from the configuration file or use a default. - policy_data.username = policy.get('policy_user', 'user@example.com') + policy_data.username = policy.get('policy_user', 'username@example.com') policy_data.device_id = token_info['device_id'] # Set affiliation IDs so that user was managed on the device.
diff --git a/chrome/browser/predictors/resource_prefetch_predictor_test_util.cc b/chrome/browser/predictors/resource_prefetch_predictor_test_util.cc index 3920d883..0f9bb81 100644 --- a/chrome/browser/predictors/resource_prefetch_predictor_test_util.cc +++ b/chrome/browser/predictors/resource_prefetch_predictor_test_util.cc
@@ -57,37 +57,36 @@ return data; } -void PrintTo(const PrefetchData& data, ::std::ostream* os) { - *os << "[" << data.primary_key() << "," << data.last_visit_time() << "]\n"; - for (const ResourceData& resource : data.resources()) { - *os << "\t\t"; - PrintTo(resource, os); - *os << "\n"; - } +std::ostream& operator<<(std::ostream& os, const PrefetchData& data) { + os << "[" << data.primary_key() << "," << data.last_visit_time() << "]" + << std::endl; + for (const ResourceData& resource : data.resources()) + os << "\t\t" << resource << std::endl; + return os; } -void PrintTo(const ResourceData& resource, ::std::ostream* os) { - *os << "[" << resource.resource_url() << "," << resource.resource_type() - << "," << resource.number_of_hits() << "," << resource.number_of_misses() - << "," << resource.consecutive_misses() << "," - << resource.average_position() << "," << resource.priority() << "," - << resource.has_validators() << "," << resource.always_revalidate() - << "]"; +std::ostream& operator<<(std::ostream& os, const ResourceData& resource) { + return os << "[" << resource.resource_url() << "," << resource.resource_type() + << "," << resource.number_of_hits() << "," + << resource.number_of_misses() << "," + << resource.consecutive_misses() << "," + << resource.average_position() << "," << resource.priority() << "," + << resource.has_validators() << "," << resource.always_revalidate() + << "]"; } -void PrintTo(const RedirectData& data, ::std::ostream* os) { - *os << "[" << data.primary_key() << "," << data.last_visit_time() << "]\n"; - for (const RedirectStat& redirect : data.redirect_endpoints()) { - *os << "\t\t"; - PrintTo(redirect, os); - *os << "\n"; - } +std::ostream& operator<<(std::ostream& os, const RedirectData& data) { + os << "[" << data.primary_key() << "," << data.last_visit_time() << "]" + << std::endl; + for (const RedirectStat& redirect : data.redirect_endpoints()) + os << "\t\t" << redirect << std::endl; + return os; } -void PrintTo(const RedirectStat& redirect, ::std::ostream* os) { - *os << "[" << redirect.url() << "," << redirect.number_of_hits() << "," - << redirect.number_of_misses() << "," << redirect.consecutive_misses() - << "]"; +std::ostream& operator<<(std::ostream& os, const RedirectStat& redirect) { + return os << "[" << redirect.url() << "," << redirect.number_of_hits() << "," + << redirect.number_of_misses() << "," + << redirect.consecutive_misses() << "]"; } bool operator==(const PrefetchData& lhs, const PrefetchData& rhs) {
diff --git a/chrome/browser/predictors/resource_prefetch_predictor_test_util.h b/chrome/browser/predictors/resource_prefetch_predictor_test_util.h index a86beb9b..daa3bd397 100644 --- a/chrome/browser/predictors/resource_prefetch_predictor_test_util.h +++ b/chrome/browser/predictors/resource_prefetch_predictor_test_util.h
@@ -33,10 +33,10 @@ uint64_t last_visit_time = 0); // For printing failures nicely. -void PrintTo(const PrefetchData& data, ::std::ostream* os); -void PrintTo(const ResourceData& resource, ::std::ostream* os); -void PrintTo(const RedirectData& data, ::std::ostream* os); -void PrintTo(const RedirectStat& redirect, ::std::ostream* os); +std::ostream& operator<<(std::ostream& stream, const PrefetchData& data); +std::ostream& operator<<(std::ostream& stream, const ResourceData& resource); +std::ostream& operator<<(std::ostream& stream, const RedirectData& data); +std::ostream& operator<<(std::ostream& stream, const RedirectStat& redirect); bool operator==(const PrefetchData& lhs, const PrefetchData& rhs); bool operator==(const ResourceData& lhs, const ResourceData& rhs);
diff --git a/chrome/browser/predictors/resource_prefetch_predictor_unittest.cc b/chrome/browser/predictors/resource_prefetch_predictor_unittest.cc index b1d4f16..61d34a59d 100644 --- a/chrome/browser/predictors/resource_prefetch_predictor_unittest.cc +++ b/chrome/browser/predictors/resource_prefetch_predictor_unittest.cc
@@ -10,7 +10,6 @@ #include "base/memory/ptr_util.h" #include "base/memory/ref_counted.h" -#include "base/message_loop/message_loop.h" #include "base/run_loop.h" #include "base/time/time.h" #include "chrome/browser/history/history_service_factory.h" @@ -20,7 +19,7 @@ #include "components/history/core/browser/history_service.h" #include "components/history/core/browser/history_types.h" #include "content/public/browser/resource_request_info.h" -#include "content/public/test/test_browser_thread.h" +#include "content/public/test/test_browser_thread_bundle.h" #include "net/http/http_response_headers.h" #include "net/url_request/url_request_context.h" #include "net/url_request/url_request_job.h" @@ -269,9 +268,7 @@ void InitializeSampleData(); - base::MessageLoop loop_; - content::TestBrowserThread ui_thread_; - content::TestBrowserThread db_thread_; + content::TestBrowserThreadBundle thread_bundle_; std::unique_ptr<TestingProfile> profile_; net::TestURLRequestContext url_request_context_; @@ -290,9 +287,7 @@ }; ResourcePrefetchPredictorTest::ResourcePrefetchPredictorTest() - : loop_(base::MessageLoop::TYPE_DEFAULT), - ui_thread_(content::BrowserThread::UI, &loop_), - db_thread_(content::BrowserThread::DB, &loop_), + : thread_bundle_(), profile_(new TestingProfile()), mock_tables_(new StrictMock<MockResourcePrefetchPredictorTables>()), empty_resource_data_(),
diff --git a/chrome/browser/prefs/browser_prefs.cc b/chrome/browser/prefs/browser_prefs.cc index 92b92d7..6159aa5 100644 --- a/chrome/browser/prefs/browser_prefs.cc +++ b/chrome/browser/prefs/browser_prefs.cc
@@ -78,6 +78,7 @@ #include "components/metrics/metrics_service.h" #include "components/network_time/network_time_tracker.h" #include "components/ntp_snippets/bookmarks/bookmark_suggestions_provider.h" +#include "components/ntp_snippets/content_suggestions_service.h" #include "components/ntp_snippets/remote/ntp_snippets_service.h" #include "components/ntp_snippets/remote/request_throttler.h" #include "components/ntp_snippets/sessions/foreign_sessions_suggestions_provider.h" @@ -485,6 +486,7 @@ ntp_snippets::ForeignSessionsSuggestionsProvider::RegisterProfilePrefs( registry); ntp_snippets::NTPSnippetsService::RegisterProfilePrefs(registry); + ntp_snippets::ContentSuggestionsService::RegisterProfilePrefs(registry); ntp_snippets::RequestThrottler::RegisterProfilePrefs(registry); ntp_snippets::UserClassifier::RegisterProfilePrefs(registry); password_bubble_experiment::RegisterPrefs(registry);
diff --git a/chrome/browser/prefs/chrome_command_line_pref_store.cc b/chrome/browser/prefs/chrome_command_line_pref_store.cc new file mode 100644 index 0000000..349e186 --- /dev/null +++ b/chrome/browser/prefs/chrome_command_line_pref_store.cc
@@ -0,0 +1,164 @@ +// 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/prefs/chrome_command_line_pref_store.h" + +#include <stddef.h> + +#include <string> +#include <utility> +#include <vector> + +#include "ash/common/ash_switches.h" +#include "base/files/file_path.h" +#include "base/logging.h" +#include "base/memory/ptr_util.h" +#include "base/strings/string_number_conversions.h" +#include "base/strings/string_split.h" +#include "base/values.h" +#include "build/build_config.h" +#include "chrome/common/chrome_switches.h" +#include "chrome/common/pref_names.h" +#include "components/data_reduction_proxy/core/common/data_reduction_proxy_pref_names.h" +#include "components/data_reduction_proxy/core/common/data_reduction_proxy_switches.h" +#include "components/proxy_config/proxy_config_dictionary.h" +#include "components/proxy_config/proxy_config_pref_names.h" +#include "components/ssl_config/ssl_config_prefs.h" +#include "components/ssl_config/ssl_config_switches.h" +#include "content/public/common/content_switches.h" +#include "ui/base/ui_base_switches.h" +#include "ui/display/display_switches.h" + +#if defined(OS_CHROMEOS) +#include "chromeos/chromeos_switches.h" +#endif + +const CommandLinePrefStore::SwitchToPreferenceMapEntry + ChromeCommandLinePrefStore::string_switch_map_[] = { + { switches::kLang, prefs::kApplicationLocale }, + { data_reduction_proxy::switches::kDataReductionProxy, + data_reduction_proxy::prefs::kDataReductionProxy }, + { switches::kAuthServerWhitelist, prefs::kAuthServerWhitelist }, + { switches::kSSLVersionMin, ssl_config::prefs::kSSLVersionMin }, + { switches::kSSLVersionMax, ssl_config::prefs::kSSLVersionMax }, +#if defined(OS_ANDROID) + { switches::kAuthAndroidNegotiateAccountType, + prefs::kAuthAndroidNegotiateAccountType }, +#endif +}; + +const CommandLinePrefStore::SwitchToPreferenceMapEntry + ChromeCommandLinePrefStore::path_switch_map_[] = { + { switches::kDiskCacheDir, prefs::kDiskCacheDir }, +}; + +const CommandLinePrefStore::BooleanSwitchToPreferenceMapEntry + ChromeCommandLinePrefStore::boolean_switch_map_[] = { + {switches::kDisable3DAPIs, prefs::kDisable3DAPIs, true}, + {switches::kEnableCloudPrintProxy, prefs::kCloudPrintProxyEnabled, + true}, + {switches::kAllowOutdatedPlugins, prefs::kPluginsAllowOutdated, true}, + {switches::kAlwaysAuthorizePlugins, prefs::kPluginsAlwaysAuthorize, + true}, + {switches::kNoPings, prefs::kEnableHyperlinkAuditing, false}, + {switches::kNoReferrers, prefs::kEnableReferrers, false}, + {switches::kAllowRunningInsecureContent, + prefs::kWebKitAllowRunningInsecureContent, true}, + {switches::kAllowCrossOriginAuthPrompt, + prefs::kAllowCrossOriginAuthPrompt, true}, + {switches::kDisablePrintPreview, prefs::kPrintPreviewDisabled, true}, +#if defined(OS_CHROMEOS) + {chromeos::switches::kEnableTouchpadThreeFingerClick, + prefs::kEnableTouchpadThreeFingerClick, true}, + {switches::kEnableUnifiedDesktop, + prefs::kUnifiedDesktopEnabledByDefault, true}, +#endif + {switches::kUnsafePacUrl, prefs::kPacHttpsUrlStrippingEnabled, false}, +}; + +const CommandLinePrefStore::SwitchToPreferenceMapEntry + ChromeCommandLinePrefStore::integer_switch_map_[] = { + { switches::kDiskCacheSize, prefs::kDiskCacheSize }, + { switches::kMediaCacheSize, prefs::kMediaCacheSize }, + }; + +ChromeCommandLinePrefStore::ChromeCommandLinePrefStore( + const base::CommandLine* command_line) + : CommandLinePrefStore(command_line) { + ApplySimpleSwitches(); + ApplyProxyMode(); + ValidateProxySwitches(); + ApplySSLSwitches(); + ApplyBackgroundModeSwitches(); +} + +ChromeCommandLinePrefStore::~ChromeCommandLinePrefStore() {} + +bool ChromeCommandLinePrefStore::ValidateProxySwitches() { + if (command_line()->HasSwitch(switches::kNoProxyServer) && + (command_line()->HasSwitch(switches::kProxyAutoDetect) || + command_line()->HasSwitch(switches::kProxyServer) || + command_line()->HasSwitch(switches::kProxyPacUrl) || + command_line()->HasSwitch(switches::kProxyBypassList))) { + LOG(WARNING) << "Additional command-line proxy switches specified when --" + << switches::kNoProxyServer << " was also specified."; + return false; + } + return true; +} + +void ChromeCommandLinePrefStore::ApplySimpleSwitches() { + // Look for each switch we know about and set its preference accordingly. + ApplyStringSwitches(string_switch_map_, arraysize(string_switch_map_)); + ApplyPathSwitches(path_switch_map_, arraysize(path_switch_map_)); + ApplyIntegerSwitches(integer_switch_map_, arraysize(integer_switch_map_)); + ApplyBooleanSwitches(boolean_switch_map_, arraysize(boolean_switch_map_)); +} + +void ChromeCommandLinePrefStore::ApplyProxyMode() { + if (command_line()->HasSwitch(switches::kNoProxyServer)) { + SetValue(proxy_config::prefs::kProxy, + base::WrapUnique(ProxyConfigDictionary::CreateDirect()), + WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS); + } else if (command_line()->HasSwitch(switches::kProxyPacUrl)) { + std::string pac_script_url = + command_line()->GetSwitchValueASCII(switches::kProxyPacUrl); + SetValue(proxy_config::prefs::kProxy, + base::WrapUnique( + ProxyConfigDictionary::CreatePacScript(pac_script_url, false)), + WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS); + } else if (command_line()->HasSwitch(switches::kProxyAutoDetect)) { + SetValue(proxy_config::prefs::kProxy, + base::WrapUnique(ProxyConfigDictionary::CreateAutoDetect()), + WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS); + } else if (command_line()->HasSwitch(switches::kProxyServer)) { + std::string proxy_server = + command_line()->GetSwitchValueASCII(switches::kProxyServer); + std::string bypass_list = + command_line()->GetSwitchValueASCII(switches::kProxyBypassList); + SetValue(proxy_config::prefs::kProxy, + base::WrapUnique(ProxyConfigDictionary::CreateFixedServers( + proxy_server, bypass_list)), + WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS); + } +} + +void ChromeCommandLinePrefStore::ApplySSLSwitches() { + if (command_line()->HasSwitch(switches::kCipherSuiteBlacklist)) { + std::unique_ptr<base::ListValue> list_value(new base::ListValue()); + list_value->AppendStrings(base::SplitString( + command_line()->GetSwitchValueASCII(switches::kCipherSuiteBlacklist), + ",", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL)); + SetValue(ssl_config::prefs::kCipherSuiteBlacklist, std::move(list_value), + WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS); + } +} + +void ChromeCommandLinePrefStore::ApplyBackgroundModeSwitches() { + if (command_line()->HasSwitch(switches::kDisableExtensions)) { + SetValue(prefs::kBackgroundModeEnabled, + base::MakeUnique<base::FundamentalValue>(false), + WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS); + } +}
diff --git a/chrome/browser/prefs/chrome_command_line_pref_store.h b/chrome/browser/prefs/chrome_command_line_pref_store.h new file mode 100644 index 0000000..a37280f --- /dev/null +++ b/chrome/browser/prefs/chrome_command_line_pref_store.h
@@ -0,0 +1,53 @@ +// 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 CHROME_BROWSER_PREFS_CHROME_COMMAND_LINE_PREF_STORE_H_ +#define CHROME_BROWSER_PREFS_CHROME_COMMAND_LINE_PREF_STORE_H_ + +#include "base/command_line.h" +#include "base/macros.h" +#include "base/values.h" +#include "components/prefs/command_line_pref_store.h" + +// This PrefStore keeps track of preferences set by command-line switches, +// such as proxy settings. +class ChromeCommandLinePrefStore : public CommandLinePrefStore { + public: + explicit ChromeCommandLinePrefStore(const base::CommandLine* command_line); + + protected: + ~ChromeCommandLinePrefStore() override; + + // Logs a message and returns false if the proxy switches are + // self-contradictory. Protected so it can be used in unit testing. + // TODO(bauerb): make this method public and remove the subclass, which calls + // this method, from the test. + bool ValidateProxySwitches(); + + private: + friend class TestCommandLinePrefStore; + + // Using the string and boolean maps, apply command-line switches to their + // corresponding preferences in this pref store. + void ApplySimpleSwitches(); + + // Determines the proxy mode preference from the given proxy switches. + void ApplyProxyMode(); + + // Apply the SSL/TLS preferences from the given switches. + void ApplySSLSwitches(); + + // Determines whether the background mode is force-disabled. + void ApplyBackgroundModeSwitches(); + + // Mappings of command line switches to prefs. + static const BooleanSwitchToPreferenceMapEntry boolean_switch_map_[]; + static const SwitchToPreferenceMapEntry string_switch_map_[]; + static const SwitchToPreferenceMapEntry path_switch_map_[]; + static const SwitchToPreferenceMapEntry integer_switch_map_[]; + + DISALLOW_COPY_AND_ASSIGN(ChromeCommandLinePrefStore); +}; + +#endif // CHROME_BROWSER_PREFS_CHROME_COMMAND_LINE_PREF_STORE_H_
diff --git a/chrome/browser/prefs/command_line_pref_store_proxy_unittest.cc b/chrome/browser/prefs/chrome_command_line_pref_store_proxy_unittest.cc similarity index 93% rename from chrome/browser/prefs/command_line_pref_store_proxy_unittest.cc rename to chrome/browser/prefs/chrome_command_line_pref_store_proxy_unittest.cc index 4b2fef7..a9c4649 100644 --- a/chrome/browser/prefs/command_line_pref_store_proxy_unittest.cc +++ b/chrome/browser/prefs/chrome_command_line_pref_store_proxy_unittest.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/prefs/command_line_pref_store.h" +#include "chrome/browser/prefs/chrome_command_line_pref_store.h" #include <gtest/gtest.h> #include <stddef.h> @@ -10,7 +10,6 @@ #include "base/command_line.h" #include "base/macros.h" #include "base/memory/ref_counted.h" -#include "chrome/browser/prefs/command_line_pref_store.h" #include "chrome/common/chrome_switches.h" #include "components/prefs/pref_registry_simple.h" #include "components/prefs/pref_service.h" @@ -153,10 +152,10 @@ } // namespace -class CommandLinePrefStoreProxyTest +class ChromeCommandLinePrefStoreProxyTest : public testing::TestWithParam<CommandLineTestParams> { protected: - CommandLinePrefStoreProxyTest() + ChromeCommandLinePrefStoreProxyTest() : command_line_(base::CommandLine::NO_PROGRAM) {} net::ProxyConfig* proxy_config() { return &proxy_config_; } @@ -173,7 +172,8 @@ scoped_refptr<PrefRegistrySimple> registry = new PrefRegistrySimple; PrefProxyConfigTrackerImpl::RegisterPrefs(registry.get()); syncable_prefs::PrefServiceMockFactory factory; - factory.set_command_line_prefs(new CommandLinePrefStore(&command_line_)); + factory.set_command_line_prefs( + new ChromeCommandLinePrefStore(&command_line_)); pref_service_ = factory.Create(registry.get()); PrefProxyConfigTrackerImpl::ReadPrefConfig(pref_service_.get(), &proxy_config_); @@ -185,12 +185,12 @@ net::ProxyConfig proxy_config_; }; -TEST_P(CommandLinePrefStoreProxyTest, CommandLine) { +TEST_P(ChromeCommandLinePrefStoreProxyTest, CommandLine) { EXPECT_EQ(GetParam().auto_detect, proxy_config()->auto_detect()); EXPECT_EQ(GetParam().pac_url, proxy_config()->pac_url()); EXPECT_TRUE(GetParam().proxy_rules.Matches(proxy_config()->proxy_rules())); } -INSTANTIATE_TEST_CASE_P(CommandLinePrefStoreProxyTestInstance, - CommandLinePrefStoreProxyTest, +INSTANTIATE_TEST_CASE_P(ChromeCommandLinePrefStoreProxyTestInstance, + ChromeCommandLinePrefStoreProxyTest, testing::ValuesIn(kCommandLineTestParams));
diff --git a/chrome/browser/prefs/command_line_pref_store_ssl_manager_unittest.cc b/chrome/browser/prefs/chrome_command_line_pref_store_ssl_manager_unittest.cc similarity index 95% rename from chrome/browser/prefs/command_line_pref_store_ssl_manager_unittest.cc rename to chrome/browser/prefs/chrome_command_line_pref_store_ssl_manager_unittest.cc index d349381..4f44d17 100644 --- a/chrome/browser/prefs/command_line_pref_store_ssl_manager_unittest.cc +++ b/chrome/browser/prefs/chrome_command_line_pref_store_ssl_manager_unittest.cc
@@ -2,16 +2,15 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "components/ssl_config/ssl_config_service_manager.h" - #include "base/command_line.h" #include "base/message_loop/message_loop.h" #include "base/threading/thread_task_runner_handle.h" -#include "chrome/browser/prefs/command_line_pref_store.h" +#include "chrome/browser/prefs/chrome_command_line_pref_store.h" #include "components/prefs/pref_registry_simple.h" #include "components/prefs/pref_service.h" #include "components/prefs/testing_pref_store.h" #include "components/ssl_config/ssl_config_prefs.h" +#include "components/ssl_config/ssl_config_service_manager.h" #include "components/ssl_config/ssl_config_switches.h" #include "components/syncable_prefs/pref_service_mock_factory.h" #include "net/ssl/ssl_config.h" @@ -41,7 +40,7 @@ syncable_prefs::PrefServiceMockFactory factory; factory.set_user_prefs(local_state_store); - factory.set_command_line_prefs(new CommandLinePrefStore(&command_line)); + factory.set_command_line_prefs(new ChromeCommandLinePrefStore(&command_line)); scoped_refptr<PrefRegistrySimple> registry = new PrefRegistrySimple; std::unique_ptr<PrefService> local_state(factory.Create(registry.get()));
diff --git a/chrome/browser/prefs/command_line_pref_store_unittest.cc b/chrome/browser/prefs/chrome_command_line_pref_store_unittest.cc similarity index 90% rename from chrome/browser/prefs/command_line_pref_store_unittest.cc rename to chrome/browser/prefs/chrome_command_line_pref_store_unittest.cc index 060d143..972232b 100644 --- a/chrome/browser/prefs/command_line_pref_store_unittest.cc +++ b/chrome/browser/prefs/chrome_command_line_pref_store_unittest.cc
@@ -10,7 +10,7 @@ #include "base/memory/ref_counted.h" #include "base/strings/string_util.h" #include "base/values.h" -#include "chrome/browser/prefs/command_line_pref_store.h" +#include "chrome/browser/prefs/chrome_command_line_pref_store.h" #include "chrome/common/chrome_switches.h" #include "chrome/common/pref_names.h" #include "components/proxy_config/proxy_config_dictionary.h" @@ -25,10 +25,10 @@ } // namespace -class TestCommandLinePrefStore : public CommandLinePrefStore { +class TestCommandLinePrefStore : public ChromeCommandLinePrefStore { public: explicit TestCommandLinePrefStore(base::CommandLine* cl) - : CommandLinePrefStore(cl) {} + : ChromeCommandLinePrefStore(cl) {} bool ProxySwitchesAreValid() { return ValidateProxySwitches(); @@ -67,10 +67,11 @@ }; // Tests a simple string pref on the command line. -TEST(CommandLinePrefStoreTest, SimpleStringPref) { +TEST(ChromeCommandLinePrefStoreTest, SimpleStringPref) { base::CommandLine cl(base::CommandLine::NO_PROGRAM); cl.AppendSwitchASCII(switches::kLang, "hi-MOM"); - scoped_refptr<CommandLinePrefStore> store = new CommandLinePrefStore(&cl); + scoped_refptr<ChromeCommandLinePrefStore> store = + new ChromeCommandLinePrefStore(&cl); const base::Value* actual = NULL; EXPECT_TRUE(store->GetValue(prefs::kApplicationLocale, &actual)); @@ -80,7 +81,7 @@ } // Tests a simple boolean pref on the command line. -TEST(CommandLinePrefStoreTest, SimpleBooleanPref) { +TEST(ChromeCommandLinePrefStoreTest, SimpleBooleanPref) { base::CommandLine cl(base::CommandLine::NO_PROGRAM); cl.AppendSwitch(switches::kNoProxyServer); scoped_refptr<TestCommandLinePrefStore> store = @@ -90,11 +91,12 @@ } // Tests a command line with no recognized prefs. -TEST(CommandLinePrefStoreTest, NoPrefs) { +TEST(ChromeCommandLinePrefStoreTest, NoPrefs) { base::CommandLine cl(base::CommandLine::NO_PROGRAM); cl.AppendSwitch(unknown_string); cl.AppendSwitchASCII(unknown_bool, "a value"); - scoped_refptr<CommandLinePrefStore> store = new CommandLinePrefStore(&cl); + scoped_refptr<ChromeCommandLinePrefStore> store = + new ChromeCommandLinePrefStore(&cl); const base::Value* actual = NULL; EXPECT_FALSE(store->GetValue(unknown_bool, &actual)); @@ -102,7 +104,7 @@ } // Tests a complex command line with multiple known and unknown switches. -TEST(CommandLinePrefStoreTest, MultipleSwitches) { +TEST(ChromeCommandLinePrefStoreTest, MultipleSwitches) { base::CommandLine cl(base::CommandLine::NO_PROGRAM); cl.AppendSwitch(unknown_string); cl.AppendSwitchASCII(switches::kProxyServer, "proxy"); @@ -132,7 +134,7 @@ } // Tests proxy switch validation. -TEST(CommandLinePrefStoreTest, ProxySwitchValidation) { +TEST(ChromeCommandLinePrefStoreTest, ProxySwitchValidation) { base::CommandLine cl(base::CommandLine::NO_PROGRAM); // No switches. @@ -163,7 +165,7 @@ EXPECT_TRUE(store4->ProxySwitchesAreValid()); } -TEST(CommandLinePrefStoreTest, ManualProxyModeInference) { +TEST(ChromeCommandLinePrefStoreTest, ManualProxyModeInference) { base::CommandLine cl1(base::CommandLine::NO_PROGRAM); cl1.AppendSwitch(unknown_string); cl1.AppendSwitchASCII(switches::kProxyServer, "proxy"); @@ -184,7 +186,7 @@ store3->VerifyProxyMode(ProxyPrefs::MODE_DIRECT); } -TEST(CommandLinePrefStoreTest, DisableSSLCipherSuites) { +TEST(ChromeCommandLinePrefStoreTest, DisableSSLCipherSuites) { base::CommandLine cl1(base::CommandLine::NO_PROGRAM); cl1.AppendSwitchASCII(switches::kCipherSuiteBlacklist, "0x0004,0x0005");
diff --git a/chrome/browser/prefs/chrome_pref_service_factory.cc b/chrome/browser/prefs/chrome_pref_service_factory.cc index dca3ba2..b8f36c9 100644 --- a/chrome/browser/prefs/chrome_pref_service_factory.cc +++ b/chrome/browser/prefs/chrome_pref_service_factory.cc
@@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include <chrome/browser/prefs/chrome_command_line_pref_store.h> #include "chrome/browser/prefs/chrome_pref_service_factory.h" #include <stddef.h> @@ -22,7 +23,6 @@ #include "build/build_config.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/prefs/chrome_pref_model_associator_client.h" -#include "chrome/browser/prefs/command_line_pref_store.h" #include "chrome/browser/prefs/profile_pref_store_manager.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/sync/glue/sync_start_util.h" @@ -440,7 +440,7 @@ factory->set_async(async); factory->set_extension_prefs(extension_prefs); factory->set_command_line_prefs(make_scoped_refptr( - new CommandLinePrefStore(base::CommandLine::ForCurrentProcess()))); + new ChromeCommandLinePrefStore(base::CommandLine::ForCurrentProcess()))); factory->set_read_error_callback(base::Bind(&HandleReadError, pref_filename)); factory->set_user_prefs(user_pref_store); factory->SetPrefModelAssociatorClient(
diff --git a/chrome/browser/prefs/chrome_pref_service_unittest.cc b/chrome/browser/prefs/chrome_pref_service_unittest.cc index 165f51df2..224b8d1 100644 --- a/chrome/browser/prefs/chrome_pref_service_unittest.cc +++ b/chrome/browser/prefs/chrome_pref_service_unittest.cc
@@ -12,7 +12,7 @@ #include "base/values.h" #include "build/build_config.h" #include "chrome/browser/prefs/browser_prefs.h" -#include "chrome/browser/prefs/command_line_pref_store.h" +#include "chrome/browser/prefs/chrome_command_line_pref_store.h" #include "chrome/common/chrome_paths.h" #include "chrome/common/chrome_switches.h" #include "chrome/common/pref_names.h" @@ -52,7 +52,7 @@ cmd_line.AppendSwitch(switches::kEnableCloudPrintProxy); // Call UpdateCommandLinePrefStore and check to see if the value has changed. - prefs.UpdateCommandLinePrefStore(new CommandLinePrefStore(&cmd_line)); + prefs.UpdateCommandLinePrefStore(new ChromeCommandLinePrefStore(&cmd_line)); pref = prefs.FindPreference(prefs::kCloudPrintProxyEnabled); ASSERT_TRUE(pref); value = pref->GetValue();
diff --git a/chrome/browser/prefs/command_line_pref_store.cc b/chrome/browser/prefs/command_line_pref_store.cc deleted file mode 100644 index cec0d4c1..0000000 --- a/chrome/browser/prefs/command_line_pref_store.cc +++ /dev/null
@@ -1,207 +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/prefs/command_line_pref_store.h" - -#include <stddef.h> - -#include <string> -#include <utility> -#include <vector> - -#include "ash/common/ash_switches.h" -#include "base/files/file_path.h" -#include "base/logging.h" -#include "base/macros.h" -#include "base/memory/ptr_util.h" -#include "base/strings/string_number_conversions.h" -#include "base/strings/string_split.h" -#include "base/values.h" -#include "build/build_config.h" -#include "chrome/common/chrome_switches.h" -#include "chrome/common/pref_names.h" -#include "components/data_reduction_proxy/core/common/data_reduction_proxy_pref_names.h" -#include "components/data_reduction_proxy/core/common/data_reduction_proxy_switches.h" -#include "components/proxy_config/proxy_config_dictionary.h" -#include "components/proxy_config/proxy_config_pref_names.h" -#include "components/ssl_config/ssl_config_prefs.h" -#include "components/ssl_config/ssl_config_switches.h" -#include "content/public/common/content_switches.h" -#include "ui/base/ui_base_switches.h" -#include "ui/display/display_switches.h" - -#if defined(OS_CHROMEOS) -#include "chromeos/chromeos_switches.h" -#endif - -const CommandLinePrefStore::StringSwitchToPreferenceMapEntry - CommandLinePrefStore::string_switch_map_[] = { - { switches::kLang, prefs::kApplicationLocale }, - { data_reduction_proxy::switches::kDataReductionProxy, - data_reduction_proxy::prefs::kDataReductionProxy }, - { switches::kAuthServerWhitelist, prefs::kAuthServerWhitelist }, - { switches::kSSLVersionMin, ssl_config::prefs::kSSLVersionMin }, - { switches::kSSLVersionMax, ssl_config::prefs::kSSLVersionMax }, -#if defined(OS_ANDROID) - { switches::kAuthAndroidNegotiateAccountType, - prefs::kAuthAndroidNegotiateAccountType }, -#endif -}; - -const CommandLinePrefStore::PathSwitchToPreferenceMapEntry - CommandLinePrefStore::path_switch_map_[] = { - { switches::kDiskCacheDir, prefs::kDiskCacheDir }, -}; - -const CommandLinePrefStore::BooleanSwitchToPreferenceMapEntry - CommandLinePrefStore::boolean_switch_map_[] = { - {switches::kDisable3DAPIs, prefs::kDisable3DAPIs, true}, - {switches::kEnableCloudPrintProxy, prefs::kCloudPrintProxyEnabled, - true}, - {switches::kAllowOutdatedPlugins, prefs::kPluginsAllowOutdated, true}, - {switches::kAlwaysAuthorizePlugins, prefs::kPluginsAlwaysAuthorize, - true}, - {switches::kNoPings, prefs::kEnableHyperlinkAuditing, false}, - {switches::kNoReferrers, prefs::kEnableReferrers, false}, - {switches::kAllowRunningInsecureContent, - prefs::kWebKitAllowRunningInsecureContent, true}, - {switches::kAllowCrossOriginAuthPrompt, - prefs::kAllowCrossOriginAuthPrompt, true}, - {switches::kDisablePrintPreview, prefs::kPrintPreviewDisabled, true}, -#if defined(OS_CHROMEOS) - {chromeos::switches::kEnableTouchpadThreeFingerClick, - prefs::kEnableTouchpadThreeFingerClick, true}, - {switches::kEnableUnifiedDesktop, - prefs::kUnifiedDesktopEnabledByDefault, true}, -#endif - {switches::kUnsafePacUrl, prefs::kPacHttpsUrlStrippingEnabled, false}, -}; - -const CommandLinePrefStore::IntegerSwitchToPreferenceMapEntry - CommandLinePrefStore::integer_switch_map_[] = { - { switches::kDiskCacheSize, prefs::kDiskCacheSize }, - { switches::kMediaCacheSize, prefs::kMediaCacheSize }, - }; - -CommandLinePrefStore::CommandLinePrefStore( - const base::CommandLine* command_line) - : command_line_(command_line) { - ApplySimpleSwitches(); - ApplyProxyMode(); - ValidateProxySwitches(); - ApplySSLSwitches(); - ApplyBackgroundModeSwitches(); -} - -CommandLinePrefStore::~CommandLinePrefStore() {} - -bool CommandLinePrefStore::ValidateProxySwitches() { - if (command_line_->HasSwitch(switches::kNoProxyServer) && - (command_line_->HasSwitch(switches::kProxyAutoDetect) || - command_line_->HasSwitch(switches::kProxyServer) || - command_line_->HasSwitch(switches::kProxyPacUrl) || - command_line_->HasSwitch(switches::kProxyBypassList))) { - LOG(WARNING) << "Additional command-line proxy switches specified when --" - << switches::kNoProxyServer << " was also specified."; - return false; - } - return true; -} - -void CommandLinePrefStore::ApplySimpleSwitches() { - // Look for each switch we know about and set its preference accordingly. - for (size_t i = 0; i < arraysize(string_switch_map_); ++i) { - if (command_line_->HasSwitch(string_switch_map_[i].switch_name)) { - SetValue(string_switch_map_[i].preference_path, - base::MakeUnique<base::StringValue>( - command_line_->GetSwitchValueASCII( - string_switch_map_[i].switch_name)), - WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS); - } - } - - for (size_t i = 0; i < arraysize(path_switch_map_); ++i) { - if (command_line_->HasSwitch(path_switch_map_[i].switch_name)) { - SetValue( - path_switch_map_[i].preference_path, - base::MakeUnique<base::StringValue>( - command_line_->GetSwitchValuePath(path_switch_map_[i].switch_name) - .value()), - WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS); - } - } - - for (size_t i = 0; i < arraysize(integer_switch_map_); ++i) { - if (command_line_->HasSwitch(integer_switch_map_[i].switch_name)) { - std::string str_value = command_line_->GetSwitchValueASCII( - integer_switch_map_[i].switch_name); - int int_value = 0; - if (!base::StringToInt(str_value, &int_value)) { - LOG(ERROR) << "The value " << str_value << " of " - << integer_switch_map_[i].switch_name - << " can not be converted to integer, ignoring!"; - continue; - } - SetValue(integer_switch_map_[i].preference_path, - base::MakeUnique<base::FundamentalValue>(int_value), - WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS); - } - } - - for (size_t i = 0; i < arraysize(boolean_switch_map_); ++i) { - if (command_line_->HasSwitch(boolean_switch_map_[i].switch_name)) { - SetValue(boolean_switch_map_[i].preference_path, - base::MakeUnique<base::FundamentalValue>( - boolean_switch_map_[i].set_value), - WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS); - } - } -} - -void CommandLinePrefStore::ApplyProxyMode() { - if (command_line_->HasSwitch(switches::kNoProxyServer)) { - SetValue(proxy_config::prefs::kProxy, - base::WrapUnique(ProxyConfigDictionary::CreateDirect()), - WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS); - } else if (command_line_->HasSwitch(switches::kProxyPacUrl)) { - std::string pac_script_url = - command_line_->GetSwitchValueASCII(switches::kProxyPacUrl); - SetValue(proxy_config::prefs::kProxy, - base::WrapUnique( - ProxyConfigDictionary::CreatePacScript(pac_script_url, false)), - WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS); - } else if (command_line_->HasSwitch(switches::kProxyAutoDetect)) { - SetValue(proxy_config::prefs::kProxy, - base::WrapUnique(ProxyConfigDictionary::CreateAutoDetect()), - WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS); - } else if (command_line_->HasSwitch(switches::kProxyServer)) { - std::string proxy_server = - command_line_->GetSwitchValueASCII(switches::kProxyServer); - std::string bypass_list = - command_line_->GetSwitchValueASCII(switches::kProxyBypassList); - SetValue(proxy_config::prefs::kProxy, - base::WrapUnique(ProxyConfigDictionary::CreateFixedServers( - proxy_server, bypass_list)), - WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS); - } -} - -void CommandLinePrefStore::ApplySSLSwitches() { - if (command_line_->HasSwitch(switches::kCipherSuiteBlacklist)) { - std::unique_ptr<base::ListValue> list_value(new base::ListValue()); - list_value->AppendStrings(base::SplitString( - command_line_->GetSwitchValueASCII(switches::kCipherSuiteBlacklist), - ",", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL)); - SetValue(ssl_config::prefs::kCipherSuiteBlacklist, std::move(list_value), - WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS); - } -} - -void CommandLinePrefStore::ApplyBackgroundModeSwitches() { - if (command_line_->HasSwitch(switches::kDisableExtensions)) { - SetValue(prefs::kBackgroundModeEnabled, - base::MakeUnique<base::FundamentalValue>(false), - WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS); - } -}
diff --git a/chrome/browser/prefs/command_line_pref_store.h b/chrome/browser/prefs/command_line_pref_store.h deleted file mode 100644 index 735adb6f..0000000 --- a/chrome/browser/prefs/command_line_pref_store.h +++ /dev/null
@@ -1,77 +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_PREFS_COMMAND_LINE_PREF_STORE_H_ -#define CHROME_BROWSER_PREFS_COMMAND_LINE_PREF_STORE_H_ - -#include "base/command_line.h" -#include "base/macros.h" -#include "base/values.h" -#include "components/prefs/value_map_pref_store.h" - -// This PrefStore keeps track of preferences set by command-line switches, -// such as proxy settings. -class CommandLinePrefStore : public ValueMapPrefStore { - public: - explicit CommandLinePrefStore(const base::CommandLine* command_line); - - protected: - ~CommandLinePrefStore() override; - - // Logs a message and returns false if the proxy switches are - // self-contradictory. Protected so it can be used in unit testing. - bool ValidateProxySwitches(); - - private: - friend class TestCommandLinePrefStore; - - struct StringSwitchToPreferenceMapEntry { - const char* switch_name; - const char* preference_path; - }; - - struct PathSwitchToPreferenceMapEntry { - const char* switch_name; - const char* preference_path; - }; - - struct IntegerSwitchToPreferenceMapEntry { - const char* switch_name; - const char* preference_path; - }; - - // |set_value| indicates what the preference should be set to if the switch - // is present. - struct BooleanSwitchToPreferenceMapEntry { - const char* switch_name; - const char* preference_path; - bool set_value; - }; - - // Using the string and boolean maps, apply command-line switches to their - // corresponding preferences in this pref store. - void ApplySimpleSwitches(); - - // Determines the proxy mode preference from the given proxy switches. - void ApplyProxyMode(); - - // Apply the SSL/TLS preferences from the given switches. - void ApplySSLSwitches(); - - // Determines whether the background mode is force-disabled. - void ApplyBackgroundModeSwitches(); - - // Weak reference. - const base::CommandLine* command_line_; - - // Mappings of command line switches to prefs. - static const BooleanSwitchToPreferenceMapEntry boolean_switch_map_[]; - static const StringSwitchToPreferenceMapEntry string_switch_map_[]; - static const PathSwitchToPreferenceMapEntry path_switch_map_[]; - static const IntegerSwitchToPreferenceMapEntry integer_switch_map_[]; - - DISALLOW_COPY_AND_ASSIGN(CommandLinePrefStore); -}; - -#endif // CHROME_BROWSER_PREFS_COMMAND_LINE_PREF_STORE_H_
diff --git a/chrome/browser/prefs/proxy_policy_unittest.cc b/chrome/browser/prefs/proxy_policy_unittest.cc index 0d05a0a..8ba2ada89 100644 --- a/chrome/browser/prefs/proxy_policy_unittest.cc +++ b/chrome/browser/prefs/proxy_policy_unittest.cc
@@ -13,7 +13,7 @@ #include "base/message_loop/message_loop.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/prefs/browser_prefs.h" -#include "chrome/browser/prefs/command_line_pref_store.h" +#include "chrome/browser/prefs/chrome_command_line_pref_store.h" #include "chrome/common/chrome_switches.h" #include "components/policy/core/common/external_data_fetcher.h" #include "components/policy/core/common/mock_configuration_policy_provider.h" @@ -104,7 +104,8 @@ std::unique_ptr<PrefService> CreatePrefService(bool with_managed_policies) { syncable_prefs::PrefServiceMockFactory factory; - factory.set_command_line_prefs(new CommandLinePrefStore(&command_line_)); + factory.set_command_line_prefs( + new ChromeCommandLinePrefStore(&command_line_)); if (with_managed_policies) { factory.SetManagedPolicies(policy_service_.get(), g_browser_process->browser_policy_connector());
diff --git a/chrome/browser/prerender/prerender_nostate_prefetch_browsertest.cc b/chrome/browser/prerender/prerender_nostate_prefetch_browsertest.cc index a5234a3..1c47edb 100644 --- a/chrome/browser/prerender/prerender_nostate_prefetch_browsertest.cc +++ b/chrome/browser/prerender/prerender_nostate_prefetch_browsertest.cc
@@ -6,7 +6,6 @@ #include "base/strings/string16.h" #include "base/strings/string_split.h" #include "base/task_scheduler/post_task.h" -#include "base/threading/platform_thread.h" // For |Sleep()|. #include "chrome/browser/prerender/prerender_manager.h" #include "chrome/browser/prerender/prerender_manager_factory.h" #include "chrome/browser/prerender/prerender_test_utils.h" @@ -77,9 +76,12 @@ const char kPrefetchJpeg[] = "prerender/image.jpeg"; const char kPrefetchLoaderPath[] = "/prerender/prefetch_loader.html"; const char kPrefetchLoopPage[] = "prerender/prefetch_loop.html"; +const char kPrefetchMetaCSP[] = "prerender/prefetch_meta_csp.html"; const char kPrefetchPage[] = "prerender/prefetch_page.html"; const char kPrefetchPage2[] = "prerender/prefetch_page2.html"; const char kPrefetchPng[] = "prerender/image.png"; +const char kPrefetchResponseHeaderCSP[] = + "prerender/prefetch_response_csp.html"; const char kPrefetchScript[] = "prerender/prefetch.js"; const char kPrefetchScript2[] = "prerender/prefetch2.js"; const char kPrefetchSubresourceRedirectPage[] = @@ -148,13 +150,13 @@ base::FilePath file_path = base::FilePath::FromUTF8Unsafe(path_str); replacement.SetPathStr(file_path.value()); const GURL url = src_server()->base_url().ReplaceComponents(replacement); - CountRequestFor(url, path_str, counter); + CountRequestForUrl(url, path_str, counter); } // As above, but specify the data path and URL separately. - void CountRequestFor(const GURL& url, - const std::string& path_str, - RequestCounter* counter) { + void CountRequestForUrl(const GURL& url, + const std::string& path_str, + RequestCounter* counter) { base::FilePath url_file = ui_test_utils::GetTestFilePath( base::FilePath(), base::FilePath::FromUTF8Unsafe(path_str)); content::BrowserThread::PostTask( @@ -272,11 +274,54 @@ "http://%s:%d/%s", secondary_domain.c_str(), embedded_test_server()->host_port_pair().port(), kPrefetchPage)); RequestCounter cross_domain_counter; - CountRequestFor(cross_domain_url, kPrefetchPage, &cross_domain_counter); + CountRequestForUrl(cross_domain_url, kPrefetchPage, &cross_domain_counter); PrerenderTestURL(cross_domain_url, FINAL_STATUS_APP_TERMINATING, 1); cross_domain_counter.WaitForCount(1); } +// Checks that response header CSP is respected. +IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, ResponseHeaderCSP) { + static const std::string secondary_domain = "foo.bar"; + host_resolver()->AddRule(secondary_domain, "127.0.0.1"); + RequestCounter main_page; + CountRequestFor(kPrefetchResponseHeaderCSP, &main_page); + RequestCounter first_script; + CountRequestFor(kPrefetchScript, &first_script); + RequestCounter second_script; + GURL second_script_url(std::string("http://foo.bar/") + kPrefetchScript2); + CountRequestForUrl(second_script_url, kPrefetchScript2, &second_script); + PrerenderTestURL(kPrefetchResponseHeaderCSP, FINAL_STATUS_APP_TERMINATING, 1); + // The second script is in the correct domain for CSP, but the first script is + // not. + main_page.WaitForCount(1); + second_script.WaitForCount(1); + // TODO(pasko): wait for prefetch to be finished before checking the counts. + first_script.WaitForCount(0); +} + +// Checks that CSP in the meta tag cancels the prefetch. +// TODO(mattcary): probably this behavior should be consistent with +// response-header CSP. See crbug/656581. +IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, MetaTagCSP) { + static const std::string secondary_domain = "foo.bar"; + host_resolver()->AddRule(secondary_domain, "127.0.0.1"); + RequestCounter main_page; + CountRequestFor(kPrefetchMetaCSP, &main_page); + RequestCounter first_script; + CountRequestFor(kPrefetchScript, &first_script); + RequestCounter second_script; + GURL second_script_url(std::string("http://foo.bar/") + kPrefetchScript2); + CountRequestForUrl(second_script_url, kPrefetchScript2, &second_script); + PrerenderTestURL(kPrefetchMetaCSP, FINAL_STATUS_APP_TERMINATING, 1); + // TODO(mattcary): See test comment above. If the meta CSP tag were parsed, + // |second_script| would be loaded. Instead as the background scanner bails as + // soon as the meta CSP tag is seen, only |main_page| is fetched. + main_page.WaitForCount(1); + // TODO(pasko): wait for prefetch to be finished before checking the counts. + second_script.WaitForCount(0); + first_script.WaitForCount(0); +} + // Checks simultaneous prefetch. IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, PrefetchSimultaneous) { RequestCounter first_main_counter;
diff --git a/chrome/browser/prerender/prerender_test_utils.h b/chrome/browser/prerender/prerender_test_utils.h index 3183d43..bfa521ac 100644 --- a/chrome/browser/prerender/prerender_test_utils.h +++ b/chrome/browser/prerender/prerender_test_utils.h
@@ -301,6 +301,7 @@ const std::vector<FinalStatus>& expected_final_status_queue, int expected_number_of_loads); + // Set up an HTTPS server. void UseHttpsSrcServer(); // Returns the currently active server. See |UseHttpsSrcServer|.
diff --git a/chrome/browser/previews/previews_infobar_tab_helper.cc b/chrome/browser/previews/previews_infobar_tab_helper.cc index e91e78d..3043a0b 100644 --- a/chrome/browser/previews/previews_infobar_tab_helper.cc +++ b/chrome/browser/previews/previews_infobar_tab_helper.cc
@@ -40,9 +40,7 @@ const net::HttpResponseHeaders* headers = navigation_handle->GetResponseHeaders(); if (headers && - headers->HasHeaderValue( - data_reduction_proxy::chrome_proxy_header(), - data_reduction_proxy::chrome_proxy_lite_page_directive())) { + data_reduction_proxy::IsLitePagePreview(*headers)) { PreviewsInfoBarDelegate::Create(navigation_handle->GetWebContents(), PreviewsInfoBarDelegate::LITE_PAGE); }
diff --git a/chrome/browser/previews/previews_infobar_tab_helper_unittest.cc b/chrome/browser/previews/previews_infobar_tab_helper_unittest.cc index 105a359..699aaf1 100644 --- a/chrome/browser/previews/previews_infobar_tab_helper_unittest.cc +++ b/chrome/browser/previews/previews_infobar_tab_helper_unittest.cc
@@ -68,8 +68,8 @@ void SimulateWillProcessResponse() { std::string headers = base::StringPrintf( "HTTP/1.1 200 OK\n%s: %s\n\n", - data_reduction_proxy::chrome_proxy_header(), - data_reduction_proxy::chrome_proxy_lite_page_directive()); + data_reduction_proxy::chrome_proxy_content_transform_header(), + data_reduction_proxy::lite_page_directive()); test_handle_->CallWillProcessResponseForTesting( main_rfh(), net::HttpUtil::AssembleRawHeaders(headers.c_str(), headers.size()));
diff --git a/chrome/browser/profile_resetter/profile_reset_report.proto b/chrome/browser/profile_resetter/profile_reset_report.proto index 502d403..31fa3ef 100644 --- a/chrome/browser/profile_resetter/profile_reset_report.proto +++ b/chrome/browser/profile_resetter/profile_reset_report.proto
@@ -62,7 +62,9 @@ // Full command line (executable and parameters) of shotcuts to start Chrome. repeated string shortcuts = 18; - // Specifies where the request for the settings reset came from. + // Specifies where the request for the settings reset came from. If + // you add new enumerators, also update + // "ProfileResetRequestOriginEnum" in tools/metrics/histograms/histograms.xml. enum ResetRequestOrigin { RESET_REQUEST_ORIGIN_UNSPECIFIED = 0; // None of the other cases. Possibly by navigating to
diff --git a/chrome/browser/profiles/off_the_record_profile_io_data.cc b/chrome/browser/profiles/off_the_record_profile_io_data.cc index 9f77dd3d..6fd18bc 100644 --- a/chrome/browser/profiles/off_the_record_profile_io_data.cc +++ b/chrome/browser/profiles/off_the_record_profile_io_data.cc
@@ -10,6 +10,7 @@ #include "base/command_line.h" #include "base/logging.h" #include "base/macros.h" +#include "base/memory/ptr_util.h" #include "base/stl_util.h" #include "base/threading/worker_pool.h" #include "build/build_config.h" @@ -37,6 +38,7 @@ #include "net/sdch/sdch_owner.h" #include "net/ssl/channel_id_service.h" #include "net/ssl/default_channel_id_store.h" +#include "net/url_request/url_request_context_storage.h" #include "net/url_request/url_request_job_factory_impl.h" #include "storage/browser/database/database_tracker.h" @@ -198,6 +200,8 @@ content::ProtocolHandlerMap* protocol_handlers, content::URLRequestInterceptorScopedVector request_interceptors) const { net::URLRequestContext* main_context = main_request_context(); + net::URLRequestContextStorage* main_context_storage = + main_request_context_storage(); IOThread* const io_thread = profile_params->io_thread; IOThread::Globals* const io_thread_globals = io_thread->globals(); @@ -212,9 +216,8 @@ main_context->set_net_log(io_thread->net_log()); - main_context->set_network_delegate(chrome_network_delegate.get()); - - network_delegate_ = std::move(chrome_network_delegate); + main_context_storage->set_network_delegate( + std::move(chrome_network_delegate)); main_context->set_host_resolver( io_thread_globals->host_resolver.get()); @@ -223,30 +226,26 @@ main_context->set_proxy_service(proxy_service()); // For incognito, we use the default non-persistent HttpServerPropertiesImpl. - set_http_server_properties(std::unique_ptr<net::HttpServerProperties>( - new net::HttpServerPropertiesImpl())); - main_context->set_http_server_properties(http_server_properties()); + main_context_storage->set_http_server_properties( + base::MakeUnique<net::HttpServerPropertiesImpl>()); // For incognito, we use a non-persistent channel ID store. - net::ChannelIDService* channel_id_service = - new net::ChannelIDService( - new net::DefaultChannelIDStore(NULL), - base::WorkerPool::GetTaskRunner(true)); - set_channel_id_service(channel_id_service); - main_context->set_channel_id_service(channel_id_service); + main_context_storage->set_channel_id_service( + base::MakeUnique<net::ChannelIDService>( + new net::DefaultChannelIDStore(nullptr), + base::WorkerPool::GetTaskRunner(true))); using content::CookieStoreConfig; - main_cookie_store_ = CreateCookieStore(CookieStoreConfig( + main_context_storage->set_cookie_store(CreateCookieStore(CookieStoreConfig( base::FilePath(), CookieStoreConfig::EPHEMERAL_SESSION_COOKIES, NULL, - profile_params->cookie_monster_delegate.get())); - main_context->set_cookie_store(main_cookie_store_.get()); - main_cookie_store_->SetChannelIDServiceID(channel_id_service->GetUniqueID()); + profile_params->cookie_monster_delegate.get()))); - http_network_session_ = CreateHttpNetworkSession(*profile_params); - main_http_factory_ = CreateMainHttpFactory( - http_network_session_.get(), net::HttpCache::DefaultBackend::InMemory(0)); + main_context_storage->set_http_network_session( + CreateHttpNetworkSession(*profile_params)); + main_context_storage->set_http_transaction_factory( + CreateMainHttpFactory(main_context_storage->http_network_session(), + net::HttpCache::DefaultBackend::InMemory(0))); - main_context->set_http_transaction_factory(main_http_factory_.get()); #if !defined(DISABLE_FTP_SUPPORT) ftp_factory_.reset( new net::FtpNetworkLayer(main_context->host_resolver())); @@ -256,16 +255,15 @@ new net::URLRequestJobFactoryImpl()); InstallProtocolHandlers(main_job_factory.get(), protocol_handlers); - main_job_factory_ = SetUpJobFactoryDefaults( + main_context_storage->set_job_factory(SetUpJobFactoryDefaults( std::move(main_job_factory), std::move(request_interceptors), std::move(profile_params->protocol_handler_interceptor), - main_context->network_delegate(), ftp_factory_.get()); - main_context->set_job_factory(main_job_factory_.get()); + main_context->network_delegate(), ftp_factory_.get())); // Setup SDCH for this profile. - sdch_manager_.reset(new net::SdchManager); - sdch_policy_.reset(new net::SdchOwner(sdch_manager_.get(), main_context)); - main_context->set_sdch_manager(sdch_manager_.get()); + main_context_storage->set_sdch_manager(base::MakeUnique<net::SdchManager>()); + sdch_policy_.reset( + new net::SdchOwner(main_context->sdch_manager(), main_context)); #if defined(ENABLE_EXTENSIONS) InitializeExtensionsRequestContext(profile_params); @@ -337,7 +335,7 @@ // Build a new HttpNetworkSession that uses the new ChannelIDService. net::HttpNetworkSession::Params network_params = - http_network_session_->params(); + main_request_context_storage()->http_network_session()->params(); network_params.channel_id_service = channel_id_service.get(); std::unique_ptr<net::HttpNetworkSession> http_network_session( new net::HttpNetworkSession(network_params));
diff --git a/chrome/browser/profiles/off_the_record_profile_io_data.h b/chrome/browser/profiles/off_the_record_profile_io_data.h index e2cfd6ba..777d12ac9 100644 --- a/chrome/browser/profiles/off_the_record_profile_io_data.h +++ b/chrome/browser/profiles/off_the_record_profile_io_data.h
@@ -22,9 +22,6 @@ namespace net { class CookieStore; class FtpTransactionFactory; -class HttpNetworkSession; -class HttpTransactionFactory; -class SdchManager; class SdchOwner; class URLRequestContext; } // namespace net @@ -143,19 +140,12 @@ net::URLRequestContext* app_context, const StoragePartitionDescriptor& partition_descriptor) const override; - mutable std::unique_ptr<ChromeNetworkDelegate> network_delegate_; - - mutable std::unique_ptr<net::HttpNetworkSession> http_network_session_; - mutable std::unique_ptr<net::HttpTransactionFactory> main_http_factory_; mutable std::unique_ptr<net::FtpTransactionFactory> ftp_factory_; - mutable std::unique_ptr<net::CookieStore> main_cookie_store_; mutable std::unique_ptr<net::CookieStore> extensions_cookie_store_; - mutable std::unique_ptr<net::URLRequestJobFactory> main_job_factory_; mutable std::unique_ptr<net::URLRequestJobFactory> extensions_job_factory_; - mutable std::unique_ptr<net::SdchManager> sdch_manager_; mutable std::unique_ptr<net::SdchOwner> sdch_policy_; DISALLOW_COPY_AND_ASSIGN(OffTheRecordProfileIOData);
diff --git a/chrome/browser/profiles/profile_browsertest.cc b/chrome/browser/profiles/profile_browsertest.cc index 858009d2..a05f94e 100644 --- a/chrome/browser/profiles/profile_browsertest.cc +++ b/chrome/browser/profiles/profile_browsertest.cc
@@ -43,6 +43,10 @@ #include "extensions/common/extension_builder.h" #include "extensions/common/value_builder.h" #include "net/base/net_errors.h" +#include "net/dns/mock_host_resolver.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" #include "net/test/url_request/url_request_failed_job.h" #include "net/url_request/url_fetcher.h" #include "net/url_request/url_fetcher_delegate.h" @@ -149,6 +153,58 @@ content::RunAllPendingInMessageLoop(content::BrowserThread::FILE); } +// Sends an HttpResponse for requests for "/" that result in sending an HPKP +// report. Ignores other paths to avoid catching the subsequent favicon +// request. +std::unique_ptr<net::test_server::HttpResponse> SendReportHttpResponse( + const GURL& report_url, + const net::test_server::HttpRequest& request) { + if (request.relative_url == "/") { + std::unique_ptr<net::test_server::BasicHttpResponse> response( + new net::test_server::BasicHttpResponse()); + std::string header_value = base::StringPrintf( + "max-age=50000;" + "pin-sha256=\"9999999999999999999999999999999999999999999=\";" + "pin-sha256=\"9999999999999999999999999999999999999999998=\";" + "report-uri=\"%s\"", + report_url.spec().c_str()); + response->AddCustomHeader("Public-Key-Pins-Report-Only", header_value); + return std::move(response); + } + + return nullptr; +} + +// Runs |quit_callback| on the UI thread once a URL request has been seen. +// If |hung_response| is true, returns a request that hangs. +std::unique_ptr<net::test_server::HttpResponse> WaitForRequest( + const base::Closure& quit_closure, + bool hung_response, + const net::test_server::HttpRequest& request) { + // Basic sanity checks on the request. + EXPECT_EQ("/", request.relative_url); + EXPECT_EQ("POST", request.method_string); + base::JSONReader json_reader; + std::unique_ptr<base::Value> value = json_reader.ReadToValue(request.content); + EXPECT_TRUE(value); + + content::BrowserThread::PostTask(content::BrowserThread::UI, FROM_HERE, + quit_closure); + + if (hung_response) + return base::MakeUnique<net::test_server::HungResponse>(); + return nullptr; +} + +// Disables logic to ignore HPKP. Must be run on IO thread. +void DisablePinningBypass( + const scoped_refptr<net::URLRequestContextGetter>& getter) { + DCHECK_CURRENTLY_ON(content::BrowserThread::IO); + getter->GetURLRequestContext() + ->transport_security_state() + ->SetEnablePublicKeyPinningBypassForLocalTrustAnchors(false); +} + } // namespace class ProfileBrowserTest : public InProcessBrowserTest { @@ -720,3 +776,70 @@ EXPECT_EQ(temp_disk_cache_dir.GetPath().Append(profile_name), cache_path); } } + +// Test case where an HPKP report is sent. +IN_PROC_BROWSER_TEST_F(ProfileBrowserTest, SendHPKPReport) { + content::BrowserThread::PostTask( + content::BrowserThread::IO, FROM_HERE, + base::Bind( + &DisablePinningBypass, + make_scoped_refptr(browser()->profile()->GetRequestContext()))); + + base::RunLoop wait_for_report_loop; + // Server that HPKP reports are sent to. + embedded_test_server()->RegisterRequestHandler( + base::Bind(&WaitForRequest, wait_for_report_loop.QuitClosure(), false)); + ASSERT_TRUE(embedded_test_server()->Start()); + + // Server that sends an HPKP report when its root document is fetched. + net::EmbeddedTestServer hpkp_test_server(net::EmbeddedTestServer::TYPE_HTTPS); + hpkp_test_server.SetSSLConfig( + net::EmbeddedTestServer::CERT_COMMON_NAME_IS_DOMAIN); + hpkp_test_server.RegisterRequestHandler( + base::Bind(&SendReportHttpResponse, embedded_test_server()->base_url())); + ASSERT_TRUE(hpkp_test_server.Start()); + + // To send a report, must use a non-numeric host name for the original + // request. This must not match the host name of the server that reports are + // sent to. + ui_test_utils::NavigateToURL(browser(), + hpkp_test_server.GetURL("localhost", "/")); + wait_for_report_loop.Run(); + + // Shut down the test server, to make it unlikely this will end up in the same + // situation as the next test, though it's still theoretically possible. + ASSERT_TRUE(embedded_test_server()->ShutdownAndWaitUntilComplete()); +} + +// Test case where an HPKP report is sent, and the server hasn't replied by the +// time the profile is torn down. Test will crash if the URLRequestContext is +// torn down before the request is torn down. +IN_PROC_BROWSER_TEST_F(ProfileBrowserTest, SendHPKPReportServerHangs) { + content::BrowserThread::PostTask( + content::BrowserThread::IO, FROM_HERE, + base::Bind( + &DisablePinningBypass, + make_scoped_refptr(browser()->profile()->GetRequestContext()))); + + base::RunLoop wait_for_report_loop; + // Server that HPKP reports are sent to. Have to use a class member to make + // sure that the test server outlives the IO thread. + embedded_test_server()->RegisterRequestHandler( + base::Bind(&WaitForRequest, wait_for_report_loop.QuitClosure(), true)); + ASSERT_TRUE(embedded_test_server()->Start()); + + // Server that sends an HPKP report when its root document is fetched. + net::EmbeddedTestServer hpkp_test_server(net::EmbeddedTestServer::TYPE_HTTPS); + hpkp_test_server.SetSSLConfig( + net::EmbeddedTestServer::CERT_COMMON_NAME_IS_DOMAIN); + hpkp_test_server.RegisterRequestHandler( + base::Bind(&SendReportHttpResponse, embedded_test_server()->base_url())); + ASSERT_TRUE(hpkp_test_server.Start()); + + // To send a report, must use a non-numeric host name for the original + // request. This must not match the host name of the server that reports are + // sent to. + ui_test_utils::NavigateToURL(browser(), + hpkp_test_server.GetURL("localhost", "/")); + wait_for_report_loop.Run(); +}
diff --git a/chrome/browser/profiles/profile_impl_io_data.cc b/chrome/browser/profiles/profile_impl_io_data.cc index eec323b..a2680af2 100644 --- a/chrome/browser/profiles/profile_impl_io_data.cc +++ b/chrome/browser/profiles/profile_impl_io_data.cc
@@ -69,6 +69,7 @@ #include "net/http/http_server_properties_manager.h" #include "net/sdch/sdch_owner.h" #include "net/ssl/channel_id_service.h" +#include "net/url_request/url_request_context_storage.h" #include "net/url_request/url_request_intercepting_job_factory.h" #include "net/url_request/url_request_job_factory_impl.h" #include "storage/browser/quota/special_storage_policy.h" @@ -171,6 +172,13 @@ lazy_params->session_cookie_mode = session_cookie_mode; lazy_params->special_storage_policy = special_storage_policy; + PrefService* pref_service = profile_->GetPrefs(); + lazy_params->http_server_properties_manager.reset( + chrome_browser_net::HttpServerPropertiesManagerFactory::CreateManager( + pref_service)); + io_data_->http_server_properties_manager_ = + lazy_params->http_server_properties_manager.get(); + io_data_->lazy_params_.reset(lazy_params); // Keep track of profile path and cache sizes separately so we can use them @@ -370,12 +378,6 @@ // below try to get the ResourceContext pointer. initialized_ = true; PrefService* pref_service = profile_->GetPrefs(); - io_data_->http_server_properties_manager_ = - chrome_browser_net::HttpServerPropertiesManagerFactory::CreateManager( - pref_service); - io_data_->set_http_server_properties( - std::unique_ptr<net::HttpServerProperties>( - io_data_->http_server_properties_manager_)); io_data_->session_startup_pref()->Init( prefs::kRestoreOnStartup, pref_service); io_data_->session_startup_pref()->MoveToThread( @@ -451,6 +453,8 @@ network_json_store_->ReadPrefsAsync(nullptr); net::URLRequestContext* main_context = main_request_context(); + net::URLRequestContextStorage* main_context_storage = + main_request_context_storage(); IOThread* const io_thread = profile_params->io_thread; IOThread::Globals* const io_thread_globals = io_thread->globals(); @@ -466,8 +470,11 @@ ApplyProfileParamsToContext(main_context); - if (http_server_properties_manager_) - http_server_properties_manager_->InitializeOnNetworkThread(); + if (lazy_params_->http_server_properties_manager) { + lazy_params_->http_server_properties_manager->InitializeOnNetworkThread(); + main_context_storage->set_http_server_properties( + std::move(lazy_params_->http_server_properties_manager)); + } main_context->set_transport_security_state(transport_security_state()); main_context->set_ct_policy_enforcer( @@ -475,14 +482,11 @@ main_context->set_net_log(io_thread->net_log()); - network_delegate_ = data_reduction_proxy_io_data()->CreateNetworkDelegate( - io_thread_globals->data_use_ascriber->CreateNetworkDelegate( - std::move(chrome_network_delegate)), - true); - - main_context->set_network_delegate(network_delegate_.get()); - - main_context->set_http_server_properties(http_server_properties()); + main_context_storage->set_network_delegate( + data_reduction_proxy_io_data()->CreateNetworkDelegate( + io_thread_globals->data_use_ascriber->CreateNetworkDelegate( + std::move(chrome_network_delegate)), + true)); main_context->set_host_resolver( io_thread_globals->host_resolver.get()); @@ -492,8 +496,6 @@ main_context->set_proxy_service(proxy_service()); - net::ChannelIDService* channel_id_service = nullptr; - // Set up cookie store. DCHECK(!lazy_params_->cookie_path.empty()); @@ -502,38 +504,34 @@ lazy_params_->special_storage_policy.get(), profile_params->cookie_monster_delegate.get()); cookie_config.crypto_delegate = cookie_config::GetCookieCryptoDelegate(); - main_cookie_store_ = content::CreateCookieStore(cookie_config); - - main_context->set_cookie_store(main_cookie_store_.get()); + main_context_storage->set_cookie_store( + content::CreateCookieStore(cookie_config)); // Set up server bound cert service. - if (!channel_id_service) { - DCHECK(!lazy_params_->channel_id_path.empty()); + DCHECK(!lazy_params_->channel_id_path.empty()); + scoped_refptr<QuotaPolicyChannelIDStore> channel_id_db = + new QuotaPolicyChannelIDStore( + lazy_params_->channel_id_path, + BrowserThread::GetBlockingPool()->GetSequencedTaskRunner( + base::SequencedWorkerPool::GetSequenceToken()), + lazy_params_->special_storage_policy.get()); + main_context_storage->set_channel_id_service( + base::MakeUnique<net::ChannelIDService>( + new net::DefaultChannelIDStore(channel_id_db.get()), + base::WorkerPool::GetTaskRunner(true))); - scoped_refptr<QuotaPolicyChannelIDStore> channel_id_db = - new QuotaPolicyChannelIDStore( - lazy_params_->channel_id_path, - BrowserThread::GetBlockingPool()->GetSequencedTaskRunner( - base::SequencedWorkerPool::GetSequenceToken()), - lazy_params_->special_storage_policy.get()); - channel_id_service = new net::ChannelIDService( - new net::DefaultChannelIDStore(channel_id_db.get()), - base::WorkerPool::GetTaskRunner(true)); - } - - set_channel_id_service(channel_id_service); - main_context->set_channel_id_service(channel_id_service); - main_cookie_store_->SetChannelIDServiceID(channel_id_service->GetUniqueID()); + main_context->cookie_store()->SetChannelIDServiceID( + main_context->channel_id_service()->GetUniqueID()); std::unique_ptr<net::HttpCache::BackendFactory> main_backend( new net::HttpCache::DefaultBackend( net::DISK_CACHE, ChooseCacheBackendType(), lazy_params_->cache_path, lazy_params_->cache_max_size, BrowserThread::GetTaskRunnerForThread(BrowserThread::CACHE))); - http_network_session_ = CreateHttpNetworkSession(*profile_params); - main_http_factory_ = CreateMainHttpFactory(http_network_session_.get(), - std::move(main_backend)); - main_context->set_http_transaction_factory(main_http_factory_.get()); + main_context_storage->set_http_network_session( + CreateHttpNetworkSession(*profile_params)); + main_context_storage->set_http_transaction_factory(CreateMainHttpFactory( + main_context_storage->http_network_session(), std::move(main_backend))); #if !defined(DISABLE_FTP_SUPPORT) ftp_factory_.reset( @@ -556,11 +554,10 @@ request_interceptors.insert( request_interceptors.begin(), data_reduction_proxy_io_data()->CreateInterceptor().release()); - main_job_factory_ = SetUpJobFactoryDefaults( + main_context_storage->set_job_factory(SetUpJobFactoryDefaults( std::move(main_job_factory), std::move(request_interceptors), std::move(profile_params->protocol_handler_interceptor), - main_context->network_delegate(), ftp_factory_.get()); - main_context->set_job_factory(main_job_factory_.get()); + main_context->network_delegate(), ftp_factory_.get())); main_context->set_network_quality_estimator( io_thread_globals->network_quality_estimator.get()); @@ -569,13 +566,13 @@ #endif // Setup SDCH for this profile. - sdch_manager_.reset(new net::SdchManager); - sdch_policy_.reset(new net::SdchOwner(sdch_manager_.get(), main_context)); - main_context->set_sdch_manager(sdch_manager_.get()); + std::unique_ptr<net::SdchManager> sdch_manager(new net::SdchManager()); + sdch_policy_.reset(new net::SdchOwner(sdch_manager.get(), main_context)); sdch_policy_->EnablePersistentStorage( std::unique_ptr<net::SdchOwner::PrefStorage>( new chrome_browser_net::SdchOwnerPrefStorage( network_json_store_.get()))); + main_context_storage->set_sdch_manager(std::move(sdch_manager)); // Create a media request context based on the main context, but using a // media cache. It shares the same job factory as the main context. @@ -682,8 +679,12 @@ cookie_store->SetChannelIDServiceID(channel_id_service->GetUniqueID()); // Build a new HttpNetworkSession that uses the new ChannelIDService. + // TODO(mmenke): It weird to combine state from + // main_request_context_storage() objects and the argumet to this method, + // |main_context|. Remove |main_context| as an argument, and just use + // main_context() instead. net::HttpNetworkSession::Params network_params = - http_network_session_->params(); + main_request_context_storage()->http_network_session()->params(); network_params.channel_id_service = channel_id_service.get(); std::unique_ptr<net::HttpNetworkSession> http_network_session( new net::HttpNetworkSession(network_params)); @@ -750,7 +751,8 @@ cache_max_size, BrowserThread::GetTaskRunnerForThread(BrowserThread::CACHE))); std::unique_ptr<net::HttpCache> media_http_cache = - CreateHttpFactory(http_network_session_.get(), std::move(media_backend)); + CreateHttpFactory(main_request_context_storage()->http_network_session(), + std::move(media_backend)); // Transfer ownership of the cache to MediaRequestContext. context->SetHttpTransactionFactory(std::move(media_http_cache));
diff --git a/chrome/browser/profiles/profile_impl_io_data.h b/chrome/browser/profiles/profile_impl_io_data.h index 89197b5..3108057 100644 --- a/chrome/browser/profiles/profile_impl_io_data.h +++ b/chrome/browser/profiles/profile_impl_io_data.h
@@ -30,15 +30,9 @@ } // namespace domain_reliability namespace net { -class CookieCryptoDelegate; class CookieStore; class FtpTransactionFactory; -class HttpNetworkSession; -class HttpServerProperties; class HttpServerPropertiesManager; -class HttpTransactionFactory; -class ProxyConfig; -class SdchManager; class SdchOwner; } // namespace net @@ -165,6 +159,8 @@ base::FilePath extensions_cookie_path; content::CookieStoreConfig::SessionCookieMode session_cookie_mode; scoped_refptr<storage::SpecialStoragePolicy> special_storage_policy; + std::unique_ptr<net::HttpServerPropertiesManager> + http_server_properties_manager; }; ProfileImplIOData(); @@ -210,37 +206,28 @@ void ClearNetworkingHistorySinceOnIOThread(base::Time time, const base::Closure& completion); - mutable std::unique_ptr< - data_reduction_proxy::DataReductionProxyNetworkDelegate> - network_delegate_; - // Lazy initialization params. mutable std::unique_ptr<LazyParams> lazy_params_; mutable scoped_refptr<JsonPrefStore> network_json_store_; - mutable std::unique_ptr<net::HttpNetworkSession> http_network_session_; - mutable std::unique_ptr<net::HttpTransactionFactory> main_http_factory_; mutable std::unique_ptr<net::FtpTransactionFactory> ftp_factory_; - // Same as |ProfileIOData::http_server_properties_|, owned there to maintain - // destruction ordering. - mutable net::HttpServerPropertiesManager* http_server_properties_manager_; + // Owned by URLRequestContextStorage, reference here to can be shut down on + // the UI thread. + net::HttpServerPropertiesManager* http_server_properties_manager_; - mutable std::unique_ptr<net::CookieStore> main_cookie_store_; mutable std::unique_ptr<net::CookieStore> extensions_cookie_store_; mutable std::unique_ptr<chrome_browser_net::Predictor> predictor_; mutable std::unique_ptr<net::URLRequestContext> media_request_context_; - mutable std::unique_ptr<net::URLRequestJobFactory> main_job_factory_; mutable std::unique_ptr<net::URLRequestJobFactory> extensions_job_factory_; mutable std::unique_ptr<domain_reliability::DomainReliabilityMonitor> domain_reliability_monitor_; - mutable std::unique_ptr<net::SdchManager> sdch_manager_; mutable std::unique_ptr<net::SdchOwner> sdch_policy_; mutable std::unique_ptr<previews::PreviewsIOData> previews_io_data_;
diff --git a/chrome/browser/profiles/profile_io_data.cc b/chrome/browser/profiles/profile_io_data.cc index 6cc3bfb..81c06c90 100644 --- a/chrome/browser/profiles/profile_io_data.cc +++ b/chrome/browser/profiles/profile_io_data.cc
@@ -104,6 +104,7 @@ #include "net/url_request/url_request.h" #include "net/url_request/url_request_context.h" #include "net/url_request/url_request_context_builder.h" +#include "net/url_request/url_request_context_storage.h" #include "net/url_request/url_request_file_job.h" #include "net/url_request/url_request_intercepting_job_factory.h" #include "net/url_request/url_request_interceptor.h" @@ -521,14 +522,11 @@ // ShutdownOnUIThread to release these observers on the right thread. // Don't pass it in |profile_params_| to make sure it is correctly cleaned up, // in particular when this ProfileIOData isn't |initialized_| during deletion. - policy::URLBlacklist::SegmentURLCallback callback = - static_cast<policy::URLBlacklist::SegmentURLCallback>( - url_formatter::SegmentURL); base::SequencedWorkerPool* pool = BrowserThread::GetBlockingPool(); scoped_refptr<base::SequencedTaskRunner> background_task_runner = pool->GetSequencedTaskRunner(pool->GetSequenceToken()); url_blacklist_manager_.reset(new policy::URLBlacklistManager( - pref_service, background_task_runner, io_task_runner, callback, + pref_service, background_task_runner, io_task_runner, base::Bind(policy::OverrideBlacklistForURL))); // The CTPolicyManager shares the same constraints of needing to be cleaned @@ -947,15 +945,6 @@ data_reduction_proxy_io_data_ = std::move(data_reduction_proxy_io_data); } -net::HttpServerProperties* ProfileIOData::http_server_properties() const { - return http_server_properties_.get(); -} - -void ProfileIOData::set_http_server_properties( - std::unique_ptr<net::HttpServerProperties> http_server_properties) const { - http_server_properties_ = std::move(http_server_properties); -} - ProfileIOData::ResourceContext::ResourceContext(ProfileIOData* io_data) : io_data_(io_data), host_resolver_(NULL), @@ -1027,6 +1016,8 @@ // Create the common request contexts. main_request_context_.reset(new net::URLRequestContext()); + main_request_context_storage_.reset( + new net::URLRequestContextStorage(main_request_context_.get())); extensions_request_context_.reset(new net::URLRequestContext()); main_request_context_->set_enable_brotli(io_thread_globals->enable_brotli); @@ -1304,11 +1295,6 @@ delete this; } -void ProfileIOData::set_channel_id_service( - net::ChannelIDService* channel_id_service) const { - channel_id_service_.reset(channel_id_service); -} - void ProfileIOData::DestroyResourceContext() { resource_context_.reset(); // Prevent the cert_transparency_observer_ from getting any more
diff --git a/chrome/browser/profiles/profile_io_data.h b/chrome/browser/profiles/profile_io_data.h index 5390f0c..0887443c 100644 --- a/chrome/browser/profiles/profile_io_data.h +++ b/chrome/browser/profiles/profile_io_data.h
@@ -86,6 +86,7 @@ class SSLConfigService; class TransportSecurityPersister; class TransportSecurityState; +class URLRequestContextStorage; class URLRequestJobFactoryImpl; } // namespace net @@ -378,13 +379,6 @@ void ShutdownOnUIThread( std::unique_ptr<ChromeURLRequestContextGetterVector> context_getters); - // A ChannelIDService object is created by a derived class of - // ProfileIOData, and the derived class calls this method to set the - // channel_id_service_ member and transfers ownership to the base - // class. - void set_channel_id_service( - net::ChannelIDService* channel_id_service) const; - void set_data_reduction_proxy_io_data( std::unique_ptr<data_reduction_proxy::DataReductionProxyIOData> data_reduction_proxy_io_data) const; @@ -393,15 +387,17 @@ return proxy_service_.get(); } - net::HttpServerProperties* http_server_properties() const; - - void set_http_server_properties( - std::unique_ptr<net::HttpServerProperties> http_server_properties) const; - net::URLRequestContext* main_request_context() const { return main_request_context_.get(); } + // Storage for |main_request_context_|, to allow objects created by subclasses + // to live until the ProfileIOData destructor is invoked, so it can safely + // cancel URLRequests. + net::URLRequestContextStorage* main_request_context_storage() const { + return main_request_context_storage_.get(); + } + bool initialized() const { return initialized_; } @@ -561,7 +557,6 @@ #if defined(ENABLE_EXTENSIONS) mutable scoped_refptr<extensions::InfoMap> extension_info_map_; #endif - mutable std::unique_ptr<net::ChannelIDService> channel_id_service_; mutable std::unique_ptr<data_reduction_proxy::DataReductionProxyIOData> data_reduction_proxy_io_data_; @@ -571,7 +566,6 @@ transport_security_state_; mutable std::unique_ptr<net::CTVerifier> cert_transparency_verifier_; mutable std::unique_ptr<ChromeExpectCTReporter> expect_ct_reporter_; - mutable std::unique_ptr<net::HttpServerProperties> http_server_properties_; #if defined(OS_CHROMEOS) // Set to |cert_verifier_| if it references a PolicyCertVerifier. In that // case, the verifier is owned by |cert_verifier_|. Otherwise, set to NULL. @@ -589,9 +583,14 @@ mutable std::unique_ptr<certificate_transparency::CTPolicyManager> ct_policy_manager_; - // These are only valid in between LazyInitialize() and their accessor being - // called. + // Owns the subset of URLRequestContext's elements that are created by + // subclasses of ProfileImplIOData, to ensure proper destruction ordering. + // TODO(mmenke): Move ownship of net objects owned by the ProfileIOData + // itself to this class, to improve destruction ordering. + mutable std::unique_ptr<net::URLRequestContextStorage> + main_request_context_storage_; mutable std::unique_ptr<net::URLRequestContext> main_request_context_; + mutable std::unique_ptr<net::URLRequestContext> extensions_request_context_; // One URLRequestContext per isolated app for main and media requests. mutable URLRequestContextMap app_request_context_map_;
diff --git a/chrome/browser/push_messaging/push_messaging_browsertest.cc b/chrome/browser/push_messaging/push_messaging_browsertest.cc index c7ee215..253aa117 100644 --- a/chrome/browser/push_messaging/push_messaging_browsertest.cc +++ b/chrome/browser/push_messaging/push_messaging_browsertest.cc
@@ -447,21 +447,6 @@ GetAppIdentifierForServiceWorkerRegistration(0LL); } -IN_PROC_BROWSER_TEST_F(PushMessagingBrowserTest, SubscribeFailureBadKey) { - std::string script_result; - - ASSERT_TRUE(RunScript("registerServiceWorker()", &script_result)); - ASSERT_EQ("ok - service worker registered", script_result); - - ASSERT_NO_FATAL_FAILURE(RequestAndAcceptPermission()); - - ASSERT_TRUE(RunScript("documentSubscribePushBadKey()", &script_result)); - EXPECT_EQ( - "InvalidAccessError - Failed to execute 'subscribe' on 'PushManager': " - "The provided applicationServerKey is not valid.", - script_result); -} - IN_PROC_BROWSER_TEST_F(PushMessagingBrowserTest, SubscribeFailureNotificationsBlocked) { 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 b7831d1..a5297bf 100644 --- a/chrome/browser/renderer_context_menu/render_view_context_menu.cc +++ b/chrome/browser/renderer_context_menu/render_view_context_menu.cc
@@ -1097,9 +1097,10 @@ void RenderViewContextMenu::AppendImageItems() { std::map<std::string, std::string>::const_iterator it = - params_.properties.find(data_reduction_proxy::chrome_proxy_header()); + params_.properties.find( + data_reduction_proxy::chrome_proxy_content_transform_header()); if (it != params_.properties.end() && it->second == - data_reduction_proxy::chrome_proxy_lo_fi_directive()) { + data_reduction_proxy::empty_image_directive()) { menu_model_.AddItemWithStringId( IDC_CONTENT_CONTEXT_LOAD_ORIGINAL_IMAGE, IDS_CONTENT_CONTEXT_LOAD_ORIGINAL_IMAGE);
diff --git a/chrome/browser/renderer_context_menu/render_view_context_menu_unittest.cc b/chrome/browser/renderer_context_menu/render_view_context_menu_unittest.cc index 9078409d05..25db83b 100644 --- a/chrome/browser/renderer_context_menu/render_view_context_menu_unittest.cc +++ b/chrome/browser/renderer_context_menu/render_view_context_menu_unittest.cc
@@ -482,7 +482,8 @@ const std::string& headers = content::WebContentsTester::For(web_contents())->GetSaveFrameHeaders(); - EXPECT_TRUE(headers.find("Chrome-Proxy: pass-through") != std::string::npos); + EXPECT_TRUE(headers.find( + "Chrome-Proxy-Accept-Transform: identity") != std::string::npos); EXPECT_TRUE(headers.find("Cache-Control: no-cache") != std::string::npos); DestroyDataReductionProxySettings(); @@ -503,7 +504,8 @@ const std::string& headers = content::WebContentsTester::For(web_contents())->GetSaveFrameHeaders(); - EXPECT_TRUE(headers.find("Chrome-Proxy: pass-through") == std::string::npos); + EXPECT_TRUE(headers.find( + "Chrome-Proxy-Accept-Transform: identity") == std::string::npos); EXPECT_TRUE(headers.find("Cache-Control: no-cache") == std::string::npos); DestroyDataReductionProxySettings(); @@ -514,8 +516,9 @@ TEST_F(RenderViewContextMenuPrefsTest, DataSaverLoadImage) { SetupDataReductionProxy(true); content::ContextMenuParams params = CreateParams(MenuItem::IMAGE); - params.properties[data_reduction_proxy::chrome_proxy_header()] = - data_reduction_proxy::chrome_proxy_lo_fi_directive(); + params.properties[ + data_reduction_proxy::chrome_proxy_content_transform_header()] = + data_reduction_proxy::empty_image_directive(); params.unfiltered_link_url = params.link_url; content::WebContents* wc = web_contents(); std::unique_ptr<TestRenderViewContextMenu> menu(
diff --git a/chrome/browser/renderer_host/pepper/pepper_flash_browser_host.cc b/chrome/browser/renderer_host/pepper/pepper_flash_browser_host.cc index 5ce66503..662544a 100644 --- a/chrome/browser/renderer_host/pepper/pepper_flash_browser_host.cc +++ b/chrome/browser/renderer_host/pepper/pepper_flash_browser_host.cc
@@ -13,6 +13,7 @@ #include "content/public/browser/browser_ppapi_host.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/render_process_host.h" +#include "device/power_save_blocker/power_save_blocker.h" #include "ipc/ipc_message_macros.h" #include "ppapi/c/pp_errors.h" #include "ppapi/c/private/ppb_flash.h" @@ -57,6 +58,8 @@ PP_Resource resource) : ResourceHost(host->GetPpapiHost(), instance, resource), host_(host), + delay_timer_(FROM_HERE, base::TimeDelta::FromSeconds(45), this, + &PepperFlashBrowserHost::OnDelayTimerFired), weak_factory_(this) { int unused; host->GetRenderFrameIDsForInstance(instance, &render_process_id_, &unused); @@ -78,21 +81,24 @@ return PP_ERROR_FAILED; } +void PepperFlashBrowserHost::OnDelayTimerFired() { + power_save_blocker_.reset(); +} + int32_t PepperFlashBrowserHost::OnUpdateActivity( ppapi::host::HostMessageContext* host_context) { -#if defined(OS_WIN) - // Reading then writing back the same value to the screensaver timeout system - // setting resets the countdown which prevents the screensaver from turning - // on "for a while". As long as the plugin pings us with this message faster - // than the screensaver timeout, it won't go on. - int value = 0; - if (SystemParametersInfo(SPI_GETSCREENSAVETIMEOUT, 0, &value, 0)) - SystemParametersInfo(SPI_SETSCREENSAVETIMEOUT, value, NULL, 0); -#elif defined(OS_MACOSX) - UpdateSystemActivity(OverallAct); -#else -// TODO(brettw) implement this for other platforms. -#endif + if (!power_save_blocker_) { + power_save_blocker_.reset(new device::PowerSaveBlocker( + device::PowerSaveBlocker::kPowerSaveBlockPreventAppSuspension, + device::PowerSaveBlocker::kReasonOther, "Requested By PepperFlash", + BrowserThread::GetTaskRunnerForThread(BrowserThread::UI), + BrowserThread::GetTaskRunnerForThread(BrowserThread::FILE))); + } + // There is no specification for how long OnUpdateActivity should prevent the + // screen from going to sleep. Empirically, twitch.tv calls this method every + // 10 seconds. Be conservative and allow 45 seconds (set in |delay_timer_|'s + // ctor) before deleting the block. + delay_timer_.Reset(); return PP_OK; }
diff --git a/chrome/browser/renderer_host/pepper/pepper_flash_browser_host.h b/chrome/browser/renderer_host/pepper/pepper_flash_browser_host.h index 50308a2..65f0a61a 100644 --- a/chrome/browser/renderer_host/pepper/pepper_flash_browser_host.h +++ b/chrome/browser/renderer_host/pepper/pepper_flash_browser_host.h
@@ -10,6 +10,7 @@ #include "base/macros.h" #include "base/memory/ref_counted.h" #include "base/memory/weak_ptr.h" +#include "base/timer/timer.h" #include "ppapi/host/host_message_context.h" #include "ppapi/host/resource_host.h" @@ -26,6 +27,10 @@ class CookieSettings; } +namespace device { +class PowerSaveBlocker; +} + class GURL; namespace chrome { @@ -43,6 +48,7 @@ ppapi::host::HostMessageContext* context) override; private: + void OnDelayTimerFired(); int32_t OnUpdateActivity(ppapi::host::HostMessageContext* host_context); int32_t OnGetLocalTimeZoneOffset( ppapi::host::HostMessageContext* host_context, @@ -57,6 +63,12 @@ content::BrowserPpapiHost* host_; int render_process_id_; + + // A power save blocker to prevent going to sleep, and a timer to destroy it + // after a certain amount of time has elapsed without an UpdateActivity. + std::unique_ptr<device::PowerSaveBlocker> power_save_blocker_; + base::DelayTimer delay_timer_; + // For fetching the Flash LSO settings. scoped_refptr<content_settings::CookieSettings> cookie_settings_; base::WeakPtrFactory<PepperFlashBrowserHost> weak_factory_;
diff --git a/chrome/browser/resources/chromeos/arc_support/background.js b/chrome/browser/resources/chromeos/arc_support/background.js index 548f2343..9b3e788 100644 --- a/chrome/browser/resources/chromeos/arc_support/background.js +++ b/chrome/browser/resources/chromeos/arc_support/background.js
@@ -35,6 +35,21 @@ var termsView = null; /** + * @type {MetricsPreferenceCheckbox} + */ +var metricsCheckbox = null; + +/** + * @type {PreferenceCheckbox} + */ +var backupRestoreCheckbox = null; + +/** + * @type {PreferenceCheckbox} + */ +var locationServiceCheckbox = null; + +/** * Used for bidirectional communication with native code. * @type {chrome.runtime.Port} */ @@ -59,12 +74,6 @@ var arcManaged = false; /** - * Tooltip text used in 'controlled by policy' indicator. - * @type {boolean} - */ -var controlledByPolicyText = ''; - -/** * Host window inner default width. * @const {number} */ @@ -88,31 +97,140 @@ } /** - * Helper function that sets inner content for an option which includes text, - * link to 'learn more' section. This also creates an indicator showing that - * option is controlled by policy and inserts it before link element. - * @param {string} textId Id of the label element to process. - * @param {string} learnMoreLinkId Id inner link to 'learn more' element. - * @param {string} indicatorId Id of indicator to create. - * @param {string} text Inner text to set. Includes link declaration. - * @param {function} callback Callback to call on user action. + * Class to handle checkbox corresponding to a preference. */ -function createConsentOption( - textId, learnMoreLinkId, indicatorId, text, callback) { - var doc = appWindow.contentWindow.document; - var textElement = doc.getElementById(textId); - textElement.innerHTML = text; - var linkLearnMoreElement = doc.getElementById(learnMoreLinkId); - linkLearnMoreElement.addEventListener('click', callback); +class PreferenceCheckbox { - // Create controlled by policy indicator. - var policyIndicator = new appWindow.contentWindow.cr.ui.ControlledIndicator(); - policyIndicator.id = indicatorId; - policyIndicator.getBubbleText = function() { - return controlledByPolicyText; - }; - textElement.insertBefore(policyIndicator, linkLearnMoreElement); -} + /** + * Creates a Checkbox which handles the corresponding preference update. + * @param {Element} container The container this checkbox corresponds to. + * The element must have <input type="checkbox" class="checkbox-option"> + * for the checkbox itself, and <p class="checkbox-text"> for its label. + * @param {string} learnMoreContent I18n content which is shown when "Learn + * More" link is clicked. + * @param {string?} learnMoreLinkId The ID for the "Learn More" link element. + * TODO: Get rid of this. The element can have class so that it can be + * identified easily. Also, it'd be better to extract the link element + * (tag) from the i18n text, and let i18n focus on the content. + * @param {string?} policyText The content of the policy indicator. + */ + constructor(container, learnMoreContent, learnMoreLinkId, policyText) { + this.container_ = container; + this.learnMoreContent_ = learnMoreContent; + + this.checkbox_ = container.querySelector('.checkbox-option'); + this.label_ = container.querySelector('.checkbox-text'); + + var learnMoreLink = this.label_.querySelector(learnMoreLinkId); + if (learnMoreLink) { + learnMoreLink.addEventListener( + 'click', (event) => this.onLearnMoreLinkClicked(event)); + } + + // Create controlled indicator for policy if necessary. + if (policyText) { + this.policyIndicator_ = + new appWindow.contentWindow.cr.ui.ControlledIndicator(); + this.policyIndicator_.setAttribute('textpolicy', policyText); + // TODO: better to have a dedicated element for this place. + this.label_.insertBefore(this.policyIndicator_, learnMoreLink); + } else { + this.policyIndicator_ = null; + } + } + + /** + * Returns if the checkbox is checked or not. Note that this *may* be + * different from the preference value, because the user's check is + * not propagated to the preference until the user clicks "AGREE" button. + */ + isChecked() { return this.checkbox_.checked; } + + /** + * Called when the preference value in native code is updated. + */ + onPreferenceChanged(isEnabled, isManaged) { + this.checkbox_.checked = isEnabled; + this.checkbox_.disabled = isManaged; + this.label_.disabled = isManaged; + + if (this.policyIndicator_) { + if (isManaged) { + this.policyIndicator_.setAttribute('controlled-by', 'policy'); + } else { + this.policyIndicator_.removeAttribute('controlled-by'); + } + } + } + + /** + * Called when the "Learn More" link is clicked. + */ + onLearnMoreLinkClicked() { + showLearnMoreOverlay(this.learnMoreContent_); + } +}; + +/** + * Handles the checkbox action of metrics preference. + * This has special customization e.g. show/hide the checkbox based on + * the native preference. + */ +class MetricsPreferenceCheckbox extends PreferenceCheckbox { + constructor( + container, learnMoreContent, learnMoreLinkId, isOwner, + textDisabled, textEnabled, textManagedDisabled, textManagedEnabled) { + // Do not use policy indicator. + // Learn More link handling is done by this class. + // So pass |null| intentionally. + super(container, learnMoreContent, null, null); + + this.learnMoreLinkId_ = learnMoreLinkId; + this.isOwner_ = isOwner; + + // Two dimensional array. First dimension is whether it is managed or not, + // the second one is whether it is enabled or not. + this.texts_ = [ + [textDisabled, textEnabled], + [textManagedDisabled, textManagedEnabled] + ]; + } + + onPreferenceChanged(isEnabled, isManaged) { + isManaged = isManaged || !this.isOwner_; + super.onPreferenceChanged(isEnabled, isManaged); + + // Hide the checkbox if it is not allowed to (re-)enable. + var canEnable = !isEnabled && !isManaged; + this.checkbox_.hidden = !canEnable; + + // Update the label. + this.label_.innerHTML = this.texts_[isManaged ? 1 : 0][isEnabled ? 1 : 0]; + + // Work around for the current translation text. + // The translation text has tags for following links, although those + // tags are not the target of the translation (but those content text is + // the translation target). + // So, meanwhile, we set the link everytime we update the text. + // TODO: fix the translation text, and main html. + var learnMoreLink = this.label_.querySelector(this.learnMoreLinkId_); + learnMoreLink.addEventListener( + 'click', (event) => this.onLearnMoreLinkClicked(event)); + var settingsLink = this.label_.querySelector('#settings-link'); + settingsLink.addEventListener( + 'click', (event) => this.onSettingsLinkClicked(event)); + + // Applying metrics mode changes page layout, update terms height. + updateTermsHeight(); + } + + /** Called when "settings" link is clicked. */ + onSettingsLinkClicked(event) { + chrome.browser.openTab({'url': 'chrome://settings'}, function() {}); + event.preventDefault(); + } +}; + /** * Applies localization for html content and sets terms webview. @@ -125,22 +243,30 @@ var loadTimeData = appWindow.contentWindow.loadTimeData; loadTimeData.data = data; appWindow.contentWindow.i18nTemplate.process(doc, loadTimeData); + + // Initialize preference connected checkboxes in terms of service page. + metricsCheckbox = new MetricsPreferenceCheckbox( + doc.getElementById('metrics-preference'), + data.learnMoreStatistics, + '#learn-more-link-metrics', + data.isOwnerProfile, + data.textMetricsDisabled, + data.textMetricsEnabled, + data.textMetricsManagedDisabled, + data.textMetricsManagedEnabled); + backupRestoreCheckbox = new PreferenceCheckbox( + doc.getElementById('backup-restore-preference'), + data.learnMoreBackupAndRestore, + '#learn-more-link-backup-restore', + data.controlledByPolicy); + locationServiceCheckbox = new PreferenceCheckbox( + doc.getElementById('location-service-preference'), + data.learnMoreLocationServices, + '#learn-more-link-location-service', + data.controlledByPolicy); + + // Initialize terms of service view. var countryCode = data.countryCode.toLowerCase(); - controlledByPolicyText = data.controlledByPolicy; - arcManaged = data.arcManaged; - setTermsVisible(!arcManaged); - - createConsentOption('text-backup-restore', - 'learn-more-link-backup-restore', - 'policy-indicator-backup-restore', - data.textBackupRestore, - onLearnMoreBackupAndRestore); - createConsentOption('text-location-service', - 'learn-more-link-location-service', - 'policy-indicator-location-service', - data.textLocationService, - onLearnMoreLocationServices); - var scriptSetCountryCode = 'document.countryCode = \'' + countryCode + '\';'; termsView.addContentScripts([ { name: 'preProcess', @@ -154,97 +280,8 @@ js: { files: ['playstore.js'] }, run_at: 'document_end' }]); -} - -/** - * Handles the event when the user clicks on a learn more metrics link. Opens - * the pop up dialog with a help. - */ -var onLearnMoreMetrics = function() { - var loadTimeData = appWindow.contentWindow.loadTimeData; - showLearnModeOverlay(loadTimeData.getString('learnMoreStatistics')); -}; - -/** - * Handles the event when the user clicks on a learn more backup and restore - * link. Opens the pop up dialog with a help. - */ -var onLearnMoreBackupAndRestore = function() { - var loadTimeData = appWindow.contentWindow.loadTimeData; - showLearnModeOverlay(loadTimeData.getString('learnMoreBackupAndRestore')); -}; - -/** - * Handles the event when the user clicks on a learn more location services - * link. Opens the pop up dialog with a help. - */ -var onLearnMoreLocationServices = function() { - var loadTimeData = appWindow.contentWindow.loadTimeData; - showLearnModeOverlay(loadTimeData.getString('learnMoreLocationServices')); -}; - -/** - * Sets current metrics mode. - * @param {string} text Describes current metrics state. - * @param {boolean} canEnable Defines if user is allowed to change this metrics - * option. - * @param {boolean} on Defines if metrics are active currently. - */ -function setMetricsMode(text, canEnable, on) { - var doc = appWindow.contentWindow.document; - var enableMetrics = doc.getElementById('enable-metrics'); - enableMetrics.hidden = !canEnable; - enableMetrics.checked = on; - - var onSettings = function(event) { - chrome.browser.openTab({'url': 'chrome://settings'}, function() {}); - event.preventDefault(); - }; - - doc.getElementById('text-metrics').innerHTML = text; - doc.getElementById('settings-link').addEventListener('click', onSettings); - doc.getElementById('learn-more-link-metrics').addEventListener('click', - onLearnMoreMetrics); - - // Applying metrics mode changes page layout, update terms height. - updateTermsHeight(); -} - -/** - * Sets current backup and restore mode. - * @param {boolean} enabled Defines the value for backup and restore checkbox. - * @param {boolean} managed Defines whether this setting is set by policy. - */ -function setBackupRestoreMode(enabled, managed) { - var doc = appWindow.contentWindow.document; - doc.getElementById('enable-backup-restore').checked = enabled; - doc.getElementById('enable-backup-restore').disabled = managed; - doc.getElementById('text-backup-restore').disabled = managed; - var policyIconElement = doc.getElementById('policy-indicator-backup-restore'); - if (managed) { - policyIconElement.setAttribute('controlled-by', 'policy'); - } else { - policyIconElement.removeAttribute('controlled-by'); - } -} - -/** - * Sets current usage of location service opt in mode. - * @param {boolean} enabled Defines the value for location service opt in. - * @param {boolean} managed Defines whether this setting is set by policy. - */ -function setLocationServiceMode(enabled, managed) { - var doc = appWindow.contentWindow.document; - doc.getElementById('enable-location-service').checked = enabled; - doc.getElementById('enable-location-service').disabled = managed; - doc.getElementById('text-location-service').disabled = managed; - var policyIconElement = doc.getElementById( - 'policy-indicator-location-service'); - if (managed) { - policyIconElement.setAttribute('controlled-by', 'policy'); - } else { - policyIconElement.removeAttribute('controlled-by'); - } + arcManaged = data.arcManaged; + setTermsVisible(!arcManaged); } /** @@ -293,11 +330,12 @@ if (message.action == 'initialize') { initialize(message.data, message.deviceId); } else if (message.action == 'setMetricsMode') { - setMetricsMode(message.text, message.canEnable, message.on); + metricsCheckbox.onPreferenceChanged(message.enabled, message.managed); } else if (message.action == 'setBackupAndRestoreMode') { - setBackupRestoreMode(message.enabled, message.managed); + backupRestoreCheckbox.onPreferenceChanged(message.enabled, message.managed); } else if (message.action == 'setLocationServiceMode') { - setLocationServiceMode(message.enabled, message.managed); + locationServiceCheckbox.onPreferenceChanged( + message.enabled, message.managed); } else if (message.action == 'closeWindow') { if (appWindow) { appWindow.close(); @@ -328,7 +366,7 @@ return; } - hideLearnModeOverlay(); + hideLearnMoreOverlay(); var doc = appWindow.contentWindow.document; var pages = doc.getElementsByClassName('section'); var sendFeedbackElement = doc.getElementById('button-send-feedback'); @@ -374,7 +412,7 @@ * Sets learn more content text and shows it as overlay dialog. * @param {string} content HTML formatted text to show. */ -function showLearnModeOverlay(content) { +function showLearnMoreOverlay(content) { var doc = appWindow.contentWindow.document; var learnMoreContainer = doc.getElementById('learn-more-container'); var learnMoreContent = doc.getElementById('learn-more-content'); @@ -385,7 +423,7 @@ /** * Hides learn more overlay dialog. */ -function hideLearnModeOverlay() { +function hideLearnMoreOverlay() { var doc = appWindow.contentWindow.document; var learnMoreContainer = doc.getElementById('learn-more-container'); learnMoreContainer.hidden = true; @@ -571,13 +609,10 @@ var onAgree = function() { termsAccepted = true; - var enableMetrics = doc.getElementById('enable-metrics'); - var enableBackupRestore = doc.getElementById('enable-backup-restore'); - var enableLocationService = doc.getElementById('enable-location-service'); sendNativeMessage('onAgreed', { - isMetricsEnabled: enableMetrics.checked, - isBackupRestoreEnabled: enableBackupRestore.checked, - isLocationServiceEnabled: enableLocationService.checked + isMetricsEnabled: metricsCheckbox.isChecked(), + isBackupRestoreEnabled: backupRestoreCheckbox.isChecked(), + isLocationServiceEnabled: locationServiceCheckbox.isChecked() }); }; @@ -606,13 +641,13 @@ doc.getElementById('button-retry').addEventListener('click', onRetry); doc.getElementById('button-send-feedback') .addEventListener('click', onSendFeedback); - doc.getElementById('learn-more-close').addEventListener('click', - hideLearnModeOverlay); + doc.getElementById('learn-more-close').addEventListener( + 'click', hideLearnMoreOverlay); var overlay = doc.getElementById('learn-more-container'); appWindow.contentWindow.cr.ui.overlay.setupOverlay(overlay); appWindow.contentWindow.cr.ui.overlay.globalInitialization(); - overlay.addEventListener('cancelOverlay', hideLearnModeOverlay); + overlay.addEventListener('cancelOverlay', hideLearnMoreOverlay); connectPort(); };
diff --git a/chrome/browser/resources/chromeos/arc_support/main.html b/chrome/browser/resources/chromeos/arc_support/main.html index 68f3d1b..7291c940 100644 --- a/chrome/browser/resources/chromeos/arc_support/main.html +++ b/chrome/browser/resources/chromeos/arc_support/main.html
@@ -74,27 +74,33 @@ <div class="section-terms" id ="terms-container"> <webview id="terms-view" partition="persist:arc_support"></webview> </div> - <label class="layout horizontal section-checkbox-container"> - <input type="checkbox" class="checkbox-option" id="enable-metrics"> - <p class="checkbox-text" id="text-metrics"></p> - </label> - <label class="layout horizontal section-checkbox-container"> - <input type="checkbox" class="checkbox-option" - id="enable-backup-restore"> - <p class="checkbox-text" id="text-backup-restore"></p> - </label> - <label class="layout horizontal section-checkbox-container"> - <input type="checkbox" class="checkbox-option" - id="enable-location-service"> - <p class="checkbox-text" id="text-location-service"></p> - </label> + <div id="metrics-preference"> + <label class="layout horizontal section-checkbox-container"> + <input type="checkbox" class="checkbox-option"> + <p class="checkbox-text"></p> + </label> + </div> + <div id="backup-restore-preference"> + <label class="layout horizontal section-checkbox-container"> + <input type="checkbox" class="checkbox-option"> + <p class="checkbox-text" + i18n-values=".innerHTML:textBackupRestore"></p> + </label> + </div> + <div id="location-service-preference"> + <label class="layout horizontal section-checkbox-container"> + <input type="checkbox" class="checkbox-option"> + <p class="checkbox-text" + i18n-values=".innerHTML:textLocationService"></p> + </label> + </div> <div class="layout horizontal end-justified section-buttons"> <paper-button class="white" id="button-cancel" i18n-content="buttonCancel"> </paper-button> <div class="button-separator"></div> <paper-button class="blue" id="button-agree" - i18n-content="buttonAgree"> + i18n-content="buttonAgree"> </paper-button> </div> </div>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_am.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_am.xtb index 075fd0e..6a20096 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_am.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_am.xtb
@@ -781,7 +781,6 @@ <translation id="9027462562263121875">ምንም ሰንጠረዦች የሉም።</translation> <translation id="9040132695316389094">ርዕስ 1</translation> <translation id="9043969572162476692"><ph name="NUM" />%</translation> -<translation id="9061915073547935367">የፍለጋ ንዑስ ፕሮግራም ይቀያይሩ</translation> <translation id="9065283790526219006">+popup</translation> <translation id="9077213568694924680">ከምርጫ ተወግዷል</translation> <translation id="9082874451376019682">ምንም ቀዳሚ ተንሸራታች የለም።</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ar.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ar.xtb index 60b60dd..010dd9e 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ar.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ar.xtb
@@ -781,7 +781,6 @@ <translation id="9027462562263121875">ليست هناك أية جداول.</translation> <translation id="9040132695316389094">العنوان الأول</translation> <translation id="9043969572162476692"><ph name="NUM" />%</translation> -<translation id="9061915073547935367">تبديل أداة البحث</translation> <translation id="9065283790526219006">+قائمة منبثقة</translation> <translation id="9077213568694924680">تمت الإزالة من التحديد</translation> <translation id="9082874451376019682">ليس هناك شريط تمرير سابق.</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_bg.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_bg.xtb index 6bd5318..74c2e66c 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_bg.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_bg.xtb
@@ -781,7 +781,6 @@ <translation id="9027462562263121875">Няма таблици.</translation> <translation id="9040132695316389094">Заглавие от първо ниво</translation> <translation id="9043969572162476692"><ph name="NUM" />%</translation> -<translation id="9061915073547935367">Превключване на приспособлението за търсене</translation> <translation id="9065283790526219006">+изскачащ прозорец</translation> <translation id="9077213568694924680">премахнати от открояването</translation> <translation id="9082874451376019682">Няма предишен плъзгач.</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_bn.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_bn.xtb index bd55197a9..c8f9f21 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_bn.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_bn.xtb
@@ -553,7 +553,7 @@ <translation id="6307969636681130414">টেপা হয়েছে</translation> <translation id="6324551002951139333">ব্যকরণগত ত্রুটি সনাক্ত হয়েছে</translation> <translation id="6348657800373377022">কম্বো বাক্স</translation> -<translation id="6350358010104919766">{COUNT,plural, =1{বুলেট চিহ্ন}one{#টি বুলেট চিহ্ন}other{#টি বুলেট চিহ্ন}}</translation> +<translation id="6350358010104919766">{COUNT,plural, =1{টি বুলেট চিহ্ন}one{#টি বুলেট চিহ্ন}other{#টি বুলেট চিহ্ন}}</translation> <translation id="6355910664415701303">কোনো পূর্ববর্তী তালিকা আইটেম নেই৷</translation> <translation id="6364795331201459219">h6</translation> <translation id="6368143427468974988">পূর্ববর্তী শিরোনাম</translation> @@ -582,7 +582,7 @@ <translation id="6659594942844771486">ট্যাব</translation> <translation id="667999046851023355">দস্তাবেজ</translation> <translation id="6697092096875747123">পূর্ববর্তী কম্বো বাক্স</translation> -<translation id="6702609185760332517">{COUNT,plural, =1{বিস্মযসূচক চিহ্ন}one{#টি বিস্ময়সূচক চিহ্ন}other{#টি বিস্ময়সূচক চিহ্ন}}</translation> +<translation id="6702609185760332517">{COUNT,plural, =1{টি বিস্ময়সূচক চিহ্ন}one{#টি বিস্ময়সূচক চিহ্ন}other{#টি বিস্ময়সূচক চিহ্ন}}</translation> <translation id="6710213216561001401">পূর্ববর্তী</translation> <translation id="6714813999819678458">পূর্ববর্তী স্তর ২ শিরোনাম</translation> <translation id="6716505898850596801">সংশোধক কীগুলি</translation> @@ -781,7 +781,6 @@ <translation id="9027462562263121875">কোনো সারণী নেই৷</translation> <translation id="9040132695316389094">শিরোনাম ১</translation> <translation id="9043969572162476692"><ph name="NUM" />%</translation> -<translation id="9061915073547935367">অনুসন্ধান উইজেট টগল করুন</translation> <translation id="9065283790526219006">+পপআপ</translation> <translation id="9077213568694924680">নির্বাচন থেকে সরিয়ে ফেলা হয়েছে</translation> <translation id="9082874451376019682">কোনো পূর্ববর্তী স্লাইডার নেই৷</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ca.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ca.xtb index d09ed2c..3276b7d 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ca.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ca.xtb
@@ -781,7 +781,6 @@ <translation id="9027462562263121875">No hi ha cap taula.</translation> <translation id="9040132695316389094">Capçalera 1</translation> <translation id="9043969572162476692"><ph name="NUM" />%</translation> -<translation id="9061915073547935367">Canvia el widget de la cerca.</translation> <translation id="9065283790526219006">+element emergent</translation> <translation id="9077213568694924680">s'ha suprimit de la selecció.</translation> <translation id="9082874451376019682">No hi ha cap control lliscant anterior.</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_cs.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_cs.xtb index 25ddad33..9374e1ae 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_cs.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_cs.xtb
@@ -781,7 +781,6 @@ <translation id="9027462562263121875">Žádné tabulky.</translation> <translation id="9040132695316389094">Nadpis 1</translation> <translation id="9043969572162476692"><ph name="NUM" /> %</translation> -<translation id="9061915073547935367">Přepnout vyhledávací widget</translation> <translation id="9065283790526219006">+vyskakovací okno</translation> <translation id="9077213568694924680">odebráno z výběru</translation> <translation id="9082874451376019682">Žádný předchozí posuvník.</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_da.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_da.xtb index 0cc01fd..dd8348c 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_da.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_da.xtb
@@ -781,7 +781,6 @@ <translation id="9027462562263121875">Ingen tabeller.</translation> <translation id="9040132695316389094">Overskrift 1</translation> <translation id="9043969572162476692"><ph name="NUM" /> %</translation> -<translation id="9061915073547935367">Slå søgewidget til og fra</translation> <translation id="9065283790526219006">+pop op-vindue</translation> <translation id="9077213568694924680">fjernet fra det valgte</translation> <translation id="9082874451376019682">Ingen tidligere skydere.</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_de.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_de.xtb index 7a87a22..7fa597b6 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_de.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_de.xtb
@@ -781,7 +781,6 @@ <translation id="9027462562263121875">Keine Tabellen</translation> <translation id="9040132695316389094">Überschrift 1</translation> <translation id="9043969572162476692"><ph name="NUM" /> %</translation> -<translation id="9061915073547935367">Such-Widget aktivieren/deaktivieren</translation> <translation id="9065283790526219006">+ Pop-up-Fenster</translation> <translation id="9077213568694924680">aus der Auswahl entfernt</translation> <translation id="9082874451376019682">Kein vorheriger Schieberegler</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_el.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_el.xtb index fdab83b..5197c5cb 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_el.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_el.xtb
@@ -781,7 +781,6 @@ <translation id="9027462562263121875">Δεν υπάρχουν πίνακες.</translation> <translation id="9040132695316389094">Επικεφαλίδα 1</translation> <translation id="9043969572162476692"><ph name="NUM" />%</translation> -<translation id="9061915073547935367">Εναλλαγή γραφικού στοιχείου αναζήτησης</translation> <translation id="9065283790526219006">+αναδυόμενα παράθυρα</translation> <translation id="9077213568694924680">καταργήθηκε από την επιλογή</translation> <translation id="9082874451376019682">Δεν υπάρχει προηγούμενο ρυθμιστικό.</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_en-GB.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_en-GB.xtb index e7360e7..cbdffa9 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_en-GB.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_en-GB.xtb
@@ -781,7 +781,6 @@ <translation id="9027462562263121875">No tables.</translation> <translation id="9040132695316389094">Heading 1</translation> <translation id="9043969572162476692"><ph name="NUM" />%</translation> -<translation id="9061915073547935367">Toggle search widget</translation> <translation id="9065283790526219006">+pop-up</translation> <translation id="9077213568694924680">removed from selection</translation> <translation id="9082874451376019682">No previous slider.</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_es-419.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_es-419.xtb index 69183ea8..1c7f12f9 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_es-419.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_es-419.xtb
@@ -781,7 +781,6 @@ <translation id="9027462562263121875">No hay tablas.</translation> <translation id="9040132695316389094">Encabezado 1</translation> <translation id="9043969572162476692"><ph name="NUM" /> %</translation> -<translation id="9061915073547935367">Alternar widget de búsqueda</translation> <translation id="9065283790526219006">+emergente</translation> <translation id="9077213568694924680">eliminado de la selección</translation> <translation id="9082874451376019682">No hay ningún control deslizante anterior.</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_es.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_es.xtb index 25f25f3..ac426102 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_es.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_es.xtb
@@ -781,7 +781,6 @@ <translation id="9027462562263121875">No hay tablas.</translation> <translation id="9040132695316389094">Título 1</translation> <translation id="9043969572162476692"><ph name="NUM" />%</translation> -<translation id="9061915073547935367">Activa o desactiva widget de búsqueda</translation> <translation id="9065283790526219006">más componente emergente</translation> <translation id="9077213568694924680">eliminado de la selección</translation> <translation id="9082874451376019682">No hay ningún control deslizante anterior.</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_et.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_et.xtb index ae994b41..b302bdc8 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_et.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_et.xtb
@@ -781,7 +781,6 @@ <translation id="9027462562263121875">Tabeleid ei ole.</translation> <translation id="9040132695316389094">1. pealkiri</translation> <translation id="9043969572162476692"><ph name="NUM" />%</translation> -<translation id="9061915073547935367">Otsinguvidin sisse/välja</translation> <translation id="9065283790526219006">+hüpik</translation> <translation id="9077213568694924680">eemaldatakse valikust</translation> <translation id="9082874451376019682">Eelmist liugurit ei ole.</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fa.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fa.xtb index e6ad006..914a334b 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fa.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fa.xtb
@@ -781,7 +781,6 @@ <translation id="9027462562263121875">جدولی وجود ندارد.</translation> <translation id="9040132695316389094">عنوان ۱</translation> <translation id="9043969572162476692"><ph name="NUM" />٪</translation> -<translation id="9061915073547935367">جابجایی ابزارک جستجو</translation> <translation id="9065283790526219006">+پنجره بازشو</translation> <translation id="9077213568694924680">از قسمت انتخابی حذف شد</translation> <translation id="9082874451376019682">اسلایدر قبلی موجود نیست.</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fi.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fi.xtb index 492b0817..0198506 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fi.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fi.xtb
@@ -781,7 +781,6 @@ <translation id="9027462562263121875">Ei taulukoita.</translation> <translation id="9040132695316389094">Otsikko 1</translation> <translation id="9043969572162476692"><ph name="NUM" /> %</translation> -<translation id="9061915073547935367">Ota hakuwidget käyttöön tai poista se käytöstä</translation> <translation id="9065283790526219006">+ponnahdus</translation> <translation id="9077213568694924680">poistettu valinnasta</translation> <translation id="9082874451376019682">Ei edellisiä liukusäätimiä.</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fil.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fil.xtb index 7ad5902..f6596e2 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fil.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fil.xtb
@@ -781,7 +781,6 @@ <translation id="9027462562263121875">Walang mga talahanayan.</translation> <translation id="9040132695316389094">Heading 1</translation> <translation id="9043969572162476692"><ph name="NUM" />%</translation> -<translation id="9061915073547935367">I-toggle ang widget ng paghahanap</translation> <translation id="9065283790526219006">+popup</translation> <translation id="9077213568694924680">inalis sa pagpili</translation> <translation id="9082874451376019682">Walang nakaraang slider.</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fr.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fr.xtb index 826d7ff..5a773d1e 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fr.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fr.xtb
@@ -781,7 +781,6 @@ <translation id="9027462562263121875">Aucun tableau</translation> <translation id="9040132695316389094">Titre 1</translation> <translation id="9043969572162476692"><ph name="NUM" /> %</translation> -<translation id="9061915073547935367">Utiliser un autre widget de recherche</translation> <translation id="9065283790526219006">+pop-up</translation> <translation id="9077213568694924680">supprimé de la sélection</translation> <translation id="9082874451376019682">Aucun curseur précédent</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_gu.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_gu.xtb index 1f3c48e..bbaa514 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_gu.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_gu.xtb
@@ -781,7 +781,6 @@ <translation id="9027462562263121875">કોઈ કોષ્ટકો નથી.</translation> <translation id="9040132695316389094">મથાળું 1</translation> <translation id="9043969572162476692"><ph name="NUM" />%</translation> -<translation id="9061915073547935367">શોધ વિજેટને ટૉગલ કરો</translation> <translation id="9065283790526219006">+પૉપઅપ</translation> <translation id="9077213568694924680">પસંદગીમાંથી દૂર કર્યું</translation> <translation id="9082874451376019682">પહેલાનું સ્લાઇડર નથી.</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_hi.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_hi.xtb index 4ba05cc..f875be8d 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_hi.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_hi.xtb
@@ -781,7 +781,6 @@ <translation id="9027462562263121875">कोई तालिका नहीं.</translation> <translation id="9040132695316389094">शीर्षक 1</translation> <translation id="9043969572162476692"><ph name="NUM" />%</translation> -<translation id="9061915073547935367">खोज विजेट टॉगल करें</translation> <translation id="9065283790526219006">+popup</translation> <translation id="9077213568694924680">चयन से निकाले गए</translation> <translation id="9082874451376019682">कोई पिछला स्लाइडर नहीं.</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_hr.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_hr.xtb index 12d0743..022e4205 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_hr.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_hr.xtb
@@ -781,7 +781,6 @@ <translation id="9027462562263121875">Nema tablica.</translation> <translation id="9040132695316389094">Naslov 1</translation> <translation id="9043969572162476692"><ph name="NUM" />%</translation> -<translation id="9061915073547935367">Prikazivanje/sakrivanje widgeta za pretraživanje</translation> <translation id="9065283790526219006">+ skočni prozor</translation> <translation id="9077213568694924680">uklonjeno iz odabira</translation> <translation id="9082874451376019682">Nema prethodnog klizača.</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_hu.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_hu.xtb index 2197400..20e446224 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_hu.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_hu.xtb
@@ -781,7 +781,6 @@ <translation id="9027462562263121875">Nincsenek táblázatok.</translation> <translation id="9040132695316389094">1-es címsor</translation> <translation id="9043969572162476692"><ph name="NUM" />%</translation> -<translation id="9061915073547935367">Keresési modul ki- és bekapcsolása</translation> <translation id="9065283790526219006">+előugr</translation> <translation id="9077213568694924680">eltávolítva a kiválasztottak közül</translation> <translation id="9082874451376019682">Nincs előző dia.</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_id.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_id.xtb index 418ce97f..67708ae 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_id.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_id.xtb
@@ -781,7 +781,6 @@ <translation id="9027462562263121875">Tidak ada tabel.</translation> <translation id="9040132695316389094">Judul 1</translation> <translation id="9043969572162476692"><ph name="NUM" />%</translation> -<translation id="9061915073547935367">Beralih ke widget penelusuran</translation> <translation id="9065283790526219006">+popup</translation> <translation id="9077213568694924680">dihapus dari pilihan</translation> <translation id="9082874451376019682">Tidak ada penggeser sebelumnya.</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_it.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_it.xtb index b5e621a..f909f7d 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_it.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_it.xtb
@@ -781,7 +781,6 @@ <translation id="9027462562263121875">Nessuna tabella.</translation> <translation id="9040132695316389094">Intestazione 1</translation> <translation id="9043969572162476692"><ph name="NUM" />%</translation> -<translation id="9061915073547935367">Attiva/disattiva widget di ricerca</translation> <translation id="9065283790526219006">+popup</translation> <translation id="9077213568694924680">rimossi dalla selezione</translation> <translation id="9082874451376019682">Nessun dispositivo di scorrimento precedente.</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_iw.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_iw.xtb index cd96ec3..48109410 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_iw.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_iw.xtb
@@ -781,7 +781,6 @@ <translation id="9027462562263121875">אין טבלאות.</translation> <translation id="9040132695316389094">כותרת 1</translation> <translation id="9043969572162476692">%<ph name="NUM" /></translation> -<translation id="9061915073547935367">החלף ווידג'ט חיפוש</translation> <translation id="9065283790526219006">+popup</translation> <translation id="9077213568694924680">הוסר מהבחירה</translation> <translation id="9082874451376019682">אין מחוון קודם.</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ja.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ja.xtb index 43091e8..d38ff4b 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ja.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ja.xtb
@@ -781,7 +781,6 @@ <translation id="9027462562263121875">表がありません。</translation> <translation id="9040132695316389094">見出し 1</translation> <translation id="9043969572162476692"><ph name="NUM" />%</translation> -<translation id="9061915073547935367">検索ウィジェットを切り替える</translation> <translation id="9065283790526219006">ポップアップあり</translation> <translation id="9077213568694924680">選択範囲から削除されています</translation> <translation id="9082874451376019682">前のスライダはありません。</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_kn.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_kn.xtb index 0859357..b237fb9 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_kn.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_kn.xtb
@@ -781,7 +781,6 @@ <translation id="9027462562263121875">ಯಾವುದೇ ಕೋಷ್ಟಕಗಳಿಲ್ಲ.</translation> <translation id="9040132695316389094">ಶೀರ್ಷಿಕೆ 1</translation> <translation id="9043969572162476692"><ph name="NUM" />%</translation> -<translation id="9061915073547935367">ಹುಡುಕಾಟ ವಿಜೆಟ್ ಅನ್ನು ಟಾಗಲ್ ಮಾಡಿ</translation> <translation id="9065283790526219006">+ಪಾಪ್ಅಪ್</translation> <translation id="9077213568694924680">ಆಯ್ಕೆಯಿಂದ ತೆಗೆದುಹಾಕಲಾಗಿದೆ</translation> <translation id="9082874451376019682">ಹಿಂದಿನ ಸ್ಲೈಡರ್ ಇಲ್ಲ.</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ko.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ko.xtb index ca0fcdb..434ba67 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ko.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ko.xtb
@@ -781,7 +781,6 @@ <translation id="9027462562263121875">표가 없습니다.</translation> <translation id="9040132695316389094">제목 1</translation> <translation id="9043969572162476692"><ph name="NUM" />%</translation> -<translation id="9061915073547935367">검색 위젯 전환</translation> <translation id="9065283790526219006">팝업있음</translation> <translation id="9077213568694924680">선택 항목에서 삭제</translation> <translation id="9082874451376019682">이전 슬라이더가 없습니다.</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_lt.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_lt.xtb index cf69c50b..df807fd 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_lt.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_lt.xtb
@@ -781,7 +781,6 @@ <translation id="9027462562263121875">Nėra lentelių.</translation> <translation id="9040132695316389094">1 antraštė</translation> <translation id="9043969572162476692"><ph name="NUM" /> %</translation> -<translation id="9061915073547935367">Perjungti paieškos valdiklį</translation> <translation id="9065283790526219006">+iššokantysis langas</translation> <translation id="9077213568694924680">pašalinta iš pasirinkimo srities</translation> <translation id="9082874451376019682">Nėra ankstesnio šliaužiklio.</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_lv.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_lv.xtb index 35915bc..d10b8d8 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_lv.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_lv.xtb
@@ -781,7 +781,6 @@ <translation id="9027462562263121875">Nav tabulu.</translation> <translation id="9040132695316389094">1. līmeņa virsraksts</translation> <translation id="9043969572162476692"><ph name="NUM" />%</translation> -<translation id="9061915073547935367">Pārslēgt meklēšanas logrīku</translation> <translation id="9065283790526219006">ietver uznirstošu elementu</translation> <translation id="9077213568694924680">noņemti no atlases</translation> <translation id="9082874451376019682">Iepriekš nav neviena slīdņa.</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ml.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ml.xtb index 6ba6c787..a058eca 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ml.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ml.xtb
@@ -781,7 +781,6 @@ <translation id="9027462562263121875">പട്ടികകൾ ഒന്നുമില്ല.</translation> <translation id="9040132695316389094">ശീർഷകം 1</translation> <translation id="9043969572162476692"><ph name="NUM" />%</translation> -<translation id="9061915073547935367">തിരയൽ വിജറ്റ് ടോഗിൾ ചെയ്യുക</translation> <translation id="9065283790526219006">+പോപ്പ്അപ്പ്</translation> <translation id="9077213568694924680">തിരഞ്ഞെടുത്തതിൽ നിന്നും നീക്കംചെയ്തു</translation> <translation id="9082874451376019682">മുൻ സ്ലൈഡർ ഒന്നുമില്ല.</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_mr.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_mr.xtb index 7b644b8e..b89b76f 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_mr.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_mr.xtb
@@ -781,7 +781,6 @@ <translation id="9027462562263121875">कोणत्याही सारण्या नाहीत.</translation> <translation id="9040132695316389094">मथळा 1</translation> <translation id="9043969572162476692"><ph name="NUM" />%</translation> -<translation id="9061915073547935367">टॉगल शोध विजेट</translation> <translation id="9065283790526219006">+पॉपअप</translation> <translation id="9077213568694924680">निवडीमधून काढले</translation> <translation id="9082874451376019682">मागील स्लायडर नाही.</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ms.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ms.xtb index 813f0c3..3a8bcf4 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ms.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ms.xtb
@@ -781,7 +781,6 @@ <translation id="9027462562263121875">Tiada jadual.</translation> <translation id="9040132695316389094">Tajuk 1</translation> <translation id="9043969572162476692"><ph name="NUM" />%</translation> -<translation id="9061915073547935367">Togol widget carian</translation> <translation id="9065283790526219006">+pop timbul</translation> <translation id="9077213568694924680">dialih keluar daripada pilihan</translation> <translation id="9082874451376019682">Tiada peluncur terdahulu.</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_nl.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_nl.xtb index 53a7326..3005631 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_nl.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_nl.xtb
@@ -50,7 +50,7 @@ <translation id="1506187449813838456">Toonhoogte verhogen</translation> <translation id="151784044608172266">Volgende zin</translation> <translation id="1524531499102321782">Volgende brailleregel</translation> -<translation id="1546370775711804143">Schuifbalk</translation> +<translation id="1546370775711804143">Scrollbar</translation> <translation id="1559739829547075274">Terug navigeren</translation> <translation id="1571643229714746283">ChromeVox gereed</translation> <translation id="158493514907962286">december</translation> @@ -108,7 +108,7 @@ <translation id="2223693656926968778">Actie ondernemen voor huidig item</translation> <translation id="225732394367814946">Spreeksnelheid verhogen</translation> <translation id="2267945578749931355">Volgend teken</translation> -<translation id="2281234842553884450">Vorige schuifbalk</translation> +<translation id="2281234842553884450">Vorige scrollbar</translation> <translation id="2318372665160196757">Hoofd</translation> <translation id="2329324941084714723">Deelvenster met tabblad</translation> <translation id="2344193891939537199">Bedieningselement voor datum/tijd</translation> @@ -333,7 +333,7 @@ <translation id="4188530942454211480">Vorige zin</translation> <translation id="4202186506458631436">Naar rechts verplaatsen</translation> <translation id="4206289001967551965">In tabel</translation> -<translation id="4215733775853809057">Volgende schuifbalk</translation> +<translation id="4215733775853809057">Volgende scrollbar</translation> <translation id="4218529045364428769">{COUNT,plural, =1{streepje}other{# streepjes}}</translation> <translation id="421884353938374759">kleurkiezer</translation> <translation id="4229646983878045487">datum tijd</translation> @@ -657,7 +657,7 @@ <translation id="7492049978501397201">Geopend dialoogvenster</translation> <translation id="7518543783849163354">Druk op de Ctrl-toets om de spraakfunctie van ChromeVox tijdelijk uit te schakelen.</translation> <translation id="7532613204005497612">juni</translation> -<translation id="7540083713905917247"><ph name="VALUE" />, <ph name="NAME" />, schuifbalk</translation> +<translation id="7540083713905917247"><ph name="VALUE" />, <ph name="NAME" />, scrollbar</translation> <translation id="7552432549459840808">Handige Chrome-snelkoppelingen</translation> <translation id="7596919493010894443">selectie gewist</translation> <translation id="7604026522577407655">Naar het begin van de huidige kolom gaan</translation> @@ -781,7 +781,6 @@ <translation id="9027462562263121875">Geen tabellen.</translation> <translation id="9040132695316389094">Kop 1</translation> <translation id="9043969572162476692"><ph name="NUM" />%</translation> -<translation id="9061915073547935367">Zoekwidget in-/uitschakelen</translation> <translation id="9065283790526219006">+pop-up</translation> <translation id="9077213568694924680">uit selectie verwijderd</translation> <translation id="9082874451376019682">Geen vorige schuifregelaar.</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_no.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_no.xtb index 58a5b5a7..a972a4cb 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_no.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_no.xtb
@@ -781,7 +781,6 @@ <translation id="9027462562263121875">Det finnes ingen tabeller.</translation> <translation id="9040132695316389094">Overskrift 1</translation> <translation id="9043969572162476692"><ph name="NUM" /> %</translation> -<translation id="9061915073547935367">Slå av og på søkemodulen</translation> <translation id="9065283790526219006">+forgrunnsvindu</translation> <translation id="9077213568694924680">fjernet fra utvalget</translation> <translation id="9082874451376019682">Det fins ingen tidligere glidebrytere.</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_pl.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_pl.xtb index 1b93bf98e..0fe0405 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_pl.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_pl.xtb
@@ -781,7 +781,6 @@ <translation id="9027462562263121875">Brak tabel.</translation> <translation id="9040132695316389094">Nagłówek 1</translation> <translation id="9043969572162476692"><ph name="NUM" />%</translation> -<translation id="9061915073547935367">Przełącz widżet wyszukiwania</translation> <translation id="9065283790526219006">+wyskakujące okienko</translation> <translation id="9077213568694924680">usunięto zaznaczenie</translation> <translation id="9082874451376019682">Brak poprzedniego suwaka.</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_pt-BR.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_pt-BR.xtb index 57214b8..25f02369 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_pt-BR.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_pt-BR.xtb
@@ -781,7 +781,6 @@ <translation id="9027462562263121875">Nenhuma tabela.</translation> <translation id="9040132695316389094">Cabeçalho 1</translation> <translation id="9043969572162476692"><ph name="NUM" />%</translation> -<translation id="9061915073547935367">Alternar para widget de pesquisa</translation> <translation id="9065283790526219006">+popup</translation> <translation id="9077213568694924680">removido da seleção</translation> <translation id="9082874451376019682">Nenhum controle deslizante anterior.</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_pt-PT.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_pt-PT.xtb index 00986bf..7c0e782 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_pt-PT.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_pt-PT.xtb
@@ -781,7 +781,6 @@ <translation id="9027462562263121875">Não existem tabelas.</translation> <translation id="9040132695316389094">Título 1</translation> <translation id="9043969572162476692"><ph name="NUM" />%</translation> -<translation id="9061915073547935367">Ativar/desativar widget de pesquisa</translation> <translation id="9065283790526219006">+popup</translation> <translation id="9077213568694924680">removido da seleção</translation> <translation id="9082874451376019682">Não existe nenhum controlo de deslize anterior.</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ro.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ro.xtb index 86546765..b57ad0a2 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ro.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ro.xtb
@@ -781,7 +781,6 @@ <translation id="9027462562263121875">Nu există tabele.</translation> <translation id="9040132695316389094">Titlu 1</translation> <translation id="9043969572162476692"><ph name="NUM" />%</translation> -<translation id="9061915073547935367">Afișați/ascundeți widgetul de căutare</translation> <translation id="9065283790526219006">+fereastră pop-up</translation> <translation id="9077213568694924680">eliminate din selecție</translation> <translation id="9082874451376019682">Nu există un glisor anterior.</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ru.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ru.xtb index 323123e..756bf6e 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ru.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ru.xtb
@@ -781,7 +781,6 @@ <translation id="9027462562263121875">Таблиц нет.</translation> <translation id="9040132695316389094">Заголовок первого уровня</translation> <translation id="9043969572162476692"><ph name="NUM" />%</translation> -<translation id="9061915073547935367">Переключить виджет поиска</translation> <translation id="9065283790526219006">+popup</translation> <translation id="9077213568694924680">Удалено из выбранного фрагмента.</translation> <translation id="9082874451376019682">Предыдущего ползунка нет.</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sk.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sk.xtb index 07222ef2..c4da4e9 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sk.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sk.xtb
@@ -781,7 +781,6 @@ <translation id="9027462562263121875">Žiadne tabuľky</translation> <translation id="9040132695316389094">Nadpis 1</translation> <translation id="9043969572162476692"><ph name="NUM" /> %</translation> -<translation id="9061915073547935367">Prepnúť miniaplikáciu vyhľadávania</translation> <translation id="9065283790526219006">+kontextové okno</translation> <translation id="9077213568694924680">odstránené z výberu</translation> <translation id="9082874451376019682">Žiadny predchádzajúci posúvač</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sl.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sl.xtb index 468f65f..9657982 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sl.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sl.xtb
@@ -781,7 +781,6 @@ <translation id="9027462562263121875">Ni tabel.</translation> <translation id="9040132695316389094">Naslov 1</translation> <translation id="9043969572162476692"><ph name="NUM" /> %</translation> -<translation id="9061915073547935367">Preklop pripomočka za iskanje</translation> <translation id="9065283790526219006">+pojavnookno</translation> <translation id="9077213568694924680">odstranjeni iz izbora</translation> <translation id="9082874451376019682">Ni prejšnjega drsnika.</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sr.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sr.xtb index 3257d8b..2b03f9a 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sr.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sr.xtb
@@ -781,7 +781,6 @@ <translation id="9027462562263121875">Нема табела.</translation> <translation id="9040132695316389094">Заглавље 1</translation> <translation id="9043969572162476692"><ph name="NUM" />%</translation> -<translation id="9061915073547935367">Укључивање/искључивање виџета за претрагу</translation> <translation id="9065283790526219006">+popup</translation> <translation id="9077213568694924680">уклоњено из избора</translation> <translation id="9082874451376019682">Нема претходног клизача.</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sv.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sv.xtb index 451979a9..39aa39c 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sv.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sv.xtb
@@ -781,7 +781,6 @@ <translation id="9027462562263121875">Det finns inga tabeller.</translation> <translation id="9040132695316389094">Rubrik 1</translation> <translation id="9043969572162476692"><ph name="NUM" /> %</translation> -<translation id="9061915073547935367">Aktivera/inaktivera sökwidget</translation> <translation id="9065283790526219006">+popup</translation> <translation id="9077213568694924680">togs bort från markeringen</translation> <translation id="9082874451376019682">Det finns inget föregående skjutreglage.</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sw.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sw.xtb index 38d319f..39348f0 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sw.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sw.xtb
@@ -581,7 +581,7 @@ <translation id="6659594942844771486">Kichupo</translation> <translation id="667999046851023355">Hati</translation> <translation id="6697092096875747123">Kikasha mseto kilichotangulia</translation> -<translation id="6702609185760332517">{COUNT,plural, =1{alama ya mshangao}other{alama # za mshangao}}</translation> +<translation id="6702609185760332517">{COUNT,plural, =1{alama hisi}other{alama hisi #}}</translation> <translation id="6710213216561001401">Iliyotangulia</translation> <translation id="6714813999819678458">Kichwa cha ngazi ya 2 kilichotangulia</translation> <translation id="6716505898850596801">Vitufe vya kurekebisha</translation> @@ -780,7 +780,6 @@ <translation id="9027462562263121875">Hakuna majedwali.</translation> <translation id="9040132695316389094">Kichwa cha 1</translation> <translation id="9043969572162476692"><ph name="NUM" />%</translation> -<translation id="9061915073547935367">Badilisha wijeti ya utafutaji</translation> <translation id="9065283790526219006">+dirisha ibukizi</translation> <translation id="9077213568694924680">imeondolewa kwenye uchaguzi</translation> <translation id="9082874451376019682">Hakuna kitelezi kilichotangulia.</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ta.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ta.xtb index 8ebcda7..345780f 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ta.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ta.xtb
@@ -781,7 +781,6 @@ <translation id="9027462562263121875">அட்டவணைகள் இல்லை.</translation> <translation id="9040132695316389094">தலைப்பு 1</translation> <translation id="9043969572162476692"><ph name="NUM" />%</translation> -<translation id="9061915073547935367">தேடல் விட்ஜெட்டை மாற்று</translation> <translation id="9065283790526219006">+பாப்அப்</translation> <translation id="9077213568694924680">தேர்விலிருந்து அகற்றப்பட்டது</translation> <translation id="9082874451376019682">முந்தைய ஸ்லைடர் இல்லை.</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_te.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_te.xtb index 0a1c912..a8b773e3 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_te.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_te.xtb
@@ -781,7 +781,6 @@ <translation id="9027462562263121875">పట్టికలు లేవు.</translation> <translation id="9040132695316389094">శీర్షిక 1</translation> <translation id="9043969572162476692"><ph name="NUM" />%</translation> -<translation id="9061915073547935367">శోధన విడ్జెట్ను టోగుల్ చేయండి</translation> <translation id="9065283790526219006">+పాప్అప్</translation> <translation id="9077213568694924680">ఎంపిక నుండి తీసివేయబడింది</translation> <translation id="9082874451376019682">మునుపటి స్లయిడర్ లేదు.</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_th.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_th.xtb index 5db5fec..1896ff5 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_th.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_th.xtb
@@ -780,7 +780,6 @@ <translation id="9027462562263121875">ไม่มีตาราง</translation> <translation id="9040132695316389094">ส่วนหัวระดับ 1</translation> <translation id="9043969572162476692"><ph name="NUM" />%</translation> -<translation id="9061915073547935367">สลับวิดเจ็ตการค้นหา</translation> <translation id="9065283790526219006">+ป๊อปอัป</translation> <translation id="9077213568694924680">ลบออกจากการเลือกแล้ว</translation> <translation id="9082874451376019682">ไม่มีแถบเลื่อนก่อนหน้า</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_tr.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_tr.xtb index 2c49dc9..66d4ec5 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_tr.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_tr.xtb
@@ -781,7 +781,6 @@ <translation id="9027462562263121875">Tablo yok.</translation> <translation id="9040132695316389094">Başlık 1</translation> <translation id="9043969572162476692">%<ph name="NUM" /></translation> -<translation id="9061915073547935367">Arama widget'ını değiştir</translation> <translation id="9065283790526219006">+popup</translation> <translation id="9077213568694924680">seçimden kaldırıldı</translation> <translation id="9082874451376019682">Önceki kaydırma çubuğu yok.</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_uk.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_uk.xtb index dca26d2..e8da342 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_uk.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_uk.xtb
@@ -553,7 +553,7 @@ <translation id="6307969636681130414">Натиснуто</translation> <translation id="6324551002951139333">Виявлено граматичну помилку</translation> <translation id="6348657800373377022">Комбіноване вікно</translation> -<translation id="6350358010104919766">{COUNT,plural, =1{позначка}one{# позначка}few{# позначки}many{# позначок}other{# позначки}}</translation> +<translation id="6350358010104919766">{COUNT,plural, =1{маркер списку}one{# маркер списку}few{# маркери списку}many{# маркерів списку}other{# маркера списку}}</translation> <translation id="6355910664415701303">Немає попереднього пункту списку.</translation> <translation id="6364795331201459219">заголовок 6</translation> <translation id="6368143427468974988">Попередній заголовок</translation> @@ -781,7 +781,6 @@ <translation id="9027462562263121875">Немає таблиць.</translation> <translation id="9040132695316389094">Заголовок 1</translation> <translation id="9043969572162476692"><ph name="NUM" />%</translation> -<translation id="9061915073547935367">Увімкнути чи вимкнути віджет пошуку</translation> <translation id="9065283790526219006">+ спливаюче вікно</translation> <translation id="9077213568694924680">видалено з виділеного</translation> <translation id="9082874451376019682">Немає попереднього повзунка.</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_vi.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_vi.xtb index 1ccfe6c5..59a0aac2 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_vi.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_vi.xtb
@@ -781,7 +781,6 @@ <translation id="9027462562263121875">Không có bảng nào.</translation> <translation id="9040132695316389094">Tiêu đề 1</translation> <translation id="9043969572162476692"><ph name="NUM" />%</translation> -<translation id="9061915073547935367">Bật/tắt tiện ích tìm kiếm</translation> <translation id="9065283790526219006">+cửa sổ bật lên</translation> <translation id="9077213568694924680">đã xóa khỏi lựa chọn</translation> <translation id="9082874451376019682">Không có thanh trượt trước nào.</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_zh-CN.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_zh-CN.xtb index d16a459..09563de 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_zh-CN.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_zh-CN.xtb
@@ -781,7 +781,6 @@ <translation id="9027462562263121875">无表格。</translation> <translation id="9040132695316389094">1级标题标记</translation> <translation id="9043969572162476692">百分之<ph name="NUM" /></translation> -<translation id="9061915073547935367">切换搜索小工具</translation> <translation id="9065283790526219006">含弹出项</translation> <translation id="9077213568694924680">已从所选文字中移除</translation> <translation id="9082874451376019682">不存在上一个滑块。</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_zh-TW.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_zh-TW.xtb index 88b5b39..fd49554 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_zh-TW.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_zh-TW.xtb
@@ -781,7 +781,6 @@ <translation id="9027462562263121875">沒有表格。</translation> <translation id="9040132695316389094">標題 1</translation> <translation id="9043969572162476692">百分之 <ph name="NUM" /></translation> -<translation id="9061915073547935367">切換搜尋小工具</translation> <translation id="9065283790526219006">含彈出式元件</translation> <translation id="9077213568694924680">已從所選範圍中移除</translation> <translation id="9082874451376019682">沒有上一個滑桿。</translation>
diff --git a/chrome/browser/resources/chromeos/login/custom_elements_oobe.html b/chrome/browser/resources/chromeos/login/custom_elements_oobe.html index 8059344..55d374f 100644 --- a/chrome/browser/resources/chromeos/login/custom_elements_oobe.html +++ b/chrome/browser/resources/chromeos/login/custom_elements_oobe.html
@@ -20,6 +20,7 @@ <include src="oobe_eula.html"> <include src="oobe_update.html"> <include src="oobe_i18n_dropdown.html"> +<include src="oobe_welcome_dialog.html"> <include src="oobe_welcome.html"> <script src="chrome://oobe/custom_elements.js"></script>
diff --git a/chrome/browser/resources/chromeos/login/custom_elements_oobe.js b/chrome/browser/resources/chromeos/login/custom_elements_oobe.js index d919ddf..9474327 100644 --- a/chrome/browser/resources/chromeos/login/custom_elements_oobe.js +++ b/chrome/browser/resources/chromeos/login/custom_elements_oobe.js
@@ -30,4 +30,5 @@ <include src="oobe_eula.js"> <include src="oobe_update.js"> <include src="oobe_i18n_dropdown.js"> +<include src="oobe_welcome_dialog.js"> <include src="oobe_welcome.js">
diff --git a/chrome/browser/resources/chromeos/login/images/welcome_illustration_1x.png b/chrome/browser/resources/chromeos/login/images/welcome_illustration_1x.png deleted file mode 100644 index 17fd99a..0000000 --- a/chrome/browser/resources/chromeos/login/images/welcome_illustration_1x.png +++ /dev/null Binary files differ
diff --git a/chrome/browser/resources/chromeos/login/images/welcome_illustration_2x.png b/chrome/browser/resources/chromeos/login/images/welcome_illustration_2x.png new file mode 100644 index 0000000..8334be16 --- /dev/null +++ b/chrome/browser/resources/chromeos/login/images/welcome_illustration_2x.png Binary files differ
diff --git a/chrome/browser/resources/chromeos/login/oobe_buttons.html b/chrome/browser/resources/chromeos/login/oobe_buttons.html index 2a62637..011900c 100644 --- a/chrome/browser/resources/chromeos/login/oobe_buttons.html +++ b/chrome/browser/resources/chromeos/login/oobe_buttons.html
@@ -5,55 +5,51 @@ <link rel="import" href="chrome://resources/polymer/v1_0/iron-icons/iron-icons.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-fab/paper-fab.html"> -<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/paper-styles/color.html"> <!-- - Material design button that shows an icon. - - Example: - <oobe-icon-button icon="close"></oobe-icon-button> - - Attributes: - 'icon' - a name of icon from material design set to show on button. - 'disabled' - button is disabled when the attribute is set. - 'aria-label' - accessibility label. ---> -<dom-module id="oobe-icon-button"> - <link rel="stylesheet" href="oobe_icon_button.css"> - <template> - <div on-click="onClick_" on-tap="onClick_"> - <paper-icon-button id="iconButton" icon="[[icon]]" disabled="[[disabled]]" - aria-label="[[ariaLabel]]"> - </paper-icon-button> - </div> - </template> -</dom-module> - -<!-- Material design square button for text-labelled buttons. By default, text is blue, background is white. |inverse| makes text white on a blue background. Example: - <oobe-icon-button label="OK" inverse></oobe-icon-button> - <oobe-icon-button label="CANCEL"></oobe-icon-button> + <oobe-icon-button i18n-content="oobeOKButtonText" inverse> + </oobe-icon-button> + <oobe-icon-button i18n-content="oobeCancelButtonText"></oobe-icon-button> Attributes: - 'label' - text on a button 'disabled' - button is disabled when the attribute is set. 'inverse' - makes text white and background blue --> <dom-module id="oobe-text-button"> <link rel="stylesheet" href="oobe_text_button.css"> <template> - <div on-click="onClick_" on-tap="onClick_"> - <paper-button id="textButton" disabled="[[disabled]]" - inverse$="[[inverse]]"> - [[label]] - <content></content> - </paper-button> - </div> + <paper-button id="textButton" on-tap="onClick_" disabled="[[disabled]]" + inverse$="[[inverse]]"> + <content></content> + </paper-button> </template> </dom-module> +<!-- + Material design button that shows an icon and displays text. + + Example: + <oobe-welcome-secondary-button icon="close" + i18n-content="oobeCloseButtonText"> + </oobe-icon-button> + + Attributes: + 'icon' - a name of icon from material design set to show on button. + 'aria-label' - accessibility label. +--> +<dom-module id="oobe-welcome-secondary-button"> + <link rel="stylesheet" href="oobe_welcome_secondary_button.css"> + <template> + <paper-button id="container" class="layout horizontal center" + aria-label="[[ariaLabel]]"> + <iron-icon icon="[[icon]]" class="oobe-icon"></iron-icon> + <content></content> + </paper-button> + </template> +</dom-module>
diff --git a/chrome/browser/resources/chromeos/login/oobe_buttons.js b/chrome/browser/resources/chromeos/login/oobe_buttons.js index dac5f05..1b469a9 100644 --- a/chrome/browser/resources/chromeos/login/oobe_buttons.js +++ b/chrome/browser/resources/chromeos/login/oobe_buttons.js
@@ -3,34 +3,11 @@ // found in the LICENSE file. Polymer({ - is: 'oobe-icon-button', - - properties: { - disabled: {type: Boolean, value: false, reflectToAttribute: true}, - - icon: String, - - ariaLabel: String - }, - - focus: function() { - this.$.iconButton.focus(); - }, - - onClick_: function(e) { - if (this.disabled) - e.stopPropagation(); - } -}); - -Polymer({ is: 'oobe-text-button', properties: { disabled: {type: Boolean, value: false, reflectToAttribute: true}, - label: String, - inverse: Boolean, }, @@ -43,3 +20,13 @@ e.stopPropagation(); } }); + +Polymer({ + is: 'oobe-welcome-secondary-button', + + properties: { + icon: String, + + ariaLabel: String + }, +});
diff --git a/chrome/browser/resources/chromeos/login/oobe_dialog_host.css b/chrome/browser/resources/chromeos/login/oobe_dialog_host.css index 8be55004e..5caea73 100644 --- a/chrome/browser/resources/chromeos/login/oobe_dialog_host.css +++ b/chrome/browser/resources/chromeos/login/oobe_dialog_host.css
@@ -4,6 +4,8 @@ :host { background-color: white; + border-radius: 2px; + box-shadow: 0 24px 24px rgba(0, 0, 0, .24), 0 0 24px rgba(0, 0, 0, .12); display: flex; flex-direction: column; min-height: 640px;
diff --git a/chrome/browser/resources/chromeos/login/oobe_eula.css b/chrome/browser/resources/chromeos/login/oobe_eula.css index dbc73a9..19bf9fa 100644 --- a/chrome/browser/resources/chromeos/login/oobe_eula.css +++ b/chrome/browser/resources/chromeos/login/oobe_eula.css
@@ -25,7 +25,12 @@ #usageStats { --paper-checkbox-size: 16px; + /* End padding must be greater than --paper-checkbox-label-spacing */ + -webkit-padding-end: 16px; max-width: 550px; padding-bottom: 20px; - padding-right: 16px; /* Must be greater than --paper-checkbox-label-spacing */ +} + +#accept-button-text { + text-transform: uppercase; }
diff --git a/chrome/browser/resources/chromeos/login/oobe_eula.html b/chrome/browser/resources/chromeos/login/oobe_eula.html index b82c146..5fc8eb3 100644 --- a/chrome/browser/resources/chromeos/login/oobe_eula.html +++ b/chrome/browser/resources/chromeos/login/oobe_eula.html
@@ -61,8 +61,10 @@ </div> <div class="bottom-buttons flex layout horizontal end-justified"> <oobe-text-button inverse on-tap="eulaAccepted_" - i18n-content="oobeEulaAcceptAndContinueButtonText" disabled="[[acceptButtonDisabled]]"> + <div i18n-content="oobeEulaAcceptAndContinueButtonText" + id="accept-button-text"> + </div> </oobe-text-button> </div> </oobe-dialog>
diff --git a/chrome/browser/resources/chromeos/login/oobe_i18n_dropdown.css b/chrome/browser/resources/chromeos/login/oobe_i18n_dropdown.css index a47018f..c61bb2a 100644 --- a/chrome/browser/resources/chromeos/login/oobe_i18n_dropdown.css +++ b/chrome/browser/resources/chromeos/login/oobe_i18n_dropdown.css
@@ -2,14 +2,24 @@ * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ +:host { + --paper-font-subhead: { + @apply(--paper-font-common-base); + font-family: Roboto; + font-size: 13px; + }; +} + .selected-icon { --iron-icon-height: 16px; --iron-icon-width: 16px; + -webkit-padding-start: 8px; color: var(--google-blue-500); - padding-left: 8px; } paper-item { + -webkit-padding-end: 8px; + -webkit-padding-start: 16px; min-height: 32px; }
diff --git a/chrome/browser/resources/chromeos/login/oobe_icon_button.css b/chrome/browser/resources/chromeos/login/oobe_icon_button.css deleted file mode 100644 index 86f833f..0000000 --- a/chrome/browser/resources/chromeos/login/oobe_icon_button.css +++ /dev/null
@@ -1,9 +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. */ - -#iconButton { - height: 24px; - padding: 0; - width: 24px; -}
diff --git a/chrome/browser/resources/chromeos/login/oobe_screen.css b/chrome/browser/resources/chromeos/login/oobe_screen.css index e39c7eb..46d703e 100644 --- a/chrome/browser/resources/chromeos/login/oobe_screen.css +++ b/chrome/browser/resources/chromeos/login/oobe_screen.css
@@ -4,6 +4,10 @@ * * This contains common styling for all the OOBE screens. */ +:root { + --oobe-roboto-medium: 500 12px Roboto; +} + .step { box-sizing: border-box; position: absolute;
diff --git a/chrome/browser/resources/chromeos/login/oobe_text_button.css b/chrome/browser/resources/chromeos/login/oobe_text_button.css index dd72df22..3b30241 100644 --- a/chrome/browser/resources/chromeos/login/oobe_text_button.css +++ b/chrome/browser/resources/chromeos/login/oobe_text_button.css
@@ -3,8 +3,8 @@ found in the LICENSE file. */ #textButton { - font: 13px 'Roboto Medium', sans-serif; - height: 32px; + height: 28px; + margin: 0; padding: 0 16px; } @@ -17,3 +17,9 @@ background-color: var(--google-blue-500); color: white; } + +::content * { + font: var(--oobe-roboto-medium), sans-serif; + font-size: 12px; + text-transform: none; +}
diff --git a/chrome/browser/resources/chromeos/login/oobe_welcome.css b/chrome/browser/resources/chromeos/login/oobe_welcome.css index f2bc8fb7..5c9eb56 100644 --- a/chrome/browser/resources/chromeos/login/oobe_welcome.css +++ b/chrome/browser/resources/chromeos/login/oobe_welcome.css
@@ -2,45 +2,6 @@ * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ -/************* Welcome Screen **************/ -#welcomeScreen #welcomeIllustration { - height: max-content; - width: max-content; -} - -#welcomeScreen #welcomeNextButton { - padding-top: 32px; -} - -#welcomeScreen #welcomeButtons { - font-size: 16px; - padding-top: 24px; -} - -#welcomeScreen .buttonbox-text { - align-self: center; - color: rgba(0, 0, 0, 0.54); - font: 16px Roboto, sans-serif; - /* TODO(alemate): max-width should depend on Timezone visibility. */ - max-width: 220px; - padding-top: 32px; - position: absolute; - text-align: center; - top: 32px; - width: max-content; -} - -#welcomeScreen .action-icon { - --iron-icon-height: 32px; - --iron-icon-width: 32px; -} - -#welcomeScreen .action-icon-spacer { - margin: 0; - padding: 0; - width: 218px; -} - /************* Language Screen **************/ #languageScreen .language-selection-entry { border-top: 1px solid lightgrey;
diff --git a/chrome/browser/resources/chromeos/login/oobe_welcome.html b/chrome/browser/resources/chromeos/login/oobe_welcome.html index 7f4a4e4..8b9f027b 100644 --- a/chrome/browser/resources/chromeos/login/oobe_welcome.html +++ b/chrome/browser/resources/chromeos/login/oobe_welcome.html
@@ -23,34 +23,12 @@ <link rel="stylesheet" href="oobe_dialog_host.css"> <link rel="stylesheet" href="oobe_welcome.css"> <link rel="stylesheet" href="oobe_dialog_parameters.css"> - <oobe-dialog id="welcomeScreen" hidden="[[!welcomeScreenShown]]" - welcome-screen> - <div class="header layout vertical end-justified center"> - <h1 class="title" i18n-content="networkScreenGreeting"></h1> - </div> - <div class="footer flex layout vertical center"> - <img id="welcomeIllustration" src="images/welcome_illustration_1x.png"> - <oobe-text-button id="welcomeNextButton" inverse - on-tap="onWelcomeNextButtonClicked_" - i18n-content="welcomeNextButtonText"> - </oobe-text-button> - <div id="welcomeButtons" class="flex horizontal layout justified"> - <div class="layout vertical relative" - on-tap="onWelcomeSelectLanguageButtonClicked_"> - <iron-icon icon="icons:language" class="action-icon"> - </iron-icon> - <div class="buttonbox-text">[[currentLanguage]]</div> - </div> - <div class="action-icon-spacer"></div> - <div class="layout vertical relative" - on-tap="onWelcomeAccessibilityButtonClicked_"> - <iron-icon icon="icons:accessibility" class="action-icon"> - </iron-icon> - <div class="buttonbox-text" i18n-content="accessibilityLink"></div> - </div> - </div> - </div> - </oobe-dialog> + <oobe-welcome-dialog id="welcomeScreen" hidden="[[!welcomeScreenShown]]" + current-language="[[currentLanguage]]" + on-language-button-clicked="onWelcomeSelectLanguageButtonClicked_" + on-accessibility-button-clicked="onWelcomeAccessibilityButtonClicked_" + on-next-button-clicked="onWelcomeNextButtonClicked_"> + </oobe-welcome-dialog> <oobe-dialog id="languageScreen" hidden="[[!languageSelectionScreenShown]]" has-buttons> <iron-icon icon="icons:language" class="oobe-icon"></iron-icon> @@ -82,8 +60,8 @@ </template> </div> <div class="bottom-buttons layout horizontal end-justified"> - <oobe-text-button inverse on-tap="closeLanguageSection_" - i18n-content="oobeOKButtonText"> + <oobe-text-button inverse on-tap="closeLanguageSection_"> + <div i18n-content="oobeOKButtonText"></div> </oobe-text-button> </div> </oobe-dialog> @@ -142,8 +120,8 @@ </oobe-a11y-option> </div> <div class="bottom-buttons layout horizontal end-justified"> - <oobe-text-button inverse on-tap="closeAccessibilitySection_" - i18n-content="oobeOKButtonText"> + <oobe-text-button inverse on-tap="closeAccessibilitySection_"> + <div i18n-content="oobeOKButtonText"></div> </oobe-text-button> </div> </oobe-dialog>
diff --git a/chrome/browser/resources/chromeos/login/oobe_welcome_dialog.css b/chrome/browser/resources/chromeos/login/oobe_welcome_dialog.css new file mode 100644 index 0000000..fd01460 --- /dev/null +++ b/chrome/browser/resources/chromeos/login/oobe_welcome_dialog.css
@@ -0,0 +1,32 @@ +/* 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. */ + +.vertical-margin { + width: 24px; +} + +#bottom-margin { + height: 24px; +} + +#title { + color: rgba(0, 0, 0, 0.87); + font-family: Roboto, sans-serif; + font-size: 38px; + font-weight: normal; + margin: 120px 0 30px 0; +} + +#welcomeIllustration { + height: 300px; + width: 390px; +} + +oobe-welcome-secondary-button { + margin-right: 8px; +} + +#buttons { + width: 100%; +}
diff --git a/chrome/browser/resources/chromeos/login/oobe_welcome_dialog.html b/chrome/browser/resources/chromeos/login/oobe_welcome_dialog.html new file mode 100644 index 0000000..ed02edb --- /dev/null +++ b/chrome/browser/resources/chromeos/login/oobe_welcome_dialog.html
@@ -0,0 +1,41 @@ +<!-- 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. --> + +<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-styles/color.html"> + +<!-- + OOBE Welcome screen +--> +<dom-module name="oobe-welcome-dialog"> + <template> + <link rel="stylesheet" href="oobe_dialog_host.css"> + <link rel="stylesheet" href="oobe_welcome_dialog.css"> + <div class="layout horizontal flex"> + <div class="vertical-margin"></div> + <div class="welcome-content flex layout vertical center"> + <h1 id="title" i18n-content="networkScreenGreeting"></h1> + <!-- TODO(alemate): Display images depending on screen ppi. --> + <img id="welcomeIllustration" src="images/welcome_illustration_2x.png"> + <div class="flex"></div> + <div id="buttons" class="layout horizontal center"> + <oobe-welcome-secondary-button icon="icons:language" + on-tap="onLanguageClicked_"> + <div>[[currentLanguage]]</div> + </oobe-welcome-secondary-button> + <oobe-welcome-secondary-button icon="icons:accessibility" + on-tap="onAccessibilityClicked_"> + <div i18n-content="accessibilityLink"></div> + </oobe-welcome-secondary-button> + <div class="flex"></div> + <oobe-text-button inverse on-tap="onNextClicked_"> + <div i18n-content="welcomeNextButtonText"></div> + </oobe-text-button> + </div> + <div id="bottom-margin"></div> + </div> + <div class="vertical-margin"></div> + </div> + </template> +</dom-module>
diff --git a/chrome/browser/resources/chromeos/login/oobe_welcome_dialog.js b/chrome/browser/resources/chromeos/login/oobe_welcome_dialog.js new file mode 100644 index 0000000..177db4d --- /dev/null +++ b/chrome/browser/resources/chromeos/login/oobe_welcome_dialog.js
@@ -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. + +Polymer({ + is: 'oobe-welcome-dialog', + properties: { + /** + * Currently selected system language (display name). + */ + currentLanguage: { + type: String, + value: '', + }, + }, + + onLanguageClicked_: function() { + this.fire('language-button-clicked'); + }, + + onAccessibilityClicked_: function() { + this.fire('accessibility-button-clicked'); + }, + + onNextClicked_: function() { + this.fire('next-button-clicked'); + } +});
diff --git a/chrome/browser/resources/chromeos/login/oobe_welcome_secondary_button.css b/chrome/browser/resources/chromeos/login/oobe_welcome_secondary_button.css new file mode 100644 index 0000000..19b9339 --- /dev/null +++ b/chrome/browser/resources/chromeos/login/oobe_welcome_secondary_button.css
@@ -0,0 +1,32 @@ +/* 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. */ +:host { + border-color: rgba(0, 0, 0, 0.2); + border-radius: 2px; + border-style: solid; + border-width: 1px; + color: #5a5a5a; + height: 28px; + max-width: 300px; + min-width: 120px; +} + +#container { + height: 100%; + margin: 0; + padding: 0 16px 0 16px; +} + +::content * { + font: var(--oobe-roboto-medium), sans-serif; + font-size: 12px; + text-transform: none; +} + +iron-icon { + --iron-icon-height: 16px; + --iron-icon-width: 16px; + color: #5a5a5a; + margin: 0 8px 0 0; +}
diff --git a/chrome/browser/resources/md_extensions/compiled_resources2.gyp b/chrome/browser/resources/md_extensions/compiled_resources2.gyp index f51788dc..fd66a49 100644 --- a/chrome/browser/resources/md_extensions/compiled_resources2.gyp +++ b/chrome/browser/resources/md_extensions/compiled_resources2.gyp
@@ -37,6 +37,16 @@ 'includes': ['../../../../third_party/closure_compiler/compile_js2.gypi'], }, { + 'target_name': 'error_page', + 'dependencies': [ + '<(DEPTH)/ui/webui/resources/js/compiled_resources2.gyp:cr', + '<(DEPTH)/third_party/polymer/v1_0/components-chromium/neon-animation/compiled_resources2.gyp:neon-animatable-behavior-extracted', + '<(EXTERNS_GYP):developer_private', + 'animation_helper', + ], + 'includes': ['../../../../third_party/closure_compiler/compile_js2.gypi'], + }, + { 'target_name': 'extensions', 'dependencies': [ '<(DEPTH)/ui/webui/resources/js/compiled_resources2.gyp:cr', @@ -132,6 +142,7 @@ '<(DEPTH)/ui/webui/resources/js/compiled_resources2.gyp:cr', '<(EXTERNS_GYP):developer_private', '<(EXTERNS_GYP):management', + 'error_page', 'item', 'manager', 'pack_dialog',
diff --git a/chrome/browser/resources/md_extensions/error_page.html b/chrome/browser/resources/md_extensions/error_page.html new file mode 100644 index 0000000..39b3b23 --- /dev/null +++ b/chrome/browser/resources/md_extensions/error_page.html
@@ -0,0 +1,84 @@ +<link rel="import" href="chrome://resources/html/cr.html"> +<link rel="import" href="chrome://resources/html/polymer.html"> +<link rel="import" href="chrome://resources/polymer/v1_0/iron-icons/iron-icons.html"> +<link rel="import" href="chrome://resources/polymer/v1_0/neon-animation/neon-animatable-behavior.html"> +<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/paper-styles/color.html"> +<link rel="import" href="chrome://extensions/animation_helper.html"> + +<dom-module id="extensions-error-page"> + <template> + <style> + [hidden] { + display: none !important; + } + + #main { + background-color: white; + height: 800px; + width: 90%; + } + + #heading { + color: var(--paper-grey-600); + height: 40px; + margin-bottom: 30px; + padding: 8px 12px 0; + } + + #errors-list { + padding: 0 10px; + } + + .error-item { + align-items: center; + color: var(--paper-grey-800); + display: flex; + margin: 5px 0; + } + + .error-message { + -webkit-margin-start: 10px; + flex-grow: 1; + } + + .icon-severity-info { + /* TODO(devlin): 1x/2x versions? */ + content: url(error_severity_info.png); + } + + .icon-severity-warning { + content: url(error_severity_warning.png); + } + + .icon-severity-fatal { + content: url(error_severity_fatal.png); + } + </style> + <div id="main"> + <div id="heading"> + <paper-icon-button id="close-button" icon="arrow-back" + on-tap="onCloseButtonTap_"></paper-icon-button> + <span>$i18n{errorsPageHeading}</span> + </div> + <div id="errors-list"> + <template is="dom-repeat" items="[[calculateShownItems_(data.*)]]"> + <div class="error-item"> + <img class$="[[computeErrorIconClass_(item)]]"> + <div class="error-message">[[item.message]]</div> + <paper-icon-button class="delete-button" + on-tap="onDeleteErrorTap_" + icon="delete"></paper-icon-button> + </div> + </template> + </div> + <div id="content-view"> + <!--TODO--> + </div> + <div id="devtools-controls"> + <!--TODO--> + </div> + </div> + </template> + <script src="chrome://extensions/error_page.js"></script> +</dom-module>
diff --git a/chrome/browser/resources/md_extensions/error_page.js b/chrome/browser/resources/md_extensions/error_page.js new file mode 100644 index 0000000..18a03e7527 --- /dev/null +++ b/chrome/browser/resources/md_extensions/error_page.js
@@ -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. + +/** @typedef {chrome.developerPrivate.ManifestError} */ +var ManifestError; +/** @typedef {chrome.developerPrivate.RuntimeError} */ +var RuntimeError; + +cr.define('extensions', function() { + 'use strict'; + + /** @interface */ + var ErrorPageDelegate = function() {}; + + ErrorPageDelegate.prototype = { + /** + * @param {string} extensionId + * @param {!Array<number>=} opt_errorIds + * @param {chrome.developerPrivate.ErrorType=} opt_type + */ + deleteErrors: assertNotReached, + }; + + var ErrorPage = Polymer({ + is: 'extensions-error-page', + + behaviors: [Polymer.NeonAnimatableBehavior], + + properties: { + /** @type {!chrome.developerPrivate.ExtensionInfo|undefined} */ + data: Object, + + /** @type {!extensions.ErrorPageDelegate|undefined} */ + delegate: Object, + }, + + ready: function() { + /** @type {!extensions.AnimationHelper} */ + this.animationHelper = new extensions.AnimationHelper(this, this.$.main); + this.animationHelper.setEntryAnimation(extensions.Animation.FADE_IN); + this.animationHelper.setExitAnimation(extensions.Animation.SCALE_DOWN); + this.sharedElements = {hero: this.$.main}; + }, + + /** + * @return {!Array<!(ManifestError|RuntimeError)>} + * @private + */ + calculateShownItems_: function() { + return this.data.manifestErrors.concat(this.data.runtimeErrors); + }, + + /** @private */ + onCloseButtonTap_: function() { + this.fire('close'); + }, + + /** + * @param {!ManifestError|!RuntimeError} error + * @return {string} + * @private + */ + computeErrorIconClass_: function(error) { + if (error.type == chrome.developerPrivate.ErrorType.RUNTIME) { + switch (error.severity) { + case chrome.developerPrivate.ErrorLevel.LOG: + return 'icon-severity-info'; + case chrome.developerPrivate.ErrorLevel.WARN: + return 'icon-severity-warning'; + case chrome.developerPrivate.ErrorLevel.ERROR: + return 'icon-severity-fatal'; + } + assertNotReached(); + } + assert(error.type == chrome.developerPrivate.ErrorType.MANIFEST); + return 'icon-severity-warning'; + }, + + /** + * @param {!{model:Object}} e + * @private + */ + onDeleteErrorTap_: function(e) { + this.delegate.deleteErrors(this.data.id, [e.model.item.id]); + }, + }); + + return { + ErrorPage: ErrorPage, + ErrorPageDelegate: ErrorPageDelegate, + }; +});
diff --git a/chrome/browser/resources/md_extensions/error_severity_fatal.png b/chrome/browser/resources/md_extensions/error_severity_fatal.png new file mode 100644 index 0000000..b53dc2c --- /dev/null +++ b/chrome/browser/resources/md_extensions/error_severity_fatal.png Binary files differ
diff --git a/chrome/browser/resources/md_extensions/error_severity_info.png b/chrome/browser/resources/md_extensions/error_severity_info.png new file mode 100644 index 0000000..1c32c6eb --- /dev/null +++ b/chrome/browser/resources/md_extensions/error_severity_info.png Binary files differ
diff --git a/chrome/browser/resources/md_extensions/error_severity_warning.png b/chrome/browser/resources/md_extensions/error_severity_warning.png new file mode 100644 index 0000000..d2e3434 --- /dev/null +++ b/chrome/browser/resources/md_extensions/error_severity_warning.png Binary files differ
diff --git a/chrome/browser/resources/md_extensions/item.html b/chrome/browser/resources/md_extensions/item.html index 9e9a8ef5a..845f318 100644 --- a/chrome/browser/resources/md_extensions/item.html +++ b/chrome/browser/resources/md_extensions/item.html
@@ -216,6 +216,10 @@ <paper-button id="details-button" on-tap="onDetailsTap_"> $i18n{itemDetails} </paper-button> + <paper-button id="errors-button" on-tap="onErrorsTap_" + hidden$="[[computeErrorsHidden_(data.*)]]"> + $i18n{itemErrors} + </paper-button> <paper-button id="remove-button" on-tap="onRemoveTap_"> $i18n{itemRemove} </paper-button>
diff --git a/chrome/browser/resources/md_extensions/item.js b/chrome/browser/resources/md_extensions/item.js index 70929a12..c21067f 100644 --- a/chrome/browser/resources/md_extensions/item.js +++ b/chrome/browser/resources/md_extensions/item.js
@@ -100,6 +100,15 @@ this.fire('extension-item-size-changed', {item: this.data}); }, + /** + * @return {boolean} + * @private + */ + computeErrorsHidden_: function() { + return !this.data.manifestErrors.length && + !this.data.runtimeErrors.length; + }, + /** @private */ onRemoveTap_: function() { this.delegate.deleteItem(this.data.id); @@ -112,6 +121,11 @@ }, /** @private */ + onErrorsTap_: function() { + this.fire('extension-item-show-errors', {data: this.data}); + }, + + /** @private */ onDetailsTap_: function() { this.fire('extension-item-show-details', {element: this}); },
diff --git a/chrome/browser/resources/md_extensions/item_list.js b/chrome/browser/resources/md_extensions/item_list.js index 909b97b9..74d9faa 100644 --- a/chrome/browser/resources/md_extensions/item_list.js +++ b/chrome/browser/resources/md_extensions/item_list.js
@@ -38,10 +38,10 @@ }, /** - * Called when the details for a given item are about to be shown. + * Called when a subpage for a given item is about to be shown. * @param {string} id */ - willShowItemDetails: function(id) { + willShowItemSubpage: function(id) { this.sharedElements = {hero: this.$$('#' + id)}; },
diff --git a/chrome/browser/resources/md_extensions/manager.html b/chrome/browser/resources/md_extensions/manager.html index c1f3df4..9625639 100644 --- a/chrome/browser/resources/md_extensions/manager.html +++ b/chrome/browser/resources/md_extensions/manager.html
@@ -8,6 +8,7 @@ <link rel="import" href="chrome://resources/polymer/v1_0/neon-animation/neon-animated-pages.html"> <link rel="import" href="chrome://extensions/detail_view.html"> <link rel="import" href="chrome://extensions/drop_overlay.html"> +<link rel="import" href="chrome://extensions/error_page.html"> <link rel="import" href="chrome://extensions/item_list.html"> <link rel="import" href="chrome://extensions/keyboard_shortcuts.html"> <link rel="import" href="chrome://extensions/options_dialog.html"> @@ -85,6 +86,8 @@ <extensions-keyboard-shortcuts id="keyboard-shortcuts" items="[[extensions]]"> </extensions-keyboard-shortcuts> + <extensions-error-page id="error-page" on-close="onErrorPageClose_"> + </extensions-error-page> </neon-animated-pages> <extensions-options-dialog id="options-dialog"> </extensions-options-dialog>
diff --git a/chrome/browser/resources/md_extensions/manager.js b/chrome/browser/resources/md_extensions/manager.js index 15f92ae..a556f72 100644 --- a/chrome/browser/resources/md_extensions/manager.js +++ b/chrome/browser/resources/md_extensions/manager.js
@@ -11,6 +11,7 @@ ITEM_LIST: '0', DETAIL_VIEW: '1', KEYBOARD_SHORTCUTS: '2', + ERROR_PAGE: '3', }; cr.define('extensions', function() { @@ -77,6 +78,7 @@ listeners: { 'items-list.extension-item-show-details': 'onShouldShowItemDetails_', + 'items-list.extension-item-show-errors': 'onShouldShowItemErrors_', }, created: function() { @@ -104,12 +106,16 @@ return this.$['options-dialog']; }, + get errorPage() { + return this.$['error-page']; + }, + /** * Shows the details view for a given item. * @param {!chrome.developerPrivate.ExtensionInfo} data */ showItemDetails: function(data) { - this.$['items-list'].willShowItemDetails(data.id); + this.$['items-list'].willShowItemSubpage(data.id); this.$['details-view'].data = data; this.changePage(Page.DETAIL_VIEW); }, @@ -226,6 +232,8 @@ return this.$['details-view']; case Page.KEYBOARD_SHORTCUTS: return this.$['keyboard-shortcuts']; + case Page.ERROR_PAGE: + return this.$['error-page']; } assertNotReached(); }, @@ -240,7 +248,8 @@ return; var entry; var exit; - if (fromPage == Page.ITEM_LIST && toPage == Page.DETAIL_VIEW) { + if (fromPage == Page.ITEM_LIST && (toPage == Page.DETAIL_VIEW || + toPage == Page.ERROR_PAGE)) { entry = extensions.Animation.HERO; exit = extensions.Animation.HERO; } else if (toPage == Page.ITEM_LIST) { @@ -266,9 +275,26 @@ this.showItemDetails(e.detail.element.data); }, + /** + * Handles the event for the user clicking on the errors button. + * @param {!CustomEvent} e + * @private + */ + onShouldShowItemErrors_: function(e) { + var data = e.detail.data; + this.$['items-list'].willShowItemSubpage(data.id); + this.$['error-page'].data = data; + this.changePage(Page.ERROR_PAGE); + }, + /** @private */ onDetailsViewClose_: function() { this.changePage(Page.ITEM_LIST); + }, + + /** @private */ + onErrorPageClose_: function() { + this.changePage(Page.ITEM_LIST); } });
diff --git a/chrome/browser/resources/md_extensions/service.js b/chrome/browser/resources/md_extensions/service.js index 9ef7d8d..30bcaca 100644 --- a/chrome/browser/resources/md_extensions/service.js +++ b/chrome/browser/resources/md_extensions/service.js
@@ -10,6 +10,7 @@ * @implements {extensions.ItemDelegate} * @implements {extensions.SidebarDelegate} * @implements {extensions.PackDialogDelegate} + * @implements {extensions.ErrorPageDelegate} */ function Service() {} @@ -24,6 +25,7 @@ this.manager_.sidebar.setDelegate(this); this.manager_.set('itemDelegate', this); this.manager_.packDialog.set('delegate', this); + this.manager_.errorPage.delegate = this; var keyboardShortcuts = this.manager_.keyboardShortcuts; keyboardShortcuts.addEventListener( 'shortcut-updated', @@ -270,6 +272,15 @@ updateAllExtensions: function() { chrome.developerPrivate.autoUpdate(); }, + + /** @override */ + deleteErrors: function(extensionId, errorIds, type) { + chrome.developerPrivate.deleteExtensionErrors({ + extensionId: extensionId, + errorIds: errorIds, + type: type, + }); + } }; cr.addSingletonGetter(Service);
diff --git a/chrome/browser/resources/options/browser_options.js b/chrome/browser/resources/options/browser_options.js index e9da4b9..70d8cf84 100644 --- a/chrome/browser/resources/options/browser_options.js +++ b/chrome/browser/resources/options/browser_options.js
@@ -6,6 +6,7 @@ /** * @typedef {{actionLinkText: (string|undefined), + * accountInfo: (string|undefined), * childUser: (boolean|undefined), * hasError: (boolean|undefined), * hasUnrecoverableError: (boolean|undefined), @@ -1185,6 +1186,9 @@ loadTimeData.getString('syncButtonTextSignIn'); $('start-stop-sync-indicator').hidden = signInButton.hidden; + $('account-info').textContent = syncData.accountInfo; + $('account-info').hidden = !this.signedIn_; + // TODO(estade): can this just be textContent? $('sync-status-text').innerHTML = syncData.statusText; var statusSet = syncData.statusText.length != 0;
diff --git a/chrome/browser/resources/options/sync_section.html b/chrome/browser/resources/options/sync_section.html index 1cb7e90b..f43b440a5 100644 --- a/chrome/browser/resources/options/sync_section.html +++ b/chrome/browser/resources/options/sync_section.html
@@ -26,6 +26,7 @@ </if> <!-- chromeos --> <div id="sync-status" class="settings-row" hidden> + <span id="account-info" hidden></span> <span id="sync-status-text"></span> <a is="action-link" id="sync-action-link"></a> </div>
diff --git a/chrome/browser/resources/settings/a11y_page/a11y_page.html b/chrome/browser/resources/settings/a11y_page/a11y_page.html index f0f24882..808671a 100644 --- a/chrome/browser/resources/settings/a11y_page/a11y_page.html +++ b/chrome/browser/resources/settings/a11y_page/a11y_page.html
@@ -30,8 +30,7 @@ $i18n{manageAccessibilityFeatures} <div class="secondary">$i18n{moreFeaturesLinkDescription}</div> </div> - <button class="icon-arrow-right" is="paper-icon-button-light"> - </button> + <button class="subpage-arrow" is="paper-icon-button-light"></button> </div> </neon-animatable> <template is="dom-if" route-path="/manageAccessibility">
diff --git a/chrome/browser/resources/settings/a11y_page/manage_a11y_page.html b/chrome/browser/resources/settings/a11y_page/manage_a11y_page.html index 5733102..a5eab46 100644 --- a/chrome/browser/resources/settings/a11y_page/manage_a11y_page.html +++ b/chrome/browser/resources/settings/a11y_page/manage_a11y_page.html
@@ -136,8 +136,7 @@ <div class="middle"> <div>$i18n{mouseSettingsTitle}</div> <div class="secondary">$i18n{mouseSettingsDescription}</div> - <button class="icon-arrow-right" is="paper-icon-button-light"> - </button> + <button class="subpage-arrow" is="paper-icon-button-light"></button> </div> </div>
diff --git a/chrome/browser/resources/settings/appearance_page/appearance_page.html b/chrome/browser/resources/settings/appearance_page/appearance_page.html index 6237a76..63b68c7 100644 --- a/chrome/browser/resources/settings/appearance_page/appearance_page.html +++ b/chrome/browser/resources/settings/appearance_page/appearance_page.html
@@ -141,8 +141,7 @@ <div>$i18n{customizeFonts}</div> <div class="secondary">$i18n{chooseFonts}</div> </div> - <button class="icon-arrow-right" is="paper-icon-button-light"> - </button> + <button class="subpage-arrow" is="paper-icon-button-light"></button> </div> <div class="settings-box" hidden="[[!pageVisibility.pageZoom]]">
diff --git a/chrome/browser/resources/settings/appearance_page/appearance_page.js b/chrome/browser/resources/settings/appearance_page/appearance_page.js index bde7e1c..f94507d 100644 --- a/chrome/browser/resources/settings/appearance_page/appearance_page.js +++ b/chrome/browser/resources/settings/appearance_page/appearance_page.js
@@ -54,7 +54,7 @@ /** * List of options for the page zoom drop-down menu. - * @type {!DropdownMenuOptionList} + * @type {!Array<number>} */ pageZoomLevels_: { readOnly: true, @@ -111,16 +111,15 @@ this.$.defaultFontSize.menuOptions = this.fontSizeOptions_; // TODO(dschuyler): Look into adding a listener for the // default zoom percent. - chrome.settingsPrivate.getDefaultZoomPercent(function(value) { - // TODO(dpapad): Non-integer values will cause no <option> to be selected - // until crbug.com/655742 is addressed. - this.$.zoomLevel.value = value; + chrome.settingsPrivate.getDefaultZoom(function(zoom) { + this.$.zoomLevel.value = zoom; }.bind(this)); }, /** * @param {number} zoom * @return {number} A zoom easier read by users. + * @private */ formatZoom_: function(zoom) { return Math.round(zoom * 100); @@ -228,8 +227,7 @@ /** @private */ onZoomLevelChange_: function() { - chrome.settingsPrivate.setDefaultZoomPercent( - parseFloat(this.$.zoomLevel.value)); + chrome.settingsPrivate.setDefaultZoom(parseFloat(this.$.zoomLevel.value)); }, /**
diff --git a/chrome/browser/resources/settings/certificate_manager_page/certificate_subentry.html b/chrome/browser/resources/settings/certificate_manager_page/certificate_subentry.html index 8325fb23c..c4d559f 100644 --- a/chrome/browser/resources/settings/certificate_manager_page/certificate_subentry.html +++ b/chrome/browser/resources/settings/certificate_manager_page/certificate_subentry.html
@@ -1,21 +1,15 @@ <link rel="import" href="chrome://resources/html/polymer.html"> +<link rel="import" href="chrome://resources/cr_elements/cr_lazy_render/cr_lazy_render.html"> <link rel="import" href="chrome://resources/cr_elements/icons.html"> -<link rel="import" href="chrome://resources/polymer/v1_0/iron-dropdown/iron-dropdown.html"> <link rel="import" href="chrome://resources/polymer/v1_0/paper-icon-button/paper-icon-button.html"> <link rel="import" href="/certificate_manager_page/certificate_manager_types.html"> <link rel="import" href="/certificate_manager_page/certificates_browser_proxy.html"> +<link rel="import" href="/settings_action_menu.html"> <link rel="import" href="/settings_shared_css.html"> <dom-module id="settings-certificate-subentry"> <template> <style include="settings-shared"> - .dropdown-content { - background: white; - /* TODO(dpapad): Use a CSS variable for box-shadow and unify with other - * such menus (like in search engines section) */ - box-shadow: 0 2px 6px grey; - } - .name { flex: auto; } @@ -36,33 +30,29 @@ $i18n{certificateManagerUntrusted} </div> <div class="name">[[model.name]]</div> - <paper-icon-button id="dots" icon="cr:more-vert" toggles - active="{{menuOpened}}"></paper-icon-button> - <!-- TODO(dpapad): Figure out RTL for this menu --> - <template is="dom-if" if="[[menuOpened]]"> - <iron-dropdown vertical-align="auto" horizontal-align="right" - opened="{{menuOpened}}"> - <div class="dropdown-content"> - <button class="dropdown-item" role="option" id="view" - on-tap="onViewTap_"> - $i18n{certificateManagerView} - </button> - <button class="dropdown-item" role="option" id="edit" - hidden$="[[!canEdit_(certificateType, model)]]" - on-tap="onEditTap_"> - $i18n{certificateManagerEdit} - </button> - <button class="dropdown-item" role="option" id="export" - hidden$="[[!canExport_(certificateType, model)]]" - on-tap="onExportTap_"> - $i18n{certificateManagerExport} - </button> - <button class="dropdown-item" role="option" id="delete" - hidden$="[[!canDelete_(model)]]" on-tap="onDeleteTap_"> - $i18n{certificateManagerDelete} - </button> - </div> - </iron-dropdown> + <paper-icon-button id="dots" icon="cr:more-vert" + on-tap="onDotsTap_"></paper-icon-button> + <template is="cr-lazy-render" id="menu"> + <dialog is="settings-action-menu"> + <button class="dropdown-item" role="option" id="view" + on-tap="onViewTap_"> + $i18n{certificateManagerView} + </button> + <button class="dropdown-item" role="option" id="edit" + hidden$="[[!canEdit_(certificateType, model)]]" + on-tap="onEditTap_"> + $i18n{certificateManagerEdit} + </button> + <button class="dropdown-item" role="option" id="export" + hidden$="[[!canExport_(certificateType, model)]]" + on-tap="onExportTap_"> + $i18n{certificateManagerExport} + </button> + <button class="dropdown-item" role="option" id="delete" + hidden$="[[!canDelete_(model)]]" on-tap="onDeleteTap_"> + $i18n{certificateManagerDelete} + </button> + </dialog> </template> <div> </template>
diff --git a/chrome/browser/resources/settings/certificate_manager_page/certificate_subentry.js b/chrome/browser/resources/settings/certificate_manager_page/certificate_subentry.js index faad7495..c42bcc9 100644 --- a/chrome/browser/resources/settings/certificate_manager_page/certificate_subentry.js +++ b/chrome/browser/resources/settings/certificate_manager_page/certificate_subentry.js
@@ -151,6 +151,13 @@ /** @private */ closePopupMenu_: function() { - this.$$('iron-dropdown').close(); + this.$$('dialog[is=settings-action-menu]').close(); + }, + + /** @private */ + onDotsTap_: function() { + var actionMenu = /** @type {!SettingsActionMenuElement} */( + this.$.menu.get()); + actionMenu.showAt(assert(this.$$('paper-icon-button'))); }, });
diff --git a/chrome/browser/resources/settings/certificate_manager_page/compiled_resources2.gyp b/chrome/browser/resources/settings/certificate_manager_page/compiled_resources2.gyp index 6e92bf3..4ebe074 100644 --- a/chrome/browser/resources/settings/certificate_manager_page/compiled_resources2.gyp +++ b/chrome/browser/resources/settings/certificate_manager_page/compiled_resources2.gyp
@@ -42,9 +42,11 @@ { 'target_name': 'certificate_subentry', 'dependencies': [ - '<(DEPTH)/ui/webui/resources/js/compiled_resources2.gyp:cr', 'certificate_manager_types', 'certificates_browser_proxy', + '../compiled_resources2.gyp:settings_action_menu', + '<(DEPTH)/ui/webui/resources/cr_elements/cr_lazy_render/compiled_resources2.gyp:cr_lazy_render', + '<(DEPTH)/ui/webui/resources/js/compiled_resources2.gyp:cr', ], 'includes': ['../../../../../third_party/closure_compiler/compile_js2.gypi'], },
diff --git a/chrome/browser/resources/settings/device_page/device_page.html b/chrome/browser/resources/settings/device_page/device_page.html index e2d0d92e..b86367e2 100644 --- a/chrome/browser/resources/settings/device_page/device_page.html +++ b/chrome/browser/resources/settings/device_page/device_page.html
@@ -29,39 +29,34 @@ <div class="middle"> [[getPointersTitle_(hasMouse_, hasTouchpad_)]] </div> - <button class="icon-arrow-right" is="paper-icon-button-light"> - </button> + <button class="subpage-arrow" is="paper-icon-button-light"></button> </div> <div id="keyboardRow" class="settings-box" on-tap="onKeyboardTap_" actionable> <iron-icon icon="settings:keyboard"></iron-icon> <div class="middle">$i18n{keyboardTitle}</div> - <button class="icon-arrow-right" is="paper-icon-button-light"> - </button> + <button class="subpage-arrow" is="paper-icon-button-light"></button> </div> <template is="dom-if" if="[[stylusAllowed_]]"> <div id="stylusRow" class="settings-box" on-tap="onStylusTap_" actionable> <iron-icon icon="settings:note"></iron-icon> <div class="middle">$i18n{stylusTitle}</div> - <button class="icon-arrow-right" is="paper-icon-button-light"> - </button> + <button class="subpage-arrow" is="paper-icon-button-light"></button> </div> </template> <div id="displayRow" class="settings-box" on-tap="onDisplayTap_" actionable> <iron-icon icon="settings:desktop-windows"></iron-icon> <div class="middle">$i18n{displayTitle}</div> - <button class="icon-arrow-right" is="paper-icon-button-light"> - </button> + <button class="subpage-arrow" is="paper-icon-button-light"></button> </div> <template is="dom-if" if="[[showStorageManager_]]"> <div id="storageRow" class="settings-box" on-tap="onStorageTap_" actionable> <iron-icon icon="settings:storage"></iron-icon> <div class="middle">$i18n{storageTitle}</div> - <button class="icon-arrow-right" is="paper-icon-button-light"> - </button> + <button class="subpage-arrow" is="paper-icon-button-light"></button> </div> </template> </neon-animatable>
diff --git a/chrome/browser/resources/settings/internet_page/network_apnlist.html b/chrome/browser/resources/settings/internet_page/network_apnlist.html index e1d8ec8..819a4b7 100644 --- a/chrome/browser/resources/settings/internet_page/network_apnlist.html +++ b/chrome/browser/resources/settings/internet_page/network_apnlist.html
@@ -1,27 +1,24 @@ <link rel="import" href="chrome://resources/cr_elements/network/cr_onc_types.html"> <link rel="import" href="chrome://resources/html/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-dropdown-menu/paper-dropdown-menu-light.html"> +<link rel="import" href="/md_select_css.html"> <link rel="import" href="internet_shared_css.html"> <link rel="import" href="network_property_list.html"> <dom-module id="network-apnlist"> <template> - <style include="internet-shared"></style> + <style include="internet-shared md-select"></style> <div class="settings-box first"> <div class="start">$i18n{networkSectionAccessPoint}</div> - <paper-dropdown-menu-light vertical-align="auto" no-label-float> - <paper-listbox id="selectApn" - class="dropdown-content" on-iron-activate="onSelectApnChange_" - selected="{{selectedApn_}}" attr-for-selected="value"> + <div class="md-select-wrapper"> + <select id="selectApn" class="md-select" on-change="onSelectApnChange_" + value="[[selectedApn_]]"> <template is="dom-repeat" items="[[apnSelectList_]]"> - <button class="dropdown-item" role="option" - value="[[item.AccessPointName]]"> - [[apnDesc_(item)]] - </button> + <option value="[[item.AccessPointName]]">[[apnDesc_(item)]]</option> </template> - </paper-listbox> - </paper-dropdown-menu-light> + </select> + <span class="md-select-underline"></span> + </div> </div> <div class="settings-box continuation single-column"
diff --git a/chrome/browser/resources/settings/internet_page/network_apnlist.js b/chrome/browser/resources/settings/internet_page/network_apnlist.js index c6270f6b9..594e094 100644 --- a/chrome/browser/resources/settings/internet_page/network_apnlist.js +++ b/chrome/browser/resources/settings/internet_page/network_apnlist.js
@@ -139,11 +139,11 @@ result.push(otherApn); this.apnSelectList_ = result; - this.selectedApn_ = - (activeApn && activeApn.AccessPointName) || otherApn.AccessPointName; - // We need to flush the DOM here, otherwise the paper-dropdown-menu-light - // will not update to correctly display the selected AccessPointName. - Polymer.dom.flush(); + // Set selectedApn_ after dom-repeat has been stamped. + this.async(function() { + this.selectedApn_ = + (activeApn && activeApn.AccessPointName) || otherApn.AccessPointName; + }.bind(this)); }, /** @@ -177,16 +177,18 @@ /** * Event triggered when the selectApn selection changes. - * @param {!{detail: !{selected: string}}} event + * @param {!Event} event * @private */ onSelectApnChange_: function(event) { - /** @type {string} */ var accessPointName = event.detail.selected; + let target = /** @type {!HTMLSelectElement} */(event.target); + var accessPointName = target.value; // When selecting 'Other', don't set a change event unless a valid // non-default value has been set for Other. if (this.isOtherSelected_(accessPointName) && (!this.otherApn_ || !this.otherApn_.AccessPointName || this.otherApn_.AccessPointName == this.DefaultAccessPointName)) { + this.selectedApn_ = accessPointName; return; } this.sendApnChange_(accessPointName);
diff --git a/chrome/browser/resources/settings/internet_page/network_nameservers.html b/chrome/browser/resources/settings/internet_page/network_nameservers.html index 963739d..c28b4d2 100644 --- a/chrome/browser/resources/settings/internet_page/network_nameservers.html +++ b/chrome/browser/resources/settings/internet_page/network_nameservers.html
@@ -1,25 +1,23 @@ <link rel="import" href="chrome://resources/html/polymer.html"> <link rel="import" href="chrome://resources/polymer/v1_0/paper-input/paper-input-container.html"> -<link rel="import" href="chrome://resources/polymer/v1_0/paper-dropdown-menu/paper-dropdown-menu-light.html"> -<link rel="import" href="chrome://resources/polymer/v1_0/paper-listbox/paper-listbox.html"> <link rel="import" href="chrome://resources/cr_elements/network/cr_onc_types.html"> +<link rel="import" href="/md_select_css.html"> <link rel="import" href="internet_shared_css.html"> <dom-module id="network-nameservers"> <template> - <style include="internet-shared"></style> + <style include="internet-shared md-select"></style> <div class="settings-box first"> <div class="start">$i18n{networkSectionNameservers}</div> - <paper-dropdown-menu-light vertical-align="auto" no-label-float> - <paper-listbox class="dropdown-content" on-iron-activate="onTypeChange_" - selected="[[nameserversType_]]" attr-for-selected="value"> + <div class="md-select-wrapper"> + <select id="nameserverType" class="md-select" on-change="onTypeChange_" + value="[[nameserversType_]]"> <template is="dom-repeat" items="[[nameserverTypeNames_]]"> - <button class="dropdown-item" role="option" value="[[item]]"> - [[nameserverTypeDesc_(item)]] - </button> + <option value="[[item]]">[[nameserverTypeDesc_(item)]]</option> </template> - </paper-listbox> - </paper-dropdown-menu-light> + </select> + <span class="md-select-underline"></span> + </div> </div> <div class="settings-box continuation single-column"
diff --git a/chrome/browser/resources/settings/internet_page/network_nameservers.js b/chrome/browser/resources/settings/internet_page/network_nameservers.js index cec1b79..db50135 100644 --- a/chrome/browser/resources/settings/internet_page/network_nameservers.js +++ b/chrome/browser/resources/settings/internet_page/network_nameservers.js
@@ -108,13 +108,16 @@ * @private */ setNameservers_: function(nameserversType, nameservers) { - this.nameserversType_ = nameserversType; if (nameserversType == 'custom') { // Add empty entries for unset custom nameservers. for (let i = nameservers.length; i < this.MAX_NAMESERVERS; ++i) nameservers[i] = ''; } this.nameservers_ = nameservers; + // Set nameserversType_ after dom-repeat has been stamped. + this.async(function() { + this.nameserversType_ = nameserversType; + }.bind(this)); }, /** @@ -142,13 +145,14 @@ /** * Event triggered when the selected type changes. Updates nameservers and * sends the change value if necessary. - * @param {!{detail: !{selected: string}}} e + * @param {!Event} event * @private */ - onTypeChange_: function(e) { + onTypeChange_: function(event) { if (this.nameserversType_ == 'custom') this.savedNameservers_ = this.nameservers_; - var type = e.detail.selected; + let target = /** @type {!HTMLSelectElement} */ (event.target); + let type = target.value; this.nameserversType_ = type; if (type == 'custom') { // Restore the saved nameservers.
diff --git a/chrome/browser/resources/settings/internet_page/network_proxy.html b/chrome/browser/resources/settings/internet_page/network_proxy.html index c48fcd8..6295861 100644 --- a/chrome/browser/resources/settings/internet_page/network_proxy.html +++ b/chrome/browser/resources/settings/internet_page/network_proxy.html
@@ -4,16 +4,16 @@ <link rel="import" href="chrome://resources/html/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-dropdown-menu/paper-dropdown-menu-light.html"> <link rel="import" href="chrome://resources/polymer/v1_0/paper-input/paper-input-container.html"> <link rel="import" href="chrome://resources/polymer/v1_0/paper-input/paper-input.html"> +<link rel="import" href="/md_select_css.html"> <link rel="import" href="internet_shared_css.html"> <link rel="import" href="network_proxy_exclusions.html"> <link rel="import" href="network_proxy_input.html"> <dom-module id="network-proxy"> <template> - <style include="internet-shared"> + <style include="internet-shared md-select"> cr-policy-network-indicator { -webkit-margin-end: 10px; } @@ -54,16 +54,15 @@ <!-- Proxy type dropdown --> <div class="settings-box continuation"> <div class="start">$i18n{networkProxyConnectionType}</div> - <paper-dropdown-menu-light vertical-align="auto" no-label-float> - <paper-listbox class="dropdown-content" on-iron-activate="onTypeChange_" - selected="[[proxy.Type]]" attr-for-selected="value"> + <div class="md-select-wrapper"> + <select id="proxyType" class="md-select" on-change="onTypeChange_" + value="[[proxy.Type]]"> <template is="dom-repeat" items="[[proxyTypes_]]"> - <button class="dropdown-item" role="option" value="[[item]]"> - [[proxyTypeDesc_(item)]] - </button> + <option value="[[item]]">[[proxyTypeDesc_(item)]]</option> </template> - </paper-listbox> - </paper-dropdown-menu-light> + </select> + <span class="md-select-underline"></span> + </div> </div> <!-- Autoconfiguration (PAC) -->
diff --git a/chrome/browser/resources/settings/internet_page/network_proxy.js b/chrome/browser/resources/settings/internet_page/network_proxy.js index cc22995f..6f7de41b 100644 --- a/chrome/browser/resources/settings/internet_page/network_proxy.js +++ b/chrome/browser/resources/settings/internet_page/network_proxy.js
@@ -102,9 +102,7 @@ */ savedExcludeDomains_: undefined, - /** - * Polymer networkProperties changed method. - */ + /** @private */ networkPropertiesChanged_: function() { if (!this.networkProperties) return; @@ -139,7 +137,10 @@ proxy.ExcludeDomains = proxy.ExcludeDomains || this.savedExcludeDomains_; proxy.Manual = proxy.Manual || this.savedManual_; - this.proxy = proxy; + // Set this.proxy after dom-repeat has been stamped. + this.async(function() { + this.proxy = proxy; + }.bind(this)); // Set the Web Proxy Auto Discovery URL. var ipv4 = @@ -147,8 +148,14 @@ this.WPAD = (ipv4 && ipv4.WebProxyAutoDiscoveryUrl) || ''; }, + /** @private */ + useSameProxyChanged_: function() { + this.sendProxyChange_(); + }, + /** * @return {CrOnc.ProxySettings} An empty/default proxy settings object. + * @private */ createDefaultProxySettings_: function() { return { @@ -165,14 +172,8 @@ }, /** - * Polymer useSameProxy changed method. - */ - useSameProxyChanged_: function() { - this.sendProxyChange_(); - }, - - /** * Called when the proxy changes in the UI. + * @private */ sendProxyChange_: function() { if (this.proxy.Type == CrOnc.ProxySettingsType.MANUAL) { @@ -205,12 +206,13 @@ /** * Event triggered when the selected proxy type changes. - * @param {!{detail: !{selected: string}}} e + * @param {!Event} event * @private */ - onTypeChange_: function(e) { + onTypeChange_: function(event) { + let target = /** @type {!HTMLSelectElement} */ (event.target); var type = /** @type {chrome.networkingPrivate.ProxySettingsType} */ ( - e.detail.selected); + target.value); this.set('proxy.Type', type); this.sendProxyChange_(); },
diff --git a/chrome/browser/resources/settings/on_startup_page/compiled_resources2.gyp b/chrome/browser/resources/settings/on_startup_page/compiled_resources2.gyp index 2607a4be..ccd99ec 100644 --- a/chrome/browser/resources/settings/on_startup_page/compiled_resources2.gyp +++ b/chrome/browser/resources/settings/on_startup_page/compiled_resources2.gyp
@@ -31,6 +31,8 @@ { 'target_name': 'startup_url_entry', 'dependencies': [ + '../compiled_resources2.gyp:settings_action_menu', + '<(DEPTH)/ui/webui/resources/cr_elements/cr_lazy_render/compiled_resources2.gyp:cr_lazy_render', '<(DEPTH)/ui/webui/resources/js/compiled_resources2.gyp:cr', '<(DEPTH)/ui/webui/resources/js/compiled_resources2.gyp:icon', 'startup_urls_page_browser_proxy',
diff --git a/chrome/browser/resources/settings/on_startup_page/startup_url_entry.html b/chrome/browser/resources/settings/on_startup_page/startup_url_entry.html index c99283d..fac9bc8 100644 --- a/chrome/browser/resources/settings/on_startup_page/startup_url_entry.html +++ b/chrome/browser/resources/settings/on_startup_page/startup_url_entry.html
@@ -1,9 +1,10 @@ +<link rel="import" href="chrome://resources/cr_elements/cr_lazy_render/cr_lazy_render.html"> <link rel="import" href="chrome://resources/cr_elements/icons.html"> <link rel="import" href="chrome://resources/html/polymer.html"> <link rel="import" href="chrome://resources/html/icon.html"> -<link rel="import" href="chrome://resources/polymer/v1_0/iron-dropdown/iron-dropdown.html"> <link rel="import" href="chrome://resources/polymer/v1_0/paper-icon-button/paper-icon-button.html"> <link rel="import" href="/on_startup_page/startup_urls_page_browser_proxy.html"> +<link rel="import" href="/settings_action_menu.html"> <link rel="import" href="/settings_shared_css.html"> <dom-module id="settings-startup-url-entry"> @@ -21,22 +22,19 @@ <div class="text-elide">[[model.title]]</div> <div class="text-elide secondary">[[model.url]]</div> </div> - <paper-icon-button id="dots" icon="cr:more-vert" toggles - active="{{menuOpened}}" tabindex$="[[tabindex]]"> + <paper-icon-button id="dots" icon="cr:more-vert" tabindex$="[[tabindex]]" + on-tap="onDotsTap_"> </paper-icon-button> - <template is="dom-if" if="[[menuOpened]]"> - <iron-dropdown vertical-align="auto" horizontal-align="right" - opened="{{menuOpened}}"> - <div class="dropdown-content"> - <button class="dropdown-item" role="option" on-tap="onEditTap_"> - $i18n{onStartupEdit} - </button> - <button class="dropdown-item" role="option" id="remove" - on-tap="onRemoveTap_"> - $i18n{onStartupRemove} - </button> - </div> - </iron-dropdown> + <template is="cr-lazy-render" id="menu"> + <dialog is="settings-action-menu"> + <button class="dropdown-item" role="option" on-tap="onEditTap_"> + $i18n{onStartupEdit} + </button> + <button class="dropdown-item" role="option" id="remove" + on-tap="onRemoveTap_"> + $i18n{onStartupRemove} + </button> + </dialog> </template> </div> </template>
diff --git a/chrome/browser/resources/settings/on_startup_page/startup_url_entry.js b/chrome/browser/resources/settings/on_startup_page/startup_url_entry.js index e0882229..e0fff60 100644 --- a/chrome/browser/resources/settings/on_startup_page/startup_url_entry.js +++ b/chrome/browser/resources/settings/on_startup_page/startup_url_entry.js
@@ -36,14 +36,21 @@ /** @private */ onRemoveTap_: function() { - this.$$('iron-dropdown').close(); + this.$$('dialog[is=settings-action-menu]').close(); settings.StartupUrlsPageBrowserProxyImpl.getInstance().removeStartupPage( this.model.modelIndex); }, /** @private */ onEditTap_: function() { - this.$$('iron-dropdown').close(); + this.$$('dialog[is=settings-action-menu]').close(); this.fire(settings.EDIT_STARTUP_URL_EVENT, this.model); }, + + /** @private */ + onDotsTap_: function() { + var actionMenu = /** @type {!SettingsActionMenuElement} */( + this.$.menu.get()); + actionMenu.showAt(assert(this.$.dots)); + }, });
diff --git a/chrome/browser/resources/settings/passwords_and_forms_page/passwords_and_forms_page.html b/chrome/browser/resources/settings/passwords_and_forms_page/passwords_and_forms_page.html index 301cf0f..9ee622b8 100644 --- a/chrome/browser/resources/settings/passwords_and_forms_page/passwords_and_forms_page.html +++ b/chrome/browser/resources/settings/passwords_and_forms_page/passwords_and_forms_page.html
@@ -26,8 +26,7 @@ <div>$i18n{autofill}</div> <div class="secondary">$i18n{autofillDetail}</div> </div> - <button class="icon-arrow-right" is="paper-icon-button-light"> - </button> + <button class="subpage-arrow" is="paper-icon-button-light"></button> </div> <div class="secondary-action"> <paper-toggle-button id="autofillToggle" @@ -43,8 +42,7 @@ <div>$i18n{passwords}</div> <div class="secondary">$i18n{passwordsDetail}</div> </div> - <button class="icon-arrow-right" is="paper-icon-button-light"> - </button> + <button class="subpage-arrow" is="paper-icon-button-light"></button> </div> <div class="secondary-action"> <paper-toggle-button id="passwordToggle"
diff --git a/chrome/browser/resources/settings/people_page/people_page.html b/chrome/browser/resources/settings/people_page/people_page.html index 8bbda0c..0e29906 100644 --- a/chrome/browser/resources/settings/people_page/people_page.html +++ b/chrome/browser/resources/settings/people_page/people_page.html
@@ -93,11 +93,13 @@ <if expr="chromeos"> <div class="middle two-line" on-tap="onPictureTap_" actionable> </if> - <span class="flex" id="profile-name"> - [[profileName_]] - </span> - <button class="icon-arrow-right" is="paper-icon-button-light"> - </button> + <div class="flex"> + <span id="profile-name">[[profileName_]]</span> + <div class="secondary" hidden="[[!syncStatus.signedIn]]"> + [[syncStatus.signedInUsername]] + </div> + </div> + <button class="subpage-arrow" is="paper-icon-button-light"></button> </div> <if expr="not chromeos"> <template is="dom-if" if="[[showSignin_(syncStatus)]]"> @@ -160,8 +162,7 @@ [[syncStatus.statusText]] </div> </div> - <button class="icon-arrow-right" is="paper-icon-button-light"> - </button> + <button class="subpage-arrow" is="paper-icon-button-light"></button> </div> </template> @@ -250,7 +251,7 @@ $i18n{manageOtherPeople} <div class="secondary">$i18n{manageOtherPeopleDescription}</div> </div> - <button class="icon-arrow-right" is="paper-icon-button-light"></button> + <button class="subpage-arrow" is="paper-icon-button-light"></button> </div> <template is="dom-if" if=[[profileManagesSupervisedUsers_]]>
diff --git a/chrome/browser/resources/settings/people_page/sync_browser_proxy.js b/chrome/browser/resources/settings/people_page/sync_browser_proxy.js index fd98d06..69b304c60 100644 --- a/chrome/browser/resources/settings/people_page/sync_browser_proxy.js +++ b/chrome/browser/resources/settings/people_page/sync_browser_proxy.js
@@ -19,6 +19,7 @@ * setupCompleted: (boolean|undefined), * setupInProgress: (boolean|undefined), * signedIn: (boolean|undefined), + * signedInUsername: (string|undefined), * signinAllowed: (boolean|undefined), * statusText: (string|undefined), * supervisedUser: (boolean|undefined),
diff --git a/chrome/browser/resources/settings/printing_page/printing_page.html b/chrome/browser/resources/settings/printing_page/printing_page.html index b789232..0bf5a8b 100644 --- a/chrome/browser/resources/settings/printing_page/printing_page.html +++ b/chrome/browser/resources/settings/printing_page/printing_page.html
@@ -26,8 +26,7 @@ <div class="start"> $i18n{cupsPrintersTitle} </div> - <button class="icon-arrow-right" is="paper-icon-button-light"> - </button> + <button class="subpage-arrow" is="paper-icon-button-light"></button> </div> </template> </if> @@ -37,8 +36,7 @@ $i18n{cloudPrintersTitle} <div class="secondary">$i18n{cloudPrintersTitleDescription}</div> </div> - <button class="icon-arrow-right" is="paper-icon-button-light"> - </button> + <button class="subpage-arrow" is="paper-icon-button-light"></button> </div> </neon-animatable> <if expr="chromeos">
diff --git a/chrome/browser/resources/settings/privacy_page/privacy_page.html b/chrome/browser/resources/settings/privacy_page/privacy_page.html index 633bc368..0582e64e 100644 --- a/chrome/browser/resources/settings/privacy_page/privacy_page.html +++ b/chrome/browser/resources/settings/privacy_page/privacy_page.html
@@ -137,8 +137,7 @@ <div>$i18n{manageCertificates}</div> <div class="secondary">$i18n{manageCertificatesDescription}</div> </div> - <button class="icon-arrow-right" is="paper-icon-button-light"> - </button> + <button class="subpage-arrow" is="paper-icon-button-light"></button> </div> </if> <div id="site-settings-subpage-trigger" @@ -148,8 +147,7 @@ <div>$i18n{siteSettings}</div> <div class="secondary">$i18n{siteSettingsDescription}</div> </div> - <button class="icon-arrow-right" is="paper-icon-button-light"> - </button> + <button class="subpage-arrow" is="paper-icon-button-light"></button> </div> <div class="settings-box two-line" id="clearBrowsingData" on-tap="onClearBrowsingDataTap_" actionable> @@ -157,8 +155,7 @@ $i18n{clearBrowsingData} <div class="secondary">$i18n{clearBrowsingDataDescription}</div> </div> - <button class="icon-arrow-right" is="paper-icon-button-light"> - </button> + <button class="subpage-arrow" is="paper-icon-button-light"></button> </div> </neon-animatable> <if expr="use_nss_certs">
diff --git a/chrome/browser/resources/settings/reset_page/reset_page.html b/chrome/browser/resources/settings/reset_page/reset_page.html index 593604bd..2333b12 100644 --- a/chrome/browser/resources/settings/reset_page/reset_page.html +++ b/chrome/browser/resources/settings/reset_page/reset_page.html
@@ -19,7 +19,7 @@ <div>$i18n{resetPageTitle}</div> <div class="secondary">$i18n{resetPageDescription}</div> </div> - <button class="icon-arrow-right" is="paper-icon-button-light"></button> + <button class="subpage-arrow" is="paper-icon-button-light"></button> </div> <template is="dom-if" if="[[showResetProfileDialog_]]" restamp> <settings-reset-profile-dialog on-close="onResetProfileDialogClose_"> @@ -32,7 +32,7 @@ <div>$i18n{powerwashTitle}</div> <div class="secondary">$i18n{powerwashDescription}</div> </div> - <button class="icon-arrow-right" is="paper-icon-button-light"></button> + <button class="subpage-arrow" is="paper-icon-button-light"></button> </div> <template is="dom-if" if="[[showPowerwashDialog_]]" restamp> <settings-powerwash-dialog on-close="onPowerwashDialogClose_">
diff --git a/chrome/browser/resources/settings/search_engines_page/compiled_resources2.gyp b/chrome/browser/resources/settings/search_engines_page/compiled_resources2.gyp index b4d8ea70..e2c00edd 100644 --- a/chrome/browser/resources/settings/search_engines_page/compiled_resources2.gyp +++ b/chrome/browser/resources/settings/search_engines_page/compiled_resources2.gyp
@@ -24,6 +24,17 @@ 'includes': ['../../../../../third_party/closure_compiler/compile_js2.gypi'], }, { + 'target_name': 'omnibox_extension_entry', + 'dependencies': [ + '../compiled_resources2.gyp:settings_action_menu', + '<(DEPTH)/ui/webui/resources/js/compiled_resources2.gyp:assert', + '<(DEPTH)/ui/webui/resources/js/compiled_resources2.gyp:cr', + '<(DEPTH)/ui/webui/resources/js/compiled_resources2.gyp:icon', + 'search_engines_browser_proxy', + ], + 'includes': ['../../../../../third_party/closure_compiler/compile_js2.gypi'], + }, + { 'target_name': 'search_engines_browser_proxy', 'dependencies': [ '<(DEPTH)/ui/webui/resources/js/compiled_resources2.gyp:cr',
diff --git a/chrome/browser/resources/settings/search_engines_page/omnibox_extension_entry.html b/chrome/browser/resources/settings/search_engines_page/omnibox_extension_entry.html index 0a08f0c58..382a349 100644 --- a/chrome/browser/resources/settings/search_engines_page/omnibox_extension_entry.html +++ b/chrome/browser/resources/settings/search_engines_page/omnibox_extension_entry.html
@@ -2,8 +2,8 @@ <link rel="import" href="chrome://resources/html/polymer.html"> <link rel="import" href="chrome://resources/html/icon.html"> <link rel="import" href="/search_engines_page/search_engines_browser_proxy.html"> -<link rel="import" href="chrome://resources/polymer/v1_0/iron-dropdown/iron-dropdown.html"> <link rel="import" href="chrome://resources/polymer/v1_0/paper-icon-button/paper-icon-button.html"> +<link rel="import" href="/settings_action_menu.html"> <link rel="import" href="/settings_shared_css.html"> <dom-module id="settings-omnibox-extension-entry"> @@ -25,22 +25,19 @@ <span class="name">[[engine.displayName]]</span> </div> <div class="keyword-column">[[engine.keyword]]</div> - <paper-icon-button icon="cr:more-vert" toggles tabindex$="[[tabindex]]" - active="{{editMenuOpened}}"> + <paper-icon-button icon="cr:more-vert" tabindex$="[[tabindex]]" + on-tap="onDotsTap_"> </paper-icon-button> - <iron-dropdown opened="{{editMenuOpened}}" horizontal-align="right" - vertical-align="auto"> - <div class="dropdown-content"> - <button class="dropdown-item" role="option" on-tap="onManageTap_" - id="manage"> - $i18n{searchEnginesManageExtension} - </button> - <button class="dropdown-item" role="option" on-tap="onDisableTap_" - id="disable"> - $i18n{disable} - </button> - <div> - </iron-dropdown> + <dialog is="settings-action-menu"> + <button class="dropdown-item" role="option" on-tap="onManageTap_" + id="manage"> + $i18n{searchEnginesManageExtension} + </button> + <button class="dropdown-item" role="option" on-tap="onDisableTap_" + id="disable"> + $i18n{disable} + </button> + </dialog> </div> </template> <script src="omnibox_extension_entry.js"></script>
diff --git a/chrome/browser/resources/settings/search_engines_page/omnibox_extension_entry.js b/chrome/browser/resources/settings/search_engines_page/omnibox_extension_entry.js index 0ed0c9f..8b34bd1 100644 --- a/chrome/browser/resources/settings/search_engines_page/omnibox_extension_entry.js +++ b/chrome/browser/resources/settings/search_engines_page/omnibox_extension_entry.js
@@ -36,7 +36,7 @@ /** @private */ closePopupMenu_: function() { - this.$$('iron-dropdown').close(); + this.$$('dialog[is=settings-action-menu]').close(); }, /** @@ -47,4 +47,11 @@ getIconSet_: function(url) { return cr.icon.getFavicon(url); }, + + /** @private */ + onDotsTap_: function() { + /** @type {!SettingsActionMenuElement} */ ( + this.$$('dialog[is=settings-action-menu]')).showAt( + assert(this.$$('paper-icon-button'))); + }, });
diff --git a/chrome/browser/resources/settings/search_page/search_page.html b/chrome/browser/resources/settings/search_page/search_page.html index 841f097..7abaff57 100644 --- a/chrome/browser/resources/settings/search_page/search_page.html +++ b/chrome/browser/resources/settings/search_page/search_page.html
@@ -33,8 +33,7 @@ $i18n{searchEnginesManageDescription} </div> </div> - <button class="icon-arrow-right" is="paper-icon-button-light"> - </button> + <button class="subpage-arrow" is="paper-icon-button-light"></button> </div> </neon-animatable> <template is="dom-if" route-path="/searchEngines">
diff --git a/chrome/browser/resources/settings/settings_main/settings_main.html b/chrome/browser/resources/settings/settings_main/settings_main.html index 4ca98a26..03f8d749 100644 --- a/chrome/browser/resources/settings/settings_main/settings_main.html +++ b/chrome/browser/resources/settings/settings_main/settings_main.html
@@ -78,11 +78,10 @@ showPages_.basic, hasExpandedSection_, inSearchMode_)]]"> <div id="toggleSpacer"></div> <h2 id="toggleContainer"> - <paper-button id="advancedToggle" on-tap="toggleAdvancedPage_" toggles - active="[[advancedToggleExpanded_]]" - aria-active-attribute="aria-expanded"> + <paper-button id="advancedToggle" active="{{advancedToggleExpanded}}" + aria-active-attribute="aria-expanded" toggles> <span>$i18n{advancedPageTitle}</span> - <iron-icon icon="[[arrowState_(advancedToggleExpanded_)]]"> + <iron-icon icon="[[arrowState_(advancedToggleExpanded)]]"> </iron-icon> </paper-button> </h2>
diff --git a/chrome/browser/resources/settings/settings_main/settings_main.js b/chrome/browser/resources/settings/settings_main/settings_main.js index f931e6f0..d090cde 100644 --- a/chrome/browser/resources/settings/settings_main/settings_main.js +++ b/chrome/browser/resources/settings/settings_main/settings_main.js
@@ -25,10 +25,10 @@ notify: true, }, - /** @private */ - advancedToggleExpanded_: { + advancedToggleExpanded: { type: Boolean, - value: false, + notify: true, + observer: 'updatePagesShown_', }, /** @@ -90,11 +90,6 @@ /** @override */ attached: function() { - document.addEventListener('toggle-advanced-page', function(e) { - this.advancedToggleExpanded_ = e.detail; - this.updatePagesShown_(); - }.bind(this)); - var currentRoute = settings.getCurrentRoute(); this.hasExpandedSection_ = currentRoute && currentRoute.isSubpage(); }, @@ -206,7 +201,7 @@ this.hasExpandedSection_ = false; if (settings.Route.ADVANCED.contains(newRoute)) - this.advancedToggleExpanded_ = true; + this.advancedToggleExpanded = true; this.updatePagesShown_(); }, @@ -235,7 +230,7 @@ !this.hasExpandedSection_, advanced: this.hasExpandedSection_ ? settings.Route.ADVANCED.contains(currentRoute) : - this.advancedToggleExpanded_, + this.advancedToggleExpanded, }; } @@ -292,7 +287,7 @@ /** @private */ toggleAdvancedPage_: function() { - this.fire('toggle-advanced-page', !this.advancedToggleExpanded_); + this.advancedToggleExpanded = !this.advancedToggleExpanded; }, /**
diff --git a/chrome/browser/resources/settings/settings_menu/settings_menu.html b/chrome/browser/resources/settings/settings_menu/settings_menu.html index abd04937..2b55a9b 100644 --- a/chrome/browser/resources/settings/settings_menu/settings_menu.html +++ b/chrome/browser/resources/settings/settings_menu/settings_menu.html
@@ -136,11 +136,11 @@ </paper-menu> </div> <paper-submenu class="page-menu" id="advancedPage" actionable - opened="{{advancedOpened_}}" + opened="{{advancedOpened}}" hidden="[[!pageVisibility.advancedSettings]]"> <div class="menu-trigger"> <span>$i18n{advancedPageTitle}</span> - <iron-icon icon="[[arrowState_(advancedOpened_)]]"></iron-icon> + <iron-icon icon="[[arrowState_(advancedOpened)]]"></iron-icon> <paper-ripple></paper-ripple> </div> <paper-menu attr-for-selected="data-path" class="menu-content"
diff --git a/chrome/browser/resources/settings/settings_menu/settings_menu.js b/chrome/browser/resources/settings/settings_menu/settings_menu.js index a5ea674..fb67262 100644 --- a/chrome/browser/resources/settings/settings_menu/settings_menu.js +++ b/chrome/browser/resources/settings/settings_menu/settings_menu.js
@@ -12,6 +12,11 @@ behaviors: [settings.RouteObserverBehavior], properties: { + advancedOpened: { + type: Boolean, + notify: true, + }, + /** @private */ aboutSelected_: Boolean, @@ -24,24 +29,21 @@ }, }, - attached: function() { - document.addEventListener('toggle-advanced-page', function(e) { - if (e.detail) - this.$.advancedPage.open(); - else - this.$.advancedPage.close(); - }.bind(this)); - - this.$.advancedPage.addEventListener('paper-submenu-open', function() { - this.fire('toggle-advanced-page', true); - }.bind(this)); - - this.$.advancedPage.addEventListener('paper-submenu-close', function() { - this.fire('toggle-advanced-page', false); - }.bind(this)); - - this.fire('toggle-advanced-page', - settings.Route.ADVANCED.contains(settings.getCurrentRoute())); + ready: function() { + // When a <paper-submenu> is created with the [opened] attribute as true, + // its _active member isn't correctly initialized. See this bug for more + // info: https://github.com/PolymerElements/paper-menu/issues/88. This means + // the first tap to close an opened Advanced section does nothing (because + // it calls .open() on an opened menu instead of .close(). This is a fix for + // that bug without changing that code through its public API. + // + // TODO(dbeam): we're currently deciding whether <paper-{,sub}menu> are + // right for our needs (there have been minor a11y problems). If we decide + // to keep <paper-{,sub}menu>, fix this bug with a local Chrome CL (ex: + // https://codereview.chromium.org/2412343004) or a Polymer PR (ex: + // https://github.com/PolymerElements/paper-menu/pull/107). + if (this.advancedOpened) + this.$.advancedPage.open(); }, /**
diff --git a/chrome/browser/resources/settings/settings_shared_css.html b/chrome/browser/resources/settings/settings_shared_css.html index ac07ddc5..298ac98 100644 --- a/chrome/browser/resources/settings/settings_shared_css.html +++ b/chrome/browser/resources/settings/settings_shared_css.html
@@ -6,21 +6,21 @@ <template> <style include="cr-shared-style"> button[is='paper-icon-button-light'] { - --paper-icon-button-light-ripple: { - /* Center the ripple on the icon button. */ - height: 36px; - left: -8px; - top: -8px; - width: 36px; - }; + -webkit-margin-end: -8px; /* Allow ripple to overlap the end. */ -webkit-margin-start: 16px; - background-size: cover; + background-position: center; + background-repeat: no-repeat; + background-size: var(--settings-icon-size); flex-shrink: 0; - height: 20px; - width: 20px; + height: var(--settings-icon-ripple-size); + width: var(--settings-icon-ripple-size); } - [actionable] button[is="paper-icon-button-light"].icon-arrow-right { + :host-context([dir=rtl]) button[is='paper-icon-button-light'] { + transform: scaleX(-1); /* Flip on the X axis (aka mirror). */ + } + + [actionable] button[is="paper-icon-button-light"].subpage-arrow { background-image: url(images/arrow_right.svg); }
diff --git a/chrome/browser/resources/settings/settings_ui/settings_ui.html b/chrome/browser/resources/settings/settings_ui/settings_ui.html index 5cea906..dc46a2d 100644 --- a/chrome/browser/resources/settings/settings_ui/settings_ui.html +++ b/chrome/browser/resources/settings/settings_ui/settings_ui.html
@@ -95,7 +95,8 @@ <div class="drawer-content"> <template is="dom-if" id="drawerTemplate"> <settings-menu page-visibility="[[pageVisibility_]]" - on-iron-activate="onIronActivate_"> + on-iron-activate="onIronActivate_" + advanced-opened="{{advancedOpened_}}"> </settings-menu> </template> </div> @@ -103,7 +104,8 @@ <paper-header-panel mode="waterfall"> <settings-main prefs="{{prefs}}" toolbar-spinner-active="{{toolbarSpinnerActive_}}" - page-visibility="[[pageVisibility_]]"> + page-visibility="[[pageVisibility_]]" + advanced-toggle-expanded="{{advancedOpened_}}"> </settings-main> </paper-header-panel> </template>
diff --git a/chrome/browser/resources/settings/settings_ui/settings_ui.js b/chrome/browser/resources/settings/settings_ui/settings_ui.js index 59d21d3..7485ec2 100644 --- a/chrome/browser/resources/settings/settings_ui/settings_ui.js +++ b/chrome/browser/resources/settings/settings_ui/settings_ui.js
@@ -32,6 +32,13 @@ value: new settings.DirectionDelegateImpl(), }, + /** @private */ + advancedOpened_: { + type: Boolean, + value: false, + notify: true, + }, + /** @private {boolean} */ toolbarSpinnerActive_: { type: Boolean,
diff --git a/chrome/browser/resources/settings/settings_vars_css.html b/chrome/browser/resources/settings/settings_vars_css.html index 953181190..326fa31 100644 --- a/chrome/browser/resources/settings/settings_vars_css.html +++ b/chrome/browser/resources/settings/settings_vars_css.html
@@ -19,6 +19,9 @@ --settings-disabled-opacity: .65; --settings-error-color: var(--paper-red-700); + --settings-icon-ripple-size: 36px; + --settings-icon-size: 20px; + --settings-list-frame-padding: { -webkit-padding-end: var(--settings-box-row-padding); -webkit-padding-start: 56px; @@ -59,13 +62,13 @@ --checkbox-size: 16px; --checkbox-spacing: 18px; --iron-icon-fill-color: var(--paper-grey-600); - --iron-icon-height: 20px; - --iron-icon-width: 20px; + --iron-icon-height: var(--settings-icon-size); + --iron-icon-width: var(--settings-icon-size); --paper-checkbox-label-color: inherit; --paper-dialog-color: inherit; --paper-icon-button: { - height: 36px; - width: 36px; + height: var(--settings-icon-ripple-size); + width: var(--settings-icon-ripple-size); }; --paper-input-container-input: { color: inherit;
diff --git a/chrome/browser/resources/settings/site_settings/site_list.html b/chrome/browser/resources/settings/site_settings/site_list.html index f520b78..6d6a825 100644 --- a/chrome/browser/resources/settings/site_settings/site_list.html +++ b/chrome/browser/resources/settings/site_settings/site_list.html
@@ -83,6 +83,12 @@ </div> </iron-dropdown> </template> + <template is="dom-if" if="[[enableSiteSettings_]]"> + <div on-tap="onOriginTap_" actionable> + <button class="subpage-arrow" is="paper-icon-button-light"> + </button> + </div> + </template> </div> </template>
diff --git a/chrome/browser/resources/settings/site_settings_page/site_settings_page.html b/chrome/browser/resources/settings/site_settings_page/site_settings_page.html index f271495d6..a301c9d 100644 --- a/chrome/browser/resources/settings/site_settings_page/site_settings_page.html +++ b/chrome/browser/resources/settings/site_settings_page/site_settings_page.html
@@ -15,7 +15,7 @@ on-tap="onTapCategory" actionable> <iron-icon icon="settings:list"></iron-icon> <div class="middle">$i18n{siteSettingsCategoryAllSites}</div> - <button class="icon-arrow-right" is="paper-icon-button-light"></button> + <button class="subpage-arrow" is="paper-icon-button-light"></button> </div> <div class="settings-box line-only"> </div> @@ -31,7 +31,7 @@ </div> <div id="cookies" class="secondary"></div> </div> - <button class="icon-arrow-right" is="paper-icon-button-light"></button> + <button class="subpage-arrow" is="paper-icon-button-light"></button> </div> <div class="settings-box two-line" category$="[[ContentSettingsTypes.GEOLOCATION]]" on-tap="onTapCategory" @@ -42,7 +42,7 @@ [[computeTitleForContentCategory(ContentSettingsTypes.GEOLOCATION)]] <div id="geolocation" class="secondary"></div> </div> - <button class="icon-arrow-right" is="paper-icon-button-light"></button> + <button class="subpage-arrow" is="paper-icon-button-light"></button> </div> <div class="settings-box two-line" category$="[[ContentSettingsTypes.CAMERA]]" on-tap="onTapCategory" @@ -53,7 +53,7 @@ [[computeTitleForContentCategory(ContentSettingsTypes.CAMERA)]] <div id="camera" class="secondary"></div> </div> - <button class="icon-arrow-right" is="paper-icon-button-light"></button> + <button class="subpage-arrow" is="paper-icon-button-light"></button> </div> <div class="settings-box two-line" category$="[[ContentSettingsTypes.MIC]]" on-tap="onTapCategory" actionable> @@ -63,7 +63,7 @@ [[computeTitleForContentCategory(ContentSettingsTypes.MIC)]] <div id="mic" class="secondary"></div> </div> - <button class="icon-arrow-right" is="paper-icon-button-light"></button> + <button class="subpage-arrow" is="paper-icon-button-light"></button> </div> <div class="settings-box two-line" category$="[[ContentSettingsTypes.NOTIFICATIONS]]" @@ -74,7 +74,7 @@ [[computeTitleForContentCategory(ContentSettingsTypes.NOTIFICATIONS)]] <div id="notifications" class="secondary"></div> </div> - <button class="icon-arrow-right" is="paper-icon-button-light"></button> + <button class="subpage-arrow" is="paper-icon-button-light"></button> </div> <div class="settings-box two-line" category$="[[ContentSettingsTypes.JAVASCRIPT]]" @@ -85,7 +85,7 @@ [[computeTitleForContentCategory(ContentSettingsTypes.JAVASCRIPT)]] <div id="javascript" class="secondary"></div> </div> - <button class="icon-arrow-right" is="paper-icon-button-light"></button> + <button class="subpage-arrow" is="paper-icon-button-light"></button> </div> <div class="settings-box two-line" category$="[[ContentSettingsTypes.PLUGINS]]" @@ -96,7 +96,7 @@ [[computeTitleForContentCategory(ContentSettingsTypes.PLUGINS)]] <div id="plugins" class="secondary"></div> </div> - <button class="icon-arrow-right" is="paper-icon-button-light"></button> + <button class="subpage-arrow" is="paper-icon-button-light"></button> </div> <div class="settings-box two-line" category$="[[ContentSettingsTypes.IMAGES]]" on-tap="onTapCategory" @@ -107,7 +107,7 @@ [[computeTitleForContentCategory(ContentSettingsTypes.IMAGES)]] <div id="images" class="secondary"></div> </div> - <button class="icon-arrow-right" is="paper-icon-button-light"></button> + <button class="subpage-arrow" is="paper-icon-button-light"></button> </div> <div class="settings-box two-line" category$="[[ContentSettingsTypes.POPUPS]]" on-tap="onTapCategory" @@ -118,7 +118,7 @@ [[computeTitleForContentCategory(ContentSettingsTypes.POPUPS)]] <div id="popups" class="secondary"></div> </div> - <button class="icon-arrow-right" is="paper-icon-button-light"></button> + <button class="subpage-arrow" is="paper-icon-button-light"></button> </div> <div class="settings-box two-line" category$="[[ContentSettingsTypes.BACKGROUND_SYNC]]" @@ -130,7 +130,7 @@ ContentSettingsTypes.BACKGROUND_SYNC)]] <div id="backgroundSync" class="secondary"></div> </div> - <button class="icon-arrow-right" is="paper-icon-button-light"></button> + <button class="subpage-arrow" is="paper-icon-button-light"></button> </div> <div class="settings-box two-line" category$="[[ContentSettingsTypes.KEYGEN]]" @@ -142,7 +142,7 @@ ContentSettingsTypes.KEYGEN)]] <div id="keygen" class="secondary"></div> </div> - <button class="icon-arrow-right" is="paper-icon-button-light"></button> + <button class="subpage-arrow" is="paper-icon-button-light"></button> </div> <div class="settings-box two-line" category$="[[ContentSettingsTypes.AUTOMATIC_DOWNLOADS]]" @@ -154,7 +154,7 @@ ContentSettingsTypes.AUTOMATIC_DOWNLOADS)]] <div id="automaticDownloads" class="secondary"></div> </div> - <button class="icon-arrow-right" is="paper-icon-button-light"></button> + <button class="subpage-arrow" is="paper-icon-button-light"></button> </div> <div class="settings-box two-line" category$="[[ContentSettingsTypes.UNSANDBOXED_PLUGINS]]" @@ -166,7 +166,7 @@ ContentSettingsTypes.UNSANDBOXED_PLUGINS)]] <div id="unsandboxedPlugins" class="secondary"></div> </div> - <button class="icon-arrow-right" is="paper-icon-button-light"></button> + <button class="subpage-arrow" is="paper-icon-button-light"></button> </div> <div class="settings-box two-line" category$="[[ContentSettingsTypes.PROTOCOL_HANDLERS]]" @@ -178,7 +178,7 @@ ContentSettingsTypes.PROTOCOL_HANDLERS)]] <div id="handlers" class="secondary"></div> </div> - <button class="icon-arrow-right" is="paper-icon-button-light"></button> + <button class="subpage-arrow" is="paper-icon-button-light"></button> </div> <div class="settings-box" category$="[[ContentSettingsTypes.ZOOM_LEVELS]]" on-tap="onTapCategory" actionable> @@ -187,7 +187,7 @@ <div class="middle"> [[computeTitleForContentCategory(ContentSettingsTypes.ZOOM_LEVELS)]] </div> - <button class="icon-arrow-right" is="paper-icon-button-light"></button> + <button class="subpage-arrow" is="paper-icon-button-light"></button> </div> <div class="settings-box" category$="[[ContentSettingsTypes.USB_DEVICES]]" on-tap="onTapCategory" actionable> @@ -196,7 +196,7 @@ <div class="middle"> [[computeTitleForContentCategory(ContentSettingsTypes.USB_DEVICES)]] </div> - <button class="icon-arrow-right" is="paper-icon-button-light"></button> + <button class="subpage-arrow" is="paper-icon-button-light"></button> </div> </template> <script src="site_settings_page.js"></script>
diff --git a/chrome/browser/resources/snippets_internals.html b/chrome/browser/resources/snippets_internals.html index 98dd212..2d70a958 100644 --- a/chrome/browser/resources/snippets_internals.html +++ b/chrome/browser/resources/snippets_internals.html
@@ -25,6 +25,9 @@ <td class="name">Snippets enabled <td id="flag-snippets" class="value"> <tr> + <td class="name">Article Suggestions enabled + <td id="flag-article-suggestions" class="value"> + <tr> <td class="name">Recent Tab Suggestions enabled <td id="flag-recent-offline-tab-suggestions" class="value"> <tr>
diff --git a/chrome/browser/resources/vr_shell/vr_shell_ui.css b/chrome/browser/resources/vr_shell/vr_shell_ui.css index efb9017..599ddd3 100644 --- a/chrome/browser/resources/vr_shell/vr_shell_ui.css +++ b/chrome/browser/resources/vr_shell/vr_shell_ui.css
@@ -6,15 +6,6 @@ background-color: rgba(255, 255, 255, 0.2); } -.ui-button { - background: white; - border-radius: 6px; - overflow: hidden; - position: absolute; - text-align: center; - vertical-align: middle; -} - .webvr-message-box { align-items: center; display: flex; @@ -94,3 +85,61 @@ text-align: center; width: 512px; } + +.round-button { + height: 136px; + left: 512px; + position: absolute; + width: 96px; +} + +.round-button .button { + background-color: #eee; + background-position: center; + background-repeat: no-repeat; + background-size: contain; + border-radius: 50%; + height: 96px; + opacity: 0.8; + position: absolute; + top: 0; + transition: opacity 150ms ease-in-out; + width: 96px; +} + +.round-button .caption { + bottom: 0; + color: white; + font-size: 24px; + left: 50%; + opacity: 0; + position: absolute; + transform: translateX(-50%); + transition: opacity 150ms ease-in-out; + z-index: 100; +} + +#back { + top: 0; +} + +#back .button { + background-image: url(../../../../ui/webui/resources/images/vr_back.svg); +} + +#reload { + top: 138px; +} + +#reload .button { + background-image: url(../../../../ui/webui/resources/images/vr_reload.svg); +} + +#forward { + top: 276px; +} + +#forward .button { + background-image: url(../../../../ui/webui/resources/images/vr_back.svg); + transform: scaleX(-1); +}
diff --git a/chrome/browser/resources/vr_shell/vr_shell_ui.html b/chrome/browser/resources/vr_shell/vr_shell_ui.html index 6029112c..2d354ef 100644 --- a/chrome/browser/resources/vr_shell/vr_shell_ui.html +++ b/chrome/browser/resources/vr_shell/vr_shell_ui.html
@@ -18,18 +18,30 @@ <link rel="stylesheet" href="chrome://resources/css/text_defaults_md.css"> </head> <body> -<div id="webvr-not-secure-permanent" class="webvr-message-box"> - <div class="webvr-box"> - <img class="webvr-not-secure-icon" width="36" height="36" - src="../../../../ui/webui/resources/images/i_circle.svg"> - <div class="webvr-string">$i18n{insecureWebVrContentPermanent}</div> + <div id="webvr-not-secure-permanent" class="webvr-message-box"> + <div class="webvr-box"> + <img class="webvr-not-secure-icon" width="36" height="36" + src="../../../../ui/webui/resources/images/i_circle.svg"> + <div class="webvr-string">$i18n{insecureWebVrContentPermanent}</div> + </div> </div> -</div> -<div id="webvr-not-secure-transient" class="webvr-message-box"> - <div> - <div>$i18n{insecureWebVrContentTransient}</div> + <div id="webvr-not-secure-transient" class="webvr-message-box"> + <div> + <div>$i18n{insecureWebVrContentTransient}</div> + </div> </div> -</div> + <div class="round-button" id="back"> + <div class="button"></div> + <div class="caption">$i18n{back}</div> + </div> + <div class="round-button" id="reload"> + <div class="button"></div> + <div class="caption">$i18n{reload}</div> + </div> + <div class="round-button" id="forward"> + <div class="button"></div> + <div class="caption">$i18n{forward}</div> + </div> </body> <!-- Run script after creating body, to let it add its own elements. -->
diff --git a/chrome/browser/resources/vr_shell/vr_shell_ui.js b/chrome/browser/resources/vr_shell/vr_shell_ui.js index c6d730e2..bafc8115 100644 --- a/chrome/browser/resources/vr_shell/vr_shell_ui.js +++ b/chrome/browser/resources/vr_shell/vr_shell_ui.js
@@ -6,6 +6,60 @@ 'use strict'; var scene = new ui.Scene(); + var uiElements = []; + + class DomUiElement { + constructor(domId) { + var domElement = document.querySelector(domId); + var style = window.getComputedStyle(domElement); + + // Pull copy rectangle from DOM element properties. + var pixelX = domElement.offsetLeft; + var pixelY = domElement.offsetTop; + var pixelWidth = parseInt(style.getPropertyValue('width')); + var pixelHeight = parseInt(style.getPropertyValue('height')); + + var element = new api.UiElement(pixelX, pixelY, pixelWidth, pixelHeight); + element.setSize(pixelWidth / 1000, pixelHeight / 1000); + + this.uiElementId = scene.addElement(element); + this.uiAnimationId = -1; + this.domElement = domElement; + } + }; + + class RoundButton extends DomUiElement { + constructor(domId, callback) { + super(domId); + + var button = this.domElement.querySelector('.button'); + button.addEventListener('mouseenter', this.onMouseEnter.bind(this)); + button.addEventListener('mouseleave', this.onMouseLeave.bind(this)); + button.addEventListener('click', callback); + } + + configure(buttonOpacity, captionOpacity, distanceForward) { + var button = this.domElement.querySelector('.button'); + var caption = this.domElement.querySelector('.caption'); + button.style.opacity = buttonOpacity; + caption.style.opacity = captionOpacity; + var anim = new api.Animation(this.uiElementId, 150); + anim.setTranslation(0, 0, distanceForward); + if (this.uiAnimationId >= 0) { + scene.removeAnimation(this.uiAnimationId); + } + this.uiAnimationId = scene.addAnimation(anim); + scene.flush(); + } + + onMouseEnter() { + this.configure(1, 1, 0.015); + } + + onMouseLeave() { + this.configure(0.8, 0, 0); + } + }; function initialize() { @@ -22,58 +76,35 @@ // Build a row of control buttons. function addControlButtons() { var buttons = [ - // Button text, UI action passed down to native. - ['<', api.Action.HISTORY_BACK], - ['>', api.Action.HISTORY_FORWARD], - ['R', api.Action.RELOAD], - ['-', api.Action.ZOOM_OUT], - ['+', api.Action.ZOOM_IN] + ['#back', function() { api.doAction(api.Action.HISTORY_BACK); }], + ['#reload', function() { api.doAction(api.Action.RELOAD); }], + ['#forward', function() { api.doAction(api.Action.HISTORY_FORWARD); }], ]; - var buttonWidth = 0.3; - var buttonHeight = 0.2; - var buttonSpacing = 0.5; + var buttonSpacing = 0.3; var buttonStartPosition = -buttonSpacing * (buttons.length / 2.0 - 0.5); for (var i = 0; i < buttons.length; i++) { - var b = document.createElement('div'); - b.position = 'absolute'; - b.style.top = '384px'; - b.style.left = 50 * i + 'px'; - b.style.width = '50px'; - b.style.height = '50px'; - b.className = 'ui-button'; - b.textContent = buttons[i][0]; + // Use an invisible parent to simplify Z-axis movement on hover. + var position = new api.UiElement(0, 0, 0, 0); + position.setParentId(api.getContentElementId()); + position.setVisible(false); + position.setAnchoring(api.XAnchoring.XNONE, api.YAnchoring.YBOTTOM); + position.setTranslation( + buttonStartPosition + i * buttonSpacing, -0.3, 0.3); + var id = scene.addElement(position); - // Add click behaviour. - b.addEventListener('click', function(action, e) { - api.doAction(action); - }.bind(undefined, buttons[i][1])); + var domId = buttons[i][0]; + var callback = buttons[i][1]; + var element = new RoundButton(domId, callback); + uiElements.push(element); - document.body.appendChild(b); - - // Add a UI rectangle for the button. - var el = new api.UiElement(50 * i, 384, 50, 50); - el.setParentId(api.getContentElementId()); - el.setAnchoring(api.XAnchoring.XNONE, api.YAnchoring.YBOTTOM); - el.setSize(buttonWidth, buttonHeight); - el.setTranslation(buttonStartPosition + buttonSpacing * i, -0.3, 0.0); - var buttonId = scene.addElement(el); - - // Add transitions when the mouse hovers over (and leaves) the button. - b.addEventListener('mouseenter', function(buttonId, width, height, e) { - var resize = new api.Animation(buttonId, 250); - resize.setSize(width, height); - scene.addAnimation(resize); - scene.flush(); - }.bind(undefined, buttonId, buttonWidth * 1.5, buttonHeight * 1.5)); - b.addEventListener('mouseleave', function(buttonId, width, height) { - var resize = new api.Animation(buttonId, 250); - resize.setSize(width, height); - scene.addAnimation(resize); - scene.flush(); - }.bind(undefined, buttonId, buttonWidth, buttonHeight)); + var update = new api.UiElementUpdate(); + update.setParentId(id); + update.setScale(2.2, 2.2, 1); + scene.updateElement(element.uiElementId, update); } + scene.flush(); }
diff --git a/chrome/browser/resources/vr_shell/vr_shell_ui_api.js b/chrome/browser/resources/vr_shell/vr_shell_ui_api.js index a65288c..976b616 100644 --- a/chrome/browser/resources/vr_shell/vr_shell_ui_api.js +++ b/chrome/browser/resources/vr_shell/vr_shell_ui_api.js
@@ -145,6 +145,13 @@ this.xAnchoring = x; this.yAnchoring = y; } + + /** + * Visibility controls whether the element is rendered. + */ + setVisible(visible) { + this.visible = !!visible; + } }; /**
diff --git a/chrome/browser/search_engines/template_url_service_unittest.cc b/chrome/browser/search_engines/template_url_service_unittest.cc index d1d82f7..fe23c2a 100644 --- a/chrome/browser/search_engines/template_url_service_unittest.cc +++ b/chrome/browser/search_engines/template_url_service_unittest.cc
@@ -594,8 +594,9 @@ // Try removing foo2. This should delete foo2, but leave foo1 and 3 untouched. GURL url2("http://foo2"); model()->RemoveAutoGeneratedForUrlsBetween( - base::Bind(&GURL::operator==, base::Unretained(&url2)), month_ago, - now + one_day); + base::Bind(static_cast<bool (*)(const GURL&, const GURL&)>(operator==), + url2), + month_ago, now + one_day); EXPECT_EQ(2U, model()->GetTemplateURLs().size()); EXPECT_EQ(ASCIIToUTF16("key1"), model()->GetTemplateURLs()[0]->keyword()); EXPECT_TRUE(model()->GetTemplateURLs()[0]->safe_for_autoreplace()); @@ -606,8 +607,9 @@ // should remain untouched. GURL url1("http://foo1"); model()->RemoveAutoGeneratedForUrlsBetween( - base::Bind(&GURL::operator==, base::Unretained(&url1)), now, - now + one_day); + base::Bind(static_cast<bool (*)(const GURL&, const GURL&)>(operator==), + url1), + now, now + one_day); EXPECT_EQ(2U, model()->GetTemplateURLs().size()); EXPECT_EQ(ASCIIToUTF16("key1"), model()->GetTemplateURLs()[0]->keyword()); EXPECT_TRUE(model()->GetTemplateURLs()[0]->safe_for_autoreplace()); @@ -617,8 +619,9 @@ // Try removing foo3. This should delete foo3, but leave foo1 untouched. GURL url3("http://foo3"); model()->RemoveAutoGeneratedForUrlsBetween( - base::Bind(&GURL::operator==, base::Unretained(&url3)), month_ago, - now + one_day + one_day); + base::Bind(static_cast<bool (*)(const GURL&, const GURL&)>(operator==), + url3), + month_ago, now + one_day + one_day); EXPECT_EQ(1U, model()->GetTemplateURLs().size()); EXPECT_EQ(ASCIIToUTF16("key1"), model()->GetTemplateURLs()[0]->keyword()); EXPECT_TRUE(model()->GetTemplateURLs()[0]->safe_for_autoreplace());
diff --git a/chrome/browser/sessions/better_session_restore_browsertest.cc b/chrome/browser/sessions/better_session_restore_browsertest.cc index 3500b5c..c2a9248 100644 --- a/chrome/browser/sessions/better_session_restore_browsertest.cc +++ b/chrome/browser/sessions/better_session_restore_browsertest.cc
@@ -436,7 +436,14 @@ ->SetDefaultCookieSetting(CONTENT_SETTING_SESSION_ONLY); } -IN_PROC_BROWSER_TEST_F(ContinueWhereILeftOffTest, LocalStorageClearedOnExit) { +// Crashes on Mac only. http://crbug.com/656211 +#if defined(OS_MACOSX) +#define MAYBE_LocalStorageClearedOnExit DISABLED_LocalStorageClearedOnExit +#else +#define MAYBE_LocalStorageClearedOnExit LocalStorageClearedOnExit +#endif +IN_PROC_BROWSER_TEST_F(ContinueWhereILeftOffTest, + MAYBE_LocalStorageClearedOnExit) { CheckReloadedPageNotRestored(); }
diff --git a/chrome/browser/signin/signin_ui_util.cc b/chrome/browser/signin/signin_ui_util.cc index 824fbb06..b2576bc2 100644 --- a/chrome/browser/signin/signin_ui_util.cc +++ b/chrome/browser/signin/signin_ui_util.cc
@@ -27,6 +27,7 @@ #include "components/signin/core/browser/signin_manager.h" #include "components/signin/core/common/profile_management_switches.h" #include "components/strings/grit/components_strings.h" +#include "components/user_manager/user_manager.h" #include "ui/base/l10n/l10n_util.h" #include "ui/gfx/font_list.h" #include "ui/gfx/text_elider.h" @@ -76,6 +77,25 @@ } // namespace +base::string16 GetAuthenticatedUsername(const SigninManagerBase* signin) { + std::string user_display_name; + + if (signin->IsAuthenticated()) { + user_display_name = signin->GetAuthenticatedAccountInfo().email; + +#if defined(OS_CHROMEOS) + if (user_manager::UserManager::IsInitialized()) { + // On CrOS user email is sanitized and then passed to the signin manager. + // Original email (containing dots) is stored as "display email". + user_display_name = user_manager::UserManager::Get()->GetUserDisplayEmail( + AccountId::FromUserEmail(user_display_name)); + } +#endif // defined(OS_CHROMEOS) + } + + return base::UTF8ToUTF16(user_display_name); +} + base::string16 GetSigninMenuLabel(Profile* profile) { GlobalError* error = signin_ui_util::GetSignedInServiceError(profile); if (error)
diff --git a/chrome/browser/signin/signin_ui_util.h b/chrome/browser/signin/signin_ui_util.h index 34458dd..d5b1406f 100644 --- a/chrome/browser/signin/signin_ui_util.h +++ b/chrome/browser/signin/signin_ui_util.h
@@ -29,6 +29,10 @@ base::string16* status_label, base::string16* link_label); +// Returns the username of the authenticated user or an empty string if there is +// no authenticated user. +base::string16 GetAuthenticatedUsername(const SigninManagerBase* signin); + // Initializes signin-related preferences. void InitializePrefsForProfile(Profile* profile);
diff --git a/chrome/browser/ssl/chrome_security_state_model_client.cc b/chrome/browser/ssl/chrome_security_state_model_client.cc index 8f5d3232..fe1f85e 100644 --- a/chrome/browser/ssl/chrome_security_state_model_client.cc +++ b/chrome/browser/ssl/chrome_security_state_model_client.cc
@@ -22,6 +22,8 @@ #include "chrome/browser/safe_browsing/ui_manager.h" #include "chrome/grit/generated_resources.h" #include "content/public/browser/navigation_entry.h" +#include "content/public/browser/navigation_handle.h" +#include "content/public/browser/render_frame_host.h" #include "content/public/browser/security_style_explanation.h" #include "content/public/browser/security_style_explanations.h" #include "content/public/browser/ssl_status.h" @@ -166,8 +168,10 @@ ChromeSecurityStateModelClient::ChromeSecurityStateModelClient( content::WebContents* web_contents) - : web_contents_(web_contents), - security_state_model_(new SecurityStateModel()) { + : content::WebContentsObserver(web_contents), + web_contents_(web_contents), + security_state_model_(new SecurityStateModel()), + logged_http_warning_on_current_navigation_(false) { security_state_model_->SetClient(this); } @@ -301,6 +305,34 @@ security_state_model_->GetSecurityInfo(result); } +void ChromeSecurityStateModelClient::VisibleSSLStateChanged() { + if (logged_http_warning_on_current_navigation_) + return; + + security_state::SecurityStateModel::SecurityInfo security_info; + GetSecurityInfo(&security_info); + if (security_info.security_level == + security_state::SecurityStateModel::HTTP_SHOW_WARNING) { + web_contents_->GetMainFrame()->AddMessageToConsole( + content::CONSOLE_MESSAGE_LEVEL_WARNING, + "In Chrome M56 (Jan 2017), this page will be marked " + "as \"not secure\" in the URL bar. For more " + "information, see https://goo.gl/zmWq3m"); + logged_http_warning_on_current_navigation_ = true; + } +} + +void ChromeSecurityStateModelClient::DidFinishNavigation( + content::NavigationHandle* navigation_handle) { + if (navigation_handle->IsInMainFrame() && + !navigation_handle->IsSynchronousNavigation()) { + // Only reset the console message flag for main-frame navigations, + // and not for synchronous navigations like reference fragments and + // pushState. + logged_http_warning_on_current_navigation_ = false; + } +} + bool ChromeSecurityStateModelClient::UsedPolicyInstalledCertificate() { #if defined(OS_CHROMEOS) policy::PolicyCertService* service =
diff --git a/chrome/browser/ssl/chrome_security_state_model_client.h b/chrome/browser/ssl/chrome_security_state_model_client.h index c5f8854..be12ac1 100644 --- a/chrome/browser/ssl/chrome_security_state_model_client.h +++ b/chrome/browser/ssl/chrome_security_state_model_client.h
@@ -10,11 +10,13 @@ #include "base/macros.h" #include "components/security_state/security_state_model.h" #include "components/security_state/security_state_model_client.h" +#include "content/public/browser/web_contents_observer.h" #include "content/public/browser/web_contents_user_data.h" #include "third_party/WebKit/public/platform/WebSecurityStyle.h" namespace content { struct SecurityStyleExplanations; +class NavigationHandle; class WebContents; } // namespace content @@ -22,6 +24,7 @@ // information that it needs to determine the page's security status. class ChromeSecurityStateModelClient : public security_state::SecurityStateModelClient, + public content::WebContentsObserver, public content::WebContentsUserData<ChromeSecurityStateModelClient> { public: ~ChromeSecurityStateModelClient() override; @@ -29,6 +32,13 @@ void GetSecurityInfo( security_state::SecurityStateModel::SecurityInfo* result) const; + // Called when the NavigationEntry's SSLStatus changes. + void VisibleSSLStateChanged(); + + // content::WebContentsObserver: + void DidFinishNavigation( + content::NavigationHandle* navigation_handle) override; + // Returns the SecurityStyle that should be applied to a WebContents // with the given |security_info|. Populates // |security_style_explanations| to explain why the returned @@ -50,6 +60,12 @@ content::WebContents* web_contents_; std::unique_ptr<security_state::SecurityStateModel> security_state_model_; + // True if a console has been logged about an omnibox warning that + // will be shown in future versions of Chrome for insecure HTTP + // pages. This message should only be logged once per main-frame + // navigation. + bool logged_http_warning_on_current_navigation_; + DISALLOW_COPY_AND_ASSIGN(ChromeSecurityStateModelClient); };
diff --git a/chrome/browser/ssl/chrome_security_state_model_client_browser_tests.cc b/chrome/browser/ssl/chrome_security_state_model_client_browser_tests.cc index daeaafb..f70f3d98f 100644 --- a/chrome/browser/ssl/chrome_security_state_model_client_browser_tests.cc +++ b/chrome/browser/ssl/chrome_security_state_model_client_browser_tests.cc
@@ -1119,6 +1119,293 @@ content::SSLStatus::DISPLAYED_PASSWORD_FIELD_ON_HTTP); } +// A Browser subclass that keeps track of messages that have been +// added to the console. Messages can be retrieved or cleared with +// console_messages() and ClearConsoleMessages(). The user of this class +// can set a callback to run when the next console message notification +// arrives. +class ConsoleWebContentsDelegate : public Browser { + public: + explicit ConsoleWebContentsDelegate(const Browser::CreateParams& params) + : Browser(params) {} + ~ConsoleWebContentsDelegate() override {} + + const std::vector<base::string16>& console_messages() const { + return console_messages_; + } + + void set_console_message_callback(const base::Closure& callback) { + console_message_callback_ = callback; + } + + void ClearConsoleMessages() { console_messages_.clear(); } + + // content::WebContentsDelegate + bool AddMessageToConsole(content::WebContents* source, + int32_t level, + const base::string16& message, + int32_t line_no, + const base::string16& source_id) override { + console_messages_.push_back(message); + if (!console_message_callback_.is_null()) { + console_message_callback_.Run(); + console_message_callback_.Reset(); + } + return true; + } + + private: + std::vector<base::string16> console_messages_; + base::Closure console_message_callback_; + + DISALLOW_COPY_AND_ASSIGN(ConsoleWebContentsDelegate); +}; + +// Checks that |delegate| has observed exactly one console message for +// HTTP_SHOW_WARNING. This does not check for the exact string (for fear +// of being too brittle) but rather just a keyword ("not secure"). +void CheckForOneHttpWarningConsoleMessage( + ConsoleWebContentsDelegate* delegate) { + const std::vector<base::string16>& messages = delegate->console_messages(); + ASSERT_EQ(1u, messages.size()); + EXPECT_NE(base::string16::npos, + messages[0].find(base::ASCIIToUTF16("not secure"))); +} + +// Tests that console messages are printed upon a call to +// GetSecurityInfo() on an HTTP_SHOW_WARNING page, exactly once per +// main-frame navigation. +IN_PROC_BROWSER_TEST_F(ChromeSecurityStateModelClientTestWithPasswordCcSwitch, + ConsoleMessage) { + ConsoleWebContentsDelegate* delegate = new ConsoleWebContentsDelegate( + Browser::CreateParams(browser()->profile())); + content::WebContents* original_contents = + browser()->tab_strip_model()->GetActiveWebContents(); + content::WebContents* contents = + content::WebContents::Create(content::WebContents::CreateParams( + original_contents->GetBrowserContext())); + ASSERT_TRUE(contents); + contents->SetDelegate(delegate); + delegate->tab_strip_model()->AppendWebContents(contents, true); + int index = delegate->tab_strip_model()->GetIndexOfWebContents(contents); + delegate->tab_strip_model()->ActivateTabAt(index, true); + ASSERT_EQ(contents, delegate->tab_strip_model()->GetActiveWebContents()); + + // Navigate to an HTTP page. Use a non-local hostname so that is it + // not considered secure. + GURL http_url = + GetURLWithNonLocalHostname(embedded_test_server(), "/title1.html"); + ui_test_utils::NavigateToURL(delegate, http_url); + content::NavigationEntry* entry = contents->GetController().GetVisibleEntry(); + ASSERT_TRUE(entry); + EXPECT_EQ(http_url, entry->GetURL()); + EXPECT_TRUE(delegate->console_messages().empty()); + + // Trigger the HTTP_SHOW_WARNING state. + base::RunLoop first_message; + delegate->set_console_message_callback(first_message.QuitClosure()); + contents->OnPasswordInputShownOnHttp(); + first_message.Run(); + + // Check that the HTTP_SHOW_WARNING state was actually triggered. + ChromeSecurityStateModelClient* client = + ChromeSecurityStateModelClient::FromWebContents(contents); + ASSERT_TRUE(client); + security_state::SecurityStateModel::SecurityInfo security_info; + client->GetSecurityInfo(&security_info); + EXPECT_EQ(security_state::SecurityStateModel::HTTP_SHOW_WARNING, + security_info.security_level); + + // Check that the expected console message is present. + ASSERT_NO_FATAL_FAILURE(CheckForOneHttpWarningConsoleMessage(delegate)); + delegate->ClearConsoleMessages(); + + // Two subsequent triggers of VisibleSSLStateChanged -- one on the + // same navigation and one on another navigation -- should only result + // in one additional console message. + contents->OnCreditCardInputShownOnHttp(); + GURL second_http_url = + GetURLWithNonLocalHostname(embedded_test_server(), "/title2.html"); + ui_test_utils::NavigateToURL(delegate, second_http_url); + entry = contents->GetController().GetVisibleEntry(); + ASSERT_TRUE(entry); + EXPECT_EQ(second_http_url, entry->GetURL()); + + base::RunLoop second_message; + delegate->set_console_message_callback(second_message.QuitClosure()); + contents->OnPasswordInputShownOnHttp(); + second_message.Run(); + + client->GetSecurityInfo(&security_info); + EXPECT_EQ(security_state::SecurityStateModel::HTTP_SHOW_WARNING, + security_info.security_level); + + ASSERT_NO_FATAL_FAILURE(CheckForOneHttpWarningConsoleMessage(delegate)); +} + +// Tests that additional HTTP_SHOW_WARNING console messages are not +// printed after subframe navigations. +IN_PROC_BROWSER_TEST_F(ChromeSecurityStateModelClientTestWithPasswordCcSwitch, + ConsoleMessageNotPrintedForFrameNavigation) { + ConsoleWebContentsDelegate* delegate = new ConsoleWebContentsDelegate( + Browser::CreateParams(browser()->profile())); + content::WebContents* original_contents = + browser()->tab_strip_model()->GetActiveWebContents(); + content::WebContents* contents = + content::WebContents::Create(content::WebContents::CreateParams( + original_contents->GetBrowserContext())); + ASSERT_TRUE(contents); + contents->SetDelegate(delegate); + delegate->tab_strip_model()->AppendWebContents(contents, true); + int index = delegate->tab_strip_model()->GetIndexOfWebContents(contents); + delegate->tab_strip_model()->ActivateTabAt(index, true); + ASSERT_EQ(contents, delegate->tab_strip_model()->GetActiveWebContents()); + + // Navigate to an HTTP page. Use a non-local hostname so that is it + // not considered secure. + GURL http_url = GetURLWithNonLocalHostname(embedded_test_server(), + "/ssl/page_with_frame.html"); + ui_test_utils::NavigateToURL(delegate, http_url); + content::NavigationEntry* entry = contents->GetController().GetVisibleEntry(); + ASSERT_TRUE(entry); + EXPECT_EQ(http_url, entry->GetURL()); + EXPECT_TRUE(delegate->console_messages().empty()); + + // Trigger the HTTP_SHOW_WARNING state. + base::RunLoop first_message; + delegate->set_console_message_callback(first_message.QuitClosure()); + contents->OnPasswordInputShownOnHttp(); + first_message.Run(); + + // Check that the HTTP_SHOW_WARNING state was actually triggered. + ChromeSecurityStateModelClient* client = + ChromeSecurityStateModelClient::FromWebContents(contents); + ASSERT_TRUE(client); + security_state::SecurityStateModel::SecurityInfo security_info; + client->GetSecurityInfo(&security_info); + EXPECT_EQ(security_state::SecurityStateModel::HTTP_SHOW_WARNING, + security_info.security_level); + + // Check that the expected console message is present. + ASSERT_NO_FATAL_FAILURE(CheckForOneHttpWarningConsoleMessage(delegate)); + delegate->ClearConsoleMessages(); + + // Navigate the subframe and trigger VisibleSSLStateChanged + // again. While the security level is still HTTP_SHOW_WARNING, an + // additional console message should not be logged because there was + // already a console message logged for the current main-frame + // navigation. + content::WindowedNotificationObserver subframe_observer( + content::NOTIFICATION_LOAD_STOP, + content::Source<content::NavigationController>( + &contents->GetController())); + EXPECT_TRUE(content::ExecuteScript( + contents, "document.getElementById('navFrame').src = '/title2.html';")); + subframe_observer.Wait(); + contents->OnCreditCardInputShownOnHttp(); + EXPECT_EQ(security_state::SecurityStateModel::HTTP_SHOW_WARNING, + security_info.security_level); + + // Do a main frame navigation and then trigger HTTP_SHOW_WARNING + // again. From the above subframe navigation and this main-frame + // navigation, exactly one console message is expected. + GURL second_http_url = + GetURLWithNonLocalHostname(embedded_test_server(), "/title2.html"); + ui_test_utils::NavigateToURL(delegate, second_http_url); + entry = contents->GetController().GetVisibleEntry(); + ASSERT_TRUE(entry); + EXPECT_EQ(second_http_url, entry->GetURL()); + + base::RunLoop second_message; + delegate->set_console_message_callback(second_message.QuitClosure()); + contents->OnPasswordInputShownOnHttp(); + second_message.Run(); + + client->GetSecurityInfo(&security_info); + EXPECT_EQ(security_state::SecurityStateModel::HTTP_SHOW_WARNING, + security_info.security_level); + ASSERT_NO_FATAL_FAILURE(CheckForOneHttpWarningConsoleMessage(delegate)); +} + +// Tests that additional HTTP_SHOW_WARNING console messages are not +// printed after pushState navigations. +IN_PROC_BROWSER_TEST_F(ChromeSecurityStateModelClientTestWithPasswordCcSwitch, + ConsoleMessageNotPrintedForPushStateNavigation) { + ConsoleWebContentsDelegate* delegate = new ConsoleWebContentsDelegate( + Browser::CreateParams(browser()->profile())); + content::WebContents* original_contents = + browser()->tab_strip_model()->GetActiveWebContents(); + content::WebContents* contents = + content::WebContents::Create(content::WebContents::CreateParams( + original_contents->GetBrowserContext())); + ASSERT_TRUE(contents); + contents->SetDelegate(delegate); + delegate->tab_strip_model()->AppendWebContents(contents, true); + int index = delegate->tab_strip_model()->GetIndexOfWebContents(contents); + delegate->tab_strip_model()->ActivateTabAt(index, true); + ASSERT_EQ(contents, delegate->tab_strip_model()->GetActiveWebContents()); + + // Navigate to an HTTP page. Use a non-local hostname so that is it + // not considered secure. + GURL http_url = + GetURLWithNonLocalHostname(embedded_test_server(), "/title1.html"); + ui_test_utils::NavigateToURL(delegate, http_url); + content::NavigationEntry* entry = contents->GetController().GetVisibleEntry(); + ASSERT_TRUE(entry); + EXPECT_EQ(http_url, entry->GetURL()); + EXPECT_TRUE(delegate->console_messages().empty()); + + // Trigger the HTTP_SHOW_WARNING state. + base::RunLoop first_message; + delegate->set_console_message_callback(first_message.QuitClosure()); + contents->OnPasswordInputShownOnHttp(); + first_message.Run(); + + // Check that the HTTP_SHOW_WARNING state was actually triggered. + ChromeSecurityStateModelClient* client = + ChromeSecurityStateModelClient::FromWebContents(contents); + ASSERT_TRUE(client); + security_state::SecurityStateModel::SecurityInfo security_info; + client->GetSecurityInfo(&security_info); + EXPECT_EQ(security_state::SecurityStateModel::HTTP_SHOW_WARNING, + security_info.security_level); + + // Check that the expected console message is present. + ASSERT_NO_FATAL_FAILURE(CheckForOneHttpWarningConsoleMessage(delegate)); + delegate->ClearConsoleMessages(); + + // Navigate with pushState and trigger VisibleSSLStateChanged + // again. While the security level is still HTTP_SHOW_WARNING, an + // additional console message should not be logged because there was + // already a console message logged for the current main-frame + // navigation. + EXPECT_TRUE(content::ExecuteScript( + contents, "history.pushState({ foo: 'bar' }, 'foo', 'bar');")); + contents->OnCreditCardInputShownOnHttp(); + EXPECT_EQ(security_state::SecurityStateModel::HTTP_SHOW_WARNING, + security_info.security_level); + + // Do a main frame navigation and then trigger HTTP_SHOW_WARNING + // again. From the above pushState navigation and this main-frame + // navigation, exactly one console message is expected. + GURL second_http_url = + GetURLWithNonLocalHostname(embedded_test_server(), "/title2.html"); + ui_test_utils::NavigateToURL(delegate, second_http_url); + entry = contents->GetController().GetVisibleEntry(); + ASSERT_TRUE(entry); + EXPECT_EQ(second_http_url, entry->GetURL()); + + base::RunLoop second_message; + delegate->set_console_message_callback(second_message.QuitClosure()); + contents->OnPasswordInputShownOnHttp(); + second_message.Run(); + + client->GetSecurityInfo(&security_info); + EXPECT_EQ(security_state::SecurityStateModel::HTTP_SHOW_WARNING, + security_info.security_level); + ASSERT_NO_FATAL_FAILURE(CheckForOneHttpWarningConsoleMessage(delegate)); +} + // Tests that the SecurityStateModel for a WebContents is up to date // when the WebContents is inserted into a Browser's TabStripModel. IN_PROC_BROWSER_TEST_F(ChromeSecurityStateModelClientTest, AddedTab) {
diff --git a/chrome/browser/supervised_user/supervised_user_url_filter.cc b/chrome/browser/supervised_user/supervised_user_url_filter.cc index 53091ea..d2263138 100644 --- a/chrome/browser/supervised_user/supervised_user_url_filter.cc +++ b/chrome/browser/supervised_user/supervised_user_url_filter.cc
@@ -140,11 +140,9 @@ std::string path; std::string query; bool match_subdomains = true; - URLBlacklist::SegmentURLCallback callback = - static_cast<URLBlacklist::SegmentURLCallback>(url_formatter::SegmentURL); - if (!URLBlacklist::FilterToComponents( - callback, pattern, - &scheme, &host, &match_subdomains, &port, &path, &query)) { + if (!URLBlacklist::FilterToComponents(pattern, &scheme, &host, + &match_subdomains, &port, &path, + &query)) { LOG(ERROR) << "Invalid pattern " << pattern; return -1; }
diff --git a/chrome/browser/sync/chrome_sync_client.cc b/chrome/browser/sync/chrome_sync_client.cc index 9bf14597..c02c753 100644 --- a/chrome/browser/sync/chrome_sync_client.cc +++ b/chrome/browser/sync/chrome_sync_client.cc
@@ -206,7 +206,7 @@ net::URLRequestContextGetter* url_request_context_getter = profile_->GetRequestContext(); - component_factory_.reset(new ProfileSyncComponentsFactoryImpl( + component_factory_ = base::MakeUnique<ProfileSyncComponentsFactoryImpl>( this, chrome::GetChannel(), chrome::GetVersionString(), ui::GetDeviceFormFactor() == ui::DEVICE_FORM_FACTOR_TABLET, *base::CommandLine::ForCurrentProcess(), @@ -216,7 +216,7 @@ content::BrowserThread::GetTaskRunnerForThread( content::BrowserThread::DB), token_service, url_request_context_getter, web_data_service_, - password_store_)); + password_store_); } }
diff --git a/chrome/browser/sync/profile_sync_service_android.cc b/chrome/browser/sync/profile_sync_service_android.cc index cb6df2f..a4d8521 100644 --- a/chrome/browser/sync/profile_sync_service_android.cc +++ b/chrome/browser/sync/profile_sync_service_android.cc
@@ -97,7 +97,7 @@ return; } - sync_prefs_.reset(new syncer::SyncPrefs(profile_->GetPrefs())); + sync_prefs_ = base::MakeUnique<syncer::SyncPrefs>(profile_->GetPrefs()); sync_service_ = ProfileSyncServiceFactory::GetInstance()->GetForProfile(profile_); @@ -441,14 +441,9 @@ JNIEnv* env, const JavaParamRef<jobject>&) { DCHECK_CURRENTLY_ON(BrowserThread::UI); - const std::string& sync_username = - SigninManagerFactory::GetForProfile(profile_) - ->GetAuthenticatedAccountInfo() - .email; + // TODO(maxbogue): Remove this function. This String can be used in Java. return base::android::ConvertUTF16ToJavaString(env, - l10n_util::GetStringFUTF16( - IDS_SYNC_ACCOUNT_SYNCING_TO_USER, - base::ASCIIToUTF16(sync_username))); + l10n_util::GetStringUTF16(IDS_SYNC_ACCOUNT_SYNCING)); } ScopedJavaLocalRef<jstring>
diff --git a/chrome/browser/sync/sessions/sessions_sync_manager_unittest.cc b/chrome/browser/sync/sessions/sessions_sync_manager_unittest.cc index 4c6ee37..7e1c17b 100644 --- a/chrome/browser/sync/sessions/sessions_sync_manager_unittest.cc +++ b/chrome/browser/sync/sessions/sessions_sync_manager_unittest.cc
@@ -8,6 +8,7 @@ #include <utility> +#include "base/memory/ptr_util.h" #include "base/strings/string_util.h" #include "build/build_config.h" #include "chrome/browser/sessions/session_tab_helper.h" @@ -309,32 +310,28 @@ protected: SessionsSyncManagerTest() : test_processor_(NULL) { - local_device_.reset(new LocalDeviceInfoProviderMock( - "cache_guid", - "Wayne Gretzky's Hacking Box", - "Chromium 10k", - "Chrome 10k", - sync_pb::SyncEnums_DeviceType_TYPE_LINUX, - "device_id")); + local_device_ = base::MakeUnique<LocalDeviceInfoProviderMock>( + "cache_guid", "Wayne Gretzky's Hacking Box", "Chromium 10k", + "Chrome 10k", sync_pb::SyncEnums_DeviceType_TYPE_LINUX, "device_id"); } void SetUp() override { BrowserWithTestWindowTest::SetUp(); - sync_client_.reset(new browser_sync::ChromeSyncClient(profile())); - sessions_client_shim_.reset( - new SyncSessionsClientShim(sync_client_->GetSyncSessionsClient())); + sync_client_ = base::MakeUnique<browser_sync::ChromeSyncClient>(profile()); + sessions_client_shim_ = base::MakeUnique<SyncSessionsClientShim>( + sync_client_->GetSyncSessionsClient()); NotificationServiceSessionsRouter* router( new NotificationServiceSessionsRouter( profile(), GetSyncSessionsClient(), syncer::SyncableService::StartSyncFlare())); - sync_prefs_.reset(new syncer::SyncPrefs(profile()->GetPrefs())); - manager_.reset(new SessionsSyncManager( + sync_prefs_ = base::MakeUnique<syncer::SyncPrefs>(profile()->GetPrefs()); + manager_ = base::MakeUnique<SessionsSyncManager>( GetSyncSessionsClient(), sync_prefs_.get(), local_device_.get(), std::unique_ptr<LocalSessionEventRouter>(router), base::Bind(&SessionNotificationObserver::NotifyOfUpdate, base::Unretained(&observer_)), base::Bind(&SessionNotificationObserver::NotifyOfRefresh, - base::Unretained(&observer_)))); + base::Unretained(&observer_))); } void TearDown() override {
diff --git a/chrome/browser/sync/sync_error_notifier_ash_unittest.cc b/chrome/browser/sync/sync_error_notifier_ash_unittest.cc index 9dc33be..a9ae11b 100644 --- a/chrome/browser/sync/sync_error_notifier_ash_unittest.cc +++ b/chrome/browser/sync/sync_error_notifier_ash_unittest.cc
@@ -89,29 +89,30 @@ // Set up a desktop screen for Windows to hold native widgets, used when // adding desktop widgets (i.e., message center notifications). #if defined(OS_WIN) - test_screen_.reset(aura::TestScreen::Create(gfx::Size())); + test_screen_ = base::MakeUnique<aura::TestScreen::Create>(gfx::Size()); display::Screen::SetScreenInstance(test_screen_.get()); #endif AshTestBase::SetUp(); - profile_manager_.reset( - new TestingProfileManager(TestingBrowserProcess::GetGlobal())); + profile_manager_ = base::MakeUnique<TestingProfileManager>( + TestingBrowserProcess::GetGlobal()); ASSERT_TRUE(profile_manager_->SetUp()); profile_ = profile_manager_->CreateTestingProfile(kTestAccountId); - service_.reset(new browser_sync::ProfileSyncServiceMock( - CreateProfileSyncServiceParamsForTest(profile_))); + service_ = base::MakeUnique<browser_sync::ProfileSyncServiceMock>( + CreateProfileSyncServiceParamsForTest(profile_)); FakeLoginUIService* login_ui_service = static_cast<FakeLoginUIService*>( LoginUIServiceFactory::GetInstance()->SetTestingFactoryAndUse( profile_, BuildMockLoginUIService)); login_ui_service->SetLoginUI(&login_ui_); - error_controller_.reset(new syncer::SyncErrorController(service_.get())); - error_notifier_.reset(new SyncErrorNotifier(error_controller_.get(), - profile_)); + error_controller_ = + base::MakeUnique<syncer::SyncErrorController>(service_.get()); + error_notifier_ = + base::MakeUnique<SyncErrorNotifier>(error_controller_.get(), profile_); notification_ui_manager_ = g_browser_process->notification_ui_manager(); }
diff --git a/chrome/browser/sync/sync_startup_tracker_unittest.cc b/chrome/browser/sync/sync_startup_tracker_unittest.cc index 9913562d..069634a 100644 --- a/chrome/browser/sync/sync_startup_tracker_unittest.cc +++ b/chrome/browser/sync/sync_startup_tracker_unittest.cc
@@ -6,6 +6,7 @@ #include <memory> +#include "base/memory/ptr_util.h" #include "chrome/browser/sync/profile_sync_service_factory.h" #include "chrome/browser/sync/profile_sync_test_util.h" #include "chrome/test/base/testing_profile.h" @@ -33,7 +34,7 @@ no_error_(GoogleServiceAuthError::NONE) { } void SetUp() override { - profile_.reset(new TestingProfile()); + profile_ = base::MakeUnique<TestingProfile>(); mock_pss_ = static_cast<browser_sync::ProfileSyncServiceMock*>( ProfileSyncServiceFactory::GetInstance()->SetTestingFactoryAndUse( profile_.get(), BuildMockProfileSyncService));
diff --git a/chrome/browser/sync/sync_ui_util.cc b/chrome/browser/sync/sync_ui_util.cc index 23309e5..8259e6e 100644 --- a/chrome/browser/sync/sync_ui_util.cc +++ b/chrome/browser/sync/sync_ui_util.cc
@@ -67,54 +67,29 @@ base::string16 GetSyncedStateStatusLabel(ProfileSyncService* service, const SigninManagerBase& signin, StatusLabelStyle style) { - std::string user_display_name = signin.GetAuthenticatedAccountInfo().email; - -#if defined(OS_CHROMEOS) - if (user_manager::UserManager::IsInitialized()) { - // On CrOS user email is sanitized and then passed to the signin manager. - // Original email (containing dots) is stored as "display email". - user_display_name = user_manager::UserManager::Get()->GetUserDisplayEmail( - AccountId::FromUserEmail(user_display_name)); - } -#endif // defined(OS_CHROMEOS) - - base::string16 user_name = base::UTF8ToUTF16(user_display_name); - - if (!user_name.empty()) { - if (!service || service->IsManaged()) { - // User is signed in, but sync is disabled. - return l10n_util::GetStringFUTF16(IDS_SIGNED_IN_WITH_SYNC_DISABLED, - user_name); - } else if (!service->IsSyncRequested()) { - // User is signed in, but sync has been stopped. - return l10n_util::GetStringFUTF16(IDS_SIGNED_IN_WITH_SYNC_SUPPRESSED, - user_name); - } - } - - if (!service || !service->IsSyncActive()) { + if (!service || service->IsManaged()) { + // User is signed in, but sync is disabled. + return l10n_util::GetStringUTF16(IDS_SIGNED_IN_WITH_SYNC_DISABLED); + } else if (!service->IsSyncRequested()) { + // User is signed in, but sync has been stopped. + return l10n_util::GetStringUTF16(IDS_SIGNED_IN_WITH_SYNC_SUPPRESSED); + } else if (!service->IsSyncActive()) { // User is not signed in, or sync is still initializing. return base::string16(); } - DCHECK(!user_name.empty()); - // Message may also carry additional advice with an HTML link, if acceptable. switch (style) { case PLAIN_TEXT: - return l10n_util::GetStringFUTF16( - IDS_SYNC_ACCOUNT_SYNCING_TO_USER, - user_name); + return l10n_util::GetStringUTF16(IDS_SYNC_ACCOUNT_SYNCING); case WITH_HTML: if (IsChromeDashboardEnabled()) { return l10n_util::GetStringFUTF16( - IDS_SYNC_ACCOUNT_SYNCING_TO_USER_WITH_MANAGE_LINK_NEW, - user_name, + IDS_SYNC_ACCOUNT_SYNCING_WITH_MANAGE_LINK_NEW, base::ASCIIToUTF16(chrome::kSyncGoogleDashboardURL)); } return l10n_util::GetStringFUTF16( - IDS_SYNC_ACCOUNT_SYNCING_TO_USER_WITH_MANAGE_LINK, - user_name, + IDS_SYNC_ACCOUNT_SYNCING_WITH_MANAGE_LINK, base::ASCIIToUTF16(chrome::kSyncGoogleDashboardURL)); default: NOTREACHED(); @@ -298,9 +273,8 @@ } else if (signin.IsAuthenticated()) { // The user is signed in, but sync has been stopped. if (status_label) { - base::string16 label = l10n_util::GetStringFUTF16( - IDS_SIGNED_IN_WITH_SYNC_SUPPRESSED, - base::UTF8ToUTF16(signin.GetAuthenticatedAccountInfo().email)); + base::string16 label = l10n_util::GetStringUTF16( + IDS_SIGNED_IN_WITH_SYNC_SUPPRESSED); status_label->assign(label); result_type = PRE_SYNCED; }
diff --git a/chrome/browser/sync/test/integration/sync_arc_package_helper.cc b/chrome/browser/sync/test/integration/sync_arc_package_helper.cc index 609c855..df3a874 100644 --- a/chrome/browser/sync/test/integration/sync_arc_package_helper.cc +++ b/chrome/browser/sync/test/integration/sync_arc_package_helper.cc
@@ -7,6 +7,7 @@ #include <vector> #include "base/command_line.h" +#include "base/memory/ptr_util.h" #include "base/run_loop.h" #include "base/strings/string_number_conversions.h" #include "chrome/browser/chromeos/arc/arc_auth_service.h" @@ -67,8 +68,8 @@ } test_ = test; - user_manager_enabler_.reset(new chromeos::ScopedUserManagerEnabler( - new chromeos::FakeChromeUserManager())); + user_manager_enabler_ = base::MakeUnique<chromeos::ScopedUserManagerEnabler>( + new chromeos::FakeChromeUserManager()); base::CommandLine::ForCurrentProcess()->AppendSwitch( chromeos::switches::kEnableArc); ArcAppListPrefsFactory::SetFactoryForSyncTest(); @@ -166,7 +167,8 @@ arc_app_list_prefs->SetDefaltAppsReadyCallback(run_loop.QuitClosure()); run_loop.Run(); - instance_map_[profile].reset(new FakeAppInstance(arc_app_list_prefs)); + instance_map_[profile] = + base::MakeUnique<FakeAppInstance>(arc_app_list_prefs); DCHECK(instance_map_[profile].get()); arc_app_list_prefs->app_instance_holder()->SetInstance( instance_map_[profile].get());
diff --git a/chrome/browser/sync/test/integration/sync_test.cc b/chrome/browser/sync/test/integration/sync_test.cc index a6d03b5..d12af4c 100644 --- a/chrome/browser/sync/test/integration/sync_test.cc +++ b/chrome/browser/sync/test/integration/sync_test.cc
@@ -354,8 +354,9 @@ // Without need of real GAIA authentication, we create new test profiles. // For test profiles, a custom delegate needs to be used to do the // initialization work before the profile is registered. - profile_delegates_[index].reset(new SyncProfileDelegate(base::Bind( - &SyncTest::InitializeProfile, base::Unretained(this), index))); + profile_delegates_[index] = + base::MakeUnique<SyncProfileDelegate>(base::Bind( + &SyncTest::InitializeProfile, base::Unretained(this), index)); MakeTestProfile(profile_path, index); } @@ -507,8 +508,8 @@ if (use_verifier_) { base::FilePath user_data_dir; PathService::Get(chrome::DIR_USER_DATA, &user_data_dir); - profile_delegates_[num_clients_].reset( - new SyncProfileDelegate(base::Callback<void(Profile*)>())); + profile_delegates_[num_clients_] = + base::MakeUnique<SyncProfileDelegate>(base::Callback<void(Profile*)>()); verifier_ = MakeTestProfile( user_data_dir.Append(FILE_PATH_LITERAL("Verifier")), num_clients_); WaitForDataModels(verifier()); @@ -701,8 +702,8 @@ resolver->AllowDirectLookup("*.thawte.com"); resolver->AllowDirectLookup("*.geotrust.com"); resolver->AllowDirectLookup("*.gstatic.com"); - mock_host_resolver_override_.reset( - new net::ScopedDefaultHostResolverProc(resolver)); + mock_host_resolver_override_ = + base::MakeUnique<net::ScopedDefaultHostResolverProc>(resolver); } void SyncTest::TearDownInProcessBrowserTestFixture() { @@ -738,8 +739,8 @@ } void SyncTest::SetupMockGaiaResponses() { - factory_.reset(new net::URLFetcherImplFactory()); - fake_factory_.reset(new net::FakeURLFetcherFactory(factory_.get())); + factory_ = base::MakeUnique<net::URLFetcherImplFactory>(); + fake_factory_ = base::MakeUnique<net::FakeURLFetcherFactory>(factory_.get()); fake_factory_->SetFakeResponse( GaiaUrls::GetInstance()->get_user_info_url(), "email=user@gmail.com\ndisplayEmail=user@gmail.com", @@ -868,7 +869,7 @@ if (!SetUpLocalTestServer()) LOG(FATAL) << "Failed to set up local test server"; } else if (server_type_ == IN_PROCESS_FAKE_SERVER) { - fake_server_.reset(new fake_server::FakeServer()); + fake_server_ = base::MakeUnique<fake_server::FakeServer>(); SetupMockGaiaResponses(); } else { LOG(FATAL) << "Don't know which server environment to run test in."; @@ -898,7 +899,7 @@ net::HostPortPair xmpp_host_port_pair(sync_server_.host_port_pair()); xmpp_host_port_pair.set_port(xmpp_port); - xmpp_port_.reset(new net::ScopedPortException(xmpp_port)); + xmpp_port_ = base::MakeUnique<net::ScopedPortException>(xmpp_port); if (!cl->HasSwitch(invalidation::switches::kSyncNotificationHostPort)) { cl->AppendSwitchASCII(invalidation::switches::kSyncNotificationHostPort,
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn index 0bc642f..97d00e08 100644 --- a/chrome/browser/ui/BUILD.gn +++ b/chrome/browser/ui/BUILD.gn
@@ -1809,8 +1809,6 @@ "views/tabs/window_finder.cc", "views/tabs/window_finder.h", "views/tabs/window_finder_chromeos.cc", - "views/tabs/window_finder_mus.cc", - "views/tabs/window_finder_mus.h", "views/tabs/window_finder_win.cc", "views/theme_copying_widget.cc", "views/theme_copying_widget.h", @@ -1858,9 +1856,14 @@ ] } - # TODO(ellyjones): This target fails to build on Mac because of - # incompatible uses of gpu::AcceleratedWidget vs gpu::SurfaceHandle. + # TODO(ellyjones): Mus is not supported on Mac (there is no ui::Window + # apart from aura::Window, which is also not supported). if (!is_mac) { + sources += [ + "views/tabs/window_finder_mus.cc", + "views/tabs/window_finder_mus.h", + ] + deps += [ "//ui/views/mus" ] } }
diff --git a/chrome/browser/ui/android/context_menu_helper.cc b/chrome/browser/ui/android/context_menu_helper.cc index 6694096..67bbb92 100644 --- a/chrome/browser/ui/android/context_menu_helper.cc +++ b/chrome/browser/ui/android/context_menu_helper.cc
@@ -86,10 +86,11 @@ params.page_url : params.frame_url).GetAsReferrer(); std::map<std::string, std::string>::const_iterator it = - params.properties.find(data_reduction_proxy::chrome_proxy_header()); + params.properties.find( + data_reduction_proxy::chrome_proxy_content_transform_header()); bool image_was_fetched_lo_fi = it != params.properties.end() && - it->second == data_reduction_proxy::chrome_proxy_lo_fi_directive(); + it->second == data_reduction_proxy::empty_image_directive(); bool can_save = params.media_flags & blink::WebContextMenuData::MediaCanSave; JNIEnv* env = base::android::AttachCurrentThread(); base::android::ScopedJavaLocalRef<jobject> jmenu_info =
diff --git a/chrome/browser/ui/app_list/app_list_syncable_service.cc b/chrome/browser/ui/app_list/app_list_syncable_service.cc index e0fe309b..b6b6542 100644 --- a/chrome/browser/ui/app_list/app_list_syncable_service.cc +++ b/chrome/browser/ui/app_list/app_list_syncable_service.cc
@@ -327,7 +327,8 @@ } void AppListSyncableService::NotifyObserversSyncUpdated() { - FOR_EACH_OBSERVER(Observer, observer_list_, OnSyncModelUpdated()); + for (auto& observer : observer_list_) + observer.OnSyncModelUpdated(); } size_t AppListSyncableService::GetNumSyncItemsForTest() {
diff --git a/chrome/browser/ui/app_list/search/omnibox_result.cc b/chrome/browser/ui/app_list/search/omnibox_result.cc index eb052293..6d8812af 100644 --- a/chrome/browser/ui/app_list/search/omnibox_result.cc +++ b/chrome/browser/ui/app_list/search/omnibox_result.cc
@@ -12,13 +12,10 @@ #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/app_list/app_list_controller_delegate.h" #include "chrome/browser/ui/app_list/search/search_util.h" -#include "chrome/grit/theme_resources.h" #include "components/bookmarks/browser/bookmark_model.h" #include "components/omnibox/browser/autocomplete_controller.h" #include "components/omnibox/browser/autocomplete_match_type.h" #include "ui/app_list/app_list_constants.h" -#include "ui/base/material_design/material_design_controller.h" -#include "ui/base/resource/resource_bundle.h" #include "ui/gfx/paint_vector_icon.h" #include "ui/gfx/vector_icons_public.h" #include "url/gurl.h" @@ -171,18 +168,10 @@ bool is_bookmarked = bookmark_model && bookmark_model->IsBookmarked(match_.destination_url); - if (ui::MaterialDesignController::IsModeMaterial()) { - gfx::VectorIconId icon_id = is_bookmarked ? - gfx::VectorIconId::OMNIBOX_STAR : - AutocompleteMatch::TypeToVectorIcon(match_.type); - SetIcon(gfx::CreateVectorIcon(icon_id, 16, app_list::kIconColor)); - return; - } - - int resource_id = is_bookmarked ? IDR_OMNIBOX_STAR - : AutocompleteMatch::TypeToIcon(match_.type); - SetIcon( - *ui::ResourceBundle::GetSharedInstance().GetImageSkiaNamed(resource_id)); + gfx::VectorIconId icon_id = is_bookmarked ? + gfx::VectorIconId::OMNIBOX_STAR : + AutocompleteMatch::TypeToVectorIcon(match_.type); + SetIcon(gfx::CreateVectorIcon(icon_id, 16, app_list::kIconColor)); } void OmniboxResult::UpdateTitleAndDetails() {
diff --git a/chrome/browser/ui/app_list/start_page_service.cc b/chrome/browser/ui/app_list/start_page_service.cc index 052e2bd..5610c56 100644 --- a/chrome/browser/ui/app_list/start_page_service.cc +++ b/chrome/browser/ui/app_list/start_page_service.cc
@@ -485,15 +485,13 @@ speech_result_obtained_ = true; RecordAction(UserMetricsAction("AppList_SearchedBySpeech")); } - FOR_EACH_OBSERVER(StartPageObserver, - observers_, - OnSpeechResult(query, is_final)); + for (auto& observer : observers_) + observer.OnSpeechResult(query, is_final); } void StartPageService::OnSpeechSoundLevelChanged(int16_t level) { - FOR_EACH_OBSERVER(StartPageObserver, - observers_, - OnSpeechSoundLevelChanged(level)); + for (auto& observer : observers_) + observer.OnSpeechSoundLevelChanged(level); } void StartPageService::OnSpeechRecognitionStateChanged( @@ -532,9 +530,8 @@ speech_button_toggled_manually_ = false; speech_result_obtained_ = false; state_ = new_state; - FOR_EACH_OBSERVER(StartPageObserver, - observers_, - OnSpeechRecognitionStateChanged(new_state)); + for (auto& observer : observers_) + observer.OnSpeechRecognitionStateChanged(new_state); } void StartPageService::GetSpeechAuthParameters(std::string* auth_scope,
diff --git a/chrome/browser/ui/app_list/test/fake_profile_store.cc b/chrome/browser/ui/app_list/test/fake_profile_store.cc index 1bda66ad..83be0ec 100644 --- a/chrome/browser/ui/app_list/test/fake_profile_store.cc +++ b/chrome/browser/ui/app_list/test/fake_profile_store.cc
@@ -28,11 +28,11 @@ void FakeProfileStore::RemoveProfile(Profile* profile) { base::FilePath path(profile->GetPath()); - FOR_EACH_OBSERVER(ProfileAttributesStorage::Observer, observer_list_, - OnProfileWillBeRemoved(path)); + for (auto& observer : observer_list_) + observer.OnProfileWillBeRemoved(path); loaded_profiles_.erase(path); - FOR_EACH_OBSERVER(ProfileAttributesStorage::Observer, observer_list_, - OnProfileWasRemoved(path, base::string16())); + for (auto& observer : observer_list_) + observer.OnProfileWasRemoved(path, base::string16()); } void FakeProfileStore::AddProfileObserver(
diff --git a/chrome/browser/ui/ash/app_sync_ui_state.cc b/chrome/browser/ui/ash/app_sync_ui_state.cc index 0cbb022..b712fc2f 100644 --- a/chrome/browser/ui/ash/app_sync_ui_state.cc +++ b/chrome/browser/ui/ash/app_sync_ui_state.cc
@@ -109,9 +109,8 @@ break; } - FOR_EACH_OBSERVER(AppSyncUIStateObserver, - observers_, - OnAppSyncUIStatusChanged()); + for (AppSyncUIStateObserver& observer : observers_) + observer.OnAppSyncUIStatusChanged(); } void AppSyncUIState::CheckAppSync() {
diff --git a/chrome/browser/ui/ash/cast_config_delegate_media_router.cc b/chrome/browser/ui/ash/cast_config_delegate_media_router.cc index be88b40..83c18b6 100644 --- a/chrome/browser/ui/ash/cast_config_delegate_media_router.cc +++ b/chrome/browser/ui/ash/cast_config_delegate_media_router.cc
@@ -205,8 +205,8 @@ } } - FOR_EACH_OBSERVER(ash::CastConfigDelegate::Observer, observer_list_, - OnDevicesUpdated(items)); + for (ash::CastConfigDelegate::Observer& observer : observer_list_) + observer.OnDevicesUpdated(items); } void CastConfigDelegateMediaRouter::CastToReceiver(
diff --git a/chrome/browser/ui/ash/multi_user/multi_user_window_manager_chromeos.cc b/chrome/browser/ui/ash/multi_user/multi_user_window_manager_chromeos.cc index db3e6e33..deea5f9 100644 --- a/chrome/browser/ui/ash/multi_user/multi_user_window_manager_chromeos.cc +++ b/chrome/browser/ui/ash/multi_user/multi_user_window_manager_chromeos.cc
@@ -327,7 +327,8 @@ AddTransientOwnerRecursive(window, window); // Notify entry adding. - FOR_EACH_OBSERVER(Observer, observers_, OnOwnerEntryAdded(window)); + for (Observer& observer : observers_) + observer.OnOwnerEntryAdded(window); if (!IsWindowOnDesktopOfUser(window, current_account_id_)) SetWindowVisibility(window, false, 0); @@ -460,7 +461,8 @@ window_to_entry_.erase(window); // Notify entry change. - FOR_EACH_OBSERVER(Observer, observers_, OnOwnerEntryRemoved(window)); + for (Observer& observer : observers_) + observer.OnOwnerEntryRemoved(window); } void MultiUserWindowManagerChromeOS::OnWindowVisibilityChanging( @@ -587,7 +589,8 @@ } // Notify entry change. - FOR_EACH_OBSERVER(Observer, observers_, OnOwnerEntryChanged(window)); + for (Observer& observer : observers_) + observer.OnOwnerEntryChanged(window); return true; } @@ -632,7 +635,8 @@ } void MultiUserWindowManagerChromeOS::NotifyAfterUserSwitchAnimationFinished() { - FOR_EACH_OBSERVER(Observer, observers_, OnUserSwitchAnimationFinished()); + for (Observer& observer : observers_) + observer.OnUserSwitchAnimationFinished(); } void MultiUserWindowManagerChromeOS::AddBrowserWindow(Browser* browser) {
diff --git a/chrome/browser/ui/ash/network_connect_delegate_chromeos.cc b/chrome/browser/ui/ash/network_connect_delegate_chromeos.cc index d509ce2..51a0b0e 100644 --- a/chrome/browser/ui/ash/network_connect_delegate_chromeos.cc +++ b/chrome/browser/ui/ash/network_connect_delegate_chromeos.cc
@@ -4,10 +4,7 @@ #include "chrome/browser/ui/ash/network_connect_delegate_chromeos.h" -#include "ash/common/login_status.h" #include "ash/common/session/session_state_delegate.h" -#include "ash/common/shell_window_ids.h" -#include "ash/common/system/tray/system_tray_delegate.h" #include "ash/common/wm_shell.h" #include "ash/shell.h" #include "chrome/browser/chromeos/enrollment_dialog_view.h" @@ -24,19 +21,7 @@ } gfx::NativeWindow GetNativeWindow() { - ash::WmShell* wm_shell = ash::WmShell::Get(); - const bool session_started = - wm_shell->GetSessionStateDelegate()->IsActiveUserSessionStarted(); - const ash::LoginStatus login_status = - wm_shell->system_tray_delegate()->GetUserLoginStatus(); - const bool is_in_secondary_login_screen = - wm_shell->GetSessionStateDelegate()->IsInSecondaryLoginScreen(); - - int container_id = - (!session_started || login_status == ash::LoginStatus::NOT_LOGGED_IN || - login_status == ash::LoginStatus::LOCKED || is_in_secondary_login_screen) - ? ash::kShellWindowId_LockSystemModalContainer - : ash::kShellWindowId_SystemModalContainer; + int container_id = SystemTrayClient::GetDialogParentContainerId(); return ash::Shell::GetContainer(ash::Shell::GetPrimaryRootWindow(), container_id); }
diff --git a/chrome/browser/ui/ash/session_state_delegate_chromeos.cc b/chrome/browser/ui/ash/session_state_delegate_chromeos.cc index 686996a3..843f2da 100644 --- a/chrome/browser/ui/ash/session_state_delegate_chromeos.cc +++ b/chrome/browser/ui/ash/session_state_delegate_chromeos.cc
@@ -34,15 +34,23 @@ #include "ui/gfx/image/image_skia.h" SessionStateDelegateChromeos::SessionStateDelegateChromeos() - : session_state_(SESSION_STATE_LOGIN_PRIMARY) { + : session_state_(session_manager::SessionState::LOGIN_PRIMARY) { user_manager::UserManager::Get()->AddSessionStateObserver(this); chromeos::UserAddingScreen::Get()->AddObserver(this); // LoginState is not initialized in unit_tests. if (chromeos::LoginState::IsInitialized()) { chromeos::LoginState::Get()->AddObserver(this); - SetSessionState(chromeos::LoginState::Get()->IsUserLoggedIn() ? - SESSION_STATE_ACTIVE : SESSION_STATE_LOGIN_PRIMARY, true); + // Note that the session state is only set to ACTIVE or LOGIN_PRIMARY + // instead of using SessionManager::Get()->session_state(). This is + // an intermediate state of replacing SessionStateDelegate with + // mojo interfaces. The replacement mojo interface would reflect + // real session state in SessionManager and have getters to translate + // them in a sensible way to ash code. + SetSessionState(chromeos::LoginState::Get()->IsUserLoggedIn() + ? session_manager::SessionState::ACTIVE + : session_manager::SessionState::LOGIN_PRIMARY, + true); } } @@ -133,8 +141,8 @@ chromeos::UserAddingScreen::Get()->IsRunning(); } -ash::SessionStateDelegate::SessionState -SessionStateDelegateChromeos::GetSessionState() const { +session_manager::SessionState SessionStateDelegateChromeos::GetSessionState() + const { return session_state_; } @@ -231,32 +239,35 @@ } void SessionStateDelegateChromeos::LoggedInStateChanged() { - SetSessionState(chromeos::LoginState::Get()->IsUserLoggedIn() ? - SESSION_STATE_ACTIVE : SESSION_STATE_LOGIN_PRIMARY, false); + SetSessionState(chromeos::LoginState::Get()->IsUserLoggedIn() + ? session_manager::SessionState::ACTIVE + : session_manager::SessionState::LOGIN_PRIMARY, + false); } void SessionStateDelegateChromeos::ActiveUserChanged( const user_manager::User* active_user) { - FOR_EACH_OBSERVER(ash::SessionStateObserver, session_state_observer_list_, - ActiveUserChanged(active_user->GetAccountId())); + for (ash::SessionStateObserver& observer : session_state_observer_list_) + observer.ActiveUserChanged(active_user->GetAccountId()); } void SessionStateDelegateChromeos::UserAddedToSession( const user_manager::User* added_user) { - FOR_EACH_OBSERVER(ash::SessionStateObserver, session_state_observer_list_, - UserAddedToSession(added_user->GetAccountId())); + for (ash::SessionStateObserver& observer : session_state_observer_list_) + observer.UserAddedToSession(added_user->GetAccountId()); } void SessionStateDelegateChromeos::OnUserAddingStarted() { - SetSessionState(SESSION_STATE_LOGIN_SECONDARY, false); + SetSessionState(session_manager::SessionState::LOGIN_SECONDARY, false); } void SessionStateDelegateChromeos::OnUserAddingFinished() { - SetSessionState(SESSION_STATE_ACTIVE, false); + SetSessionState(session_manager::SessionState::ACTIVE, false); } -void SessionStateDelegateChromeos::SetSessionState(SessionState new_state, - bool force) { +void SessionStateDelegateChromeos::SetSessionState( + session_manager::SessionState new_state, + bool force) { if (session_state_ == new_state && !force) return; @@ -265,9 +276,8 @@ } void SessionStateDelegateChromeos::NotifySessionStateChanged() { - FOR_EACH_OBSERVER(ash::SessionStateObserver, - session_state_observer_list_, - SessionStateChanged(session_state_)); + for (ash::SessionStateObserver& observer : session_state_observer_list_) + observer.SessionStateChanged(session_state_); } void DoSwitchUser(const AccountId& account_id) {
diff --git a/chrome/browser/ui/ash/session_state_delegate_chromeos.h b/chrome/browser/ui/ash/session_state_delegate_chromeos.h index 8d90e03..dc85139 100644 --- a/chrome/browser/ui/ash/session_state_delegate_chromeos.h +++ b/chrome/browser/ui/ash/session_state_delegate_chromeos.h
@@ -37,7 +37,7 @@ void LockScreen() override; void UnlockScreen() override; bool IsUserSessionBlocked() const override; - SessionState GetSessionState() const override; + session_manager::SessionState GetSessionState() const override; const user_manager::UserInfo* GetUserInfo( ash::UserIndex index) const override; bool ShouldShowAvatar(ash::WmWindow* window) const override; @@ -63,7 +63,7 @@ // Sets session state to |new_state|. // If |force| is true then |new_state| is set even if existing session // state is the same (used for explicit initialization). - void SetSessionState(SessionState new_state, bool force); + void SetSessionState(session_manager::SessionState new_state, bool force); // Notify observers about session state change. void NotifySessionStateChanged(); @@ -76,7 +76,7 @@ base::ObserverList<ash::SessionStateObserver> session_state_observer_list_; // Session state (e.g. login screen vs. user session). - SessionState session_state_; + session_manager::SessionState session_state_; DISALLOW_COPY_AND_ASSIGN(SessionStateDelegateChromeos); };
diff --git a/chrome/browser/ui/ash/system_tray_client.cc b/chrome/browser/ui/ash/system_tray_client.cc index 516cb0c..705409b 100644 --- a/chrome/browser/ui/ash/system_tray_client.cc +++ b/chrome/browser/ui/ash/system_tray_client.cc
@@ -4,7 +4,9 @@ #include "chrome/browser/ui/ash/system_tray_client.h" +#include "ash/common/login_status.h" #include "ash/common/session/session_state_delegate.h" +#include "ash/common/shell_window_ids.h" #include "ash/common/wm_shell.h" #include "base/bind.h" #include "base/bind_helpers.h" @@ -22,6 +24,8 @@ #include "chrome/browser/ui/singleton_tabs.h" #include "chrome/common/url_constants.h" #include "chrome/grit/generated_resources.h" +#include "chromeos/dbus/dbus_thread_manager.h" +#include "chromeos/dbus/session_manager_client.h" #include "chromeos/login/login_state.h" #include "content/public/browser/user_metrics.h" #include "content/public/common/service_manager_connection.h" @@ -29,6 +33,7 @@ #include "services/service_manager/public/cpp/connector.h" #include "ui/base/l10n/l10n_util.h" +using chromeos::DBusThreadManager; using chromeos::LoginState; namespace { @@ -66,6 +71,57 @@ return g_instance; } +// static +ash::LoginStatus SystemTrayClient::GetUserLoginStatus() { + if (!LoginState::Get()->IsUserLoggedIn()) + return ash::LoginStatus::NOT_LOGGED_IN; + + // Session manager client owns screen lock status. + if (DBusThreadManager::Get()->GetSessionManagerClient()->IsScreenLocked()) + return ash::LoginStatus::LOCKED; + + LoginState::LoggedInUserType user_type = + LoginState::Get()->GetLoggedInUserType(); + switch (user_type) { + case LoginState::LOGGED_IN_USER_NONE: + return ash::LoginStatus::NOT_LOGGED_IN; + case LoginState::LOGGED_IN_USER_REGULAR: + return ash::LoginStatus::USER; + case LoginState::LOGGED_IN_USER_OWNER: + return ash::LoginStatus::OWNER; + case LoginState::LOGGED_IN_USER_GUEST: + return ash::LoginStatus::GUEST; + case LoginState::LOGGED_IN_USER_PUBLIC_ACCOUNT: + return ash::LoginStatus::PUBLIC; + case LoginState::LOGGED_IN_USER_SUPERVISED: + return ash::LoginStatus::SUPERVISED; + case LoginState::LOGGED_IN_USER_KIOSK_APP: + return ash::LoginStatus::KIOSK_APP; + } + NOTREACHED(); + return ash::LoginStatus::NOT_LOGGED_IN; +} + +// static +int SystemTrayClient::GetDialogParentContainerId() { + // TODO(mash): Need replacement for SessionStateDelegate. crbug.com/648964 + if (chrome::IsRunningInMash()) + return ash::kShellWindowId_SystemModalContainer; + + ash::WmShell* wm_shell = ash::WmShell::Get(); + const bool session_started = + wm_shell->GetSessionStateDelegate()->IsActiveUserSessionStarted(); + const ash::LoginStatus login_status = GetUserLoginStatus(); + const bool is_in_secondary_login_screen = + wm_shell->GetSessionStateDelegate()->IsInSecondaryLoginScreen(); + + if (!session_started || login_status == ash::LoginStatus::NOT_LOGGED_IN || + login_status == ash::LoginStatus::LOCKED || is_in_secondary_login_screen) + return ash::kShellWindowId_LockSystemModalContainer; + + return ash::kShellWindowId_SystemModalContainer; +} + //////////////////////////////////////////////////////////////////////////////// // ash::mojom::SystemTrayClient:
diff --git a/chrome/browser/ui/ash/system_tray_client.h b/chrome/browser/ui/ash/system_tray_client.h index 2628b493..b3923bd 100644 --- a/chrome/browser/ui/ash/system_tray_client.h +++ b/chrome/browser/ui/ash/system_tray_client.h
@@ -10,6 +10,10 @@ #include "chrome/browser/chromeos/system/system_clock_observer.h" #include "mojo/public/cpp/bindings/binding.h" +namespace ash { +enum class LoginStatus; +} + // Handles method calls delegated back to chrome from ash. Also notifies ash of // relevant state changes in chrome. // TODO: Consider renaming this to SystemTrayClientChromeOS. @@ -21,6 +25,13 @@ static SystemTrayClient* Get(); + // Returns the login state based on the user type, lock screen status, etc. + static ash::LoginStatus GetUserLoginStatus(); + + // Returns the container id for the parent window for new dialogs. The parent + // varies based on the current login and lock screen state. + static int GetDialogParentContainerId(); + // ash::mojom::SystemTrayClient: void ShowSettings() override; void ShowDateSettings() override;
diff --git a/chrome/browser/ui/ash/system_tray_delegate_chromeos.cc b/chrome/browser/ui/ash/system_tray_delegate_chromeos.cc index 3f11258..5e37efa 100644 --- a/chrome/browser/ui/ash/system_tray_delegate_chromeos.cc +++ b/chrome/browser/ui/ash/system_tray_delegate_chromeos.cc
@@ -16,7 +16,6 @@ #include "ash/common/session/session_state_delegate.h" #include "ash/common/session/session_state_observer.h" #include "ash/common/shell_delegate.h" -#include "ash/common/shell_window_ids.h" #include "ash/common/system/chromeos/bluetooth/bluetooth_observer.h" #include "ash/common/system/chromeos/power/power_status.h" #include "ash/common/system/chromeos/session/logout_button_observer.h" @@ -137,21 +136,6 @@ info->third_party = extension_ime_util::IsExtensionIME(ime.id()); } -gfx::NativeWindow GetNativeWindowByStatus(ash::LoginStatus login_status, - bool session_started) { - ash::WmShell* wm_shell = ash::WmShell::Get(); - const bool is_in_secondary_login_screen = - wm_shell->GetSessionStateDelegate()->IsInSecondaryLoginScreen(); - - int container_id = - (!session_started || login_status == ash::LoginStatus::NOT_LOGGED_IN || - login_status == ash::LoginStatus::LOCKED || is_in_secondary_login_screen) - ? ash::kShellWindowId_LockSystemModalContainer - : ash::kShellWindowId_SystemModalContainer; - return ash::Shell::GetContainer(ash::Shell::GetPrimaryRootWindow(), - container_id); -} - void BluetoothSetDiscoveringError() { LOG(ERROR) << "BluetoothSetDiscovering failed."; } @@ -182,7 +166,6 @@ SystemTrayDelegateChromeOS::SystemTrayDelegateChromeOS() : user_profile_(NULL), search_key_mapped_to_(input_method::kSearchKey), - screen_locked_(false), have_session_start_time_(false), have_session_length_limit_(false), should_run_bluetooth_discovery_(false), @@ -310,32 +293,7 @@ } ash::LoginStatus SystemTrayDelegateChromeOS::GetUserLoginStatus() const { - if (!LoginState::Get()->IsUserLoggedIn()) - return ash::LoginStatus::NOT_LOGGED_IN; - - if (screen_locked_) - return ash::LoginStatus::LOCKED; - - LoginState::LoggedInUserType user_type = - LoginState::Get()->GetLoggedInUserType(); - switch (user_type) { - case LoginState::LOGGED_IN_USER_NONE: - return ash::LoginStatus::NOT_LOGGED_IN; - case LoginState::LOGGED_IN_USER_REGULAR: - return ash::LoginStatus::USER; - case LoginState::LOGGED_IN_USER_OWNER: - return ash::LoginStatus::OWNER; - case LoginState::LOGGED_IN_USER_GUEST: - return ash::LoginStatus::GUEST; - case LoginState::LOGGED_IN_USER_PUBLIC_ACCOUNT: - return ash::LoginStatus::PUBLIC; - case LoginState::LOGGED_IN_USER_SUPERVISED: - return ash::LoginStatus::SUPERVISED; - case LoginState::LOGGED_IN_USER_KIOSK_APP: - return ash::LoginStatus::KIOSK_APP; - } - NOTREACHED(); - return ash::LoginStatus::NOT_LOGGED_IN; + return SystemTrayClient::GetUserLoginStatus(); } std::string SystemTrayDelegateChromeOS::GetEnterpriseDomain() const { @@ -891,20 +849,17 @@ // Overridden from SessionManagerClient::Observer. void SystemTrayDelegateChromeOS::ScreenIsLocked() { - screen_locked_ = true; ash::WmShell::Get()->UpdateAfterLoginStatusChange(GetUserLoginStatus()); } void SystemTrayDelegateChromeOS::ScreenIsUnlocked() { - screen_locked_ = false; ash::WmShell::Get()->UpdateAfterLoginStatusChange(GetUserLoginStatus()); } gfx::NativeWindow SystemTrayDelegateChromeOS::GetNativeWindow() const { - bool session_started = ash::WmShell::Get() - ->GetSessionStateDelegate() - ->IsActiveUserSessionStarted(); - return GetNativeWindowByStatus(GetUserLoginStatus(), session_started); + int container_id = SystemTrayClient::GetDialogParentContainerId(); + return ash::Shell::GetContainer(ash::Shell::GetPrimaryRootWindow(), + container_id); } // content::NotificationObserver implementation. @@ -1105,9 +1060,10 @@ // Overridden from SupervisedUserServiceObserver. void SystemTrayDelegateChromeOS::OnCustodianInfoChanged() { - FOR_EACH_OBSERVER( - ash::CustodianInfoTrayObserver, custodian_info_changed_observers_, - OnCustodianInfoChanged()); + for (ash::CustodianInfoTrayObserver& observer : + custodian_info_changed_observers_) { + observer.OnCustodianInfoChanged(); + } } void SystemTrayDelegateChromeOS::OnAccessibilityStatusChanged( @@ -1121,8 +1077,8 @@ void SystemTrayDelegateChromeOS::OnShutdownPolicyChanged( bool reboot_on_shutdown) { // Notify all observers. - FOR_EACH_OBSERVER(ash::ShutdownPolicyObserver, shutdown_policy_observers_, - OnShutdownPolicyChanged(reboot_on_shutdown)); + for (ash::ShutdownPolicyObserver& observer : shutdown_policy_observers_) + observer.OnShutdownPolicyChanged(reboot_on_shutdown); } void SystemTrayDelegateChromeOS::ImeMenuActivationChanged(bool is_active) {
diff --git a/chrome/browser/ui/ash/system_tray_delegate_chromeos.h b/chrome/browser/ui/ash/system_tray_delegate_chromeos.h index ba3d9956..6f2709f7 100644 --- a/chrome/browser/ui/ash/system_tray_delegate_chromeos.h +++ b/chrome/browser/ui/ash/system_tray_delegate_chromeos.h
@@ -261,7 +261,6 @@ std::unique_ptr<PrefChangeRegistrar> user_pref_registrar_; Profile* user_profile_; int search_key_mapped_to_; - bool screen_locked_; bool have_session_start_time_; base::TimeTicks session_start_time_; bool have_session_length_limit_;
diff --git a/chrome/browser/ui/bookmarks/recently_used_folders_combo_model.cc b/chrome/browser/ui/bookmarks/recently_used_folders_combo_model.cc index 1c36148..b490c58 100644 --- a/chrome/browser/ui/bookmarks/recently_used_folders_combo_model.cc +++ b/chrome/browser/ui/bookmarks/recently_used_folders_combo_model.cc
@@ -176,8 +176,8 @@ } } if (changed) { - FOR_EACH_OBSERVER(ui::ComboboxModelObserver, observers_, - OnComboboxModelChanged(this)); + for (ui::ComboboxModelObserver& observer : observers_) + observer.OnComboboxModelChanged(this); } } @@ -220,8 +220,8 @@ } } if (changed) { - FOR_EACH_OBSERVER(ui::ComboboxModelObserver, observers_, - OnComboboxModelChanged(this)); + for (ui::ComboboxModelObserver& observer : observers_) + observer.OnComboboxModelChanged(this); } }
diff --git a/chrome/browser/ui/browser.cc b/chrome/browser/ui/browser.cc index e6cc266c..4c02948 100644 --- a/chrome/browser/ui/browser.cc +++ b/chrome/browser/ui/browser.cc
@@ -1424,12 +1424,16 @@ hosted_app_controller_->UpdateLocationBarVisibility(true); } -void Browser::VisibleSSLStateChanged(const WebContents* source) { +void Browser::VisibleSSLStateChanged(WebContents* source) { // When the current tab's SSL state changes, we need to update the URL // bar to reflect the new state. DCHECK(source); if (tab_strip_model_->GetActiveWebContents() == source) UpdateToolbar(false); + + ChromeSecurityStateModelClient* security_model = + ChromeSecurityStateModelClient::FromWebContents(source); + security_model->VisibleSSLStateChanged(); } void Browser::AddNewContents(WebContents* source, @@ -1624,14 +1628,17 @@ content::Details<RetargetingDetails>(&details)); } -void Browser::RendererUnresponsive(WebContents* source) { +void Browser::RendererUnresponsive( + WebContents* source, + const content::WebContentsUnresponsiveState& unresponsive_state) { // Ignore hangs if a tab is blocked. int index = tab_strip_model_->GetIndexOfWebContents(source); DCHECK_NE(TabStripModel::kNoTab, index); if (tab_strip_model_->IsTabBlocked(index)) return; - TabDialogs::FromWebContents(source)->ShowHungRendererDialog(); + TabDialogs::FromWebContents(source)->ShowHungRendererDialog( + unresponsive_state); } void Browser::RendererResponsive(WebContents* source) {
diff --git a/chrome/browser/ui/browser.h b/chrome/browser/ui/browser.h index f3cba77..78ed2ab4 100644 --- a/chrome/browser/ui/browser.h +++ b/chrome/browser/ui/browser.h
@@ -578,7 +578,7 @@ const content::OpenURLParams& params) override; void NavigationStateChanged(content::WebContents* source, content::InvalidateTypes changed_flags) override; - void VisibleSSLStateChanged(const content::WebContents* source) override; + void VisibleSSLStateChanged(content::WebContents* source) override; void AddNewContents(content::WebContents* source, content::WebContents* new_contents, WindowOpenDisposition disposition, @@ -625,7 +625,9 @@ const std::string& frame_name, const GURL& target_url, content::WebContents* new_contents) override; - void RendererUnresponsive(content::WebContents* source) override; + void RendererUnresponsive( + content::WebContents* source, + const content::WebContentsUnresponsiveState& unresponsive_state) override; void RendererResponsive(content::WebContents* source) override; void DidNavigateMainFramePostCommit( content::WebContents* web_contents) override;
diff --git a/chrome/browser/ui/browser_list.cc b/chrome/browser/ui/browser_list.cc index 6222fbee..74260b4 100644 --- a/chrome/browser/ui/browser_list.cc +++ b/chrome/browser/ui/browser_list.cc
@@ -61,8 +61,8 @@ content::Source<Browser>(browser), content::NotificationService::NoDetails()); - FOR_EACH_OBSERVER(chrome::BrowserListObserver, observers_.Get(), - OnBrowserAdded(browser)); + for (chrome::BrowserListObserver& observer : observers_.Get()) + observer.OnBrowserAdded(browser); } // static @@ -78,8 +78,8 @@ RemoveBrowserFrom(browser, &browser_list->browsers_); - FOR_EACH_OBSERVER(chrome::BrowserListObserver, observers_.Get(), - OnBrowserRemoved(browser)); + for (chrome::BrowserListObserver& observer : observers_.Get()) + observer.OnBrowserRemoved(browser); browser->UnregisterKeepAlive(); @@ -216,8 +216,8 @@ Browser* new_last_active = instance->GetLastActive(); if (old_last_active != new_last_active) { - FOR_EACH_OBSERVER(chrome::BrowserListObserver, observers_.Get(), - OnBrowserSetLastActive(new_last_active)); + for (chrome::BrowserListObserver& observer : observers_.Get()) + observer.OnBrowserSetLastActive(new_last_active); } } @@ -228,14 +228,14 @@ RemoveBrowserFrom(browser, &GetInstance()->last_active_browsers_); GetInstance()->last_active_browsers_.push_back(browser); - FOR_EACH_OBSERVER(chrome::BrowserListObserver, observers_.Get(), - OnBrowserSetLastActive(browser)); + for (chrome::BrowserListObserver& observer : observers_.Get()) + observer.OnBrowserSetLastActive(browser); } // static void BrowserList::NotifyBrowserNoLongerActive(Browser* browser) { - FOR_EACH_OBSERVER(chrome::BrowserListObserver, observers_.Get(), - OnBrowserNoLongerActive(browser)); + for (chrome::BrowserListObserver& observer : observers_.Get()) + observer.OnBrowserNoLongerActive(browser); } // static
diff --git a/chrome/browser/ui/cocoa/extensions/extension_popup_controller.mm b/chrome/browser/ui/cocoa/extensions/extension_popup_controller.mm index 08c83c2e6..3cc5352f 100644 --- a/chrome/browser/ui/cocoa/extensions/extension_popup_controller.mm +++ b/chrome/browser/ui/cocoa/extensions/extension_popup_controller.mm
@@ -20,6 +20,7 @@ #include "components/web_modal/web_contents_modal_dialog_manager.h" #include "content/public/browser/browser_context.h" #include "content/public/browser/devtools_agent_host.h" +#include "content/public/browser/devtools_agent_host_observer.h" #include "content/public/browser/notification_details.h" #include "content/public/browser/notification_source.h" #include "extensions/browser/notification_types.h" @@ -90,38 +91,39 @@ ExtensionPopupController* controller_; // Weak; owns this. }; -class ExtensionPopupNotificationBridge : public content::NotificationObserver { +class ExtensionPopupNotificationBridge : + public content::NotificationObserver, + public content::DevToolsAgentHostObserver { public: ExtensionPopupNotificationBridge(ExtensionPopupController* controller, ExtensionViewHost* view_host) : controller_(controller), view_host_(view_host), - web_contents_(view_host_->host_contents()), - devtools_callback_(base::Bind( - &ExtensionPopupNotificationBridge::OnDevToolsStateChanged, - base::Unretained(this))) { - content::DevToolsAgentHost::AddAgentStateCallback(devtools_callback_); + web_contents_(view_host_->host_contents()) { + content::DevToolsAgentHost::AddObserver(this); } ~ExtensionPopupNotificationBridge() override { - content::DevToolsAgentHost::RemoveAgentStateCallback(devtools_callback_); + content::DevToolsAgentHost::RemoveObserver(this); } - void OnDevToolsStateChanged(content::DevToolsAgentHost* agent_host, - bool attached) { + void DevToolsAgentHostAttached( + content::DevToolsAgentHost* agent_host) override { if (agent_host->GetWebContents() != web_contents_) return; + // Set the flag on the controller so the popup is not hidden when + // the dev tools get focus. + [controller_ setBeingInspected:YES]; + } - if (attached) { - // Set the flag on the controller so the popup is not hidden when - // the dev tools get focus. - [controller_ setBeingInspected:YES]; - } else { - // Allow the devtools to finish detaching before we close the popup. - [controller_ performSelector:@selector(close) - withObject:nil - afterDelay:0.0]; - } + void DevToolsAgentHostDetached( + content::DevToolsAgentHost* agent_host) override { + if (agent_host->GetWebContents() != web_contents_) + return; + // Allow the devtools to finish detaching before we close the popup. + [controller_ performSelector:@selector(close) + withObject:nil + afterDelay:0.0]; } void Observe(int type, @@ -153,7 +155,6 @@ // know what it is for notifications, but our ExtensionViewHost may not be // valid. WebContents* web_contents_; - base::Callback<void(content::DevToolsAgentHost*, bool)> devtools_callback_; DISALLOW_COPY_AND_ASSIGN(ExtensionPopupNotificationBridge); };
diff --git a/chrome/browser/ui/cocoa/profiles/user_manager_mac.h b/chrome/browser/ui/cocoa/profiles/user_manager_mac.h index e6b1168..abf3553f 100644 --- a/chrome/browser/ui/cocoa/profiles/user_manager_mac.h +++ b/chrome/browser/ui/cocoa/profiles/user_manager_mac.h
@@ -54,6 +54,11 @@ signin_metrics::Reason reason); void CloseReauthDialog(); + void DisplayErrorMessage(); + + void SetSigninProfilePath(const base::FilePath& profile_path); + base::FilePath GetSigninProfilePath(); + private: explicit UserManagerMac(Profile* profile); virtual ~UserManagerMac(); @@ -65,6 +70,8 @@ base::Time user_manager_started_showing_; + base::FilePath signin_profile_path_; + DISALLOW_COPY_AND_ASSIGN(UserManagerMac); };
diff --git a/chrome/browser/ui/cocoa/profiles/user_manager_mac.mm b/chrome/browser/ui/cocoa/profiles/user_manager_mac.mm index 89b70c6..fb60959 100644 --- a/chrome/browser/ui/cocoa/profiles/user_manager_mac.mm +++ b/chrome/browser/ui/cocoa/profiles/user_manager_mac.mm
@@ -21,6 +21,7 @@ #import "chrome/browser/ui/cocoa/constrained_window/constrained_window_custom_window.h" #include "chrome/browser/ui/cocoa/constrained_window/constrained_window_mac.h" #include "chrome/browser/ui/user_manager.h" +#include "chrome/common/url_constants.h" #include "chrome/grit/chromium_strings.h" #include "components/signin/core/common/profile_management_switches.h" #include "components/web_modal/web_contents_modal_dialog_host.h" @@ -47,8 +48,6 @@ } } -} // namespace - // An open User Manager window. There can only be one open at a time. This // is reset to NULL when the window is closed. UserManagerMac* instance_ = nullptr; // Weak. @@ -165,12 +164,14 @@ CloseReauthDialog(); } -private: + private: std::unique_ptr<UserManagerWebContentsDelegate> hotKeysWebContentsDelegate_; DISALLOW_COPY_AND_ASSIGN(ReauthDialogDelegate); }; +} // namespace + // WindowController for the reauth dialog. @interface ReauthDialogWindowController : NSWindowController <NSWindowDelegate> { @@ -186,6 +187,7 @@ email:(std::string)email reason:(signin_metrics::Reason)reason webContents:(content::WebContents*)webContents; +- (void)showURL:(const GURL&)url; - (void)close; @end @@ -233,13 +235,17 @@ return self; } +- (void)showURL:(const GURL&)url { + reauthWebContents_->GetController().LoadURL(url, content::Referrer(), + ui::PAGE_TRANSITION_AUTO_TOPLEVEL, + std::string()); +} + - (void)show { GURL url = signin::GetReauthURLWithEmail( signin_metrics::AccessPoint::ACCESS_POINT_USER_MANAGER, reason_, emailAddress_); - reauthWebContents_->GetController().LoadURL(url, content::Referrer(), - ui::PAGE_TRANSITION_AUTO_TOPLEVEL, - std::string()); + [self showURL:url]; } - (void)closeButtonClicked:(NSButton*)button { @@ -278,6 +284,7 @@ - (void)showReauthDialogWithProfile:(Profile*)profile email:(std::string)email reason:(signin_metrics::Reason)reason; +- (void)displayErrorMessage; - (void)closeReauthDialog; @end @@ -393,6 +400,10 @@ webContents:webContents_.get()]); } +- (void)displayErrorMessage { + [reauth_window_controller_ showURL:GURL(chrome::kChromeUISigninErrorURL)]; +} + - (void)closeReauthDialog { [reauth_window_controller_ close]; } @@ -487,6 +498,27 @@ user_manager_shown_callbacks_for_testing_->push_back(callback); } +// static +void UserManager::ShowSigninDialog(content::BrowserContext* browser_context, + const base::FilePath& profile_path) { + if (!IsShowing()) + return; + instance_->SetSigninProfilePath(profile_path); + ShowReauthDialog(browser_context, std::string(), + signin_metrics::Reason::REASON_SIGNIN_PRIMARY_ACCOUNT); +} + +// static +void UserManager::DisplayErrorMessage() { + DCHECK(instance_); + instance_->DisplayErrorMessage(); +} + +// static +base::FilePath UserManager::GetSigninProfilePath() { + return instance_->GetSigninProfilePath(); +} + void UserManagerMac::ShowReauthDialog(content::BrowserContext* browser_context, const std::string& email, signin_metrics::Reason reason) { @@ -533,3 +565,15 @@ instance_ = NULL; delete this; } + +void UserManagerMac::DisplayErrorMessage() { + [window_controller_ displayErrorMessage]; +} + +void UserManagerMac::SetSigninProfilePath(const base::FilePath& profile_path) { + signin_profile_path_ = profile_path; +} + +base::FilePath UserManagerMac::GetSigninProfilePath() { + return signin_profile_path_; +}
diff --git a/chrome/browser/ui/cocoa/tab_dialogs_cocoa.h b/chrome/browser/ui/cocoa/tab_dialogs_cocoa.h index 820842d..2d08f81 100644 --- a/chrome/browser/ui/cocoa/tab_dialogs_cocoa.h +++ b/chrome/browser/ui/cocoa/tab_dialogs_cocoa.h
@@ -17,7 +17,8 @@ // TabDialogs: gfx::NativeView GetDialogParentView() const override; void ShowCollectedCookies() override; - void ShowHungRendererDialog() override; + void ShowHungRendererDialog( + const content::WebContentsUnresponsiveState& unresponsive_state) override; void HideHungRendererDialog() override; void ShowProfileSigninConfirmation( Browser* browser,
diff --git a/chrome/browser/ui/cocoa/tab_dialogs_cocoa.mm b/chrome/browser/ui/cocoa/tab_dialogs_cocoa.mm index 6c54c04..e70c579 100644 --- a/chrome/browser/ui/cocoa/tab_dialogs_cocoa.mm +++ b/chrome/browser/ui/cocoa/tab_dialogs_cocoa.mm
@@ -43,7 +43,8 @@ new CollectedCookiesMac(web_contents_); } -void TabDialogsCocoa::ShowHungRendererDialog() { +void TabDialogsCocoa::ShowHungRendererDialog( + const content::WebContentsUnresponsiveState& unresponsive_state) { [HungRendererController showForWebContents:web_contents_]; }
diff --git a/chrome/browser/ui/ime/ime_window.cc b/chrome/browser/ui/ime/ime_window.cc index c23aa9b..fc0148bc 100644 --- a/chrome/browser/ui/ime/ime_window.cc +++ b/chrome/browser/ui/ime/ime_window.cc
@@ -132,7 +132,8 @@ } void ImeWindow::OnWindowDestroyed() { - FOR_EACH_OBSERVER(ImeWindowObserver, observers_, OnWindowDestroyed(this)); + for (ImeWindowObserver& observer : observers_) + observer.OnWindowDestroyed(this); native_window_ = nullptr; delete this; }
diff --git a/chrome/browser/ui/libgtk2ui/gtk2_ui.cc b/chrome/browser/ui/libgtk2ui/gtk2_ui.cc index 1286923..415b99a 100644 --- a/chrome/browser/ui/libgtk2ui/gtk2_ui.cc +++ b/chrome/browser/ui/libgtk2ui/gtk2_ui.cc
@@ -717,9 +717,8 @@ leading_buttons_ = leading_buttons; trailing_buttons_ = trailing_buttons; - FOR_EACH_OBSERVER(views::WindowButtonOrderObserver, observer_list_, - OnWindowButtonOrderingChange(leading_buttons_, - trailing_buttons_)); + for (views::WindowButtonOrderObserver& observer : observer_list_) + observer.OnWindowButtonOrderingChange(leading_buttons_, trailing_buttons_); } void Gtk2UI::SetNonClientMiddleClickAction(NonClientMiddleClickAction action) {
diff --git a/chrome/browser/ui/search/search_model.cc b/chrome/browser/ui/search/search_model.cc index 57b83bd..73c08b2 100644 --- a/chrome/browser/ui/search/search_model.cc +++ b/chrome/browser/ui/search/search_model.cc
@@ -34,8 +34,8 @@ const State old_state = state_; state_ = new_state; - FOR_EACH_OBSERVER(SearchModelObserver, observers_, - ModelChanged(old_state, state_)); + for (SearchModelObserver& observer : observers_) + observer.ModelChanged(old_state, state_); } void SearchModel::SetMode(const SearchMode& new_mode) { @@ -49,8 +49,8 @@ const State old_state = state_; state_.mode = new_mode; - FOR_EACH_OBSERVER(SearchModelObserver, observers_, - ModelChanged(old_state, state_)); + for (SearchModelObserver& observer : observers_) + observer.ModelChanged(old_state, state_); } void SearchModel::SetInstantSupportState(InstantSupportState instant_support) { @@ -63,8 +63,8 @@ const State old_state = state_; state_.instant_support = instant_support; - FOR_EACH_OBSERVER(SearchModelObserver, observers_, - ModelChanged(old_state, state_)); + for (SearchModelObserver& observer : observers_) + observer.ModelChanged(old_state, state_); } void SearchModel::AddObserver(SearchModelObserver* observer) {
diff --git a/chrome/browser/ui/settings_window_manager.cc b/chrome/browser/ui/settings_window_manager.cc index 0567638..d84d7280 100644 --- a/chrome/browser/ui/settings_window_manager.cc +++ b/chrome/browser/ui/settings_window_manager.cc
@@ -69,8 +69,8 @@ settings_session_map_[profile] = params.browser->session_id().id(); DCHECK(params.browser->is_trusted_source()); - FOR_EACH_OBSERVER(SettingsWindowManagerObserver, - observers_, OnNewSettingsWindow(params.browser)); + for (SettingsWindowManagerObserver& observer : observers_) + observer.OnNewSettingsWindow(params.browser); } Browser* SettingsWindowManager::FindBrowserForProfile(Profile* profile) {
diff --git a/chrome/browser/ui/tab_dialogs.h b/chrome/browser/ui/tab_dialogs.h index ef0f8a9..ca3fec18b 100644 --- a/chrome/browser/ui/tab_dialogs.h +++ b/chrome/browser/ui/tab_dialogs.h
@@ -19,6 +19,7 @@ namespace content { class WebContents; +struct WebContentsUnresponsiveState; } namespace gfx { @@ -49,7 +50,8 @@ virtual void ShowCollectedCookies() = 0; // Shows or hides the hung renderer dialog. - virtual void ShowHungRendererDialog() = 0; + virtual void ShowHungRendererDialog( + const content::WebContentsUnresponsiveState& unresponsive_state) = 0; virtual void HideHungRendererDialog() = 0; // Shows a dialog asking the user to confirm linking to a managed account.
diff --git a/chrome/browser/ui/toolbar/toolbar_actions_bar.cc b/chrome/browser/ui/toolbar/toolbar_actions_bar.cc index 961e8ae..8d06aa09 100644 --- a/chrome/browser/ui/toolbar/toolbar_actions_bar.cc +++ b/chrome/browser/ui/toolbar/toolbar_actions_bar.cc
@@ -149,8 +149,8 @@ // the order of deletion between the views and the ToolbarActionsBar. DCHECK(toolbar_actions_.empty()) << "Must call DeleteActions() before destruction."; - FOR_EACH_OBSERVER(ToolbarActionsBarObserver, observers_, - OnToolbarActionsBarDestroyed()); + for (ToolbarActionsBarObserver& observer : observers_) + observer.OnToolbarActionsBarDestroyed(); } // static @@ -453,8 +453,8 @@ DCHECK(is_drag_in_progress_); is_drag_in_progress_ = false; - FOR_EACH_OBSERVER(ToolbarActionsBarObserver, - observers_, OnToolbarActionDragDone()); + for (ToolbarActionsBarObserver& observer : observers_) + observer.OnToolbarActionDragDone(); } void ToolbarActionsBar::OnDragDrop(int dragged_index, @@ -481,8 +481,8 @@ void ToolbarActionsBar::OnAnimationEnded() { // Notify the observers now, since showing a bubble or popup could potentially // cause another animation to start. - FOR_EACH_OBSERVER(ToolbarActionsBarObserver, observers_, - OnToolbarActionsBarAnimationEnded()); + for (ToolbarActionsBarObserver& observer : observers_) + observer.OnToolbarActionsBarAnimationEnded(); // Check if we were waiting for animation to complete to either show a // message bubble, or to show a popup. @@ -735,8 +735,8 @@ delegate_->Redraw(false); } - FOR_EACH_OBSERVER(ToolbarActionsBarObserver, - observers_, OnToolbarActionsBarDidStartResize()); + for (ToolbarActionsBarObserver& observer : observers_) + observer.OnToolbarActionsBarDidStartResize(); } void ToolbarActionsBar::OnToolbarHighlightModeChanged(bool is_highlighting) {
diff --git a/chrome/browser/ui/toolbar/toolbar_actions_model.cc b/chrome/browser/ui/toolbar/toolbar_actions_model.cc index 78fe600..3d586be3 100644 --- a/chrome/browser/ui/toolbar/toolbar_actions_model.cc +++ b/chrome/browser/ui/toolbar/toolbar_actions_model.cc
@@ -129,7 +129,8 @@ last_known_positions_.push_back(id); } - FOR_EACH_OBSERVER(Observer, observers_, OnToolbarActionMoved(id, index)); + for (Observer& observer : observers_) + observer.OnToolbarActionMoved(id, index); UpdatePrefs(); } @@ -145,7 +146,8 @@ visible_icon_count_); } - FOR_EACH_OBSERVER(Observer, observers_, OnToolbarVisibleCountChanged()); + for (Observer& observer : observers_) + observer.OnToolbarVisibleCountChanged(); } void ToolbarActionsModel::OnExtensionActionUpdated( @@ -155,8 +157,8 @@ // Notify observers if the extension exists and is in the model. if (HasItem( ToolbarItem(extension_action->extension_id(), EXTENSION_ACTION))) { - FOR_EACH_OBSERVER(Observer, observers_, - OnToolbarActionUpdated(extension_action->extension_id())); + for (Observer& observer : observers_) + observer.OnToolbarActionUpdated(extension_action->extension_id()); } } @@ -274,7 +276,8 @@ extension_action_observer_.Add(extension_action_api_); actions_initialized_ = true; - FOR_EACH_OBSERVER(Observer, observers_, OnToolbarModelInitialized()); + for (Observer& observer : observers_) + observer.OnToolbarModelInitialized(); if (use_redesign_) { // Handle component action migrations. We must make sure that observers are @@ -372,8 +375,8 @@ // to the full list (|toolbar_items_|, there won't be another *visible* // browser action, which was what the observers care about. if (!is_highlighting()) { - FOR_EACH_OBSERVER(Observer, observers_, - OnToolbarActionAdded(item, new_index)); + for (Observer& observer : observers_) + observer.OnToolbarActionAdded(item, new_index); int visible_count_delta = 0; if (is_new_extension && !all_icons_visible()) { @@ -423,13 +426,15 @@ pos = std::find(highlighted_items_.begin(), highlighted_items_.end(), item); if (pos != highlighted_items_.end()) { highlighted_items_.erase(pos); - FOR_EACH_OBSERVER(Observer, observers_, OnToolbarActionRemoved(item.id)); + for (Observer& observer : observers_) + observer.OnToolbarActionRemoved(item.id); // If the highlighted list is now empty, we stop highlighting. if (highlighted_items_.empty()) StopHighlighting(); } } else { - FOR_EACH_OBSERVER(Observer, observers_, OnToolbarActionRemoved(item.id)); + for (Observer& observer : observers_) + observer.OnToolbarActionRemoved(item.id); } UpdatePrefs(); @@ -766,10 +771,12 @@ std::rotate(desired_pos, current_pos, current_pos + 1); // Notify the observers to keep them up to date, unless we're highlighting // (in which case we're deliberately only showing a subset of actions). - if (!is_highlighting()) - FOR_EACH_OBSERVER( - Observer, observers_, - OnToolbarActionMoved(id, desired_pos - toolbar_items_.begin())); + if (!is_highlighting()) { + for (Observer& observer : observers_) { + observer.OnToolbarActionMoved(id, + desired_pos - toolbar_items_.begin()); + } + } } ++desired_pos; } @@ -800,8 +807,8 @@ // It's important that is_highlighting_ is changed immediately before the // observers are notified since it changes the result of toolbar_items(). highlight_type_ = highlight_type; - FOR_EACH_OBSERVER(Observer, observers_, - OnToolbarHighlightModeChanged(true)); + for (Observer& observer : observers_) + observer.OnToolbarHighlightModeChanged(true); // We set the visible icon count after the highlight mode change because // the UI actions are created/destroyed during highlight, and doing that @@ -824,8 +831,8 @@ // It's important that is_highlighting_ is changed immediately before the // observers are notified since it changes the result of toolbar_items(). highlight_type_ = HIGHLIGHT_NONE; - FOR_EACH_OBSERVER(Observer, observers_, - OnToolbarHighlightModeChanged(false)); + for (Observer& observer : observers_) + observer.OnToolbarHighlightModeChanged(false); // For the same reason, we don't clear highlighted_items_ until after the // mode changed.
diff --git a/chrome/browser/ui/views/bookmarks/bookmark_bar_view.cc b/chrome/browser/ui/views/bookmarks/bookmark_bar_view.cc index 19322017..9dfe5a5 100644 --- a/chrome/browser/ui/views/bookmarks/bookmark_bar_view.cc +++ b/chrome/browser/ui/views/bookmarks/bookmark_bar_view.cc
@@ -1191,8 +1191,8 @@ AccessiblePaneView::VisibilityChanged(starting_from, is_visible); if (starting_from == this) { - FOR_EACH_OBSERVER(BookmarkBarViewObserver, observers_, - OnBookmarkBarVisibilityChanged()); + for (BookmarkBarViewObserver& observer : observers_) + observer.OnBookmarkBarVisibilityChanged(); } }
diff --git a/chrome/browser/ui/views/extensions/extension_popup.cc b/chrome/browser/ui/views/extensions/extension_popup.cc index 474b270..faf2c7c 100644 --- a/chrome/browser/ui/views/extensions/extension_popup.cc +++ b/chrome/browser/ui/views/extensions/extension_popup.cc
@@ -59,8 +59,6 @@ ShowAction show_action) : BubbleDialogDelegateView(anchor_view, arrow), host_(host), - devtools_callback_(base::Bind( - &ExtensionPopup::OnDevToolsStateChanged, base::Unretained(this))), widget_initialized_(false) { inspect_with_devtools_ = show_action == SHOW_AND_INSPECT; set_margins(gfx::Insets(kBubbleMargin)); @@ -75,7 +73,7 @@ this, extensions::NOTIFICATION_EXTENSION_HOST_VIEW_SHOULD_CLOSE, content::Source<content::BrowserContext>(host->browser_context())); - content::DevToolsAgentHost::AddAgentStateCallback(devtools_callback_); + content::DevToolsAgentHost::AddObserver(this); GetExtensionView(host)->GetBrowser()->tab_strip_model()->AddObserver(this); @@ -93,7 +91,7 @@ } ExtensionPopup::~ExtensionPopup() { - content::DevToolsAgentHost::RemoveAgentStateCallback(devtools_callback_); + content::DevToolsAgentHost::RemoveObserver(this); GetExtensionView( host_.get())->GetBrowser()->tab_strip_model()->RemoveObserver(this); @@ -123,22 +121,23 @@ } } -void ExtensionPopup::OnDevToolsStateChanged( - content::DevToolsAgentHost* agent_host, - bool attached) { +void ExtensionPopup::DevToolsAgentHostAttached( + content::DevToolsAgentHost* agent_host) { // First check that the devtools are being opened on this popup. if (host()->host_contents() != agent_host->GetWebContents()) return; + // Set inspect_with_devtools_ so the popup will be kept open while + // the devtools are open. + inspect_with_devtools_ = true; +} - if (attached) { - // Set inspect_with_devtools_ so the popup will be kept open while - // the devtools are open. - inspect_with_devtools_ = true; - } else { - // Widget::Close posts a task, which should give the devtools window a - // chance to finish detaching from the inspected RenderViewHost. - GetWidget()->Close(); - } +void ExtensionPopup::DevToolsAgentHostDetached( + content::DevToolsAgentHost* agent_host) { + if (host()->host_contents() != agent_host->GetWebContents()) + return; + // Widget::Close posts a task, which should give the devtools window a + // chance to finish detaching from the inspected RenderViewHost. + GetWidget()->Close(); } void ExtensionPopup::OnExtensionSizeChanged(ExtensionViewViews* view) {
diff --git a/chrome/browser/ui/views/extensions/extension_popup.h b/chrome/browser/ui/views/extensions/extension_popup.h index af79bdf78..2692d91 100644 --- a/chrome/browser/ui/views/extensions/extension_popup.h +++ b/chrome/browser/ui/views/extensions/extension_popup.h
@@ -10,6 +10,7 @@ #include "base/macros.h" #include "chrome/browser/ui/tabs/tab_strip_model_observer.h" #include "chrome/browser/ui/views/extensions/extension_view_views.h" +#include "content/public/browser/devtools_agent_host_observer.h" #include "content/public/browser/notification_observer.h" #include "content/public/browser/notification_registrar.h" #include "ui/views/bubble/bubble_dialog_delegate.h" @@ -33,7 +34,8 @@ class ExtensionPopup : public views::BubbleDialogDelegateView, public ExtensionViewViews::Container, public content::NotificationObserver, - public TabStripModelObserver { + public TabStripModelObserver, + public content::DevToolsAgentHostObserver { public: enum ShowAction { SHOW, @@ -107,7 +109,11 @@ // Show the bubble, focus on its content, and register listeners. void ShowBubble(); - void OnDevToolsStateChanged(content::DevToolsAgentHost*, bool attached); + // content::DevToolsAgentHostObserver overrides. + void DevToolsAgentHostAttached( + content::DevToolsAgentHost* agent_host) override; + void DevToolsAgentHostDetached( + content::DevToolsAgentHost* agent_host) override; // The contained host for the view. std::unique_ptr<extensions::ExtensionViewHost> host_; @@ -118,8 +124,6 @@ content::NotificationRegistrar registrar_; - base::Callback<void(content::DevToolsAgentHost*, bool)> devtools_callback_; - bool widget_initialized_; DISALLOW_COPY_AND_ASSIGN(ExtensionPopup);
diff --git a/chrome/browser/ui/views/frame/browser_view_layout.cc b/chrome/browser/ui/views/frame/browser_view_layout.cc index f283cc6..18c70c1 100644 --- a/chrome/browser/ui/views/frame/browser_view_layout.cc +++ b/chrome/browser/ui/views/frame/browser_view_layout.cc
@@ -68,15 +68,13 @@ } ~WebContentsModalDialogHostViews() override { - FOR_EACH_OBSERVER(ModalDialogHostObserver, - observer_list_, - OnHostDestroying()); + for (ModalDialogHostObserver& observer : observer_list_) + observer.OnHostDestroying(); } void NotifyPositionRequiresUpdate() { - FOR_EACH_OBSERVER(ModalDialogHostObserver, - observer_list_, - OnPositionRequiresUpdate()); + for (ModalDialogHostObserver& observer : observer_list_) + observer.OnPositionRequiresUpdate(); } gfx::Point GetDialogPosition(const gfx::Size& size) override {
diff --git a/chrome/browser/ui/views/frame/immersive_mode_controller.cc b/chrome/browser/ui/views/frame/immersive_mode_controller.cc index 56afc22..533a68e6 100644 --- a/chrome/browser/ui/views/frame/immersive_mode_controller.cc +++ b/chrome/browser/ui/views/frame/immersive_mode_controller.cc
@@ -7,7 +7,8 @@ ImmersiveModeController::ImmersiveModeController(Type type) : type_(type) {} ImmersiveModeController::~ImmersiveModeController() { - FOR_EACH_OBSERVER(Observer, observers_, OnImmersiveModeControllerDestroyed()); + for (Observer& observer : observers_) + observer.OnImmersiveModeControllerDestroyed(); } void ImmersiveModeController::AddObserver(Observer* observer) {
diff --git a/chrome/browser/ui/views/frame/immersive_mode_controller_ash.cc b/chrome/browser/ui/views/frame/immersive_mode_controller_ash.cc index 06f10585..07932f9c 100644 --- a/chrome/browser/ui/views/frame/immersive_mode_controller_ash.cc +++ b/chrome/browser/ui/views/frame/immersive_mode_controller_ash.cc
@@ -272,7 +272,8 @@ UpdateTabIndicators(); LayoutBrowserRootView(); CreateMashRevealWidget(); - FOR_EACH_OBSERVER(Observer, observers_, OnImmersiveRevealStarted()); + for (Observer& observer : observers_) + observer.OnImmersiveRevealStarted(); } void ImmersiveModeControllerAsh::OnImmersiveRevealEnded() {
diff --git a/chrome/browser/ui/views/hung_renderer_view.cc b/chrome/browser/ui/views/hung_renderer_view.cc index 2bc10536..b512d74 100644 --- a/chrome/browser/ui/views/hung_renderer_view.cc +++ b/chrome/browser/ui/views/hung_renderer_view.cc
@@ -5,6 +5,7 @@ #include "chrome/browser/ui/views/hung_renderer_view.h" #include "base/i18n/rtl.h" +#include "base/strings/string_number_conversions.h" #include "base/strings/utf_string_conversions.h" #include "build/build_config.h" #include "chrome/browser/platform_util.h" @@ -13,6 +14,7 @@ #include "chrome/browser/ui/tab_contents/core_tab_helper.h" #include "chrome/browser/ui/tab_contents/tab_contents_iterator.h" #include "chrome/common/chrome_constants.h" +#include "chrome/common/crash_keys.h" #include "chrome/common/logging_chrome.h" #include "chrome/grit/generated_resources.h" #include "chrome/grit/theme_resources.h" @@ -48,6 +50,7 @@ #endif using content::WebContents; +using content::WebContentsUnresponsiveState; HungRendererDialogView* HungRendererDialogView::g_instance_ = NULL; @@ -193,7 +196,9 @@ } // static -void HungRendererDialogView::Show(WebContents* contents) { +void HungRendererDialogView::Show( + WebContents* contents, + const WebContentsUnresponsiveState& unresponsive_state) { if (logging::DialogsAreSuppressed()) return; @@ -207,7 +212,7 @@ return; #endif HungRendererDialogView* view = HungRendererDialogView::Create(window); - view->ShowForWebContents(contents); + view->ShowForWebContents(contents, unresponsive_state); } // static @@ -236,7 +241,9 @@ hung_pages_table_->SetModel(NULL); } -void HungRendererDialogView::ShowForWebContents(WebContents* contents) { +void HungRendererDialogView::ShowForWebContents( + WebContents* contents, + const content::WebContentsUnresponsiveState& unresponsive_state) { DCHECK(contents && GetWidget()); // Don't show the warning unless the foreground window is the frame, or this @@ -285,6 +292,7 @@ hung_pages_table_model_->RowCount())); Layout(); + unresponsive_state_ = unresponsive_state; // Make Widget ask for the window title again. GetWidget()->UpdateWindowTitle(); @@ -373,6 +381,19 @@ #if defined(OS_WIN) base::StringPairs crash_keys; + crash_keys.push_back(std::make_pair( + crash_keys::kHungRendererOutstandingAckCount, + base::IntToString(unresponsive_state_.outstanding_ack_count))); + crash_keys.push_back(std::make_pair( + crash_keys::kHungRendererOutstandingEventType, + base::IntToString(unresponsive_state_.outstanding_event_type))); + crash_keys.push_back( + std::make_pair(crash_keys::kHungRendererLastEventType, + base::IntToString(unresponsive_state_.last_event_type))); + crash_keys.push_back( + std::make_pair(crash_keys::kHungRendererReason, + base::IntToString(unresponsive_state_.reason))); + // Try to generate a crash report for the hung process. CrashDumpAndTerminateHungChildProcess(rph->GetHandle(), crash_keys); #else
diff --git a/chrome/browser/ui/views/hung_renderer_view.h b/chrome/browser/ui/views/hung_renderer_view.h index 70c1d77..c301e52 100644 --- a/chrome/browser/ui/views/hung_renderer_view.h +++ b/chrome/browser/ui/views/hung_renderer_view.h
@@ -8,7 +8,9 @@ #include "base/macros.h" #include "base/memory/scoped_vector.h" #include "components/favicon/content/content_favicon_driver.h" +#include "content/public/browser/web_contents_delegate.h" #include "content/public/browser/web_contents_observer.h" +#include "content/public/browser/web_contents_unresponsive_state.h" #include "ui/base/models/table_model.h" #include "ui/views/controls/button/button.h" #include "ui/views/controls/table/table_grouper.h" @@ -107,13 +109,17 @@ static HungRendererDialogView* GetInstance(); // Shows or hides the hung renderer dialog for the given WebContents. - static void Show(content::WebContents* contents); + static void Show( + content::WebContents* contents, + const content::WebContentsUnresponsiveState& unresponsive_state); static void Hide(content::WebContents* contents); // Returns true if the frame is in the foreground. static bool IsFrameActive(content::WebContents* contents); - virtual void ShowForWebContents(content::WebContents* contents); + virtual void ShowForWebContents( + content::WebContents* contents, + const content::WebContentsUnresponsiveState& unresponsive_state); virtual void EndForWebContents(content::WebContents* contents); // views::DialogDelegateView overrides: @@ -168,6 +174,10 @@ bool kill_button_clicked_; + // A copy of the unresponsive state which ShowForWebContents was + // called with. + content::WebContentsUnresponsiveState unresponsive_state_; + DISALLOW_COPY_AND_ASSIGN(HungRendererDialogView); };
diff --git a/chrome/browser/ui/views/omnibox/omnibox_popup_contents_view.cc b/chrome/browser/ui/views/omnibox/omnibox_popup_contents_view.cc index 26297c7..0d653276 100644 --- a/chrome/browser/ui/views/omnibox/omnibox_popup_contents_view.cc +++ b/chrome/browser/ui/views/omnibox/omnibox_popup_contents_view.cc
@@ -477,8 +477,7 @@ OmniboxResultView* OmniboxPopupContentsView::CreateResultView( int model_index, const gfx::FontList& font_list) { - return new OmniboxResultView(this, model_index, location_bar_view_, - font_list); + return new OmniboxResultView(this, model_index, font_list); } ////////////////////////////////////////////////////////////////////////////////
diff --git a/chrome/browser/ui/views/omnibox/omnibox_result_view.cc b/chrome/browser/ui/views/omnibox/omnibox_result_view.cc index 6a5373d..6b9d6a9 100644 --- a/chrome/browser/ui/views/omnibox/omnibox_result_view.cc +++ b/chrome/browser/ui/views/omnibox/omnibox_result_view.cc
@@ -22,17 +22,14 @@ #include "base/strings/string_util.h" #include "chrome/browser/ui/layout_constants.h" #include "chrome/browser/ui/views/location_bar/background_with_1_px_border.h" -#include "chrome/browser/ui/views/location_bar/icon_label_bubble_view.h" #include "chrome/browser/ui/views/location_bar/location_bar_view.h" #include "chrome/browser/ui/views/omnibox/omnibox_popup_contents_view.h" #include "chrome/grit/generated_resources.h" -#include "chrome/grit/theme_resources.h" #include "components/grit/components_scaled_resources.h" #include "components/omnibox/browser/omnibox_popup_model.h" #include "third_party/skia/include/core/SkColor.h" #include "ui/accessibility/ax_view_state.h" #include "ui/base/l10n/l10n_util.h" -#include "ui/base/material_design/material_design_controller.h" #include "ui/base/resource/resource_bundle.h" #include "ui/base/theme_provider.h" #include "ui/gfx/canvas.h" @@ -42,7 +39,6 @@ #include "ui/gfx/paint_vector_icon.h" #include "ui/gfx/range/range.h" #include "ui/gfx/render_text.h" -#include "ui/gfx/scoped_canvas.h" #include "ui/gfx/text_utils.h" #include "ui/gfx/vector_icons_public.h" #include "ui/native_theme/native_theme.h" @@ -188,11 +184,9 @@ OmniboxResultView::OmniboxResultView(OmniboxPopupContentsView* model, int model_index, - LocationBarView* location_bar_view, const gfx::FontList& font_list) : model_(model), model_index_(model_index), - location_bar_view_(location_bar_view), font_list_(font_list), font_height_(std::max( font_list.GetHeight(), @@ -201,11 +195,10 @@ keyword_icon_(new views::ImageView()), animation_(new gfx::SlideAnimation(this)) { CHECK_GE(model_index, 0); - if (default_icon_size_ == 0) - default_icon_size_ = LocationBarView::kIconWidth; keyword_icon_->set_owned_by_client(); keyword_icon_->EnableCanvasFlippingForRTLUI(true); - keyword_icon_->SetImage(GetKeywordIcon()); + keyword_icon_->SetImage( + GetVectorIcon(gfx::VectorIconId::OMNIBOX_KEYWORD_SEARCH)); keyword_icon_->SizeToPreferredSize(); } @@ -253,18 +246,14 @@ } void OmniboxResultView::Invalidate() { - if (ui::MaterialDesignController::IsModeMaterial()) { - const ResultViewState state = GetState(); - if (state == NORMAL) { - set_background(nullptr); - } else { - const SkColor bg_color = GetColor(state, BACKGROUND); - set_background(new BackgroundWith1PxBorder(bg_color, bg_color)); - } + const ResultViewState state = GetState(); + if (state == NORMAL) { + set_background(nullptr); + } else { + const SkColor bg_color = GetColor(state, BACKGROUND); + set_background(new BackgroundWith1PxBorder(bg_color, bg_color)); } - keyword_icon_->SetImage(GetKeywordIcon()); - // While the text in the RenderTexts may not have changed, the styling // (color/bold) may need to change. So we reset them to cause them to be // recomputed in OnPaint(). @@ -562,9 +551,6 @@ (input_render_text->GetContentWidth() - start_padding) : start_padding; } -// static -int OmniboxResultView::default_icon_size_ = 0; - const char* OmniboxResultView::GetClassName() const { return "OmniboxResultView"; } @@ -574,51 +560,10 @@ if (!image.IsEmpty()) return image.AsImageSkia(); - if (ui::MaterialDesignController::IsModeMaterial()) { - return GetVectorIcon( - model_->IsStarredMatch(match_) - ? gfx::VectorIconId::OMNIBOX_STAR - : AutocompleteMatch::TypeToVectorIcon(match_.type)); - } - - int icon = model_->IsStarredMatch(match_) ? - IDR_OMNIBOX_STAR : AutocompleteMatch::TypeToIcon(match_.type); - if (GetState() == SELECTED) { - switch (icon) { - case IDR_OMNIBOX_CALCULATOR: - icon = IDR_OMNIBOX_CALCULATOR_SELECTED; - break; - case IDR_OMNIBOX_EXTENSION_APP: - icon = IDR_OMNIBOX_EXTENSION_APP_SELECTED; - break; - case IDR_OMNIBOX_HTTP: - icon = IDR_OMNIBOX_HTTP_SELECTED; - break; - case IDR_OMNIBOX_SEARCH: - icon = IDR_OMNIBOX_SEARCH_SELECTED; - break; - case IDR_OMNIBOX_STAR: - icon = IDR_OMNIBOX_STAR_SELECTED; - break; - default: - NOTREACHED(); - break; - } - } - return *location_bar_view_->GetThemeProvider()->GetImageSkiaNamed(icon); -} - -gfx::ImageSkia OmniboxResultView::GetKeywordIcon() const { - if (ui::MaterialDesignController::IsModeMaterial()) - return GetVectorIcon(gfx::VectorIconId::OMNIBOX_KEYWORD_SEARCH); - - // NOTE: If we ever begin returning icons of varying size, then callers need - // to ensure that |keyword_icon_| is resized each time its image is reset. - int icon = IDR_OMNIBOX_TTS; - if (GetState() == SELECTED) - icon = IDR_OMNIBOX_TTS_SELECTED; - - return *location_bar_view_->GetThemeProvider()->GetImageSkiaNamed(icon); + return GetVectorIcon( + model_->IsStarredMatch(match_) + ? gfx::VectorIconId::OMNIBOX_STAR + : AutocompleteMatch::TypeToVectorIcon(match_.type)); } gfx::ImageSkia OmniboxResultView::GetVectorIcon( @@ -646,31 +591,18 @@ void OmniboxResultView::Layout() { int horizontal_padding = GetLayoutConstant(LOCATION_BAR_HORIZONTAL_PADDING); - // In non-material, the horizontal bounds we're given are indented inside the - // omnibox border. In material, we're given the outside bounds, so we can - // match the omnibox border outline shape exactly in OnPaint(). So we have to - // inset here to keep the icons lined up. - const int border_padding = ui::MaterialDesignController::IsModeMaterial() ? - GetLayoutConstant(LOCATION_BAR_BORDER_THICKNESS) : 0; - const int start_x = border_padding + horizontal_padding; - const int end_x = width() - border_padding - horizontal_padding; + // The horizontal bounds we're given are the outside bounds, so we can match + // the omnibox border outline shape exactly in OnPaint(). We have to inset + // here to keep the icons lined up. + const int start_x = + GetLayoutConstant(LOCATION_BAR_BORDER_THICKNESS) + horizontal_padding; + const int end_x = width() - start_x; const gfx::ImageSkia icon = GetIcon(); - // Pre-MD, normal icons are 19 px wide, while extension icons are 16 px wide. - // The code in IconLabelBubbleView::Layout() positions these icons in the - // omnibox using ICON_LABEL_VIEW_TRAILING_PADDING, so we use that here as well - // so the icons will line up. - // - // Technically we don't need the IsModeMaterial() check here, but it will make - // it easier to see that all this code is dead once we switch to MD. - int icon_x = start_x; - if (!ui::MaterialDesignController::IsModeMaterial() && - (icon.width() != default_icon_size_)) - icon_x += IconLabelBubbleView::kTrailingPaddingPreMd; - icon_bounds_.SetRect(icon_x, (GetContentLineHeight() - icon.height()) / 2, + icon_bounds_.SetRect(start_x, (GetContentLineHeight() - icon.height()) / 2, icon.width(), icon.height()); - const int text_x = start_x + default_icon_size_ + horizontal_padding; + const int text_x = start_x + LocationBarView::kIconWidth + horizontal_padding; int text_width = end_x - text_x; if (match_.associated_keyword.get()) { @@ -693,13 +625,7 @@ } void OmniboxResultView::OnPaint(gfx::Canvas* canvas) { - if (ui::MaterialDesignController::IsModeMaterial()) { - View::OnPaint(canvas); - } else { - const ResultViewState state = GetState(); - if (state != NORMAL) - canvas->DrawColor(GetColor(state, BACKGROUND)); - } + View::OnPaint(canvas); // NOTE: While animating the keyword match, both matches may be visible. @@ -762,7 +688,8 @@ int OmniboxResultView::GetContentLineHeight() const { return std::max( - default_icon_size_ + GetLayoutInsets(OMNIBOX_DROPDOWN_ICON).height(), + LocationBarView::kIconWidth + + GetLayoutInsets(OMNIBOX_DROPDOWN_ICON).height(), GetTextHeight() + GetLayoutInsets(OMNIBOX_DROPDOWN_TEXT).height()); }
diff --git a/chrome/browser/ui/views/omnibox/omnibox_result_view.h b/chrome/browser/ui/views/omnibox/omnibox_result_view.h index 2d0b3188..451711da 100644 --- a/chrome/browser/ui/views/omnibox/omnibox_result_view.h +++ b/chrome/browser/ui/views/omnibox/omnibox_result_view.h
@@ -20,7 +20,6 @@ #include "ui/views/controls/image_view.h" #include "ui/views/view.h" -class LocationBarView; class OmniboxPopupContentsView; namespace gfx { @@ -50,7 +49,6 @@ OmniboxResultView(OmniboxPopupContentsView* model, int model_index, - LocationBarView* location_bar_view, const gfx::FontList& font_list); ~OmniboxResultView() override; @@ -133,8 +131,6 @@ gfx::ImageSkia GetIcon() const; - gfx::ImageSkia GetKeywordIcon() const; - // Utility function for creating vector icons. gfx::ImageSkia GetVectorIcon(gfx::VectorIconId icon_id) const; @@ -184,14 +180,10 @@ int text_type, bool is_bold) const; - static int default_icon_size_; - // This row's model and model index. OmniboxPopupContentsView* model_; size_t model_index_; - LocationBarView* location_bar_view_; - const gfx::FontList font_list_; int font_height_;
diff --git a/chrome/browser/ui/views/tab_dialogs_views.cc b/chrome/browser/ui/views/tab_dialogs_views.cc index 9746c5f..46177c1 100644 --- a/chrome/browser/ui/views/tab_dialogs_views.cc +++ b/chrome/browser/ui/views/tab_dialogs_views.cc
@@ -40,8 +40,9 @@ new CollectedCookiesViews(web_contents_); } -void TabDialogsViews::ShowHungRendererDialog() { - HungRendererDialogView::Show(web_contents_); +void TabDialogsViews::ShowHungRendererDialog( + const content::WebContentsUnresponsiveState& unresponsive_state) { + HungRendererDialogView::Show(web_contents_, unresponsive_state); } void TabDialogsViews::HideHungRendererDialog() {
diff --git a/chrome/browser/ui/views/tab_dialogs_views.h b/chrome/browser/ui/views/tab_dialogs_views.h index cabace9..83f4e473 100644 --- a/chrome/browser/ui/views/tab_dialogs_views.h +++ b/chrome/browser/ui/views/tab_dialogs_views.h
@@ -17,7 +17,8 @@ // TabDialogs: gfx::NativeView GetDialogParentView() const override; void ShowCollectedCookies() override; - void ShowHungRendererDialog() override; + void ShowHungRendererDialog( + const content::WebContentsUnresponsiveState& unresponsive_state) override; void HideHungRendererDialog() override; void ShowProfileSigninConfirmation( Browser* browser,
diff --git a/chrome/browser/ui/views/tabs/tab_strip.cc b/chrome/browser/ui/views/tabs/tab_strip.cc index 2e1530c..79811c6f 100644 --- a/chrome/browser/ui/views/tabs/tab_strip.cc +++ b/chrome/browser/ui/views/tabs/tab_strip.cc
@@ -322,6 +322,7 @@ : views::ImageButton(listener), tab_strip_(tab_strip), destroyed_(NULL) { + set_animate_on_state_change(true); #if defined(OS_LINUX) && !defined(OS_CHROMEOS) set_triggerable_event_flags(triggerable_event_flags() | ui::EF_MIDDLE_MOUSE_BUTTON); @@ -600,8 +601,8 @@ } TabStrip::~TabStrip() { - FOR_EACH_OBSERVER(TabStripObserver, observers_, - TabStripDeleted(this)); + for (TabStripObserver& observer : observers_) + observer.TabStripDeleted(this); // The animations may reference the tabs. Shut down the animation before we // delete the tabs. @@ -699,8 +700,8 @@ SwapLayoutIfNecessary(); - FOR_EACH_OBSERVER(TabStripObserver, observers_, - TabStripAddedTabAt(this, model_index)); + for (TabStripObserver& observer : observers_) + observer.TabStripAddedTabAt(this, model_index); // Stop dragging when a new tab is added and dragging a window. Doing // otherwise results in a confusing state if the user attempts to reattach. We @@ -740,8 +741,8 @@ } SwapLayoutIfNecessary(); - FOR_EACH_OBSERVER(TabStripObserver, observers_, - TabStripMovedTab(this, from_model_index, to_model_index)); + for (TabStripObserver& observer : observers_) + observer.TabStripMovedTab(this, from_model_index, to_model_index); } void TabStrip::RemoveTabAt(content::WebContents* contents, int model_index) { @@ -762,8 +763,8 @@ } SwapLayoutIfNecessary(); - FOR_EACH_OBSERVER(TabStripObserver, observers_, - TabStripRemovedTabAt(this, model_index)); + for (TabStripObserver& observer : observers_) + observer.TabStripRemovedTabAt(this, model_index); // Stop dragging when a new tab is removed and dragging a window. Doing // otherwise results in a confusing state if the user attempts to reattach. We @@ -2427,8 +2428,10 @@ GetLayoutConstant(TABSTRIP_NEW_TAB_BUTTON_OVERLAP)); const int old_max_x = newtab_button_bounds_.right(); newtab_button_bounds_.set_origin(gfx::Point(new_tab_x, 0)); - if (newtab_button_bounds_.right() != old_max_x) - FOR_EACH_OBSERVER(TabStripObserver, observers_, TabStripMaxXChanged(this)); + if (newtab_button_bounds_.right() != old_max_x) { + for (TabStripObserver& observer : observers_) + observer.TabStripMaxXChanged(this); + } } int TabStrip::GenerateIdealBoundsForPinnedTabs(int* first_non_pinned_index) {
diff --git a/chrome/browser/ui/views/toolbar/app_menu.cc b/chrome/browser/ui/views/toolbar/app_menu.cc index 45f98c66..5547f62 100644 --- a/chrome/browser/ui/views/toolbar/app_menu.cc +++ b/chrome/browser/ui/views/toolbar/app_menu.cc
@@ -800,7 +800,8 @@ if (model) model->RemoveObserver(this); } - FOR_EACH_OBSERVER(AppMenuObserver, observer_list_, AppMenuDestroyed()); + for (AppMenuObserver& observer : observer_list_) + observer.AppMenuDestroyed(); } void AppMenu::Init(ui::MenuModel* model) {
diff --git a/chrome/browser/ui/views/toolbar/app_menu_button.cc b/chrome/browser/ui/views/toolbar/app_menu_button.cc index b174742..881ec2f 100644 --- a/chrome/browser/ui/views/toolbar/app_menu_button.cc +++ b/chrome/browser/ui/views/toolbar/app_menu_button.cc
@@ -74,7 +74,8 @@ menu_model_.reset(new AppMenuModel(toolbar_view_, browser)); menu_->Init(menu_model_.get()); - FOR_EACH_OBSERVER(views::MenuListener, menu_listeners_, OnMenuOpened()); + for (views::MenuListener& observer : menu_listeners_) + observer.OnMenuOpened(); base::TimeTicks menu_open_time = base::TimeTicks::Now(); menu_->RunMenu(this);
diff --git a/chrome/browser/ui/views/website_settings/chosen_object_row.cc b/chrome/browser/ui/views/website_settings/chosen_object_row.cc index 0a4661a..b655d44 100644 --- a/chrome/browser/ui/views/website_settings/chosen_object_row.cc +++ b/chrome/browser/ui/views/website_settings/chosen_object_row.cc
@@ -78,6 +78,6 @@ delete delete_button_; delete_button_ = nullptr; - FOR_EACH_OBSERVER(ChosenObjectRowObserver, observer_list_, - OnChosenObjectDeleted(*info_)); + for (ChosenObjectRowObserver& observer : observer_list_) + observer.OnChosenObjectDeleted(*info_); }
diff --git a/chrome/browser/ui/views/website_settings/permission_selector_row.cc b/chrome/browser/ui/views/website_settings/permission_selector_row.cc index 198fcd11..95c82b8 100644 --- a/chrome/browser/ui/views/website_settings/permission_selector_row.cc +++ b/chrome/browser/ui/views/website_settings/permission_selector_row.cc
@@ -366,7 +366,6 @@ combobox_->UpdateSelectedIndex(use_default); } - FOR_EACH_OBSERVER(PermissionSelectorRowObserver, - observer_list_, - OnPermissionChanged(permission)); + for (PermissionSelectorRowObserver& observer : observer_list_) + observer.OnPermissionChanged(permission); }
diff --git a/chrome/browser/ui/webui/chromeos/login/network_dropdown_handler.cc b/chrome/browser/ui/webui/chromeos/login/network_dropdown_handler.cc index b8bb9d6..42b46c7c 100644 --- a/chrome/browser/ui/webui/chromeos/login/network_dropdown_handler.cc +++ b/chrome/browser/ui/webui/chromeos/login/network_dropdown_handler.cc
@@ -89,7 +89,8 @@ } void NetworkDropdownHandler::OnConnectToNetworkRequested() { - FOR_EACH_OBSERVER(Observer, observers_, OnConnectToNetworkRequested()); + for (Observer& observer : observers_) + observer.OnConnectToNetworkRequested(); } void NetworkDropdownHandler::HandleNetworkItemChosen(double id) {
diff --git a/chrome/browser/ui/webui/chromeos/login/network_state_informer.cc b/chrome/browser/ui/webui/chromeos/login/network_state_informer.cc index 1fb7a90..e658646 100644 --- a/chrome/browser/ui/webui/chromeos/login/network_state_informer.cc +++ b/chrome/browser/ui/webui/chromeos/login/network_state_informer.cc
@@ -189,8 +189,8 @@ network_type_ = new_network_type; if (updated && state_ == ONLINE) { - FOR_EACH_OBSERVER(NetworkStateInformerObserver, observers_, - OnNetworkReady()); + for (NetworkStateInformerObserver& observer : observers_) + observer.OnNetworkReady(); } return updated; @@ -205,8 +205,8 @@ void NetworkStateInformer::SendStateToObservers( NetworkError::ErrorReason reason) { - FOR_EACH_OBSERVER(NetworkStateInformerObserver, observers_, - UpdateState(reason)); + for (NetworkStateInformerObserver& observer : observers_) + observer.UpdateState(reason); } } // namespace chromeos
diff --git a/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc b/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc index 9174cab..9e1a9c04 100644 --- a/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc +++ b/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc
@@ -601,9 +601,8 @@ } current_screen_ = new_screen; - FOR_EACH_OBSERVER(Observer, - observer_list_, - OnCurrentScreenChanged(current_screen_, new_screen)); + for (Observer& observer : observer_list_) + observer.OnCurrentScreenChanged(current_screen_, new_screen); } } // namespace chromeos
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 2516925a..b79b766 100644 --- a/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.cc +++ b/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.cc
@@ -9,6 +9,7 @@ #include <algorithm> #include <vector> +#include "ash/common/session/session_state_delegate.h" #include "ash/common/system/chromeos/devicetype_utils.h" #include "ash/common/wm_shell.h" #include "ash/shell.h"
diff --git a/chrome/browser/ui/webui/chromeos/touch_view_controller_delegate.cc b/chrome/browser/ui/webui/chromeos/touch_view_controller_delegate.cc index df571f2..f16aa1a 100644 --- a/chrome/browser/ui/webui/chromeos/touch_view_controller_delegate.cc +++ b/chrome/browser/ui/webui/chromeos/touch_view_controller_delegate.cc
@@ -32,11 +32,13 @@ } void TouchViewControllerDelegate::OnMaximizeModeStarted() { - FOR_EACH_OBSERVER(Observer, observers_, OnMaximizeModeStarted()); + for (Observer& observer : observers_) + observer.OnMaximizeModeStarted(); } void TouchViewControllerDelegate::OnMaximizeModeEnded() { - FOR_EACH_OBSERVER(Observer, observers_, OnMaximizeModeEnded()); + for (Observer& observer : observers_) + observer.OnMaximizeModeEnded(); } } // namespace chromeos
diff --git a/chrome/browser/ui/webui/devtools_ui.cc b/chrome/browser/ui/webui/devtools_ui.cc index de76e8b3..ed6c43c 100644 --- a/chrome/browser/ui/webui/devtools_ui.cc +++ b/chrome/browser/ui/webui/devtools_ui.cc
@@ -6,6 +6,7 @@ #include "base/macros.h" #include "base/memory/ref_counted_memory.h" +#include "base/strings/string_split.h" #include "base/strings/string_util.h" #include "base/strings/stringprintf.h" #include "chrome/browser/profiles/profile.h" @@ -16,6 +17,8 @@ #include "content/public/browser/web_contents.h" #include "content/public/browser/web_ui.h" #include "content/public/common/user_agent.h" +#include "net/base/escape.h" +#include "net/base/url_util.h" #include "net/url_request/url_fetcher.h" #include "net/url_request/url_fetcher_delegate.h" #include "net/url_request/url_request_context_getter.h" @@ -46,6 +49,129 @@ "data:text/plain,Cannot load DevTools frontend from an untrusted origin"; #endif // defined(DEBUG_DEVTOOLS) +GURL SanitizeFrontendURL( + const GURL& url, + const std::string& scheme, + const std::string& host, + const std::string& path, + bool allow_query); + +std::string SanitizeRevision(const std::string& revision) { + for (size_t i = 0; i < revision.length(); i++) { + if (!(revision[i] == '@' && i == 0) + && !(revision[i] >= '0' && revision[i] <= '9') + && !(revision[i] >= 'a' && revision[i] <= 'z') + && !(revision[i] >= 'A' && revision[i] <= 'Z')) { + return std::string(); + } + } + return revision; +} + +std::string SanitizeFrontendPath(const std::string& path) { + for (size_t i = 0; i < path.length(); i++) { + if (path[i] != '/' && path[i] != '-' && path[i] != '_' + && path[i] != '.' && path[i] != '@' + && !(path[i] >= '0' && path[i] <= '9') + && !(path[i] >= 'a' && path[i] <= 'z') + && !(path[i] >= 'A' && path[i] <= 'Z')) { + return std::string(); + } + } + return path; +} + +std::string SanitizeEndpoint(const std::string& value) { + if (value.find('&') != std::string::npos + || value.find('?') != std::string::npos) + return std::string(); + return value; +} + +std::string SanitizeRemoteBase(const std::string& value) { + GURL url(value); + std::string path = url.path(); + std::vector<std::string> parts = base::SplitString( + path, "/", base::KEEP_WHITESPACE, base::SPLIT_WANT_ALL); + std::string revision = parts.size() > 2 ? parts[2] : ""; + revision = SanitizeRevision(revision); + path = base::StringPrintf("/%s/%s/", kRemoteFrontendPath, revision.c_str()); + return SanitizeFrontendURL(url, url::kHttpsScheme, + kRemoteFrontendDomain, path, false).spec(); +} + +std::string SanitizeRemoteFrontendURL(const std::string& value) { + GURL url(net::UnescapeURLComponent(value, + net::UnescapeRule::SPACES | net::UnescapeRule::PATH_SEPARATORS | + net::UnescapeRule::URL_SPECIAL_CHARS_EXCEPT_PATH_SEPARATORS | + net::UnescapeRule::REPLACE_PLUS_WITH_SPACE)); + std::string path = url.path(); + std::vector<std::string> parts = base::SplitString( + path, "/", base::KEEP_WHITESPACE, base::SPLIT_WANT_ALL); + std::string revision = parts.size() > 2 ? parts[2] : ""; + revision = SanitizeRevision(revision); + std::string filename = parts.size() ? parts[parts.size() - 1] : ""; + if (filename != "devtools.html") + filename = "inspector.html"; + path = base::StringPrintf("/serve_rev/%s/%s", + revision.c_str(), filename.c_str()); + std::string sanitized = SanitizeFrontendURL(url, url::kHttpsScheme, + kRemoteFrontendDomain, path, true).spec(); + return net::EscapeQueryParamValue(sanitized, false); +} + +std::string SanitizeFrontendQueryParam( + const std::string& key, + const std::string& value) { + // Convert boolean flags to true. + if (key == "can_dock" || key == "debugFrontend" || key == "experiments" || + key == "isSharedWorker" || key == "v8only" || key == "remoteFrontend") + return "true"; + + // Pass connection endpoints as is. + if (key == "ws" || key == "service-backend") + return SanitizeEndpoint(value); + + // Only support undocked for old frontends. + if (key == "dockSide" && value == "undocked") + return value; + + if (key == "remoteBase") + return SanitizeRemoteBase(value); + + if (key == "remoteFrontendUrl") + return SanitizeRemoteFrontendURL(value); + + return std::string(); +} + +GURL SanitizeFrontendURL( + const GURL& url, + const std::string& scheme, + const std::string& host, + const std::string& path, + bool allow_query) { + std::vector<std::string> query_parts; + if (allow_query) { + for (net::QueryIterator it(url); !it.IsAtEnd(); it.Advance()) { + std::string value = SanitizeFrontendQueryParam(it.GetKey(), + it.GetValue()); + if (!value.empty()) { + query_parts.push_back( + base::StringPrintf("%s=%s", it.GetKey().c_str(), value.c_str())); + } + } + } + std::string query = + query_parts.empty() ? "" : "?" + base::JoinString(query_parts, "&"); + std::string constructed = base::StringPrintf("%s://%s%s%s", + scheme.c_str(), host.c_str(), path.c_str(), query.c_str()); + GURL result = GURL(constructed); + if (!result.is_valid()) + return GURL(); + return result; +} + // DevToolsDataSource --------------------------------------------------------- std::string GetMimeTypeForPath(const std::string& path) { @@ -250,14 +376,23 @@ content::GetWebKitRevision().c_str())); } +// static +GURL DevToolsUI::SanitizeFrontendURL(const GURL& url) { + return ::SanitizeFrontendURL(url, content::kChromeDevToolsScheme, + chrome::kChromeUIDevToolsHost, SanitizeFrontendPath(url.path()), true); +} + DevToolsUI::DevToolsUI(content::WebUI* web_ui) - : WebUIController(web_ui), - bindings_(web_ui->GetWebContents()) { + : WebUIController(web_ui) { web_ui->SetBindings(0); Profile* profile = Profile::FromWebUI(web_ui); content::URLDataSource::Add( profile, new DevToolsDataSource(profile->GetRequestContext())); + + GURL url = web_ui->GetWebContents()->GetVisibleURL(); + if (url.spec() == SanitizeFrontendURL(url).spec()) + bindings_.reset(new DevToolsUIBindings(web_ui->GetWebContents())); } DevToolsUI::~DevToolsUI() {
diff --git a/chrome/browser/ui/webui/devtools_ui.h b/chrome/browser/ui/webui/devtools_ui.h index 5ee6b80..8e6328d 100644 --- a/chrome/browser/ui/webui/devtools_ui.h +++ b/chrome/browser/ui/webui/devtools_ui.h
@@ -5,23 +5,24 @@ #ifndef CHROME_BROWSER_UI_WEBUI_DEVTOOLS_UI_H_ #define CHROME_BROWSER_UI_WEBUI_DEVTOOLS_UI_H_ +#include <memory> + #include "base/compiler_specific.h" #include "base/macros.h" #include "chrome/browser/devtools/devtools_ui_bindings.h" #include "content/public/browser/web_ui_controller.h" -class Profile; - class DevToolsUI : public content::WebUIController { public: static GURL GetProxyURL(const std::string& frontend_url); static GURL GetRemoteBaseURL(); + static GURL SanitizeFrontendURL(const GURL& url); explicit DevToolsUI(content::WebUI* web_ui); ~DevToolsUI() override; private: - DevToolsUIBindings bindings_; + std::unique_ptr<DevToolsUIBindings> bindings_; DISALLOW_COPY_AND_ASSIGN(DevToolsUI); };
diff --git a/chrome/browser/ui/webui/devtools_ui_unittest.cc b/chrome/browser/ui/webui/devtools_ui_unittest.cc new file mode 100644 index 0000000..7cc7585 --- /dev/null +++ b/chrome/browser/ui/webui/devtools_ui_unittest.cc
@@ -0,0 +1,102 @@ +// 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/devtools_ui.h" +#include "testing/gtest/include/gtest/gtest.h" + +class DevToolsUITest : public testing::Test { +}; + +TEST_F(DevToolsUITest, SanitizeFrontendURL) { + std::vector<std::pair<std::string, std::string>> tests = { + {"random-string", + "chrome-devtools://devtools/"}, + {"http://valid.url/but/wrong", + "chrome-devtools://devtools/but/wrong"}, + {"chrome-devtools://wrong-domain/", + "chrome-devtools://devtools/"}, + {"chrome-devtools://devtools/bundled/devtools.html", + "chrome-devtools://devtools/bundled/devtools.html"}, + {"chrome-devtools://devtools:1234/bundled/devtools.html#hash", + "chrome-devtools://devtools/bundled/devtools.html"}, + {"chrome-devtools://devtools/some/random/path", + "chrome-devtools://devtools/some/random/path"}, + {"chrome-devtools://devtools/bundled/devtools.html?experiments=true", + "chrome-devtools://devtools/bundled/devtools.html?experiments=true"}, + {"chrome-devtools://devtools/bundled/devtools.html" + "?some-flag=flag&v8only=true&experiments=false&debugFrontend=a" + "&another-flag=another-flag&can_dock=false&isSharedWorker=notreally" + "&remoteFrontend=sure", + "chrome-devtools://devtools/bundled/devtools.html" + "?v8only=true&experiments=true&debugFrontend=true" + "&can_dock=true&isSharedWorker=true&remoteFrontend=true"}, + {"chrome-devtools://devtools/?ws=any-value-is-fine", + "chrome-devtools://devtools/?ws=any-value-is-fine"}, + {"chrome-devtools://devtools/" + "?service-backend=ws://localhost:9222/services", + "chrome-devtools://devtools/" + "?service-backend=ws://localhost:9222/services"}, + {"chrome-devtools://devtools/?dockSide=undocked", + "chrome-devtools://devtools/?dockSide=undocked"}, + {"chrome-devtools://devtools/?dockSide=dock-to-bottom", + "chrome-devtools://devtools/"}, + {"chrome-devtools://devtools/?dockSide=bottom", + "chrome-devtools://devtools/"}, + {"chrome-devtools://devtools/?remoteBase=" + "http://example.com:1234/remote-base#hash", + "chrome-devtools://devtools/?remoteBase=" + "https://chrome-devtools-frontend.appspot.com/" + "serve_file//"}, + {"chrome-devtools://devtools/?ws=1%26evil%3dtrue", + "chrome-devtools://devtools/?ws=1%26evil%3dtrue"}, + {"chrome-devtools://devtools/?remoteBase=" + "https://chrome-devtools-frontend.appspot.com/some/path/" + "@123719741873/more/path.html", + "chrome-devtools://devtools/?remoteBase=" + "https://chrome-devtools-frontend.appspot.com/serve_file/path/"}, + {"chrome-devtools://devtools/?remoteBase=" + "https://chrome-devtools-frontend.appspot.com/serve_file/" + "@123719741873/inspector.html%3FdebugFrontend%3Dfalse", + "chrome-devtools://devtools/?remoteBase=" + "https://chrome-devtools-frontend.appspot.com/serve_file/" + "@123719741873/"}, + {"chrome-devtools://devtools/bundled/inspector.html?" + "&remoteBase=https://chrome-devtools-frontend.appspot.com/serve_file/" + "@b4907cc5d602ff470740b2eb6344b517edecb7b9/&can_dock=true", + "chrome-devtools://devtools/bundled/inspector.html?" + "remoteBase=https://chrome-devtools-frontend.appspot.com/serve_file/" + "@b4907cc5d602ff470740b2eb6344b517edecb7b9/&can_dock=true"}, + {"chrome-devtools://devtools/?remoteFrontendUrl=" + "https://chrome-devtools-frontend.appspot.com/serve_rev/" + "@12345/inspector.html%3FdebugFrontend%3Dfalse", + "chrome-devtools://devtools/?remoteFrontendUrl=" + "https%3A%2F%2Fchrome-devtools-frontend.appspot.com%2Fserve_rev" + "%2F%4012345%2Finspector.html%3FdebugFrontend%3Dtrue"}, + {"chrome-devtools://devtools/?remoteFrontendUrl=" + "https://chrome-devtools-frontend.appspot.com/serve_rev/" + "@12345/inspector.html%22></iframe>something", + "chrome-devtools://devtools/?remoteFrontendUrl=" + "https%3A%2F%2Fchrome-devtools-frontend.appspot.com%2Fserve_rev" + "%2F%4012345%2Finspector.html"}, + {"chrome-devtools://devtools/?remoteFrontendUrl=" + "http://domain:1234/path/rev/a/filename.html%3Fparam%3Dvalue#hash", + "chrome-devtools://devtools/?remoteFrontendUrl=" + "https%3A%2F%2Fchrome-devtools-frontend.appspot.com%2Fserve_rev" + "%2Frev%2Finspector.html"}, + {"chrome-devtools://devtools/?experiments=whatever&remoteFrontendUrl=" + "https://chrome-devtools-frontend.appspot.com/serve_rev/" + "@12345/devtools.html%3Fws%3Danyvalue%26experiments%3Dlikely" + "&unencoded=value&debugFrontend=true", + "chrome-devtools://devtools/?experiments=true&remoteFrontendUrl=" + "https%3A%2F%2Fchrome-devtools-frontend.appspot.com%2Fserve_rev" + "%2F%4012345%2Fdevtools.html%3Fws%3Danyvalue%26experiments%3Dtrue" + "&debugFrontend=true"}, + }; + + for (const auto& pair : tests) { + GURL url = GURL(pair.first); + url = DevToolsUI::SanitizeFrontendURL(url); + EXPECT_EQ(pair.second, url.spec()); + } +}
diff --git a/chrome/browser/ui/webui/extensions/extensions_ui.cc b/chrome/browser/ui/webui/extensions/extensions_ui.cc index 84c2198..f7703324 100644 --- a/chrome/browser/ui/webui/extensions/extensions_ui.cc +++ b/chrome/browser/ui/webui/extensions/extensions_ui.cc
@@ -119,6 +119,8 @@ IDS_MD_EXTENSIONS_SIDEBAR_DEVELOPER_MODE); source->AddLocalizedString("dropToInstall", IDS_EXTENSIONS_INSTALL_DROP_TARGET); + source->AddLocalizedString("errorsPageHeading", + IDS_MD_EXTENSIONS_ERROR_PAGE_HEADING); source->AddLocalizedString("getMoreExtensions", IDS_MD_EXTENSIONS_SIDEBAR_GET_MORE_EXTENSIONS); source->AddLocalizedString("keyboardShortcuts", @@ -135,6 +137,7 @@ source->AddLocalizedString("itemDependentEntry", IDS_MD_EXTENSIONS_DEPENDENT_ENTRY); source->AddLocalizedString("itemDetails", IDS_MD_EXTENSIONS_ITEM_DETAILS); + source->AddLocalizedString("itemErrors", IDS_MD_EXTENSIONS_ITEM_ERRORS); source->AddLocalizedString("itemPermissions", IDS_MD_EXTENSIONS_ITEM_PERMISSIONS); source->AddLocalizedString("itemPermissionsEmpty", @@ -221,6 +224,8 @@ source->AddResourcePath("drop_overlay.html", IDR_MD_EXTENSIONS_DROP_OVERLAY_HTML); source->AddResourcePath("drop_overlay.js", IDR_MD_EXTENSIONS_DROP_OVERLAY_JS); + source->AddResourcePath("error_page.html", IDR_MD_EXTENSIONS_ERROR_PAGE_HTML); + source->AddResourcePath("error_page.js", IDR_MD_EXTENSIONS_ERROR_PAGE_JS); source->AddResourcePath("keyboard_shortcuts.html", IDR_MD_EXTENSIONS_KEYBOARD_SHORTCUTS_HTML); source->AddResourcePath("keyboard_shortcuts.js",
diff --git a/chrome/browser/ui/webui/media_router/query_result_manager.cc b/chrome/browser/ui/webui/media_router/query_result_manager.cc index 11a67758..79fbb604 100644 --- a/chrome/browser/ui/webui/media_router/query_result_manager.cc +++ b/chrome/browser/ui/webui/media_router/query_result_manager.cc
@@ -232,8 +232,8 @@ sink_with_cast_modes.cast_modes = sink_pair.second.GetCastModes(); sinks.push_back(sink_with_cast_modes); } - FOR_EACH_OBSERVER(QueryResultManager::Observer, observers_, - OnResultsUpdated(sinks)); + for (QueryResultManager::Observer& observer : observers_) + observer.OnResultsUpdated(sinks); } } // namespace media_router
diff --git a/chrome/browser/ui/webui/options/browser_options_handler.cc b/chrome/browser/ui/webui/options/browser_options_handler.cc index df89a2a..c7256db 100644 --- a/chrome/browser/ui/webui/options/browser_options_handler.cc +++ b/chrome/browser/ui/webui/options/browser_options_handler.cc
@@ -52,6 +52,7 @@ #include "chrome/browser/search_engines/template_url_service_factory.h" #include "chrome/browser/signin/easy_unlock_service.h" #include "chrome/browser/signin/signin_manager_factory.h" +#include "chrome/browser/signin/signin_ui_util.h" #include "chrome/browser/sync/profile_sync_service_factory.h" #include "chrome/browser/sync/sync_ui_util.h" #include "chrome/browser/themes/theme_service.h" @@ -1560,6 +1561,10 @@ sync_status->SetBoolean("managed", service && service->IsManaged()); sync_status->SetBoolean("signedIn", signin->IsAuthenticated()); + sync_status->SetString("accountInfo", + l10n_util::GetStringFUTF16( + IDS_SYNC_ACCOUNT_INFO, + signin_ui_util::GetAuthenticatedUsername(signin))); sync_status->SetBoolean("hasUnrecoverableError", service && service->HasUnrecoverableError());
diff --git a/chrome/browser/ui/webui/options/reset_profile_settings_handler.cc b/chrome/browser/ui/webui/options/reset_profile_settings_handler.cc index be17858..51cd9dd 100644 --- a/chrome/browser/ui/webui/options/reset_profile_settings_handler.cc +++ b/chrome/browser/ui/webui/options/reset_profile_settings_handler.cc
@@ -16,7 +16,6 @@ #include "chrome/browser/google/google_brand.h" #include "chrome/browser/profile_resetter/brandcode_config_fetcher.h" #include "chrome/browser/profile_resetter/brandcoded_default_settings.h" -#include "chrome/browser/profile_resetter/profile_reset_report.pb.h" #include "chrome/browser/profile_resetter/profile_resetter.h" #include "chrome/browser/profile_resetter/resettable_settings_snapshot.h" #include "chrome/browser/profiles/profile.h" @@ -154,27 +153,30 @@ void ResetProfileSettingsHandler::HandleResetProfileSettings( const base::ListValue* value) { bool send_settings = false; - std::string reset_request_origin; + std::string request_origin_string; bool success = value->GetBoolean(0, &send_settings) && - value->GetString(1, &reset_request_origin); + value->GetString(1, &request_origin_string); DCHECK(success); DCHECK(brandcode_.empty() || config_fetcher_); + reset_report::ChromeResetReport::ResetRequestOrigin request_origin = + ResetRequestOriginFromString(request_origin_string); if (config_fetcher_ && config_fetcher_->IsActive()) { // Reset once the prefs are fetched. config_fetcher_->SetCallback( base::Bind(&ResetProfileSettingsHandler::ResetProfile, Unretained(this), - send_settings, reset_request_origin)); + send_settings, request_origin)); } else { - ResetProfile(send_settings, reset_request_origin); + ResetProfile(send_settings, request_origin); } } void ResetProfileSettingsHandler::OnResetProfileSettingsDone( bool send_feedback, - const std::string& reset_request_origin) { + reset_report::ChromeResetReport::ResetRequestOrigin request_origin) { web_ui()->CallJavascriptFunctionUnsafe( "ResetProfileSettingsOverlay.doneResetting"); + if (send_feedback && setting_snapshot_) { Profile* profile = Profile::FromWebUI(web_ui()); ResettableSettingsSnapshot current_snapshot(profile); @@ -184,8 +186,7 @@ std::unique_ptr<reset_report::ChromeResetReport> report_proto = SerializeSettingsReportToProto(*setting_snapshot_, difference); if (report_proto) { - report_proto->set_reset_request_origin( - ResetRequestOriginFromString(reset_request_origin)); + report_proto->set_reset_request_origin(request_origin); SendSettingsFeedbackProto(*report_proto, profile); } } @@ -226,7 +227,7 @@ void ResetProfileSettingsHandler::ResetProfile( bool send_settings, - const std::string& reset_request_origin) { + reset_report::ChromeResetReport::ResetRequestOrigin request_origin) { DCHECK(resetter_); DCHECK(!resetter_->IsActive()); @@ -246,9 +247,12 @@ resetter_->Reset( ProfileResetter::ALL, std::move(default_settings), base::Bind(&ResetProfileSettingsHandler::OnResetProfileSettingsDone, - AsWeakPtr(), send_settings, reset_request_origin)); + AsWeakPtr(), send_settings, request_origin)); content::RecordAction(base::UserMetricsAction("ResetProfile")); UMA_HISTOGRAM_BOOLEAN("ProfileReset.SendFeedback", send_settings); + UMA_HISTOGRAM_ENUMERATION( + "ProfileReset.ResetRequestOrigin", request_origin, + reset_report::ChromeResetReport::ResetRequestOrigin_MAX + 1); } void ResetProfileSettingsHandler::UpdateFeedbackUI() {
diff --git a/chrome/browser/ui/webui/options/reset_profile_settings_handler.h b/chrome/browser/ui/webui/options/reset_profile_settings_handler.h index d35089d..7300d19 100644 --- a/chrome/browser/ui/webui/options/reset_profile_settings_handler.h +++ b/chrome/browser/ui/webui/options/reset_profile_settings_handler.h
@@ -11,6 +11,7 @@ #include "base/compiler_specific.h" #include "base/macros.h" #include "base/memory/weak_ptr.h" +#include "chrome/browser/profile_resetter/profile_reset_report.pb.h" #include "chrome/browser/ui/webui/options/options_ui.h" namespace base { @@ -50,8 +51,9 @@ void HandleResetProfileSettings(const base::ListValue* value); // Closes the dialog once all requested settings has been reset. - void OnResetProfileSettingsDone(bool send_feedback, - const std::string& reset_request_origin); + void OnResetProfileSettingsDone( + bool send_feedback, + reset_report::ChromeResetReport::ResetRequestOrigin request_origin); // Called when the confirmation box appears. void OnShowResetProfileDialog(const base::ListValue* value); @@ -64,8 +66,9 @@ // Resets profile settings to default values. |send_settings| is true if user // gave his consent to upload broken settings to Google for analysis. - void ResetProfile(bool send_settings, - const std::string& reset_request_origin); + void ResetProfile( + bool send_settings, + reset_report::ChromeResetReport::ResetRequestOrigin request_origin); // Sets new values for the feedback area. void UpdateFeedbackUI();
diff --git a/chrome/browser/ui/webui/profile_helper.cc b/chrome/browser/ui/webui/profile_helper.cc index 61a0d3a7..04bf70c 100644 --- a/chrome/browser/ui/webui/profile_helper.cc +++ b/chrome/browser/ui/webui/profile_helper.cc
@@ -32,8 +32,6 @@ return; if (signin::IsForceSigninEnabled()) { -// TODO(zmin): Remove the switcher once the UserManager API is finished on Mac. -#if !defined(OS_MACOSX) if (!UserManager::IsShowing()) { UserManager::Show(base::FilePath(), profiles::USER_MANAGER_NO_TUTORIAL, profiles::USER_MANAGER_SELECT_PROFILE_NO_ACTION); @@ -44,7 +42,6 @@ base::Bind(&ShowSigninDialog, profile->GetPath()), base::string16(), std::string(), std::string()); -#endif } else { profiles::FindOrCreateNewWindowForProfile( profile, chrome::startup::IS_PROCESS_STARTUP,
diff --git a/chrome/browser/ui/webui/settings/people_handler.cc b/chrome/browser/ui/webui/settings/people_handler.cc index 85eec93..55ebfe8 100644 --- a/chrome/browser/ui/webui/settings/people_handler.cc +++ b/chrome/browser/ui/webui/settings/people_handler.cc
@@ -24,6 +24,7 @@ #include "chrome/browser/signin/signin_error_controller_factory.h" #include "chrome/browser/signin/signin_manager_factory.h" #include "chrome/browser/signin/signin_promo.h" +#include "chrome/browser/signin/signin_ui_util.h" #include "chrome/browser/sync/profile_sync_service_factory.h" #include "chrome/browser/sync/sync_ui_util.h" #include "chrome/browser/ui/browser_finder.h" @@ -740,6 +741,8 @@ sync_status->SetBoolean("managed", service && service->IsManaged()); sync_status->SetBoolean("signedIn", signin->IsAuthenticated()); + sync_status->SetString("signedInUsername", + signin_ui_util::GetAuthenticatedUsername(signin)); sync_status->SetBoolean("hasUnrecoverableError", service && service->HasUnrecoverableError());
diff --git a/chrome/browser/ui/webui/settings/reset_settings_handler.cc b/chrome/browser/ui/webui/settings/reset_settings_handler.cc index 25d9741..372af03 100644 --- a/chrome/browser/ui/webui/settings/reset_settings_handler.cc +++ b/chrome/browser/ui/webui/settings/reset_settings_handler.cc
@@ -254,6 +254,9 @@ request_origin)); content::RecordAction(base::UserMetricsAction("ResetProfile")); UMA_HISTOGRAM_BOOLEAN("ProfileReset.SendFeedback", send_settings); + UMA_HISTOGRAM_ENUMERATION( + "ProfileReset.ResetRequestOrigin", request_origin, + reset_report::ChromeResetReport::ResetRequestOrigin_MAX + 1); } ProfileResetter* ResetSettingsHandler::GetResetter() {
diff --git a/chrome/browser/ui/webui/signin/login_ui_service.cc b/chrome/browser/ui/webui/signin/login_ui_service.cc index a413f6d..8fe5bf9 100644 --- a/chrome/browser/ui/webui/signin/login_ui_service.cc +++ b/chrome/browser/ui/webui/signin/login_ui_service.cc
@@ -48,10 +48,8 @@ void LoginUIService::SyncConfirmationUIClosed( SyncConfirmationUIClosedResult result) { - FOR_EACH_OBSERVER( - Observer, - observer_list_, - OnSyncConfirmationUIClosed(result)); + for (Observer& observer : observer_list_) + observer.OnSyncConfirmationUIClosed(result); } void LoginUIService::ShowLoginPopup() {
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 0f0acf9..96c7a3e3 100644 --- a/chrome/browser/ui/webui/signin/signin_create_profile_handler.cc +++ b/chrome/browser/ui/webui/signin/signin_create_profile_handler.cc
@@ -423,11 +423,8 @@ } void SigninCreateProfileHandler::OpenSigninDialogForProfile(Profile* profile) { -// TODO(zmin): Remove the switcher once the UserManager API is finished on Mac. -#if !defined(OS_MACOSX) UserManager::ShowSigninDialog(web_ui()->GetWebContents()->GetBrowserContext(), profile->GetPath()); -#endif } void SigninCreateProfileHandler::ShowProfileCreationError(
diff --git a/chrome/browser/ui/webui/signin/signin_error_ui.cc b/chrome/browser/ui/webui/signin/signin_error_ui.cc index 3a095c1..79b2e445 100644 --- a/chrome/browser/ui/webui/signin/signin_error_ui.cc +++ b/chrome/browser/ui/webui/signin/signin_error_ui.cc
@@ -39,18 +39,12 @@ bool is_system_profile = webui_profile->GetOriginalProfile()->IsSystemProfile(); -// TODO(zmin): Remove the condition for MACOSX once user_manager_mac.cc is -// updated. -#if !defined(OS_MACOSX) if (is_system_profile) { signin_profile = g_browser_process->profile_manager()->GetProfileByPath( UserManager::GetSigninProfilePath()); } else { signin_profile = webui_profile; } -#else - signin_profile = webui_profile; -#endif content::WebUIDataSource* source = content::WebUIDataSource::Create(chrome::kChromeUISigninErrorHost);
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 c34c054..c02ef40 100644 --- a/chrome/browser/ui/webui/signin/user_manager_screen_handler.cc +++ b/chrome/browser/ui/webui/signin/user_manager_screen_handler.cc
@@ -472,22 +472,15 @@ content::BrowserContext* browser_context = web_ui()->GetWebContents()->GetBrowserContext(); -// In order to support the upgrade case where we have a local hash but no -// password token, the user perform a full online reauth. -// TODO(zmin): Remove the condition for MACOSX once user_manager_mac.cc is -// updated. -#if !defined(OS_MACOSX) if (!email_address_.empty()) { + // In order to support the upgrade case where we have a local hash but no + // password token, the user must perform a full online reauth. UserManager::ShowReauthDialog(browser_context, email_address_, signin_metrics::Reason::REASON_UNLOCK); } else { // Fresh sign in via user manager without existing email address. UserManager::ShowSigninDialog(browser_context, profile_path); } -#else - UserManager::ShowReauthDialog(browser_context, email_address_, - signin_metrics::Reason::REASON_UNLOCK); -#endif } void UserManagerScreenHandler::HandleRemoveUser(const base::ListValue* args) {
diff --git a/chrome/browser/ui/webui/snippets_internals_message_handler.cc b/chrome/browser/ui/webui/snippets_internals_message_handler.cc index 3fba279..2e18fa6 100644 --- a/chrome/browser/ui/webui/snippets_internals_message_handler.cc +++ b/chrome/browser/ui/webui/snippets_internals_message_handler.cc
@@ -86,7 +86,7 @@ SnippetsInternalsMessageHandler::~SnippetsInternalsMessageHandler() {} void SnippetsInternalsMessageHandler::RegisterMessages() { - // additional initialization (web_ui() does not work from the constructor) + // Additional initialization (web_ui() does not work from the constructor). Profile* profile = Profile::FromWebUI(web_ui()); content_suggestions_service_ = @@ -178,6 +178,9 @@ SendString("hosts-status", std::string()); + if (!ntp_snippets_service_) + return; + std::string hosts_string; if (!args->GetString(0, &hosts_string)) return; @@ -186,7 +189,8 @@ hosts_string, " ", base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY); std::set<std::string> hosts(hosts_vector.begin(), hosts_vector.end()); - ntp_snippets_service_->FetchSnippetsFromHosts(hosts, /*force_requests=*/true); + ntp_snippets_service_->FetchSnippetsFromHosts(hosts, + /*interactive_request=*/true); } void SnippetsInternalsMessageHandler::HandleClearCachedSuggestions( @@ -262,6 +266,9 @@ void SnippetsInternalsMessageHandler::SendAllContent() { SendBoolean("flag-snippets", base::FeatureList::IsEnabled( ntp_snippets::kContentSuggestionsFeature)); + SendBoolean( + "flag-article-suggestions", + base::FeatureList::IsEnabled(ntp_snippets::kArticleSuggestionsFeature)); SendBoolean("flag-recent-offline-tab-suggestions", base::FeatureList::IsEnabled( ntp_snippets::kRecentOfflineTabSuggestionsFeature)); @@ -278,25 +285,27 @@ SendClassification(); - switch (ntp_snippets_service_->snippets_fetcher()->personalization()) { - case ntp_snippets::NTPSnippetsFetcher::Personalization::kPersonal: - SendString("switch-personalized", "Only personalized"); - break; - case ntp_snippets::NTPSnippetsFetcher::Personalization::kBoth: - SendString("switch-personalized", - "Both personalized and non-personalized"); - break; - case ntp_snippets::NTPSnippetsFetcher::Personalization::kNonPersonal: - SendString("switch-personalized", "Only non-personalized"); - break; - } + if (ntp_snippets_service_) { + switch (ntp_snippets_service_->snippets_fetcher()->personalization()) { + case ntp_snippets::NTPSnippetsFetcher::Personalization::kPersonal: + SendString("switch-personalized", "Only personalized"); + break; + case ntp_snippets::NTPSnippetsFetcher::Personalization::kBoth: + SendString("switch-personalized", + "Both personalized and non-personalized"); + break; + case ntp_snippets::NTPSnippetsFetcher::Personalization::kNonPersonal: + SendString("switch-personalized", "Only non-personalized"); + break; + } - SendString("switch-fetch-url", - ntp_snippets_service_->snippets_fetcher()->fetch_url().spec()); - web_ui()->CallJavascriptFunctionUnsafe( - "chrome.SnippetsInternals.receiveJson", - base::StringValue( - ntp_snippets_service_->snippets_fetcher()->last_json())); + SendString("switch-fetch-url", + ntp_snippets_service_->snippets_fetcher()->fetch_url().spec()); + web_ui()->CallJavascriptFunctionUnsafe( + "chrome.SnippetsInternals.receiveJson", + base::StringValue( + ntp_snippets_service_->snippets_fetcher()->last_json())); + } SendContentSuggestions(); } @@ -354,10 +363,12 @@ categories_list->Append(std::move(category_entry)); } - const std::string& status = - ntp_snippets_service_->snippets_fetcher()->last_status(); - if (!status.empty()) - SendString("hosts-status", "Finished: " + status); + if (ntp_snippets_service_) { + const std::string& status = + ntp_snippets_service_->snippets_fetcher()->last_status(); + if (!status.empty()) + SendString("hosts-status", "Finished: " + status); + } base::DictionaryValue result; result.Set("list", std::move(categories_list));
diff --git a/chrome/browser/ui/webui/vr_shell/vr_shell_ui_ui.cc b/chrome/browser/ui/webui/vr_shell/vr_shell_ui_ui.cc index 6d560e5c..2750eb1 100644 --- a/chrome/browser/ui/webui/vr_shell/vr_shell_ui_ui.cc +++ b/chrome/browser/ui/webui/vr_shell/vr_shell_ui_ui.cc
@@ -193,6 +193,9 @@ source->AddLocalizedString( "insecureWebVrContentTransient", IDS_WEBSITE_SETTINGS_INSECURE_WEBVR_CONTENT_TRANSIENT); + source->AddLocalizedString("back", IDS_VR_SHELL_UI_BACK_BUTTON); + source->AddLocalizedString("forward", IDS_VR_SHELL_UI_FORWARD_BUTTON); + source->AddLocalizedString("reload", IDS_VR_SHELL_UI_RELOAD_BUTTON); return source; }
diff --git a/chrome/browser/usb/web_usb_detector.cc b/chrome/browser/usb/web_usb_detector.cc index bc597c84..07c3a3b1 100644 --- a/chrome/browser/usb/web_usb_detector.cc +++ b/chrome/browser/usb/web_usb_detector.cc
@@ -118,6 +118,9 @@ WebUsbDetector::~WebUsbDetector() {} void WebUsbDetector::Initialize() { +// Disabled on Windows due to jank and hangs caused by enumerating devices. +// https://crbug.com/656702 +#if !defined(OS_WIN) SCOPED_UMA_HISTOGRAM_TIMER("WebUsb.DetectorInitialization"); device::UsbService* usb_service = device::DeviceClient::Get()->GetUsbService(); @@ -125,6 +128,7 @@ return; observer_.Add(usb_service); +#endif } void WebUsbDetector::OnDeviceAdded(scoped_refptr<device::UsbDevice> device) {
diff --git a/chrome/browser/usb/web_usb_detector_unittest.cc b/chrome/browser/usb/web_usb_detector_unittest.cc index 70b5f4c..dd410a2 100644 --- a/chrome/browser/usb/web_usb_detector_unittest.cc +++ b/chrome/browser/usb/web_usb_detector_unittest.cc
@@ -17,6 +17,10 @@ #include "ui/message_center/notification_delegate.h" #include "url/gurl.h" +// These tests are disabled because WebUsbDetector::Initialize is a noop on +// Windows due to jank and hangs caused by enumerating devices. +// https://crbug.com/656702 +#if !defined(OS_WIN) namespace { // USB device product name. @@ -399,3 +403,4 @@ device_client_.usb_service()->RemoveDevice(device_3); EXPECT_EQ(nullptr, message_center_->FindVisibleNotificationById(guid_3)); } +#endif // !OS_WIN
diff --git a/chrome/chrome_repack_locales.gni b/chrome/chrome_repack_locales.gni index cb168e7..62706f1 100644 --- a/chrome/chrome_repack_locales.gni +++ b/chrome/chrome_repack_locales.gni
@@ -56,6 +56,7 @@ } if (!is_ios) { source_patterns += [ + "${root_gen_dir}/blimp/client/support/resources/blimp_strings_", "${root_gen_dir}/content/app/strings/content_strings_", "${root_gen_dir}/device/bluetooth/strings/bluetooth_strings_", "${root_gen_dir}/third_party/libaddressinput/address_input_strings_", @@ -63,6 +64,7 @@ "${root_gen_dir}/ui/strings/ui_strings_", ] deps += [ + "//blimp/client/support/resources:strings", "//content/app/strings", "//device/bluetooth/strings", "//third_party/libaddressinput:strings",
diff --git a/chrome/common/crash_keys.cc b/chrome/common/crash_keys.cc index e7f304b..2492659 100644 --- a/chrome/common/crash_keys.cc +++ b/chrome/common/crash_keys.cc
@@ -50,6 +50,11 @@ #if defined(OS_WIN) const char kHungAudioThreadDetails[] = "hung-audio-thread-details"; + +const char kHungRendererOutstandingAckCount[] = "hung-outstanding-acks"; +const char kHungRendererOutstandingEventType[] = "hung-outstanding-event-type"; +const char kHungRendererLastEventType[] = "hung-last-event-type"; +const char kHungRendererReason[] = "hung-reason"; #endif const char kPrinterInfo[] = "prn-info-%" PRIuS; @@ -126,6 +131,12 @@ { "ppapi_path", kMediumSize }, { "subresource_url", kLargeSize }, { "total-discardable-memory-allocated", kSmallSize }, +#if defined(OS_WIN) + { kHungRendererOutstandingAckCount, kSmallSize }, + { kHungRendererOutstandingEventType, kSmallSize }, + { kHungRendererLastEventType, kSmallSize }, + { kHungRendererReason, kSmallSize }, +#endif #if defined(OS_CHROMEOS) { kNumberOfUsers, kSmallSize }, #endif
diff --git a/chrome/common/crash_keys.h b/chrome/common/crash_keys.h index 335b8d3..8217892d 100644 --- a/chrome/common/crash_keys.h +++ b/chrome/common/crash_keys.h
@@ -85,6 +85,12 @@ #if defined(OS_WIN) extern const char kHungAudioThreadDetails[]; + +// Hung renderer crash reports are only sent on Windows. +extern const char kHungRendererOutstandingAckCount[]; +extern const char kHungRendererOutstandingEventType[]; +extern const char kHungRendererLastEventType[]; +extern const char kHungRendererReason[]; #endif // The user's printers, up to kPrinterInfoCount. Should be set with
diff --git a/chrome/common/extensions/api/settings_private.idl b/chrome/common/extensions/api/settings_private.idl index 287f1d1f..904ad39 100644 --- a/chrome/common/extensions/api/settings_private.idl +++ b/chrome/common/extensions/api/settings_private.idl
@@ -57,8 +57,8 @@ callback OnPrefSetCallback = void (boolean success); callback GetAllPrefsCallback = void (PrefObject[] prefs); callback GetPrefCallback = void (PrefObject pref); - callback GetDefaultZoomPercentCallback = void (double percent); - callback SetDefaultZoomPercentCallback = void (boolean success); + callback GetDefaultZoomCallback = void (double zoom); + callback SetDefaultZoomCallback = void (boolean success); interface Functions { // Sets a settings value. @@ -75,12 +75,14 @@ // Gets the value of a specific pref. static void getPref(DOMString name, GetPrefCallback callback); - // Gets the page zoom factor as an integer percentage. - static void getDefaultZoomPercent(GetDefaultZoomPercentCallback callback); + // Gets the default page zoom factor. Possible values are currently between + // 0.25 and 5. For a full list, see zoom::kPresetZoomFactors. + static void getDefaultZoom(GetDefaultZoomCallback callback); - // Sets the page zoom factor from a zoom percentage. - static void setDefaultZoomPercent(double percent, - optional SetDefaultZoomPercentCallback callback); + // Sets the page zoom factor. Must be less than 0.001 different than a value + // in zoom::kPresetZoomFactors. + static void setDefaultZoom( + double zoom, optional SetDefaultZoomCallback callback); }; interface Events {
diff --git a/chrome/common/features.gni b/chrome/common/features.gni index a2f0e50..4af019cf 100644 --- a/chrome/common/features.gni +++ b/chrome/common/features.gni
@@ -31,8 +31,8 @@ enable_google_now = false # Hangout services is an extension that adds extra features to Hangouts. - # For official Chrome builds, this flag is set on the bots. - enable_hangout_services_extension = false + # It is enableable separately to facilitate testing. + enable_hangout_services_extension = is_chrome_branded # 'Ok Google' hotwording is disabled by default. Set to true to enable. (This # will download a closed-source NaCl module at startup.) Chrome-branded @@ -71,6 +71,7 @@ "enable_app_list=$enable_app_list", "enable_background=$enable_background", "enable_google_now=$enable_google_now", + "enable_hangout_services_extension=$enable_hangout_services_extension", "enable_hotwording=$enable_hotwording", "enable_service_discovery=$enable_service_discovery", "enable_vr_shell=$enable_vr_shell",
diff --git a/chrome/common/pref_names.cc b/chrome/common/pref_names.cc index 81283886..1792729 100644 --- a/chrome/common/pref_names.cc +++ b/chrome/common/pref_names.cc
@@ -1857,7 +1857,7 @@ const char kIsBootstrappingSlave[] = "is_oobe_bootstrapping_slave"; // A preference that controlles Android status reporting. -const char kReportArcStatus[] = "arc.status_reporting"; +const char kReportArcStatusEnabled[] = "arc.status_reporting_enabled"; #endif // defined(OS_CHROMEOS)
diff --git a/chrome/common/pref_names.h b/chrome/common/pref_names.h index 01369f5..a95f7e4 100644 --- a/chrome/common/pref_names.h +++ b/chrome/common/pref_names.h
@@ -650,7 +650,7 @@ extern const char kLogoutStartedLast[]; extern const char kConsumerManagementStage[]; extern const char kIsBootstrappingSlave[]; -extern const char kReportArcStatus[]; +extern const char kReportArcStatusEnabled[]; #endif // defined(OS_CHROMEOS) extern const char kClearPluginLSODataEnabled[];
diff --git a/chrome/common/variations/fieldtrial_testing_config_schema.json b/chrome/common/variations/fieldtrial_testing_config_schema.json index c78e6ac0..31419f0b 100644 --- a/chrome/common/variations/fieldtrial_testing_config_schema.json +++ b/chrome/common/variations/fieldtrial_testing_config_schema.json
@@ -41,6 +41,10 @@ "field": "disable_features", "type": "array", "contents": { "type": "string"} + }, + { + "field": "forcing_flag", + "type": "string" } ] }
diff --git a/chrome/common/variations/variations_util.cc b/chrome/common/variations/variations_util.cc index 16a4c0d4..b1626d25c 100644 --- a/chrome/common/variations/variations_util.cc +++ b/chrome/common/variations/variations_util.cc
@@ -9,6 +9,7 @@ #include <string> #include <vector> +#include "base/command_line.h" #include "base/feature_list.h" #include "base/metrics/field_trial.h" #include "base/strings/string_split.h" @@ -61,6 +62,26 @@ } } +// Chooses an experiment taking into account the command line. Defaults to +// picking the first experiment. +const FieldTrialTestingExperiment& ChooseExperiment( + const FieldTrialTestingExperiment experiments[], + size_t experiment_size) { + DCHECK_GT(experiment_size, 0ul); + const auto& command_line = *base::CommandLine::ForCurrentProcess(); + size_t chosen_index = 0; + for (size_t i = 1; i < experiment_size && chosen_index == 0; ++i) { + const auto& experiment = experiments[i]; + if (experiment.forcing_flag && + command_line.HasSwitch(experiment.forcing_flag)) { + chosen_index = i; + break; + } + } + DCHECK_GT(experiment_size, chosen_index); + return experiments[chosen_index]; +} + } // namespace bool AssociateParamsFromString(const std::string& varations_string) { @@ -116,7 +137,9 @@ const FieldTrialTestingStudy& study = config.studies[i]; if (study.experiments_size > 0) { AssociateParamsFromExperiment( - study.name, study.experiments[0], feature_list); + study.name, + ChooseExperiment(study.experiments, study.experiments_size), + feature_list); } else { DLOG(ERROR) << "Unexpected empty study: " << study.name; }
diff --git a/chrome/common/variations/variations_util_unittest.cc b/chrome/common/variations/variations_util_unittest.cc index 922d616..6c029b7f 100644 --- a/chrome/common/variations/variations_util_unittest.cc +++ b/chrome/common/variations/variations_util_unittest.cc
@@ -7,6 +7,7 @@ #include <memory> #include <utility> +#include "base/command_line.h" #include "base/feature_list.h" #include "base/macros.h" #include "base/metrics/field_trial.h" @@ -18,7 +19,7 @@ class VariationsUtilTest : public ::testing::Test { public: - VariationsUtilTest() : field_trial_list_(NULL) {} + VariationsUtilTest() : field_trial_list_(nullptr) {} ~VariationsUtilTest() override { // Ensure that the maps are cleared between tests, since they are stored as @@ -61,13 +62,16 @@ const FieldTrialTestingExperimentParams array_kFieldTrialConfig_params_0[] = {{"x", "1"}, {"y", "2"}}; const FieldTrialTestingExperiment array_kFieldTrialConfig_experiments_0[] = { - {"TestGroup1", array_kFieldTrialConfig_params_0, 2, NULL, 0, NULL, 0}, + {"TestGroup1", array_kFieldTrialConfig_params_0, 2, nullptr, 0, + nullptr, 0, nullptr}, }; const FieldTrialTestingExperimentParams array_kFieldTrialConfig_params_1[] = {{"x", "3"}, {"y", "4"}}; const FieldTrialTestingExperiment array_kFieldTrialConfig_experiments_1[] = { - {"TestGroup2", array_kFieldTrialConfig_params_0, 2, NULL, 0, NULL, 0}, - {"TestGroup2-2", array_kFieldTrialConfig_params_1, 2, NULL, 0, NULL, 0}, + {"TestGroup2", array_kFieldTrialConfig_params_0, 2, nullptr, 0, + nullptr, 0, nullptr}, + {"TestGroup2-2", array_kFieldTrialConfig_params_1, 2, nullptr, 0, + nullptr, 0, nullptr}, }; const FieldTrialTestingStudy array_kFieldTrialConfig_studies[] = { {"TestTrial1", array_kFieldTrialConfig_experiments_0, 1}, @@ -103,11 +107,11 @@ const char* disable_features[] = {"C", "D"}; const FieldTrialTestingExperiment array_kFieldTrialConfig_experiments_0[] = { - {"TestGroup1", NULL, 0, enable_features, 2, NULL, 0}, + {"TestGroup1", nullptr, 0, enable_features, 2, nullptr, 0, nullptr}, }; const FieldTrialTestingExperiment array_kFieldTrialConfig_experiments_1[] = { - {"TestGroup2", NULL, 0, NULL, 0, disable_features, 2}, - {"TestGroup2-2", NULL, 0, NULL, 0, NULL, 0}, + {"TestGroup2", nullptr, 0, nullptr, 0, disable_features, 2, nullptr}, + {"TestGroup2-2", nullptr, 0, nullptr, 0, nullptr, 0, nullptr}, }; const FieldTrialTestingStudy array_kFieldTrialConfig_studies[] = { @@ -137,4 +141,37 @@ EXPECT_TRUE(base::FieldTrialList::IsTrialActive("TestTrial2")); } +TEST_F(VariationsUtilTest, AssociateForcingFlagsFromFieldTrialConfig) { + const FieldTrialTestingExperiment array_kFieldTrialConfig_experiments_0[] = { + {"TestGroup1", nullptr, 0, nullptr, 0, nullptr, 0, nullptr} + }; + const FieldTrialTestingExperiment array_kFieldTrialConfig_experiments_1[] = { + {"TestGroup2", nullptr, 0, nullptr, 0, nullptr, 0, nullptr}, + {"ForcedGroup2", nullptr, 0, nullptr, 0, nullptr, 0, "flag-2"}, + }; + const FieldTrialTestingExperiment array_kFieldTrialConfig_experiments_2[] = { + {"TestGroup3", nullptr, 0, nullptr, 0, nullptr, 0, nullptr}, + {"ForcedGroup3", nullptr, 0, nullptr, 0, nullptr, 0, "flag-3"}, + {"ForcedGroup3-2", nullptr, 0, nullptr, 0, nullptr, 0, "flag-3-2"}, + }; + const FieldTrialTestingStudy array_kFieldTrialConfig_studies[] = { + {"TestTrial1", array_kFieldTrialConfig_experiments_0, 1}, + {"TestTrial2", array_kFieldTrialConfig_experiments_1, 2}, + {"TestTrial3", array_kFieldTrialConfig_experiments_2, 3}, + }; + const FieldTrialTestingConfig kConfig = { + array_kFieldTrialConfig_studies, 3 + }; + + base::CommandLine::ForCurrentProcess()->AppendSwitch("flag-2"); + base::CommandLine::ForCurrentProcess()->AppendSwitch("flag-3"); + + base::FeatureList feature_list; + AssociateParamsFromFieldTrialConfig(kConfig, &feature_list); + + EXPECT_EQ("TestGroup1", base::FieldTrialList::FindFullName("TestTrial1")); + EXPECT_EQ("ForcedGroup2", base::FieldTrialList::FindFullName("TestTrial2")); + EXPECT_EQ("ForcedGroup3", base::FieldTrialList::FindFullName("TestTrial3")); +} + } // namespace chrome_variations
diff --git a/chrome/gpu/arc_gpu_video_decode_accelerator.cc b/chrome/gpu/arc_gpu_video_decode_accelerator.cc index dc194db3..f2e6557 100644 --- a/chrome/gpu/arc_gpu_video_decode_accelerator.cc +++ b/chrome/gpu/arc_gpu_video_decode_accelerator.cc
@@ -57,6 +57,7 @@ next_bitstream_buffer_id_(0), output_pixel_format_(media::PIXEL_FORMAT_UNKNOWN), output_buffer_size_(0), + requested_num_of_output_buffers_(0), gpu_preferences_(gpu_preferences) {} ArcGpuVideoDecodeAccelerator::~ArcGpuVideoDecodeAccelerator() { @@ -343,13 +344,24 @@ << ", dimensions=" << dimensions.ToString() << ")"; DCHECK(thread_checker_.CalledOnValidThread()); coded_size_ = dimensions; + + // By default, use an empty rect to indicate the visible rectangle is not + // available. + visible_rect_ = gfx::Rect(); if ((output_pixel_format_ != media::PIXEL_FORMAT_UNKNOWN) && (output_pixel_format_ != output_pixel_format)) { arc_client_->OnError(PLATFORM_FAILURE); return; } output_pixel_format_ = output_pixel_format; + requested_num_of_output_buffers_ = requested_num_of_buffers; + output_buffer_size_ = + media::VideoFrame::AllocationSize(output_pixel_format_, coded_size_); + NotifyOutputFormatChanged(); +} + +void ArcGpuVideoDecodeAccelerator::NotifyOutputFormatChanged() { VideoFormat video_format; switch (output_pixel_format_) { case media::PIXEL_FORMAT_I420: @@ -369,17 +381,14 @@ arc_client_->OnError(PLATFORM_FAILURE); return; } - video_format.buffer_size = - media::VideoFrame::AllocationSize(output_pixel_format_, coded_size_); - output_buffer_size_ = video_format.buffer_size; - video_format.min_num_buffers = requested_num_of_buffers; - video_format.coded_width = dimensions.width(); - video_format.coded_height = dimensions.height(); - // TODO(owenlin): How to get visible size? - video_format.crop_top = 0; - video_format.crop_left = 0; - video_format.crop_width = dimensions.width(); - video_format.crop_height = dimensions.height(); + video_format.buffer_size = output_buffer_size_; + video_format.min_num_buffers = requested_num_of_output_buffers_; + video_format.coded_width = coded_size_.width(); + video_format.coded_height = coded_size_.height(); + video_format.crop_top = visible_rect_.y(); + video_format.crop_left = visible_rect_.x(); + video_format.crop_width = visible_rect_.width(); + video_format.crop_height = visible_rect_.height(); arc_client_->OnOutputFormatChanged(video_format); } @@ -393,6 +402,13 @@ << ", bitstream_buffer_id=" << picture.bitstream_buffer_id(); DCHECK(thread_checker_.CalledOnValidThread()); + // Handle visible size change. + if (visible_rect_ != picture.visible_rect()) { + DVLOG(5) << "visible size changed: " << picture.visible_rect().ToString(); + visible_rect_ = picture.visible_rect(); + NotifyOutputFormatChanged(); + } + InputRecord* input_record = FindInputRecord(picture.bitstream_buffer_id()); if (input_record == nullptr) { DLOG(ERROR) << "Cannot find for bitstream buffer id: "
diff --git a/chrome/gpu/arc_gpu_video_decode_accelerator.h b/chrome/gpu/arc_gpu_video_decode_accelerator.h index 1b24e13..2747c55a1 100644 --- a/chrome/gpu/arc_gpu_video_decode_accelerator.h +++ b/chrome/gpu/arc_gpu_video_decode_accelerator.h
@@ -123,6 +123,9 @@ // Returns |nullptr| if it cannot be found. InputRecord* FindInputRecord(int32_t bitstream_buffer_id); + // Notify the client when output format changes. + void NotifyOutputFormatChanged(); + // Global counter that keeps track the number of active clients (i.e., how // many VDAs in use by this class). // Since this class only works on the same thread, it's safe to access @@ -139,6 +142,7 @@ int32_t next_bitstream_buffer_id_; gfx::Size coded_size_; + gfx::Rect visible_rect_; media::VideoPixelFormat output_pixel_format_; // A list of most recent |kMaxNumberOfInputRecord| InputRecords. @@ -156,6 +160,9 @@ base::ThreadChecker thread_checker_; size_t output_buffer_size_; + // The minimal number of requested output buffers. + uint32_t requested_num_of_output_buffers_; + gpu::GpuPreferences gpu_preferences_; DISALLOW_COPY_AND_ASSIGN(ArcGpuVideoDecodeAccelerator);
diff --git a/chrome/installer/mini_installer/BUILD.gn b/chrome/installer/mini_installer/BUILD.gn index 6994618..3f379fe 100644 --- a/chrome/installer/mini_installer/BUILD.gn +++ b/chrome/installer/mini_installer/BUILD.gn
@@ -263,7 +263,7 @@ chrome_dll_target = "//chrome:main_dll" } -if (syzygy_optimize || is_syzyasan) { +if (is_syzyasan) { generate_mini_installer("mini_installer_syzygy") { out_dir = "$root_out_dir/syzygy/" chrome_dll_file = "$root_out_dir/syzygy/chrome.dll"
diff --git a/chrome/installer/util/shell_util.cc b/chrome/installer/util/shell_util.cc index 72832e1..b0db684 100644 --- a/chrome/installer/util/shell_util.cc +++ b/chrome/installer/util/shell_util.cc
@@ -1375,7 +1375,7 @@ const wchar_t* ShellUtil::kDefaultFileAssociations[] = {L".htm", L".html", L".shtml", L".xht", L".xhtml", NULL}; const wchar_t* ShellUtil::kPotentialFileAssociations[] = {L".htm", L".html", - L".shtml", L".xht", L".xhtml", L".webp", NULL}; + L".pdf", L".shtml", L".xht", L".xhtml", L".webp", NULL}; const wchar_t* ShellUtil::kBrowserProtocolAssociations[] = {L"ftp", L"http", L"https", NULL}; const wchar_t* ShellUtil::kPotentialProtocolAssociations[] = {L"ftp", L"http",
diff --git a/chrome/renderer/autofill/form_autofill_browsertest.cc b/chrome/renderer/autofill/form_autofill_browsertest.cc index 1e989a1..f793a2f 100644 --- a/chrome/renderer/autofill/form_autofill_browsertest.cc +++ b/chrome/renderer/autofill/form_autofill_browsertest.cc
@@ -4452,7 +4452,7 @@ &form, nullptr)); EXPECT_TRUE(form.name.empty()); - EXPECT_EQ(frame->document().url(), form.origin); + EXPECT_EQ(GURL(frame->document().url()), form.origin); EXPECT_FALSE(form.action.is_valid()); const std::vector<FormFieldData>& fields = form.fields; @@ -4512,7 +4512,7 @@ &form, nullptr)); EXPECT_TRUE(form.name.empty()); - EXPECT_EQ(frame->document().url(), form.origin); + EXPECT_EQ(GURL(frame->document().url()), form.origin); EXPECT_FALSE(form.action.is_valid()); const std::vector<FormFieldData>& fields = form.fields;
diff --git a/chrome/renderer/chrome_content_renderer_client.cc b/chrome/renderer/chrome_content_renderer_client.cc index 4f0bc44c..3159506 100644 --- a/chrome/renderer/chrome_content_renderer_client.cc +++ b/chrome/renderer/chrome_content_renderer_client.cc
@@ -1363,11 +1363,11 @@ WebString header_key(ASCIIToUTF16( data_reduction_proxy::chrome_proxy_header())); if (!response.httpHeaderField(header_key).isNull() && - response.httpHeaderField(header_key).utf8().find( - data_reduction_proxy::chrome_proxy_lo_fi_directive()) != - std::string::npos) { - (*properties)[data_reduction_proxy::chrome_proxy_header()] = - data_reduction_proxy::chrome_proxy_lo_fi_directive(); + data_reduction_proxy::IsEmptyImagePreview( + response.httpHeaderField(header_key).utf8())) { + (*properties)[ + data_reduction_proxy::chrome_proxy_content_transform_header()] = + data_reduction_proxy::empty_image_directive(); } } @@ -1392,23 +1392,23 @@ void ChromeContentRendererClient:: DidInitializeServiceWorkerContextOnWorkerThread( v8::Local<v8::Context> context, - int embedded_worker_id, + int64_t service_worker_version_id, const GURL& url) { #if defined(ENABLE_EXTENSIONS) ChromeExtensionsRendererClient::GetInstance() ->extension_dispatcher() ->DidInitializeServiceWorkerContextOnWorkerThread( - context, embedded_worker_id, url); + context, service_worker_version_id, url); #endif } void ChromeContentRendererClient::WillDestroyServiceWorkerContextOnWorkerThread( v8::Local<v8::Context> context, - int embedded_worker_id, + int64_t service_worker_version_id, const GURL& url) { #if defined(ENABLE_EXTENSIONS) extensions::Dispatcher::WillDestroyServiceWorkerContextOnWorkerThread( - context, embedded_worker_id, url); + context, service_worker_version_id, url); #endif }
diff --git a/chrome/renderer/chrome_content_renderer_client.h b/chrome/renderer/chrome_content_renderer_client.h index f366548..c32efe2 100644 --- a/chrome/renderer/chrome_content_renderer_client.h +++ b/chrome/renderer/chrome_content_renderer_client.h
@@ -178,11 +178,11 @@ void RunScriptsAtDocumentEnd(content::RenderFrame* render_frame) override; void DidInitializeServiceWorkerContextOnWorkerThread( v8::Local<v8::Context> context, - int embedded_worker_id, + int64_t service_worker_version_id, const GURL& url) override; void WillDestroyServiceWorkerContextOnWorkerThread( v8::Local<v8::Context> context, - int embedded_worker_id, + int64_t service_worker_version_id, const GURL& url) override; bool ShouldEnforceWebRTCRoutingPreferences() override; GURL OverrideFlashEmbedWithHTML(const GURL& url) override;
diff --git a/chrome/renderer/extensions/chrome_extensions_renderer_client.cc b/chrome/renderer/extensions/chrome_extensions_renderer_client.cc index 187447db..141bf76 100644 --- a/chrome/renderer/extensions/chrome_extensions_renderer_client.cc +++ b/chrome/renderer/extensions/chrome_extensions_renderer_client.cc
@@ -287,7 +287,7 @@ // subframes, so this check only makes sense for top-level frames. // TODO(alexmos,nasko): Figure out how this check should work when reloading // subframes in --site-per-process mode. - if (!frame->parent() && frame->document().url() == url) { + if (!frame->parent() && GURL(frame->document().url()) == url) { if (is_extension_url != IsStandaloneExtensionProcess()) return true; }
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn index a7ad30f2..227b8aa2 100644 --- a/chrome/test/BUILD.gn +++ b/chrome/test/BUILD.gn
@@ -113,7 +113,7 @@ "//components/search_engines:test_support", "//components/signin/core/browser:test_support", "//components/sync", - "//components/sync:test_support_sync_driver", + "//components/sync:test_support_driver", "//components/sync_sessions:test_support", "//components/syncable_prefs:test_support", "//components/toolbar:test_support", @@ -478,7 +478,7 @@ "//chrome/renderer", "//components/resources", "//components/sync", - "//components/sync:test_support_sync_model", + "//components/sync:test_support_model", "//content/app/resources", "//content/test:test_support", "//crypto:platform", @@ -902,9 +902,9 @@ "//components/invalidation/impl", "//components/invalidation/impl:test_support", "//components/sync", - "//components/sync:test_support_sync_fake_server", - "//components/sync:test_support_sync_model", - "//components/sync:test_support_sync_testserver", + "//components/sync:test_support_fake_server", + "//components/sync:test_support_model", + "//components/sync:test_support_testserver", "//content/test:test_support", "//net", "//skia", @@ -1225,7 +1225,7 @@ ":repack_pseudo_locales", ":test_support", "//base", - "//components/sync:test_support_sync_model", + "//components/sync:test_support_model", ] data_deps = [] @@ -3198,10 +3198,10 @@ "../browser/predictors/resource_prefetch_predictor_test_util.h", "../browser/predictors/resource_prefetch_predictor_unittest.cc", "../browser/predictors/resource_prefetcher_unittest.cc", + "../browser/prefs/chrome_command_line_pref_store_proxy_unittest.cc", + "../browser/prefs/chrome_command_line_pref_store_ssl_manager_unittest.cc", + "../browser/prefs/chrome_command_line_pref_store_unittest.cc", "../browser/prefs/chrome_pref_service_unittest.cc", - "../browser/prefs/command_line_pref_store_proxy_unittest.cc", - "../browser/prefs/command_line_pref_store_ssl_manager_unittest.cc", - "../browser/prefs/command_line_pref_store_unittest.cc", "../browser/prefs/incognito_mode_prefs_unittest.cc", "../browser/prefs/profile_pref_store_manager_unittest.cc", "../browser/prefs/proxy_policy_unittest.cc", @@ -3406,9 +3406,8 @@ "//components/browser_sync:test_support", "//components/content_settings/core/test:test_support", "//components/resources", - "//components/sync:test_support_sync_core", - "//components/sync:test_support_sync_core_impl", - "//components/sync:test_support_sync_model", + "//components/sync:test_support_driver", + "//components/sync:test_support_model", "//components/sync_sessions:test_support", "//content/public/app:both", "//content/test:test_support", @@ -3657,6 +3656,7 @@ "../browser/ui/autofill/save_card_bubble_controller_impl_unittest.cc", "../browser/ui/bluetooth/bluetooth_chooser_controller_unittest.cc", "../browser/ui/passwords/manage_passwords_ui_controller_unittest.cc", + "../browser/ui/webui/devtools_ui_unittest.cc", ] deps += [ ":unit_tests_js", @@ -4241,6 +4241,7 @@ "../browser/metrics/plugin_metrics_provider_unittest.cc", "../browser/plugins/chrome_plugin_service_filter_unittest.cc", "../browser/plugins/flash_download_interception_unittest.cc", + "../browser/plugins/flash_temporary_permission_tracker_unittest.cc", "../browser/plugins/plugin_finder_unittest.cc", "../browser/plugins/plugin_info_message_filter_unittest.cc", "../browser/plugins/plugin_installer_unittest.cc",
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 dfa2b14..375b77b 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
@@ -21,6 +21,9 @@ import org.chromium.policy.test.annotations.Policies; import org.chromium.ui.base.DeviceFormFactor; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + /** * An Instrumentation test runner that optionally spawns a test HTTP server. * The server's root directory is the device's external storage directory. @@ -52,6 +55,29 @@ super(targetContext); } + private boolean isDaydreamReady() { + // Might be compiled without the GVR SDK, and thus the NDK, so + // use reflection to try to get the class and call its static + // method. + Class<?> daydreamApi; + try { + daydreamApi = Class.forName("com.google.vr.ndk.base.DaydreamApi"); + } catch (ClassNotFoundException e) { + return false; + } + + try { + Method platformCheck = daydreamApi.getMethod( + "isDaydreamReadyPlatform", Context.class); + Boolean isDaydream = (Boolean) platformCheck.invoke( + daydreamApi, getTargetContext()); + return isDaydream.booleanValue(); + } catch (NoSuchMethodException | SecurityException | IllegalAccessException + | IllegalArgumentException | InvocationTargetException e) { + return false; + } + } + @Override protected boolean restrictionApplies(String restriction) { if (TextUtils.equals(restriction, ChromeRestriction.RESTRICTION_TYPE_PHONE) @@ -73,15 +99,20 @@ && (!ChromeVersionInfo.isOfficialBuild())) { return true; } - // TODO(bsheedy): Implement restriction logic when VR NDK is updated to - // allow Daydream-readiness checking if (TextUtils.equals(restriction, - ChromeRestriction.RESTRICTION_TYPE_DAYDREAM)) { - return true; - } - if (TextUtils.equals(restriction, + ChromeRestriction.RESTRICTION_TYPE_DAYDREAM) + || TextUtils.equals(restriction, ChromeRestriction.RESTRICTION_TYPE_NON_DAYDREAM)) { - return true; + boolean isDaydream = isDaydreamReady(); + if (TextUtils.equals(restriction, + ChromeRestriction.RESTRICTION_TYPE_DAYDREAM) + && !isDaydream) { + return true; + } else if (TextUtils.equals(restriction, + ChromeRestriction.RESTRICTION_TYPE_NON_DAYDREAM) + && isDaydream) { + return true; + } } return false; }
diff --git a/chrome/test/chromedriver/chrome/console_logger.cc b/chrome/test/chromedriver/chrome/console_logger.cc index 8c2b0d3..3d98a10 100644 --- a/chrome/test/chromedriver/chrome/console_logger.cc +++ b/chrome/test/chromedriver/chrome/console_logger.cc
@@ -209,7 +209,10 @@ args->GetSize() < 1 || !args->GetDictionary(0, &first_arg)) return Status(kUnknownError, "missing or invalid args"); - if (!first_arg->GetString("description", &text)) { + std::string arg_type; + if (first_arg->GetString("type", &arg_type) && arg_type == "undefined") { + text = "undefined"; + } else if (!first_arg->GetString("description", &text)) { const base::Value* value = nullptr; if (!first_arg->Get("value", &value)) return Status(kUnknownError, "missing or invalid arg value");
diff --git a/chrome/test/chromedriver/test/run_py_tests.py b/chrome/test/chromedriver/test/run_py_tests.py index 57987b3..19e2c57f 100755 --- a/chrome/test/chromedriver/test/run_py_tests.py +++ b/chrome/test/chromedriver/test/run_py_tests.py
@@ -1318,6 +1318,15 @@ chromedriver.UnknownError, "some error", self._driver.ExecuteScript, 'throw new Error("some error")') + def testDoesntCrashWhenScriptLogsUndefinedValue(self): + # https://bugs.chromium.org/p/chromedriver/issues/detail?id=1547 + self._driver.ExecuteScript('var b; console.log(b);') + + def testDoesntThrowWhenPageLogsUndefinedValue(self): + # https://bugs.chromium.org/p/chromedriver/issues/detail?id=1547 + self._driver.Load(self.GetHttpUrlForFile( + '/chromedriver/log_undefined_value.html')) + class ChromeDriverPageLoadTimeoutTest(ChromeDriverBaseTestWithWebServer):
diff --git a/chrome/test/data/chromedriver/log_undefined_value.html b/chrome/test/data/chromedriver/log_undefined_value.html new file mode 100644 index 0000000..60926246 --- /dev/null +++ b/chrome/test/data/chromedriver/log_undefined_value.html
@@ -0,0 +1,9 @@ +<!DOCTYPE html> +<html> + <body> + <script> + var b; + console.log(b); + </script> + </body> +</html>
diff --git a/chrome/test/data/extensions/api_test/service_worker/api_worker_ref_count/manifest.json b/chrome/test/data/extensions/api_test/service_worker/api_worker_ref_count/manifest.json new file mode 100644 index 0000000..875562c --- /dev/null +++ b/chrome/test/data/extensions/api_test/service_worker/api_worker_ref_count/manifest.json
@@ -0,0 +1,5 @@ +{ + "name": "Tests that worker is kept alive during extension API call.", + "version": "1.0", + "manifest_version": 2 +}
diff --git a/chrome/test/data/extensions/api_test/service_worker/api_worker_ref_count/page.html b/chrome/test/data/extensions/api_test/service_worker/api_worker_ref_count/page.html new file mode 100644 index 0000000..f6e2de85 --- /dev/null +++ b/chrome/test/data/extensions/api_test/service_worker/api_worker_ref_count/page.html
@@ -0,0 +1 @@ +<script src="page.js"></script>
diff --git a/chrome/test/data/extensions/api_test/service_worker/api_worker_ref_count/page.js b/chrome/test/data/extensions/api_test/service_worker/api_worker_ref_count/page.js new file mode 100644 index 0000000..0f26b96 --- /dev/null +++ b/chrome/test/data/extensions/api_test/service_worker/api_worker_ref_count/page.js
@@ -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. + +var worker = null; +var FAILURE_MESSAGE = 'FAILURE'; + +window.runServiceWorker = function() { + navigator.serviceWorker.register('sw.js').then(function() { + return navigator.serviceWorker.ready; + }).then(function(registration) { + worker = registration.active; + chrome.test.sendMessage('WORKER STARTED'); + }).catch(function(err) { + chrome.test.sendMessage(FAILURE_MESSAGE); + }); +}; + +window.testSendMessage = function() { + if (worker == null) { + chrome.test.sendMessage(FAILURE_MESSAGE); + return; + } + var channel = new MessageChannel(); + channel.port1.onmessage = function(e) { + if (e.data == 'Worker reply: Hello world') { + chrome.test.sendMessage('SUCCESS'); + } else { + chrome.test.sendMessage(FAILURE_MESSAGE); + } + }; + worker.postMessage('sendMessageTest', [channel.port2]); +};
diff --git a/chrome/test/data/extensions/api_test/service_worker/api_worker_ref_count/sw.js b/chrome/test/data/extensions/api_test/service_worker/api_worker_ref_count/sw.js new file mode 100644 index 0000000..70945d31 --- /dev/null +++ b/chrome/test/data/extensions/api_test/service_worker/api_worker_ref_count/sw.js
@@ -0,0 +1,20 @@ +// 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. + +self.onmessage = function(e) { + var fail = function() { + e.ports[0].postMessage('FAILURE'); + }; + if (e.data == 'sendMessageTest') { + try { + chrome.test.sendMessage('CHECK_REF_COUNT', function(reply) { + e.ports[0].postMessage('Worker reply: ' + reply); + }); + } catch (e) { + fail(); + } + } else { + fail(); + } +};
diff --git a/chrome/test/data/notifications/android_test.html b/chrome/test/data/notifications/android_test.html index 7d6dfce..073972d 100644 --- a/chrome/test/data/notifications/android_test.html +++ b/chrome/test/data/notifications/android_test.html
@@ -11,7 +11,15 @@ <script> function showNotification(title, options) { GetActivatedServiceWorker('android_test_worker.js', location.pathname) - .then(registration => registration.showNotification(title, options)) + .then(registration => { + messagePort.addEventListener('message', function replyListener(event) { + if (event.data.startsWith('reply: ')) { + messagePort.removeEventListener('message', replyListener); + sendToTest(event.data); + } + }); + return registration.showNotification(title, options); + }) .catch(sendToTest); } @@ -30,4 +38,4 @@ } </script> </body> -</html> \ No newline at end of file +</html>
diff --git a/chrome/test/data/notifications/android_test_worker.js b/chrome/test/data/notifications/android_test_worker.js index 4886db2..a3cead4e 100644 --- a/chrome/test/data/notifications/android_test_worker.js +++ b/chrome/test/data/notifications/android_test_worker.js
@@ -12,6 +12,8 @@ addEventListener('notificationclick', function(event) { if (event.notification.data === 'ACTION_CREATE_TAB') clients.openWindow('https://chrome.com/'); + else if (event.notification.data === 'ACTION_REPLY') + messagePort.postMessage('reply: ' + event.reply) event.notification.close(); });
diff --git a/chrome/test/data/notifications/notification_test_utils.js b/chrome/test/data/notifications/notification_test_utils.js index eab4881d..af6d93c7 100644 --- a/chrome/test/data/notifications/notification_test_utils.js +++ b/chrome/test/data/notifications/notification_test_utils.js
@@ -3,6 +3,7 @@ // found in the LICENSE file. var activatedServiceWorkerPromise = null; +var messagePort = null; // Returns a promise that will be resolved with an activated Service // Worker, or rejects when the Service Worker could not be started. There
diff --git a/chrome/test/data/policy/policy_test_cases.json b/chrome/test/data/policy/policy_test_cases.json index 1c8acf6..229aaca 100644 --- a/chrome/test/data/policy/policy_test_cases.json +++ b/chrome/test/data/policy/policy_test_cases.json
@@ -367,28 +367,65 @@ ] }, - "DisabledPlugins": { + "DisabledPlugins.0": { + "note": "This policy is deprecated. This test tests its migration path.", "os": ["win", "linux", "mac", "chromeos"], - "test_policy": { "DisabledPlugins": ["Flash"] }, + "test_policy": { "DisabledPlugins": ["*Flash*"] }, "pref_mappings": [ - { "pref": "plugins.plugins_disabled" } + { "pref": "profile.managed_default_content_settings.plugins", + "indicator_selector": "[content-setting=plugins]", + "indicator_tests": [ + { "policy": { "DisabledPlugins": ["*Flash*"] }, + "value": "block"} + ] + } ] }, - "EnabledPlugins": { + "DisabledPlugins.1": { + "note": "This policy is deprecated. This test tests its migration path.", "os": ["win", "linux", "mac", "chromeos"], - "test_policy": { "EnabledPlugins": ["Flash"] }, + "test_policy": { "DisabledPlugins": ["*PDF*"] }, "pref_mappings": [ - { "pref": "plugins.plugins_enabled" } + { "pref": "plugins.always_open_pdf_externally", + "indicator_tests": [ + { "policy": { "DisabledPlugins": ["*PDF*"] }} + ] + } + ] + }, + + "EnabledPlugins.0": { + "note": "This policy is deprecated. This test tests its migration path.", + "os": ["win", "linux", "mac", "chromeos"], + "test_policy": { "EnabledPlugins": ["*Flash*"] }, + "pref_mappings": [ + { "pref": "profile.managed_default_content_settings.plugins", + "indicator_selector": "[content-setting=plugins]", + "indicator_tests": [ + { "policy": { "EnabledPlugins": ["*Flash*"] }, + "value": "allow"} + ] + } + ] + }, + + "EnabledPlugins.1": { + "note": "This policy is deprecated. This test tests its migration path.", + "os": ["win", "linux", "mac", "chromeos"], + "test_policy": { "EnabledPlugins": ["*PDF*"] }, + "pref_mappings": [ + { "pref": "plugins.always_open_pdf_externally", + "indicator_tests": [ + { "policy": { "EnabledPlugins": ["*PDF*"] }} + ] + } ] }, "DisabledPluginsExceptions": { - "os": ["win", "linux", "mac", "chromeos"], - "test_policy": { "DisabledPluginsExceptions": ["Flash"] }, - "pref_mappings": [ - { "pref": "plugins.plugins_disabled_exceptions" } - ] + "note": "This policy is deprecated it doesn't map to a pref value anymore.", + "os": ["win", "linux", "mac", "chromeos"] }, "AlwaysOpenPdfExternally": { @@ -2613,12 +2650,12 @@ ] }, - "ReportArcStatus": { + "ReportArcStatusEnabled": { "os": ["chromeos"], "can_be_recommended": false, - "test_policy": { "ReportArcStatus": false }, + "test_policy": { "ReportArcStatusEnabled": false }, "pref_mappings": [ - { "pref": "arc.status_reporting", + { "pref": "arc.status_reporting_enabled", "local_state": true } ] },
diff --git a/chrome/test/data/prerender/prefetch_meta_csp.html b/chrome/test/data/prerender/prefetch_meta_csp.html new file mode 100644 index 0000000..4256110c --- /dev/null +++ b/chrome/test/data/prerender/prefetch_meta_csp.html
@@ -0,0 +1,14 @@ +<html> +<!-- +Check that we follow meta tag CSP restrictions when prefetching. Only +prefetch2.js should be fetched. +--> +<head> +<meta http-equiv="Content-Security-Policy" + content="script-src http://foo.bar"> +<script src="prerender/prefetch.js"></script> +<script src="http://foo.bar/prerender/prefetch2.js"></script> +</head> +<body> +</body> +</html>
diff --git a/chrome/test/data/prerender/prefetch_response_csp.html b/chrome/test/data/prerender/prefetch_response_csp.html new file mode 100644 index 0000000..6518c8d --- /dev/null +++ b/chrome/test/data/prerender/prefetch_response_csp.html
@@ -0,0 +1,12 @@ +<html> +<!-- +Check that we follow response header CSP restrictions when prefetching. +Only prefetch2.js should be fetched. +--> +<head> +<script src="prerender/prefetch.js"></script> +<script src="http://foo.bar/prerender/prefetch2.js"></script> +</head> +<body> +</body> +</html>
diff --git a/chrome/test/data/prerender/prefetch_response_csp.html.mock-http-headers b/chrome/test/data/prerender/prefetch_response_csp.html.mock-http-headers new file mode 100644 index 0000000..ed6a182 --- /dev/null +++ b/chrome/test/data/prerender/prefetch_response_csp.html.mock-http-headers
@@ -0,0 +1,2 @@ +HTTP/1.1 200 OK +Content-Security-Policy: script-src http://foo.bar
diff --git a/chrome/test/data/push_messaging/push_test.js b/chrome/test/data/push_messaging/push_test.js index 9a13360..73907ba 100644 --- a/chrome/test/data/push_messaging/push_test.js +++ b/chrome/test/data/push_messaging/push_test.js
@@ -112,19 +112,6 @@ }).catch(sendErrorToTest); } -function documentSubscribePushBadKey() { - navigator.serviceWorker.ready.then(function(swRegistration) { - var invalidApplicationServerKey = new Uint8Array(300); - invalidApplicationServerKey.fill('0x05', 1, 300); - pushSubscriptionOptions.applicationServerKey = - invalidApplicationServerKey.buffer; - return swRegistration.pushManager.subscribe(pushSubscriptionOptions) - .then(function(subscription) { - sendResultToTest(subscription.endpoint); - }); - }).catch(sendErrorToTest); -} - function workerSubscribePush() { // Send the message to the worker for it to subscribe navigator.serviceWorker.controller.postMessage({command: 'workerSubscribe'});
diff --git a/chrome/test/data/ssl/page_with_frame.html b/chrome/test/data/ssl/page_with_frame.html new file mode 100644 index 0000000..69f4c77 --- /dev/null +++ b/chrome/test/data/ssl/page_with_frame.html
@@ -0,0 +1,7 @@ +<html> + <head><title>This is a test page with frames</title> + </head> + <body> + <iframe name="navFrame" src="/title1.html" id="navFrame"></iframe> + </body> +</html>
diff --git a/chrome/test/data/webui/extensions/cr_extensions_browsertest.js b/chrome/test/data/webui/extensions/cr_extensions_browsertest.js index b7b4ef80..858964b 100644 --- a/chrome/test/data/webui/extensions/cr_extensions_browsertest.js +++ b/chrome/test/data/webui/extensions/cr_extensions_browsertest.js
@@ -38,6 +38,7 @@ extraLibraries: PolymerTest.getLibraries(ROOT_PATH).concat([ 'extension_test_util.js', 'extension_detail_view_test.js', + 'extension_error_page_test.js', 'extension_item_test.js', 'extension_item_list_test.js', 'extension_keyboard_shortcuts_test.js', @@ -275,3 +276,12 @@ extension_options_dialog_tests.registerTests(); mocha.grep(assert(extension_options_dialog_tests.TestNames.Layout)).run(); }); + +//////////////////////////////////////////////////////////////////////////////// +// Extension Error Page Tests + +TEST_F('CrExtensionsBrowserTest', 'ExtensionErrorPageLayoutTest', + function() { + extension_error_page_tests.registerTests(); + mocha.grep(assert(extension_error_page_tests.TestNames.Layout)).run(); +});
diff --git a/chrome/test/data/webui/extensions/extension_error_page_test.js b/chrome/test/data/webui/extensions/extension_error_page_test.js new file mode 100644 index 0000000..eccafc2 --- /dev/null +++ b/chrome/test/data/webui/extensions/extension_error_page_test.js
@@ -0,0 +1,124 @@ +// 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 Suite of tests for extensions-detail-view. */ +cr.define('extension_error_page_tests', function() { + /** @enum {string} */ + var TestNames = { + Layout: 'layout', + }; + + /** + * @constructor + * @extends {extension_test_util.ClickMock} + * @implements {extensions.ErrorPageDelegate} + */ + function MockErrorPageDelegate() {} + + MockErrorPageDelegate.prototype = { + __proto__: extension_test_util.ClickMock.prototype, + + /** @override */ + deleteErrors: function(extensionId, errorIds, type) {}, + }; + + function registerTests() { + suite('ExtensionItemTest', function() { + /** @type {chrome.developerPrivate.ExtensionInfo} */ + var extensionData; + + /** @type {extensions.ErrorPage} */ + var errorPage; + + /** @type {MockErrorPageDelegate} */ + var mockDelegate; + + var extensionId = 'a'.repeat(32); + + // Common data for runtime errors. + var runtimeErrorBase = { + type: chrome.developerPrivate.ErrorType.RUNTIME, + extensionId: extensionId, + fromIncognito: false, + }; + + // Common data for manifest errors. + var manifestErrorBase = { + type: chrome.developerPrivate.ErrorType.MANIFEST, + extensionId: extensionId, + fromIncognito: false, + }; + + suiteSetup(function() { + return PolymerTest.importHtml('chrome://extensions/error_page.html'); + }); + + // Initialize an extension item before each test. + setup(function() { + PolymerTest.clearBody(); + var runtimeError = Object.assign({ + source: 'source', + message: 'message', + id: 1, + severity: chrome.developerPrivate.ErrorLevel.ERROR, + }, runtimeErrorBase); + extensionData = extension_test_util.createExtensionInfo({ + runtimeErrors: [runtimeError], + manifestErrors: [], + }); + errorPage = new extensions.ErrorPage(); + mockDelegate = new MockErrorPageDelegate(); + errorPage.data = extensionData; + errorPage.delegate = mockDelegate; + document.body.appendChild(errorPage); + }); + + test(assert(TestNames.Layout), function() { + Polymer.dom.flush(); + + extension_test_util.testIronIcons(errorPage); + + var testIsVisible = extension_test_util.isVisible.bind(null, errorPage); + expectTrue(testIsVisible('#close-button')); + expectTrue(testIsVisible('#heading')); + expectTrue(testIsVisible('#errors-list')); + + var errorElems = errorPage.querySelectorAll('* /deep/ .error-item'); + expectEquals(1, errorElems.length); + var error = errorElems[0]; + expectEquals( + 'message', + error.querySelector('.error-message').textContent.trim()); + expectTrue(error.querySelector('img').classList.contains( + 'icon-severity-fatal')); + + var manifestError = Object.assign({ + source: 'manifest.json', + message: 'invalid key', + id: 2, + manifestKey: 'permissions', + }, manifestErrorBase); + errorPage.set('data.manifestErrors', [manifestError]); + Polymer.dom.flush(); + var errorElems = errorPage.querySelectorAll('* /deep/ .error-item'); + expectEquals(2, errorElems.length); + var error = errorElems[0]; + expectEquals( + 'invalid key', + error.querySelector('.error-message').textContent.trim()); + expectTrue(error.querySelector('img').classList.contains( + 'icon-severity-warning')); + + mockDelegate.testClickingCalls( + error.querySelector('.delete-button'), 'deleteErrors', + [extensionId, [manifestError.id]]); + }); + }); + } + + return { + registerTests: registerTests, + TestNames: TestNames, + }; +});
diff --git a/chrome/test/data/webui/extensions/extension_test_util.js b/chrome/test/data/webui/extensions/extension_test_util.js index d72e14c..c1908b6 100644 --- a/chrome/test/data/webui/extensions/extension_test_util.js +++ b/chrome/test/data/webui/extensions/extension_test_util.js
@@ -179,7 +179,9 @@ id: id, incognitoAccess: {isEnabled: true, isActive: false}, location: 'FROM_STORE', + manifestErrors: [], name: 'Wonderful Extension', + runtimeErrors: [], permissions: [], state: 'ENABLED', type: 'EXTENSION',
diff --git a/chrome/test/data/webui/settings/search_engines_page_test.js b/chrome/test/data/webui/settings/search_engines_page_test.js index 76dd00b..8933f98 100644 --- a/chrome/test/data/webui/settings/search_engines_page_test.js +++ b/chrome/test/data/webui/settings/search_engines_page_test.js
@@ -336,6 +336,9 @@ entry = document.createElement('settings-omnibox-extension-entry'); entry.set('engine', createSampleOmniboxExtension()); document.body.appendChild(entry); + + // Open action menu. + MockInteractions.tap(entry.$$('paper-icon-button')); }); teardown(function() { entry.remove(); });
diff --git a/chrome/test/data/webui/settings/settings_menu_test.js b/chrome/test/data/webui/settings/settings_menu_test.js index 0e6da83e..2d0adbe 100644 --- a/chrome/test/data/webui/settings/settings_menu_test.js +++ b/chrome/test/data/webui/settings/settings_menu_test.js
@@ -18,10 +18,30 @@ teardown(function() { settingsMenu.remove(); }); - test('openAdvanced', function() { - settingsMenu.fire('toggle-advanced-page', true); + test('advancedOpenedBinding', function() { + assertFalse(settingsMenu.advancedOpened); + settingsMenu.advancedOpened = true; Polymer.dom.flush(); assertTrue(settingsMenu.$.advancedPage.opened); + + settingsMenu.advancedOpened = false; + Polymer.dom.flush(); + assertFalse(settingsMenu.$.advancedPage.opened); + }); + + test('tapAdvanced', function() { + assertFalse(settingsMenu.advancedOpened); + + var advancedTrigger = settingsMenu.$$('#advancedPage .menu-trigger'); + assertTrue(!!advancedTrigger); + + MockInteractions.tap(advancedTrigger); + Polymer.dom.flush(); + assertTrue(settingsMenu.$.advancedPage.opened); + + MockInteractions.tap(advancedTrigger); + Polymer.dom.flush(); + assertFalse(settingsMenu.$.advancedPage.opened); }); test('upAndDownIcons', function() { @@ -31,12 +51,12 @@ '.menu-trigger iron-icon'); assertTrue(!!ironIconElement); - settingsMenu.fire('toggle-advanced-page', true); + settingsMenu.advancedOpened = true; Polymer.dom.flush(); var openIcon = ironIconElement.icon; assertTrue(!!openIcon); - settingsMenu.fire('toggle-advanced-page', false); + settingsMenu.advancedOpened = false; Polymer.dom.flush(); assertNotEquals(openIcon, ironIconElement.icon); });
diff --git a/chrome/test/data/webui/settings/settings_ui_browsertest.js b/chrome/test/data/webui/settings/settings_ui_browsertest.js index bc44014..7d653fd 100644 --- a/chrome/test/data/webui/settings/settings_ui_browsertest.js +++ b/chrome/test/data/webui/settings/settings_ui_browsertest.js
@@ -32,6 +32,12 @@ suiteSetup(function() { ui = assert(document.querySelector('settings-ui')); + ui.$.drawerTemplate.restamp = true; + }); + + setup(function() { + ui.$.drawerTemplate.if = false; + Polymer.dom.flush(); }); test('basic', function() { @@ -74,6 +80,37 @@ done(); }); }); + + test('advanced UIs stay in sync', function() { + var main = ui.$$('settings-main'); + assertTrue(!!main); + + assertFalse(!!ui.$$('settings-menu')); + assertFalse(ui.advancedOpened_); + assertFalse(main.advancedToggleExpanded); + + main.advancedToggleExpanded = true; + Polymer.dom.flush(); + + assertFalse(!!ui.$$('settings-menu')); + assertTrue(ui.advancedOpened_); + assertTrue(main.advancedToggleExpanded); + + ui.$.drawerTemplate.if = true; + Polymer.dom.flush(); + + var menu = ui.$$('settings-menu'); + assertTrue(!!menu); + assertTrue(menu.advancedOpened); + + MockInteractions.tap(menu.$$('#advancedPage .menu-trigger')); + Polymer.dom.flush(); + + // Check that all values are updated in unison. + assertFalse(menu.advancedOpened); + assertFalse(ui.advancedOpened_); + assertFalse(main.advancedToggleExpanded); + }); }); mocha.run();
diff --git a/chrome/test/data/webui/settings/startup_urls_page_test.js b/chrome/test/data/webui/settings/startup_urls_page_test.js index f8dd9cd..ce0aeea 100644 --- a/chrome/test/data/webui/settings/startup_urls_page_test.js +++ b/chrome/test/data/webui/settings/startup_urls_page_test.js
@@ -256,10 +256,10 @@ document.body.appendChild(element); // Bring up the popup menu for the following tests to use. - assertFalse(!!element.$$('iron-dropdown')); + assertFalse(!!element.$$('dialog[is=settings-action-menu]')); MockInteractions.tap(element.$.dots); Polymer.dom.flush(); - assertTrue(!!element.$$('iron-dropdown')); + assertTrue(!!element.$$('dialog[is=settings-action-menu]')); }); teardown(function() { element.remove(); });
diff --git a/chrome/tools/build/win/FILES.cfg b/chrome/tools/build/win/FILES.cfg index 4885bf5c..163f0b86 100644 --- a/chrome/tools/build/win/FILES.cfg +++ b/chrome/tools/build/win/FILES.cfg
@@ -439,24 +439,12 @@ # know what you're doing! The build configuration has to be modified to run # Syzygy on the target in question before adding a staging dependency here! { - 'filename': 'chrome.dll-order.json', - 'arch': ['32bit'], - 'buildtype': ['dev', 'official'], - 'optional': ['dev', 'official'], - }, - { - 'filename': 'chrome_child.dll-order.json', - 'arch': ['32bit'], - 'buildtype': ['dev', 'official'], - 'optional': ['dev', 'official'], - }, - { 'filename': 'syzygy/chrome.dll', 'arch': ['32bit'], 'buildtype': ['dev', 'official'], 'archive': 'syzygy/chrome.dll', 'filegroup': ['symsrc'], - 'optional': ['dev'], + 'optional': ['dev', 'official'], }, { 'filename': 'syzygy/chrome_child.dll', @@ -480,14 +468,14 @@ 'buildtype': ['dev', 'official'], 'archive': 'syzygy/mini_installer.exe', 'filegroup': ['symsrc'], - 'optional': ['dev'], + 'optional': ['dev', 'official'], }, { 'filename': 'syzygy/chrome.packed.7z', 'arch': ['32bit'], 'buildtype': ['dev', 'official'], 'archive': 'syzygy/chrome.packed.7z', - 'optional': ['dev'], + 'optional': ['dev', 'official'], }, { 'filename': 'syzygy/syzyasan_rtl.dll',
diff --git a/chrome/tools/build/win/syzygy/BUILD.gn b/chrome/tools/build/win/syzygy/BUILD.gn index 3efec8f..08139f1 100644 --- a/chrome/tools/build/win/syzygy/BUILD.gn +++ b/chrome/tools/build/win/syzygy/BUILD.gn
@@ -7,34 +7,10 @@ import("//build/config/sanitizers/sanitizers.gni") import("//build/win/syzygy/syzygy.gni") -assert(!syzygy_optimize || !is_syzyasan, - "Don't do both syzygy_optimize and is_syzyasan") - # Where the output binaries will be placed. syzygy_dest_dir = "$root_out_dir/syzygy" -if (syzygy_optimize) { - syzygy_optimize("chrome_dll_syzygy") { - binary_name = "chrome.dll" - deps = [ - "//chrome:main_dll", - ] - if (is_multi_dll_chrome) { - data_deps = [ - ":chrome_child_dll_syzygy", - ] - } - } - if (is_multi_dll_chrome) { - # Also instrument chrome_child.dll. - syzygy_optimize("chrome_child_dll_syzygy") { - binary_name = "chrome_child.dll" - deps = [ - "//chrome:chrome_child", - ] - } - } -} else if (is_syzyasan) { +if (is_syzyasan) { syzygy_asan("chrome_dll_syzygy") { binary_name = "chrome.dll" dest_dir = syzygy_dest_dir
diff --git a/chrome_elf/chrome_elf.def b/chrome_elf/chrome_elf.def index cbf3543..75f31ab 100644 --- a/chrome_elf/chrome_elf.def +++ b/chrome_elf/chrome_elf.def
@@ -7,6 +7,7 @@ EXPORTS IsBlacklistInitialized SignalChromeElf + SignalInitializeCrashReporting SuccessfullyBlocked GetBlacklistIndex AddDllToBlacklist
diff --git a/chrome_elf/chrome_elf_main.cc b/chrome_elf/chrome_elf_main.cc index fa60e2de4..95e0a41 100644 --- a/chrome_elf/chrome_elf_main.cc +++ b/chrome_elf/chrome_elf_main.cc
@@ -11,17 +11,23 @@ #include "chrome_elf/blacklist/blacklist.h" #include "chrome_elf/crash/crash_helper.h" +// This function is a temporary workaround for https://crbug.com/655788. We +// need to come up with a better way to initialize crash reporting that can +// happen inside DllMain(). +void SignalInitializeCrashReporting() { + if (!elf_crash::InitializeCrashReporting()) { +#ifdef _DEBUG + assert(false); +#endif // _DEBUG + } +} + void SignalChromeElf() { blacklist::ResetBeacon(); } BOOL APIENTRY DllMain(HMODULE module, DWORD reason, LPVOID reserved) { if (reason == DLL_PROCESS_ATTACH) { - if (!elf_crash::InitializeCrashReporting()) { -#ifdef _DEBUG - assert(false); -#endif // _DEBUG - } // CRT on initialization installs an exception filter which calls // TerminateProcess. We need to hook CRT's attempt to set an exception. // NOTE: Do not hook if ASan is present, or ASan will fail to install
diff --git a/chrome_elf/chrome_elf_main.h b/chrome_elf/chrome_elf_main.h index 52bf067..432c377 100644 --- a/chrome_elf/chrome_elf_main.h +++ b/chrome_elf/chrome_elf_main.h
@@ -5,6 +5,7 @@ #ifndef CHROME_ELF_CHROME_ELF_MAIN_H_ #define CHROME_ELF_CHROME_ELF_MAIN_H_ +extern "C" void SignalInitializeCrashReporting(); extern "C" void SignalChromeElf(); #endif // CHROME_ELF_CHROME_ELF_MAIN_H_
diff --git a/chromecast/browser/BUILD.gn b/chromecast/browser/BUILD.gn index 1612181..113a8b59 100644 --- a/chromecast/browser/BUILD.gn +++ b/chromecast/browser/BUILD.gn
@@ -190,6 +190,23 @@ defines = [ "HAS_OUT_OF_PROC_TEST_RUNNER" ] } +test("cast_shell_tests") { + sources = [ + "test/cast_media_blocker_test.cc", + "test/cast_test_launcher.cc", + ] + + deps = [ + ":browser", + "//base", + "//chromecast/app", + "//chromecast/base", + "//content/test:test_support", + "//mojo/edk/system", + "//testing/gtest", + ] +} + test("cast_shell_browser_test") { sources = [ "test/chromecast_shell_browser_test.cc",
diff --git a/chromecast/browser/DEPS b/chromecast/browser/DEPS index e030bf1..08f6c76 100644 --- a/chromecast/browser/DEPS +++ b/chromecast/browser/DEPS
@@ -10,6 +10,7 @@ "+components/prefs", "+content/public/browser", "+content/public/common", + "+content/public/test", "+device/geolocation", "+gin/v8_initializer.h", "+gpu/command_buffer/service/gpu_switches.h",
diff --git a/chromecast/browser/cast_media_blocker.cc b/chromecast/browser/cast_media_blocker.cc index 935dec5..9f49bab 100644 --- a/chromecast/browser/cast_media_blocker.cc +++ b/chromecast/browser/cast_media_blocker.cc
@@ -4,6 +4,7 @@ #include "chromecast/browser/cast_media_blocker.h" +#include "base/callback.h" #include "base/threading/thread_checker.h" #include "content/public/browser/web_contents.h" @@ -11,47 +12,108 @@ namespace shell { CastMediaBlocker::CastMediaBlocker(content::WebContents* web_contents) + : CastMediaBlocker::CastMediaBlocker( + web_contents, + base::Bind(&CastMediaBlocker::Suspend, base::Unretained(this)), + base::Bind(&CastMediaBlocker::Resume, base::Unretained(this))) {} + +CastMediaBlocker::CastMediaBlocker(content::WebContents* web_contents, + const base::Closure& suspend_cb, + const base::Closure& resume_cb) : content::WebContentsObserver(web_contents), - controllable_(false), - suspended_(false), - state_(UNBLOCKED) {} + suspend_cb_(suspend_cb), + resume_cb_(resume_cb), + blocked_(false), + paused_by_user_(true), + suspended_(true), + controllable_(false) {} CastMediaBlocker::~CastMediaBlocker() {} void CastMediaBlocker::BlockMediaLoading(bool blocked) { - if (blocked) { - state_ = BLOCKED; - } else if (state_ == BLOCKED) { - state_ = suspended_ ? UNBLOCKING : UNBLOCKED; - } else { + if (blocked_ == blocked) return; - } + blocked_ = blocked; UpdateMediaBlockedState(); -} -void CastMediaBlocker::UpdateMediaBlockedState() { - if (!web_contents()) { + LOG(INFO) << __FUNCTION__ << " blocked=" << blocked_ + << " suspended=" << suspended_ << " controllable=" << controllable_ + << " paused_by_user=" << paused_by_user_; + + // If blocking media, suspend if possible. + if (blocked_) { + if (!suspended_ && controllable_) { + suspend_cb_.Run(); + } return; } - if (!controllable_) { - return; - } - - if (state_ == BLOCKED && !suspended_) { - web_contents()->SuspendMediaSession(); - } else if (state_ == UNBLOCKING && suspended_) { - web_contents()->ResumeMediaSession(); - state_ = UNBLOCKED; + // If unblocking media, resume if media was not paused by user. + if (!paused_by_user_ && suspended_ && controllable_) { + paused_by_user_ = true; + resume_cb_.Run(); } } void CastMediaBlocker::MediaSessionStateChanged(bool is_controllable, bool is_suspended) { - controllable_ = is_controllable; - suspended_ = is_suspended; - UpdateMediaBlockedState(); + LOG(INFO) << __FUNCTION__ << " blocked=" << blocked_ + << " is_suspended=" << is_suspended + << " is_controllable=" << is_controllable + << " paused_by_user=" << paused_by_user_; + + // Process controllability first. + if (controllable_ != is_controllable) { + controllable_ = is_controllable; + + // If not blocked, and we regain control and the media wasn't paused when + // blocked, resume media if suspended. + if (!blocked_ && !paused_by_user_ && is_suspended && controllable_) { + paused_by_user_ = true; + resume_cb_.Run(); + } + + // Suspend if blocked and the session becomes controllable. + if (blocked_ && !is_suspended && controllable_) { + // Only suspend if suspended_ doesn't change. Otherwise, this will be + // handled in the suspended changed block. + if (suspended_ == is_suspended) + suspend_cb_.Run(); + } + } + + // Process suspended state next. + if (suspended_ != is_suspended) { + suspended_ = is_suspended; + // If blocking, suspend media whenever possible. + if (blocked_ && !suspended_) { + // If media was resumed when blocked, the user tried to play music. + paused_by_user_ = false; + if (controllable_) + suspend_cb_.Run(); + } + + // If not blocking, cache the user's play intent. + if (!blocked_) + paused_by_user_ = suspended_; + } +} + +void CastMediaBlocker::Suspend() { + if (!web_contents()) + return; + + LOG(INFO) << "Suspending media session."; + web_contents()->SuspendMediaSession(); +} + +void CastMediaBlocker::Resume() { + if (!web_contents()) + return; + + LOG(INFO) << "Resuming media session."; + web_contents()->ResumeMediaSession(); } } // namespace shell
diff --git a/chromecast/browser/cast_media_blocker.h b/chromecast/browser/cast_media_blocker.h index 042742b..b335060 100644 --- a/chromecast/browser/cast_media_blocker.h +++ b/chromecast/browser/cast_media_blocker.h
@@ -6,6 +6,7 @@ #define CHROMECAST_BROWSER_CAST_MEDIA_BLOCKER_H_ #include "base/macros.h" +#include "base/callback_forward.h" #include "content/public/browser/web_contents_observer.h" namespace content { @@ -20,36 +21,49 @@ class CastMediaBlocker : public content::WebContentsObserver { public: explicit CastMediaBlocker(content::WebContents* web_contents); + + // Constructor for test. |suspend_cb| and |resume_cb| will be called when + // Suspend() and Resume() are called. + CastMediaBlocker(content::WebContents* web_contents, + const base::Closure& suspend_cb, + const base::Closure& resume_cb); + ~CastMediaBlocker() override; // Sets if the web contents is allowed to play media or not. If media is // unblocked, previously suspended elements should begin playing again. void BlockMediaLoading(bool blocked); - protected: - bool media_loading_blocked() const { return state_ == BLOCKED; } - - // Blocks or unblocks the render process from loading new media - // according to |media_loading_blocked_|. - virtual void UpdateMediaBlockedState(); - - private: - enum BlockState { - BLOCKED, // All media playback should be blocked. - UNBLOCKING, // Media playback should be resumed at next oppurtunity. - UNBLOCKED, // Media playback should not be blocked. - }; - // content::WebContentsObserver implementation: void MediaSessionStateChanged(bool is_controllable, bool is_suspended) override; + protected: + bool media_loading_blocked() const { return blocked_; } + + // Blocks or unblocks the render process from loading new media + // according to |media_loading_blocked_|. + virtual void UpdateMediaBlockedState() {} + + private: + // Suspends or resumes the media session for the web contents. + void Suspend(); + void Resume(); + + base::Closure suspend_cb_; + base::Closure resume_cb_; + + // Whether or not media should be blocked. This value cache's the last call to + // BlockMediaLoading. Is false by default. + bool blocked_; + + // Whether or not the user paused media on the page. + bool paused_by_user_; + // Whether or not media in the app can be controlled and if media is currently // suspended. These variables cache arguments from MediaSessionStateChanged(). - bool controllable_; bool suspended_; - - BlockState state_; + bool controllable_; DISALLOW_COPY_AND_ASSIGN(CastMediaBlocker); };
diff --git a/chromecast/browser/test/DEPS b/chromecast/browser/test/DEPS index 21e63a3..5d4c5d7 100644 --- a/chromecast/browser/test/DEPS +++ b/chromecast/browser/test/DEPS
@@ -2,3 +2,9 @@ "+chromecast/app", "+content/public/test", ] + +specific_include_rules = { + "cast_test_launcher\.cc": [ + "+mojo/edk/embedder/embedder.h", + ], +}
diff --git a/chromecast/browser/test/cast_media_blocker_test.cc b/chromecast/browser/test/cast_media_blocker_test.cc new file mode 100644 index 0000000..9153ebb --- /dev/null +++ b/chromecast/browser/test/cast_media_blocker_test.cc
@@ -0,0 +1,266 @@ +// 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 "chromecast/browser/cast_media_blocker.h" + +#include <memory> + +#include "base/memory/ptr_util.h" +#include "base/bind.h" +#include "content/public/browser/web_contents.h" +#include "content/public/test/test_content_client_initializer.h" +#include "content/public/test/test_renderer_host.h" +#include "content/public/test/web_contents_tester.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace chromecast { +namespace shell { + +class MockMediaSession { + public: + MockMediaSession() {} + ~MockMediaSession() {} + + MOCK_CONST_METHOD0(Suspend, void()); + MOCK_CONST_METHOD0(Resume, void()); + + private: + DISALLOW_COPY_AND_ASSIGN(MockMediaSession); +}; + +class CastMediaBlockerTest : public content::RenderViewHostTestHarness { + public: + CastMediaBlockerTest() {} + ~CastMediaBlockerTest() override {} + + void SetUp() override { + initializer_ = base::MakeUnique<content::TestContentClientInitializer>(); + content::RenderViewHostTestHarness::SetUp(); + media_session_ = base::MakeUnique<MockMediaSession>(); + media_blocker_ = base::MakeUnique<CastMediaBlocker>( + web_contents(), base::Bind(&MockMediaSession::Suspend, + base::Unretained(media_session_.get())), + base::Bind(&MockMediaSession::Resume, + base::Unretained(media_session_.get()))); + + content::WebContentsTester::For(web_contents()) + ->NavigateAndCommit(GURL("https://www.youtube.com")); + } + + void TearDown() override { content::RenderViewHostTestHarness::TearDown(); } + + void MediaSessionChanged(bool controllable, bool suspended) { + media_blocker_->MediaSessionStateChanged(controllable, suspended); + } + + protected: + std::unique_ptr<content::TestContentClientInitializer> initializer_; + std::unique_ptr<MockMediaSession> media_session_; + std::unique_ptr<CastMediaBlocker> media_blocker_; + + private: + DISALLOW_COPY_AND_ASSIGN(CastMediaBlockerTest); +}; + +TEST_F(CastMediaBlockerTest, Block_Unblock_Suspended) { + // Testing block/unblock operations do nothing if media never plays. + EXPECT_CALL(*media_session_, Suspend()).Times(0); + EXPECT_CALL(*media_session_, Resume()).Times(0); + media_blocker_->BlockMediaLoading(true); + media_blocker_->BlockMediaLoading(false); + + MediaSessionChanged(true, true); + media_blocker_->BlockMediaLoading(true); + media_blocker_->BlockMediaLoading(false); + + media_blocker_->BlockMediaLoading(true); + MediaSessionChanged(false, true); + media_blocker_->BlockMediaLoading(false); +} + +TEST_F(CastMediaBlockerTest, No_Block) { + // Tests CastMediaBlocker does nothing if block/unblock is not called. + EXPECT_CALL(*media_session_, Suspend()).Times(0); + EXPECT_CALL(*media_session_, Resume()).Times(0); + + // Media becomes controllable/uncontrollable. + MediaSessionChanged(true, true); + MediaSessionChanged(false, true); + + // Media starts and stops. + MediaSessionChanged(false, false); + MediaSessionChanged(false, true); + + // Media starts, changes controllability and stops. + MediaSessionChanged(false, false); + MediaSessionChanged(true, false); + MediaSessionChanged(false, false); + MediaSessionChanged(false, true); + + // Media starts, changes controllability and stops. + MediaSessionChanged(false, false); + MediaSessionChanged(true, false); + MediaSessionChanged(true, true); +} + +TEST_F(CastMediaBlockerTest, Block_Before_Controllable) { + // Tests CastMediaBlocker only suspends when controllable. + EXPECT_CALL(*media_session_, Suspend()).Times(0); + EXPECT_CALL(*media_session_, Resume()).Times(0); + media_blocker_->BlockMediaLoading(true); + testing::Mock::VerifyAndClearExpectations(media_session_.get()); + + // Session becomes controllable + EXPECT_CALL(*media_session_, Suspend()).Times(1); + EXPECT_CALL(*media_session_, Resume()).Times(0); + MediaSessionChanged(true, false); +} + +TEST_F(CastMediaBlockerTest, Block_After_Controllable) { + // Tests CastMediaBlocker suspends immediately on block if controllable. + EXPECT_CALL(*media_session_, Suspend()).Times(0); + EXPECT_CALL(*media_session_, Resume()).Times(0); + MediaSessionChanged(true, false); + testing::Mock::VerifyAndClearExpectations(media_session_.get()); + + // Block when media is playing + EXPECT_CALL(*media_session_, Suspend()).Times(1); + EXPECT_CALL(*media_session_, Resume()).Times(0); + media_blocker_->BlockMediaLoading(true); + MediaSessionChanged(true, true); + testing::Mock::VerifyAndClearExpectations(media_session_.get()); + + // Unblock + EXPECT_CALL(*media_session_, Suspend()).Times(0); + EXPECT_CALL(*media_session_, Resume()).Times(1); + media_blocker_->BlockMediaLoading(false); +} + +TEST_F(CastMediaBlockerTest, Block_Multiple) { + // Tests CastMediaBlocker repeatively suspends when blocked. + EXPECT_CALL(*media_session_, Suspend()).Times(0); + EXPECT_CALL(*media_session_, Resume()).Times(0); + media_blocker_->BlockMediaLoading(true); + MediaSessionChanged(false, false); + testing::Mock::VerifyAndClearExpectations(media_session_.get()); + + EXPECT_CALL(*media_session_, Suspend()).Times(1); + EXPECT_CALL(*media_session_, Resume()).Times(0); + MediaSessionChanged(true, false); + MediaSessionChanged(true, true); + testing::Mock::VerifyAndClearExpectations(media_session_.get()); + + EXPECT_CALL(*media_session_, Suspend()).Times(1); + EXPECT_CALL(*media_session_, Resume()).Times(0); + MediaSessionChanged(true, false); + testing::Mock::VerifyAndClearExpectations(media_session_.get()); + MediaSessionChanged(true, true); + + EXPECT_CALL(*media_session_, Suspend()).Times(0); + EXPECT_CALL(*media_session_, Resume()).Times(0); + MediaSessionChanged(false, true); + MediaSessionChanged(false, false); + MediaSessionChanged(false, true); + testing::Mock::VerifyAndClearExpectations(media_session_.get()); +} + +TEST_F(CastMediaBlockerTest, Block_Unblock_Uncontrollable) { + // Tests CastMediaBlocker does not suspend or resume when uncontrollable. + EXPECT_CALL(*media_session_, Suspend()).Times(0); + EXPECT_CALL(*media_session_, Resume()).Times(0); + media_blocker_->BlockMediaLoading(true); + MediaSessionChanged(false, false); + media_blocker_->BlockMediaLoading(false); + media_blocker_->BlockMediaLoading(true); + MediaSessionChanged(false, true); + media_blocker_->BlockMediaLoading(false); + media_blocker_->BlockMediaLoading(true); + testing::Mock::VerifyAndClearExpectations(media_session_.get()); +} + +TEST_F(CastMediaBlockerTest, Block_Unblock_Uncontrollable2) { + EXPECT_CALL(*media_session_, Suspend()).Times(1); + EXPECT_CALL(*media_session_, Resume()).Times(0); + MediaSessionChanged(true, true); + media_blocker_->BlockMediaLoading(true); + MediaSessionChanged(false, true); + MediaSessionChanged(true, true); + MediaSessionChanged(true, false); + testing::Mock::VerifyAndClearExpectations(media_session_.get()); + + EXPECT_CALL(*media_session_, Suspend()).Times(1); + EXPECT_CALL(*media_session_, Resume()).Times(0); + MediaSessionChanged(false, false); + MediaSessionChanged(false, true); + MediaSessionChanged(true, true); + MediaSessionChanged(true, false); + testing::Mock::VerifyAndClearExpectations(media_session_.get()); + + EXPECT_CALL(*media_session_, Suspend()).Times(0); + EXPECT_CALL(*media_session_, Resume()).Times(0); + media_blocker_->BlockMediaLoading(false); +} + +TEST_F(CastMediaBlockerTest, Resume_When_Controllable) { + // Tests CastMediaBlocker will only resume after unblock when controllable. + EXPECT_CALL(*media_session_, Suspend()).Times(1); + EXPECT_CALL(*media_session_, Resume()).Times(0); + MediaSessionChanged(true, false); + media_blocker_->BlockMediaLoading(true); + MediaSessionChanged(true, true); + MediaSessionChanged(false, true); + media_blocker_->BlockMediaLoading(false); + testing::Mock::VerifyAndClearExpectations(media_session_.get()); + + EXPECT_CALL(*media_session_, Suspend()).Times(0); + EXPECT_CALL(*media_session_, Resume()).Times(1); + MediaSessionChanged(true, true); +} + +TEST_F(CastMediaBlockerTest, No_Resume) { + // Tests CastMediaBlocker will not resume if media starts playing by itself + // after unblock. + EXPECT_CALL(*media_session_, Suspend()).Times(1); + EXPECT_CALL(*media_session_, Resume()).Times(0); + MediaSessionChanged(true, false); + media_blocker_->BlockMediaLoading(true); + MediaSessionChanged(true, true); + MediaSessionChanged(false, true); + media_blocker_->BlockMediaLoading(false); + testing::Mock::VerifyAndClearExpectations(media_session_.get()); + + EXPECT_CALL(*media_session_, Suspend()).Times(0); + EXPECT_CALL(*media_session_, Resume()).Times(0); + MediaSessionChanged(false, false); +} + +TEST_F(CastMediaBlockerTest, Block_Before_Resume) { + // Tests CastMediaBlocker does not resume if blocked again after an unblock. + EXPECT_CALL(*media_session_, Suspend()).Times(1); + EXPECT_CALL(*media_session_, Resume()).Times(0); + MediaSessionChanged(true, false); + media_blocker_->BlockMediaLoading(true); + MediaSessionChanged(true, true); + MediaSessionChanged(false, true); + media_blocker_->BlockMediaLoading(false); + testing::Mock::VerifyAndClearExpectations(media_session_.get()); + + EXPECT_CALL(*media_session_, Suspend()).Times(0); + EXPECT_CALL(*media_session_, Resume()).Times(0); + media_blocker_->BlockMediaLoading(true); + MediaSessionChanged(true, true); +} + +TEST_F(CastMediaBlockerTest, Unblocked_Already_Playing) { + // Tests CastMediaBlocker does not resume if unblocked and media is playing. + EXPECT_CALL(*media_session_, Suspend()).Times(1); + EXPECT_CALL(*media_session_, Resume()).Times(0); + MediaSessionChanged(true, false); + media_blocker_->BlockMediaLoading(true); + media_blocker_->BlockMediaLoading(false); +} + +} // namespace shell +} // namespace chromecast
diff --git a/chromecast/browser/test/cast_test_launcher.cc b/chromecast/browser/test/cast_test_launcher.cc new file mode 100644 index 0000000..2d3ae28b2 --- /dev/null +++ b/chromecast/browser/test/cast_test_launcher.cc
@@ -0,0 +1,55 @@ +// 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 <memory> + +#include "base/bind.h" +#include "base/macros.h" +#include "base/sys_info.h" +#include "chromecast/app/cast_main_delegate.h" +#include "chromecast/base/cast_paths.h" +#include "content/public/test/content_test_suite_base.h" +#include "content/public/test/test_launcher.h" +#include "ipc/ipc_channel.h" +#include "mojo/edk/embedder/embedder.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace chromecast { +namespace shell { + +class CastTestLauncherDelegate : public content::TestLauncherDelegate { + public: + CastTestLauncherDelegate() {} + ~CastTestLauncherDelegate() override {} + + int RunTestSuite(int argc, char** argv) override { + return base::TestSuite(argc, argv).Run(); + } + + bool AdjustChildProcessCommandLine( + base::CommandLine* command_line, + const base::FilePath& temp_data_dir) override { + return true; + } + + protected: + content::ContentMainDelegate* CreateContentMainDelegate() override { + return new CastMainDelegate(); + } + + private: + DISALLOW_COPY_AND_ASSIGN(CastTestLauncherDelegate); +}; + +} // namespace shell +} // namespace chromecast + +int main(int argc, char** argv) { + int default_jobs = std::max(1, base::SysInfo::NumberOfProcessors() / 2); + chromecast::shell::CastTestLauncherDelegate launcher_delegate; + chromecast::RegisterPathProvider(); + mojo::edk::SetMaxMessageSize(IPC::Channel::kMaximumMessageSize); + mojo::edk::Init(); + return LaunchTests(&launcher_delegate, default_jobs, argc, argv); +}
diff --git a/chromecast/media/cma/pipeline/audio_decoder_software_wrapper.cc b/chromecast/media/cma/pipeline/audio_decoder_software_wrapper.cc index b40c160..8c38b8e 100644 --- a/chromecast/media/cma/pipeline/audio_decoder_software_wrapper.cc +++ b/chromecast/media/cma/pipeline/audio_decoder_software_wrapper.cc
@@ -4,6 +4,8 @@ #include "chromecast/media/cma/pipeline/audio_decoder_software_wrapper.h" +#include <ostream> + #include "base/bind.h" #include "base/logging.h" #include "base/threading/thread_task_runner_handle.h" @@ -12,6 +14,39 @@ namespace chromecast { namespace media { +namespace { + +std::ostream& operator<<(std::ostream& stream, AudioCodec codec) { + switch (codec) { + case kAudioCodecUnknown: + return stream << "unknown codec"; + case kCodecAAC: + return stream << "AAC"; + case kCodecMP3: + return stream << "MP3"; + case kCodecPCM: + return stream << "PCM"; + case kCodecPCM_S16BE: + return stream << "PCM_S16BE"; + case kCodecVorbis: + return stream << "Vorbis"; + case kCodecOpus: + return stream << "Opus"; + case kCodecEAC3: + return stream << "EAC3"; + case kCodecAC3: + return stream << "AC3"; + case kCodecDTS: + return stream << "DTS"; + case kCodecFLAC: + return stream << "FLAC"; + } + NOTREACHED(); + return stream << "UNKNOWN"; +} + +} // namespace + AudioDecoderSoftwareWrapper::AudioDecoderSoftwareWrapper( MediaPipelineBackend::AudioDecoder* backend_decoder) : backend_decoder_(backend_decoder), @@ -54,13 +89,18 @@ DCHECK(IsValidConfig(config)); if (backend_decoder_->SetConfig(config)) { + LOG(INFO) << "Using backend decoder for " << config.codec; software_decoder_.reset(); output_config_ = config; return true; } - if (!CreateSoftwareDecoder(config)) + if (!CreateSoftwareDecoder(config)) { + LOG(INFO) << "Failed to create software decoder"; return false; + } + + LOG(INFO) << "Using software decoder for " << config.codec; output_config_.codec = media::kCodecPCM; output_config_.sample_format = media::kSampleFormatS16;
diff --git a/chromecast/public/media/media_pipeline_backend.h b/chromecast/public/media/media_pipeline_backend.h index 01abfaf..7a8ff459 100644 --- a/chromecast/public/media/media_pipeline_backend.h +++ b/chromecast/public/media/media_pipeline_backend.h
@@ -57,7 +57,7 @@ virtual void OnEndOfStream() = 0; // May be called if a decoder error occurs. No more calls to PushBuffer() - // will be made after this is called. + // should be made after this is called. virtual void OnDecoderError() = 0; // Must be called when a decryption key status changes.
diff --git a/chromeos/CHROMEOS_LKGM b/chromeos/CHROMEOS_LKGM index d148364d..9679e6e 100644 --- a/chromeos/CHROMEOS_LKGM +++ b/chromeos/CHROMEOS_LKGM
@@ -1 +1 @@ -8898.0.0 \ No newline at end of file +8909.0.0 \ No newline at end of file
diff --git a/components/arc/BUILD.gn b/components/arc/BUILD.gn index 097a32a..5ff530e 100644 --- a/components/arc/BUILD.gn +++ b/components/arc/BUILD.gn
@@ -7,8 +7,6 @@ static_library("arc") { sources = [ - "arc_bridge_bootstrap.cc", - "arc_bridge_bootstrap.h", "arc_bridge_host_impl.cc", "arc_bridge_host_impl.h", "arc_bridge_service_impl.cc", @@ -17,6 +15,8 @@ "arc_features.h", "arc_service_manager.cc", "arc_service_manager.h", + "arc_session.cc", + "arc_session.h", "audio/arc_audio_bridge.cc", "audio/arc_audio_bridge.h", "bluetooth/arc_bluetooth_bridge.cc", @@ -167,10 +167,10 @@ sources = [ "test/fake_app_instance.cc", "test/fake_app_instance.h", - "test/fake_arc_bridge_bootstrap.cc", - "test/fake_arc_bridge_bootstrap.h", "test/fake_arc_bridge_service.cc", "test/fake_arc_bridge_service.h", + "test/fake_arc_session.cc", + "test/fake_arc_session.h", "test/fake_bluetooth_instance.cc", "test/fake_bluetooth_instance.h", "test/fake_intent_helper_instance.cc",
diff --git a/components/arc/arc_bridge_service.h b/components/arc/arc_bridge_service.h index 040f890..93f0767 100644 --- a/components/arc/arc_bridge_service.h +++ b/components/arc/arc_bridge_service.h
@@ -172,7 +172,7 @@ // OnConnectionEstablished() -> // READY // - // The ArcBridgeBootstrap state machine can be thought of being substates of + // The ArcSession state machine can be thought of being substates of // ArcBridgeService's CONNECTING state. // // *
diff --git a/components/arc/arc_bridge_service_impl.cc b/components/arc/arc_bridge_service_impl.cc index 388ab0ce..968511b 100644 --- a/components/arc/arc_bridge_service_impl.cc +++ b/components/arc/arc_bridge_service_impl.cc
@@ -30,15 +30,15 @@ ArcBridgeServiceImpl::ArcBridgeServiceImpl() : session_started_(false), - factory_(base::Bind(ArcBridgeBootstrap::Create)), + factory_(base::Bind(ArcSession::Create)), weak_factory_(this) { DCHECK(!g_arc_bridge_service); g_arc_bridge_service = this; } ArcBridgeServiceImpl::~ArcBridgeServiceImpl() { - if (bootstrap_) - bootstrap_->RemoveObserver(this); + if (arc_session_) + arc_session_->RemoveObserver(this); DCHECK(g_arc_bridge_service == this); g_arc_bridge_service = nullptr; @@ -62,8 +62,8 @@ PrerequisitesChanged(); } -void ArcBridgeServiceImpl::SetArcBridgeBootstrapFactoryForTesting( - const ArcBridgeBootstrapFactory& factory) { +void ArcBridgeServiceImpl::SetArcSessionFactoryForTesting( + const ArcSessionFactory& factory) { DCHECK(!factory.is_null()); factory_ = factory; } @@ -84,13 +84,13 @@ VLOG(0) << "Prerequisites met, starting ARC"; SetStopReason(StopReason::SHUTDOWN); - if (bootstrap_) - bootstrap_->RemoveObserver(this); + if (arc_session_) + arc_session_->RemoveObserver(this); SetState(State::CONNECTING); - bootstrap_ = factory_.Run(); - bootstrap_->AddObserver(this); - bootstrap_->Start(); + arc_session_ = factory_.Run(); + arc_session_->AddObserver(this); + arc_session_->Start(); } else { if (session_started_) return; @@ -110,11 +110,11 @@ reconnect_ = false; VLOG(1) << "Stopping ARC"; - DCHECK(bootstrap_.get()); + DCHECK(arc_session_.get()); SetState(State::STOPPING); // Note: this can call OnStopped() internally as a callback. - bootstrap_->Stop(); + arc_session_->Stop(); } void ArcBridgeServiceImpl::OnReady() { @@ -134,8 +134,8 @@ void ArcBridgeServiceImpl::OnStopped(StopReason stop_reason) { DCHECK(CalledOnValidThread()); VLOG(0) << "ARC stopped: " << stop_reason; - bootstrap_->RemoveObserver(this); - bootstrap_.reset(); + arc_session_->RemoveObserver(this); + arc_session_.reset(); SetStopReason(stop_reason); SetState(State::STOPPED);
diff --git a/components/arc/arc_bridge_service_impl.h b/components/arc/arc_bridge_service_impl.h index 1c3afae..7f92c68 100644 --- a/components/arc/arc_bridge_service_impl.h +++ b/components/arc/arc_bridge_service_impl.h
@@ -12,8 +12,8 @@ #include "base/files/scoped_file.h" #include "base/gtest_prod_util.h" #include "base/macros.h" -#include "components/arc/arc_bridge_bootstrap.h" #include "components/arc/arc_bridge_service.h" +#include "components/arc/arc_session.h" #include "mojo/public/cpp/bindings/binding.h" namespace base { @@ -25,12 +25,11 @@ // Real IPC based ArcBridgeService that is used in production. class ArcBridgeServiceImpl : public ArcBridgeService, - public ArcBridgeBootstrap::Observer { + public ArcSession::Observer { public: - // This is the factory interface to inject ArcBridgeBootstrap instance + // This is the factory interface to inject ArcSession instance // for testing purpose. - using ArcBridgeBootstrapFactory = - base::Callback<std::unique_ptr<ArcBridgeBootstrap>()>; + using ArcSessionFactory = base::Callback<std::unique_ptr<ArcSession>()>; ArcBridgeServiceImpl(); ~ArcBridgeServiceImpl() override; @@ -39,13 +38,12 @@ void Shutdown() override; - // Inject a factory to create ArcBridgeBootstrap instance for testing - // purpose. |factory| must not be null. - void SetArcBridgeBootstrapFactoryForTesting( - const ArcBridgeBootstrapFactory& factory); + // Inject a factory to create ArcSession instance for testing purpose. + // |factory| must not be null. + void SetArcSessionFactoryForTesting(const ArcSessionFactory& factory); - // Returns the current bootstrap instance for testing purpose. - ArcBridgeBootstrap* GetBootstrapForTesting() { return bootstrap_.get(); } + // Returns the current ArcSession instance for testing purpose. + ArcSession* GetArcSessionForTesting() { return arc_session_.get(); } // Normally, reconnecting after connection shutdown happens after a short // delay. When testing, however, we'd like it to happen immediately to avoid @@ -65,11 +63,11 @@ // Stops the running instance. void StopInstance(); - // ArcBridgeBootstrap::Observer: + // ArcSession::Observer: void OnReady() override; void OnStopped(StopReason reason) override; - std::unique_ptr<ArcBridgeBootstrap> bootstrap_; + std::unique_ptr<ArcSession> arc_session_; // If the user's session has started. bool session_started_; @@ -81,8 +79,8 @@ // Delay the reconnection. bool use_delay_before_reconnecting_ = true; - // Factory to inject a fake ArcBridgeBootstrap instance for testing. - ArcBridgeBootstrapFactory factory_; + // Factory to inject a fake ArcSession instance for testing. + ArcSessionFactory factory_; // WeakPtrFactory to use callbacks. base::WeakPtrFactory<ArcBridgeServiceImpl> weak_factory_;
diff --git a/components/arc/arc_bridge_service_unittest.cc b/components/arc/arc_bridge_service_unittest.cc index 8eb7e47..8bc3de78 100644 --- a/components/arc/arc_bridge_service_unittest.cc +++ b/components/arc/arc_bridge_service_unittest.cc
@@ -12,7 +12,7 @@ #include "base/single_thread_task_runner.h" #include "chromeos/dbus/dbus_thread_manager.h" #include "components/arc/arc_bridge_service_impl.h" -#include "components/arc/test/fake_arc_bridge_bootstrap.h" +#include "components/arc/test/fake_arc_session.h" #include "mojo/public/cpp/system/message_pipe.h" #include "testing/gtest/include/gtest/gtest.h" @@ -46,26 +46,25 @@ bool ready() const { return ready_; } ArcBridgeService::State state() const { return state_; } - FakeArcBridgeBootstrap* bootstrap() const { - return static_cast<FakeArcBridgeBootstrap*>( - service_->GetBootstrapForTesting()); + FakeArcSession* arc_session() const { + return static_cast<FakeArcSession*>(service_->GetArcSessionForTesting()); } protected: std::unique_ptr<ArcBridgeServiceImpl> service_; ArcBridgeService::StopReason stop_reason_; - static std::unique_ptr<ArcBridgeBootstrap> CreateSuspendedBootstrap() { - auto bootstrap = base::MakeUnique<FakeArcBridgeBootstrap>(); - bootstrap->SuspendBoot(); - return std::move(bootstrap); + static std::unique_ptr<ArcSession> CreateSuspendedArcSession() { + auto arc_session = base::MakeUnique<FakeArcSession>(); + arc_session->SuspendBoot(); + return std::move(arc_session); } - static std::unique_ptr<ArcBridgeBootstrap> CreateBootFailureBootstrap( + static std::unique_ptr<ArcSession> CreateBootFailureArcSession( ArcBridgeService::StopReason reason) { - auto bootstrap = base::MakeUnique<FakeArcBridgeBootstrap>(); - bootstrap->EnableBootFailureEmulation(reason); - return std::move(bootstrap); + auto arc_session = base::MakeUnique<FakeArcSession>(); + arc_session->EnableBootFailureEmulation(reason); + return std::move(arc_session); } private: @@ -77,8 +76,8 @@ stop_reason_ = ArcBridgeService::StopReason::SHUTDOWN; service_.reset(new ArcBridgeServiceImpl()); - service_->SetArcBridgeBootstrapFactoryForTesting( - base::Bind(FakeArcBridgeBootstrap::Create)); + service_->SetArcSessionFactoryForTesting( + base::Bind(FakeArcSession::Create)); service_->AddObserver(this); } @@ -114,8 +113,8 @@ TEST_F(ArcBridgeTest, ShutdownMidStartup) { ASSERT_FALSE(ready()); - service_->SetArcBridgeBootstrapFactoryForTesting( - base::Bind(ArcBridgeTest::CreateSuspendedBootstrap)); + service_->SetArcSessionFactoryForTesting( + base::Bind(ArcBridgeTest::CreateSuspendedArcSession)); service_->HandleStartup(); ASSERT_FALSE(service_->stopped()); ASSERT_FALSE(service_->ready()); @@ -129,8 +128,8 @@ TEST_F(ArcBridgeTest, BootFailure) { ASSERT_TRUE(service_->stopped()); - service_->SetArcBridgeBootstrapFactoryForTesting( - base::Bind(ArcBridgeTest::CreateBootFailureBootstrap, + service_->SetArcSessionFactoryForTesting( + base::Bind(ArcBridgeTest::CreateBootFailureArcSession, ArcBridgeService::StopReason::GENERIC_BOOT_FAILURE)); service_->HandleStartup(); EXPECT_EQ(ArcBridgeService::StopReason::GENERIC_BOOT_FAILURE, stop_reason_); @@ -146,8 +145,8 @@ // Simulate a connection loss. service_->DisableReconnectDelayForTesting(); - ASSERT_TRUE(bootstrap()); - bootstrap()->StopWithReason(ArcBridgeService::StopReason::CRASH); + ASSERT_TRUE(arc_session()); + arc_session()->StopWithReason(ArcBridgeService::StopReason::CRASH); ASSERT_TRUE(service_->ready()); service_->Shutdown(); @@ -163,15 +162,15 @@ ASSERT_EQ(ArcBridgeService::State::READY, state()); // Simulate boot failure. - ASSERT_TRUE(bootstrap()); - bootstrap()->StopWithReason( + ASSERT_TRUE(arc_session()); + arc_session()->StopWithReason( ArcBridgeService::StopReason::GENERIC_BOOT_FAILURE); EXPECT_EQ(ArcBridgeService::StopReason::GENERIC_BOOT_FAILURE, stop_reason_); ASSERT_TRUE(service_->ready()); // Simulate crash. - ASSERT_TRUE(bootstrap()); - bootstrap()->StopWithReason(ArcBridgeService::StopReason::CRASH); + ASSERT_TRUE(arc_session()); + arc_session()->StopWithReason(ArcBridgeService::StopReason::CRASH); EXPECT_EQ(ArcBridgeService::StopReason::CRASH, stop_reason_); ASSERT_TRUE(service_->ready());
diff --git a/components/arc/arc_bridge_bootstrap.cc b/components/arc/arc_session.cc similarity index 88% rename from components/arc/arc_bridge_bootstrap.cc rename to components/arc/arc_session.cc index 3666abc..b40f703c 100644 --- a/components/arc/arc_bridge_bootstrap.cc +++ b/components/arc/arc_session.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "components/arc/arc_bridge_bootstrap.h" +#include "components/arc/arc_session.h" #include <fcntl.h> #include <grp.h> @@ -106,11 +106,11 @@ // TODO(hidehiko): Refactor more to make this class unittest-able, for at least // state-machine part. -class ArcBridgeBootstrapImpl : public ArcBridgeBootstrap, - public chromeos::SessionManagerClient::Observer { +class ArcSessionImpl : public ArcSession, + public chromeos::SessionManagerClient::Observer { public: - // The possible states of the bootstrap connection. In the normal flow, - // the state changes in the following sequence: + // The possible states of the session. In the normal flow, the state changes + // in the following sequence: // // NOT_STARTED // Start() -> @@ -199,16 +199,16 @@ STOPPED, }; - ArcBridgeBootstrapImpl(); - ~ArcBridgeBootstrapImpl() override; + ArcSessionImpl(); + ~ArcSessionImpl() override; - // ArcBridgeBootstrap: + // ArcSession overrides: void Start() override; void Stop() override; private: - // Creates the UNIX socket on the bootstrap thread and then processes its - // file descriptor. + // Creates the UNIX socket on a worker pool and then processes its file + // descriptor. static base::ScopedFD CreateSocket(); void OnSocketCreated(base::ScopedFD fd); @@ -231,7 +231,7 @@ // Completes the termination procedure. void OnStopped(ArcBridgeService::StopReason reason); - // The state of the bootstrap connection. + // The state of the session. State state_ = State::NOT_STARTED; // When Stop() is called, this flag is set. @@ -247,21 +247,20 @@ base::ThreadChecker thread_checker_; // WeakPtrFactory to use callbacks. - base::WeakPtrFactory<ArcBridgeBootstrapImpl> weak_factory_; + base::WeakPtrFactory<ArcSessionImpl> weak_factory_; private: - DISALLOW_COPY_AND_ASSIGN(ArcBridgeBootstrapImpl); + DISALLOW_COPY_AND_ASSIGN(ArcSessionImpl); }; -ArcBridgeBootstrapImpl::ArcBridgeBootstrapImpl() - : weak_factory_(this) { +ArcSessionImpl::ArcSessionImpl() : weak_factory_(this) { chromeos::SessionManagerClient* client = GetSessionManagerClient(); if (client == nullptr) return; client->AddObserver(this); } -ArcBridgeBootstrapImpl::~ArcBridgeBootstrapImpl() { +ArcSessionImpl::~ArcSessionImpl() { DCHECK(thread_checker_.CalledOnValidThread()); // TODO(hidehiko): CHECK if |state_| is in NOT_STARTED or STOPPED. // Currently, specifically on shutdown, the state_ can be any value. @@ -271,7 +270,7 @@ client->RemoveObserver(this); } -void ArcBridgeBootstrapImpl::Start() { +void ArcSessionImpl::Start() { DCHECK(thread_checker_.CalledOnValidThread()); DCHECK_EQ(state_, State::NOT_STARTED); VLOG(2) << "Starting ARC session."; @@ -280,13 +279,12 @@ state_ = State::CREATING_SOCKET; base::PostTaskAndReplyWithResult( base::WorkerPool::GetTaskRunner(true).get(), FROM_HERE, - base::Bind(&ArcBridgeBootstrapImpl::CreateSocket), - base::Bind(&ArcBridgeBootstrapImpl::OnSocketCreated, - weak_factory_.GetWeakPtr())); + base::Bind(&ArcSessionImpl::CreateSocket), + base::Bind(&ArcSessionImpl::OnSocketCreated, weak_factory_.GetWeakPtr())); } // static -base::ScopedFD ArcBridgeBootstrapImpl::CreateSocket() { +base::ScopedFD ArcSessionImpl::CreateSocket() { base::FilePath socket_path(kArcBridgeSocketPath); int raw_fd = -1; @@ -323,7 +321,7 @@ return socket_fd; } -void ArcBridgeBootstrapImpl::OnSocketCreated(base::ScopedFD socket_fd) { +void ArcSessionImpl::OnSocketCreated(base::ScopedFD socket_fd) { DCHECK(thread_checker_.CalledOnValidThread()); DCHECK_EQ(state_, State::CREATING_SOCKET); @@ -352,14 +350,13 @@ chromeos::SessionManagerClient* session_manager_client = chromeos::DBusThreadManager::Get()->GetSessionManagerClient(); session_manager_client->StartArcInstance( - cryptohome_id, - disable_boot_completed_broadcast, - base::Bind(&ArcBridgeBootstrapImpl::OnInstanceStarted, - weak_factory_.GetWeakPtr(), base::Passed(&socket_fd))); + cryptohome_id, disable_boot_completed_broadcast, + base::Bind(&ArcSessionImpl::OnInstanceStarted, weak_factory_.GetWeakPtr(), + base::Passed(&socket_fd))); } -void ArcBridgeBootstrapImpl::OnInstanceStarted(base::ScopedFD socket_fd, - StartArcInstanceResult result) { +void ArcSessionImpl::OnInstanceStarted(base::ScopedFD socket_fd, + StartArcInstanceResult result) { DCHECK(thread_checker_.CalledOnValidThread()); if (state_ == State::STOPPED) { // This is the case that error is notified via DBus before the @@ -401,15 +398,14 @@ base::PostTaskAndReplyWithResult( base::WorkerPool::GetTaskRunner(true).get(), FROM_HERE, - base::Bind(&ArcBridgeBootstrapImpl::ConnectMojo, base::Passed(&socket_fd), + base::Bind(&ArcSessionImpl::ConnectMojo, base::Passed(&socket_fd), base::Passed(&cancel_fd)), - base::Bind(&ArcBridgeBootstrapImpl::OnMojoConnected, - weak_factory_.GetWeakPtr())); + base::Bind(&ArcSessionImpl::OnMojoConnected, weak_factory_.GetWeakPtr())); } // static -base::ScopedFD ArcBridgeBootstrapImpl::ConnectMojo(base::ScopedFD socket_fd, - base::ScopedFD cancel_fd) { +base::ScopedFD ArcSessionImpl::ConnectMojo(base::ScopedFD socket_fd, + base::ScopedFD cancel_fd) { if (!WaitForSocketReadable(socket_fd.get(), cancel_fd.get())) { VLOG(1) << "Mojo connection was cancelled."; return base::ScopedFD(); @@ -444,7 +440,7 @@ return scoped_fd; } -void ArcBridgeBootstrapImpl::OnMojoConnected(base::ScopedFD fd) { +void ArcSessionImpl::OnMojoConnected(base::ScopedFD fd) { DCHECK(thread_checker_.CalledOnValidThread()); if (state_ == State::STOPPED) { @@ -487,7 +483,7 @@ observer.OnReady(); } -void ArcBridgeBootstrapImpl::Stop() { +void ArcSessionImpl::Stop() { DCHECK(thread_checker_.CalledOnValidThread()); VLOG(2) << "Stopping ARC session is requested."; @@ -536,7 +532,7 @@ } } -void ArcBridgeBootstrapImpl::StopArcInstance() { +void ArcSessionImpl::StopArcInstance() { DCHECK(thread_checker_.CalledOnValidThread()); DCHECK(state_ == State::STARTING_INSTANCE || state_ == State::CONNECTING_MOJO || state_ == State::RUNNING); @@ -549,7 +545,7 @@ base::Bind(&DoNothingInstanceStopped)); } -void ArcBridgeBootstrapImpl::ArcInstanceStopped(bool clean) { +void ArcSessionImpl::ArcInstanceStopped(bool clean) { DCHECK(thread_checker_.CalledOnValidThread()); VLOG(1) << "Notified that ARC instance is stopped " << (clean ? "cleanly" : "uncleanly"); @@ -575,7 +571,7 @@ OnStopped(reason); } -void ArcBridgeBootstrapImpl::OnStopped(ArcBridgeService::StopReason reason) { +void ArcSessionImpl::OnStopped(ArcBridgeService::StopReason reason) { DCHECK(thread_checker_.CalledOnValidThread()); // OnStopped() should be called once per instance. DCHECK_NE(state_, State::STOPPED); @@ -588,20 +584,20 @@ } // namespace -ArcBridgeBootstrap::ArcBridgeBootstrap() = default; -ArcBridgeBootstrap::~ArcBridgeBootstrap() = default; +ArcSession::ArcSession() = default; +ArcSession::~ArcSession() = default; -void ArcBridgeBootstrap::AddObserver(Observer* observer) { +void ArcSession::AddObserver(Observer* observer) { observer_list_.AddObserver(observer); } -void ArcBridgeBootstrap::RemoveObserver(Observer* observer) { +void ArcSession::RemoveObserver(Observer* observer) { observer_list_.RemoveObserver(observer); } // static -std::unique_ptr<ArcBridgeBootstrap> ArcBridgeBootstrap::Create() { - return base::MakeUnique<ArcBridgeBootstrapImpl>(); +std::unique_ptr<ArcSession> ArcSession::Create() { + return base::MakeUnique<ArcSessionImpl>(); } } // namespace arc
diff --git a/components/arc/arc_bridge_bootstrap.h b/components/arc/arc_session.h similarity index 67% rename from components/arc/arc_bridge_bootstrap.h rename to components/arc/arc_session.h index c9f6dd7..0e6e34b9 100644 --- a/components/arc/arc_bridge_bootstrap.h +++ b/components/arc/arc_session.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef COMPONENTS_ARC_ARC_BRIDGE_BOOTSTRAP_H_ -#define COMPONENTS_ARC_ARC_BRIDGE_BOOTSTRAP_H_ +#ifndef COMPONENTS_ARC_ARC_SESSION_H_ +#define COMPONENTS_ARC_ARC_SESSION_H_ #include <memory> @@ -22,9 +22,7 @@ // OnStopped() is called. // The number of instances must be at most one. Otherwise, ARC instances will // conflict. -// TODO(hidehiko): This class manages more than "bootstrap" procedure now. -// Rename this to ArcSession. -class ArcBridgeBootstrap { +class ArcSession { public: class Observer { public: @@ -42,14 +40,13 @@ DISALLOW_COPY_AND_ASSIGN(Observer); }; - // Creates a default instance of ArcBridgeBootstrap. - static std::unique_ptr<ArcBridgeBootstrap> Create(); - virtual ~ArcBridgeBootstrap(); + // Creates a default instance of ArcSession. + static std::unique_ptr<ArcSession> Create(); + virtual ~ArcSession(); - // Starts and bootstraps a connection with the instance. The Delegate's - // OnConnectionEstablished() will be called if the bootstrapping is - // successful, or OnStopped() if it is not. - // Start() should not be called twice or more. + // Starts and bootstraps a connection with the instance. The Observer's + // OnReady() will be called if the bootstrapping is successful, or + // OnStopped() if it is not. Start() should not be called twice or more. virtual void Start() = 0; // Requests to stop the currently-running instance. @@ -60,14 +57,14 @@ void RemoveObserver(Observer* observer); protected: - ArcBridgeBootstrap(); + ArcSession(); base::ObserverList<Observer> observer_list_; private: - DISALLOW_COPY_AND_ASSIGN(ArcBridgeBootstrap); + DISALLOW_COPY_AND_ASSIGN(ArcSession); }; } // namespace arc -#endif // COMPONENTS_ARC_ARC_BRIDGE_BOOTSTRAP_H_ +#endif // COMPONENTS_ARC_ARC_SESSION_H_
diff --git a/components/arc/test/fake_arc_bridge_bootstrap.cc b/components/arc/test/fake_arc_session.cc similarity index 62% rename from components/arc/test/fake_arc_bridge_bootstrap.cc rename to components/arc/test/fake_arc_session.cc index 28b04a02..486068e 100644 --- a/components/arc/test/fake_arc_bridge_bootstrap.cc +++ b/components/arc/test/fake_arc_session.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "components/arc/test/fake_arc_bridge_bootstrap.h" +#include "components/arc/test/fake_arc_session.h" #include <memory> @@ -11,11 +11,11 @@ namespace arc { -FakeArcBridgeBootstrap::FakeArcBridgeBootstrap() = default; +FakeArcSession::FakeArcSession() = default; -FakeArcBridgeBootstrap::~FakeArcBridgeBootstrap() = default; +FakeArcSession::~FakeArcSession() = default; -void FakeArcBridgeBootstrap::Start() { +void FakeArcSession::Start() { if (boot_failure_emulation_enabled_) { for (auto& observer : observer_list_) observer.OnStopped(boot_failure_reason_); @@ -25,17 +25,16 @@ } } -void FakeArcBridgeBootstrap::Stop() { +void FakeArcSession::Stop() { StopWithReason(ArcBridgeService::StopReason::SHUTDOWN); } -void FakeArcBridgeBootstrap::StopWithReason( - ArcBridgeService::StopReason reason) { +void FakeArcSession::StopWithReason(ArcBridgeService::StopReason reason) { for (auto& observer : observer_list_) observer.OnStopped(reason); } -void FakeArcBridgeBootstrap::EnableBootFailureEmulation( +void FakeArcSession::EnableBootFailureEmulation( ArcBridgeService::StopReason reason) { DCHECK(!boot_failure_emulation_enabled_); DCHECK(!boot_suspended_); @@ -44,7 +43,7 @@ boot_failure_reason_ = reason; } -void FakeArcBridgeBootstrap::SuspendBoot() { +void FakeArcSession::SuspendBoot() { DCHECK(!boot_failure_emulation_enabled_); DCHECK(!boot_suspended_); @@ -52,8 +51,8 @@ } // static -std::unique_ptr<ArcBridgeBootstrap> FakeArcBridgeBootstrap::Create() { - return base::MakeUnique<FakeArcBridgeBootstrap>(); +std::unique_ptr<ArcSession> FakeArcSession::Create() { + return base::MakeUnique<FakeArcSession>(); } } // namespace arc
diff --git a/components/arc/test/fake_arc_bridge_bootstrap.h b/components/arc/test/fake_arc_session.h similarity index 60% rename from components/arc/test/fake_arc_bridge_bootstrap.h rename to components/arc/test/fake_arc_session.h index 2e3253d..a8f6ed04 100644 --- a/components/arc/test/fake_arc_bridge_bootstrap.h +++ b/components/arc/test/fake_arc_session.h
@@ -2,23 +2,23 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef COMPONENTS_ARC_TEST_FAKE_ARC_BRIDGE_BOOTSTRAP_H_ -#define COMPONENTS_ARC_TEST_FAKE_ARC_BRIDGE_BOOTSTRAP_H_ +#ifndef COMPONENTS_ARC_TEST_FAKE_ARC_SESSION_H_ +#define COMPONENTS_ARC_TEST_FAKE_ARC_SESSION_H_ #include <memory> #include "base/macros.h" -#include "components/arc/arc_bridge_bootstrap.h" +#include "components/arc/arc_session.h" namespace arc { -// A fake ArcBridgeBootstrap that creates a local connection. -class FakeArcBridgeBootstrap : public ArcBridgeBootstrap { +// A fake ArcSession that creates a local connection. +class FakeArcSession : public ArcSession { public: - FakeArcBridgeBootstrap(); - ~FakeArcBridgeBootstrap() override; + FakeArcSession(); + ~FakeArcSession() override; - // ArcBridgeBootstrap: + // ArcSession overrides: void Start() override; void Stop() override; @@ -34,9 +34,9 @@ // Emulate Start() is suspended at some phase, before OnReady() is invoked. void SuspendBoot(); - // Returns FakeArcBridgeBootstrap instance. This can be used for a factory + // Returns FakeArcSession instance. This can be used for a factory // in ArcBridgeServiceImpl. - static std::unique_ptr<ArcBridgeBootstrap> Create(); + static std::unique_ptr<ArcSession> Create(); private: bool boot_failure_emulation_enabled_ = false; @@ -44,9 +44,9 @@ bool boot_suspended_ = false; - DISALLOW_COPY_AND_ASSIGN(FakeArcBridgeBootstrap); + DISALLOW_COPY_AND_ASSIGN(FakeArcSession); }; } // namespace arc -#endif // COMPONENTS_ARC_TEST_FAKE_ARC_BRIDGE_BOOTSTRAP_H_ +#endif // COMPONENTS_ARC_TEST_FAKE_ARC_SESSION_H_
diff --git a/components/autofill/content/browser/content_autofill_driver.cc b/components/autofill/content/browser/content_autofill_driver.cc index 8332c65..c064878 100644 --- a/components/autofill/content/browser/content_autofill_driver.cc +++ b/components/autofill/content/browser/content_autofill_driver.cc
@@ -170,6 +170,15 @@ return new_box; } +void ContentAutofillDriver::DidInteractWithCreditCardForm() { + // Notify the WebContents about credit card inputs on HTTP pages. + content::WebContents* contents = + content::WebContents::FromRenderFrameHost(render_frame_host_); + if (contents->GetVisibleURL().SchemeIsCryptographic()) + return; + contents->OnCreditCardInputShownOnHttp(); +} + // mojom::AutofillDriver: void ContentAutofillDriver::FirstUserGestureObserved() { client_->OnFirstUserGestureObserved();
diff --git a/components/autofill/content/browser/content_autofill_driver.h b/components/autofill/content/browser/content_autofill_driver.h index 02b037ea..e5740f57 100644 --- a/components/autofill/content/browser/content_autofill_driver.h +++ b/components/autofill/content/browser/content_autofill_driver.h
@@ -68,6 +68,7 @@ void PopupHidden() override; gfx::RectF TransformBoundingBoxToViewportCoordinates( const gfx::RectF& bounding_box) override; + void DidInteractWithCreditCardForm() override; // mojom::AutofillDriver: void FirstUserGestureObserved() override;
diff --git a/components/autofill/content/browser/content_autofill_driver_unittest.cc b/components/autofill/content/browser/content_autofill_driver_unittest.cc index 5feba336..82dd2f6 100644 --- a/components/autofill/content/browser/content_autofill_driver_unittest.cc +++ b/components/autofill/content/browser/content_autofill_driver_unittest.cc
@@ -22,6 +22,8 @@ #include "components/autofill/core/common/form_data_predictions.h" #include "content/public/browser/browser_context.h" #include "content/public/browser/navigation_details.h" +#include "content/public/browser/navigation_entry.h" +#include "content/public/browser/ssl_status.h" #include "content/public/browser/storage_partition.h" #include "content/public/browser/web_contents.h" #include "content/public/common/frame_navigate_params.h" @@ -447,4 +449,34 @@ EXPECT_EQ(input_value, output_value); } +// Tests that credit card form interactions are recorded on the current +// NavigationEntry's SSLStatus if the page is HTTP. +TEST_F(ContentAutofillDriverTest, CreditCardFormInteraction) { + GURL url("http://example.test"); + NavigateAndCommit(url); + driver_->DidInteractWithCreditCardForm(); + + content::NavigationEntry* entry = + web_contents()->GetController().GetVisibleEntry(); + ASSERT_TRUE(entry); + EXPECT_EQ(url, entry->GetURL()); + EXPECT_TRUE(!!(entry->GetSSL().content_status & + content::SSLStatus::DISPLAYED_CREDIT_CARD_FIELD_ON_HTTP)); +} + +// Tests that credit card form interactions are *not* recorded on the current +// NavigationEntry's SSLStatus if the page is *not* HTTP. +TEST_F(ContentAutofillDriverTest, CreditCardFormInteractionOnHTTPS) { + GURL url("https://example.test"); + NavigateAndCommit(url); + driver_->DidInteractWithCreditCardForm(); + + content::NavigationEntry* entry = + web_contents()->GetController().GetVisibleEntry(); + ASSERT_TRUE(entry); + EXPECT_EQ(url, entry->GetURL()); + EXPECT_FALSE(!!(entry->GetSSL().content_status & + content::SSLStatus::DISPLAYED_CREDIT_CARD_FIELD_ON_HTTP)); +} + } // namespace autofill
diff --git a/components/autofill/content/renderer/form_autofill_util.h b/components/autofill/content/renderer/form_autofill_util.h index 89bf5077..d268c7c 100644 --- a/components/autofill/content/renderer/form_autofill_util.h +++ b/components/autofill/content/renderer/form_autofill_util.h
@@ -11,7 +11,7 @@ #include "base/macros.h" #include "base/strings/string16.h" -#include <components/autofill/content/renderer/password_form_conversion_utils.h> +#include "components/autofill/content/renderer/password_form_conversion_utils.h" #include "components/autofill/core/common/autofill_constants.h" #include "components/autofill/core/common/password_form_field_prediction_map.h" #include "third_party/WebKit/public/platform/WebVector.h"
diff --git a/components/autofill/content/renderer/password_form_conversion_utils.h b/components/autofill/content/renderer/password_form_conversion_utils.h index 235c9b5..4101dcb 100644 --- a/components/autofill/content/renderer/password_form_conversion_utils.h +++ b/components/autofill/content/renderer/password_form_conversion_utils.h
@@ -9,7 +9,7 @@ #include <memory> #include <vector> -#include <components/autofill/core/common/password_form.h> +#include "components/autofill/core/common/password_form.h" #include "components/autofill/core/common/password_form_field_prediction_map.h" #include "third_party/WebKit/public/platform/WebString.h" #include "url/gurl.h"
diff --git a/components/autofill/core/browser/BUILD.gn b/components/autofill/core/browser/BUILD.gn index fc1655ed..07975cb7 100644 --- a/components/autofill/core/browser/BUILD.gn +++ b/components/autofill/core/browser/BUILD.gn
@@ -343,8 +343,8 @@ "//components/signin/core/common", "//components/strings", "//components/sync", - "//components/sync:test_support_sync_driver", - "//components/sync:test_support_sync_model", + "//components/sync:test_support_driver", + "//components/sync:test_support_model", "//components/variations", "//components/webdata/common", "//components/webdata_services:test_support",
diff --git a/components/autofill/core/browser/autofill_assistant.cc b/components/autofill/core/browser/autofill_assistant.cc index b7f00b5a..39dcbba1 100644 --- a/components/autofill/core/browser/autofill_assistant.cc +++ b/components/autofill/core/browser/autofill_assistant.cc
@@ -30,7 +30,8 @@ if (form_structures.empty() || credit_card_form_data_ != nullptr || !IsAutofillCreditCardAssistEnabled() || !autofill_manager_->client()->IsContextSecure( - form_structures.front()->source_url())) { + form_structures.front()->source_url()) || + !form_structures.front()->target_url().SchemeIs("https")) { return false; }
diff --git a/components/autofill/core/browser/autofill_assistant_unittest.cc b/components/autofill/core/browser/autofill_assistant_unittest.cc index 16176f2..fa48977 100644 --- a/components/autofill/core/browser/autofill_assistant_unittest.cc +++ b/components/autofill/core/browser/autofill_assistant_unittest.cc
@@ -23,6 +23,7 @@ #include "components/autofill/core/common/autofill_constants.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" +#include "url/gurl.h" using testing::_; @@ -63,14 +64,13 @@ void EnableAutofillCreditCardAssist() { scoped_feature_list_.InitAndEnableFeature(kAutofillCreditCardAssist); - autofill_client_.set_is_context_secure(true); } - // Returns an initialized FormStructure with credit card form data. To be - // owned by the caller. - std::unique_ptr<FormStructure> CreateValidCreditCardForm() { - std::unique_ptr<FormStructure> form_structure; + // Returns a valid credit card form. + FormData CreateValidCreditCardFormData() { FormData form; + form.origin = GURL("https://myform.com"); + form.action = GURL("https://myform.com/submit"); FormFieldData field; field.form_control_type = "text"; @@ -95,9 +95,15 @@ field.name = base::ASCIIToUTF16("verification"); form.fields.push_back(field); - form_structure.reset(new FormStructure(form)); - form_structure->DetermineHeuristicTypes(); + return form; + } + // Returns an initialized FormStructure with credit card form data. To be + // owned by the caller. + std::unique_ptr<FormStructure> CreateValidCreditCardForm() { + std::unique_ptr<FormStructure> form_structure; + form_structure.reset(new FormStructure(CreateValidCreditCardFormData())); + form_structure->DetermineHeuristicTypes(); return form_structure; } @@ -142,17 +148,30 @@ // contexts. TEST_F(AutofillAssistantTest, CanShowCreditCardAssist_FeatureOn_NotSecure) { EnableAutofillCreditCardAssist(); - std::unique_ptr<FormStructure> form_structure = CreateValidCreditCardForm(); - std::vector<FormStructure*> form_structures; - form_structures.push_back(form_structure.get()); - // Cannot be shown if the context is not secure. - autofill_client_.set_is_context_secure(false); - EXPECT_FALSE(autofill_assistant_.CanShowCreditCardAssist(form_structures)); + { + // Cannot be shown if the context is not secure. + FormData form = CreateValidCreditCardFormData(); + form.action = GURL("http://myform.com"); + form.action = GURL("http://myform.com/submit"); + std::unique_ptr<FormStructure> form_structure(new FormStructure(form)); + form_structure->DetermineHeuristicTypes(); - // Can be shown if the context is secure. - autofill_client_.set_is_context_secure(true); - EXPECT_TRUE(autofill_assistant_.CanShowCreditCardAssist(form_structures)); + std::vector<FormStructure*> form_structures; + form_structures.push_back(form_structure.get()); + EXPECT_FALSE(autofill_assistant_.CanShowCreditCardAssist(form_structures)); + } + + { + // Can be shown if the context is secure. + FormData form = CreateValidCreditCardFormData(); + std::unique_ptr<FormStructure> form_structure(new FormStructure(form)); + form_structure->DetermineHeuristicTypes(); + + std::vector<FormStructure*> form_structures; + form_structures.push_back(form_structure.get()); + EXPECT_TRUE(autofill_assistant_.CanShowCreditCardAssist(form_structures)); + } } TEST_F(AutofillAssistantTest, ShowAssistForCreditCard_ValidCard_CancelCvc) {
diff --git a/components/autofill/core/browser/autofill_driver.h b/components/autofill/core/browser/autofill_driver.h index cbead57..a702eb26 100644 --- a/components/autofill/core/browser/autofill_driver.h +++ b/components/autofill/core/browser/autofill_driver.h
@@ -99,6 +99,10 @@ // renderers cannot do this transformation themselves. virtual gfx::RectF TransformBoundingBoxToViewportCoordinates( const gfx::RectF& bounding_box) = 0; + + // Called when the user interacted with a credit card form, so that + // the current page's security state can be updated appropriately. + virtual void DidInteractWithCreditCardForm() = 0; }; } // namespace autofill
diff --git a/components/autofill/core/browser/autofill_manager.cc b/components/autofill/core/browser/autofill_manager.cc index 505a6294..804026c2 100644 --- a/components/autofill/core/browser/autofill_manager.cc +++ b/components/autofill/core/browser/autofill_manager.cc
@@ -527,10 +527,12 @@ // Logging interactions of forms that are autofillable. if (got_autofillable_form) { - if (autofill_field->Type().group() == CREDIT_CARD) + if (autofill_field->Type().group() == CREDIT_CARD) { + driver_->DidInteractWithCreditCardForm(); credit_card_form_event_logger_->OnDidInteractWithAutofillableForm(); - else + } else { address_form_event_logger_->OnDidInteractWithAutofillableForm(); + } } if (is_autofill_possible && @@ -552,7 +554,8 @@ } if (!suggestions.empty()) { bool is_context_secure = - client_->IsContextSecure(form_structure->source_url()); + client_->IsContextSecure(form_structure->source_url()) && + form_structure->target_url().SchemeIs("https"); if (is_filling_credit_card) AutofillMetrics::LogIsQueriedCreditCardFormSecure(is_context_secure);
diff --git a/components/autofill/core/browser/autofill_manager_unittest.cc b/components/autofill/core/browser/autofill_manager_unittest.cc index ce60e536..32a4d187 100644 --- a/components/autofill/core/browser/autofill_manager_unittest.cc +++ b/components/autofill/core/browser/autofill_manager_unittest.cc
@@ -471,7 +471,8 @@ class MockAutofillDriver : public TestAutofillDriver { public: - MockAutofillDriver() : is_off_the_record_(false) {} + MockAutofillDriver() + : is_off_the_record_(false), did_interact_with_credit_card_form_(false) {} // Mock methods to enable testability. MOCK_METHOD3(SendFormDataToRenderer, void(int query_id, @@ -484,8 +485,21 @@ bool IsOffTheRecord() const override { return is_off_the_record_; } + void DidInteractWithCreditCardForm() override { + did_interact_with_credit_card_form_ = true; + }; + + void ClearDidInteractWithCreditCardForm() { + did_interact_with_credit_card_form_ = false; + }; + + bool did_interact_with_credit_card_form() const { + return did_interact_with_credit_card_form_; + } + private: bool is_off_the_record_; + bool did_interact_with_credit_card_form_; DISALLOW_COPY_AND_ASSIGN(MockAutofillDriver); }; @@ -890,7 +904,6 @@ } else { form->origin = GURL("http://myform.com/form.html"); form->action = GURL("http://myform.com/submit.html"); - autofill_client_.set_is_context_secure(false); } FormFieldData field; @@ -1554,7 +1567,7 @@ } // Test that we return a warning explaining that credit card profile suggestions -// are unavailable when the form is not secure. +// are unavailable when the page and the form target URL are not secure. TEST_F(AutofillManagerTest, GetCreditCardSuggestions_NonHTTPS) { // Set up our form data. FormData form; @@ -1579,6 +1592,34 @@ EXPECT_FALSE(external_delegate_->on_suggestions_returned_seen()); } +// Test that we return a warning explaining that credit card profile suggestions +// are unavailable when the page is secure, but the form target URL is not +// secure. +TEST_F(AutofillManagerTest, GetCreditCardSuggestions_TargetURLNonHTTPS) { + // Set up our form data. + FormData form; + CreateTestCreditCardFormData(&form, /* is_https= */ true, false); + // However we set the action (target URL) to be HTTP after all. + form.action = GURL("http://myform.com/submit.html"); + std::vector<FormData> forms(1, form); + FormsSeen(forms); + + const FormFieldData& field = form.fields[0]; + GetAutofillSuggestions(form, field); + + // Test that we sent the right values to the external delegate. + external_delegate_->CheckSuggestions( + kDefaultPageID, Suggestion(l10n_util::GetStringUTF8( + IDS_AUTOFILL_WARNING_INSECURE_CONNECTION), + "", "", -1)); + + // Clear the test credit cards and try again -- we shouldn't return a warning. + personal_data_.ClearCreditCards(); + GetAutofillSuggestions(form, field); + // Autocomplete suggestions are queried, but not Autofill. + EXPECT_FALSE(external_delegate_->on_suggestions_returned_seen()); +} + // Test that we return all credit card suggestions in the case that two cards // have the same obfuscated number. TEST_F(AutofillManagerTest, GetCreditCardSuggestions_RepeatedObfuscatedNumber) { @@ -5220,4 +5261,36 @@ } } +// Tests that querying for credit card field suggestions notifies the +// driver of an interaction with a credit card field. +TEST_F(AutofillManagerTest, NotifyDriverOfCreditCardInteraction) { + // Set up a credit card form. + FormData form; + form.name = ASCIIToUTF16("MyForm"); + form.origin = GURL("https://myform.com/form.html"); + form.action = GURL("https://myform.com/submit.html"); + FormFieldData field; + test::CreateTestFormField("Name on Card", "nameoncard", "", "text", &field); + field.should_autocomplete = false; + form.fields.push_back(field); + test::CreateTestFormField("Card Number", "cardnumber", "", "text", &field); + field.should_autocomplete = true; + form.fields.push_back(field); + test::CreateTestFormField("Expiration Month", "ccexpiresmonth", "", "text", + &field); + field.should_autocomplete = false; + form.fields.push_back(field); + form.fields.push_back(field); + std::vector<FormData> forms(1, form); + FormsSeen(forms); + EXPECT_FALSE(autofill_driver_->did_interact_with_credit_card_form()); + + // The driver should always be notified. + for (const FormFieldData& field : form.fields) { + GetAutofillSuggestions(form, field); + EXPECT_TRUE(autofill_driver_->did_interact_with_credit_card_form()); + autofill_driver_->ClearDidInteractWithCreditCardForm(); + } +} + } // namespace autofill
diff --git a/components/autofill/core/browser/autofill_metrics_unittest.cc b/components/autofill/core/browser/autofill_metrics_unittest.cc index 73c9ae8..39ae287 100644 --- a/components/autofill/core/browser/autofill_metrics_unittest.cc +++ b/components/autofill/core/browser/autofill_metrics_unittest.cc
@@ -1817,8 +1817,6 @@ // Set up the form data. FormData form; form.name = ASCIIToUTF16("TestForm"); - form.origin = GURL("http://example.com/form.html"); - form.action = GURL("http://example.com/submit.html"); FormFieldData field; std::vector<ServerFieldType> field_types; @@ -1890,28 +1888,35 @@ form.fields.push_back(field); field_types.push_back(CREDIT_CARD_NUMBER); - // Simulate having seen this form on page load. - autofill_manager_->AddSeenForm(form, field_types, field_types); - { - // Simulate an Autofill query on a credit card field. - autofill_client_.set_is_context_secure(true); - base::HistogramTester histogram_tester; - autofill_manager_->OnQueryFormFieldAutofill(0, form, form.fields[1], - gfx::RectF()); - histogram_tester.ExpectUniqueSample( - "Autofill.QueriedCreditCardFormIsSecure", true, 1); - } + // Simulate having seen this insecure form on page load. + form.origin = GURL("http://example.com/form.html"); + form.action = GURL("http://example.com/submit.html"); + autofill_manager_->AddSeenForm(form, field_types, field_types); - { - // Simulate an Autofill query on a credit card field. - autofill_client_.set_is_context_secure(false); + // Simulate an Autofill query on a credit card field (HTTP, non-secure + // form). base::HistogramTester histogram_tester; autofill_manager_->OnQueryFormFieldAutofill(0, form, form.fields[1], gfx::RectF()); histogram_tester.ExpectUniqueSample( "Autofill.QueriedCreditCardFormIsSecure", false, 1); } + + { + // Simulate having seen this secure form on page load. + autofill_manager_->Reset(); + form.origin = GURL("https://example.com/form.html"); + form.action = GURL("https://example.com/submit.html"); + autofill_manager_->AddSeenForm(form, field_types, field_types); + + // Simulate an Autofill query on a credit card field (HTTPS form). + base::HistogramTester histogram_tester; + autofill_manager_->OnQueryFormFieldAutofill(0, form, form.fields[1], + gfx::RectF()); + histogram_tester.ExpectUniqueSample( + "Autofill.QueriedCreditCardFormIsSecure", true, 1); + } } // Tests that the Autofill_PolledProfileSuggestions user action is only logged
diff --git a/components/autofill/core/browser/test_autofill_client.cc b/components/autofill/core/browser/test_autofill_client.cc index c97e95c6..5913ded 100644 --- a/components/autofill/core/browser/test_autofill_client.cc +++ b/components/autofill/core/browser/test_autofill_client.cc
@@ -11,9 +11,7 @@ TestAutofillClient::TestAutofillClient() : token_service_(new FakeOAuth2TokenService()), identity_provider_(new FakeIdentityProvider(token_service_.get())), - rappor_service_(new rappor::TestRapporService()), - is_context_secure_(true) { -} + rappor_service_(new rappor::TestRapporService()) {} TestAutofillClient::~TestAutofillClient() { } @@ -118,7 +116,8 @@ } bool TestAutofillClient::IsContextSecure(const GURL& form_origin) { - return is_context_secure_; + // Simplified secure context check for tests. + return form_origin.SchemeIs("https"); } bool TestAutofillClient::ShouldShowSigninPromo() {
diff --git a/components/autofill/core/browser/test_autofill_client.h b/components/autofill/core/browser/test_autofill_client.h index a9f2a86..013a903 100644 --- a/components/autofill/core/browser/test_autofill_client.h +++ b/components/autofill/core/browser/test_autofill_client.h
@@ -71,10 +71,6 @@ bool ShouldShowSigninPromo() override; void StartSigninFlow() override; - void set_is_context_secure(bool is_context_secure) { - is_context_secure_ = is_context_secure; - } - void SetPrefs(std::unique_ptr<PrefService> prefs) { prefs_ = std::move(prefs); } @@ -90,8 +86,6 @@ std::unique_ptr<FakeIdentityProvider> identity_provider_; std::unique_ptr<rappor::TestRapporService> rappor_service_; - bool is_context_secure_; - DISALLOW_COPY_AND_ASSIGN(TestAutofillClient); };
diff --git a/components/autofill/core/browser/test_autofill_driver.cc b/components/autofill/core/browser/test_autofill_driver.cc index 906b55e..be3bc7b 100644 --- a/components/autofill/core/browser/test_autofill_driver.cc +++ b/components/autofill/core/browser/test_autofill_driver.cc
@@ -77,4 +77,6 @@ return bounding_box; } +void TestAutofillDriver::DidInteractWithCreditCardForm() {} + } // namespace autofill
diff --git a/components/autofill/core/browser/test_autofill_driver.h b/components/autofill/core/browser/test_autofill_driver.h index 0d6b5af..6ac0c9c 100644 --- a/components/autofill/core/browser/test_autofill_driver.h +++ b/components/autofill/core/browser/test_autofill_driver.h
@@ -48,6 +48,7 @@ void PopupHidden() override; gfx::RectF TransformBoundingBoxToViewportCoordinates( const gfx::RectF& bounding_box) override; + void DidInteractWithCreditCardForm() override; // Methods that tests can use to specialize functionality.
diff --git a/components/autofill/ios/browser/autofill_driver_ios.h b/components/autofill/ios/browser/autofill_driver_ios.h index e89c9e6..2da12651 100644 --- a/components/autofill/ios/browser/autofill_driver_ios.h +++ b/components/autofill/ios/browser/autofill_driver_ios.h
@@ -51,6 +51,7 @@ void RendererShouldAcceptDataListSuggestion( const base::string16& value) override; base::SequencedWorkerPool* GetBlockingPool() override; + void DidInteractWithCreditCardForm() override; AutofillManager* autofill_manager() { return &autofill_manager_; }
diff --git a/components/autofill/ios/browser/autofill_driver_ios.mm b/components/autofill/ios/browser/autofill_driver_ios.mm index 49a24f0f..f867cd6 100644 --- a/components/autofill/ios/browser/autofill_driver_ios.mm +++ b/components/autofill/ios/browser/autofill_driver_ios.mm
@@ -82,6 +82,8 @@ const base::string16& value) { } +void AutofillDriverIOS::DidInteractWithCreditCardForm() {} + void AutofillDriverIOS::RendererShouldClearFilledForm() { }
diff --git a/components/browser_sync/BUILD.gn b/components/browser_sync/BUILD.gn index 7a427269..d7a68ac 100644 --- a/components/browser_sync/BUILD.gn +++ b/components/browser_sync/BUILD.gn
@@ -78,8 +78,9 @@ "//components/signin/core/common:common", "//components/strings", "//components/sync", - "//components/sync:test_support_sync_core_impl", - "//components/sync:test_support_sync_driver", + "//components/sync:test_support_driver", + "//components/sync:test_support_engine", + "//components/sync:test_support_model", "//components/sync_bookmarks:sync_bookmarks", "//components/sync_sessions", "//components/sync_sessions:test_support", @@ -123,9 +124,8 @@ "//components/signin/core/browser:browser", "//components/signin/core/browser:test_support", "//components/sync", - "//components/sync:test_support_sync_core", - "//components/sync:test_support_sync_core_impl", - "//components/sync:test_support_sync_driver", + "//components/sync:test_support_driver", + "//components/sync:test_support_engine", "//components/sync_sessions:test_support", "//components/syncable_prefs:test_support", "//google_apis",
diff --git a/components/browser_sync/abstract_profile_sync_service_test.cc b/components/browser_sync/abstract_profile_sync_service_test.cc index 9baf0a5..153962e 100644 --- a/components/browser_sync/abstract_profile_sync_service_test.cc +++ b/components/browser_sync/abstract_profile_sync_service_test.cc
@@ -86,11 +86,9 @@ void SyncBackendHostForProfileSyncTest::InitCore( std::unique_ptr<syncer::DoInitializeOptions> options) { - options->http_bridge_factory = - std::unique_ptr<syncer::HttpPostProviderFactory>( - new TestHttpBridgeFactory()); - options->sync_manager_factory.reset( - new syncer::SyncManagerFactoryForProfileSyncTest(callback_)); + options->http_bridge_factory = base::MakeUnique<TestHttpBridgeFactory>(); + options->sync_manager_factory = + base::MakeUnique<syncer::SyncManagerFactoryForProfileSyncTest>(callback_); options->credentials.email = "testuser@gmail.com"; options->credentials.sync_token = "token"; options->credentials.scope_set.insert(GaiaConstants::kChromeSyncOAuth2Scope); @@ -101,10 +99,10 @@ // free it. Grab the switches to pass on first. syncer::EngineComponentsFactory::Switches factory_switches = options->engine_components_factory->GetSwitches(); - options->engine_components_factory.reset( - new syncer::TestEngineComponentsFactory( + options->engine_components_factory = + base::MakeUnique<syncer::TestEngineComponentsFactory>( factory_switches, syncer::EngineComponentsFactory::STORAGE_IN_MEMORY, - nullptr)); + nullptr); SyncBackendHostImpl::InitCore(std::move(options)); }
diff --git a/components/browser_sync/profile_sync_service.cc b/components/browser_sync/profile_sync_service.cc index 315e0b3d..81dcf3f3 100644 --- a/components/browser_sync/profile_sync_service.cc +++ b/components/browser_sync/profile_sync_service.cc
@@ -263,26 +263,26 @@ // We don't pass StartupController an Unretained reference to future-proof // against the controller impl changing to post tasks. - startup_controller_.reset(new syncer::StartupController( + startup_controller_ = base::MakeUnique<syncer::StartupController>( &sync_prefs_, base::Bind(&ProfileSyncService::CanBackendStart, base::Unretained(this)), base::Bind(&ProfileSyncService::StartUpSlowBackendComponents, - weak_factory_.GetWeakPtr()))); + weak_factory_.GetWeakPtr())); std::unique_ptr<sync_sessions::LocalSessionEventRouter> router( sync_client_->GetSyncSessionsClient()->GetLocalSessionEventRouter()); local_device_ = sync_client_->GetSyncApiComponentFactory() ->CreateLocalDeviceInfoProvider(); - sync_stopped_reporter_.reset(new syncer::SyncStoppedReporter( + sync_stopped_reporter_ = base::MakeUnique<syncer::SyncStoppedReporter>( sync_service_url_, local_device_->GetSyncUserAgent(), - url_request_context_, syncer::SyncStoppedReporter::ResultCallback())); - sessions_sync_manager_.reset(new SessionsSyncManager( + url_request_context_, syncer::SyncStoppedReporter::ResultCallback()); + sessions_sync_manager_ = base::MakeUnique<SessionsSyncManager>( sync_client_->GetSyncSessionsClient(), &sync_prefs_, local_device_.get(), std::move(router), base::Bind(&ProfileSyncService::NotifyForeignSessionUpdated, sync_enabled_weak_factory_.GetWeakPtr()), base::Bind(&ProfileSyncService::TriggerRefresh, sync_enabled_weak_factory_.GetWeakPtr(), - syncer::ModelTypeSet(syncer::SESSIONS)))); + syncer::ModelTypeSet(syncer::SESSIONS))); if (base::FeatureList::IsEnabled(switches::kSyncUSSDeviceInfo)) { scoped_refptr<base::SequencedTaskRunner> blocking_task_runner( @@ -292,16 +292,16 @@ // TODO(skym): Stop creating leveldb files when signed out. // TODO(skym): Verify using AsUTF8Unsafe is okay here. Should work as long // as the Local State file is guaranteed to be UTF-8. - device_info_service_.reset(new DeviceInfoService( + device_info_service_ = base::MakeUnique<DeviceInfoService>( local_device_.get(), base::Bind(&ModelTypeStore::CreateStore, syncer::DEVICE_INFO, directory_path_.Append(base::FilePath(kLevelDBFolderName)) .AsUTF8Unsafe(), blocking_task_runner), - base::Bind(&ModelTypeChangeProcessor::Create))); + base::Bind(&ModelTypeChangeProcessor::Create)); } else { - device_info_sync_service_.reset( - new DeviceInfoSyncService(local_device_.get())); + device_info_sync_service_ = + base::MakeUnique<DeviceInfoSyncService>(local_device_.get()); } syncer::SyncApiComponentFactory::RegisterDataTypesMethod @@ -366,13 +366,13 @@ #if !defined(OS_ANDROID) DCHECK(sync_error_controller_ == NULL) << "Initialize() called more than once."; - sync_error_controller_.reset(new syncer::SyncErrorController(this)); + sync_error_controller_ = base::MakeUnique<syncer::SyncErrorController>(this); AddObserver(sync_error_controller_.get()); #endif - memory_pressure_listener_.reset(new base::MemoryPressureListener( + memory_pressure_listener_ = base::MakeUnique<base::MemoryPressureListener>( base::Bind(&ProfileSyncService::OnMemoryPressure, - sync_enabled_weak_factory_.GetWeakPtr()))); + sync_enabled_weak_factory_.GetWeakPtr())); startup_controller_->Reset(GetRegisteredDataTypes()); // Auto-start means means the first time the profile starts up, sync should @@ -1753,10 +1753,10 @@ this)); // We create the migrator at the same time. - migrator_.reset(new BackendMigrator( + migrator_ = base::MakeUnique<BackendMigrator>( debug_identifier_, GetUserShare(), this, data_type_manager_.get(), base::Bind(&ProfileSyncService::StartSyncingWithServer, - base::Unretained(this)))); + base::Unretained(this))); } syncer::ModelTypeSet types; @@ -1851,7 +1851,7 @@ for (ModelTypeSet::Iterator it = registered.First(); it.Good(); it.Inc()) { ModelType type = it.Get(); - type_status.reset(new base::DictionaryValue()); + type_status = base::MakeUnique<base::DictionaryValue>(); type_status->SetString("name", ModelTypeToString(type)); if (error_map.find(type) != error_map.end()) {
diff --git a/components/browser_sync/profile_sync_service_autofill_unittest.cc b/components/browser_sync/profile_sync_service_autofill_unittest.cc index 559b895..24627d7 100644 --- a/components/browser_sync/profile_sync_service_autofill_unittest.cc +++ b/components/browser_sync/profile_sync_service_autofill_unittest.cc
@@ -327,8 +327,8 @@ const base::Callback<void(syncer::ModelType)>& on_sync_started) { ASSERT_TRUE(db_thread_->RunsTasksOnCurrentThread()); // These services are deleted in DestroySyncableService(). - backend_.reset(new MockAutofillBackend(GetDatabase(), on_changed_callback, - on_sync_started, ui_thread_.get())); + backend_ = base::MakeUnique<MockAutofillBackend>( + GetDatabase(), on_changed_callback, on_sync_started, ui_thread_.get()); AutocompleteSyncableService::CreateForWebDataServiceAndBackend( this, backend_.get()); AutofillProfileSyncableService::CreateForWebDataServiceAndBackend( @@ -402,7 +402,7 @@ profile_sync_service_bundle()->set_db_thread( data_type_thread()->task_runner()); - web_database_.reset(new WebDatabaseFake(&autofill_table_)); + web_database_ = base::MakeUnique<WebDatabaseFake>(&autofill_table_); web_data_wrapper_ = base::MakeUnique<MockWebDataServiceWrapper>( new WebDataServiceFake(base::ThreadTaskRunnerHandle::Get(), data_type_thread()->task_runner()),
diff --git a/components/browser_sync/profile_sync_service_bookmark_unittest.cc b/components/browser_sync/profile_sync_service_bookmark_unittest.cc index 56ed068..42a709c 100644 --- a/components/browser_sync/profile_sync_service_bookmark_unittest.cc +++ b/components/browser_sync/profile_sync_service_bookmark_unittest.cc
@@ -546,10 +546,10 @@ DCHECK(!model_associator_); // Set up model associator. - model_associator_.reset(new BookmarkModelAssociator( + model_associator_ = base::MakeUnique<BookmarkModelAssociator>( model_.get(), sync_client_.get(), test_user_share_.user_share(), base::MakeUnique<syncer::DataTypeErrorHandlerMock>(), - kExpectMobileBookmarks)); + kExpectMobileBookmarks); local_merge_result_ = syncer::SyncMergeResult(syncer::BOOKMARKS); syncer_merge_result_ = syncer::SyncMergeResult(syncer::BOOKMARKS);
diff --git a/components/browser_sync/profile_sync_service_startup_unittest.cc b/components/browser_sync/profile_sync_service_startup_unittest.cc index f0ef72e..45cbaa37 100644 --- a/components/browser_sync/profile_sync_service_startup_unittest.cc +++ b/components/browser_sync/profile_sync_service_startup_unittest.cc
@@ -5,6 +5,7 @@ #include "components/browser_sync/profile_sync_service.h" #include "base/files/file_util.h" +#include "base/memory/ptr_util.h" #include "base/strings/utf_string_conversions.h" #include "base/threading/thread_task_runner_handle.h" #include "components/browser_sync/profile_sync_test_util.h" @@ -90,7 +91,8 @@ profile_sync_service_bundle_.CreateBasicInitParams(start_behavior, builder.Build()); - sync_service_.reset(new ProfileSyncService(std::move(init_params))); + sync_service_ = + base::MakeUnique<ProfileSyncService>(std::move(init_params)); sync_service_->RegisterDataTypeController( base::MakeUnique<syncer::FakeDataTypeController>(syncer::BOOKMARKS)); sync_service_->AddObserver(&observer_);
diff --git a/components/browser_sync/profile_sync_service_unittest.cc b/components/browser_sync/profile_sync_service_unittest.cc index 844bf1c..5486dbb7 100644 --- a/components/browser_sync/profile_sync_service_unittest.cc +++ b/components/browser_sync/profile_sync_service_unittest.cc
@@ -9,6 +9,7 @@ #include "base/callback.h" #include "base/command_line.h" #include "base/feature_list.h" +#include "base/memory/ptr_util.h" #include "base/run_loop.h" #include "base/single_thread_task_runner.h" #include "base/strings/string_number_conversions.h" @@ -236,7 +237,7 @@ profile_sync_service_bundle_.CreateBasicInitParams(behavior, builder.Build()); - service_.reset(new ProfileSyncService(std::move(init_params))); + service_ = base::MakeUnique<ProfileSyncService>(std::move(init_params)); service_->RegisterDataTypeController( base::MakeUnique<syncer::FakeDataTypeController>(syncer::BOOKMARKS)); }
diff --git a/components/browser_watcher/BUILD.gn b/components/browser_watcher/BUILD.gn index f024ed5d..fede06b9 100644 --- a/components/browser_watcher/BUILD.gn +++ b/components/browser_watcher/BUILD.gn
@@ -18,8 +18,6 @@ "endsession_watcher_window_win.h", "exit_code_watcher_win.cc", "exit_code_watcher_win.h", - "exit_funnel_win.cc", - "exit_funnel_win.h", "window_hang_monitor_win.cc", "window_hang_monitor_win.h", ] @@ -90,7 +88,6 @@ sources = [ "endsession_watcher_window_win_unittest.cc", "exit_code_watcher_win_unittest.cc", - "exit_funnel_win_unittest.cc", "postmortem_minidump_writer_win_unittest.cc", "postmortem_report_collector_unittest.cc", "watcher_client_win_unittest.cc",
diff --git a/components/browser_watcher/exit_funnel_win.cc b/components/browser_watcher/exit_funnel_win.cc deleted file mode 100644 index abb66de..0000000 --- a/components/browser_watcher/exit_funnel_win.cc +++ /dev/null
@@ -1,79 +0,0 @@ -// Copyright (c) 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 "components/browser_watcher/exit_funnel_win.h" - -#include <windows.h> -#include <stdint.h> - -#include "base/strings/stringprintf.h" -#include "base/time/time.h" - -namespace browser_watcher { - -ExitFunnel::ExitFunnel() { -} - -ExitFunnel::~ExitFunnel() { -} - -bool ExitFunnel::Init(const base::char16* registry_path, - base::ProcessHandle process_handle) { - // Concatenate the pid and the creation time of the process to get a - // unique key name. - base::ProcessId pid = base::GetProcId(process_handle); - - FILETIME creation_time = {}; - FILETIME dummy = {}; - if (!::GetProcessTimes(process_handle, &creation_time, - &dummy, &dummy, &dummy)) { - LOG(ERROR) << "Invalid process handle, can't get process times."; - return false; - } - - return InitImpl(registry_path, pid, base::Time::FromFileTime(creation_time)); -} - -bool ExitFunnel::InitImpl(const base::char16* registry_path, - base::ProcessId pid, - base::Time creation_time) { - base::string16 key_name = registry_path; - base::StringAppendF( - &key_name, L"\\%d-%lld", pid, creation_time.ToInternalValue()); - - LONG res = key_.Create(HKEY_CURRENT_USER, key_name.c_str(), KEY_SET_VALUE); - if (res != ERROR_SUCCESS) { - LOG(ERROR) << "Unable to create key " << key_name << " error " << res; - return false; - } - - return true; -} - -bool ExitFunnel::RecordEvent(const base::char16* event_name) { - if (!key_.Valid()) - return false; - - int64_t now = base::Time::Now().ToInternalValue(); - - LONG res = key_.WriteValue(event_name, &now, sizeof(now), REG_QWORD); - if (res != ERROR_SUCCESS) { - LOG(ERROR) << "Unable to write value " << event_name << " error " << res; - return false; - } - - return true; -} - -bool ExitFunnel::RecordSingleEvent(const base::char16* registry_path, - const base::char16* event_name) { - ExitFunnel funnel; - - if (!funnel.Init(registry_path, base::GetCurrentProcessHandle())) - return false; - - return funnel.RecordEvent(event_name); -} - -} // namespace browser_watcher
diff --git a/components/browser_watcher/exit_funnel_win.h b/components/browser_watcher/exit_funnel_win.h deleted file mode 100644 index efd35ab..0000000 --- a/components/browser_watcher/exit_funnel_win.h +++ /dev/null
@@ -1,63 +0,0 @@ -// Copyright (c) 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 COMPONENTS_BROWSER_WATCHER_EXIT_FUNNEL_WIN_H_ -#define COMPONENTS_BROWSER_WATCHER_EXIT_FUNNEL_WIN_H_ - -#include "base/macros.h" -#include "base/process/process_handle.h" -#include "base/strings/string16.h" -#include "base/time/time.h" -#include "base/win/registry.h" - -namespace browser_watcher { - -// A wrapper class that takes care of persistently recording a trace of named, -// timed events in registry, associated with a process instance. This allows -// reconstructing and reporting an event trace on a subsequent launch. -// The event trace is stored in registry under a new key named -// <pid>-<uniquifier>, where each event is a value named after the event, with -// an associated QWORD value noting the event time. -// Note: this is deprecated, and is only kept around for testing the cleanup -// in the WatcherMetricsProvider. -// TODO(siggi): Kill this class - see http://crbug.com/442526. -class ExitFunnel { - public: - ExitFunnel(); - ~ExitFunnel(); - - // Initializes the exit funnel with |registry_path| and |process|. - // |process| must be open for PROCESS_QUERY_INFORMATION at least. - // Returns false on failure to create or open the registry path corresponding - // to |process|. - bool Init(const base::char16* registry_path, base::ProcessHandle process); - - // Initializes the exit funnel with |registry_path|, |pid| and - // |creation_time|. - // Returns false on failure to create or open the registry path corresponding - // to |process|. - // Exposed for testing. - bool InitImpl(const base::char16* registry_path, - base::ProcessId pid, - base::Time creation_time); - - // Records |event_name| at the current time in the registry for the process - // this instance is associated with. Returns false on failure to record the - // event. - bool RecordEvent(const base::char16* event_name); - - // Records |event_name| at the current time in the registry at |registry_path| - // for this process. - static bool RecordSingleEvent(const base::char16* registry_path, - const base::char16* event_name); - - private: - base::win::RegKey key_; - - DISALLOW_COPY_AND_ASSIGN(ExitFunnel); -}; - -} // namespace browser_watcher - -#endif // COMPONENTS_BROWSER_WATCHER_EXIT_FUNNEL_WIN_H_
diff --git a/components/browser_watcher/exit_funnel_win_unittest.cc b/components/browser_watcher/exit_funnel_win_unittest.cc deleted file mode 100644 index a5039788..0000000 --- a/components/browser_watcher/exit_funnel_win_unittest.cc +++ /dev/null
@@ -1,119 +0,0 @@ -// Copyright (c) 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 "components/browser_watcher/exit_funnel_win.h" - -#include <stddef.h> -#include <stdint.h> - -#include <map> - -#include "base/command_line.h" -#include "base/process/process_handle.h" -#include "base/strings/string16.h" -#include "base/strings/string_number_conversions.h" -#include "base/strings/stringprintf.h" -#include "base/test/test_reg_util_win.h" -#include "base/threading/platform_thread.h" -#include "base/time/time.h" -#include "base/win/registry.h" -#include "testing/gtest/include/gtest/gtest.h" - -namespace browser_watcher { - -namespace { - -const wchar_t kRegistryPath[] = L"Software\\ExitFunnelWinTest"; - -class ExitFunnelWinTest : public testing::Test { - public: - typedef testing::Test Super; - typedef std::map<base::string16, int64_t> EventMap; - - void SetUp() override { - Super::SetUp(); - - override_manager_.OverrideRegistry(HKEY_CURRENT_USER); - } - - base::string16 GetEventSubkey() { - // There should be a single subkey named after this process' pid. - base::win::RegistryKeyIterator it(HKEY_CURRENT_USER, kRegistryPath); - EXPECT_EQ(1u, it.SubkeyCount()); - - unsigned pid = 0; - base::StringToUint(it.Name(), &pid); - EXPECT_EQ(base::GetCurrentProcId(), pid); - - return it.Name(); - } - - // TODO(siggi): Reuse the reading code from the metrics provider. - EventMap ReadEventsFromSubkey(const base::string16& subkey_name) { - base::string16 key_name( - base::StringPrintf(L"%ls\\%ls", kRegistryPath, subkey_name.c_str())); - - base::win::RegKey key(HKEY_CURRENT_USER, key_name.c_str(), KEY_READ); - EXPECT_TRUE(key.Valid()); - EXPECT_EQ(2u, key.GetValueCount()); - - EventMap events; - for (size_t i = 0; i < key.GetValueCount(); ++i) { - base::string16 name; - EXPECT_EQ(key.GetValueNameAt(i, &name), ERROR_SUCCESS); - int64_t value = 0; - EXPECT_EQ(key.ReadInt64(name.c_str(), &value), ERROR_SUCCESS); - - events[name] = value; - } - - return events; - } - - EventMap ReadEvents() { - base::string16 name = GetEventSubkey(); - return ReadEventsFromSubkey(name); - } - - protected: - registry_util::RegistryOverrideManager override_manager_; -}; - -} // namespace - -TEST_F(ExitFunnelWinTest, RecordSingleEvent) { - // Record a couple of events. - ASSERT_TRUE(ExitFunnel::RecordSingleEvent(kRegistryPath, L"One")); - ASSERT_TRUE(ExitFunnel::RecordSingleEvent(kRegistryPath, L"Two")); - - EventMap events = ReadEvents(); - - ASSERT_EQ(2u, events.size()); - ASSERT_TRUE(events.find(L"One") != events.end()); - ASSERT_TRUE(events.find(L"Two") != events.end()); -} - -TEST_F(ExitFunnelWinTest, RecordsEventTimes) { - ExitFunnel funnel; - - ASSERT_TRUE(funnel.Init(kRegistryPath, base::GetCurrentProcessHandle())); - ASSERT_TRUE(funnel.RecordEvent(L"One")); - - // Sleep for half a second to space the events in time. - base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(50)); - - ASSERT_TRUE(funnel.RecordEvent(L"Two")); - - EventMap events = ReadEvents(); - ASSERT_EQ(2u, events.size()); - - base::TimeDelta one = base::TimeDelta::FromInternalValue(events[L"One"]); - base::TimeDelta two = base::TimeDelta::FromInternalValue(events[L"Two"]); - - // Sleep is not accurate, it may over or under sleep. To minimize flakes, - // this test only compares relative ordering of the events. - ASSERT_LT(one, two); -} - -} // namespace browser_watcher
diff --git a/components/browser_watcher/watcher_metrics_provider_win.cc b/components/browser_watcher/watcher_metrics_provider_win.cc index 5ed372d..57a1d28e 100644 --- a/components/browser_watcher/watcher_metrics_provider_win.cc +++ b/components/browser_watcher/watcher_metrics_provider_win.cc
@@ -130,60 +130,11 @@ } } -void DeleteExitFunnels(const base::string16& registry_path) { - base::win::RegistryKeyIterator it(HKEY_CURRENT_USER, registry_path.c_str()); - if (!it.Valid()) - return; - - // Exit early if no work to do. - if (it.SubkeyCount() == 0) - return; - - // Open the key we use for deletion preemptively to prevent reporting - // multiple times on permission problems. - base::win::RegKey key(HKEY_CURRENT_USER, - registry_path.c_str(), - KEY_QUERY_VALUE); - if (!key.Valid()) { - DVLOG(1) << "Failed to open " << registry_path << " for writing."; - return; - } - - // Key names to delete. - std::vector<base::string16> keys_to_delete; - // Constrain the cleanup to 100 exit funnels at a time, as otherwise this may - // take a long time to finish where a lot of data has accrued. This will be - // the case in particular for non-UMA users, as the exit funnel data will - // accrue without bounds for those users. - const size_t kMaxCleanup = 100; - for (; it.Valid() && keys_to_delete.size() < kMaxCleanup; ++it) { - base::win::RegKey sub_key; - LONG res = - sub_key.Open(key.Handle(), it.Name(), KEY_QUERY_VALUE | KEY_SET_VALUE); - if (res != ERROR_SUCCESS) { - DVLOG(1) << "Failed to open subkey " << it.Name(); - return; - } - DeleteAllValues(&sub_key); - - // Schedule the subkey for deletion. - keys_to_delete.push_back(it.Name()); - } - - for (const base::string16& key_name : keys_to_delete) { - LONG res = key.DeleteEmptyKey(key_name.c_str()); - if (res != ERROR_SUCCESS) - DVLOG(1) << "Failed to delete key " << key_name; - } -} - // Called from the blocking pool when metrics reporting is disabled, as there // may be a sizable stash of data to delete. void DeleteExitCodeRegistryKey(const base::string16& registry_path) { CHECK_NE(L"", registry_path); - DeleteExitFunnels(registry_path); - base::win::RegKey key; LONG res = key.Open(HKEY_CURRENT_USER, registry_path.c_str(), KEY_QUERY_VALUE | KEY_SET_VALUE); @@ -258,7 +209,6 @@ // necessary to implement some form of global locking, which is not worth it // here. RecordExitCodes(registry_path_); - DeleteExitFunnels(registry_path_); } void WatcherMetricsProviderWin::CollectPostmortemReports(
diff --git a/components/browser_watcher/watcher_metrics_provider_win_unittest.cc b/components/browser_watcher/watcher_metrics_provider_win_unittest.cc index 5f255467..f126bbf 100644 --- a/components/browser_watcher/watcher_metrics_provider_win_unittest.cc +++ b/components/browser_watcher/watcher_metrics_provider_win_unittest.cc
@@ -16,7 +16,6 @@ #include "base/test/test_reg_util_win.h" #include "base/test/test_simple_task_runner.h" #include "base/win/registry.h" -#include "components/browser_watcher/exit_funnel_win.h" #include "testing/gtest/include/gtest/gtest.h" namespace browser_watcher { @@ -65,15 +64,6 @@ return key.GetValueCount(); } - void AddExitFunnelEvent(int pid, const base::char16* name, int64_t value) { - base::string16 key_name = - base::StringPrintf(L"%ls\\%d-%d", kRegistryPath, pid, pid); - - base::win::RegKey key(HKEY_CURRENT_USER, key_name.c_str(), KEY_WRITE); - ASSERT_EQ(key.WriteValue(name, &value, sizeof(value), REG_QWORD), - ERROR_SUCCESS); - } - protected: registry_util::RegistryOverrideManager override_manager_; base::HistogramTester histogram_tester_; @@ -126,37 +116,9 @@ EXPECT_EQ(1u, ExitCodeRegistryPathValueCount()); } -TEST_F(WatcherMetricsProviderWinTest, DeletesRecordedExitFunnelEvents) { - // Record an exit funnel and make sure the registry is cleaned up on - // reporting, without recording any events. - AddExitFunnelEvent(100, L"One", 1000 * 1000); - AddExitFunnelEvent(101, L"Two", 1010 * 1000); - AddExitFunnelEvent(102, L"Three", 990 * 1000); - - base::win::RegistryKeyIterator it(HKEY_CURRENT_USER, kRegistryPath); - EXPECT_EQ(3u, it.SubkeyCount()); - - WatcherMetricsProviderWin provider( - kRegistryPath, base::FilePath(), base::FilePath(), - GetExecutableDetailsCallback(), test_task_runner_.get()); - - provider.ProvideStabilityMetrics(NULL); - // Make sure the exit funnel events are no longer recorded in histograms. - EXPECT_TRUE( - histogram_tester_.GetAllSamples("Stability.ExitFunnel.One").empty()); - EXPECT_TRUE( - histogram_tester_.GetAllSamples("Stability.ExitFunnel.Two").empty()); - EXPECT_TRUE( - histogram_tester_.GetAllSamples("Stability.ExitFunnel.Three").empty()); - - // Make sure the subkeys are deleted on reporting. - ASSERT_EQ(0u, it.SubkeyCount()); -} - TEST_F(WatcherMetricsProviderWinTest, DeletesExitcodeKeyWhenNotReporting) { // Test that the registry at kRegistryPath is deleted when reporting is // disabled. - ExitFunnel funnel; // Record multiple success exits. for (size_t i = 0; i < 11; ++i) @@ -164,13 +126,6 @@ // Record a single failure. AddProcessExitCode(false, 100); - // Record an exit funnel. - ASSERT_TRUE(funnel.InitImpl(kRegistryPath, 4, base::Time::Now())); - - AddExitFunnelEvent(100, L"One", 1000 * 1000); - AddExitFunnelEvent(101, L"Two", 1010 * 1000); - AddExitFunnelEvent(102, L"Three", 990 * 1000); - // Make like the user is opted out of reporting. WatcherMetricsProviderWin provider( kRegistryPath, base::FilePath(), base::FilePath(), @@ -193,28 +148,4 @@ key.Open(HKEY_CURRENT_USER, kRegistryPath, KEY_READ)); } -TEST_F(WatcherMetricsProviderWinTest, DeletesOnly100FunnelsAtATime) { - // Record 200 distinct exit funnels. - for (size_t i = 0; i < 200; ++i) { - AddExitFunnelEvent(i, L"One", 10); - AddExitFunnelEvent(i, L"Two", 10); - } - - base::win::RegistryKeyIterator it(HKEY_CURRENT_USER, kRegistryPath); - EXPECT_EQ(200u, it.SubkeyCount()); - - { - // Make like the user is opted out of reporting. - WatcherMetricsProviderWin provider( - kRegistryPath, base::FilePath(), base::FilePath(), - GetExecutableDetailsCallback(), test_task_runner_.get()); - provider.OnRecordingDisabled(); - // Flush the task(s). - test_task_runner_->RunPendingTasks(); - } - - // We expect only 100 of the funnels have been scrubbed. - EXPECT_EQ(100u, it.SubkeyCount()); -} - } // namespace browser_watcher
diff --git a/components/browsing_data/core/BUILD.gn b/components/browsing_data/core/BUILD.gn index 35fd34f..726f435 100644 --- a/components/browsing_data/core/BUILD.gn +++ b/components/browsing_data/core/BUILD.gn
@@ -60,8 +60,8 @@ "//components/autofill/core/browser:browser", "//components/history/core/test:test", "//components/signin/core/browser:test_support", - "//components/sync:test_support_sync_driver", - "//components/sync/protocol:protocol", + "//components/sync", + "//components/sync:test_support_driver", "//components/version_info:version_info", "//net", "//testing/gtest",
diff --git a/components/cast_certificate/BUILD.gn b/components/cast_certificate/BUILD.gn index 19ac0d7..79a3f981 100644 --- a/components/cast_certificate/BUILD.gn +++ b/components/cast_certificate/BUILD.gn
@@ -27,6 +27,7 @@ deps = [ ":cast_certificate", "//base", + "//components/cast_certificate/proto:unittest_proto", "//net", "//testing/gtest", ]
diff --git a/components/cast_certificate/cast_cert_validator.cc b/components/cast_certificate/cast_cert_validator.cc index 5cbf9bf8..bcd0a86 100644 --- a/components/cast_certificate/cast_cert_validator.cc +++ b/components/cast_certificate/cast_cert_validator.cc
@@ -255,14 +255,29 @@ return options; } -// Verifies a cast device certificate given a chain of DER-encoded certificates. +} // namespace + bool VerifyDeviceCert(const std::vector<std::string>& certs, const base::Time& time, std::unique_ptr<CertVerificationContext>* context, CastDeviceCertPolicy* policy, const CastCRL* crl, - CRLPolicy crl_policy, - net::TrustStore* trust_store) { + CRLPolicy crl_policy) { + return VerifyDeviceCertUsingCustomTrustStore( + certs, time, context, policy, crl, crl_policy, &CastTrustStore::Get()); +} + +bool VerifyDeviceCertUsingCustomTrustStore( + const std::vector<std::string>& certs, + const base::Time& time, + std::unique_ptr<CertVerificationContext>* context, + CastDeviceCertPolicy* policy, + const CastCRL* crl, + CRLPolicy crl_policy, + net::TrustStore* trust_store) { + if (!trust_store) + return VerifyDeviceCert(certs, time, context, policy, crl, crl_policy); + if (certs.empty()) return false; @@ -320,29 +335,6 @@ return true; } -} // namespace - -bool VerifyDeviceCert(const std::vector<std::string>& certs, - const base::Time& time, - std::unique_ptr<CertVerificationContext>* context, - CastDeviceCertPolicy* policy, - const CastCRL* crl, - CRLPolicy crl_policy) { - return VerifyDeviceCert(certs, time, context, policy, crl, crl_policy, - &CastTrustStore::Get()); -} - -bool VerifyDeviceCertForTest(const std::vector<std::string>& certs, - const base::Time& time, - std::unique_ptr<CertVerificationContext>* context, - CastDeviceCertPolicy* policy, - const CastCRL* crl, - CRLPolicy crl_policy, - net::TrustStore* trust_store) { - return VerifyDeviceCert(certs, time, context, policy, crl, crl_policy, - trust_store); -} - std::unique_ptr<CertVerificationContext> CertVerificationContextImplForTest( const base::StringPiece& spki) { // Use a bogus CommonName, since this is just exposed for testing signature
diff --git a/components/cast_certificate/cast_cert_validator.h b/components/cast_certificate/cast_cert_validator.h index a918dd58..1ef400d3 100644 --- a/components/cast_certificate/cast_cert_validator.h +++ b/components/cast_certificate/cast_cert_validator.h
@@ -78,8 +78,8 @@ // * |crl| is the CRL to check for certificate revocation status. // If this is a nullptr, then revocation checking is currently disabled. // -// * |crl_options| is for choosing how to handle the absence of a CRL. -// If crl_required is set to true, then an empty |crl| input would result +// * |crl_policy| is for choosing how to handle the absence of a CRL. +// If CRL_REQUIRED is passed, then an empty |crl| input would result // in a failed verification. Otherwise, |crl| is ignored if it is absent. // // Outputs: @@ -99,17 +99,19 @@ const CastCRL* crl, CRLPolicy crl_policy) WARN_UNUSED_RESULT; -// Exposed only for testing, not for use in production code. -// // This is an overloaded version of VerifyDeviceCert that allows // the input of a custom TrustStore. -bool VerifyDeviceCertForTest(const std::vector<std::string>& certs, - const base::Time& time, - std::unique_ptr<CertVerificationContext>* context, - CastDeviceCertPolicy* policy, - const CastCRL* crl, - CRLPolicy crl_policy, - net::TrustStore* trust_store) WARN_UNUSED_RESULT; +// +// For production use pass |trust_store| as nullptr to use the production trust +// store. +bool VerifyDeviceCertUsingCustomTrustStore( + const std::vector<std::string>& certs, + const base::Time& time, + std::unique_ptr<CertVerificationContext>* context, + CastDeviceCertPolicy* policy, + const CastCRL* crl, + CRLPolicy crl_policy, + net::TrustStore* trust_store) WARN_UNUSED_RESULT; // Exposed only for unit-tests, not for use in production code. // Production code would get a context from VerifyDeviceCert().
diff --git a/components/cast_certificate/cast_cert_validator_test_helpers.cc b/components/cast_certificate/cast_cert_validator_test_helpers.cc index a854abd..b63be34 100644 --- a/components/cast_certificate/cast_cert_validator_test_helpers.cc +++ b/components/cast_certificate/cast_cert_validator_test_helpers.cc
@@ -4,6 +4,7 @@ #include "components/cast_certificate/cast_cert_validator_test_helpers.h" +#include "net/cert/internal/cert_errors.h" #include "base/files/file_util.h" #include "base/path_service.h" #include "net/cert/pem_tokenizer.h" @@ -80,6 +81,28 @@ return result; } +std::unique_ptr<net::TrustStoreInMemory> CreateTrustStoreFromFile( + const std::string& path) { + std::unique_ptr<net::TrustStoreInMemory> trust_store( + new net::TrustStoreInMemory()); + const auto trusted_test_roots = + cast_certificate::testing::ReadCertificateChainFromFile(path); + for (const auto& trusted_root : trusted_test_roots) { + net::CertErrors errors; + scoped_refptr<net::ParsedCertificate> cert( + net::ParsedCertificate::Create(trusted_root, {}, &errors)); + EXPECT_TRUE(cert) << errors.ToDebugString(); + scoped_refptr<net::TrustAnchor> anchor = + net::TrustAnchor::CreateFromCertificateWithConstraints(std::move(cert)); + trust_store->AddTrustAnchor(std::move(anchor)); + } + return trust_store; +} + +base::Time ConvertUnixTimestampSeconds(uint64_t time) { + return base::Time::UnixEpoch() + base::TimeDelta::FromSeconds(time); +} + } // namespace testing } // namespace cast_certificate
diff --git a/components/cast_certificate/cast_cert_validator_test_helpers.h b/components/cast_certificate/cast_cert_validator_test_helpers.h index 72cb503..abd0751 100644 --- a/components/cast_certificate/cast_cert_validator_test_helpers.h +++ b/components/cast_certificate/cast_cert_validator_test_helpers.h
@@ -5,10 +5,17 @@ #ifndef COMPONENTS_CAST_CERTIFICATE_CAST_CERT_VALIDATOR_TEST_HELPERS_H_ #define COMPONENTS_CAST_CERTIFICATE_CAST_CERT_VALIDATOR_TEST_HELPERS_H_ +#include <memory> #include <string> #include <vector> #include "base/strings/string_piece.h" +#include "base/time/time.h" +#include "net/cert/internal/trust_store_in_memory.h" + +namespace net { +class TrustStoreInMemory; +} namespace cast_certificate { @@ -39,6 +46,13 @@ // (//src/components/test/data/cast_certificate) std::string ReadTestFileToString(const base::StringPiece& file_name); +// Creates a trust store using the test roots encoded in the PEM file at |path|. +std::unique_ptr<net::TrustStoreInMemory> CreateTrustStoreFromFile( + const std::string& path); + +// Converts uint64_t unix timestamp in seconds to base::Time. +base::Time ConvertUnixTimestampSeconds(uint64_t time); + } // namespace testing } // namespace cast_certificate
diff --git a/components/cast_certificate/cast_cert_validator_unittest.cc b/components/cast_certificate/cast_cert_validator_unittest.cc index a12f6da..1896755 100644 --- a/components/cast_certificate/cast_cert_validator_unittest.cc +++ b/components/cast_certificate/cast_cert_validator_unittest.cc
@@ -109,15 +109,9 @@ std::unique_ptr<CertVerificationContext> context; CastDeviceCertPolicy policy; - bool result; - if (trust_store.get()) { - result = - VerifyDeviceCertForTest(certs, time, &context, &policy, nullptr, - CRLPolicy::CRL_OPTIONAL, trust_store.get()); - } else { - result = VerifyDeviceCert(certs, time, &context, &policy, nullptr, - CRLPolicy::CRL_OPTIONAL); - } + bool result = VerifyDeviceCertUsingCustomTrustStore( + certs, time, &context, &policy, nullptr, CRLPolicy::CRL_OPTIONAL, + trust_store.get()); if (expected_result == RESULT_FAIL) { ASSERT_FALSE(result);
diff --git a/components/cast_certificate/cast_crl.cc b/components/cast_certificate/cast_crl.cc index 9defacf3..eb0b8d1d 100644 --- a/components/cast_certificate/cast_crl.cc +++ b/components/cast_certificate/cast_crl.cc
@@ -316,11 +316,21 @@ return true; } -// Parses and verifies the CRL used to verify the revocation status of -// Cast device certificates. +} // namespace + std::unique_ptr<CastCRL> ParseAndVerifyCRL(const std::string& crl_proto, - const base::Time& time, - net::TrustStore* trust_store) { + const base::Time& time) { + return ParseAndVerifyCRLUsingCustomTrustStore(crl_proto, time, + &CastCRLTrustStore::Get()); +} + +std::unique_ptr<CastCRL> ParseAndVerifyCRLUsingCustomTrustStore( + const std::string& crl_proto, + const base::Time& time, + net::TrustStore* trust_store) { + if (!trust_store) + return ParseAndVerifyCRL(crl_proto, time); + CrlBundle crl_bundle; if (!crl_bundle.ParseFromString(crl_proto)) { LOG(ERROR) << "CRL - Binary could not be parsed."; @@ -346,18 +356,4 @@ return nullptr; } -} // namespace - -std::unique_ptr<CastCRL> ParseAndVerifyCRL(const std::string& crl_proto, - const base::Time& time) { - return ParseAndVerifyCRL(crl_proto, time, &CastCRLTrustStore::Get()); -} - -std::unique_ptr<CastCRL> ParseAndVerifyCRLForTest( - const std::string& crl_proto, - const base::Time& time, - net::TrustStore* trust_store) { - return ParseAndVerifyCRL(crl_proto, time, trust_store); -} - } // namespace cast_certificate
diff --git a/components/cast_certificate/cast_crl.h b/components/cast_certificate/cast_crl.h index 0ab6964..77efd26 100644 --- a/components/cast_certificate/cast_crl.h +++ b/components/cast_certificate/cast_crl.h
@@ -53,13 +53,15 @@ std::unique_ptr<CastCRL> ParseAndVerifyCRL(const std::string& crl_proto, const base::Time& time); -// Exposed only for testing, not for use in production code. -// // This is an overloaded version of ParseAndVerifyCRL that allows // the input of a custom TrustStore. -std::unique_ptr<CastCRL> ParseAndVerifyCRLForTest(const std::string& crl_proto, - const base::Time& time, - net::TrustStore* trust_store); +// +// For production use pass |trust_store| as nullptr to use the production trust +// store. +std::unique_ptr<CastCRL> ParseAndVerifyCRLUsingCustomTrustStore( + const std::string& crl_proto, + const base::Time& time, + net::TrustStore* trust_store); } // namespace cast_certificate
diff --git a/components/cast_certificate/cast_crl_unittest.cc b/components/cast_certificate/cast_crl_unittest.cc index b108b5f..171f336 100644 --- a/components/cast_certificate/cast_crl_unittest.cc +++ b/components/cast_certificate/cast_crl_unittest.cc
@@ -14,31 +14,6 @@ namespace cast_certificate { namespace { -// Creates a trust store using the test roots encoded in the PEM file at |path|. -std::unique_ptr<net::TrustStoreInMemory> CreateTrustStoreFromFile( - const std::string& path) { - std::unique_ptr<net::TrustStoreInMemory> trust_store( - new net::TrustStoreInMemory()); - const auto trusted_test_roots = - cast_certificate::testing::ReadCertificateChainFromFile(path); - for (const auto& trusted_root : trusted_test_roots) { - net::CertErrors errors; - scoped_refptr<net::ParsedCertificate> cert( - net::ParsedCertificate::Create(trusted_root, {}, &errors)); - EXPECT_TRUE(cert) << errors.ToDebugString(); - scoped_refptr<net::TrustAnchor> anchor = - net::TrustAnchor::CreateFromCertificateWithConstraints(std::move(cert)); - trust_store->AddTrustAnchor(std::move(anchor)); - } - return trust_store; -} - -// Converts uint64_t unix timestamp in seconds to base::Time. -base::Time ConvertUnixTimestampSeconds(uint64_t time) { - return base::Time::UnixEpoch() + - base::TimeDelta::FromMilliseconds(time * 1000); -} - // Indicates the expected result of test step's verification. enum TestStepResult { RESULT_SUCCESS, @@ -53,15 +28,9 @@ net::TrustStore* cast_trust_store) { std::unique_ptr<CertVerificationContext> context; CastDeviceCertPolicy policy; - int result; - if (cast_trust_store != nullptr) { - result = VerifyDeviceCertForTest(certificate_chain, time, &context, &policy, - nullptr, CRLPolicy::CRL_OPTIONAL, - cast_trust_store); - } else { - result = VerifyDeviceCert(certificate_chain, time, &context, &policy, - nullptr, CRLPolicy::CRL_OPTIONAL); - } + int result = VerifyDeviceCertUsingCustomTrustStore( + certificate_chain, time, &context, &policy, nullptr, + CRLPolicy::CRL_OPTIONAL, cast_trust_store); if (expected_result != RESULT_SUCCESS) { EXPECT_FALSE(result); return !result; @@ -77,12 +46,9 @@ const std::string& crl_bundle, const base::Time& time, net::TrustStore* crl_trust_store) { - std::unique_ptr<CastCRL> crl; - if (crl_trust_store != nullptr) { - crl = ParseAndVerifyCRLForTest(crl_bundle, time, crl_trust_store); - } else { - crl = ParseAndVerifyCRL(crl_bundle, time); - } + std::unique_ptr<CastCRL> crl = + ParseAndVerifyCRLUsingCustomTrustStore(crl_bundle, time, crl_trust_store); + if (expected_result != RESULT_SUCCESS) { EXPECT_EQ(crl, nullptr); return crl == nullptr; @@ -106,11 +72,8 @@ net::TrustStore* crl_trust_store) { std::unique_ptr<CastCRL> crl; if (!crl_bundle.empty()) { - if (crl_trust_store != nullptr) { - crl = ParseAndVerifyCRLForTest(crl_bundle, crl_time, crl_trust_store); - } else { - crl = ParseAndVerifyCRL(crl_bundle, crl_time); - } + crl = ParseAndVerifyCRLUsingCustomTrustStore(crl_bundle, crl_time, + crl_trust_store); EXPECT_NE(crl.get(), nullptr); } @@ -119,15 +82,9 @@ CRLPolicy crl_policy = CRLPolicy::CRL_REQUIRED; if (!crl_required) crl_policy = CRLPolicy::CRL_OPTIONAL; - int result; - if (cast_trust_store != nullptr) { - result = - VerifyDeviceCertForTest(certificate_chain, cert_time, &context, &policy, - crl.get(), crl_policy, cast_trust_store); - } else { - result = VerifyDeviceCert(certificate_chain, cert_time, &context, &policy, - crl.get(), crl_policy); - } + int result = VerifyDeviceCertUsingCustomTrustStore( + certificate_chain, cert_time, &context, &policy, crl.get(), crl_policy, + cast_trust_store); if (expected_result != RESULT_SUCCESS) { EXPECT_FALSE(result); return !result; @@ -141,10 +98,10 @@ std::unique_ptr<net::TrustStoreInMemory> crl_trust_store; std::unique_ptr<net::TrustStoreInMemory> cast_trust_store; if (test_case.use_test_trust_anchors()) { - crl_trust_store = - CreateTrustStoreFromFile("certificates/cast_crl_test_root_ca.pem"); + crl_trust_store = testing::CreateTrustStoreFromFile( + "certificates/cast_crl_test_root_ca.pem"); cast_trust_store = - CreateTrustStoreFromFile("certificates/cast_test_root_ca.pem"); + testing::CreateTrustStoreFromFile("certificates/cast_test_root_ca.pem"); EXPECT_TRUE(crl_trust_store.get()); EXPECT_TRUE(cast_trust_store.get()); @@ -155,12 +112,12 @@ certificate_chain.push_back(cert); } - base::Time cert_verification_time = - ConvertUnixTimestampSeconds(test_case.cert_verification_time_seconds()); + base::Time cert_verification_time = testing::ConvertUnixTimestampSeconds( + test_case.cert_verification_time_seconds()); uint64_t crl_verify_time = test_case.crl_verification_time_seconds(); base::Time crl_verification_time = - ConvertUnixTimestampSeconds(crl_verify_time); + testing::ConvertUnixTimestampSeconds(crl_verify_time); if (crl_verify_time == 0) crl_verification_time = cert_verification_time; @@ -170,11 +127,9 @@ return TestVerifyCertificate(RESULT_FAIL, certificate_chain, cert_verification_time, cast_trust_store.get()); - break; case CRL_VERIFICATION_FAILED: return TestVerifyCRL(RESULT_FAIL, crl_bundle, crl_verification_time, crl_trust_store.get()); - break; case REVOCATION_CHECK_FAILED_WITHOUT_CRL: return TestVerifyCertificate(RESULT_SUCCESS, certificate_chain, cert_verification_time, @@ -185,7 +140,8 @@ crl_verification_time, cert_verification_time, true, cast_trust_store.get(), crl_trust_store.get()); - break; + case CRL_EXPIRED_AFTER_INITIAL_VERIFICATION: + // Fall-through intended. case REVOCATION_CHECK_FAILED: return TestVerifyCertificate(RESULT_SUCCESS, certificate_chain, cert_verification_time, @@ -196,7 +152,6 @@ crl_verification_time, cert_verification_time, false, cast_trust_store.get(), crl_trust_store.get()); - break; case SUCCESS: return (crl_bundle.empty() || TestVerifyCRL(RESULT_SUCCESS, crl_bundle, crl_verification_time, @@ -208,10 +163,8 @@ crl_verification_time, cert_verification_time, !crl_bundle.empty(), cast_trust_store.get(), crl_trust_store.get()); - break; case UNSPECIFIED: return false; - break; } return false; }
diff --git a/components/cast_certificate/proto/test_suite.proto b/components/cast_certificate/proto/test_suite.proto index d6b9a36..63bf09c0 100644 --- a/components/cast_certificate/proto/test_suite.proto +++ b/components/cast_certificate/proto/test_suite.proto
@@ -28,6 +28,10 @@ REVOCATION_CHECK_FAILED = 4; // No CRL was provided, but revocation check is required, and therefore fails. REVOCATION_CHECK_FAILED_WITHOUT_CRL = 5; + // CRL is valid at the time of initial verification, but when device cert + // revocation is checked, the CRL signer cert has expired and the CRL is no + // longer valid. + CRL_EXPIRED_AFTER_INITIAL_VERIFICATION = 6; } message DeviceCertTest {
diff --git a/components/certificate_transparency/log_dns_client_unittest.cc b/components/certificate_transparency/log_dns_client_unittest.cc index 684eedf..1c5825f 100644 --- a/components/certificate_transparency/log_dns_client_unittest.cc +++ b/components/certificate_transparency/log_dns_client_unittest.cc
@@ -115,6 +115,8 @@ base::RunLoop run_loop_; }; +} // namespace + class LogDnsClientTest : public ::testing::TestWithParam<net::IoMode> { protected: LogDnsClientTest() @@ -809,5 +811,4 @@ ::testing::Values(net::IoMode::ASYNC, net::IoMode::SYNCHRONOUS)); -} // namespace } // namespace certificate_transparency
diff --git a/components/certificate_transparency/mock_log_dns_traffic.cc b/components/certificate_transparency/mock_log_dns_traffic.cc index 22599950d..7a616592 100644 --- a/components/certificate_transparency/mock_log_dns_traffic.cc +++ b/components/certificate_transparency/mock_log_dns_traffic.cc
@@ -23,6 +23,10 @@ namespace { +// This is used for the last mock socket response as a sentinel to prevent +// trying to read more data than expected. +const net::MockRead kNoMoreData(net::SYNCHRONOUS, net::ERR_UNEXPECTED, 2); + // Necessary to expose SetDnsConfig for testing. class DnsChangeNotifier : public net::NetworkChangeNotifier { public: @@ -43,7 +47,7 @@ std::vector<char> CreateDnsTxtRequest(base::StringPiece qname) { std::string encoded_qname; - EXPECT_TRUE(net::DNSDomainFromDot(qname, &encoded_qname)); + CHECK(net::DNSDomainFromDot(qname, &encoded_qname)); // DNS query section: // N bytes - qname @@ -60,12 +64,12 @@ net::dns_protocol::Header header = {}; header.flags = base::HostToNet16(net::dns_protocol::kFlagRD); header.qdcount = base::HostToNet16(1); - EXPECT_TRUE(writer.WriteBytes(&header, sizeof(header))); + CHECK(writer.WriteBytes(&header, sizeof(header))); // Query section - EXPECT_TRUE(writer.WriteBytes(encoded_qname.data(), encoded_qname.size())); - EXPECT_TRUE(writer.WriteU16(net::dns_protocol::kTypeTXT)); - EXPECT_TRUE(writer.WriteU16(net::dns_protocol::kClassIN)); - EXPECT_EQ(0, writer.remaining()); + CHECK(writer.WriteBytes(encoded_qname.data(), encoded_qname.size())); + CHECK(writer.WriteU16(net::dns_protocol::kTypeTXT)); + CHECK(writer.WriteU16(net::dns_protocol::kClassIN)); + CHECK_EQ(0, writer.remaining()); return request; } @@ -94,15 +98,15 @@ // Write the answer section base::BigEndianWriter writer(response.data() + request.size(), response.size() - request.size()); - EXPECT_TRUE(writer.WriteU8(0xc0)); // qname is a pointer - EXPECT_TRUE(writer.WriteU8( + CHECK(writer.WriteU8(0xc0)); // qname is a pointer + CHECK(writer.WriteU8( sizeof(*header))); // address of qname (start of query section) - EXPECT_TRUE(writer.WriteU16(net::dns_protocol::kTypeTXT)); - EXPECT_TRUE(writer.WriteU16(net::dns_protocol::kClassIN)); - EXPECT_TRUE(writer.WriteU32(ttl)); - EXPECT_TRUE(writer.WriteU16(answer.size())); - EXPECT_TRUE(writer.WriteBytes(answer.data(), answer.size())); - EXPECT_EQ(0, writer.remaining()); + CHECK(writer.WriteU16(net::dns_protocol::kTypeTXT)); + CHECK(writer.WriteU16(net::dns_protocol::kClassIN)); + CHECK(writer.WriteU32(ttl)); + CHECK(writer.WriteU16(answer.size())); + CHECK(writer.WriteBytes(answer.data(), answer.size())); + CHECK_EQ(0, writer.remaining()); return response; } @@ -121,56 +125,81 @@ } // namespace -namespace internal { +// A container for all of the data needed for simulating a socket. +// This is useful because Mock{Read,Write}, SequencedSocketData and +// MockClientSocketFactory all do not take ownership of or copy their arguments, +// so it is necessary to manage the lifetime of those arguments. Wrapping all +// of that up in a single class simplifies this. +class MockLogDnsTraffic::MockSocketData { + public: + // A socket that expects one write and one read operation. + MockSocketData(const std::vector<char>& write, const std::vector<char>& read) + : expected_write_payload_(write), + expected_read_payload_(read), + expected_write_(net::SYNCHRONOUS, + expected_write_payload_.data(), + expected_write_payload_.size(), + 0), + expected_reads_{net::MockRead(net::ASYNC, + expected_read_payload_.data(), + expected_read_payload_.size(), + 1), + kNoMoreData}, + socket_data_(expected_reads_, 2, &expected_write_, 1) {} -MockSocketData::MockSocketData(const std::vector<char>& write, - const std::vector<char>& read) - : expected_write_payload_(write), - expected_read_payload_(read), - expected_write_(net::SYNCHRONOUS, - expected_write_payload_.data(), - expected_write_payload_.size(), - 0), - expected_reads_{net::MockRead(net::ASYNC, - expected_read_payload_.data(), - expected_read_payload_.size(), - 1), - no_more_data_}, - socket_data_(expected_reads_, 2, &expected_write_, 1) {} + // A socket that expects one write and a read error. + MockSocketData(const std::vector<char>& write, net::Error error) + : expected_write_payload_(write), + expected_write_(net::SYNCHRONOUS, + expected_write_payload_.data(), + expected_write_payload_.size(), + 0), + expected_reads_{net::MockRead(net::ASYNC, error, 1), kNoMoreData}, + socket_data_(expected_reads_, 2, &expected_write_, 1) {} -MockSocketData::MockSocketData(const std::vector<char>& write, int net_error) - : expected_write_payload_(write), - expected_write_(net::SYNCHRONOUS, - expected_write_payload_.data(), - expected_write_payload_.size(), - 0), - expected_reads_{net::MockRead(net::ASYNC, net_error, 1), no_more_data_}, - socket_data_(expected_reads_, 2, &expected_write_, 1) {} + // A socket that expects one write and no response. + explicit MockSocketData(const std::vector<char>& write) + : expected_write_payload_(write), + expected_write_(net::SYNCHRONOUS, + expected_write_payload_.data(), + expected_write_payload_.size(), + 0), + expected_reads_{net::MockRead(net::SYNCHRONOUS, net::ERR_IO_PENDING, 1), + kNoMoreData}, + socket_data_(expected_reads_, 2, &expected_write_, 1) {} -MockSocketData::MockSocketData(const std::vector<char>& write) - : expected_write_payload_(write), - expected_write_(net::SYNCHRONOUS, - expected_write_payload_.data(), - expected_write_payload_.size(), - 0), - expected_reads_{net::MockRead(net::SYNCHRONOUS, net::ERR_IO_PENDING, 1), - no_more_data_}, - socket_data_(expected_reads_, 2, &expected_write_, 1) {} + ~MockSocketData() {} -MockSocketData::~MockSocketData() {} + void SetWriteMode(net::IoMode mode) { expected_write_.mode = mode; } + void SetReadMode(net::IoMode mode) { expected_reads_[0].mode = mode; } -void MockSocketData::AddToFactory( - net::MockClientSocketFactory* socket_factory) { - socket_factory->AddSocketDataProvider(&socket_data_); -} + void AddToFactory(net::MockClientSocketFactory* socket_factory) { + socket_factory->AddSocketDataProvider(&socket_data_); + } -const net::MockRead MockSocketData::no_more_data_(net::SYNCHRONOUS, - net::ERR_IO_PENDING, - 2); + private: + // This class only supports one write and one read, so just need to store one + // payload each. + const std::vector<char> expected_write_payload_; + const std::vector<char> expected_read_payload_; -} // namespace internal + // Encapsulates the data that is expected to be written to a socket. + net::MockWrite expected_write_; -using internal::MockSocketData; + // Encapsulates the data/error that should be returned when reading from a + // socket. The second "expected" read is a sentinel that causes socket reads + // beyond the first to hang until they timeout. This results in better + // test failure messages (rather than a CHECK-fail due to a socket read + // overrunning the MockRead array) and behaviour more like a real socket when + // an unexpected second socket read occurs. + net::MockRead expected_reads_[2]; + + // Holds pointers to |expected_write_| and |expected_reads_|. This is what is + // added to net::MockClientSocketFactory to prepare a mock socket. + net::SequencedSocketData socket_data_; + + DISALLOW_COPY_AND_ASSIGN(MockSocketData); +}; MockLogDnsTraffic::MockLogDnsTraffic() : socket_read_mode_(net::ASYNC) {} @@ -184,8 +213,8 @@ } void MockLogDnsTraffic::ExpectRequestAndSocketError(base::StringPiece qname, - int net_error) { - EmplaceMockSocketData(CreateDnsTxtRequest(qname), net_error); + net::Error error) { + EmplaceMockSocketData(CreateDnsTxtRequest(qname), error); } void MockLogDnsTraffic::ExpectRequestAndTimeout(base::StringPiece qname) {
diff --git a/components/certificate_transparency/mock_log_dns_traffic.h b/components/certificate_transparency/mock_log_dns_traffic.h index 2496737f..78257d8 100644 --- a/components/certificate_transparency/mock_log_dns_traffic.h +++ b/components/certificate_transparency/mock_log_dns_traffic.h
@@ -19,62 +19,28 @@ namespace certificate_transparency { -namespace internal { - -// A container for all of the data we need to keep alive for a mock socket. -// This is useful because Mock{Read,Write}, SequencedSocketData and -// MockClientSocketFactory all do not take ownership of or copy their arguments, -// so we have to manage the lifetime of those arguments ourselves. Wrapping all -// of that up in a single class simplifies this. -// This cannot be forward declared because MockLogDnsTraffic has a -// vector<unique_ptr<MockSocketData>> member, which requires MockSocketData be -// defined. -class MockSocketData { - public: - // A socket that expects one write and one read operation. - MockSocketData(const std::vector<char>& write, const std::vector<char>& read); - // A socket that expects one write and a read error. - MockSocketData(const std::vector<char>& write, int net_error); - // A socket that expects one write and no response. - explicit MockSocketData(const std::vector<char>& write); - - ~MockSocketData(); - - void SetWriteMode(net::IoMode mode) { expected_write_.mode = mode; } - void SetReadMode(net::IoMode mode) { expected_reads_[0].mode = mode; } - - void AddToFactory(net::MockClientSocketFactory* socket_factory); - - private: - // Prevents read overruns and makes a socket timeout the default behaviour. - static const net::MockRead no_more_data_; - - // This class only supports one write and one read, so just need to store one - // payload each. - const std::vector<char> expected_write_payload_; - const std::vector<char> expected_read_payload_; - // Encapsulates the data that is expected to be written to a socket. - net::MockWrite expected_write_; - // Encapsulates the data/error that should be returned when reading from a - // socket. The second "expected" read is always |no_more_data_|, which - // causes the socket read to hang until it times out. This results in better - // test failure messages (rather than a CHECK-fail due to a socket read - // overrunning the MockRead array) and behaviour more like a real socket when - // an unexpected second socket read occurs. - net::MockRead expected_reads_[2]; - // Holds pointers to |expected_write_| and |expected_reads_|. This is what is - // added to net::MockClientSocketFactory to prepare a mock socket. - net::SequencedSocketData socket_data_; - - DISALLOW_COPY_AND_ASSIGN(MockSocketData); -}; - -} // namespace internal - // Mocks DNS requests and responses for a Certificate Transparency (CT) log. // This is implemented using mock sockets. Call the CreateDnsClient() method to // get a net::DnsClient wired up to these mock sockets. // The Expect*() methods must be called from within a GTest test case. +// +// Example Usage: +// // net::DnsClient requires an I/O message loop for async operations. +// base::MessageLoopForIO message_loop; +// +// // Create a mock NetworkChangeNotifier to propagate DNS config. +// std::unique_ptr<net::NetworkChangeNotifier> net_change_notifier( +// net::NetworkChangeNotifier::CreateMock()); +// +// MockLogDnsTraffic mock_dns; +// mock_dns.InitializeDnsConfig(); +// // Use the Expect* methods to define expected DNS requests and responses. +// mock_dns.ExpectLeafIndexRequestAndResponse( +// "D4S6DSV2J743QJZEQMH4UYHEYK7KRQ5JIQOCPMFUHZVJNFGHXACA.hash.ct.test.", +// "123456"); +// +// LogDnsClient log_client(mock_dns.CreateDnsClient(), ...); +// log_client.QueryAuditProof("ct.test", ..., base::Bind(...)); class MockLogDnsTraffic { public: MockLogDnsTraffic(); @@ -85,14 +51,16 @@ // specified by |rcode| occurred. See RFC1035, Section 4.1.1 for |rcode| // values. void ExpectRequestAndErrorResponse(base::StringPiece qname, uint8_t rcode); + // Expect a CT DNS request for the domain |qname|. - // Such a request will trigger a socket error of type |net_error|. - // |net_error| can be any net:Error value. - void ExpectRequestAndSocketError(base::StringPiece qname, int net_error); + // Such a request will trigger a socket error of type |error|. + void ExpectRequestAndSocketError(base::StringPiece qname, net::Error error); + // Expect a CT DNS request for the domain |qname|. // Such a request will timeout. // This will reduce the DNS timeout to minimize test duration. void ExpectRequestAndTimeout(base::StringPiece qname); + // Expect a CT DNS request for the domain |qname|. // Such a request will receive a DNS TXT response containing |txt_strings|. void ExpectRequestAndResponse( @@ -130,12 +98,19 @@ // It is this DNS client that the expectations will be tested against. std::unique_ptr<net::DnsClient> CreateDnsClient(); + private: + // Allows tests to change socket read mode. Only the LogDnsClient tests should + // need to do so, to ensure consistent behaviour regardless of mode. + friend class LogDnsClientTest; + + class MockSocketData; + // Sets whether mock reads should complete synchronously or asynchronously. + // By default, they complete asynchronously. void SetSocketReadMode(net::IoMode read_mode) { socket_read_mode_ = read_mode; } - private: // Constructs MockSocketData from |args| and adds it to |socket_factory_|. template <typename... Args> void EmplaceMockSocketData(Args&&... args); @@ -148,7 +123,7 @@ // One MockSocketData for each socket that is created. This corresponds to one // for each DNS request sent. - std::vector<std::unique_ptr<internal::MockSocketData>> mock_socket_data_; + std::vector<std::unique_ptr<MockSocketData>> mock_socket_data_; // Provides as many mock sockets as there are entries in |mock_socket_data_|. net::MockClientSocketFactory socket_factory_; // Controls whether mock socket reads are asynchronous.
diff --git a/components/cronet/android/java/src/org/chromium/net/impl/CronetBidirectionalStream.java b/components/cronet/android/java/src/org/chromium/net/impl/CronetBidirectionalStream.java index d9c80a1..9a1fb8b 100644 --- a/components/cronet/android/java/src/org/chromium/net/impl/CronetBidirectionalStream.java +++ b/components/cronet/android/java/src/org/chromium/net/impl/CronetBidirectionalStream.java
@@ -86,6 +86,7 @@ private final String mRequestHeaders[]; private final boolean mDelayRequestHeadersUntilFirstFlush; private final Collection<Object> mRequestAnnotations; + private UrlRequestException mException; /* * Synchronizes access to mNativeStream, mReadState and mWriteState. @@ -639,10 +640,19 @@ connectEndMs, sslStartMs, sslEndMs, sendingStartMs, sendingEndMs, pushStartMs, pushEndMs, responseStartMs, requestEndMs, socketReused, sentBytesCount, receivedBytesCount); - // TODO(xunjieli): Fill this with real values. - final RequestFinishedInfo requestFinishedInfo = - new RequestFinishedInfo(mInitialUrl, mRequestAnnotations, mMetrics, - RequestFinishedInfo.SUCCEEDED, mResponseInfo, null); + assert mReadState == mWriteState; + assert (mReadState == State.SUCCESS) || (mReadState == State.ERROR) + || (mReadState == State.CANCELED); + int finishedReason; + if (mReadState == State.SUCCESS) { + finishedReason = RequestFinishedInfo.SUCCEEDED; + } else if (mReadState == State.CANCELED) { + finishedReason = RequestFinishedInfo.CANCELED; + } else { + finishedReason = RequestFinishedInfo.FAILED; + } + final RequestFinishedInfo requestFinishedInfo = new RequestFinishedInfo(mInitialUrl, + mRequestAnnotations, mMetrics, finishedReason, mResponseInfo, mException); mRequestContext.reportFinished(requestFinishedInfo); } } @@ -738,6 +748,7 @@ * Fails the stream with an exception. Only called on the Executor. */ private void failWithExceptionOnExecutor(CronetException e) { + mException = e; // Do not call into mCallback if request is complete. synchronized (mNativeStreamLock) { if (isDoneLocked()) {
diff --git a/components/cronet/android/java/src/org/chromium/net/impl/CronetUrlRequest.java b/components/cronet/android/java/src/org/chromium/net/impl/CronetUrlRequest.java index bda19719..dcca5aa 100644 --- a/components/cronet/android/java/src/org/chromium/net/impl/CronetUrlRequest.java +++ b/components/cronet/android/java/src/org/chromium/net/impl/CronetUrlRequest.java
@@ -712,7 +712,6 @@ } private RequestFinishedInfo getRequestFinishedInfo() { - // TODO(mgersh): fill in real values for finishedReason and exception return new RequestFinishedInfo(mInitialUrl, mRequestAnnotations, mMetrics, mFinishedReason, mResponseInfo, mException); }
diff --git a/components/cronet/android/test/javatests/src/org/chromium/net/BidirectionalStreamTest.java b/components/cronet/android/test/javatests/src/org/chromium/net/BidirectionalStreamTest.java index 100546e..57b4dc4 100644 --- a/components/cronet/android/test/javatests/src/org/chromium/net/BidirectionalStreamTest.java +++ b/components/cronet/android/test/javatests/src/org/chromium/net/BidirectionalStreamTest.java
@@ -1200,6 +1200,13 @@ } assertEquals(expectError, callback.mError != null); assertEquals(expectError, callback.mOnErrorCalled); + if (expectError) { + assertNotNull(finishedInfo.getException()); + assertEquals(RequestFinishedInfo.FAILED, finishedInfo.getFinishedReason()); + } else { + assertNull(finishedInfo.getException()); + assertEquals(RequestFinishedInfo.CANCELED, finishedInfo.getFinishedReason()); + } assertEquals(failureType == FailureType.CANCEL_SYNC || failureType == FailureType.CANCEL_ASYNC || failureType == FailureType.CANCEL_ASYNC_WITHOUT_PAUSE,
diff --git a/components/cronet/android/test/javatests/src/org/chromium/net/urlconnection/CronetChunkedOutputStreamTest.java b/components/cronet/android/test/javatests/src/org/chromium/net/urlconnection/CronetChunkedOutputStreamTest.java index 32bd8b0..13603ed 100644 --- a/components/cronet/android/test/javatests/src/org/chromium/net/urlconnection/CronetChunkedOutputStreamTest.java +++ b/components/cronet/android/test/javatests/src/org/chromium/net/urlconnection/CronetChunkedOutputStreamTest.java
@@ -128,6 +128,8 @@ OutputStream out = connection.getOutputStream(); out.write(1); out.write(1); + // Forces OutputStream implementation to flush. crbug.com/653072 + out.flush(); fail(); } catch (IOException e) { if (!testingSystemHttpURLConnection()) {
diff --git a/components/cronet/android/test/javatests/src/org/chromium/net/urlconnection/CronetFixedModeOutputStreamTest.java b/components/cronet/android/test/javatests/src/org/chromium/net/urlconnection/CronetFixedModeOutputStreamTest.java index d7765f1..bb481cd 100644 --- a/components/cronet/android/test/javatests/src/org/chromium/net/urlconnection/CronetFixedModeOutputStreamTest.java +++ b/components/cronet/android/test/javatests/src/org/chromium/net/urlconnection/CronetFixedModeOutputStreamTest.java
@@ -109,6 +109,8 @@ try { OutputStream out = connection.getOutputStream(); out.write(1); + // Forces OutputStream implementation to flush. crbug.com/653072 + out.flush(); fail(); } catch (IOException e) { if (!testingSystemHttpURLConnection()) {
diff --git a/components/data_reduction_proxy/content/browser/content_lofi_decider.cc b/components/data_reduction_proxy/content/browser/content_lofi_decider.cc index e482f66..db658528 100644 --- a/components/data_reduction_proxy/content/browser/content_lofi_decider.cc +++ b/components/data_reduction_proxy/content/browser/content_lofi_decider.cc
@@ -6,6 +6,8 @@ #include <string> +#include "base/strings/string_split.h" +#include "base/strings/string_util.h" #include "components/data_reduction_proxy/core/common/data_reduction_proxy_headers.h" #include "components/data_reduction_proxy/core/common/data_reduction_proxy_params.h" #include "content/public/browser/resource_request_info.h" @@ -34,18 +36,19 @@ return false; } -bool ContentLoFiDecider::MaybeAddLoFiDirectiveToHeaders( +void ContentLoFiDecider::MaybeSetAcceptTransformHeader( const net::URLRequest& request, net::HttpRequestHeaders* headers) const { const content::ResourceRequestInfo* request_info = content::ResourceRequestInfo::ForRequest(&request); if (!request_info) - return false; + return; - // The Lo-Fi directive should not be added for users in the Lo-Fi field - // trial "Control" group. Check that the user is in a group that should - // get "q=low". + content::ResourceType resource_type = request_info->GetResourceType(); + + // The Lo-Fi and Lite Page directives should not be added for users in the + // Lo-Fi field trial "Control" group. bool lofi_enabled_via_flag_or_field_trial = params::IsLoFiOnViaFlags() || params::IsIncludedInLoFiEnabledFieldTrial(); @@ -53,39 +56,108 @@ params::AreLitePagesEnabledViaFlags() || params::IsIncludedInLitePageFieldTrial(); + // Previews only operate on HTTP. + if (!request.url().SchemeIs("http")) + return; + + // Chrome-Proxy-Accept-Transform takes at most one token. + if (headers->HasHeader(chrome_proxy_accept_transform_header())) + return; + + if (resource_type == content::RESOURCE_TYPE_MEDIA) { + headers->SetHeader(chrome_proxy_accept_transform_header(), + compressed_video_directive()); + return; + } + // User is not using Lo-Fi or is part of the "Control" group. if (!request_info->IsUsingLoFi() || !lofi_enabled_via_flag_or_field_trial) - return false; + return; - std::string header_value; + // LoFi is not allowed on the main frame, stylesheet, script, font resource, + // media, service worker, or CSP report. + bool resource_type_supports_empty_image = + !(resource_type == content::RESOURCE_TYPE_MAIN_FRAME || + resource_type == content::RESOURCE_TYPE_STYLESHEET || + resource_type == content::RESOURCE_TYPE_SCRIPT || + resource_type == content::RESOURCE_TYPE_FONT_RESOURCE || + resource_type == content::RESOURCE_TYPE_MEDIA || + resource_type == content::RESOURCE_TYPE_CSP_REPORT); - if (headers->HasHeader(chrome_proxy_header())) { - headers->GetHeader(chrome_proxy_header(), &header_value); - headers->RemoveHeader(chrome_proxy_header()); - header_value += ", "; - } - - // If in the lite page field trial or flag is enabled, only add the - // "q=preview" directive on main frame requests. Do not add Lo-Fi directives - // to other requests when lite pages are enabled. + // If in the preview field trial or the preview flag is enabled, only add the + // "lite-page" directive on main frame requests. Do not add "empty-image" + // directives to other requests when Lite Page previews are enabled. + std::string accept_transform_value; if (lite_page_via_flag_or_field_trial) { - if (request.load_flags() & net::LOAD_MAIN_FRAME_DEPRECATED) { - if (params::AreLitePagesEnabledViaFlags()) { - header_value += chrome_proxy_lite_page_ignore_blacklist_directive(); - header_value += ", "; - } - header_value += chrome_proxy_lite_page_directive(); - } - } else if (!(request.load_flags() & net::LOAD_MAIN_FRAME_DEPRECATED)) { - // If previews are not enabled, add "q=low" for requests that are not main - // frame. - header_value += chrome_proxy_lo_fi_directive(); + if (resource_type == content::RESOURCE_TYPE_MAIN_FRAME) + accept_transform_value = lite_page_directive(); + } else if (resource_type_supports_empty_image) { + accept_transform_value = empty_image_directive(); } - if (!header_value.empty()) - headers->SetHeader(chrome_proxy_header(), header_value); + if (accept_transform_value.empty()) + return; - return true; + headers->SetHeader(chrome_proxy_accept_transform_header(), + accept_transform_value); +} + +bool ContentLoFiDecider::IsSlowPagePreviewRequested( + const net::HttpRequestHeaders& headers) const { + std::string accept_transform_header_value; + if (!headers.GetHeader(chrome_proxy_accept_transform_header(), + &accept_transform_header_value)) { + return false; + } + + std::vector<std::string> tokens = + base::SplitString(base::ToLowerASCII(accept_transform_header_value), ";", + base::KEEP_WHITESPACE, base::SPLIT_WANT_ALL); + // A slow page preview is a request for any unqualified transform type. + if (tokens.size() != 1) + return false; + std::string transform_type; + base::TrimWhitespaceASCII(tokens[0], base::TRIM_ALL, &transform_type); + return (transform_type == lite_page_directive() || + transform_type == empty_image_directive()); +} + +bool ContentLoFiDecider::IsLitePagePreviewRequested( + const net::HttpRequestHeaders& headers) const { + std::string accept_transform_header_value; + if (!headers.GetHeader(chrome_proxy_accept_transform_header(), + &accept_transform_header_value)) { + return false; + } + std::vector<std::string> tokens = + base::SplitString(base::ToLowerASCII(accept_transform_header_value), ";", + base::KEEP_WHITESPACE, base::SPLIT_WANT_ALL); + if (tokens.empty()) + return false; + std::string transform_type; + base::TrimWhitespaceASCII(tokens[0], base::TRIM_ALL, &transform_type); + return transform_type == lite_page_directive(); +} + +void ContentLoFiDecider::RemoveAcceptTransformHeader( + net::HttpRequestHeaders* headers) const { + headers->RemoveHeader(chrome_proxy_accept_transform_header()); +} + +void ContentLoFiDecider::MaybeSetIgnorePreviewsBlacklistDirective( + net::HttpRequestHeaders* headers) const { + if (!headers || !params::AreLitePagesEnabledViaFlags() || + !IsLitePagePreviewRequested(*headers)) { + return; + } + std::string chrome_proxy_header_value; + headers->GetHeader(chrome_proxy_header(), &chrome_proxy_header_value); + headers->RemoveHeader(chrome_proxy_header()); + if (!chrome_proxy_header_value.empty()) + chrome_proxy_header_value += ", "; + chrome_proxy_header_value += + chrome_proxy_lite_page_ignore_blacklist_directive(); + headers->SetHeader(chrome_proxy_header(), chrome_proxy_header_value); } bool ContentLoFiDecider::ShouldRecordLoFiUMA(
diff --git a/components/data_reduction_proxy/content/browser/content_lofi_decider.h b/components/data_reduction_proxy/content/browser/content_lofi_decider.h index cc3face..00a3c44 100644 --- a/components/data_reduction_proxy/content/browser/content_lofi_decider.h +++ b/components/data_reduction_proxy/content/browser/content_lofi_decider.h
@@ -28,9 +28,17 @@ // LoFiDecider implementation: bool IsUsingLoFiMode(const net::URLRequest& request) const override; - bool MaybeAddLoFiDirectiveToHeaders( + void MaybeSetAcceptTransformHeader( const net::URLRequest& request, net::HttpRequestHeaders* headers) const override; + bool IsSlowPagePreviewRequested( + const net::HttpRequestHeaders& headers) const override; + bool IsLitePagePreviewRequested( + const net::HttpRequestHeaders& headers) const override; + void RemoveAcceptTransformHeader( + net::HttpRequestHeaders* headers) const override; + void MaybeSetIgnorePreviewsBlacklistDirective( + net::HttpRequestHeaders* headers) const override; bool ShouldRecordLoFiUMA(const net::URLRequest& request) const override; private:
diff --git a/components/data_reduction_proxy/content/browser/content_lofi_decider_unittest.cc b/components/data_reduction_proxy/content/browser/content_lofi_decider_unittest.cc index c77449d..aa6271f 100644 --- a/components/data_reduction_proxy/content/browser/content_lofi_decider_unittest.cc +++ b/components/data_reduction_proxy/content/browser/content_lofi_decider_unittest.cc
@@ -96,21 +96,43 @@ std::move(data_reduction_proxy_lofi_decider)); } - std::unique_ptr<net::URLRequest> CreateRequest(bool is_using_lofi) { - std::unique_ptr<net::URLRequest> request = context_.CreateRequest( - GURL("http://www.google.com/"), net::IDLE, &delegate_); - + void AllocateRequestInfoForTesting(net::URLRequest* request, + content::ResourceType resource_type, + bool is_using_lofi) { content::ResourceRequestInfo::AllocateForTesting( - request.get(), content::RESOURCE_TYPE_SUB_FRAME, NULL, -1, -1, -1, - false, // is_main_frame + request, resource_type, NULL, -1, -1, -1, + resource_type == content::RESOURCE_TYPE_MAIN_FRAME, false, // parent_is_main_frame false, // allow_download false, // is_async is_using_lofi); + } + std::unique_ptr<net::URLRequest> CreateRequest(bool is_main_frame, + bool is_using_lofi) { + std::unique_ptr<net::URLRequest> request = context_.CreateRequest( + GURL("http://www.google.com/"), net::IDLE, &delegate_); + AllocateRequestInfoForTesting( + request.get(), (is_main_frame ? content::RESOURCE_TYPE_MAIN_FRAME + : content::RESOURCE_TYPE_SUB_FRAME), + is_using_lofi); return request; } + std::unique_ptr<net::URLRequest> CreateRequestByType( + content::ResourceType resource_type, + bool scheme_is_https, + bool is_using_lofi) { + std::unique_ptr<net::URLRequest> request = + context_.CreateRequest(GURL(scheme_is_https ? "https://www.google.com/" + : "http://www.google.com/"), + net::IDLE, &delegate_); + AllocateRequestInfoForTesting(request.get(), resource_type, is_using_lofi); + return request; + } + + void DelegateStageDone(int result) {} + void NotifyBeforeSendHeaders(net::HttpRequestHeaders* headers, net::URLRequest* request, bool use_data_reduction_proxy) { @@ -126,28 +148,53 @@ data_reduction_proxy_info.UseNamedProxy("proxy.com"); } + data_reduction_proxy_network_delegate_->NotifyBeforeStartTransaction( + request, base::Bind(&ContentLoFiDeciderTest::DelegateStageDone, + base::Unretained(this)), + headers); data_reduction_proxy_network_delegate_->NotifyBeforeSendHeaders( request, data_reduction_proxy_info, proxy_retry_info, headers); } - static void VerifyLoFiHeader(bool expected_lofi_used, - const net::HttpRequestHeaders& headers) { - EXPECT_TRUE(headers.HasHeader(chrome_proxy_header())); - std::string header_value; - headers.GetHeader(chrome_proxy_header(), &header_value); - EXPECT_EQ( - expected_lofi_used, - header_value.find(chrome_proxy_lo_fi_directive()) != std::string::npos); - } - static void VerifyLitePageHeader(bool expected_lite_page_used, const net::HttpRequestHeaders& headers) { - EXPECT_TRUE(headers.HasHeader(chrome_proxy_header())); + if (expected_lite_page_used) + EXPECT_TRUE(headers.HasHeader(chrome_proxy_accept_transform_header())); std::string header_value; - headers.GetHeader(chrome_proxy_header(), &header_value); + headers.GetHeader(chrome_proxy_accept_transform_header(), &header_value); EXPECT_EQ(expected_lite_page_used, - header_value.find(chrome_proxy_lite_page_directive()) != - std::string::npos); + header_value.find(lite_page_directive()) != std::string::npos); + } + + static void VerifyLoFiHeader(bool expected_lofi_used, + const net::HttpRequestHeaders& headers) { + if (expected_lofi_used) + EXPECT_TRUE(headers.HasHeader(chrome_proxy_accept_transform_header())); + std::string header_value; + headers.GetHeader(chrome_proxy_accept_transform_header(), &header_value); + EXPECT_EQ(expected_lofi_used, + header_value.find(empty_image_directive()) != std::string::npos); + } + + static void VerifyLoFiPreviewHeader(bool expected_lofi_preview_used, + const net::HttpRequestHeaders& headers) { + if (expected_lofi_preview_used) + EXPECT_TRUE(headers.HasHeader(chrome_proxy_accept_transform_header())); + std::string header_value; + headers.GetHeader(chrome_proxy_accept_transform_header(), &header_value); + EXPECT_EQ(expected_lofi_preview_used, + header_value.find(lite_page_directive()) != std::string::npos); + } + + static void VerifyVideoHeader(bool expected_compressed_video_used, + const net::HttpRequestHeaders& headers) { + EXPECT_EQ(expected_compressed_video_used, + headers.HasHeader(chrome_proxy_accept_transform_header())); + std::string header_value; + headers.GetHeader(chrome_proxy_accept_transform_header(), &header_value); + EXPECT_EQ( + expected_compressed_video_used, + header_value.find(compressed_video_directive()) != std::string::npos); } static void VerifyLitePageIgnoreBlacklistHeader( @@ -186,7 +233,7 @@ for (size_t i = 0; i < arraysize(tests); ++i) { std::unique_ptr<net::URLRequest> request = - CreateRequest(tests[i].is_using_lofi); + CreateRequest(tests[i].is_main_frame, tests[i].is_using_lofi); base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); command_line->InitFromArgv(command_line->argv()); if (tests[i].is_using_lite_page) { @@ -205,9 +252,6 @@ command_line->AppendSwitchASCII( switches::kDataReductionProxyLoFi, switches::kDataReductionProxyLoFiValueAlwaysOn); - if (tests[i].is_main_frame) - request->SetLoadFlags(request->load_flags() | - net::LOAD_MAIN_FRAME_DEPRECATED); headers.Clear(); NotifyBeforeSendHeaders(&headers, request.get(), true); VerifyLoFiHeader(tests[i].is_using_lofi && !tests[i].is_using_lite_page && @@ -228,7 +272,9 @@ // The Lo-Fi flag is "always-on" and Lo-Fi is being used. Lo-Fi header // should be added. - request->SetLoadFlags(0); + AllocateRequestInfoForTesting(request.get(), + content::RESOURCE_TYPE_SUB_FRAME, + tests[i].is_using_lofi); headers.Clear(); NotifyBeforeSendHeaders(&headers, request.get(), true); VerifyLoFiHeader(tests[i].is_using_lofi && !tests[i].is_using_lite_page, @@ -277,20 +323,60 @@ // Enable Lo-Fi. const struct { bool is_using_lofi; - bool is_main_frame; - } tests[] = {{false, false}, {false, true}, {true, false}, {true, true}}; + content::ResourceType resource_type; + } tests[] = {{false, content::RESOURCE_TYPE_MAIN_FRAME}, + {false, content::RESOURCE_TYPE_SUB_FRAME}, + {false, content::RESOURCE_TYPE_STYLESHEET}, + {false, content::RESOURCE_TYPE_SCRIPT}, + {false, content::RESOURCE_TYPE_IMAGE}, + {false, content::RESOURCE_TYPE_FONT_RESOURCE}, + {false, content::RESOURCE_TYPE_SUB_RESOURCE}, + {false, content::RESOURCE_TYPE_OBJECT}, + {false, content::RESOURCE_TYPE_MEDIA}, + {false, content::RESOURCE_TYPE_WORKER}, + {false, content::RESOURCE_TYPE_SHARED_WORKER}, + {false, content::RESOURCE_TYPE_PREFETCH}, + {false, content::RESOURCE_TYPE_FAVICON}, + {false, content::RESOURCE_TYPE_XHR}, + {false, content::RESOURCE_TYPE_PING}, + {false, content::RESOURCE_TYPE_SERVICE_WORKER}, + {false, content::RESOURCE_TYPE_CSP_REPORT}, + {false, content::RESOURCE_TYPE_PLUGIN_RESOURCE}, + + {true, content::RESOURCE_TYPE_MAIN_FRAME}, + {true, content::RESOURCE_TYPE_SUB_FRAME}, + {true, content::RESOURCE_TYPE_STYLESHEET}, + {true, content::RESOURCE_TYPE_SCRIPT}, + {true, content::RESOURCE_TYPE_IMAGE}, + {true, content::RESOURCE_TYPE_FONT_RESOURCE}, + {true, content::RESOURCE_TYPE_SUB_RESOURCE}, + {true, content::RESOURCE_TYPE_OBJECT}, + {true, content::RESOURCE_TYPE_MEDIA}, + {true, content::RESOURCE_TYPE_WORKER}, + {true, content::RESOURCE_TYPE_SHARED_WORKER}, + {true, content::RESOURCE_TYPE_PREFETCH}, + {true, content::RESOURCE_TYPE_FAVICON}, + {true, content::RESOURCE_TYPE_XHR}, + {true, content::RESOURCE_TYPE_PING}, + {true, content::RESOURCE_TYPE_SERVICE_WORKER}, + {true, content::RESOURCE_TYPE_CSP_REPORT}, + {true, content::RESOURCE_TYPE_PLUGIN_RESOURCE}}; for (size_t i = 0; i < arraysize(tests); ++i) { - std::unique_ptr<net::URLRequest> request = - CreateRequest(tests[i].is_using_lofi); - if (tests[i].is_main_frame) - request->SetLoadFlags(request->load_flags() | - net::LOAD_MAIN_FRAME_DEPRECATED); + std::unique_ptr<net::URLRequest> request = CreateRequestByType( + tests[i].resource_type, false, tests[i].is_using_lofi); net::HttpRequestHeaders headers; NotifyBeforeSendHeaders(&headers, request.get(), true); - VerifyLoFiHeader(tests[i].is_using_lofi && !tests[i].is_main_frame, - headers); - VerifyLitePageHeader(false, headers); + bool is_lofi_resource_type = + !(tests[i].resource_type == content::RESOURCE_TYPE_MAIN_FRAME || + tests[i].resource_type == content::RESOURCE_TYPE_STYLESHEET || + tests[i].resource_type == content::RESOURCE_TYPE_SCRIPT || + tests[i].resource_type == content::RESOURCE_TYPE_FONT_RESOURCE || + tests[i].resource_type == content::RESOURCE_TYPE_MEDIA || + tests[i].resource_type == content::RESOURCE_TYPE_CSP_REPORT); + + VerifyLoFiHeader(tests[i].is_using_lofi && is_lofi_resource_type, headers); + VerifyLoFiPreviewHeader(false, headers); VerifyLitePageIgnoreBlacklistHeader(false, headers); DataReductionProxyData* data = DataReductionProxyData::GetData(*request); EXPECT_EQ(tests[i].is_using_lofi, data->lofi_requested()) << i; @@ -309,10 +395,7 @@ for (size_t i = 0; i < arraysize(tests); ++i) { std::unique_ptr<net::URLRequest> request = - CreateRequest(tests[i].is_using_lofi); - if (tests[i].is_main_frame) - request->SetLoadFlags(request->load_flags() | - net::LOAD_MAIN_FRAME_DEPRECATED); + CreateRequest(tests[i].is_main_frame, tests[i].is_using_lofi); net::HttpRequestHeaders headers; NotifyBeforeSendHeaders(&headers, request.get(), true); VerifyLoFiHeader(false, headers); @@ -337,10 +420,7 @@ for (size_t i = 0; i < arraysize(tests); ++i) { std::unique_ptr<net::URLRequest> request = - CreateRequest(tests[i].is_using_lofi); - if (tests[i].is_main_frame) - request->SetLoadFlags(request->load_flags() | - net::LOAD_MAIN_FRAME_DEPRECATED); + CreateRequest(tests[i].is_main_frame, tests[i].is_using_lofi); net::HttpRequestHeaders headers; NotifyBeforeSendHeaders(&headers, request.get(), true); VerifyLoFiHeader(false, headers); @@ -391,11 +471,8 @@ test_context_->config()->SetNetworkProhibitivelySlow( tests[i].network_prohibitively_slow); - std::unique_ptr<net::URLRequest> request = - CreateRequest(tests[i].network_prohibitively_slow); - if (tests[i].is_main_frame) - request->SetLoadFlags(request->load_flags() | - net::LOAD_MAIN_FRAME_DEPRECATED); + std::unique_ptr<net::URLRequest> request = CreateRequest( + tests[i].is_main_frame, tests[i].network_prohibitively_slow); net::HttpRequestHeaders headers; NotifyBeforeSendHeaders(&headers, request.get(), true); @@ -447,11 +524,8 @@ test_context_->config()->SetNetworkProhibitivelySlow( tests[i].network_prohibitively_slow); - std::unique_ptr<net::URLRequest> request = - CreateRequest(tests[i].network_prohibitively_slow); - if (tests[i].is_main_frame) - request->SetLoadFlags(request->load_flags() | - net::LOAD_MAIN_FRAME_DEPRECATED); + std::unique_ptr<net::URLRequest> request = CreateRequest( + tests[i].is_main_frame, tests[i].network_prohibitively_slow); net::HttpRequestHeaders headers; NotifyBeforeSendHeaders(&headers, request.get(), true); @@ -472,14 +546,136 @@ for (size_t i = 0; i < arraysize(tests); ++i) { std::unique_ptr<net::URLRequest> request = - CreateRequest(tests[i].is_using_lofi); + CreateRequest(false, tests[i].is_using_lofi); net::HttpRequestHeaders headers; NotifyBeforeSendHeaders(&headers, request.get(), false); std::string header_value; - headers.GetHeader(chrome_proxy_header(), &header_value); - EXPECT_EQ(std::string::npos, - header_value.find(chrome_proxy_lo_fi_directive())); + headers.GetHeader(chrome_proxy_accept_transform_header(), &header_value); + EXPECT_EQ(std::string::npos, header_value.find(empty_image_directive())); } } +TEST_F(ContentLoFiDeciderTest, VideoDirectiveNotOverridden) { + base::FieldTrialList field_trial_list(nullptr); + base::FieldTrialList::CreateFieldTrial(params::GetLoFiFieldTrialName(), + "Enabled"); + // Verify the directive gets added even when LoFi is triggered. + test_context_->config()->SetNetworkProhibitivelySlow(true); + std::unique_ptr<net::URLRequest> request = + CreateRequestByType(content::RESOURCE_TYPE_MEDIA, false, true); + net::HttpRequestHeaders headers; + NotifyBeforeSendHeaders(&headers, request.get(), true); + VerifyVideoHeader(true, headers); +} + +TEST_F(ContentLoFiDeciderTest, VideoDirectiveNotAdded) { + base::FieldTrialList field_trial_list(nullptr); + base::FieldTrialList::CreateFieldTrial(params::GetLoFiFieldTrialName(), + "Enabled"); + test_context_->config()->SetNetworkProhibitivelySlow(true); + std::unique_ptr<net::URLRequest> request = + CreateRequestByType(content::RESOURCE_TYPE_MEDIA, false, true); + net::HttpRequestHeaders headers; + // Verify the header isn't there when the data reduction proxy is disabled. + NotifyBeforeSendHeaders(&headers, request.get(), false); + VerifyVideoHeader(false, headers); +} + +TEST_F(ContentLoFiDeciderTest, VideoDirectiveDoesNotOverride) { + base::FieldTrialList field_trial_list(nullptr); + base::FieldTrialList::CreateFieldTrial(params::GetLoFiFieldTrialName(), + "Enabled"); + // Verify the directive gets added even when LoFi is triggered. + test_context_->config()->SetNetworkProhibitivelySlow(true); + std::unique_ptr<net::URLRequest> request = + CreateRequestByType(content::RESOURCE_TYPE_MEDIA, false, true); + net::HttpRequestHeaders headers; + headers.SetHeader(chrome_proxy_accept_transform_header(), "foo"); + NotifyBeforeSendHeaders(&headers, request.get(), true); + std::string header_value; + headers.GetHeader(chrome_proxy_accept_transform_header(), &header_value); + EXPECT_EQ("foo", header_value); +} + +TEST_F(ContentLoFiDeciderTest, IsSlowPagePreviewRequested) { + std::unique_ptr<data_reduction_proxy::ContentLoFiDecider> lofi_decider( + new data_reduction_proxy::ContentLoFiDecider()); + net::HttpRequestHeaders headers; + EXPECT_FALSE(lofi_decider->IsSlowPagePreviewRequested(headers)); + headers.SetHeader(chrome_proxy_accept_transform_header(), "lite-page"); + EXPECT_TRUE(lofi_decider->IsSlowPagePreviewRequested(headers)); + headers.SetHeader(chrome_proxy_accept_transform_header(), "lite-page;foo"); + EXPECT_FALSE(lofi_decider->IsSlowPagePreviewRequested(headers)); + headers.SetHeader(chrome_proxy_accept_transform_header(), "empty-image"); + EXPECT_TRUE(lofi_decider->IsSlowPagePreviewRequested(headers)); + headers.SetHeader(chrome_proxy_accept_transform_header(), "empty-image;foo"); + EXPECT_FALSE(lofi_decider->IsSlowPagePreviewRequested(headers)); + headers.SetHeader("Another-Header", "empty-image"); + lofi_decider->RemoveAcceptTransformHeader(&headers); + EXPECT_FALSE(lofi_decider->IsSlowPagePreviewRequested(headers)); +} + +TEST_F(ContentLoFiDeciderTest, IsLitePagePreviewRequested) { + std::unique_ptr<data_reduction_proxy::ContentLoFiDecider> lofi_decider( + new data_reduction_proxy::ContentLoFiDecider()); + net::HttpRequestHeaders headers; + EXPECT_FALSE(lofi_decider->IsLitePagePreviewRequested(headers)); + headers.SetHeader(chrome_proxy_accept_transform_header(), "empty-image"); + EXPECT_FALSE(lofi_decider->IsLitePagePreviewRequested(headers)); + headers.SetHeader(chrome_proxy_accept_transform_header(), + "empty-image;lite-page"); + EXPECT_FALSE(lofi_decider->IsLitePagePreviewRequested(headers)); + headers.SetHeader(chrome_proxy_accept_transform_header(), "lite-page"); + EXPECT_TRUE(lofi_decider->IsLitePagePreviewRequested(headers)); + headers.SetHeader(chrome_proxy_accept_transform_header(), "lite-page;foo"); + EXPECT_TRUE(lofi_decider->IsLitePagePreviewRequested(headers)); + headers.SetHeader("Another-Header", "lite-page"); + lofi_decider->RemoveAcceptTransformHeader(&headers); + EXPECT_FALSE(lofi_decider->IsLitePagePreviewRequested(headers)); +} + +TEST_F(ContentLoFiDeciderTest, RemoveAcceptTransformHeader) { + std::unique_ptr<data_reduction_proxy::ContentLoFiDecider> lofi_decider( + new data_reduction_proxy::ContentLoFiDecider()); + net::HttpRequestHeaders headers; + headers.SetHeader(chrome_proxy_accept_transform_header(), "Foo"); + EXPECT_TRUE(headers.HasHeader(chrome_proxy_accept_transform_header())); + lofi_decider->RemoveAcceptTransformHeader(&headers); + EXPECT_FALSE(headers.HasHeader(chrome_proxy_accept_transform_header())); +} + +TEST_F(ContentLoFiDeciderTest, MaybeIgnoreBlacklist) { + base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); + command_line->InitFromArgv(command_line->argv()); + std::unique_ptr<data_reduction_proxy::ContentLoFiDecider> lofi_decider( + new data_reduction_proxy::ContentLoFiDecider()); + net::HttpRequestHeaders headers; + lofi_decider->MaybeSetIgnorePreviewsBlacklistDirective(&headers); + EXPECT_FALSE(headers.HasHeader(chrome_proxy_header())); + + headers.SetHeader(chrome_proxy_header(), "Foo"); + lofi_decider->MaybeSetIgnorePreviewsBlacklistDirective(&headers); + std::string header_value; + headers.GetHeader(chrome_proxy_header(), &header_value); + EXPECT_EQ("Foo", header_value); + + headers.RemoveHeader(chrome_proxy_header()); + command_line->AppendSwitch(switches::kEnableDataReductionProxyLitePage); + headers.SetHeader(chrome_proxy_accept_transform_header(), "empty-image"); + lofi_decider->MaybeSetIgnorePreviewsBlacklistDirective(&headers); + EXPECT_FALSE(headers.HasHeader(chrome_proxy_header())); + + headers.SetHeader(chrome_proxy_accept_transform_header(), "lite-page"); + lofi_decider->MaybeSetIgnorePreviewsBlacklistDirective(&headers); + EXPECT_TRUE(headers.HasHeader(chrome_proxy_header())); + headers.GetHeader(chrome_proxy_header(), &header_value); + EXPECT_EQ("exp=ignore_preview_blacklist", header_value); + + headers.SetHeader(chrome_proxy_header(), "Foo"); + lofi_decider->MaybeSetIgnorePreviewsBlacklistDirective(&headers); + EXPECT_TRUE(headers.HasHeader(chrome_proxy_header())); + headers.GetHeader(chrome_proxy_header(), &header_value); + EXPECT_EQ("Foo, exp=ignore_preview_blacklist", header_value); +} + } // namespace data_reduction_roxy
diff --git a/components/data_reduction_proxy/core/browser/data_reduction_proxy_config.cc b/components/data_reduction_proxy/core/browser/data_reduction_proxy_config.cc index 78f2c59..67d424f 100644 --- a/components/data_reduction_proxy/core/browser/data_reduction_proxy_config.cc +++ b/components/data_reduction_proxy/core/browser/data_reduction_proxy_config.cc
@@ -353,8 +353,14 @@ const std::vector<net::ProxyServer>& proxy_list = config_values_->proxies_for_http(); + + net::HostPortPair host_port_pair = proxy_server.host_port_pair(); const auto proxy_it = - std::find(proxy_list.begin(), proxy_list.end(), proxy_server); + std::find_if(proxy_list.begin(), proxy_list.end(), + [&host_port_pair](const net::ProxyServer& proxy) { + return proxy.is_valid() && + proxy.host_port_pair().Equals(host_port_pair); + }); if (proxy_it != proxy_list.end()) { if (proxy_info) {
diff --git a/components/data_reduction_proxy/core/browser/data_reduction_proxy_config_unittest.cc b/components/data_reduction_proxy/core/browser/data_reduction_proxy_config_unittest.cc index 3e48065..7c52872 100644 --- a/components/data_reduction_proxy/core/browser/data_reduction_proxy_config_unittest.cc +++ b/components/data_reduction_proxy/core/browser/data_reduction_proxy_config_unittest.cc
@@ -705,6 +705,25 @@ net::HostPortPair::FromString("otherorigin.net:443")), false, std::vector<net::ProxyServer>(), 0, }, + { + // Verifies that when determining if a proxy is a valid data reduction + // proxy, only the host port pairs are compared. + net::ProxyServer::FromURI("origin.net:443", + net::ProxyServer::SCHEME_QUIC), + true, std::vector<net::ProxyServer>(proxies_for_http.begin(), + proxies_for_http.end()), + 0, + }, + { + net::ProxyServer::FromURI("origin2.net:443", + net::ProxyServer::SCHEME_HTTPS), + false, std::vector<net::ProxyServer>(), 0, + }, + { + net::ProxyServer::FromURI("origin2.net:443", + net::ProxyServer::SCHEME_QUIC), + false, std::vector<net::ProxyServer>(), 0, + }, }; std::unique_ptr<DataReductionProxyMutableConfigValues> config_values =
diff --git a/components/data_reduction_proxy/core/browser/data_reduction_proxy_network_delegate.cc b/components/data_reduction_proxy/core/browser/data_reduction_proxy_network_delegate.cc index b45cd94..4ed8ce9a 100644 --- a/components/data_reduction_proxy/core/browser/data_reduction_proxy_network_delegate.cc +++ b/components/data_reduction_proxy/core/browser/data_reduction_proxy_network_delegate.cc
@@ -230,6 +230,20 @@ } } +void DataReductionProxyNetworkDelegate::OnBeforeStartTransactionInternal( + net::URLRequest* request, + const net::CompletionCallback& callback, + net::HttpRequestHeaders* headers) { + if (!data_reduction_proxy_io_data_) + return; + if (!data_reduction_proxy_io_data_->lofi_decider()) + return; + if (!data_reduction_proxy_io_data_->IsEnabled()) + return; + data_reduction_proxy_io_data_->lofi_decider()->MaybeSetAcceptTransformHeader( + *request, headers); +} + void DataReductionProxyNetworkDelegate::OnBeforeSendHeadersInternal( net::URLRequest* request, const net::ProxyInfo& proxy_info, @@ -252,13 +266,27 @@ return; } + bool using_data_reduction_proxy = true; // The following checks rule out direct, invalid, and othe connection types. if (!proxy_info.is_http() && !proxy_info.is_https() && !proxy_info.is_quic()) - return; - if (proxy_info.proxy_server().host_port_pair().IsEmpty()) - return; - if (!data_reduction_proxy_config_->IsDataReductionProxy( - proxy_info.proxy_server(), nullptr)) { + using_data_reduction_proxy = false; + else if (proxy_info.proxy_server().host_port_pair().IsEmpty()) + using_data_reduction_proxy = false; + else if (!data_reduction_proxy_config_->IsDataReductionProxy( + proxy_info.proxy_server(), nullptr)) { + using_data_reduction_proxy = false; + } + + LoFiDecider* lofi_decider = nullptr; + if (data_reduction_proxy_io_data_) + lofi_decider = data_reduction_proxy_io_data_->lofi_decider(); + + if (!using_data_reduction_proxy) { + if (lofi_decider) { + // If not using the data reduction proxy, strip the + // Chrome-Proxy-Accept-Transform header. + lofi_decider->RemoveAcceptTransformHeader(headers); + } return; } @@ -280,23 +308,23 @@ } if (data_reduction_proxy_io_data_ && - data_reduction_proxy_io_data_->lofi_decider()) { - LoFiDecider* lofi_decider = data_reduction_proxy_io_data_->lofi_decider(); - const bool is_using_lofi_mode = - lofi_decider->MaybeAddLoFiDirectiveToHeaders(*request, headers); - - if ((request->load_flags() & net::LOAD_MAIN_FRAME_DEPRECATED)) { - data_reduction_proxy_io_data_->SetLoFiModeActiveOnMainFrame( - is_using_lofi_mode); - } - - if (data) - data->set_lofi_requested(lofi_decider->ShouldRecordLoFiUMA(*request)); + (request->load_flags() & net::LOAD_MAIN_FRAME_DEPRECATED)) { + data_reduction_proxy_io_data_->SetLoFiModeActiveOnMainFrame( + lofi_decider ? lofi_decider->IsSlowPagePreviewRequested(*headers) + : false); } - if (data_reduction_proxy_request_options_) { - data_reduction_proxy_request_options_->AddRequestHeader(headers); + if (data) { + data->set_lofi_requested( + lofi_decider ? lofi_decider->ShouldRecordLoFiUMA(*request) : false); } + + if (!data_reduction_proxy_request_options_) + return; + + data_reduction_proxy_request_options_->AddRequestHeader(headers); + if (lofi_decider) + lofi_decider->MaybeSetIgnorePreviewsBlacklistDirective(headers); } void DataReductionProxyNetworkDelegate::OnCompletedInternal( @@ -313,22 +341,19 @@ net::HttpRequestHeaders request_headers; if (data_reduction_proxy_io_data_ && request->response_headers() && - request->response_headers()->HasHeaderValue( - chrome_proxy_header(), chrome_proxy_lo_fi_directive())) { + IsEmptyImagePreview(*(request->response_headers()))) { data_reduction_proxy_io_data_->lofi_ui_service()->OnLoFiReponseReceived( *request); } else if (data_reduction_proxy_io_data_ && request->response_headers() && - request->response_headers()->HasHeaderValue( - chrome_proxy_header(), chrome_proxy_lite_page_directive())) { + IsLitePagePreview(*(request->response_headers()))) { RecordLitePageTransformationType(LITE_PAGE); - } else if (request->GetFullRequestHeaders(&request_headers) && - request_headers.HasHeader(chrome_proxy_header())) { + } else if (request->GetFullRequestHeaders(&request_headers)) { + // TODO(bengr): transform processing logic should happen elsewhere. std::string header_value; - request_headers.GetHeader(chrome_proxy_header(), &header_value); - if (header_value.find(chrome_proxy_lite_page_directive()) != - std::string::npos) { + request_headers.GetHeader(chrome_proxy_accept_transform_header(), + &header_value); + if (header_value == lite_page_directive()) RecordLitePageTransformationType(NO_TRANSFORMATION_LITE_PAGE_REQUESTED); - } } if (!request->response_info().network_accessed ||
diff --git a/components/data_reduction_proxy/core/browser/data_reduction_proxy_network_delegate.h b/components/data_reduction_proxy/core/browser/data_reduction_proxy_network_delegate.h index 8f443da..0372bd7 100644 --- a/components/data_reduction_proxy/core/browser/data_reduction_proxy_network_delegate.h +++ b/components/data_reduction_proxy/core/browser/data_reduction_proxy_network_delegate.h
@@ -95,6 +95,14 @@ const net::CompletionCallback& callback, GURL* new_url) override; + // Called before an HTTP transaction is started. Allows the delegate to + // modify the Chrome-Proxy-Accept-Transform header to convey acceptable + // content transformations. + void OnBeforeStartTransactionInternal( + net::URLRequest* request, + const net::CompletionCallback& callback, + net::HttpRequestHeaders* headers) override; + // Called after connection. Allows the delegate to read/write // |headers| before they get sent out. |headers| is valid only until // OnCompleted or OnURLRequestDestroyed is called for this request.
diff --git a/components/data_reduction_proxy/core/browser/data_reduction_proxy_network_delegate_unittest.cc b/components/data_reduction_proxy/core/browser/data_reduction_proxy_network_delegate_unittest.cc index c8cd0c9..b50c159 100644 --- a/components/data_reduction_proxy/core/browser/data_reduction_proxy_network_delegate_unittest.cc +++ b/components/data_reduction_proxy/core/browser/data_reduction_proxy_network_delegate_unittest.cc
@@ -88,7 +88,9 @@ class TestLoFiDecider : public LoFiDecider { public: - TestLoFiDecider() : should_request_lofi_resource_(false) {} + TestLoFiDecider() + : should_request_lofi_resource_(false), + ignore_is_using_data_reduction_proxy_check_(false) {} ~TestLoFiDecider() override {} bool IsUsingLoFiMode(const net::URLRequest& request) const override { @@ -99,32 +101,56 @@ should_request_lofi_resource_ = should_request_lofi_resource; } - bool MaybeAddLoFiDirectiveToHeaders( + void MaybeSetAcceptTransformHeader( const net::URLRequest& request, net::HttpRequestHeaders* headers) const override { if (should_request_lofi_resource_) { - std::string header_value; - - if (headers->HasHeader(chrome_proxy_header())) { - headers->GetHeader(chrome_proxy_header(), &header_value); - headers->RemoveHeader(chrome_proxy_header()); - header_value += ", "; - } - - header_value += "q=low"; - headers->SetHeader(chrome_proxy_header(), header_value); - return true; + headers->SetHeader(chrome_proxy_accept_transform_header(), + empty_image_directive()); } + } + bool IsSlowPagePreviewRequested( + const net::HttpRequestHeaders& headers) const override { + std::string header_value; + if (headers.GetHeader(chrome_proxy_accept_transform_header(), + &header_value)) { + return header_value == empty_image_directive(); + } return false; } + bool IsLitePagePreviewRequested( + const net::HttpRequestHeaders& headers) const override { + std::string header_value; + if (headers.GetHeader(chrome_proxy_accept_transform_header(), + &header_value)) { + return header_value == lite_page_directive(); + } + return false; + } + + void RemoveAcceptTransformHeader( + net::HttpRequestHeaders* headers) const override { + if (ignore_is_using_data_reduction_proxy_check_) + return; + headers->RemoveHeader(chrome_proxy_accept_transform_header()); + } + + void MaybeSetIgnorePreviewsBlacklistDirective( + net::HttpRequestHeaders* headers) const override {} + bool ShouldRecordLoFiUMA(const net::URLRequest& request) const override { return should_request_lofi_resource_; } + void ignore_is_using_data_reduction_proxy_check() { + ignore_is_using_data_reduction_proxy_check_ = true; + } + private: bool should_request_lofi_resource_; + bool ignore_is_using_data_reduction_proxy_check_; }; class TestLoFiUIService : public LoFiUIService { @@ -174,9 +200,9 @@ EXPECT_EQ(expected_data_reduction_proxy_used, headers.HasHeader(chrome_proxy_header())); std::string header_value; - headers.GetHeader(chrome_proxy_header(), &header_value); + headers.GetHeader(chrome_proxy_accept_transform_header(), &header_value); EXPECT_EQ(expected_data_reduction_proxy_used && expected_lofi_used, - header_value.find("q=low") != std::string::npos); + header_value.find("empty-image") != std::string::npos); } void VerifyWasLoFiModeActiveOnMainFrame(bool expected_value) { @@ -229,6 +255,26 @@ return request; } + void DelegateStageDone(int result) {} + + void NotifyNetworkDelegate(net::URLRequest* request, + const net::ProxyInfo& data_reduction_proxy_info, + const net::ProxyRetryInfoMap& proxy_retry_info, + net::HttpRequestHeaders* headers) { + network_delegate()->NotifyBeforeURLRequest( + request, + base::Bind(&DataReductionProxyNetworkDelegateTest::DelegateStageDone, + base::Unretained(this)), + nullptr); + network_delegate()->NotifyBeforeStartTransaction( + request, + base::Bind(&DataReductionProxyNetworkDelegateTest::DelegateStageDone, + base::Unretained(this)), + headers); + network_delegate()->NotifyBeforeSendHeaders( + request, data_reduction_proxy_info, proxy_retry_info, headers); + } + int64_t total_received_bytes() const { return GetSessionNetworkStatsInfoInt64("session_received_content_length"); } @@ -364,14 +410,15 @@ net::HttpRequestHeaders headers; net::ProxyRetryInfoMap proxy_retry_info; - std::unique_ptr<net::URLRequest> fake_request(FetchURLRequest( - GURL("http://www.google.com/"), nullptr, std::string(), 0)); + net::TestDelegate delegate; + std::unique_ptr<net::URLRequest> fake_request = context()->CreateRequest( + GURL("http://www.google.com/"), net::IDLE, &delegate); fake_request->SetLoadFlags(net::LOAD_MAIN_FRAME_DEPRECATED); lofi_decider()->SetIsUsingLoFiMode( config()->ShouldEnableLoFiMode(*fake_request.get())); - network_delegate()->NotifyBeforeSendHeaders(fake_request.get(), - data_reduction_proxy_info, - proxy_retry_info, &headers); + NotifyNetworkDelegate(fake_request.get(), data_reduction_proxy_info, + proxy_retry_info, &headers); + VerifyHeaders(tests[i].is_data_reduction_proxy, true, headers); VerifyWasLoFiModeActiveOnMainFrame(tests[i].is_data_reduction_proxy); VerifyDataReductionProxyData( @@ -383,12 +430,12 @@ // Lo-Fi is already off. Lo-Fi should not be used. net::HttpRequestHeaders headers; net::ProxyRetryInfoMap proxy_retry_info; - std::unique_ptr<net::URLRequest> fake_request(FetchURLRequest( - GURL("http://www.google.com/"), nullptr, std::string(), 0)); + net::TestDelegate delegate; + std::unique_ptr<net::URLRequest> fake_request = context()->CreateRequest( + GURL("http://www.google.com/"), net::IDLE, &delegate); lofi_decider()->SetIsUsingLoFiMode(false); - network_delegate()->NotifyBeforeSendHeaders(fake_request.get(), - data_reduction_proxy_info, - proxy_retry_info, &headers); + NotifyNetworkDelegate(fake_request.get(), data_reduction_proxy_info, + proxy_retry_info, &headers); VerifyHeaders(tests[i].is_data_reduction_proxy, false, headers); // Not a mainframe request, WasLoFiModeActiveOnMainFrame should still be // true if the proxy is a Data Reduction Proxy. @@ -401,13 +448,13 @@ // Lo-Fi is already on. Lo-Fi should be used. net::HttpRequestHeaders headers; net::ProxyRetryInfoMap proxy_retry_info; - std::unique_ptr<net::URLRequest> fake_request(FetchURLRequest( - GURL("http://www.google.com/"), nullptr, std::string(), 0)); + net::TestDelegate delegate; + std::unique_ptr<net::URLRequest> fake_request = context()->CreateRequest( + GURL("http://www.google.com/"), net::IDLE, &delegate); lofi_decider()->SetIsUsingLoFiMode(true); - network_delegate()->NotifyBeforeSendHeaders(fake_request.get(), - data_reduction_proxy_info, - proxy_retry_info, &headers); + NotifyNetworkDelegate(fake_request.get(), data_reduction_proxy_info, + proxy_retry_info, &headers); VerifyHeaders(tests[i].is_data_reduction_proxy, true, headers); // Not a mainframe request, WasLoFiModeActiveOnMainFrame should still be // true if the proxy is a Data Reduction Proxy. @@ -421,13 +468,13 @@ // State of Lo-Fi should persist until next page load. net::HttpRequestHeaders headers; net::ProxyRetryInfoMap proxy_retry_info; - std::unique_ptr<net::URLRequest> fake_request(FetchURLRequest( - GURL("http://www.google.com/"), nullptr, std::string(), 0)); + net::TestDelegate delegate; + std::unique_ptr<net::URLRequest> fake_request = context()->CreateRequest( + GURL("http://www.google.com/"), net::IDLE, &delegate); fake_request->SetLoadFlags(net::LOAD_MAIN_FRAME_DEPRECATED); lofi_decider()->SetIsUsingLoFiMode(false); - network_delegate()->NotifyBeforeSendHeaders(fake_request.get(), - data_reduction_proxy_info, - proxy_retry_info, &headers); + NotifyNetworkDelegate(fake_request.get(), data_reduction_proxy_info, + proxy_retry_info, &headers); VerifyHeaders(tests[i].is_data_reduction_proxy, false, headers); VerifyWasLoFiModeActiveOnMainFrame(false); VerifyDataReductionProxyData(*fake_request, @@ -438,12 +485,12 @@ // Lo-Fi is off. Lo-Fi is still not used. net::HttpRequestHeaders headers; net::ProxyRetryInfoMap proxy_retry_info; - std::unique_ptr<net::URLRequest> fake_request(FetchURLRequest( - GURL("http://www.google.com/"), nullptr, std::string(), 0)); + net::TestDelegate delegate; + std::unique_ptr<net::URLRequest> fake_request = context()->CreateRequest( + GURL("http://www.google.com/"), net::IDLE, &delegate); lofi_decider()->SetIsUsingLoFiMode(false); - network_delegate()->NotifyBeforeSendHeaders(fake_request.get(), - data_reduction_proxy_info, - proxy_retry_info, &headers); + NotifyNetworkDelegate(fake_request.get(), data_reduction_proxy_info, + proxy_retry_info, &headers); VerifyHeaders(tests[i].is_data_reduction_proxy, false, headers); // Not a mainframe request, WasLoFiModeActiveOnMainFrame should still be // false. @@ -456,14 +503,14 @@ // Main frame request. Lo-Fi should be used. net::HttpRequestHeaders headers; net::ProxyRetryInfoMap proxy_retry_info; - std::unique_ptr<net::URLRequest> fake_request(FetchURLRequest( - GURL("http://www.google.com/"), nullptr, std::string(), 0)); + net::TestDelegate delegate; + std::unique_ptr<net::URLRequest> fake_request = context()->CreateRequest( + GURL("http://www.google.com/"), net::IDLE, &delegate); fake_request->SetLoadFlags(net::LOAD_MAIN_FRAME_DEPRECATED); lofi_decider()->SetIsUsingLoFiMode( config()->ShouldEnableLoFiMode(*fake_request.get())); - network_delegate()->NotifyBeforeSendHeaders(fake_request.get(), - data_reduction_proxy_info, - proxy_retry_info, &headers); + NotifyNetworkDelegate(fake_request.get(), data_reduction_proxy_info, + proxy_retry_info, &headers); VerifyHeaders(tests[i].is_data_reduction_proxy, true, headers); VerifyWasLoFiModeActiveOnMainFrame(tests[i].is_data_reduction_proxy); VerifyDataReductionProxyData( @@ -801,7 +848,7 @@ "x-original-content-length: 200\r\n"; if (tests[i].lofi_response) - response_headers += "Chrome-Proxy: q=low\r\n"; + response_headers += "Chrome-Proxy-Content-Transform: empty-image\r\n"; response_headers += "\r\n"; FetchURLRequest(GURL("http://www.google.com/"), nullptr, response_headers, @@ -818,7 +865,8 @@ base::HistogramTester histogram_tester; net::HttpRequestHeaders request_headers; - request_headers.SetHeader("Chrome-Proxy", "q=preview"); + request_headers.SetHeader("chrome-proxy-accept-transform", "lite-page"); + lofi_decider()->ignore_is_using_data_reduction_proxy_check(); FetchURLRequest(GURL("http://www.google.com/"), &request_headers, std::string(), 140); histogram_tester.ExpectBucketCount(kLoFiTransformationTypeHistogram, @@ -826,7 +874,7 @@ std::string response_headers = "HTTP/1.1 200 OK\r\n" - "Chrome-Proxy: q=preview\r\n" + "Chrome-Proxy-Content-Transform: lite-page\r\n" "Date: Wed, 28 Nov 2007 09:40:09 GMT\r\n" "Expires: Mon, 24 Nov 2014 12:45:26 GMT\r\n" "Via: 1.1 Chrome-Compression-Proxy\r\n"
diff --git a/components/data_reduction_proxy/core/browser/data_reduction_proxy_request_options.cc b/components/data_reduction_proxy/core/browser/data_reduction_proxy_request_options.cc index 7f0382e2..d4f6ae26 100644 --- a/components/data_reduction_proxy/core/browser/data_reduction_proxy_request_options.cc +++ b/components/data_reduction_proxy/core/browser/data_reduction_proxy_request_options.cc
@@ -91,9 +91,12 @@ } void DataReductionProxyRequestOptions::UpdateExperiments() { + // TODO(bengr): Simplify this so there's only one way to set experiment via + // flags. See crbug.com/656195. std::string experiments = base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( data_reduction_proxy::switches::kDataReductionProxyExperiment); + if (!experiments.empty()) { base::StringTokenizer experiment_tokenizer(experiments, ", "); experiment_tokenizer.set_quote_chars("\""); @@ -104,6 +107,7 @@ } else { AddServerExperimentFromFieldTrial(); } + RegenerateRequestHeaderValue(); }
diff --git a/components/data_reduction_proxy/core/browser/data_reduction_proxy_settings.cc b/components/data_reduction_proxy/core/browser/data_reduction_proxy_settings.cc index 9114b69a..92851186 100644 --- a/components/data_reduction_proxy/core/browser/data_reduction_proxy_settings.cc +++ b/components/data_reduction_proxy/core/browser/data_reduction_proxy_settings.cc
@@ -38,7 +38,7 @@ namespace data_reduction_proxy { const char kDataReductionPassThroughHeader[] = - "Chrome-Proxy: pass-through\nCache-Control: no-cache"; + "Chrome-Proxy-Accept-Transform: identity\nCache-Control: no-cache"; DataReductionProxySettings::DataReductionProxySettings() : unreachable_(false),
diff --git a/components/data_reduction_proxy/core/common/data_reduction_proxy_headers.cc b/components/data_reduction_proxy/core/common/data_reduction_proxy_headers.cc index 461e6d6..7c17395 100644 --- a/components/data_reduction_proxy/core/common/data_reduction_proxy_headers.cc +++ b/components/data_reduction_proxy/core/common/data_reduction_proxy_headers.cc
@@ -13,6 +13,7 @@ #include "base/rand_util.h" #include "base/strings/string_number_conversions.h" +#include "base/strings/string_split.h" #include "base/strings/string_util.h" #include "base/time/time.h" #include "components/data_reduction_proxy/core/common/data_reduction_proxy_event_creator.h" @@ -26,11 +27,19 @@ namespace { const char kChromeProxyHeader[] = "chrome-proxy"; +const char kChromeProxyAcceptTransformHeader[] = + "chrome-proxy-accept-transform"; +const char kChromeProxyContentTransformHeader[] = + "chrome-proxy-content-transform"; const char kActionValueDelimiter = '='; -const char kChromeProxyLoFiDirective[] = "q=low"; -const char kChromeProxyLitePageDirective[] = "q=preview"; +// Previews directives. +const char kEmptyImageDirective[] = "empty-image"; +const char kLitePageDirective[] = "lite-page"; +const char kCompressedVideoDirective[] = "compressed-video"; +const char kIdentityDirective[] = "identity"; + const char kChromeProxyLitePageIngoreBlacklistDirective[] = "exp=ignore_preview_blacklist"; @@ -67,6 +76,33 @@ base::CompareCase::INSENSITIVE_ASCII); } +// Returns true if the provided transform type is specified in the provided +// Chrome-Proxy-Content-Transform header value. +bool IsPreviewTypeInHeaderValue(const std::string& header_value, + const std::string& transform_type) { + std::vector<std::string> tokens = + base::SplitString(base::ToLowerASCII(header_value), ";", + base::KEEP_WHITESPACE, base::SPLIT_WANT_ALL); + if (tokens.empty()) + return false; + std::string header_transform_type; + base::TrimWhitespaceASCII(tokens[0], base::TRIM_ALL, &header_transform_type); + return header_transform_type == transform_type; +} + +// Returns true if the provided transform type is specified in the +// Chrome-Proxy-Content-Transform-Header. +bool IsPreviewType(const net::HttpResponseHeaders& headers, + const std::string& transform_type) { + std::string header_value; + if (!headers.GetNormalizedHeader( + data_reduction_proxy::chrome_proxy_content_transform_header(), + &header_value)) { + return false; + } + return IsPreviewTypeInHeaderValue(header_value, transform_type); +} + } // namespace namespace data_reduction_proxy { @@ -75,18 +111,47 @@ return kChromeProxyHeader; } -const char* chrome_proxy_lo_fi_directive() { - return kChromeProxyLoFiDirective; +const char* chrome_proxy_accept_transform_header() { + return kChromeProxyAcceptTransformHeader; } -const char* chrome_proxy_lite_page_directive() { - return kChromeProxyLitePageDirective; +const char* chrome_proxy_content_transform_header() { + return kChromeProxyContentTransformHeader; +} + +const char* empty_image_directive() { + return kEmptyImageDirective; +} + +const char* lite_page_directive() { + return kLitePageDirective; +} + +const char* compressed_video_directive() { + return kCompressedVideoDirective; +} + +const char* identity_directive() { + return kIdentityDirective; } const char* chrome_proxy_lite_page_ignore_blacklist_directive() { return kChromeProxyLitePageIngoreBlacklistDirective; } +bool IsEmptyImagePreview(const net::HttpResponseHeaders& headers) { + return IsPreviewType(headers, kEmptyImageDirective); +} + +bool IsEmptyImagePreview(const std::string& content_transform_value) { + return IsPreviewTypeInHeaderValue(content_transform_value, + kEmptyImageDirective); +} + +bool IsLitePagePreview(const net::HttpResponseHeaders& headers) { + return IsPreviewType(headers, kLitePageDirective); +} + bool GetDataReductionProxyActionValue(const net::HttpResponseHeaders* headers, base::StringPiece action_prefix, std::string* action_value) {
diff --git a/components/data_reduction_proxy/core/common/data_reduction_proxy_headers.h b/components/data_reduction_proxy/core/common/data_reduction_proxy_headers.h index b716b598..b0ea2013 100644 --- a/components/data_reduction_proxy/core/common/data_reduction_proxy_headers.h +++ b/components/data_reduction_proxy/core/common/data_reduction_proxy_headers.h
@@ -71,9 +71,27 @@ // Gets the header used for data reduction proxy requests and responses. const char* chrome_proxy_header(); -// Gets the Chrome-Proxy directive used by data reduction proxy Lo-Fi preview -// requests and responses. -const char* chrome_proxy_lo_fi_directive(); +// Gets the ChromeProxyAcceptTransform header name. +const char* chrome_proxy_accept_transform_header(); + +// Gets the ChromeProxyContentTransform header name. +const char* chrome_proxy_content_transform_header(); + +// Gets the directive used by data reduction proxy Lo-Fi requests and +// responses. +const char* empty_image_directive(); + +// Gets the directive used by data reduction proxy Lite-Page requests +// and responses. +const char* lite_page_directive(); + +// Gets the directive used by the data reduction proxy to request +// compressed video. +const char* compressed_video_directive(); + +// Gets the directive used by the data reduction proxy to request that +// a resource not be transformed. +const char* identity_directive(); // Gets the Chrome-Proxy directive used by data reduction proxy lite page // preview requests and responses. @@ -83,6 +101,19 @@ // preview experiment to ignore the blacklist. const char* chrome_proxy_lite_page_ignore_blacklist_directive(); +// Returns true if the Chrome-Proxy-Content-Transform response header indicates +// that an empty image has been provided. +bool IsEmptyImagePreview(const net::HttpResponseHeaders& headers); + +// Returns true if the provided value of the Chrome-Proxy-Content-Transform +// response header that is provided in |content_transform_value| indicates that +// an empty image has been provided. +bool IsEmptyImagePreview(const std::string& content_transform_value); + +// Returns true if the Chrome-Proxy-Content-Transform response header indicates +// that a lite page has been provided. +bool IsLitePagePreview(const net::HttpResponseHeaders& headers); + // Returns true if the Chrome-Proxy header is present and contains a bypass // delay. Sets |proxy_info->bypass_duration| to the specified delay if greater // than 0, and to 0 otherwise to indicate that the default proxy delay
diff --git a/components/data_reduction_proxy/core/common/data_reduction_proxy_headers_unittest.cc b/components/data_reduction_proxy/core/common/data_reduction_proxy_headers_unittest.cc index 0925817..e2f8844 100644 --- a/components/data_reduction_proxy/core/common/data_reduction_proxy_headers_unittest.cc +++ b/components/data_reduction_proxy/core/common/data_reduction_proxy_headers_unittest.cc
@@ -38,6 +38,130 @@ std::unique_ptr<TestDataReductionProxyEventStorageDelegate> storage_delegate_; }; +TEST_F(DataReductionProxyHeadersTest, IsEmptyImagePreview) { + const struct { + const char* headers; + bool expected_result; + } tests[] = { + { + "HTTP/1.1 200 OK\n" + "Chrome-Proxy-Content-Transform: foo\n", + false, + }, + { + "HTTP/1.1 200 OK\n", false, + }, + { + "HTTP/1.1 200 OK\n" + "Chrome-Proxy-Content-Transform: empty-image\n", + true, + }, + { + "HTTP/1.1 200 OK\n" + "Chrome-Proxy-Content-Transform: empty-image;foo\n", + true, + }, + { + "HTTP/1.1 200 OK\n" + "Chrome-Proxy-Content-Transform: Empty-Image\n", + true, + }, + { + "HTTP/1.1 200 OK\n" + "Chrome-Proxy-Content-Transform: foo;empty-image\n", + false, + }, + { + "HTTP/1.1 200 OK\n" + "Another-Header: empty-image\n", + false, + }, + }; + for (size_t i = 0; i < arraysize(tests); ++i) { + std::string headers(tests[i].headers); + HeadersToRaw(&headers); + scoped_refptr<net::HttpResponseHeaders> parsed( + new net::HttpResponseHeaders(headers)); + EXPECT_EQ(tests[i].expected_result, IsEmptyImagePreview(*parsed)); + } +} + +TEST_F(DataReductionProxyHeadersTest, IsEmptyImagePreviewValue) { + const struct { + const char* header; + bool expected_result; + } tests[] = { + { + "foo", false, + }, + { + "", false, + }, + { + "empty-image", true, + }, + { + "empty-image;foo", true, + }, + { + "Empty-Image", true, + }, + { + "foo;empty-image", false, + }, + }; + for (size_t i = 0; i < arraysize(tests); ++i) + EXPECT_EQ(tests[i].expected_result, IsEmptyImagePreview(tests[i].header)); +} + +TEST_F(DataReductionProxyHeadersTest, IsLitePagePreview) { + const struct { + const char* headers; + bool expected_result; + } tests[] = { + { + "HTTP/1.1 200 OK\n" + "Chrome-Proxy-Content-Transform: foo\n", + false, + }, + { + "HTTP/1.1 200 OK\n", false, + }, + { + "HTTP/1.1 200 OK\n" + "Chrome-Proxy-Content-Transform: lite-page\n", + true, + }, + { + "HTTP/1.1 200 OK\n" + "Chrome-Proxy-Content-Transform: lite-page;foo\n", + true, + }, + { + "HTTP/1.1 200 OK\n" + "Chrome-Proxy-Content-Transform: Lite-Page\n", + true, + }, + { + "HTTP/1.1 200 OK\n" + "Chrome-Proxy-Content-Transform: foo;lite-page\n", + false, + }, + { + "HTTP/1.1 200 OK\n" + "Another-Header: lite-page\n", + false, + }, + }; + for (size_t i = 0; i < arraysize(tests); ++i) { + std::string headers(tests[i].headers); + HeadersToRaw(&headers); + scoped_refptr<net::HttpResponseHeaders> parsed( + new net::HttpResponseHeaders(headers)); + EXPECT_EQ(tests[i].expected_result, IsLitePagePreview(*parsed)); + } +} + TEST_F(DataReductionProxyHeadersTest, GetDataReductionProxyActionValue) { const struct { const char* headers;
diff --git a/components/data_reduction_proxy/core/common/lofi_decider.h b/components/data_reduction_proxy/core/common/lofi_decider.h index c1863e95..605df4b 100644 --- a/components/data_reduction_proxy/core/common/lofi_decider.h +++ b/components/data_reduction_proxy/core/common/lofi_decider.h
@@ -24,14 +24,39 @@ // Lo-Fi header should be added to the given request. virtual bool IsUsingLoFiMode(const net::URLRequest& request) const = 0; - // Returns true when Lo-Fi mode is on for the given |request|. If the - // |request| is using Lo-Fi mode, adds the "q=low" directive to the |headers|. - // If the |request| is using Lo-Fi mode, lite pages are enabled, and it is a - // main frame request adds the "q=preview" directive to the |headers|. - virtual bool MaybeAddLoFiDirectiveToHeaders( + // Adds a previews-specific directive to the Chrome-Proxy-Accept-Transform + // header if needed. If a slow page preview is triggered, adds "lite-page" or + // "empty-image", depending on whether the request is for the main frame + // and lite pages are enabled, or for a subresource and Lo-Fi mode is enabled, + // respectively. If a slow page preview is not triggered, "lite-page;if-heavy" + // and "empty-image;if-heavy" are added in the respective aforementioned cases + // to request that the server transform the page if it determines it to be + // heavy. + virtual void MaybeSetAcceptTransformHeader( const net::URLRequest& request, net::HttpRequestHeaders* headers) const = 0; + // Returns true if |headers| contains the Chrome-Proxy-Accept-Transform + // header and a slow page previews directive ("lite-page" or "empty-image") + // is present and not conditioned on "if-heavy". + virtual bool IsSlowPagePreviewRequested( + const net::HttpRequestHeaders& headers) const = 0; + + // Returns true if |headers| contains the Chrome-Proxy-Accept-Transform + // header with the "lite-page" directive. + virtual bool IsLitePagePreviewRequested( + const net::HttpRequestHeaders& headers) const = 0; + + // Unconditionally removes the Chrome-Proxy-Accept-Transform header from + // |headers.| + virtual void RemoveAcceptTransformHeader( + net::HttpRequestHeaders* headers) const = 0; + + // Adds a directive to tell the server to ignore blacklists when a Lite Page + // preview is being requested due to command line flags being set. + virtual void MaybeSetIgnorePreviewsBlacklistDirective( + net::HttpRequestHeaders* headers) const = 0; + // Returns true if the Lo-Fi specific UMA should be recorded. It is set to // true if Lo-Fi is enabled for |request|, Chrome session is in Lo-Fi // Enabled or Control field trial, and the network quality was slow.
diff --git a/components/domain_reliability/monitor_unittest.cc b/components/domain_reliability/monitor_unittest.cc index b5c928c..6b75144b 100644 --- a/components/domain_reliability/monitor_unittest.cc +++ b/components/domain_reliability/monitor_unittest.cc
@@ -326,7 +326,8 @@ // Delete the beacons for |origin1|. monitor_.ClearBrowsingData( CLEAR_BEACONS, - base::Bind(&GURL::operator==, base::Unretained(&origin1))); + base::Bind(static_cast<bool (*)(const GURL&, const GURL&)>(operator==), + origin1)); // Beacons for |context1| were cleared. Beacons for |context2| and // the contexts themselves were not. @@ -360,7 +361,8 @@ // Delete the contexts for |origin1|. monitor_.ClearBrowsingData( CLEAR_CONTEXTS, - base::Bind(&GURL::operator==, base::Unretained(&origin1))); + base::Bind(static_cast<bool (*)(const GURL&, const GURL&)>(operator==), + origin1)); // Only one of the contexts should have been deleted. EXPECT_EQ(1u, monitor_.contexts_size_for_testing());
diff --git a/components/drive/chromeos/change_list_loader.cc b/components/drive/chromeos/change_list_loader.cc index e2bb5b31..8c47f6f2 100644 --- a/components/drive/chromeos/change_list_loader.cc +++ b/components/drive/chromeos/change_list_loader.cc
@@ -456,9 +456,8 @@ if (!loaded_ && error == FILE_ERROR_OK) { loaded_ = true; - FOR_EACH_OBSERVER(ChangeListLoaderObserver, - observers_, - OnInitialLoadComplete()); + for (auto& observer : observers_) + observer.OnInitialLoadComplete(); } for (size_t i = 0; i < pending_load_callback_.size(); ++i) { @@ -568,16 +567,14 @@ base::Int64ToString(elapsed.InMilliseconds()).c_str()); if (should_notify_changed_directories) { - FOR_EACH_OBSERVER(ChangeListLoaderObserver, - observers_, - OnFileChanged(change_list_processor->changed_files())); + for (auto& observer : observers_) + observer.OnFileChanged(change_list_processor->changed_files()); } OnChangeListLoadComplete(error); - FOR_EACH_OBSERVER(ChangeListLoaderObserver, - observers_, - OnLoadFromServerComplete()); + for (auto& observer : observers_) + observer.OnLoadFromServerComplete(); } } // namespace internal
diff --git a/components/drive/chromeos/directory_loader.cc b/components/drive/chromeos/directory_loader.cc index 224b9f1..b90bde4 100644 --- a/components/drive/chromeos/directory_loader.cc +++ b/components/drive/chromeos/directory_loader.cc
@@ -561,9 +561,8 @@ // Also notify the observers. if (error == FILE_ERROR_OK && !directory_path->empty()) { - FOR_EACH_OBSERVER(ChangeListLoaderObserver, - observers_, - OnDirectoryReloaded(*directory_path)); + for (auto& observer : observers_) + observer.OnDirectoryReloaded(*directory_path); } }
diff --git a/components/drive/chromeos/file_system.cc b/components/drive/chromeos/file_system.cc index 0ec7d38..b04a84b 100644 --- a/components/drive/chromeos/file_system.cc +++ b/components/drive/chromeos/file_system.cc
@@ -824,8 +824,8 @@ void FileSystem::OnFileChangedByOperation(const FileChange& changed_files) { DCHECK(thread_checker_.CalledOnValidThread()); - FOR_EACH_OBSERVER( - FileSystemObserver, observers_, OnFileChanged(changed_files)); + for (auto& observer : observers_) + observer.OnFileChanged(changed_files); } void FileSystem::OnEntryUpdatedByOperation(const ClientContext& context, @@ -855,9 +855,8 @@ FileError error) { if (error != FILE_ERROR_OK) return; - FOR_EACH_OBSERVER(FileSystemObserver, - observers_, - OnDriveSyncError(type, *file_path)); + for (auto& observer : observers_) + observer.OnDriveSyncError(type, *file_path); } bool FileSystem::WaitForSyncComplete(const std::string& local_id, @@ -868,15 +867,15 @@ void FileSystem::OnDirectoryReloaded(const base::FilePath& directory_path) { DCHECK(thread_checker_.CalledOnValidThread()); - FOR_EACH_OBSERVER( - FileSystemObserver, observers_, OnDirectoryChanged(directory_path)); + for (auto& observer : observers_) + observer.OnDirectoryChanged(directory_path); } void FileSystem::OnFileChanged(const FileChange& changed_files) { DCHECK(thread_checker_.CalledOnValidThread()); - FOR_EACH_OBSERVER( - FileSystemObserver, observers_, OnFileChanged(changed_files)); + for (auto& observer : observers_) + observer.OnFileChanged(changed_files); } void FileSystem::OnLoadFromServerComplete() {
diff --git a/components/drive/drive_app_registry.cc b/components/drive/drive_app_registry.cc index d0861b0..f6cbc502 100644 --- a/components/drive/drive_app_registry.cc +++ b/components/drive/drive_app_registry.cc
@@ -189,9 +189,8 @@ AddAppSelectorList(app.secondary_file_extensions(), id, &extension_map_); } - FOR_EACH_OBSERVER(DriveAppRegistryObserver, - observers_, - OnDriveAppRegistryUpdated()); + for (auto& observer : observers_) + observer.OnDriveAppRegistryUpdated(); } void DriveAppRegistry::AddObserver(DriveAppRegistryObserver* observer) {
diff --git a/components/drive/drive_notification_manager.cc b/components/drive/drive_notification_manager.cc index 14e07682..6bd991e7 100644 --- a/components/drive/drive_notification_manager.cc +++ b/components/drive/drive_notification_manager.cc
@@ -61,8 +61,8 @@ } else { DVLOG(1) << "XMPP Notifications disabled (state=" << state << ")"; } - FOR_EACH_OBSERVER(DriveNotificationObserver, observers_, - OnPushNotificationEnabled(push_notification_enabled_)); + for (auto& observer : observers_) + observer.OnPushNotificationEnabled(push_notification_enabled_); } void DriveNotificationManager::OnIncomingInvalidation( @@ -110,8 +110,8 @@ void DriveNotificationManager::NotifyObserversToUpdate( NotificationSource source) { DVLOG(1) << "Notifying observers: " << NotificationSourceToString(source); - FOR_EACH_OBSERVER(DriveNotificationObserver, observers_, - OnNotificationReceived()); + for (auto& observer : observers_) + observer.OnNotificationReceived(); if (!observers_notified_) { UMA_HISTOGRAM_BOOLEAN("Drive.PushNotificationInitiallyEnabled", push_notification_enabled_);
diff --git a/components/drive/job_scheduler.cc b/components/drive/job_scheduler.cc index d7cd835..6dd96b93 100644 --- a/components/drive/job_scheduler.cc +++ b/components/drive/job_scheduler.cc
@@ -1160,19 +1160,21 @@ void JobScheduler::NotifyJobAdded(const JobInfo& job_info) { DCHECK(thread_checker_.CalledOnValidThread()); - FOR_EACH_OBSERVER(JobListObserver, observer_list_, OnJobAdded(job_info)); + for (auto& observer : observer_list_) + observer.OnJobAdded(job_info); } void JobScheduler::NotifyJobDone(const JobInfo& job_info, google_apis::DriveApiErrorCode error) { DCHECK(thread_checker_.CalledOnValidThread()); - FOR_EACH_OBSERVER(JobListObserver, observer_list_, - OnJobDone(job_info, GDataToFileError(error))); + for (auto& observer : observer_list_) + observer.OnJobDone(job_info, GDataToFileError(error)); } void JobScheduler::NotifyJobUpdated(const JobInfo& job_info) { DCHECK(thread_checker_.CalledOnValidThread()); - FOR_EACH_OBSERVER(JobListObserver, observer_list_, OnJobUpdated(job_info)); + for (auto& observer : observer_list_) + observer.OnJobUpdated(job_info); } std::string JobScheduler::GetQueueInfo(QueueType type) const {
diff --git a/components/drive/service/drive_api_service.cc b/components/drive/service/drive_api_service.cc index 59558fce..df82a503 100644 --- a/components/drive/service/drive_api_service.cc +++ b/components/drive/service/drive_api_service.cc
@@ -857,11 +857,11 @@ void DriveAPIService::OnOAuth2RefreshTokenChanged() { DCHECK(thread_checker_.CalledOnValidThread()); if (CanSendRequest()) { - FOR_EACH_OBSERVER( - DriveServiceObserver, observers_, OnReadyToSendRequests()); + for (auto& observer : observers_) + observer.OnReadyToSendRequests(); } else if (!HasRefreshToken()) { - FOR_EACH_OBSERVER( - DriveServiceObserver, observers_, OnRefreshTokenInvalid()); + for (auto& observer : observers_) + observer.OnRefreshTokenInvalid(); } }
diff --git a/components/drive/service/fake_drive_service.cc b/components/drive/service/fake_drive_service.cc index ad0d1f6..60f84c5 100644 --- a/components/drive/service/fake_drive_service.cc +++ b/components/drive/service/fake_drive_service.cc
@@ -1793,7 +1793,8 @@ } void FakeDriveService::NotifyObservers() { - FOR_EACH_OBSERVER(ChangeObserver, change_observers_, OnNewChangeAvailable()); + for (auto& observer : change_observers_) + observer.OnNewChangeAvailable(); } } // namespace drive
diff --git a/components/history/core/browser/BUILD.gn b/components/history/core/browser/BUILD.gn index 23791d1..b3406b5 100644 --- a/components/history/core/browser/BUILD.gn +++ b/components/history/core/browser/BUILD.gn
@@ -206,8 +206,8 @@ "//components/prefs:test_support", "//components/signin/core/browser", "//components/signin/core/browser:test_support", - "//components/sync:test_support_sync_driver", - "//components/sync:test_support_sync_model", + "//components/sync", + "//components/sync:test_support_model", "//sql", "//sql:test_support", "//testing/gtest",
diff --git a/components/history/core/browser/history_backend.cc b/components/history/core/browser/history_backend.cc index 50383ba..410f2588 100644 --- a/components/history/core/browser/history_backend.cc +++ b/components/history/core/browser/history_backend.cc
@@ -2492,16 +2492,16 @@ const URLRow& row, const RedirectList& redirects, base::Time visit_time) { - FOR_EACH_OBSERVER(HistoryBackendObserver, observers_, - OnURLVisited(this, transition, row, redirects, visit_time)); + for (HistoryBackendObserver& observer : observers_) + observer.OnURLVisited(this, transition, row, redirects, visit_time); if (delegate_) delegate_->NotifyURLVisited(transition, row, redirects, visit_time); } void HistoryBackend::NotifyURLsModified(const URLRows& rows) { - FOR_EACH_OBSERVER(HistoryBackendObserver, observers_, - OnURLsModified(this, rows)); + for (HistoryBackendObserver& observer : observers_) + observer.OnURLsModified(this, rows); if (delegate_) delegate_->NotifyURLsModified(rows); @@ -2512,9 +2512,10 @@ const URLRows& rows, const std::set<GURL>& favicon_urls) { URLRows copied_rows(rows); - FOR_EACH_OBSERVER( - HistoryBackendObserver, observers_, - OnURLsDeleted(this, all_history, expired, copied_rows, favicon_urls)); + for (HistoryBackendObserver& observer : observers_) { + observer.OnURLsDeleted(this, all_history, expired, copied_rows, + favicon_urls); + } if (delegate_) delegate_->NotifyURLsDeleted(all_history, expired, copied_rows,
diff --git a/components/history/core/browser/history_service.cc b/components/history/core/browser/history_service.cc index a4993ca..a976776 100644 --- a/components/history/core/browser/history_service.cc +++ b/components/history/core/browser/history_service.cc
@@ -1063,14 +1063,14 @@ const RedirectList& redirects, base::Time visit_time) { DCHECK(thread_checker_.CalledOnValidThread()); - FOR_EACH_OBSERVER(HistoryServiceObserver, observers_, - OnURLVisited(this, transition, row, redirects, visit_time)); + for (HistoryServiceObserver& observer : observers_) + observer.OnURLVisited(this, transition, row, redirects, visit_time); } void HistoryService::NotifyURLsModified(const URLRows& changed_urls) { DCHECK(thread_checker_.CalledOnValidThread()); - FOR_EACH_OBSERVER(HistoryServiceObserver, observers_, - OnURLsModified(this, changed_urls)); + for (HistoryServiceObserver& observer : observers_) + observer.OnURLsModified(this, changed_urls); } void HistoryService::NotifyURLsDeleted(bool all_history, @@ -1101,21 +1101,22 @@ } } - FOR_EACH_OBSERVER( - HistoryServiceObserver, observers_, - OnURLsDeleted(this, all_history, expired, deleted_rows, favicon_urls)); + for (HistoryServiceObserver& observer : observers_) { + observer.OnURLsDeleted(this, all_history, expired, deleted_rows, + favicon_urls); + } } void HistoryService::NotifyHistoryServiceLoaded() { DCHECK(thread_checker_.CalledOnValidThread()); - FOR_EACH_OBSERVER(HistoryServiceObserver, observers_, - OnHistoryServiceLoaded(this)); + for (HistoryServiceObserver& observer : observers_) + observer.OnHistoryServiceLoaded(this); } void HistoryService::NotifyHistoryServiceBeingDeleted() { DCHECK(thread_checker_.CalledOnValidThread()); - FOR_EACH_OBSERVER(HistoryServiceObserver, observers_, - HistoryServiceBeingDeleted(this)); + for (HistoryServiceObserver& observer : observers_) + observer.HistoryServiceBeingDeleted(this); } void HistoryService::NotifyKeywordSearchTermUpdated( @@ -1123,14 +1124,14 @@ KeywordID keyword_id, const base::string16& term) { DCHECK(thread_checker_.CalledOnValidThread()); - FOR_EACH_OBSERVER(HistoryServiceObserver, observers_, - OnKeywordSearchTermUpdated(this, row, keyword_id, term)); + for (HistoryServiceObserver& observer : observers_) + observer.OnKeywordSearchTermUpdated(this, row, keyword_id, term); } void HistoryService::NotifyKeywordSearchTermDeleted(URLID url_id) { DCHECK(thread_checker_.CalledOnValidThread()); - FOR_EACH_OBSERVER(HistoryServiceObserver, observers_, - OnKeywordSearchTermDeleted(this, url_id)); + for (HistoryServiceObserver& observer : observers_) + observer.OnKeywordSearchTermDeleted(this, url_id); } std::unique_ptr<
diff --git a/components/history/core/browser/top_sites.cc b/components/history/core/browser/top_sites.cc index 987d86b6..5acf6dbf 100644 --- a/components/history/core/browser/top_sites.cc +++ b/components/history/core/browser/top_sites.cc
@@ -39,13 +39,14 @@ } void TopSites::NotifyTopSitesLoaded() { - FOR_EACH_OBSERVER(TopSitesObserver, observer_list_, TopSitesLoaded(this)); + for (TopSitesObserver& observer : observer_list_) + observer.TopSitesLoaded(this); } void TopSites::NotifyTopSitesChanged( const TopSitesObserver::ChangeReason reason) { - FOR_EACH_OBSERVER(TopSitesObserver, observer_list_, - TopSitesChanged(this, reason)); + for (TopSitesObserver& observer : observer_list_) + observer.TopSitesChanged(this, reason); } } // namespace history
diff --git a/components/history/core/browser/web_history_service.cc b/components/history/core/browser/web_history_service.cc index 35d97b85..f4c43429 100644 --- a/components/history/core/browser/web_history_service.cc +++ b/components/history/core/browser/web_history_service.cc
@@ -567,8 +567,8 @@ // Inform the observers about the history deletion. if (response_value.get() && success) { - FOR_EACH_OBSERVER(WebHistoryServiceObserver, observer_list_, - OnWebHistoryDeleted()); + for (WebHistoryServiceObserver& observer : observer_list_) + observer.OnWebHistoryDeleted(); } }
diff --git a/components/metrics/proto/cast_logs.proto b/components/metrics/proto/cast_logs.proto index 3341c642..4c624e4 100644 --- a/components/metrics/proto/cast_logs.proto +++ b/components/metrics/proto/cast_logs.proto
@@ -15,7 +15,7 @@ // Next tag: 7 message CastLogsProto { // Cast specific device information. - // Next tag: 5 + // Next tag: 6 message CastDeviceInfo { // The product type of Cast device sent from Cast-enabled devices. // Next tag: 5 @@ -37,6 +37,9 @@ // The model of the Cast device. optional string model = 4; + + // The serial number. + optional string serial_number = 5; } // The device sends this information at least once per day. optional CastDeviceInfo cast_device_info = 1; @@ -168,7 +171,7 @@ optional fixed32 virtual_release_track = 4; // Cast specific device information which is expected to change over time. - // Next tag: 2 + // Next tag: 4 message CastDeviceMutableInfo { // This is the last type of reboot the device encountered // Next tag: 9
diff --git a/components/minidump_uploader/BUILD.gn b/components/minidump_uploader/BUILD.gn index 1968be7..0e6692c 100644 --- a/components/minidump_uploader/BUILD.gn +++ b/components/minidump_uploader/BUILD.gn
@@ -11,6 +11,7 @@ ] java_files = [ + "android/java/src/org/chromium/components/minidump_uploader/util/CrashReportingPermissionManager.java", "android/java/src/org/chromium/components/minidump_uploader/util/HttpURLConnectionFactory.java", "android/java/src/org/chromium/components/minidump_uploader/util/HttpURLConnectionFactoryImpl.java", ]
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/CrashReportingPermissionManager.java b/components/minidump_uploader/android/java/src/org/chromium/components/minidump_uploader/util/CrashReportingPermissionManager.java similarity index 94% rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/CrashReportingPermissionManager.java rename to components/minidump_uploader/android/java/src/org/chromium/components/minidump_uploader/util/CrashReportingPermissionManager.java index 566a5a8..ec8404af 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/CrashReportingPermissionManager.java +++ b/components/minidump_uploader/android/java/src/org/chromium/components/minidump_uploader/util/CrashReportingPermissionManager.java
@@ -1,8 +1,8 @@ -// 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.preferences.privacy; +package org.chromium.components.minidump_uploader.util; /** * Interface for crash reporting permissions.
diff --git a/components/nacl/browser/nacl_process_host.cc b/components/nacl/browser/nacl_process_host.cc index ecd66b01..35c87a0 100644 --- a/components/nacl/browser/nacl_process_host.cc +++ b/components/nacl/browser/nacl_process_host.cc
@@ -211,73 +211,6 @@ unsigned NaClProcessHost::keepalive_throttle_interval_milliseconds_ = ppapi::kKeepaliveThrottleIntervalDefaultMilliseconds; -// Unfortunately, we cannot use ScopedGeneric directly for IPC::ChannelHandle, -// because there is neither operator== nor operator != definition for it. -// Instead, define a simple wrapper for IPC::ChannelHandle with an assumption -// that this only takes a transferred IPC::ChannelHandle or one to be -// transferred via IPC. -class NaClProcessHost::ScopedChannelHandle { - public: - ScopedChannelHandle() { - } - explicit ScopedChannelHandle(const IPC::ChannelHandle& handle) - : handle_(handle) { - DCHECK(IsSupportedHandle(handle_)); - } - ScopedChannelHandle(ScopedChannelHandle&& other) : handle_(other.handle_) { - other.handle_ = IPC::ChannelHandle(); - DCHECK(IsSupportedHandle(handle_)); - } - ~ScopedChannelHandle() { - CloseIfNecessary(); - } - - const IPC::ChannelHandle& get() const { return handle_; } - IPC::ChannelHandle release() WARN_UNUSED_RESULT { - IPC::ChannelHandle result = handle_; - handle_ = IPC::ChannelHandle(); - return result; - } - - void reset(const IPC::ChannelHandle& handle = IPC::ChannelHandle()) { - DCHECK(IsSupportedHandle(handle)); -#if defined(OS_POSIX) - // Following the manner of base::ScopedGeneric, we do not support - // reset() with same handle for simplicity of the implementation. - CHECK(handle.socket.fd == -1 || handle.socket.fd != handle_.socket.fd); -#endif - CloseIfNecessary(); - handle_ = handle; - } - - private: - // Returns true if the given handle is closable automatically by this - // class. This function is just a helper for validation. - static bool IsSupportedHandle(const IPC::ChannelHandle& handle) { -#if defined(OS_WIN) - // On Windows, it is not supported to marshal the |pipe.handle|. - // In our case, we wrap a transferred ChannelHandle (or one to be - // transferred) via IPC, so we can assume |handle.pipe.handle| is NULL. - return handle.pipe.handle == NULL; -#else - return true; -#endif - } - - void CloseIfNecessary() { -#if defined(OS_POSIX) - if (handle_.socket.auto_close) { - // Defer closing task to the ScopedFD. - base::ScopedFD(handle_.socket.fd); - } -#endif - } - - IPC::ChannelHandle handle_; - - DISALLOW_COPY_AND_ASSIGN(ScopedChannelHandle); -}; - NaClProcessHost::NaClProcessHost( const GURL& manifest_url, base::File nexe_file, @@ -721,9 +654,9 @@ } void NaClProcessHost::ReplyToRenderer( - ScopedChannelHandle ppapi_channel_handle, - ScopedChannelHandle trusted_channel_handle, - ScopedChannelHandle manifest_service_channel_handle) { + mojo::ScopedMessagePipeHandle ppapi_channel_handle, + mojo::ScopedMessagePipeHandle trusted_channel_handle, + mojo::ScopedMessagePipeHandle manifest_service_channel_handle) { // Hereafter, we always send an IPC message with handles created above // which, on Windows, are not closable in this process. std::string error_message; @@ -968,86 +901,38 @@ // This is for security hardening. We can then prohibit the socketpair() // system call in nacl_helper and nacl_helper_nonsfi. if (uses_nonsfi_mode_) { - // Note: here, because some FDs/handles for the NaCl loader process are - // already opened, they are transferred to NaCl loader process even if - // an error occurs first. It is because this is the simplest way to - // ensure that these FDs/handles don't get leaked and that the NaCl loader - // process will exit properly. - bool has_error = false; + mojo::MessagePipe ppapi_browser_channel; + mojo::MessagePipe ppapi_renderer_channel; + mojo::MessagePipe trusted_service_channel; + mojo::MessagePipe manifest_service_channel; - ScopedChannelHandle ppapi_browser_server_channel_handle; - ScopedChannelHandle ppapi_browser_client_channel_handle; - ScopedChannelHandle ppapi_renderer_server_channel_handle; - ScopedChannelHandle ppapi_renderer_client_channel_handle; - ScopedChannelHandle trusted_service_server_channel_handle; - ScopedChannelHandle trusted_service_client_channel_handle; - ScopedChannelHandle manifest_service_server_channel_handle; - ScopedChannelHandle manifest_service_client_channel_handle; - - if (!CreateChannelHandlePair(&ppapi_browser_server_channel_handle, - &ppapi_browser_client_channel_handle) || - !CreateChannelHandlePair(&ppapi_renderer_server_channel_handle, - &ppapi_renderer_client_channel_handle) || - !CreateChannelHandlePair(&trusted_service_server_channel_handle, - &trusted_service_client_channel_handle) || - !CreateChannelHandlePair(&manifest_service_server_channel_handle, - &manifest_service_client_channel_handle)) { - SendErrorToRenderer("Failed to create socket pairs."); - has_error = true; - } - - if (!has_error && - !StartPPAPIProxy(std::move(ppapi_browser_client_channel_handle))) { + if (!StartPPAPIProxy(std::move(ppapi_browser_channel.handle1))) { SendErrorToRenderer("Failed to start browser PPAPI proxy."); - has_error = true; + return; } - if (!has_error) { - // On success, send back a success message to the renderer process, - // and transfer the channel handles for the NaCl loader process to - // |params|. - ReplyToRenderer(std::move(ppapi_renderer_client_channel_handle), - std::move(trusted_service_client_channel_handle), - std::move(manifest_service_client_channel_handle)); - params.ppapi_browser_channel_handle = - ppapi_browser_server_channel_handle.release(); - params.ppapi_renderer_channel_handle = - ppapi_renderer_server_channel_handle.release(); - params.trusted_service_channel_handle = - trusted_service_server_channel_handle.release(); - params.manifest_service_channel_handle = - manifest_service_server_channel_handle.release(); - } + // On success, send back a success message to the renderer process, + // and transfer the channel handles for the NaCl loader process to + // |params|. + ReplyToRenderer(std::move(ppapi_renderer_channel.handle1), + std::move(trusted_service_channel.handle1), + std::move(manifest_service_channel.handle1)); + params.ppapi_browser_channel_handle = + ppapi_browser_channel.handle0.release(); + params.ppapi_renderer_channel_handle = + ppapi_renderer_channel.handle0.release(); + params.trusted_service_channel_handle = + trusted_service_channel.handle0.release(); + params.manifest_service_channel_handle = + manifest_service_channel.handle0.release(); } #endif process_->Send(new NaClProcessMsg_Start(params)); } -#if defined(OS_LINUX) -// static -bool NaClProcessHost::CreateChannelHandlePair( - ScopedChannelHandle* channel_handle1, - ScopedChannelHandle* channel_handle2) { - DCHECK(channel_handle1); - DCHECK(channel_handle2); - - int fd1 = -1; - int fd2 = -1; - if (!IPC::SocketPair(&fd1, &fd2)) { - return false; - } - - IPC::ChannelHandle handle = IPC::Channel::GenerateVerifiedChannelID("nacl"); - handle.socket = base::FileDescriptor(fd1, true); - channel_handle1->reset(handle); - handle.socket = base::FileDescriptor(fd2, true); - channel_handle2->reset(handle); - return true; -} -#endif - -bool NaClProcessHost::StartPPAPIProxy(ScopedChannelHandle channel_handle) { +bool NaClProcessHost::StartPPAPIProxy( + mojo::ScopedMessagePipeHandle channel_handle) { if (ipc_proxy_channel_.get()) { // Attempt to open more than 1 browser channel is not supported. // Shut down the NaCl process. @@ -1109,14 +994,19 @@ const IPC::ChannelHandle& raw_ppapi_renderer_channel_handle, const IPC::ChannelHandle& raw_trusted_renderer_channel_handle, const IPC::ChannelHandle& raw_manifest_service_channel_handle) { - ScopedChannelHandle ppapi_browser_channel_handle( - raw_ppapi_browser_channel_handle); - ScopedChannelHandle ppapi_renderer_channel_handle( - raw_ppapi_renderer_channel_handle); - ScopedChannelHandle trusted_renderer_channel_handle( - raw_trusted_renderer_channel_handle); - ScopedChannelHandle manifest_service_channel_handle( - raw_manifest_service_channel_handle); + DCHECK(raw_ppapi_browser_channel_handle.is_mojo_channel_handle()); + DCHECK(raw_ppapi_renderer_channel_handle.is_mojo_channel_handle()); + DCHECK(raw_trusted_renderer_channel_handle.is_mojo_channel_handle()); + DCHECK(raw_manifest_service_channel_handle.is_mojo_channel_handle()); + + mojo::ScopedMessagePipeHandle ppapi_browser_channel_handle( + raw_ppapi_browser_channel_handle.mojo_handle); + mojo::ScopedMessagePipeHandle ppapi_renderer_channel_handle( + raw_ppapi_renderer_channel_handle.mojo_handle); + mojo::ScopedMessagePipeHandle trusted_renderer_channel_handle( + raw_trusted_renderer_channel_handle.mojo_handle); + mojo::ScopedMessagePipeHandle manifest_service_channel_handle( + raw_manifest_service_channel_handle.mojo_handle); if (!StartPPAPIProxy(std::move(ppapi_browser_channel_handle))) { SendErrorToRenderer("Browser PPAPI proxy could not start.");
diff --git a/components/nacl/browser/nacl_process_host.h b/components/nacl/browser/nacl_process_host.h index 528e889..6d2c06d 100644 --- a/components/nacl/browser/nacl_process_host.h +++ b/components/nacl/browser/nacl_process_host.h
@@ -120,8 +120,6 @@ content::BrowserPpapiHost* browser_ppapi_host() { return ppapi_host_.get(); } private: - class ScopedChannelHandle; - void LaunchNaClGdb(); // Mark the process as using a particular GDB debug stub port and notify @@ -151,9 +149,9 @@ // Sends the reply message to the renderer who is waiting for the plugin // to load. Returns true on success. void ReplyToRenderer( - ScopedChannelHandle ppapi_channel_handle, - ScopedChannelHandle trusted_channel_handle, - ScopedChannelHandle manifest_service_channel_handle); + mojo::ScopedMessagePipeHandle ppapi_channel_handle, + mojo::ScopedMessagePipeHandle trusted_channel_handle, + mojo::ScopedMessagePipeHandle manifest_service_channel_handle); // Sends the reply with error message to the renderer. void SendErrorToRenderer(const std::string& error_message); @@ -172,14 +170,8 @@ const base::FilePath& file_path, base::File nexe_file); -#if defined(OS_LINUX) - // Creates a pair of IPC::ChannelHandle. Returns true on success. - static bool CreateChannelHandlePair(ScopedChannelHandle* channel_handle1, - ScopedChannelHandle* channel_handle2); -#endif - // Starts browser PPAPI proxy. Returns true on success. - bool StartPPAPIProxy(ScopedChannelHandle channel_handle); + bool StartPPAPIProxy(mojo::ScopedMessagePipeHandle channel_handle); // Does post-process-launching tasks for starting the NaCl process once // we have a connection.
diff --git a/components/nacl/loader/nacl_ipc_adapter.cc b/components/nacl/loader/nacl_ipc_adapter.cc index 86d92c26..2d01c063 100644 --- a/components/nacl/loader/nacl_ipc_adapter.cc +++ b/components/nacl/loader/nacl_ipc_adapter.cc
@@ -342,17 +342,18 @@ NaClIPCAdapter::IOThreadData::~IOThreadData() { } -NaClIPCAdapter::NaClIPCAdapter(const IPC::ChannelHandle& handle, - base::TaskRunner* runner, - ResolveFileTokenCallback resolve_file_token_cb, - OpenResourceCallback open_resource_cb) +NaClIPCAdapter::NaClIPCAdapter( + const IPC::ChannelHandle& handle, + const scoped_refptr<base::SingleThreadTaskRunner>& runner, + ResolveFileTokenCallback resolve_file_token_cb, + OpenResourceCallback open_resource_cb) : lock_(), cond_var_(&lock_), task_runner_(runner), resolve_file_token_cb_(resolve_file_token_cb), open_resource_cb_(open_resource_cb), locked_data_() { - io_thread_data_.channel_ = IPC::Channel::CreateServer(handle, this); + io_thread_data_.channel_ = IPC::Channel::CreateServer(handle, this, runner); // Note, we can not PostTask for ConnectChannelOnIOThread here. If we did, // and that task ran before this constructor completes, the reference count // would go to 1 and then to 0 because of the Task, before we've been returned
diff --git a/components/nacl/loader/nacl_ipc_adapter.h b/components/nacl/loader/nacl_ipc_adapter.h index 28e328f..b6d07a3 100644 --- a/components/nacl/loader/nacl_ipc_adapter.h +++ b/components/nacl/loader/nacl_ipc_adapter.h
@@ -31,6 +31,10 @@ struct NaClImcTypedMsgHdr; struct PP_Size; +namespace base { +class SingleThreadTaskRunner; +} + namespace IPC { class Channel; struct ChannelHandle; @@ -105,11 +109,10 @@ // |open_resource_cb| may immediately call a OpenResourceReplyCallback // function to send a pre-opened resource descriptor to the untrusted side. // OpenResourceCallback returns true when OpenResourceReplyCallback is called. - NaClIPCAdapter( - const IPC::ChannelHandle& handle, - base::TaskRunner* runner, - ResolveFileTokenCallback resolve_file_token_cb, - OpenResourceCallback open_resource_cb); + NaClIPCAdapter(const IPC::ChannelHandle& handle, + const scoped_refptr<base::SingleThreadTaskRunner>& runner, + ResolveFileTokenCallback resolve_file_token_cb, + OpenResourceCallback open_resource_cb); // Initializes with a given channel that's already created for testing // purposes. This function will take ownership of the given channel.
diff --git a/components/nacl/loader/nacl_listener.cc b/components/nacl/loader/nacl_listener.cc index 6bf7686..c3ed8b7a 100644 --- a/components/nacl/loader/nacl_listener.cc +++ b/components/nacl/loader/nacl_listener.cc
@@ -42,7 +42,6 @@ #include "native_client/src/public/nacl_desc.h" #if defined(OS_POSIX) -#include "base/file_descriptor_posix.h" #include "base/posix/global_descriptors.h" #include "content/public/common/content_descriptors.h" #endif @@ -117,13 +116,12 @@ int nacl_fd, NaClIPCAdapter::ResolveFileTokenCallback resolve_file_token_cb, NaClIPCAdapter::OpenResourceCallback open_resource_cb) { - scoped_refptr<NaClIPCAdapter> ipc_adapter(new NaClIPCAdapter( - *handle, task_runner.get(), resolve_file_token_cb, open_resource_cb)); + mojo::MessagePipe pipe; + scoped_refptr<NaClIPCAdapter> ipc_adapter( + new NaClIPCAdapter(pipe.handle0.release(), task_runner, + resolve_file_token_cb, open_resource_cb)); ipc_adapter->ConnectChannel(); -#if defined(OS_POSIX) - handle->socket = - base::FileDescriptor(ipc_adapter->TakeClientFileDescriptor()); -#endif + *handle = pipe.handle1.release(); // Pass a NaClDesc to the untrusted side. This will hold a ref to the // NaClIPCAdapter. @@ -246,7 +244,6 @@ base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( switches::kMojoChannelToken))); DCHECK(handle.is_valid()); - IPC::ChannelHandle channel_handle(handle.release()); channel_ = IPC::SyncChannel::Create(this, io_thread_.task_runner().get(), &shutdown_event_); @@ -255,7 +252,7 @@ IPC::AttachmentBroker* global = IPC::AttachmentBroker::GetGlobal(); if (global && !global->IsPrivilegedBroker()) global->RegisterBrokerCommunicationChannel(channel_.get()); - channel_->Init(channel_handle, IPC::Channel::MODE_CLIENT, true); + channel_->Init(handle.release(), IPC::Channel::MODE_CLIENT, true); main_task_runner_ = base::ThreadTaskRunnerHandle::Get(); base::RunLoop().Run(); } @@ -336,12 +333,9 @@ LOG(FATAL) << "NaClAppCreate() failed"; } - IPC::ChannelHandle browser_handle = - IPC::Channel::GenerateVerifiedChannelID("nacl"); - IPC::ChannelHandle ppapi_renderer_handle = - IPC::Channel::GenerateVerifiedChannelID("nacl"); - IPC::ChannelHandle manifest_service_handle = - IPC::Channel::GenerateVerifiedChannelID("nacl"); + IPC::ChannelHandle browser_handle; + IPC::ChannelHandle ppapi_renderer_handle; + IPC::ChannelHandle manifest_service_handle; // Create the PPAPI IPC channels between the NaCl IRT and the host // (browser/renderer) processes. The IRT uses these channels to @@ -360,13 +354,12 @@ base::Bind(&NaClListener::ResolveFileToken, base::Unretained(this)), base::Bind(&NaClListener::OnOpenResource, base::Unretained(this))); + mojo::MessagePipe trusted_pipe; trusted_listener_ = - new NaClTrustedListener(IPC::Channel::GenerateVerifiedChannelID("nacl"), + new NaClTrustedListener(trusted_pipe.handle0.release(), io_thread_.task_runner().get(), &shutdown_event_); if (!Send(new NaClProcessHostMsg_PpapiChannelsCreated( - browser_handle, - ppapi_renderer_handle, - trusted_listener_->TakeClientChannelHandle(), + browser_handle, ppapi_renderer_handle, trusted_pipe.handle1.release(), manifest_service_handle))) LOG(FATAL) << "Failed to send IPC channel handle to NaClProcessHost.";
diff --git a/components/nacl/loader/nacl_trusted_listener.cc b/components/nacl/loader/nacl_trusted_listener.cc index 771dd7d..df8fc20 100644 --- a/components/nacl/loader/nacl_trusted_listener.cc +++ b/components/nacl/loader/nacl_trusted_listener.cc
@@ -48,15 +48,6 @@ NaClTrustedListener::~NaClTrustedListener() { } -IPC::ChannelHandle NaClTrustedListener::TakeClientChannelHandle() { - IPC::ChannelHandle handle = channel_handle_; -#if defined(OS_POSIX) - handle.socket = - base::FileDescriptor(channel_->TakeClientFileDescriptor()); -#endif - return handle; -} - bool NaClTrustedListener::OnMessageReceived(const IPC::Message& msg) { return false; }
diff --git a/components/nacl/loader/nacl_trusted_listener.h b/components/nacl/loader/nacl_trusted_listener.h index 4fdb3301..a368ab5 100644 --- a/components/nacl/loader/nacl_trusted_listener.h +++ b/components/nacl/loader/nacl_trusted_listener.h
@@ -22,8 +22,6 @@ base::SingleThreadTaskRunner* ipc_task_runner, base::WaitableEvent* shutdown_event); - IPC::ChannelHandle TakeClientChannelHandle(); - // Listener implementation. bool OnMessageReceived(const IPC::Message& message) override;
diff --git a/components/nacl/loader/nonsfi/nonsfi_listener.cc b/components/nacl/loader/nonsfi/nonsfi_listener.cc index c89594b..baef08c 100644 --- a/components/nacl/loader/nonsfi/nonsfi_listener.cc +++ b/components/nacl/loader/nonsfi/nonsfi_listener.cc
@@ -109,10 +109,10 @@ // plugin's main thread. We just pass the FDs to plugin side. // The FDs are created in the browser process. Following check can fail // if the preparation for sending NaClProcessMsg_Start were incomplete. - CHECK_NE(params.ppapi_browser_channel_handle.socket.fd, -1); - CHECK_NE(params.ppapi_renderer_channel_handle.socket.fd, -1); - CHECK_NE(params.trusted_service_channel_handle.socket.fd, -1); - CHECK_NE(params.manifest_service_channel_handle.socket.fd, -1); + CHECK(params.ppapi_browser_channel_handle.is_mojo_channel_handle()); + CHECK(params.ppapi_renderer_channel_handle.is_mojo_channel_handle()); + CHECK(params.trusted_service_channel_handle.is_mojo_channel_handle()); + CHECK(params.manifest_service_channel_handle.is_mojo_channel_handle()); ppapi::SetIPCChannelHandles( params.ppapi_browser_channel_handle,
diff --git a/components/nacl/renderer/ppb_nacl_private_impl.cc b/components/nacl/renderer/ppb_nacl_private_impl.cc index c11b63f..cd6aa0c 100644 --- a/components/nacl/renderer/ppb_nacl_private_impl.cc +++ b/components/nacl/renderer/ppb_nacl_private_impl.cc
@@ -130,14 +130,11 @@ explicit NaClPluginInstance(PP_Instance instance) : nexe_load_manager(instance), pexe_size(0) {} ~NaClPluginInstance() { - // Make sure that we do not leak a file descriptor if the NaCl loader + // Make sure that we do not leak a mojo handle if the NaCl loader // process never called ppapi_start() to initialize PPAPI. if (instance_info) { -#if defined(OS_WIN) - base::win::ScopedHandle closer(instance_info->channel_handle.pipe.handle); -#else - base::ScopedFD closer(instance_info->channel_handle.socket.fd); -#endif + DCHECK(instance_info->channel_handle.is_mojo_channel_handle()); + instance_info->channel_handle.mojo_handle.Close(); } } @@ -194,17 +191,8 @@ // Returns whether the channel_handle is valid or not. bool IsValidChannelHandle(const IPC::ChannelHandle& channel_handle) { - if (channel_handle.name.empty()) { - return false; - } - -#if defined(OS_POSIX) - if (channel_handle.socket.fd == -1) { - return false; - } -#endif - - return true; + DCHECK(channel_handle.is_mojo_channel_handle()); + return channel_handle.is_mojo_channel_handle(); } void PostPPCompletionCallback(PP_CompletionCallback callback,
diff --git a/components/neterror/resources/neterror.css b/components/neterror/resources/neterror.css index 1cbc66c..ba789e5 100644 --- a/components/neterror/resources/neterror.css +++ b/components/neterror/resources/neterror.css
@@ -162,8 +162,8 @@ #search-image { content: -webkit-image-set( - url(../../resources/default_100_percent/omnibox/omnibox_search_button_loupe.png) 1x, - url(../../resources/default_200_percent/omnibox/omnibox_search_button_loupe.png) 2x); + url(../../resources/default_100_percent/neterror/search_glass.png) 1x, + url(../../resources/default_200_percent/neterror/search_glass.png) 2x); margin: auto; }
diff --git a/components/neterror/resources/neterror.html b/components/neterror/resources/neterror.html index 792c61a..f3e4fa7f 100644 --- a/components/neterror/resources/neterror.html +++ b/components/neterror/resources/neterror.html
@@ -26,7 +26,7 @@ <li jsselect="suggestionsSummaryList" jsvalues=".innerHTML:summary"></li> </ul> </div> - <div class="error-code" jscontent="errorCode" aria-hidden="true"></div> + <div class="error-code" jscontent="errorCode"></div> <div id="diagnose-frame" class="hidden"></div> </div> </div>
diff --git a/components/ntp_snippets/BUILD.gn b/components/ntp_snippets/BUILD.gn index 47102a4..80eeea0d 100644 --- a/components/ntp_snippets/BUILD.gn +++ b/components/ntp_snippets/BUILD.gn
@@ -147,7 +147,7 @@ "//components/signin/core/browser:test_support", "//components/signin/core/common", "//components/strings", - "//components/sync:test_support_sync_driver", + "//components/sync:test_support_driver", "//components/sync_sessions", "//components/variations", "//net:test_support",
diff --git a/components/ntp_snippets/bookmarks/bookmark_suggestions_provider.cc b/components/ntp_snippets/bookmarks/bookmark_suggestions_provider.cc index b502091..1be8186 100644 --- a/components/ntp_snippets/bookmarks/bookmark_suggestions_provider.cc +++ b/components/ntp_snippets/bookmarks/bookmark_suggestions_provider.cc
@@ -43,7 +43,6 @@ const char* kMaxBookmarkAgeInDaysParamName = "bookmarks_max_age_in_days"; const char* kUseCreationDateFallbackForDaysParamName = "bookmarks_creation_date_fallback_days"; -const char* kShowIfEmptyParamName = "bookmarks_show_if_empty"; // Any bookmark created or visited after this time will be considered recent. // Note that bookmarks can be shown that do not meet this threshold. @@ -78,18 +77,6 @@ kMinBookmarksParamName, kMinBookmarks); } -bool ShouldShowIfEmpty() { - std::string show_if_empty = variations::GetVariationParamValueByFeature( - ntp_snippets::kBookmarkSuggestionsFeature, kShowIfEmptyParamName); - if (show_if_empty.empty() || show_if_empty == "false") - return false; - if (show_if_empty == "true") - return true; - - LOG(WARNING) << "Failed to parse show if empty " << show_if_empty; - return false; -} - } // namespace BookmarkSuggestionsProvider::BookmarkSuggestionsProvider( @@ -148,9 +135,7 @@ l10n_util::GetStringUTF16(IDS_NTP_BOOKMARK_SUGGESTIONS_SECTION_HEADER), ContentSuggestionsCardLayout::MINIMAL_CARD, /*has_more_button=*/true, - /*show_if_empty=*/ShouldShowIfEmpty() && bookmark_model_->HasBookmarks()); - // TODO(treib): Setting show_if_empty to true is a temporary hack, see - // crbug.com/640568. + /*show_if_empty=*/false); } void BookmarkSuggestionsProvider::DismissSuggestion(
diff --git a/components/ntp_snippets/category.h b/components/ntp_snippets/category.h index 0220cb5..0ae86c8b 100644 --- a/components/ntp_snippets/category.h +++ b/components/ntp_snippets/category.h
@@ -46,6 +46,9 @@ // Articles for you. ARTICLES, // INSERT NEW REMOTE CATEGORIES HERE! + + // Tracks the last known remote category + LAST_KNOWN_REMOTE_CATEGORY = ARTICLES, }; // A category groups ContentSuggestions which belong together. Use the
diff --git a/components/ntp_snippets/category_factory.cc b/components/ntp_snippets/category_factory.cc index 4da984e..a8e0740 100644 --- a/components/ntp_snippets/category_factory.cc +++ b/components/ntp_snippets/category_factory.cc
@@ -22,6 +22,10 @@ DCHECK_EQ(static_cast<size_t>(KnownCategories::LOCAL_CATEGORIES_COUNT), ordered_categories_.size()); + + // Known remote categories come after. Other remote categories will be ordered + // after these depending on when providers notify us about a related change. + AddKnownCategory(KnownCategories::ARTICLES); } CategoryFactory::~CategoryFactory() = default;
diff --git a/components/ntp_snippets/category_factory_unittest.cc b/components/ntp_snippets/category_factory_unittest.cc index 6ffd149..3e592d1b 100644 --- a/components/ntp_snippets/category_factory_unittest.cc +++ b/components/ntp_snippets/category_factory_unittest.cc
@@ -15,7 +15,10 @@ class CategoryFactoryTest : public testing::Test { public: - CategoryFactoryTest() : unused_remote_category_id_(1) {} + CategoryFactoryTest() + : unused_remote_category_id_( + static_cast<int>(KnownCategories::LAST_KNOWN_REMOTE_CATEGORY) + 1) { + } int GetUnusedRemoteCategoryID() { return unused_remote_category_id_++; }
diff --git a/components/ntp_snippets/content_suggestions_service.cc b/components/ntp_snippets/content_suggestions_service.cc index 56497a7..169afc1 100644 --- a/components/ntp_snippets/content_suggestions_service.cc +++ b/components/ntp_snippets/content_suggestions_service.cc
@@ -13,6 +13,10 @@ #include "base/location.h" #include "base/strings/string_number_conversions.h" #include "base/threading/thread_task_runner_handle.h" +#include "base/values.h" +#include "components/ntp_snippets/pref_names.h" +#include "components/prefs/pref_registry_simple.h" +#include "components/prefs/pref_service.h" #include "ui/gfx/image/image.h" namespace ntp_snippets { @@ -24,10 +28,13 @@ : state_(state), history_service_observer_(this), ntp_snippets_service_(nullptr), + pref_service_(pref_service), user_classifier_(pref_service) { // Can be null in tests. if (history_service) history_service_observer_.Add(history_service); + + RestoreDismissedCategoriesFromPrefs(); } ContentSuggestionsService::~ContentSuggestionsService() = default; @@ -42,6 +49,12 @@ FOR_EACH_OBSERVER(Observer, observers_, ContentSuggestionsServiceShutdown()); } +// static +void ContentSuggestionsService::RegisterProfilePrefs( + PrefRegistrySimple* registry) { + registry->RegisterListPref(prefs::kDismissedCategories); +} + CategoryStatus ContentSuggestionsService::GetCategoryStatus( Category category) const { if (state_ == State::DISABLED) { @@ -150,11 +163,11 @@ if (providers_it == providers_by_category_.end()) return; - suggestions_by_category_[category].clear(); - dismissed_providers_by_category_[providers_it->first] = providers_it->second; - providers_by_category_.erase(providers_it); - categories_.erase( - std::find(categories_.begin(), categories_.end(), category)); + ContentSuggestionsProvider* provider = providers_it->second; + UnregisterCategory(category, provider); + + dismissed_providers_by_category_[category] = provider; + StoreDismissedCategoriesToPrefs(); } void ContentSuggestionsService::RestoreDismissedCategories() { @@ -162,9 +175,9 @@ auto dismissed_providers_by_category_copy = dismissed_providers_by_category_; for (const auto& category_provider_pair : dismissed_providers_by_category_copy) { - RegisterCategoryIfRequired(category_provider_pair.second, - category_provider_pair.first); + RestoreDismissedCategory(category_provider_pair.first); } + StoreDismissedCategoriesToPrefs(); DCHECK(dismissed_providers_by_category_.empty()); } @@ -189,8 +202,19 @@ ContentSuggestionsProvider* provider, Category category, std::vector<ContentSuggestion> suggestions) { - if (RegisterCategoryIfRequired(provider, category)) + if (TryRegisterProviderForCategory(provider, category)) { NotifyCategoryStatusChanged(category); + } else if (IsCategoryDismissed(category)) { + // The category has been registered as a dismissed one. We need to + // check if the dismissal can be cleared now that we received new data. + if (suggestions.empty()) + return; + + RestoreDismissedCategory(category); + StoreDismissedCategoriesToPrefs(); + + NotifyCategoryStatusChanged(category); + } if (!IsCategoryStatusAvailable(provider->GetCategoryStatus(category))) { // A provider shouldn't send us suggestions while it's not available. @@ -200,11 +224,6 @@ suggestions_by_category_[category] = std::move(suggestions); - // The positioning of the bookmarks category depends on whether it's empty. - // TODO(treib): Remove this temporary hack, crbug.com/640568. - if (category.IsKnownCategory(KnownCategories::BOOKMARKS)) - SortCategories(); - FOR_EACH_OBSERVER(Observer, observers_, OnNewSuggestions(category)); } @@ -212,19 +231,17 @@ ContentSuggestionsProvider* provider, Category category, CategoryStatus new_status) { - if (!IsCategoryStatusAvailable(new_status)) { - suggestions_by_category_.erase(category); - } if (new_status == CategoryStatus::NOT_PROVIDED) { - DCHECK(providers_by_category_.find(category) != - providers_by_category_.end()); - DCHECK_EQ(provider, providers_by_category_.find(category)->second); - DismissCategory(category); + UnregisterCategory(category, provider); } else { - RegisterCategoryIfRequired(provider, category); + if (!IsCategoryStatusAvailable(new_status)) + suggestions_by_category_.erase(category); + TryRegisterProviderForCategory(provider, category); DCHECK_EQ(new_status, provider->GetCategoryStatus(category)); } - NotifyCategoryStatusChanged(category); + + if (!IsCategoryDismissed(category)) + NotifyCategoryStatusChanged(category); } void ContentSuggestionsService::OnSuggestionInvalidated( @@ -281,7 +298,7 @@ history_service_observer_.RemoveAll(); } -bool ContentSuggestionsService::RegisterCategoryIfRequired( +bool ContentSuggestionsService::TryRegisterProviderForCategory( ContentSuggestionsProvider* provider, Category category) { auto it = providers_by_category_.find(category); @@ -292,10 +309,27 @@ auto dismissed_it = dismissed_providers_by_category_.find(category); if (dismissed_it != dismissed_providers_by_category_.end()) { - DCHECK_EQ(dismissed_it->second, provider); - dismissed_providers_by_category_.erase(dismissed_it); + // The initialisation of dismissed categories registers them with |nullptr| + // for providers, we need to check for that to see if the provider is + // already registered or not. + if (!dismissed_it->second) { + dismissed_it->second = provider; + } else { + DCHECK_EQ(dismissed_it->second, provider); + } + return false; } + RegisterCategory(category, provider); + return true; +} + +void ContentSuggestionsService::RegisterCategory( + Category category, + ContentSuggestionsProvider* provider) { + DCHECK(!base::ContainsKey(providers_by_category_, category)); + DCHECK(!IsCategoryDismissed(category)); + providers_by_category_[category] = provider; categories_.push_back(category); SortCategories(); @@ -303,7 +337,22 @@ suggestions_by_category_.insert( std::make_pair(category, std::vector<ContentSuggestion>())); } - return true; +} + +void ContentSuggestionsService::UnregisterCategory( + Category category, + ContentSuggestionsProvider* provider) { + auto providers_it = providers_by_category_.find(category); + if (providers_it == providers_by_category_.end()) { + DCHECK(IsCategoryDismissed(category)); + return; + } + + DCHECK_EQ(provider, providers_it->second); + providers_by_category_.erase(providers_it); + categories_.erase( + std::find(categories_.begin(), categories_.end(), category)); + suggestions_by_category_.erase(category); } bool ContentSuggestionsService::RemoveSuggestionByID( @@ -319,11 +368,6 @@ return false; suggestions->erase(position); - // The positioning of the bookmarks category depends on whether it's empty. - // TODO(treib): Remove this temporary hack, crbug.com/640568. - if (suggestion_id.category().IsKnownCategory(KnownCategories::BOOKMARKS)) - SortCategories(); - return true; } @@ -334,23 +378,56 @@ } void ContentSuggestionsService::SortCategories() { - auto it = suggestions_by_category_.find( - category_factory_.FromKnownCategory(KnownCategories::BOOKMARKS)); - bool bookmarks_empty = - (it == suggestions_by_category_.end() || it->second.empty()); - std::sort( - categories_.begin(), categories_.end(), - [this, bookmarks_empty](const Category& left, const Category& right) { - // If the bookmarks section is empty, put it at the end. - // TODO(treib): This is a temporary hack, see crbug.com/640568. - if (bookmarks_empty) { - if (left.IsKnownCategory(KnownCategories::BOOKMARKS)) - return false; - if (right.IsKnownCategory(KnownCategories::BOOKMARKS)) - return true; - } - return category_factory_.CompareCategories(left, right); - }); + std::sort(categories_.begin(), categories_.end(), + [this](const Category& left, const Category& right) { + return category_factory_.CompareCategories(left, right); + }); +} + +bool ContentSuggestionsService::IsCategoryDismissed(Category category) const { + return base::ContainsKey(dismissed_providers_by_category_, category); +} + +void ContentSuggestionsService::RestoreDismissedCategory(Category category) { + auto dismissed_it = dismissed_providers_by_category_.find(category); + DCHECK(base::ContainsKey(dismissed_providers_by_category_, category)); + + // Keep the reference to the provider and remove it from the dismissed ones, + // because the category registration enforces that it's not dismissed. + ContentSuggestionsProvider* provider = dismissed_it->second; + dismissed_providers_by_category_.erase(dismissed_it); + + if (provider) + RegisterCategory(category, provider); +} + +void ContentSuggestionsService::RestoreDismissedCategoriesFromPrefs() { + // This must only be called at startup. + DCHECK(dismissed_providers_by_category_.empty()); + DCHECK(providers_by_category_.empty()); + + const base::ListValue* list = + pref_service_->GetList(prefs::kDismissedCategories); + for (const std::unique_ptr<base::Value>& entry : *list) { + int id = 0; + if (!entry->GetAsInteger(&id)) { + DLOG(WARNING) << "Invalid category pref value: " << *entry; + continue; + } + + // When the provider is registered, it will be stored in this map. + dismissed_providers_by_category_[category_factory()->FromIDValue(id)] = + nullptr; + } +} + +void ContentSuggestionsService::StoreDismissedCategoriesToPrefs() { + base::ListValue list; + for (const auto& category_provider_pair : dismissed_providers_by_category_) { + list.AppendInteger(category_provider_pair.first.id()); + } + + pref_service_->Set(prefs::kDismissedCategories, list); } } // namespace ntp_snippets
diff --git a/components/ntp_snippets/content_suggestions_service.h b/components/ntp_snippets/content_suggestions_service.h index 928a3a0..be34e72 100644 --- a/components/ntp_snippets/content_suggestions_service.h +++ b/components/ntp_snippets/content_suggestions_service.h
@@ -25,6 +25,7 @@ #include "components/ntp_snippets/user_classifier.h" class PrefService; +class PrefRegistrySimple; namespace gfx { class Image; @@ -92,6 +93,8 @@ // Inherited from KeyedService. void Shutdown() override; + static void RegisterProfilePrefs(PrefRegistrySimple* registry); + State state() { return state_; } // Gets all categories for which a provider is registered. The categories @@ -129,6 +132,9 @@ // This will not trigger an update through the observers. void RestoreDismissedCategories(); + // Returns whether |category| is dismissed. + bool IsCategoryDismissed(Category category) const; + // Observer accessors. void AddObserver(Observer* observer); void RemoveObserver(Observer* observer); @@ -212,9 +218,13 @@ // Registers the given |provider| for the given |category|, unless it is // already registered. Returns true if the category was newly registered or - // false if it was present before. - bool RegisterCategoryIfRequired(ContentSuggestionsProvider* provider, - Category category); + // false if it is dismissed or was present before. + bool TryRegisterProviderForCategory(ContentSuggestionsProvider* provider, + Category category); + void RegisterCategory(Category category, + ContentSuggestionsProvider* provider); + void UnregisterCategory(Category category, + ContentSuggestionsProvider* provider); // Removes a suggestion from the local store |suggestions_by_category_|, if it // exists. Returns true if a suggestion was removed. @@ -225,6 +235,12 @@ void SortCategories(); + // Re-enables a dismissed category, making querying its provider possible. + void RestoreDismissedCategory(Category category); + + void RestoreDismissedCategoriesFromPrefs(); + void StoreDismissedCategoriesToPrefs(); + // Whether the content suggestions feature is enabled. State state_; @@ -242,7 +258,9 @@ providers_by_category_; // All dismissed categories and their providers. These may be restored by - // RestoreDismissedCategories(). + // RestoreDismissedCategories(). The provider can be null if the dismissed + // category has received no updates since initialisation. + // (see RestoreDismissedCategoriesFromPrefs()) std::map<Category, ContentSuggestionsProvider*, Category::CompareByID> dismissed_providers_by_category_; @@ -272,6 +290,8 @@ // loaded, it is also present in |providers_|, otherwise this is a nullptr. NTPSnippetsService* ntp_snippets_service_; + PrefService* pref_service_; + UserClassifier user_classifier_; DISALLOW_COPY_AND_ASSIGN(ContentSuggestionsService);
diff --git a/components/ntp_snippets/content_suggestions_service_unittest.cc b/components/ntp_snippets/content_suggestions_service_unittest.cc index 71de5fb6..8b27e51 100644 --- a/components/ntp_snippets/content_suggestions_service_unittest.cc +++ b/components/ntp_snippets/content_suggestions_service_unittest.cc
@@ -19,6 +19,8 @@ #include "components/ntp_snippets/category_status.h" #include "components/ntp_snippets/content_suggestion.h" #include "components/ntp_snippets/content_suggestions_provider.h" +#include "components/ntp_snippets/user_classifier.h" +#include "components/prefs/testing_pref_service.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" #include "ui/gfx/image/image.h" @@ -121,9 +123,11 @@ class ContentSuggestionsServiceTest : public testing::Test { public: - ContentSuggestionsServiceTest() {} + ContentSuggestionsServiceTest() + : pref_service_(new TestingPrefServiceSimple()) {} void SetUp() override { + RegisterPrefs(); CreateContentSuggestionsService(ContentSuggestionsService::State::ENABLED); } @@ -195,12 +199,22 @@ MOCK_METHOD1(OnImageFetched, void(const gfx::Image&)); protected: + void RegisterPrefs() { + ContentSuggestionsService::RegisterProfilePrefs(pref_service_->registry()); + UserClassifier::RegisterProfilePrefs(pref_service_->registry()); + } + void CreateContentSuggestionsService( ContentSuggestionsService::State enabled) { ASSERT_FALSE(service_); - service_.reset(new ContentSuggestionsService(enabled, - nullptr /* history_service */, - nullptr /* pref_service */)); + service_.reset(new ContentSuggestionsService( + enabled, /*history_service=*/nullptr, pref_service_.get())); + } + + void ResetService() { + service_->Shutdown(); + service_.reset(); + CreateContentSuggestionsService(ContentSuggestionsService::State::ENABLED); } ContentSuggestionsService* service() { return service_.get(); } @@ -224,6 +238,7 @@ private: std::unique_ptr<ContentSuggestionsService> service_; + std::unique_ptr<TestingPrefServiceSimple> pref_service_; DISALLOW_COPY_AND_ASSIGN(ContentSuggestionsServiceTest); }; @@ -232,6 +247,7 @@ : public ContentSuggestionsServiceTest { public: void SetUp() override { + RegisterPrefs(); CreateContentSuggestionsService(ContentSuggestionsService::State::DISABLED); } }; @@ -548,54 +564,6 @@ service()->RemoveObserver(&observer); } -// This tests the temporary special-casing of the bookmarks section: If it is -// empty, it should appear at the end; see crbug.com/640568. -TEST_F(ContentSuggestionsServiceTest, ShouldPutBookmarksAtEndIfEmpty) { - // Register a bookmarks provider and an arbitrary remote provider. - Category bookmarks = FromKnownCategory(KnownCategories::BOOKMARKS); - MockProvider* bookmarks_provider = RegisterProvider(bookmarks); - bookmarks_provider->FireCategoryStatusChangedWithCurrentStatus(bookmarks); - Category remote = FromRemoteCategory(123); - MockProvider* remote_provider = RegisterProvider(remote); - remote_provider->FireCategoryStatusChangedWithCurrentStatus(remote); - - // By default, the bookmarks category is empty, so it should be at the end. - EXPECT_THAT(service()->GetCategories(), ElementsAre(remote, bookmarks)); - - // Add two bookmark suggestions; now bookmarks should be in the front. - bookmarks_provider->FireSuggestionsChanged( - bookmarks, CreateSuggestions(bookmarks, {1, 2})); - EXPECT_THAT(service()->GetCategories(), ElementsAre(bookmarks, remote)); - // Dismiss the first suggestion; bookmarks should stay in the front. - service()->DismissSuggestion(CreateSuggestion(bookmarks, 1).id()); - EXPECT_THAT(service()->GetCategories(), ElementsAre(bookmarks, remote)); - // Dismiss the second suggestion; now bookmarks should go back to the end. - service()->DismissSuggestion(CreateSuggestion(bookmarks, 2).id()); - EXPECT_THAT(service()->GetCategories(), ElementsAre(remote, bookmarks)); - - // Same thing, but invalidate instead of dismissing. - bookmarks_provider->FireSuggestionsChanged( - bookmarks, CreateSuggestions(bookmarks, {1, 2})); - EXPECT_THAT(service()->GetCategories(), ElementsAre(bookmarks, remote)); - bookmarks_provider->FireSuggestionInvalidated( - ContentSuggestion::ID(bookmarks, "1")); - EXPECT_THAT(service()->GetCategories(), ElementsAre(bookmarks, remote)); - bookmarks_provider->FireSuggestionInvalidated( - ContentSuggestion::ID(bookmarks, "2")); - EXPECT_THAT(service()->GetCategories(), ElementsAre(remote, bookmarks)); - - // Same thing, but now the bookmarks category updates "naturally". - bookmarks_provider->FireSuggestionsChanged( - bookmarks, CreateSuggestions(bookmarks, {1, 2})); - EXPECT_THAT(service()->GetCategories(), ElementsAre(bookmarks, remote)); - bookmarks_provider->FireSuggestionsChanged(bookmarks, - CreateSuggestions(bookmarks, {1})); - EXPECT_THAT(service()->GetCategories(), ElementsAre(bookmarks, remote)); - bookmarks_provider->FireSuggestionsChanged( - bookmarks, CreateSuggestions(bookmarks, std::vector<int>())); - EXPECT_THAT(service()->GetCategories(), ElementsAre(remote, bookmarks)); -} - TEST_F(ContentSuggestionsServiceTest, ShouldForwardClearHistory) { Category category = FromKnownCategory(KnownCategories::DOWNLOADS); MockProvider* provider = RegisterProvider(category); @@ -642,4 +610,82 @@ EXPECT_THAT(dismissed_providers(), IsEmpty()); } +TEST_F(ContentSuggestionsServiceTest, ShouldRestoreDismissedCategories) { + // Create and register provider. + Category category1 = service()->category_factory()->FromIDValue(1); + Category category2 = service()->category_factory()->FromIDValue(2); + + // Setup and verify initial state. + MockProvider* provider = RegisterProvider({category1, category2}); + provider->FireCategoryStatusChangedWithCurrentStatus(category1); + provider->FireCategoryStatusChangedWithCurrentStatus(category2); + + ASSERT_THAT(service()->GetCategoryStatus(category1), + Eq(CategoryStatus::AVAILABLE)); + ASSERT_THAT(service()->GetCategoryStatus(category2), + Eq(CategoryStatus::AVAILABLE)); + + // Dismiss all the categories. None should be provided now. + service()->DismissCategory(category1); + service()->DismissCategory(category2); + + ASSERT_THAT(service()->GetCategoryStatus(category1), + Eq(CategoryStatus::NOT_PROVIDED)); + ASSERT_THAT(service()->GetCategoryStatus(category2), + Eq(CategoryStatus::NOT_PROVIDED)); + + // Receiving a status change notification should not change anything. + provider->FireCategoryStatusChanged(category1, CategoryStatus::AVAILABLE); + + EXPECT_THAT(service()->GetCategoryStatus(category1), + Eq(CategoryStatus::NOT_PROVIDED)); + EXPECT_THAT(service()->GetCategoryStatus(category2), + Eq(CategoryStatus::NOT_PROVIDED)); + + // Receiving a notification without suggestions should not change anything. + provider->FireSuggestionsChanged(category1, std::vector<ContentSuggestion>()); + + EXPECT_THAT(service()->GetCategoryStatus(category1), + Eq(CategoryStatus::NOT_PROVIDED)); + EXPECT_THAT(service()->GetCategoryStatus(category2), + Eq(CategoryStatus::NOT_PROVIDED)); + + // Receiving suggestions should make the notified category available. + provider->FireSuggestionsChanged(category1, + CreateSuggestions(category1, {1, 2})); + + EXPECT_THAT(service()->GetCategoryStatus(category1), + Eq(CategoryStatus::AVAILABLE)); + EXPECT_THAT(service()->GetCategoryStatus(category2), + Eq(CategoryStatus::NOT_PROVIDED)); +} + +TEST_F(ContentSuggestionsServiceTest, ShouldRestoreDismissalsFromPrefs) { + // Register a category with one suggestion. + Category category = FromKnownCategory(KnownCategories::ARTICLES); + MockProvider* provider = RegisterProvider(category); + provider->FireCategoryStatusChangedWithCurrentStatus(category); + + // For a regular initialisation, the category is not dismissed. + ASSERT_FALSE(service()->IsCategoryDismissed(category)); + + // Dismiss the category. + service()->DismissCategory(category); + ASSERT_TRUE(service()->IsCategoryDismissed(category)); + + // Simulate a Chrome restart. The category should still be dismissed. + ResetService(); + EXPECT_TRUE(service()->IsCategoryDismissed(category)); + + // Ensure that the provider registered at initialisation is used after + // restoration. + provider = RegisterProvider(category); + provider->FireCategoryStatusChangedWithCurrentStatus(category); + EXPECT_TRUE(service()->IsCategoryDismissed(category)); + + service()->RestoreDismissedCategories(); + EXPECT_FALSE(service()->IsCategoryDismissed(category)); + EXPECT_THAT(providers().find(category)->second, Eq(provider)); +} + } // namespace ntp_snippets
diff --git a/components/ntp_snippets/pref_names.cc b/components/ntp_snippets/pref_names.cc index 7b0c9bd..9a557fa 100644 --- a/components/ntp_snippets/pref_names.cc +++ b/components/ntp_snippets/pref_names.cc
@@ -39,6 +39,7 @@ "ntp_suggestions.offline_pages.downloads.dismissed_ids"; const char kDismissedForeignSessionsSuggestions[] = "ntp_suggestions.foreign_sessions.dismissed_ids"; +const char kDismissedCategories[] = "ntp_suggestions.dismissed_categories"; const char kBookmarksFirstM54Start[] = "ntp_suggestions.bookmarks.first_M54_start";
diff --git a/components/ntp_snippets/pref_names.h b/components/ntp_snippets/pref_names.h index 2f9c377..ed81ccd 100644 --- a/components/ntp_snippets/pref_names.h +++ b/components/ntp_snippets/pref_names.h
@@ -46,6 +46,7 @@ extern const char kDismissedRecentOfflineTabSuggestions[]; extern const char kDismissedDownloadSuggestions[]; extern const char kDismissedForeignSessionsSuggestions[]; +extern const char kDismissedCategories[]; // The pref name for the time when M54 was first started on the device. extern const char kBookmarksFirstM54Start[];
diff --git a/components/ntp_snippets/remote/ntp_snippets_fetcher.cc b/components/ntp_snippets/remote/ntp_snippets_fetcher.cc index 8e57787..24aa318 100644 --- a/components/ntp_snippets/remote/ntp_snippets_fetcher.cc +++ b/components/ntp_snippets/remote/ntp_snippets_fetcher.cc
@@ -372,7 +372,9 @@ host_restricts(), count_to_fetch(), interactive_request(), - user_class() {} + user_class(), + ui_language{"", 0.0f}, + other_top_language{"", 0.0f} {} NTPSnippetsFetcher::RequestParams::~RequestParams() = default; @@ -525,11 +527,6 @@ if (IsSendingUserClassEnabled()) params->user_class = GetUserClassString(user_classifier_->GetUserClass()); - // TODO(jkrcal): add the initializers into the struct and remove it from here - // and from the unit-tests (building the request). - params->ui_language.frequency = 0; - params->other_top_language.frequency = 0; - // TODO(jkrcal): Add language model factory for iOS and add fakes to tests so // that |language_model_| is never nullptr. Remove this check and add a DCHECK // into the constructor. @@ -545,6 +542,16 @@ for (const LanguageModel::LanguageInfo& info : top_languages) { if (info.language_code != params->ui_language.language_code) { params->other_top_language = info; + + // Report to UMA how important the UI language is. + DCHECK_GT(params->other_top_language.frequency, 0) + << "GetTopLanguages() should not return languages with 0 frequency"; + float ratio_ui_in_both_languages = params->ui_language.frequency / + (params->ui_language.frequency + + params->other_top_language.frequency); + UMA_HISTOGRAM_PERCENTAGE( + "NewTabPage.Languages.UILanguageRatioInTwoTopLanguages", + ratio_ui_in_both_languages * 100); break; } }
diff --git a/components/ntp_snippets/remote/ntp_snippets_fetcher_unittest.cc b/components/ntp_snippets/remote/ntp_snippets_fetcher_unittest.cc index 55a7bd7..8539c34 100644 --- a/components/ntp_snippets/remote/ntp_snippets_fetcher_unittest.cc +++ b/components/ntp_snippets/remote/ntp_snippets_fetcher_unittest.cc
@@ -255,8 +255,6 @@ params.count_to_fetch = 25; params.interactive_request = false; params.user_class = "ACTIVE_NTP_USER"; - params.ui_language.frequency = 0.0f; - params.other_top_language.frequency = 0.0f; params.fetch_api = NTPSnippetsFetcher::CHROME_READER_API; @@ -321,8 +319,6 @@ params.excluded_ids = {}; params.interactive_request = true; params.user_class = "ACTIVE_NTP_USER"; - params.ui_language.frequency = 0.0f; - params.other_top_language.frequency = 0.0f; params.fetch_api = NTPSnippetsFetcher::CHROME_READER_API; EXPECT_THAT(params.BuildRequest(), @@ -376,8 +372,6 @@ params.excluded_ids.insert(base::StringPrintf("%03d", i)); } params.user_class = "ACTIVE_NTP_USER"; - params.ui_language.frequency = 0.0f; - params.other_top_language.frequency = 0.0f; params.fetch_api = NTPSnippetsFetcher::CHROME_CONTENT_SUGGESTIONS_API; EXPECT_THAT(params.BuildRequest(), @@ -418,8 +412,6 @@ params.host_restricts = {}; params.count_to_fetch = 10; params.interactive_request = false; - params.ui_language.frequency = 0.0f; - params.other_top_language.frequency = 0.0f; params.fetch_api = NTPSnippetsFetcher::CHROME_CONTENT_SUGGESTIONS_API; EXPECT_THAT(params.BuildRequest(), @@ -468,7 +460,6 @@ params.interactive_request = true; params.ui_language.language_code = "en"; params.ui_language.frequency = 0.5f; - params.other_top_language.frequency = 0.0f; params.fetch_api = NTPSnippetsFetcher::CHROME_CONTENT_SUGGESTIONS_API; EXPECT_THAT(params.BuildRequest(), @@ -489,7 +480,6 @@ params.host_restricts = {}; params.count_to_fetch = 10; params.interactive_request = true; - params.ui_language.frequency = 0.0f; params.other_top_language.language_code = "de"; params.other_top_language.frequency = 0.5f;
diff --git a/components/ntp_snippets_strings.grdp b/components/ntp_snippets_strings.grdp index 1323e78..e5af46f 100644 --- a/components/ntp_snippets_strings.grdp +++ b/components/ntp_snippets_strings.grdp
@@ -9,13 +9,16 @@ Get suggested content </message> <message name="IDS_NTP_STATUS_CARD_TITLE_NO_SUGGESTIONS" desc="On the New Tab Page, title of the status card explaining that there is no new content available in the section." formatter_data="android_java"> - Done for now + That’s all for now + </message> + <message name="IDS_NTP_STATUS_CARD_NO_SUGGESTIONS" desc="On the New Tab Page, text of card explaining to the user that they can expect to see some sort of content suggestions in this area in the future." formatter_data="android_java"> + Your suggestions appear here </message> <message name="IDS_NTP_STATUS_CARD_NO_BOOKMARKS" desc="On the New Tab Page, text of the card explaining to the user that they can expect to see bookmarks in this area in the future." formatter_data="android_java"> - Your recently visited bookmarks will appear here. + Your recently visited bookmarks appear here </message> <message name="IDS_NTP_STATUS_CARD_NO_ARTICLES" desc="On the New Tab Page, text of the card explaining to the user that they can expect to see suggested articles in this area in the future." formatter_data="android_java"> - More articles will appear when the time is right. + Your suggested articles appear here </message> </if>
diff --git a/components/ntp_tiles/BUILD.gn b/components/ntp_tiles/BUILD.gn index e51074f..e4c919c 100644 --- a/components/ntp_tiles/BUILD.gn +++ b/components/ntp_tiles/BUILD.gn
@@ -10,6 +10,8 @@ sources = [ "constants.cc", "constants.h", + "metrics.cc", + "metrics.h", "most_visited_sites.cc", "most_visited_sites.h", "ntp_tile.cc", @@ -57,7 +59,7 @@ if (is_android) { java_cpp_enum("ntp_tiles_enums_java") { sources = [ - "most_visited_sites.h", + "metrics.h", "ntp_tile.h", ] }
diff --git a/components/ntp_tiles/metrics.cc b/components/ntp_tiles/metrics.cc new file mode 100644 index 0000000..98a91aa --- /dev/null +++ b/components/ntp_tiles/metrics.cc
@@ -0,0 +1,113 @@ +// 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/ntp_tiles/metrics.h" + +#include <string> + +#include "base/metrics/histogram.h" +#include "base/metrics/histogram_macros.h" +#include "base/metrics/sparse_histogram.h" +#include "base/strings/stringprintf.h" + +namespace ntp_tiles { +namespace metrics { + +namespace { + +// Maximum number of tiles to record in histograms. +const int kMaxNumTiles = 12; + +// Identifiers for the various tile sources. +const char kHistogramClientName[] = "client"; +const char kHistogramServerName[] = "server"; +const char kHistogramPopularName[] = "popular"; +const char kHistogramWhitelistName[] = "whitelist"; + +// Log an event for a given |histogram| at a given element |position|. This +// routine exists because regular histogram macros are cached thus can't be used +// if the name of the histogram will change at a given call site. +void LogHistogramEvent(const std::string& histogram, + int position, + int num_sites) { + base::HistogramBase* counter = base::LinearHistogram::FactoryGet( + histogram, 1, num_sites, num_sites + 1, + base::Histogram::kUmaTargetedHistogramFlag); + if (counter) + counter->Add(position); +} + +std::string GetSourceHistogramName(NTPTileSource source) { + switch (source) { + case NTPTileSource::TOP_SITES: + return kHistogramClientName; + case NTPTileSource::POPULAR: + return kHistogramPopularName; + case NTPTileSource::WHITELIST: + return kHistogramWhitelistName; + case NTPTileSource::SUGGESTIONS_SERVICE: + return kHistogramServerName; + } + NOTREACHED(); + return std::string(); +} + +} // namespace + +void RecordImpressions(const NTPTilesVector& tiles) { + UMA_HISTOGRAM_SPARSE_SLOWLY("NewTabPage.NumberOfTiles", tiles.size()); + + for (size_t i = 0; i < tiles.size(); i++) { + UMA_HISTOGRAM_ENUMERATION("NewTabPage.SuggestionsImpression", + static_cast<int>(i), kMaxNumTiles); + + std::string histogram = + base::StringPrintf("NewTabPage.SuggestionsImpression.%s", + GetSourceHistogramName(tiles[i].source).c_str()); + LogHistogramEvent(histogram, static_cast<int>(i), kMaxNumTiles); + } +} + +void RecordImpressionTileTypes( + const std::vector<MostVisitedTileType>& tile_types, + const std::vector<NTPTileSource>& sources) { + int counts_per_type[NUM_TILE_TYPES] = {0}; + for (size_t i = 0; i < tile_types.size(); ++i) { + MostVisitedTileType tile_type = tile_types[i]; + ++counts_per_type[tile_type]; + + UMA_HISTOGRAM_ENUMERATION("NewTabPage.TileType", tile_type, NUM_TILE_TYPES); + + std::string histogram = base::StringPrintf( + "NewTabPage.TileType.%s", GetSourceHistogramName(sources[i]).c_str()); + LogHistogramEvent(histogram, tile_type, NUM_TILE_TYPES); + } + + UMA_HISTOGRAM_SPARSE_SLOWLY("NewTabPage.IconsReal", + counts_per_type[ICON_REAL]); + UMA_HISTOGRAM_SPARSE_SLOWLY("NewTabPage.IconsColor", + counts_per_type[ICON_COLOR]); + UMA_HISTOGRAM_SPARSE_SLOWLY("NewTabPage.IconsGray", + counts_per_type[ICON_DEFAULT]); +} + +void RecordClick(int index, + MostVisitedTileType tile_type, + NTPTileSource source) { + UMA_HISTOGRAM_ENUMERATION("NewTabPage.MostVisited", index, kMaxNumTiles); + + std::string histogram = base::StringPrintf( + "NewTabPage.MostVisited.%s", GetSourceHistogramName(source).c_str()); + LogHistogramEvent(histogram, index, kMaxNumTiles); + + UMA_HISTOGRAM_ENUMERATION("NewTabPage.TileTypeClicked", tile_type, + NUM_TILE_TYPES); + + histogram = base::StringPrintf("NewTabPage.TileTypeClicked.%s", + GetSourceHistogramName(source).c_str()); + LogHistogramEvent(histogram, tile_type, NUM_TILE_TYPES); +} + +} // namespace metrics +} // namespace ntp_tiles
diff --git a/components/ntp_tiles/metrics.h b/components/ntp_tiles/metrics.h new file mode 100644 index 0000000..e38dcc8 --- /dev/null +++ b/components/ntp_tiles/metrics.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 COMPONENTS_NTP_TILES_METRICS_H_ +#define COMPONENTS_NTP_TILES_METRICS_H_ + +#include <vector> + +#include "components/ntp_tiles/ntp_tile.h" + +namespace ntp_tiles { +namespace metrics { + +// The visual type of a most visited tile. +// +// These values must stay in sync with the MostVisitedTileType enum +// in histograms.xml. +// +// A Java counterpart will be generated for this enum. +// GENERATED_JAVA_ENUM_PACKAGE: org.chromium.chrome.browser.ntp +enum MostVisitedTileType { + // The icon or thumbnail hasn't loaded yet. + NONE, + // The item displays a site's actual favicon or touch icon. + ICON_REAL, + // The item displays a color derived from the site's favicon or touch icon. + ICON_COLOR, + // The item displays a default gray box in place of an icon. + ICON_DEFAULT, + NUM_TILE_TYPES, +}; + +// TODO(treib): Split into individual impressions for desktop. +void RecordImpressions(const NTPTilesVector& tiles); + +void RecordImpressionTileTypes( + const std::vector<MostVisitedTileType>& tile_types, + const std::vector<NTPTileSource>& sources); + +// TODO(treib): Split into "base" click and tile type for desktop. +void RecordClick(int index, + MostVisitedTileType tile_type, + NTPTileSource source); + +} // namespace metrics +} // namespace ntp_tiles + +#endif
diff --git a/components/ntp_tiles/most_visited_sites.cc b/components/ntp_tiles/most_visited_sites.cc index 65dc202..a3ecc9b 100644 --- a/components/ntp_tiles/most_visited_sites.cc +++ b/components/ntp_tiles/most_visited_sites.cc
@@ -17,15 +17,11 @@ #include "base/command_line.h" #include "base/feature_list.h" #include "base/metrics/field_trial.h" -#include "base/metrics/histogram.h" -#include "base/metrics/histogram_macros.h" -#include "base/metrics/sparse_histogram.h" -#include "base/strings/string_number_conversions.h" #include "base/strings/string_util.h" -#include "base/strings/stringprintf.h" #include "base/strings/utf_string_conversions.h" #include "components/history/core/browser/top_sites.h" #include "components/ntp_tiles/constants.h" +#include "components/ntp_tiles/metrics.h" #include "components/ntp_tiles/pref_names.h" #include "components/ntp_tiles/switches.h" #include "components/pref_registry/pref_registry_syncable.h" @@ -45,31 +41,9 @@ namespace { -// Identifiers for the various tile sources. -const char kHistogramClientName[] = "client"; -const char kHistogramServerName[] = "server"; -const char kHistogramPopularName[] = "popular"; -const char kHistogramWhitelistName[] = "whitelist"; - const base::Feature kDisplaySuggestionsServiceTiles{ "DisplaySuggestionsServiceTiles", base::FEATURE_ENABLED_BY_DEFAULT}; -// Log an event for a given |histogram| at a given element |position|. This -// routine exists because regular histogram macros are cached thus can't be used -// if the name of the histogram will change at a given call site. -void LogHistogramEvent(const std::string& histogram, - int position, - int num_sites) { - base::HistogramBase* counter = base::LinearHistogram::FactoryGet( - histogram, - 1, - num_sites, - num_sites + 1, - base::Histogram::kUmaTargetedHistogramFlag); - if (counter) - counter->Add(position); -} - bool ShouldShowPopularSites() { // Note: It's important to query the field trial state first, to ensure that // UMA reports the correct group. @@ -104,21 +78,6 @@ return url1.host() == url2.host() && url1.path() == url2.path(); } -std::string GetSourceHistogramName(NTPTileSource source) { - switch (source) { - case NTPTileSource::TOP_SITES: - return kHistogramClientName; - case NTPTileSource::POPULAR: - return kHistogramPopularName; - case NTPTileSource::WHITELIST: - return kHistogramWhitelistName; - case NTPTileSource::SUGGESTIONS_SERVICE: - return kHistogramServerName; - } - NOTREACHED(); - return std::string(); -} - } // namespace MostVisitedSites::MostVisitedSites(PrefService* prefs, @@ -135,7 +94,7 @@ num_sites_(0), waiting_for_most_visited_sites_(true), waiting_for_popular_sites_(true), - recorded_uma_(false), + recorded_impressions_(false), top_sites_observer_(this), mv_source_(NTPTileSource::SUGGESTIONS_SERVICE), weak_ptr_factory_(this) { @@ -207,48 +166,6 @@ } } -void MostVisitedSites::RecordTileTypeMetrics( - const std::vector<MostVisitedTileType>& tile_types, - const std::vector<NTPTileSource>& sources) { - int counts_per_type[NUM_TILE_TYPES] = {0}; - for (size_t i = 0; i < tile_types.size(); ++i) { - MostVisitedTileType tile_type = tile_types[i]; - ++counts_per_type[tile_type]; - - UMA_HISTOGRAM_ENUMERATION("NewTabPage.TileType", tile_type, NUM_TILE_TYPES); - - std::string histogram = base::StringPrintf( - "NewTabPage.TileType.%s", - GetSourceHistogramName(sources[i]).c_str()); - LogHistogramEvent(histogram, tile_type, NUM_TILE_TYPES); - } - - UMA_HISTOGRAM_SPARSE_SLOWLY("NewTabPage.IconsReal", - counts_per_type[ICON_REAL]); - UMA_HISTOGRAM_SPARSE_SLOWLY("NewTabPage.IconsColor", - counts_per_type[ICON_COLOR]); - UMA_HISTOGRAM_SPARSE_SLOWLY("NewTabPage.IconsGray", - counts_per_type[ICON_DEFAULT]); -} - -void MostVisitedSites::RecordOpenedMostVisitedItem( - int index, - MostVisitedTileType tile_type, - NTPTileSource source) { - UMA_HISTOGRAM_ENUMERATION("NewTabPage.MostVisited", index, num_sites_); - - std::string histogram = base::StringPrintf( - "NewTabPage.MostVisited.%s", GetSourceHistogramName(source).c_str()); - LogHistogramEvent(histogram, index, num_sites_); - - UMA_HISTOGRAM_ENUMERATION( - "NewTabPage.TileTypeClicked", tile_type, NUM_TILE_TYPES); - - histogram = base::StringPrintf("NewTabPage.TileTypeClicked.%s", - GetSourceHistogramName(source).c_str()); - LogHistogramEvent(histogram, tile_type, NUM_TILE_TYPES); -} - void MostVisitedSites::OnBlockedSitesChanged() { BuildCurrentTiles(); } @@ -474,9 +391,9 @@ void MostVisitedSites::NotifyMostVisitedURLsObserver() { if (!waiting_for_most_visited_sites_ && !waiting_for_popular_sites_ && - !recorded_uma_) { - RecordImpressionUMAMetrics(); - recorded_uma_ = true; + !recorded_impressions_) { + metrics::RecordImpressions(current_tiles_); + recorded_impressions_ = true; } if (!observer_) @@ -501,21 +418,6 @@ BuildCurrentTiles(); } -void MostVisitedSites::RecordImpressionUMAMetrics() { - UMA_HISTOGRAM_SPARSE_SLOWLY("NewTabPage.NumberOfTiles", - current_tiles_.size()); - - for (size_t i = 0; i < current_tiles_.size(); i++) { - UMA_HISTOGRAM_ENUMERATION( - "NewTabPage.SuggestionsImpression", static_cast<int>(i), num_sites_); - - std::string histogram = base::StringPrintf( - "NewTabPage.SuggestionsImpression.%s", - GetSourceHistogramName(current_tiles_[i].source).c_str()); - LogHistogramEvent(histogram, static_cast<int>(i), num_sites_); - } -} - void MostVisitedSites::TopSitesLoaded(TopSites* top_sites) {} void MostVisitedSites::TopSitesChanged(TopSites* top_sites,
diff --git a/components/ntp_tiles/most_visited_sites.h b/components/ntp_tiles/most_visited_sites.h index 28f9b07..b305a4d 100644 --- a/components/ntp_tiles/most_visited_sites.h +++ b/components/ntp_tiles/most_visited_sites.h
@@ -82,25 +82,6 @@ public: using PopularSitesVector = std::vector<PopularSites::Site>; - // The visual type of a most visited tile. - // - // These values must stay in sync with the MostVisitedTileType enum - // in histograms.xml. - // - // A Java counterpart will be generated for this enum. - // GENERATED_JAVA_ENUM_PACKAGE: org.chromium.chrome.browser.ntp - enum MostVisitedTileType { - // The icon or thumbnail hasn't loaded yet. - NONE, - // The item displays a site's actual favicon or touch icon. - ICON_REAL, - // The item displays a color derived from the site's favicon or touch icon. - ICON_COLOR, - // The item displays a default gray box in place of an icon. - ICON_DEFAULT, - NUM_TILE_TYPES, - }; - // The observer to be notified when the list of most visited sites changes. class Observer { public: @@ -129,11 +110,6 @@ void SetMostVisitedURLsObserver(Observer* observer, int num_sites); void AddOrRemoveBlacklistedUrl(const GURL& url, bool add_url); - void RecordTileTypeMetrics(const std::vector<MostVisitedTileType>& tile_types, - const std::vector<NTPTileSource>& sources); - void RecordOpenedMostVisitedItem(int index, - MostVisitedTileType tile_type, - NTPTileSource source); // MostVisitedSitesSupervisor::Observer implementation. void OnBlockedSitesChanged() override; @@ -186,9 +162,6 @@ void OnPopularSitesAvailable(bool success); - // Records UMA histogram metrics related to the number of impressions. - void RecordImpressionUMAMetrics(); - // history::TopSitesObserver implementation. void TopSitesLoaded(history::TopSites* top_sites) override; void TopSitesChanged(history::TopSites* top_sites, @@ -213,9 +186,9 @@ // to false if popular sites are disabled, or are not required. bool waiting_for_popular_sites_; - // True if we have recorded one-shot UMA metrics such as impressions. They are - // recorded once both the previous flags are true. - bool recorded_uma_; + // True if we have recorded impression metrics. They are recorded once both + // the previous flags are false. + bool recorded_impressions_; std::unique_ptr< suggestions::SuggestionsService::ResponseCallbackList::Subscription>
diff --git a/components/omnibox/browser/autocomplete_match.cc b/components/omnibox/browser/autocomplete_match.cc index c0913fb..c8b890d 100644 --- a/components/omnibox/browser/autocomplete_match.cc +++ b/components/omnibox/browser/autocomplete_match.cc
@@ -20,7 +20,6 @@ #include "components/search_engines/template_url.h" #include "components/search_engines/template_url_service.h" #include "components/url_formatter/url_formatter.h" -#include "grit/components_scaled_resources.h" #include "ui/gfx/vector_icons_public.h" namespace { @@ -167,66 +166,6 @@ } // static -int AutocompleteMatch::TypeToIcon(Type type) { -#if !defined(OS_IOS) - static const int kIcons[] = { - IDR_OMNIBOX_HTTP, // URL_WHAT_YOU_TYPE - IDR_OMNIBOX_HTTP, // HISTORY_URL - IDR_OMNIBOX_HTTP, // HISTORY_TITLE - IDR_OMNIBOX_HTTP, // HISTORY_BODY - IDR_OMNIBOX_HTTP, // HISTORY_KEYWORD - IDR_OMNIBOX_HTTP, // NAVSUGGEST - IDR_OMNIBOX_SEARCH, // SEARCH_WHAT_YOU_TYPED - IDR_OMNIBOX_SEARCH, // SEARCH_HISTORY - IDR_OMNIBOX_SEARCH, // SEARCH_SUGGEST - IDR_OMNIBOX_SEARCH, // SEARCH_SUGGEST_ENTITY - IDR_OMNIBOX_SEARCH, // SEARCH_SUGGEST_TAIL - IDR_OMNIBOX_SEARCH, // SEARCH_SUGGEST_PERSONALIZED - IDR_OMNIBOX_SEARCH, // SEARCH_SUGGEST_PROFILE - IDR_OMNIBOX_SEARCH, // SEARCH_OTHER_ENGINE - IDR_OMNIBOX_EXTENSION_APP, // EXTENSION_APP - IDR_OMNIBOX_SEARCH, // CONTACT_DEPRECATED - IDR_OMNIBOX_HTTP, // BOOKMARK_TITLE - IDR_OMNIBOX_HTTP, // NAVSUGGEST_PERSONALIZED - IDR_OMNIBOX_CALCULATOR, // CALCULATOR - IDR_OMNIBOX_HTTP, // CLIPBOARD - IDR_OMNIBOX_SEARCH, // VOICE_SEARCH - IDR_OMNIBOX_HTTP, // PHYSICAL_WEB - IDR_OMNIBOX_HTTP, // PHYSICAL_WEB_OVERFLOW - }; -#else - static const int kIcons[] = { - IDR_OMNIBOX_HTTP, // URL_WHAT_YOU_TYPE - IDR_OMNIBOX_HISTORY, // HISTORY_URL - IDR_OMNIBOX_HISTORY, // HISTORY_TITLE - IDR_OMNIBOX_HISTORY, // HISTORY_BODY - IDR_OMNIBOX_HISTORY, // HISTORY_KEYWORD - IDR_OMNIBOX_HTTP, // NAVSUGGEST - IDR_OMNIBOX_SEARCH, // SEARCH_WHAT_YOU_TYPED - IDR_OMNIBOX_HISTORY, // SEARCH_HISTORY - IDR_OMNIBOX_SEARCH, // SEARCH_SUGGEST - IDR_OMNIBOX_SEARCH, // SEARCH_SUGGEST_ENTITY - IDR_OMNIBOX_SEARCH, // SEARCH_SUGGEST_TAIL - IDR_OMNIBOX_SEARCH, // SEARCH_SUGGEST_PERSONALIZED - IDR_OMNIBOX_SEARCH, // SEARCH_SUGGEST_PROFILE - IDR_OMNIBOX_SEARCH, // SEARCH_OTHER_ENGINE - IDR_OMNIBOX_EXTENSION_APP, // EXTENSION_APP - IDR_OMNIBOX_SEARCH, // CONTACT_DEPRECATED - IDR_OMNIBOX_HTTP, // BOOKMARK_TITLE - IDR_OMNIBOX_HTTP, // NAVSUGGEST_PERSONALIZED - IDR_OMNIBOX_CALCULATOR, // CALCULATOR - IDR_OMNIBOX_HTTP, // CLIPBOARD - IDR_OMNIBOX_SEARCH, // VOICE_SEARCH - IDR_OMNIBOX_HTTP, // PHYSICAL_WEB - IDR_OMNIBOX_HTTP, // PHYSICAL_WEB_OVERFLOW - }; -#endif - static_assert(arraysize(kIcons) == AutocompleteMatchType::NUM_TYPES, - "icons array must have NUM_TYPES elements"); - return kIcons[type]; -} - -// static gfx::VectorIconId AutocompleteMatch::TypeToVectorIcon(Type type) { #if !defined(OS_ANDROID) && !defined(OS_IOS) static const gfx::VectorIconId kIcons[] = {
diff --git a/components/omnibox/browser/autocomplete_match.h b/components/omnibox/browser/autocomplete_match.h index 3333ce9..c78323e2 100644 --- a/components/omnibox/browser/autocomplete_match.h +++ b/components/omnibox/browser/autocomplete_match.h
@@ -108,10 +108,6 @@ // Converts |type| to a string representation. Used in logging and debugging. AutocompleteMatch& operator=(const AutocompleteMatch& match); - // Converts |type| to a resource identifier for the appropriate icon for this - // type to show in the completion popup. - static int TypeToIcon(Type type); - // Gets the vector icon identifier for the icon to be shown for |type|. static gfx::VectorIconId TypeToVectorIcon(Type type);
diff --git a/components/omnibox/browser/omnibox_edit_unittest.cc b/components/omnibox/browser/omnibox_edit_unittest.cc index d14f460c..837d37a 100644 --- a/components/omnibox/browser/omnibox_edit_unittest.cc +++ b/components/omnibox/browser/omnibox_edit_unittest.cc
@@ -378,16 +378,16 @@ const AutocompleteMatch match( model()->autocomplete_controller()->search_provider(), 0, false, AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED); - const GURL alternate_nav_url("http://ab%20cd/"); + const GURL alternate_nav_url("http://abcd/"); model()->OnSetFocus(false); // Avoids DCHECK in OpenMatch(). - model()->SetUserText(base::ASCIIToUTF16("http://ab cd")); + model()->SetUserText(base::ASCIIToUTF16("http://abcd")); model()->OpenMatch(match, WindowOpenDisposition::CURRENT_TAB, alternate_nav_url, base::string16(), 0); EXPECT_TRUE(AutocompleteInput::HasHTTPScheme( client->alternate_nav_match().fill_into_edit)); - model()->SetUserText(base::ASCIIToUTF16("ab cd")); + model()->SetUserText(base::ASCIIToUTF16("abcd")); model()->OpenMatch(match, WindowOpenDisposition::CURRENT_TAB, alternate_nav_url, base::string16(), 0); EXPECT_TRUE(AutocompleteInput::HasHTTPScheme(
diff --git a/components/omnibox/browser/omnibox_view.cc b/components/omnibox/browser/omnibox_view.cc index d471fb1..a09b954 100644 --- a/components/omnibox/browser/omnibox_view.cc +++ b/components/omnibox/browser/omnibox_view.cc
@@ -79,26 +79,13 @@ (GetOmniboxTextLength() == 0); } -int OmniboxView::GetIcon() const { - if (!IsEditingOrEmpty()) - return controller_->GetToolbarModel()->GetIcon(); - int id = AutocompleteMatch::TypeToIcon(model_.get() ? - model_->CurrentTextType() : AutocompleteMatchType::URL_WHAT_YOU_TYPED); - return (id == IDR_OMNIBOX_HTTP) ? IDR_LOCATION_BAR_HTTP : id; -} - gfx::VectorIconId OmniboxView::GetVectorIcon() const { -#if !defined(OS_ANDROID) && !defined(OS_IOS) if (!IsEditingOrEmpty()) return controller_->GetToolbarModel()->GetVectorIcon(); return AutocompleteMatch::TypeToVectorIcon( model_ ? model_->CurrentTextType() : AutocompleteMatchType::URL_WHAT_YOU_TYPED); -#else - NOTIMPLEMENTED(); - return gfx::VectorIconId::VECTOR_ICON_NONE; -#endif } void OmniboxView::SetUserText(const base::string16& text) {
diff --git a/components/omnibox/browser/omnibox_view.h b/components/omnibox/browser/omnibox_view.h index 5f71e1a..5245445a 100644 --- a/components/omnibox/browser/omnibox_view.h +++ b/components/omnibox/browser/omnibox_view.h
@@ -90,9 +90,6 @@ // the field is empty. bool IsEditingOrEmpty() const; - // Returns the resource ID of the icon to show for the current text. - int GetIcon() const; - // Like GetIcon(), but returns a vector icon identifier. gfx::VectorIconId GetVectorIcon() const;
diff --git a/components/password_manager/core/browser/BUILD.gn b/components/password_manager/core/browser/BUILD.gn index 81de353..1f8bd1c9 100644 --- a/components/password_manager/core/browser/BUILD.gn +++ b/components/password_manager/core/browser/BUILD.gn
@@ -299,8 +299,8 @@ "//components/password_manager/core/common", "//components/prefs:test_support", "//components/strings", - "//components/sync:test_support_sync_driver", - "//components/sync:test_support_sync_model", + "//components/sync:test_support_driver", + "//components/sync:test_support_model", "//components/variations", "//net:test_support", "//sql:test_support",
diff --git a/components/password_manager/core/browser/statistics_table_unittest.cc b/components/password_manager/core/browser/statistics_table_unittest.cc index adf1f0c7..d51aa286 100644 --- a/components/password_manager/core/browser/statistics_table_unittest.cc +++ b/components/password_manager/core/browser/statistics_table_unittest.cc
@@ -143,7 +143,8 @@ // Remove the entries with the timestamp 2 that are NOT matching // |kTestDomain3|. EXPECT_TRUE(db()->RemoveStatsByOriginAndTime( - base::Bind(&GURL::operator!=, base::Unretained(&stats3.origin_domain)), + base::Bind(static_cast<bool (*)(const GURL&, const GURL&)>(operator!=), + stats3.origin_domain), base::Time::FromTimeT(2), base::Time())); EXPECT_THAT(db()->GetRows(stats1.origin_domain), IsEmpty()); EXPECT_THAT(db()->GetRows(stats2.origin_domain), IsEmpty());
diff --git a/components/password_manager/sync/browser/BUILD.gn b/components/password_manager/sync/browser/BUILD.gn index 2eb998a..795d5342 100644 --- a/components/password_manager/sync/browser/BUILD.gn +++ b/components/password_manager/sync/browser/BUILD.gn
@@ -52,8 +52,8 @@ "//components/prefs", "//components/signin/core/browser:test_support", "//components/signin/core/common", - "//components/sync:test_support_sync_driver", - "//components/sync:test_support_sync_model", + "//components/sync:test_support_driver", + "//components/sync:test_support_model", "//components/syncable_prefs", "//components/syncable_prefs:test_support", "//testing/gmock",
diff --git a/components/policy/core/browser/BUILD.gn b/components/policy/core/browser/BUILD.gn index 98a06e87..9b98ff8 100644 --- a/components/policy/core/browser/BUILD.gn +++ b/components/policy/core/browser/BUILD.gn
@@ -38,6 +38,7 @@ "//components/pref_registry", "//components/prefs", "//components/strings", + "//components/url_formatter", "//components/url_matcher", "//net", "//ui/base",
diff --git a/components/policy/core/browser/configuration_policy_handler_list.cc b/components/policy/core/browser/configuration_policy_handler_list.cc index 9cdfc2aa..1e993737 100644 --- a/components/policy/core/browser/configuration_policy_handler_list.cc +++ b/components/policy/core/browser/configuration_policy_handler_list.cc
@@ -4,15 +4,23 @@ #include "components/policy/core/browser/configuration_policy_handler_list.h" +#include "base/bind.h" #include "base/stl_util.h" #include "components/policy/core/browser/configuration_policy_handler.h" #include "components/policy/core/browser/configuration_policy_handler_parameters.h" #include "components/policy/core/browser/policy_error_map.h" -#include "components/policy/core/common/policy_map.h" #include "components/prefs/pref_value_map.h" #include "grit/components_strings.h" namespace policy { + +namespace { + +// Don't show errors for policies starting with that prefix. +const char kPolicyCommentPrefix[] = "_comment"; + +} // namespace + ConfigurationPolicyHandlerList::ConfigurationPolicyHandlerList( const PopulatePolicyHandlerParametersCallback& parameters_callback, const GetChromePolicyDetailsCallback& details_callback) @@ -35,37 +43,64 @@ // This function is used both to apply the policy settings, and to check them // and list errors. As such it must get all the errors even if it isn't // applying the policies. - // TODO (aberent) split into two functions. + // TODO(aberent): split into two functions. + std::unique_ptr<PolicyMap> filtered_policies = policies.DeepCopy(); + filtered_policies->EraseMatching( + base::Bind(&ConfigurationPolicyHandlerList::IsPlatformDevicePolicy, + base::Unretained(this))); + PolicyErrorMap scoped_errors; if (!errors) errors = &scoped_errors; - policy::PolicyHandlerParameters parameters; + PolicyHandlerParameters parameters; parameters_callback_.Run(¶meters); - std::vector<ConfigurationPolicyHandler*>::const_iterator handler; - for (handler = handlers_.begin(); handler != handlers_.end(); ++handler) { - if ((*handler)->CheckPolicySettings(policies, errors) && prefs) { - (*handler) - ->ApplyPolicySettingsWithParameters(policies, parameters, prefs); + for (auto handler : handlers_) { + if (handler->CheckPolicySettings(*filtered_policies, errors) && prefs) { + handler->ApplyPolicySettingsWithParameters( + *filtered_policies, parameters, prefs); } } - for (PolicyMap::const_iterator it = policies.begin(); - it != policies.end(); - ++it) { - const PolicyDetails* details = - details_callback_.is_null() ? NULL : details_callback_.Run(it->first); - if (details && details->is_deprecated) - errors->AddError(it->first, IDS_POLICY_DEPRECATED); + if (details_callback_) { + for (PolicyMap::const_iterator it = filtered_policies->begin(); + it != filtered_policies->end(); + ++it) { + const PolicyDetails* details = details_callback_.Run(it->first); + if (details && details->is_deprecated) + errors->AddError(it->first, IDS_POLICY_DEPRECATED); + } } } void ConfigurationPolicyHandlerList::PrepareForDisplaying( PolicyMap* policies) const { - std::vector<ConfigurationPolicyHandler*>::const_iterator handler; - for (handler = handlers_.begin(); handler != handlers_.end(); ++handler) - (*handler)->PrepareForDisplaying(policies); + for (auto handler : handlers_) + handler->PrepareForDisplaying(policies); +} + +bool ConfigurationPolicyHandlerList::IsPlatformDevicePolicy( + const PolicyMap::const_iterator iter) const { + // Callback might be missing in tests. + if (!details_callback_) { + return false; + } + const PolicyDetails* policy_details = details_callback_.Run(iter->first); + if (!policy_details) { + const std::string prefix(kPolicyCommentPrefix); + if (iter->first.compare(0, prefix.length(), prefix) != 0) { + LOG(ERROR) << "Unknown policy: " << iter->first; + } + return false; + } + if (iter->second.source == POLICY_SOURCE_PLATFORM && + policy_details->is_device_policy) { + // Device Policy is only implemented as Cloud Policy (not Platform Policy). + LOG(WARNING) << "Ignoring device platform policy: " << iter->first; + return true; + } + return false; } } // namespace policy
diff --git a/components/policy/core/browser/configuration_policy_handler_list.h b/components/policy/core/browser/configuration_policy_handler_list.h index a130e6fc5..933dfbe 100644 --- a/components/policy/core/browser/configuration_policy_handler_list.h +++ b/components/policy/core/browser/configuration_policy_handler_list.h
@@ -11,6 +11,7 @@ #include "base/callback.h" #include "base/macros.h" #include "components/policy/core/common/policy_details.h" +#include "components/policy/core/common/policy_map.h" #include "components/policy/policy_export.h" class PrefValueMap; @@ -20,13 +21,12 @@ class ConfigurationPolicyHandler; class PolicyErrorMap; struct PolicyHandlerParameters; -class PolicyMap; struct PolicyToPreferenceMapEntry; class Schema; // Converts policies to their corresponding preferences by applying a list of -// ConfigurationPolicyHandler objects. This includes error checking and -// cleaning up policy values for displaying. +// ConfigurationPolicyHandler objects. This includes error checking and cleaning +// up policy values for display. class POLICY_EXPORT ConfigurationPolicyHandlerList { public: typedef base::Callback<void(PolicyHandlerParameters*)> @@ -40,9 +40,9 @@ // Adds a policy handler to the list. void AddHandler(std::unique_ptr<ConfigurationPolicyHandler> handler); - // Translates |policies| to their corresponding preferences in |prefs|. - // Any errors found while processing the policies are stored in |errors|. - // |prefs| or |errors| can be NULL, and won't be filled in that case. + // Translates |policies| to their corresponding preferences in |prefs|. Any + // errors found while processing the policies are stored in |errors|. |prefs| + // or |errors| can be nullptr, and won't be filled in that case. void ApplyPolicySettings(const PolicyMap& policies, PrefValueMap* prefs, PolicyErrorMap* errors) const; @@ -51,6 +51,8 @@ void PrepareForDisplaying(PolicyMap* policies) const; private: + bool IsPlatformDevicePolicy(const PolicyMap::const_iterator iter) const; + std::vector<ConfigurationPolicyHandler*> handlers_; const PopulatePolicyHandlerParametersCallback parameters_callback_; const GetChromePolicyDetailsCallback details_callback_;
diff --git a/components/policy/core/browser/url_blacklist_manager.cc b/components/policy/core/browser/url_blacklist_manager.cc index 7042c47..e0f93b7 100644 --- a/components/policy/core/browser/url_blacklist_manager.cc +++ b/components/policy/core/browser/url_blacklist_manager.cc
@@ -25,6 +25,7 @@ #include "components/policy/core/common/policy_pref_names.h" #include "components/pref_registry/pref_registry_syncable.h" #include "components/prefs/pref_service.h" +#include "components/url_formatter/url_fixer.h" #include "net/base/filename_util.h" #include "net/base/net_errors.h" #include "url/third_party/mozilla/url_parse.h" @@ -66,9 +67,8 @@ // A task that builds the blacklist on a background thread. std::unique_ptr<URLBlacklist> BuildBlacklist( std::unique_ptr<base::ListValue> block, - std::unique_ptr<base::ListValue> allow, - URLBlacklist::SegmentURLCallback segment_url) { - std::unique_ptr<URLBlacklist> blacklist(new URLBlacklist(segment_url)); + std::unique_ptr<base::ListValue> allow) { + std::unique_ptr<URLBlacklist> blacklist(new URLBlacklist); blacklist->Block(block.get()); blacklist->Allow(allow.get()); return blacklist; @@ -154,8 +154,7 @@ bool allow; }; -URLBlacklist::URLBlacklist(SegmentURLCallback segment_url) - : segment_url_(segment_url), id_(0), url_matcher_(new URLMatcher) {} +URLBlacklist::URLBlacklist() : id_(0), url_matcher_(new URLMatcher) {} URLBlacklist::~URLBlacklist() {} @@ -169,8 +168,7 @@ DCHECK(success); FilterComponents components; components.allow = allow; - if (!FilterToComponents(segment_url_, - pattern, + if (!FilterToComponents(pattern, &components.scheme, &components.host, &components.match_subdomains, @@ -247,8 +245,7 @@ } // static -bool URLBlacklist::FilterToComponents(SegmentURLCallback segment_url, - const std::string& filter, +bool URLBlacklist::FilterToComponents(const std::string& filter, std::string* scheme, std::string* host, bool* match_subdomains, @@ -263,7 +260,7 @@ DCHECK(query); url::Parsed parsed; const std::string lc_filter = base::ToLowerASCII(filter); - const std::string url_scheme = segment_url(filter, &parsed); + const std::string url_scheme = url_formatter::SegmentURL(filter, &parsed); if (url_scheme == url::kFileScheme) { base::FilePath file_path; @@ -437,15 +434,13 @@ PrefService* pref_service, const scoped_refptr<base::SequencedTaskRunner>& background_task_runner, const scoped_refptr<base::SequencedTaskRunner>& io_task_runner, - URLBlacklist::SegmentURLCallback segment_url, OverrideBlacklistCallback override_blacklist) : pref_service_(pref_service), background_task_runner_(background_task_runner), io_task_runner_(io_task_runner), - segment_url_(segment_url), override_blacklist_(override_blacklist), ui_task_runner_(base::ThreadTaskRunnerHandle::Get()), - blacklist_(new URLBlacklist(segment_url)), + blacklist_(new URLBlacklist), ui_weak_ptr_factory_(this), io_weak_ptr_factory_(this) { pref_change_registrar_.Init(pref_service_); @@ -511,8 +506,7 @@ FROM_HERE, base::Bind(&BuildBlacklist, base::Passed(&block), - base::Passed(&allow), - segment_url_), + base::Passed(&allow)), base::Bind(&URLBlacklistManager::SetBlacklist, io_weak_ptr_factory_.GetWeakPtr())); }
diff --git a/components/policy/core/browser/url_blacklist_manager.h b/components/policy/core/browser/url_blacklist_manager.h index 0693cb7..6cebaa0c 100644 --- a/components/policy/core/browser/url_blacklist_manager.h +++ b/components/policy/core/browser/url_blacklist_manager.h
@@ -49,11 +49,7 @@ URL_NEUTRAL_STATE, }; - // This is meant to be bound to url_formatter::SegmentURL. See that function - // for documentation on the parameters and return value. - typedef std::string (*SegmentURLCallback)(const std::string&, url::Parsed*); - - explicit URLBlacklist(SegmentURLCallback segment_url); + URLBlacklist(); virtual ~URLBlacklist(); // Allows or blocks URLs matching one of the filters, depending on |allow|. @@ -89,8 +85,7 @@ // |path| does not include query parameters. // |query| contains the query parameters ('?' not included). // All arguments are mandatory. - static bool FilterToComponents(SegmentURLCallback segment_url, - const std::string& filter, + static bool FilterToComponents(const std::string& filter, std::string* scheme, std::string* host, bool* match_subdomains, @@ -120,7 +115,6 @@ static bool FilterTakesPrecedence(const FilterComponents& lhs, const FilterComponents& rhs); - SegmentURLCallback segment_url_; url_matcher::URLMatcherConditionSet::ID id_; std::map<url_matcher::URLMatcherConditionSet::ID, FilterComponents> filters_; std::unique_ptr<url_matcher::URLMatcher> url_matcher_; @@ -157,12 +151,10 @@ // |background_task_runner| is used to build the blacklist in a background // thread. // |io_task_runner| must be backed by the IO thread. - // |segment_url| is used to break a URL spec into its components. URLBlacklistManager( PrefService* pref_service, const scoped_refptr<base::SequencedTaskRunner>& background_task_runner, const scoped_refptr<base::SequencedTaskRunner>& io_task_runner, - URLBlacklist::SegmentURLCallback segment_url, OverrideBlacklistCallback override_blacklist); virtual ~URLBlacklistManager(); @@ -223,9 +215,6 @@ // Used to post tasks to the IO thread. scoped_refptr<base::SequencedTaskRunner> io_task_runner_; - // Used to break a URL into its components. - URLBlacklist::SegmentURLCallback segment_url_; - // Used to optionally skip blacklisting for some URLs. OverrideBlacklistCallback override_blacklist_;
diff --git a/components/policy/core/browser/url_blacklist_manager_unittest.cc b/components/policy/core/browser/url_blacklist_manager_unittest.cc index 3cfe85a..f43c04c 100644 --- a/components/policy/core/browser/url_blacklist_manager_unittest.cc +++ b/components/policy/core/browser/url_blacklist_manager_unittest.cc
@@ -30,11 +30,6 @@ namespace { -// Helper to get the disambiguated SegmentURL() function. -URLBlacklist::SegmentURLCallback GetSegmentURLCallback() { - return url_formatter::SegmentURL; -} - bool OverrideBlacklistForURL(const GURL& url, bool* block, int* reason) { return false; } @@ -45,7 +40,6 @@ : URLBlacklistManager(pref_service, base::ThreadTaskRunnerHandle::Get(), base::ThreadTaskRunnerHandle::Get(), - GetSegmentURLCallback(), base::Bind(OverrideBlacklistForURL)), update_called_(0), set_blacklist_called_(false) {} @@ -176,7 +170,7 @@ // Returns whether |url| matches the |pattern|. bool IsMatch(const std::string& pattern, const std::string& url) { - URLBlacklist blacklist(GetSegmentURLCallback()); + URLBlacklist blacklist; // Add the pattern to blacklist. std::unique_ptr<base::ListValue> blocked(new base::ListValue); @@ -191,7 +185,7 @@ policy::URLBlacklist::URLBlacklistState GetMatch(const std::string& pattern, const std::string& url, const bool use_whitelist) { - URLBlacklist blacklist(GetSegmentURLCallback()); + URLBlacklist blacklist; // Add the pattern to list. std::unique_ptr<base::ListValue> blocked(new base::ListValue); @@ -214,8 +208,7 @@ std::string path; std::string query; - URLBlacklist::FilterToComponents(GetSegmentURLCallback(), - GetParam().filter(), + URLBlacklist::FilterToComponents(GetParam().filter(), &scheme, &host, &match_subdomains, @@ -359,7 +352,7 @@ "/whatever"))); TEST_F(URLBlacklistManagerTest, Filtering) { - URLBlacklist blacklist(GetSegmentURLCallback()); + URLBlacklist blacklist; // Block domain and all subdomains, for any filtered scheme. EXPECT_TRUE(IsMatch("google.com", "http://google.com")); @@ -495,7 +488,7 @@ } TEST_F(URLBlacklistManagerTest, QueryParameters) { - URLBlacklist blacklist(GetSegmentURLCallback()); + URLBlacklist blacklist; std::unique_ptr<base::ListValue> blocked(new base::ListValue); std::unique_ptr<base::ListValue> allowed(new base::ListValue); @@ -631,7 +624,7 @@ } TEST_F(URLBlacklistManagerTest, BlockAllWithExceptions) { - URLBlacklist blacklist(GetSegmentURLCallback()); + URLBlacklist blacklist; std::unique_ptr<base::ListValue> blocked(new base::ListValue); std::unique_ptr<base::ListValue> allowed(new base::ListValue); @@ -658,7 +651,7 @@ TEST_F(URLBlacklistManagerTest, DontBlockResources) { std::unique_ptr<URLBlacklist> - blacklist(new URLBlacklist(GetSegmentURLCallback())); + blacklist(new URLBlacklist); std::unique_ptr<base::ListValue> blocked(new base::ListValue); blocked->AppendString("google.com"); blacklist->Block(blocked.get()); @@ -672,7 +665,7 @@ } TEST_F(URLBlacklistManagerTest, DefaultBlacklistExceptions) { - URLBlacklist blacklist(GetSegmentURLCallback()); + URLBlacklist blacklist; std::unique_ptr<base::ListValue> blocked(new base::ListValue); // Blacklist everything:
diff --git a/components/policy/core/common/config_dir_policy_loader.cc b/components/policy/core/common/config_dir_policy_loader.cc index d7313e8..76f9763 100644 --- a/components/policy/core/common/config_dir_policy_loader.cc +++ b/components/policy/core/common/config_dir_policy_loader.cc
@@ -22,7 +22,6 @@ #include "components/policy/core/common/policy_bundle.h" #include "components/policy/core/common/policy_load_status.h" #include "components/policy/core/common/policy_types.h" -#include "components/policy/policy_constants.h" namespace policy { @@ -59,20 +58,6 @@ return POLICY_LOAD_STATUS_PARSE_ERROR; } -bool IsUserPolicy(const PolicyMap::const_iterator iter) { - const PolicyDetails* policy_details = GetChromePolicyDetails(iter->first); - if (!policy_details) { - LOG(ERROR) << "Ignoring unknown platform policy: " << iter->first; - return false; - } - if (policy_details->is_device_policy) { - // Device Policy is only implemented as Cloud Policy (not Platform Policy). - LOG(ERROR) << "Ignoring device platform policy: " << iter->first; - return false; - } - return true; -} - } // namespace ConfigDirPolicyLoader::ConfigDirPolicyLoader( @@ -186,7 +171,6 @@ PolicyMap policy_map; policy_map.LoadFrom(dictionary_value, level, scope_, POLICY_SOURCE_PLATFORM); - policy_map.EraseNonmatching(base::Bind(&IsUserPolicy)); bundle->Get(PolicyNamespace(POLICY_DOMAIN_CHROME, std::string())) .MergeFrom(policy_map); }
diff --git a/components/policy/core/common/config_dir_policy_loader_unittest.cc b/components/policy/core/common/config_dir_policy_loader_unittest.cc index b371986..640eb37 100644 --- a/components/policy/core/common/config_dir_policy_loader_unittest.cc +++ b/components/policy/core/common/config_dir_policy_loader_unittest.cc
@@ -21,111 +21,6 @@ #include "components/policy/core/common/policy_map.h" #include "components/policy/core/common/policy_types.h" -// Use real existing policies as samples because ConfigDirPolicyLoader does -// basic verification at load time. These constants are specific to -// ConfigDirPolicyLoader and thus are hidden in an anonymous namespace. (They -// cannot be applied generally because Windows tests depend on reading GPO -// sample files containing hard-coded policy names.) -namespace { - -const char kKeyString[] = "HomepageLocation"; -const char kKeyBoolean[] = "HomepageIsNewTabPage"; -const char kKeyInteger[] = "NetworkPredictionOptions"; -const char kKeyStringList[] = "DisabledSchemes"; -const char kKeyDictionary[] = "ProxySettings"; - -const char kTestChromeSchema[] = - "{" - " \"type\": \"object\"," - " \"properties\": {" - " \"HomepageLocation\": { \"type\": \"string\" }," - " \"HomepageIsNewTabPage\": { \"type\": \"boolean\" }," - " \"NetworkPredictionOptions\": { \"type\": \"integer\" }," - " \"DisabledSchemes\": {" - " \"type\": \"array\"," - " \"items\": { \"type\": \"string\" }" - " }," - " \"ProxySettings\": {" - " \"type\": \"object\"," - " \"properties\": {" - " \"bool\": { \"type\": \"boolean\" }," - " \"double\": { \"type\": \"number\" }," - " \"int\": { \"type\": \"integer\" }," - " \"string\": { \"type\": \"string\" }," - " \"array\": {" - " \"type\": \"array\"," - " \"items\": { \"type\": \"string\" }" - " }," - " \"dictionary\": {" - " \"type\": \"object\"," - " \"properties\": {" - " \"sub\": { \"type\": \"string\" }," - " \"sublist\": {" - " \"type\": \"array\"," - " \"items\": {" - " \"type\": \"object\"," - " \"properties\": {" - " \"aaa\": { \"type\": \"integer\" }," - " \"bbb\": { \"type\": \"integer\" }," - " \"ccc\": { \"type\": \"string\" }," - " \"ddd\": { \"type\": \"string\" }" - " }" - " }" - " }" - " }" - " }," - " \"list\": {" - " \"type\": \"array\"," - " \"items\": {" - " \"type\": \"object\"," - " \"properties\": {" - " \"subdictindex\": { \"type\": \"integer\" }," - " \"subdict\": {" - " \"type\": \"object\"," - " \"properties\": {" - " \"bool\": { \"type\": \"boolean\" }," - " \"double\": { \"type\": \"number\" }," - " \"int\": { \"type\": \"integer\" }," - " \"string\": { \"type\": \"string\" }" - " }" - " }" - " }" - " }" - " }," - " \"dict\": {" - " \"type\": \"object\"," - " \"properties\": {" - " \"bool\": { \"type\": \"boolean\" }," - " \"double\": { \"type\": \"number\" }," - " \"int\": { \"type\": \"integer\" }," - " \"string\": { \"type\": \"string\" }," - " \"list\": {" - " \"type\": \"array\"," - " \"items\": {" - " \"type\": \"object\"," - " \"properties\": {" - " \"subdictindex\": { \"type\": \"integer\" }," - " \"subdict\": {" - " \"type\": \"object\"," - " \"properties\": {" - " \"bool\": { \"type\": \"boolean\" }," - " \"double\": { \"type\": \"number\" }," - " \"int\": { \"type\": \"integer\" }," - " \"string\": { \"type\": \"string\" }" - " }" - " }" - " }" - " }" - " }" - " }" - " }" - " }" - " }" - " }" - "}"; - -} // anonymous namespace - namespace policy { namespace { @@ -181,14 +76,7 @@ : PolicyProviderTestHarness(POLICY_LEVEL_MANDATORY, POLICY_SCOPE_MACHINE, POLICY_SOURCE_PLATFORM), - next_policy_file_index_(100) { - key_string_ = kKeyString; - key_boolean_ = kKeyBoolean; - key_integer_ = kKeyInteger; - key_stringlist_ = kKeyStringList; - key_dictionary_ = kKeyDictionary; - test_schema_ = kTestChromeSchema; -} + next_policy_file_index_(100) {} TestHarness::~TestHarness() {}
diff --git a/components/policy/core/common/configuration_policy_provider_test.cc b/components/policy/core/common/configuration_policy_provider_test.cc index b8e5356..492ab02 100644 --- a/components/policy/core/common/configuration_policy_provider_test.cc +++ b/components/policy/core/common/configuration_policy_provider_test.cc
@@ -17,14 +17,13 @@ #include "components/policy/core/common/policy_bundle.h" #include "components/policy/core/common/policy_map.h" #include "components/policy/core/common/policy_namespace.h" -#include "components/policy/core/common/policy_test_utils.h" #include "components/policy/core/common/policy_types.h" #include "testing/gmock/include/gmock/gmock.h" using ::testing::Mock; using ::testing::_; -namespace { +namespace policy { const char kTestChromeSchema[] = "{" @@ -116,15 +115,8 @@ " }" "}"; -} // anonymous namespace - -namespace policy { - namespace test_keys { -// These are the defaults for PolicyProviderTestHarness but they are generally -// available for use in other tests. Subclasses of PolicyProviderTestHarness -// may use different values. const char kKeyString[] = "StringPolicy"; const char kKeyBoolean[] = "BooleanPolicy"; const char kKeyInteger[] = "IntegerPolicy"; @@ -166,19 +158,22 @@ PolicyProviderTestHarness::PolicyProviderTestHarness(PolicyLevel level, PolicyScope scope, PolicySource source) - : key_string_(test_keys::kKeyString), - key_boolean_(test_keys::kKeyBoolean), - key_integer_(test_keys::kKeyInteger), - key_stringlist_(test_keys::kKeyStringList), - key_dictionary_(test_keys::kKeyDictionary), - test_schema_(kTestChromeSchema), - level_(level), - scope_(scope), - source_(source) { -} + : level_(level), scope_(scope), source_(source) {} PolicyProviderTestHarness::~PolicyProviderTestHarness() {} +PolicyLevel PolicyProviderTestHarness::policy_level() const { + return level_; +} + +PolicyScope PolicyProviderTestHarness::policy_scope() const { + return scope_; +} + +PolicySource PolicyProviderTestHarness::policy_source() const { + return source_; +} + void PolicyProviderTestHarness::Install3rdPartyPolicy( const base::DictionaryValue* policies) { FAIL(); @@ -189,15 +184,15 @@ ConfigurationPolicyProviderTest::~ConfigurationPolicyProviderTest() {} void ConfigurationPolicyProviderTest::SetUp() { - harness_.reset((*GetParam())()); - harness_->SetUp(); + PolicyTestBase::SetUp(); + + test_harness_.reset((*GetParam())()); + test_harness_->SetUp(); const PolicyNamespace chrome_ns(POLICY_DOMAIN_CHROME, ""); - ASSERT_TRUE(RegisterSchema(chrome_ns, harness_->test_schema())); - Schema chrome_schema = *schema_registry_.schema_map()->GetSchema(chrome_ns); Schema extension_schema = - chrome_schema.GetKnownProperty(harness_->key_dictionary()); + chrome_schema.GetKnownProperty(test_keys::kKeyDictionary); ASSERT_TRUE(extension_schema.valid()); schema_registry_.RegisterComponent( PolicyNamespace(POLICY_DOMAIN_EXTENSIONS, @@ -213,7 +208,7 @@ extension_schema); provider_.reset( - harness_->CreateProvider(&schema_registry_, loop_.task_runner())); + test_harness_->CreateProvider(&schema_registry_, loop_.task_runner())); provider_->Init(&schema_registry_); // Some providers do a reload on init. Make sure any notifications generated // are fired now. @@ -225,10 +220,8 @@ void ConfigurationPolicyProviderTest::TearDown() { // Give providers the chance to clean up after themselves on the file thread. - if (provider_) { - provider_->Shutdown(); - provider_.reset(); - } + provider_->Shutdown(); + provider_.reset(); PolicyTestBase::TearDown(); } @@ -243,14 +236,10 @@ base::RunLoop().RunUntilIdle(); PolicyBundle expected_bundle; expected_bundle.Get(PolicyNamespace(POLICY_DOMAIN_CHROME, std::string())) - .Set(policy_name, harness_->policy_level(), harness_->policy_scope(), - harness_->policy_source(), expected_value.CreateDeepCopy(), nullptr); - bool match = provider_->policies().Equals(expected_bundle); - if (!match) { - LOG(ERROR) << "EXPECTED: " << expected_bundle; - LOG(ERROR) << "ACTUAL: " << provider_->policies(); - } - EXPECT_TRUE(match); + .Set(policy_name, test_harness_->policy_level(), + test_harness_->policy_scope(), test_harness_->policy_source(), + expected_value.CreateDeepCopy(), nullptr); + EXPECT_TRUE(provider_->policies().Equals(expected_bundle)); // TODO(joaodasilva): set the policy in the POLICY_DOMAIN_EXTENSIONS too, // and extend the |expected_bundle|, once all providers are ready. } @@ -265,31 +254,31 @@ TEST_P(ConfigurationPolicyProviderTest, StringValue) { const char kTestString[] = "string_value"; base::StringValue expected_value(kTestString); - CheckValue(harness_->key_string(), + CheckValue(test_keys::kKeyString, expected_value, base::Bind(&PolicyProviderTestHarness::InstallStringPolicy, - base::Unretained(harness_.get()), - harness_->key_string(), + base::Unretained(test_harness_.get()), + test_keys::kKeyString, kTestString)); } TEST_P(ConfigurationPolicyProviderTest, BooleanValue) { base::FundamentalValue expected_value(true); - CheckValue(harness_->key_boolean(), + CheckValue(test_keys::kKeyBoolean, expected_value, base::Bind(&PolicyProviderTestHarness::InstallBooleanPolicy, - base::Unretained(harness_.get()), - harness_->key_boolean(), + base::Unretained(test_harness_.get()), + test_keys::kKeyBoolean, true)); } TEST_P(ConfigurationPolicyProviderTest, IntegerValue) { base::FundamentalValue expected_value(42); - CheckValue(harness_->key_integer(), + CheckValue(test_keys::kKeyInteger, expected_value, base::Bind(&PolicyProviderTestHarness::InstallIntegerPolicy, - base::Unretained(harness_.get()), - harness_->key_integer(), + base::Unretained(test_harness_.get()), + test_keys::kKeyInteger, 42)); } @@ -297,11 +286,11 @@ base::ListValue expected_value; expected_value.Set(0U, new base::StringValue("first")); expected_value.Set(1U, new base::StringValue("second")); - CheckValue(harness_->key_stringlist(), + CheckValue(test_keys::kKeyStringList, expected_value, base::Bind(&PolicyProviderTestHarness::InstallStringListPolicy, - base::Unretained(harness_.get()), - harness_->key_stringlist(), + base::Unretained(test_harness_.get()), + test_keys::kKeyStringList, &expected_value)); } @@ -331,11 +320,11 @@ dict->Set("sublist", list); expected_value.Set("dictionary", dict); - CheckValue(harness_->key_dictionary(), + CheckValue(test_keys::kKeyDictionary, expected_value, base::Bind(&PolicyProviderTestHarness::InstallDictionaryPolicy, - base::Unretained(harness_.get()), - harness_->key_dictionary(), + base::Unretained(test_harness_.get()), + test_keys::kKeyDictionary, &expected_value)); } @@ -354,15 +343,15 @@ EXPECT_TRUE(provider_->policies().Equals(bundle)); // OnUpdatePolicy is called when there are changes. - harness_->InstallStringPolicy(harness_->key_string(), "value"); + test_harness_->InstallStringPolicy(test_keys::kKeyString, "value"); EXPECT_CALL(observer, OnUpdatePolicy(provider_.get())).Times(1); provider_->RefreshPolicies(); base::RunLoop().RunUntilIdle(); Mock::VerifyAndClearExpectations(&observer); bundle.Get(PolicyNamespace(POLICY_DOMAIN_CHROME, std::string())) - .Set(harness_->key_string(), harness_->policy_level(), - harness_->policy_scope(), harness_->policy_source(), + .Set(test_keys::kKeyString, test_harness_->policy_level(), + test_harness_->policy_scope(), test_harness_->policy_source(), base::MakeUnique<base::StringValue>("value"), nullptr); EXPECT_TRUE(provider_->policies().Equals(bundle)); provider_->RemoveObserver(&observer); @@ -392,7 +381,8 @@ policy_dict.Set("dict", policy_dict.DeepCopy()); // Install these policies as a Chrome policy. - harness_->InstallDictionaryPolicy(harness_->key_dictionary(), &policy_dict); + test_harness_->InstallDictionaryPolicy(test_keys::kKeyDictionary, + &policy_dict); // Install them as 3rd party policies too. base::DictionaryValue policy_3rdparty; policy_3rdparty.Set("extensions.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", @@ -404,23 +394,24 @@ policy_3rdparty.Set("invalid-domain.component", policy_dict.DeepCopy()); policy_3rdparty.Set("extensions.cccccccccccccccccccccccccccccccc", new base::StringValue("invalid-value")); - harness_->Install3rdPartyPolicy(&policy_3rdparty); + test_harness_->Install3rdPartyPolicy(&policy_3rdparty); provider_->RefreshPolicies(); base::RunLoop().RunUntilIdle(); PolicyMap expected_policy; - expected_policy.Set(harness_->key_dictionary(), harness_->policy_level(), - harness_->policy_scope(), harness_->policy_source(), + expected_policy.Set(test_keys::kKeyDictionary, test_harness_->policy_level(), + test_harness_->policy_scope(), + test_harness_->policy_source(), policy_dict.CreateDeepCopy(), nullptr); PolicyBundle expected_bundle; expected_bundle.Get(PolicyNamespace(POLICY_DOMAIN_CHROME, std::string())) .CopyFrom(expected_policy); expected_policy.Clear(); expected_policy.LoadFrom(&policy_dict, - harness_->policy_level(), - harness_->policy_scope(), - harness_->policy_source()); + test_harness_->policy_level(), + test_harness_->policy_scope(), + test_harness_->policy_source()); expected_bundle.Get(PolicyNamespace(POLICY_DOMAIN_EXTENSIONS, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa")) .CopyFrom(expected_policy);
diff --git a/components/policy/core/common/configuration_policy_provider_test.h b/components/policy/core/common/configuration_policy_provider_test.h index 80bdd9d..5dafa89 100644 --- a/components/policy/core/common/configuration_policy_provider_test.h +++ b/components/policy/core/common/configuration_policy_provider_test.h
@@ -35,7 +35,6 @@ namespace test_keys { -// Key constants for general use. extern const char kKeyString[]; extern const char kKeyBoolean[]; extern const char kKeyInteger[]; @@ -91,17 +90,9 @@ scoped_refptr<base::SequencedTaskRunner> task_runner) = 0; // Returns the policy level, scope and source set by the policy provider. - PolicyLevel policy_level() const { return level_; } - PolicyScope policy_scope() const { return scope_; } - PolicySource policy_source() const { return source_; } - - // Returns policy keys and matching schema. - const char* key_string() const { return key_string_; } - const char* key_boolean() const { return key_boolean_; } - const char* key_integer() const { return key_integer_; } - const char* key_stringlist() const { return key_stringlist_; } - const char* key_dictionary() const { return key_dictionary_; } - const char* test_schema() const { return test_schema_; } + PolicyLevel policy_level() const; + PolicyScope policy_scope() const; + PolicySource policy_source() const; // Helpers to configure the environment the policy provider reads from. virtual void InstallEmptyPolicy() = 0; @@ -121,14 +112,6 @@ // should override this method; the default just makes the test fail. virtual void Install3rdPartyPolicy(const base::DictionaryValue* policies); - protected: - const char* key_string_; - const char* key_boolean_; - const char* key_integer_; - const char* key_stringlist_; - const char* key_dictionary_; - const char* test_schema_; - private: PolicyLevel level_; PolicyScope scope_; @@ -159,7 +142,7 @@ const base::Value& expected_value, base::Closure install_value); - std::unique_ptr<PolicyProviderTestHarness> harness_; + std::unique_ptr<PolicyProviderTestHarness> test_harness_; std::unique_ptr<ConfigurationPolicyProvider> provider_; private:
diff --git a/components/policy/core/common/policy_loader_win_unittest.cc b/components/policy/core/common/policy_loader_win_unittest.cc index d24aee7..ba24042 100644 --- a/components/policy/core/common/policy_loader_win_unittest.cc +++ b/components/policy/core/common/policy_loader_win_unittest.cc
@@ -39,7 +39,6 @@ #include "components/policy/core/common/external_data_fetcher.h" #include "components/policy/core/common/policy_bundle.h" #include "components/policy/core/common/policy_map.h" -#include "components/policy/core/common/policy_test_utils.h" #include "components/policy/core/common/policy_types.h" #include "components/policy/core/common/preg_parser_win.h" #include "components/policy/core/common/schema_map.h" @@ -753,12 +752,7 @@ gpo_list_provider_); std::unique_ptr<PolicyBundle> loaded( loader.InitialLoad(schema_registry_.schema_map())); - bool match = loaded->Equals(expected); - if (!match) { - LOG(ERROR) << "EXPECTED: " << expected; - LOG(ERROR) << "ACTUAL: " << *loaded.get(); - } - return match; + return loaded->Equals(expected); } void InstallRegistrySentinel() {
diff --git a/components/policy/core/common/policy_map.cc b/components/policy/core/common/policy_map.cc index 55114d76..cac8e3b 100644 --- a/components/policy/core/common/policy_map.cc +++ b/components/policy/core/common/policy_map.cc
@@ -93,16 +93,14 @@ map_.erase(policy); } +void PolicyMap::EraseMatching( + const base::Callback<bool(const const_iterator)>& filter) { + FilterErase(filter, true); +} + void PolicyMap::EraseNonmatching( const base::Callback<bool(const const_iterator)>& filter) { - PolicyMapType::iterator iter(map_.begin()); - while (iter != map_.end()) { - if (!filter.Run(iter)) { - map_.erase(iter++); - } else { - ++iter; - } - } + FilterErase(filter, false); } void PolicyMap::Swap(PolicyMap* other) { @@ -199,4 +197,17 @@ return a.first == b.first && a.second.Equals(b.second); } +void PolicyMap::FilterErase( + const base::Callback<bool(const const_iterator)>& filter, + bool deletion_value) { + PolicyMapType::iterator iter(map_.begin()); + while (iter != map_.end()) { + if (filter.Run(iter) == deletion_value) { + map_.erase(iter++); + } else { + ++iter; + } + } +} + } // namespace policy
diff --git a/components/policy/core/common/policy_map.h b/components/policy/core/common/policy_map.h index d3664ab..2aa9a59 100644 --- a/components/policy/core/common/policy_map.h +++ b/components/policy/core/common/policy_map.h
@@ -78,6 +78,9 @@ // Erase the given |policy|, if it exists in this map. void Erase(const std::string& policy); + // Erase all entries for which |filter| returns true. + void EraseMatching(const base::Callback<bool(const const_iterator)>& filter); + // Erase all entries for which |filter| returns false. void EraseNonmatching( const base::Callback<bool(const const_iterator)>& filter); @@ -125,6 +128,10 @@ static bool MapEntryEquals(const PolicyMapType::value_type& a, const PolicyMapType::value_type& b); + // Erase all entries for which |filter| returns |deletion_value|. + void FilterErase(const base::Callback<bool(const const_iterator)>& filter, + bool deletion_value); + PolicyMapType map_; DISALLOW_COPY_AND_ASSIGN(PolicyMap);
diff --git a/components/policy/resources/policy_templates.json b/components/policy/resources/policy_templates.json index 3525455b..99e92e14 100644 --- a/components/policy/resources/policy_templates.json +++ b/components/policy/resources/policy_templates.json
@@ -5030,7 +5030,7 @@ 'arc_support': 'This policy has no effect on the logging done by Android.', }, { - 'name': 'ReportArcStatus', + 'name': 'ReportArcStatusEnabled', 'type': 'main', 'schema': { 'type': 'boolean' }, 'supported_on': ['chrome_os:55-'],
diff --git a/components/policy/resources/policy_templates_am.xtb b/components/policy/resources/policy_templates_am.xtb index 6303b048..b8e4528 100644 --- a/components/policy/resources/policy_templates_am.xtb +++ b/components/policy/resources/policy_templates_am.xtb
@@ -210,15 +210,6 @@ ይህ መመሪያ ካልተዋቀረ ወይም ወደ «tls1.2» ከተዋቀረ <ph name="PRODUCT_NAME" /> ከእንግዲህ ይህን መጠባበቂያ አያከናውንም። ይሄ <ph name="PRODUCT_NAME" /> በትክክል ስሪቶችን መደራደር የማይችሉ ሳንካዎች ያሉባቸው አገልጋዮችን ይወጣ እንደሆነ ብቻ ይወስናል እንጂ ከዚህ ቀደም ለነበሩ የTLS ስሪቶች ድጋፍን እንደማያሰናክል ልብ ይበሉ። አለበለዚያ ሳንካ ካለበት አገልጋይ ጋር ተኳሃኝነት መጠበቅ የሚያስፈልግ ከሆነ ይህ መመሪያ ወደ «tls1.1» ሊቀናበር ይችላል። ይህ ጊዜያዊ መፍትሔ ነው እንጂ አገልጋዩ በአስቸኳይ መስተካከል አለበት።</translation> -<translation id="1861037019115362154">በ<ph name="PRODUCT_NAME" /> ውስጥ የተሰናከሉ የተሰኪዎች ዝርዝርን የሚገልጽ እና ተጠቃሚዎች ይህን ቅንብር እንዳይቀይሩት የሚያግድ ነው። - - የልቅ ምልክት ቁምፊዎቹ «*» እና «?» የዘፈቀደ የሆኑ ቁምፊዎች ተከታታይነቶች ለመዛመድ ሊያገለግሉ ይችላሉ። «*» የዘፈቀደ ከሆኑ የቁምፊዎች ብዛት ጋር የሚዛመድ ሲሆን «?» ደግሞ አማራጭ የሆነ ነጠላ ቁምፊ ይገልጻል፣ ማለትም ከዜሮ ወይም አንድ ቁምፊዎች ጋር ይዛመዳል። የማምለጫ ቁምፊው «\» ነው፣ እናም ከትክክለኛው የ«*»፣ «?» ወይም «\» ቁምፊዎችን ጋር ለመዛመድ ፊታቸው ላይ «\» ማስቀመጥ ይችላሉ። - - ይህን ቅንብር ካነቁ የተገለጸው የተሰኪዎች ዝርዝር በ<ph name="PRODUCT_NAME" /> ውስጥ በጭራሽ ስራ ላይ አይውሉም። ተሰኪዎቹ በ«about:plugins» ውስጥ የተሰናከሉ መሆናቸው ምልክት የተደረገባቸው ናቸው፣ እናም ተጠቃሚዎች እነሱን ማንቃት አይችሉም። - - ይህ መመሪያ በEnabledPlugins እና DisabledPluginsExceptions ሊሻር እንደሚችል ልብ ይበሉ። - - ይህ መመሪያ እንዳልተዋቀረ ከተተወ ኮድ በከባዱ የተጻፈላቸው ተኳሃኝ ያልሆኑ፣ የቆዩ ወይም አደገኛ ተሰኪዎች ካልሆኑ በስተቀር ተጠቃሚው ማንኛውም በስርዓቱ ላይ የተጫነ ተሰኪን መጠቀም ይችላል።</translation> <translation id="1864269674877167562">ይህ መመሪያ ወደ ባዶ ሕብረቁምፊ ከተዋቀረ ወይም ካልተዋቀረ <ph name="PRODUCT_OS_NAME" /> በተጠቃሚ መግቢያ ፍሰት ጊዜ የራስ-ሙላ አማራጭን አያሳይም። ይህ መመሪያ የጎራ ስምን ወደሚወክል ሕብረቁምፊ ከተዋቀረ <ph name="PRODUCT_OS_NAME" /> ተጠቃሚው ያለጎራ ስም ቅጥያ በተጠቃሚ ስሙ ብቻ እንዲተይብ የሚፈቅድለት በተጠቃሚ መግቢያ ፍሰት ጊዜ የራስ-ሙላ አማራጭን ያሳያል። ተጠቃሚው ይህን የጎራ ስም ቅጥያ ተክቶ ለመፃፍ ይችላል።</translation> <translation id="1865417998205858223">የቁልፍ ፍቃዶች</translation> @@ -864,11 +855,6 @@ <translation id="3660562134618097814">በመግባት ጊዜ የSAML IdP ኩኪዎችን ያስተላልፉ</translation> <translation id="3709266154059827597">የተከለከሉ ቅጥያዎች ጭነት ዝርዝር ያዋቅሩ</translation> <translation id="3711895659073496551">አንጠልጥል</translation> -<translation id="3715448429089775791">የYouTube ጥንቃቄ ሁነታን ወደ ገቢር ያስገድደውና ተጠቃሚዎች ይህን ቅንብር እንዳይቀይሩት ይከለክላቸዋል። - - ይህን ቅንብር ካነቁት የጥንቃቄ ሁነታ በYouTube ላይ ሁልጊዜ ገቢር ነው። - - ይህን ቅንብር ካሰናከሉት ወይም እሴት ካላዘጋጁ የጥንቃቄ ሁነታ በYouTube ላይ ተፈጻሚ አይሆንም።</translation> <translation id="3750220015372671395">በእነዚህ ጣቢያዎች ላይ ቁልፍ ማመንጨትን ያግዱ</translation> <translation id="3756011779061588474">የገንቢ አግድ ሁነታ</translation> <translation id="3758089716224084329">እርስዎ <ph name="PRODUCT_NAME" /> የሚጠቀመውን ተኪ አገልጋይ እንዲገልጹ ያስችልዎታል፣ እና ተጠቃሚዎች የተኪ ቅንብሮችን እንዳይቀይሩ ይከለክላል። @@ -2137,12 +2123,6 @@ የሚታወቁት የግንኙነት አይነት ለዪዎች «ኤተርኔት»፣ «wifi»፣ «wimax»፣ «ብሉቱዝ» እና «ተንቀሳቃሽ ስልክ» ናቸው።</translation> <translation id="7763614521440615342">በአዲስ የትር ገጹ ላይ የይዘት አስተያየት ጥቆማዎች አሳይ</translation> -<translation id="7766336524667238790">እንደ የመተግበሪያ መታወቂያ እና ስሪት ያሉ ስለገቢር የኪዮስክ ክፍለ-ጊዜ - መረጃን ሪፓርት ያድርጉ። - - መመሪያው ወደ ሐሰት ከተዋቀረ የክፍለ-ጊዜ መረጃ ሪፓርት አይደረግም። - ወደ እውነት ከተዋቀረ ወይም ሳይዋቀር ከተተወ የክፍለ-ጊዜ መረጃ - ሪፓርት ይደረጋል።</translation> <translation id="7774768074957326919">የስርዓት ተኪ ቅንብሮችን ይጠቀሙ</translation> <translation id="7775831859772431793">የተኪ አገልጋዩ ዩአርኤል እዚህ መጥቀስ ይችላሉ። @@ -2379,6 +2359,10 @@ <translation id="8369602308428138533">በሶኬት ኃይል ላይ ሲሆን የማያ ገጽ መጥፋት መዘግየት</translation> <translation id="8382184662529825177">ለመሣሪያው የይዘት ጥበቃ የርቀት ማስረገጥ መጠቀምን ያንቁ</translation> <translation id="838870586332499308">የውሂብ ዝውውርን ያንቁ</translation> +<translation id="8390049129576938611">በ<ph name="PRODUCT_NAME" /> ውስጥ ውስጣዊውን የተሰቅ መመልከቻን ያሰናክላል። በምትኩ እንደ ውርድ ያስተናግደው እና ተጠቃሚው ተሰቅ ፋይሎችን በነባሪው መተግበሪያ እንዲከፍት ይፈቅድለታል። + + ይህ መመሪያ ሳይቀናበር ከተተወ ወይም ከተሰናከለ የተሰቅ ተሰኪው ተጠቃሚው ካላሰናከለው በቀር የተሰቅ ፋይሎችን ለመክፈት ጥቅም ላይ ይውላል።</translation> +<translation id="8402079500086185021">የተሰቅ ፋይሎችን ሁልጊዜ በውጪ ክፈት</translation> <translation id="8412312801707973447">የመስመር ላይ OCSP/CRL ማረጋገጦች ይከናወኑ ወይም አይከናወኑ እንደሆኑ</translation> <translation id="8413348101535146315">በ<ph name="PRODUCT_NAME" /> ተግባር አስተዳዳሪ ውስጥ ሂደቶችን ማጠናቀቅን ያነቃል። @@ -2399,17 +2383,6 @@ የምሳሌ ስርዓተ ጥለቶችን ለማግኘት https://www.chromium.org/developers/how-tos/chrome-frame-getting-started ን ይመልከቱ።</translation> <translation id="8493645415242333585">የአሰሳ ታሪክ ማስቀመጥን ያሰናክሉ</translation> <translation id="8499172469244085141">ነባሪ ቅንብሮች (ተጠቃሚዎች ሊሽሯቸው የሚችሉት)</translation> -<translation id="8501011084242226370">ተጠቃሚው በ<ph name="PRODUCT_NAME" /> ውስጥ ሊያነቃቸው ወይም ሊያሰናክላቸው የሚችላቸው የተሰኪዎች ዝርዝር ይገልጻል። - - የልቅ ምልክት ቁምፊዎች «*» እና «?» የዘፈቀደ ቁምፊዎች ተከታታዮችን ለማዛመድ ስራ ላይ መዋል ይችላሉ። «*» አንድ የዘፈቀደ የሆነ የቁምፊዎች ብዛት የሚያዛምድ ሲሆን «?» ደግሞ አማራጭ የሆነ ነጠላ ቁምፊን ያዛምዳል፣ ማለትም ዜሮ ወይም አንድ ቁምፊዎችን ያዛምዳል። የማምለጫ ቁምፊው «\» ነው፣ ስለዚህ ትክክለኛዎቹ የ«*» «?» ወይም «\» ቁምፊዎችን ለማዛመድ «\»ን ከፊታቸው ማስገባት አለብዎት። - - ይህን ቅንብር ካነቁት የተገለጸው የተሰኪዎች ዝርዝር በ<ph name="PRODUCT_NAME" /> ውስጥ ስራ ላይ መዋል ይችላሉ። ተጠቃሚዎች እነሱን በ«about:plugins» ውስጥ ማንቃት ወይም ማሰናከል ይችላሉ፣ ተሰኪው በDisabledPlugins ውስጥ ካለው ስርዓተ-ጥለት ጋር የሚዛመድ ቢሆንም። ተጠቃሚዎች እንዲሁም በDisabledPlugins፣ DisabledPluginsExceptions እና EnabledPlugins ውስጥ ካሉ ማንኛቸውም ስርዓተ-ጥለቶች ጋር የማይዛመዱ ተሰኪዎችንም ማሰናከል እና ማንቃት ይችላሉ። - - ይህ መመሪያ «DisabledPlugins» እንደ ሁሉንም ተሰኪዎች «*» አሰናክል ወይም ሁሉም የJava ተሰኪዎች «*Java*» አሰናክል ያሉ በልቅ ምልክት የተቀመጡ ግቤቶችን ሲይዝ ነገር ግን አስተዳዳሪው እንደ «IcedTea Java 2.3» ያሉ የተወሰኑ ስሪቶችን ለማንቃት በሚፈልግበት ጊዜ በጥብቅ የተሰኪ ክልክል ዝርዝርን ለማስቻል የታሰበ ነው። እነኚህ የተወሰኑ ስሪቶች በዚህ መመሪያ ውስጥ ሊገለጹ ይችላሉ። - - ሁለቱም የተሰኪው ስም እና የተሰኪው የቡድን ስም መካተት እንደሌለባቸው ልብ ይበሉ። እያንዳንዱ የተሰኪ ቡድን በabout:plugins ውስጥ በተለየ ክፍል ውስጥ ይታያል፤ እያንዳንዱ ክፍል አንድ ወይም ተጨማሪ ተሰኪዎች ሊኖረው ይችላል። ለምሳሌ፣ የ«Shockwave Flash» ተሰኪ በ«Adobe Flash Player» ቡድን ውስጥ ሲሆን፣ ያ ተሰኪ በክልክል ዝርዝር ውስጥ ላለመካተት የሁለቱም ስሞች ባልተካተቱት ላይ ተዛማጅ ሊኖራቸው ይገባል። - - ይህ መመሪያ እንዳልተዋቀረ ከተተወ በ«DisabledPlugins» ውስጥ ካሉ ስርዓተ-ጥለቶች ጋር የሚዛመድ ማንኛውም ተሰኪ እንደተሰናከለ ይቆለፍና ተጠቃሚው ሊያነቃቸው አይችልም።</translation> <translation id="8519264904050090490">የሚቀናበሩ በተጠቃሚው እራሱ የተገለሉ ዩ አር ኤሎች</translation> <translation id="8544375438507658205">የ<ph name="PRODUCT_FRAME_NAME" /> ነባሪ ኤች ቲ ኤም ኤል አሳዪ</translation> <translation id="8549772397068118889">ከይዘት ጥቅሎች ውጪ የሆኑ ጣቢያዎችን በሚጎበኙበት ጊዜ ያስጠንቅቅ</translation> @@ -2434,15 +2407,6 @@ የበርካታ አገልጋይ ስሞችን በኮማዎች ያለያዩ። ልቅ ምልክቶች (*) ይፈቀዳሉ። ይህ መመሪያ እንዳልተዋቀረ ከተዉት <ph name="PRODUCT_NAME" /> አንድ አገልጋይ በውስጠ-መረብ ውስጥ ካለ ለማወቅ ይሞክራል፣ እና ከዚህ ብኋላ ብቻ ነው ለIWA ጥያቄዎች ምላሽ የሚሰጠው። አንድ አገልጋይ እንደበይነመረብ ሆኖ ከተገኘ የIWA ጥያቄዎች በ<ph name="PRODUCT_NAME" /> ችላ ይባላሉ።</translation> -<translation id="8668394701842594241">በ<ph name="PRODUCT_NAME" /> ውስጥ የነቁ የተሰኪዎች ዝርዝር የሚገልጽ እና ተጠቃሚዎች ይህን ቅንብር እንዳይቀይሩት የሚያግድ ነው። - - የልቅ ምልክት ቁምፊዎቹ «*» እና «?» የዘፈቀደ የሆኑ ቁምፊዎች ተከታታይነቶች ለመዛመድ ሊያገለግሉ ይችላሉ። «*» የዘፈቀደ ከሆኑ የቁምፊዎች ብዛት ጋር የሚዛመድ ሲሆን «?» ደግሞ አማራጭ የሆነ ነጠላ ቁምፊ ይገልጻል፣ ማለትም ከዜሮ ወይም አንድ ቁምፊዎች ጋር ይዛመዳል። የማምለጫ ቁምፊው «\» ነው፣ እናም ከትክክለኛው የ«*»፣ «?» ወይም «\» ቁምፊዎችን ጋር ለመዛመድ ፊታቸው ላይ «\» ማስቀመጥ ይችላሉ። - - የተገለጸው የተሰኪዎች ዝርዝር የተጫኑ ከሆኑ ሁልጊዜ በ<ph name="PRODUCT_NAME" /> ውስጥ ይሰራሉ። ተሰኪዎቹ በ«about:plugins» ውስጥ የነቁ መሆናቸውን ምልክት የተደረገባቸው ናቸው፣ እና ተጠቃሚዎች ሊያሰናክሏቸው አይችሉም። - - ይህ መመሪያ ሁለቱንም DisabledPlugins እና DisabledPluginsExceptions የሚሽር መሆኑን ልብ ይበሉ። - - ይህ መመሪያ እንዳልተዋቀረ ከተተወ ተጠቃሚው ማንኛውም በስርዓቱ ውስጥ የተጫነ ተሰኪን ሊያሰናክል ይችላል።</translation> <translation id="8672321184841719703">ራስ-አዘምን ስሪቱን አነጣጥር</translation> <translation id="868068801094828689">የ<ph name="PRODUCT_NAME" /> አጠቃቀም እና ከስንክል ጋር የተገናኘ ውሂብ ስም-አልባ ሆኖ ለGoogle ሪፖርት ማድረግ ያነቃል፣ እና ተጠቃሚዎች ይህን ቅንብር እንዳይቀይሩት ያግዳል። @@ -2546,13 +2510,6 @@ Quirks Serverን በራስ-ሰር ያገኝና ካሉ የውቅረት ፋይሎቹን ያወርዳል፣ እና በመሣሪያው ላይ ያከማቻቸዋል። እንደዚህ ያሉ ፋይሎች ለምሳሌ የተያያዙ ማሳያዎች የእይታ ጥራት ለማሻሻል ጥቅም ላይ ሊውሉ ይችላሉ።</translation> -<translation id="8905426178924715309">ይህ መመሪያ ተቋርጧል፣ እባክዎ በምትኩ ForceGoogleSafeSearch እና ForceYouTubeSafetyMode ይጠቀሙ። የForceGoogleSafeSearch ወይም የForceYouTubeSafetyMode መመሪያዎች አንዳቸው ከተዋቀሩ ይህ መመሪያ ይተዋል። - - በGoogle ድር ፍለጋ ውስጥ የሚደረጉ መጠይቆች SafeSearch ገቢር ሆኖ እንዲደረጉና ተጠቃሚዎች ይህን ቅንብር እንዳይቀይሩት ያስገድዳል። - - ይህን ቅንብር ካነቁት SafeSearch በGoogle ፍለጋ እና YouTube ውስጥ ሁልጊዜ ገቢር ነው። - - ይህን ቅንብር ካሰናከሉት ወይም እሴት ካላስቀመጡለት SafeSearch በGoogle ፍለጋ እና YouTube ውስጥ ተፈጻሚ አይሆንም።</translation> <translation id="8906768759089290519">የእንግዳ ሁነታን ያንቁ</translation> <translation id="8908294717014659003">ድር ጣቢያዎች የሚዲያ ያዢ መሣሪያዎች መዳረሻ ይኖራቸው ወይም አይኖራቸው እንደሆነ እንዲያዋቅሩ ያስችልዎታል። የሚዲያ ያዢ መሣሪያዎች መዳረሻ በነባሪነት ሊፈቀድ ይችላል ወይም አንድ ድር ጣቢያ የሚዲያ ያዢ መሣሪያ መዳረሻ በፈለገ ቁጥር ተጠቃሚውን ሊጠየቅ ይችላል።
diff --git a/components/policy/resources/policy_templates_ar.xtb b/components/policy/resources/policy_templates_ar.xtb index 1325bc5..635afa44 100644 --- a/components/policy/resources/policy_templates_ar.xtb +++ b/components/policy/resources/policy_templates_ar.xtb
@@ -204,17 +204,6 @@ إذا لم تتم تهيئة هذه السياسة أو إذا تم تعيينها على "tls1.2"، فحينئذٍ لن يجري <ph name="PRODUCT_NAME" /> هذا الإصدار الاحتياطي بعد ذلك. لاحظ أن هذا لا يعطل دعم إصدارات طبقة النقل الآمنة الأقدم، إلا إذا كان <ph name="PRODUCT_NAME" /> سيعالج الخوادم التي تحتوي على أخطاء والتي لا تستطيع أن تفاوض الإصدارات بشكلٍ صحيح. وبخلاف ذلك، إذا وجب حدوث توافق مع أحد الخوادم التي تحتوي على أخطاء، فقد يتم تعيين هذه السياسة إلى "tls1.1". وهذا إجراء مؤقت ومن المفترض أن يتم إصلاح الخادم بسرعة.</translation> -<translation id="1861037019115362154">لتحديد قائمة بالمكونات الإضافية التي يتم تعطيلها في <ph name="PRODUCT_NAME" /> ومنع المستخدمين من تغيير هذا الإعداد. - - يمكن استخدام حرفي البدل '*' و'?' - -لمطابقة تسلسلات من الأحرف العشوائية. ويطابق الحرف "*" عددًا عشوائيًا من الأحرف بينما يحدد '?' حرفًا واحدًا اختياريًا، أي أنه يشير إلى عدم وجود أحرف مطابقة أو وجود حرف واحد مطابق. وحرف الإلغاء هو "\"، لذلك إذا أردت مطابقة أي من الأحرف "*" أو "؟" أو "\" فعلاً، يمكنك وضع حرف "\" قبله. - - إذا تم تمكين هذا الإعداد، فلن يتم استخدام قائمة المكونات الإضافية المحددة في <ph name="PRODUCT_NAME" /> مطلقًا. ويتم وضع علامة على المكونات الإضافية كمكونات مُعطلة في 'about:plugins' ولا يستطيع المستخدمون تمكينها. - - لاحظ أن هذه السياسة يمكن تجاوزها بواسطة السياسة EnabledPlugins وDisabledPluginsExceptions. - - إذا تم ترك هذه السياسة بدون تعيين، يمكن للمستخدم استخدام أي من المكونات الإضافية المثبتة على النظام عدا المكونات الإضافية التي تتضمن تعليمات برمجية أو المكونات غير المتوافقة أو القديمة أو الخطرة.</translation> <translation id="1864269674877167562">إذا تم تعيين هذه السياسة إلى "string" فارغ أو لم تتم تهيئتها، فلن يعرض <ph name="PRODUCT_OS_NAME" /> أي خيار إكمال تلقائي أثناء تدفق تسجيل دخول المستخدم. إذا تم تعيين هذه السياسة إلى "string" يمثل اسم نطاق، فسيعرض <ph name="PRODUCT_OS_NAME" /> خيار الإكمال التلقائي أثناء تسجيل دخول المستخدم، ما يسمح للمستخدم بكتابة اسم المستخدم التابع له بدون إضافة اسم النطاق. وسيتمكن المستخدم من استبدال إضافة اسم النطاق هذه.</translation> <translation id="1865417998205858223">الأذونات الرئيسية</translation> @@ -806,11 +795,6 @@ <translation id="3660562134618097814">نقل ملفات تعريف الارتباط SAML IdP أثناء تسجيل الدخول</translation> <translation id="3709266154059827597">تهيئة قائمة الحظر لتثبيت الإضافات</translation> <translation id="3711895659073496551">تعليق</translation> -<translation id="3715448429089775791">تفرض تعيين وضع الأمان في YouTube إلى نشط، وتمنع المستخدمين من تغيير هذا الإعداد. - - في حالة تمكين هذا الإعداد، يكون وضع الأمان في YouTube دائمًا نشطًا. - - في حالة تعطيل هذا الإعداد أو عدم تعيين قيمة، لا يتم فرض وضع الأمان في YouTube.</translation> <translation id="3750220015372671395">حظر إنشاء مفتاح على هذه المواقع</translation> <translation id="3756011779061588474">حظر وضع مطوّر البرامج</translation> <translation id="3758089716224084329">السماح لك بتحديد الخادم الوكيل الذي يستخدمه <ph name="PRODUCT_NAME" /> ومنع المستخدمين من تغيير إعدادات الخادم الوكيل. @@ -1950,12 +1934,6 @@ إن معرّفات أنواع الاتصالات المعتمدة هي "ethernet" و"wifi" و"wimax" و"bluetooth" و"cellular".</translation> <translation id="7763614521440615342">إظهار اقتراحات المحتوى على صفحة "علامة التبويب الجديدة"</translation> -<translation id="7766336524667238790">إبلاغ المعلومات عن جلسة الكشك النشطة مثل - رقم تعريف التطبيق وإصداره. - - إذا تم تعيين هذه السياسة على "false"، فلن يتم الإبلاغ - عن معلومات هذه الجلسة، إذا عُينت على "true" أو تُركت غير مُعينة، فسيتم الإبلاغ - عن معلومات الجلسة.</translation> <translation id="7774768074957326919">استخدام إعدادات الخادم الوكيل للنظام</translation> <translation id="7775831859772431793">يمكنك تحديد عنوان URL للخادم الوكيل هنا. @@ -2176,6 +2154,9 @@ <translation id="8369602308428138533">مهلة إيقاف تشغيل الشاشة عند استخدام طاقة التيار المتردد</translation> <translation id="8382184662529825177">تمكين استخدام المصادقة عن بُعد لحماية المحتوى بالجهاز</translation> <translation id="838870586332499308">تمكين تجوال البيانات</translation> +<translation id="8390049129576938611">تعطيل عارض PDF الداخلي في <ph name="PRODUCT_NAME" />. وبدلاً من ذلك يتم التعامل معه كتنزيل مع السماح للمستخدم بفتح ملفات PDF باستخدام التطبيق الافتراضي. + إذا تم ترك هذه السياسة دون تعيين أو تم تعطيلها، فسيتم استخدام المكوّن الإضافي PDF لفتح ملفات PDF ما لم يعطِّله المستخدم.</translation> +<translation id="8402079500086185021">فتح ملفات PDF خارجيًا دائمًا</translation> <translation id="8412312801707973447">ما إذا كانت فحوصات OCSP/CRL عبر الإنترنت يتم تنفيذها أم لا</translation> <translation id="8413348101535146315">تُستخدم هذه السياسة لتمكين إنهاء العمليات في "إدارة المهام" لـ <ph name="PRODUCT_NAME" />. @@ -2196,17 +2177,6 @@ للحصول على نماذج للأنماط، راجع https://www.chromium.org/developers/how-tos/chrome-frame-getting-started.</translation> <translation id="8493645415242333585">تعطيل حفظ سجل المتصفح</translation> <translation id="8499172469244085141">الإعدادات الافتراضية (يمكن للمستخدمين استبدالها)</translation> -<translation id="8501011084242226370">لتحديد قائمة تضم مكونات إضافية يمكن للمستخدم تمكينها أو تعطيلها في <ph name="PRODUCT_NAME" />. - - يمكن استخدام حرفي البدل "*" و"؟" لمطابقة تسلسلات الأحرف العشوائية. تمثل تطابقات "*" عددًا عشوائيًا من الأحرف، بينما تحدد "؟" حرفًا واحدًا اختياريًا، أي أنها تطابق حرفًا واحدًا أو لا حرف مطلقًا. حرف الإلغاء هو"\"، ومن ثم لمطابقة "*" أو "؟" أو "\" الفعلي، يمكنك وضع "\" أمامه. - - عند تمكين هذا الإعداد، يمكن استخدام القائمة المحددة من المكوِّنات الإضافية في <ph name="PRODUCT_NAME" />. يمكن للمستخدمين تمكينه أو تعطيله في "about:plugins"، حتى إذا كان المكوِّن الإضافي يتطابق كذلك مع نمط في DisabledPlugins. كما يمكن للمستخدمين تمكين أو تعطيل المكونات الإضافية التي لا تتطابق مع أي نمط في DisabledPlugins أو DisabledPluginsExceptions أوEnabledPlugins. - - تهدف هذه السياسة إلى السماح بحظر المكون الإضافية الذي تتضمن قائمة DisabledPlugins فيه إدخالات أحرف بدل مثل تعطيل جميع المكونات "*" أو تعطيل جميع مكونات جافا "*Java*" ولكن يريد المشرف تمكين إصدار معين مثل "IcedTea Java 2.3". ويمكن تحديد هذا الإصدار المعين في هذه السياسة. - - لاحظ أنه يجب إعفاء كل من اسم الكون الإضافي واسم مجموعة المكونات الإضافية. ويظهر كل مكون إضافي في قسم منفصل ضمن about:plugins؛ وقد يتضمن كل قسم مكونًا إضافيًا واحدًا أو أكثر. على سبيل المثال، ينتمي المكون الإضافي "Shockwave Flash" لمجموعة "Adobe Flash Player"، ويجب أن يتضمن الاسمان تطابقًا في قائمة الاستثناءات إذا كان المطلوب إعفاء هذا المكون الإضافي من القائمة السوداء. - - إذا تم ترك هذه السياسة بدون تعيين فسيتم حظر وتعطيل أي مكون إضافي يتطابق مع الأنماط في "DisabledPlugins" ولن يتمكن المستخدم من تمكينه.</translation> <translation id="8519264904050090490">عناوين URL للاستثناءات اليدوية لحساب المستخدم الخاضع للإدارة</translation> <translation id="8544375438507658205">عارض HTML الافتراضي <ph name="PRODUCT_FRAME_NAME" /></translation> <translation id="8549772397068118889">التحذير عند الانتقال إلى مواقع خارج حزمات المحتوى</translation> @@ -2240,7 +2210,6 @@ يمكن فصل أسماء الخوادم المتعددة بفواصل. ومسموح بأحرف البدل (*). في حالة ترك هذه السياسة بدون تعيين، سيحاول <ph name="PRODUCT_NAME" /> اكتشاف ما إذا كان الخادم متصلاً بالشبكة الداخلية وحينئذٍ فقط سيستجيب إلى طلبات IWA. وإذا تم اكتشاف خادم كإنترنت، فسيتجاهل <ph name="PRODUCT_NAME" /> طلبات IWA الواردة منه.</translation> -<translation id="8668394701842594241">لتحديد قائمة بالمكونات الإضافية التي يتم تمكينها في <ph name="PRODUCT_NAME" /> ومنع المستخدمين من تغيير هذا الإعداد. يمكن أن يتم استخدام حرفي البدل "*" و"؟" لمطابقة سلاسل الأحرف العشوائية. ويطابق الحرف "*" عددًا عشوائيًا من الأحرف بينما يحدد "؟" حرفًا واحدًا اختياريًا، على سبيل المثال، يطابق الصفر أو أحد الأحرف. وحرف الإلغاء هو "\"، لذلك إذا أردت مطابقة أي من الأحرف "*" أو "؟" أو "\" فعلاً، يمكنك وضع حرف "\" قبله. يتم استخدام قائمة المكونات الإضافية المحددة بشكل دائم في <ph name="PRODUCT_NAME" /> إذا كانت مثبَّتة. ويتم وضع علامة على المكونات الإضافية كمكونات مُمَكَّنة في 'about:plugins' ولا يستطيع المستخدمون تعطيلها. لاحظ أن هذه السياسة تتجاوز كلاً من DisabledPlugins وDisabledPluginsExceptions. إذا تم ترك هذه السياسة بدون تعيين، يمكن للمستخدم تعطيل أي مكوّن إضافي مثبّت على النظام.</translation> <translation id="8672321184841719703">إصدار التحديث التلقائي المستهدف</translation> <translation id="868068801094828689">تمكّن إعداد تقارير مجهولة إلى Google حول استخدام <ph name="PRODUCT_NAME" /> والبيانات المتعلقة بالأعطال وتمنع المستخدمين من تغيير هذا الإعداد. @@ -2338,13 +2307,6 @@ إذا تم تعيين هذه السياسة على "صواب" أو لم تتم تهيئتها، عندئذٍ سيتصل <ph name="PRODUCT_OS_NAME" /> تلقائيًا بخادم Quirks وسينزل ملفات التهيئة، إذا أمكن، ثم يخزنها على الجهاز. يمكن استخدام هذه الملفات، على سبيل المثال، لتحسين جودة عرض الشاشات الموصّلة.</translation> -<translation id="8905426178924715309">عند إيقاف هذه السياسة، يُرجى استخدام كل من ForceGoogleSafeSearch أو ForceYouTubeSafetyMode بدلاً منها. سيتم تجاهل هذه السياسة إذا ما تم تعيين إما سياسات ForceGoogleSafeSearch أو ForceYouTubeSafetyMode. - - فرض إجراء طلبات البحث في بحث الويب من Google باستخدام البحث الآمن الذي تم تعيينه على "نشط" وتمنع المستخدمين من تغيير هذا الإعداد. وبالتالي يفرض هذا الإعداد أيضًا إجراء الوضع الآمن في YouTube. - - إذا مكّنت هذ الإعداد، فسيصبح البحث الآمن في بحث Google وYouTube دائمًا نشطًا. - - إذا عطلّت هذا الإعداد أو إذا لم تعيّن قيمة، فلن يتم فرض البحث الآمن في بحث Google وYouTube.</translation> <translation id="8906768759089290519">تمكين وضع الضيف</translation> <translation id="8908294717014659003">للسماح لك بتعيين ما إذا كان يُسمح لمواقع الويب بالحصول على إمكانية الدخول إلى أجهزة التقاط الوسائط. يمكن السماح بالدخول إلى أجهزة التقاط الوسائط افتراضيًا أو سؤال المستخدم في كل مرة يريد فيها أحد المواقع الحصول على إمكانية الدخول إلى أجهزة التقاط الوسائط.
diff --git a/components/policy/resources/policy_templates_bg.xtb b/components/policy/resources/policy_templates_bg.xtb index 6dbbad2..c516f38 100644 --- a/components/policy/resources/policy_templates_bg.xtb +++ b/components/policy/resources/policy_templates_bg.xtb
@@ -199,15 +199,6 @@ Ако правилото не е конфигурирано или е зададено „tls1.2“, <ph name="PRODUCT_NAME" /> вече няма да преминава към резервния вариант. Обърнете внимание, че поддръжката за по-стари версии на TLS няма да се деактивира. Ще бъде засегната само възможността на <ph name="PRODUCT_NAME" /> да избягва неизправните сървъри, които не могат да съгласуват версиите правилно. В случай че трябва да се поддържа съвместимост с неизправен сървър, може да се използва опцията „tls1.1“. Това е временна мярка и сървърът трябва да се поправи бързо.</translation> -<translation id="1861037019115362154">Посочва списък с деактивираните в <ph name="PRODUCT_NAME" /> приставки и не разрешава на потребителите да променят тази настройка. - -Заместващите знаци „*“ и „?“ могат да се използват за намиране на съответствия на последователности от произволни знаци. „*“ съответства на произволен брой знаци, а „?“ посочва незадължителен отделен знак, т.е. съвпада с нула или единица. Знакът за освобождаване е „\“, така че за намиране на съответствие на действителните „*“, „?“ или „\“ можете да поставите „\“ пред тях. - -Ако активирате тази настройка, посоченият списък с приставки не се използва никога в <ph name="PRODUCT_NAME" />. Приставките са означени като деактивирани в „about:plugins“ и потребителите не могат да ги активират. - -Обърнете внимание, че това правило може да бъде отменено от „EnabledPlugins“ и „DisabledPluginsExceptions“. - -Ако то е оставено незададено, потребителят може да използва всички инсталирани в системата приставки с изключение на несъвместимите твърдо кодирани, неактуалните или опасните.</translation> <translation id="1864269674877167562">Ако за това правило е зададен празен низ или то не е конфигурирано, в <ph name="PRODUCT_OS_NAME" /> няма да се показва опция за автоматично довършване по време на процедурата за влизане в профил на потребител. В случай че е зададен низ, представляващ име на домейн – при влизане в <ph name="PRODUCT_OS_NAME" /> ще се показва опция за автоматично довършване, която дава възможност на потребителите да въведат само потребителското си име, без разширението за име на домейн, което ще могат да презапишат.</translation> <translation id="1865417998205858223">Ключови разрешения</translation> @@ -821,11 +812,6 @@ <translation id="3660562134618097814">Прехвърляне на „бисквитките“, задавани от доставчици на удостоверителни услуги със SAML при влизане</translation> <translation id="3709266154059827597">Конфигуриране на черния списък за инсталиране на разширения</translation> <translation id="3711895659073496551">Спиране</translation> -<translation id="3715448429089775791">Принудително активира безопасния режим в YouTube и не позволява на потребителите да променят тази настройка. - -Ако я активирате, безопасният режим ще е винаги включен. - -В случай че деактивирате настройката или не зададете стойност, безопасният режим няма да се активира принудително.</translation> <translation id="3750220015372671395">Блокиране на генерирането на ключове от тези сайтове</translation> <translation id="3756011779061588474">Блокиране на режима за програмисти</translation> <translation id="3758089716224084329">Позволява да посочите прокси сървъра, използван от <ph name="PRODUCT_NAME" />, и не разрешава на потребителите да променят настройките за него. @@ -1986,12 +1972,6 @@ Разпознатите идентификатори за типове връзки са „ethernet“, „wifi“, „wimax“, „bluetooth“ и „cellular“.</translation> <translation id="7763614521440615342">Показване на предложения за съдържание в новия раздел в браузъра</translation> -<translation id="7766336524667238790">Изпращане на информация за активната сесия в павилионен режим, например -идентификационния номер и версията на приложението. - -Информацията за сесията няма да се изпраща, ако за правилото е зададено false, -и ще се изпраща, в случай че то е true или не е -конфигурирано.</translation> <translation id="7774768074957326919">Използване на системните настройки за прокси сървър</translation> <translation id="7775831859772431793">Тук можете да посочите URL адреса на прокси сървъра. @@ -2217,6 +2197,10 @@ <translation id="8369602308428138533">Забавяне преди изключване на екрана при работа на променлив ток</translation> <translation id="8382184662529825177">Активиране на използването на отдалечено удостоверяване за защита на съдържание за устройството</translation> <translation id="838870586332499308">Активиране на роуминга за данни</translation> +<translation id="8390049129576938611">Деактивира вътрешния визуализатор за PDF файлове в <ph name="PRODUCT_NAME" />. Вместо това тези файлове се третират като такива за изтегляне и на потребителя се дава възможност да ги отвори със стандартното приложение. + + Ако това правило не е зададено или е деактивирано, за отваряне на PDF файлове ще се използва приставката за целта, освен ако потребителят не я деактивира.</translation> +<translation id="8402079500086185021">PDF файловете винаги да се отварят с външно приложение</translation> <translation id="8412312801707973447">Дали да се изпълняват онлайн OCSP/CRL проверки</translation> <translation id="8413348101535146315">Активира прекратяването на процеси в диспечера на задачите в <ph name="PRODUCT_NAME" />. @@ -2237,17 +2221,6 @@ За примерни образци вижте https://www.chromium.org/developers/how-tos/chrome-frame-getting-started.</translation> <translation id="8493645415242333585">Деактивиране на запазването на историята на браузъра</translation> <translation id="8499172469244085141">Настройки по подразбиране (потребителите могат да ги отменят)</translation> -<translation id="8501011084242226370">Посочва списък с приставки, които потребителят може да активира или деактивира в <ph name="PRODUCT_NAME" />. - -Заместващите знаци „*“ и „?“ могат да се използват за намиране на съответствия на последователности от произволни знаци. „*“ съответства на произволен брой знаци, а „?“ посочва незадължителен отделен знак, т.е. съвпада с нула или единица. Знакът за освобождаване е „\“, така че за намиране на съответствие на действителните „*“, „?“ или „\“ можете да поставите „\“ пред тях. - -Ако активирате тази настройка, посоченият списък с приставки може да се използва в <ph name="PRODUCT_NAME" />. Потребителите са в състояние да ги активират и деактивират в „about:plugins“ дори ако приставката съответства и на образец в „DisabledPlugins“. Също така потребителите могат да активират и деактивират приставки, които не съответстват на образци в „DisabledPlugins“, „DisabledPluginsExceptions“ и „EnabledPlugins“. - -Целта на това правило е да разреши строгите ограничения в черния списък с приставки, където списъкът „DisabledPlugins“ съдържа заместващи записи, например деактивиране на всички приставки „*“ или на всички приставки за Java „*Java*“, но администраторът иска да активира конкретна версия, като „IcedTea Java 2.3“. Тя може да бъде посочена в съответното правило. - -Обърнете внимание, че от черния списък трябва да се изключат и името на приставката, и това на групата й. Всяка група приставки се показва в отделна секция в „about:plugins“. Във всяка секция може да има една или повече приставки. Например Shockwave Flash принадлежи на групата „Adobe Flash Player“ и двете имена трябва да имат съответствие в списъка с изключения, ако тази приставка трябва да се освободи от черния списък. - -Когато правилото не е зададено, всяка приставка, съответстваща на образците в „DisabledPlugins“, ще бъде заключена като деактивирана и потребителят няма да може да я активира.</translation> <translation id="8519264904050090490">URL адреси за ръчни изключения за управлявани потребители</translation> <translation id="8544375438507658205">HTML визуализатор по подразбиране за <ph name="PRODUCT_FRAME_NAME" /></translation> <translation id="8549772397068118889">Предупреждение при посещаване на сайтове извън пакети със съдържание</translation> @@ -2283,9 +2256,6 @@ Разделете със запетаи имената на сървърите. Заместващите знаци (*) са разрешени. В случай че това правило не е зададено, <ph name="PRODUCT_NAME" /> ще отговоря на заявки за интегрирано удостоверяване за Windows (IWA) само след като се опита да установи дали даден сървър е в интранет. Ако случаят е такъв, <ph name="PRODUCT_NAME" /> ще пренебрегне тези заявки от него.</translation> -<translation id="8668394701842594241">Посочва списък с активираните в <ph name="PRODUCT_NAME" /> приставки и не разрешава на потребителите да променят тази настройка. - Заместващите знаци „*“ и „?“ могат да се използват за намиране на съответствия на последователности от произволни знаци. „*“ съответства на произволен брой знаци, а „?“ посочва незадължителен отделен знак, т.е. съвпада с нула или единица. Знакът за освобождаване е „\“, така че за намиране на съответствие на действителните „*“, „?“ или „\“ можете да поставите „\“ пред тях. Посоченият списък с приставки се използва винаги в <ph name="PRODUCT_NAME" />, ако са инсталирани. Те са означени като активирани в „about:plugins“ и потребителите не могат да ги деактивират. -Обърнете внимание, че това правило отменя както „DisabledPlugins“, така и „DisabledPluginsExceptions“. Ако то е оставено незададено, потребителят може да деактивира всяка приставка, инсталирана в системата.</translation> <translation id="8672321184841719703">Целева версия за автоматично актуализиране</translation> <translation id="868068801094828689">Активира анонимното изпращане до Google на данни за <ph name="PRODUCT_NAME" />, свързани с употребата и сривовете, и не позволява на потребителите да променят тази настройка. @@ -2389,13 +2359,6 @@ ще се свързва с Quirks Server, ще изтегля съответните файлове, ако са налице, и ще ги съхранява на устройството. Например те може да се използват за подобряване на качеството на образа на свързани монитори.</translation> -<translation id="8905426178924715309">Правилото е оттеглено. Моля, вместо него използвайте ForceGoogleSafeSearch и ForceYouTubeSafetyMode. Ако зададете една от тези настройки, правилото ще бъде пренебрегнато. - -Налага заявките в Google Търсене в мрежата да се извършват с активирано Безопасно търсене и не разрешава на потребителите да променят тази настройка. Също така налага използването на безопасния режим в YouTube. - -Ако активирате настройката, Безопасно търсене винаги ще е активно за Google Търсене и YouTube. - -В случай че я деактивирате или не зададете стойност, Безопасно търсене няма да се използва принудително в тези услуги.</translation> <translation id="8906768759089290519">Активиране на режима като гост</translation> <translation id="8908294717014659003">Позволява да зададете дали на уебсайтовете е разрешено да получават достъп до устройства за снимане на медия. Възможно е това да се разреши по подразбиране или потребителят може да бъде питан всеки път, когато сайт иска достъп до съответните устройства.
diff --git a/components/policy/resources/policy_templates_bn.xtb b/components/policy/resources/policy_templates_bn.xtb index 5f19ddf9..b3c0655 100644 --- a/components/policy/resources/policy_templates_bn.xtb +++ b/components/policy/resources/policy_templates_bn.xtb
@@ -208,15 +208,6 @@ এই নীতিটি কনফিগার করা না থাকলে বা এটি "tls1.2" এ সেট করা থাকলে, <ph name="PRODUCT_NAME" /> আর ফলব্যাক ব্যবহার করে না। লক্ষ্য করুন যে, এটি TLS সংস্করণগুলির জন্য সমর্থন অক্ষম করে না, কেবলমাত্র সঠিকভাবে সংস্করণ নেগোশিয়েট করতে না পারা ত্রুটিপূর্ণ সার্ভারগুলি এড়িয়ে চলতে <ph name="PRODUCT_NAME" /> কাজ করে যাবে। অন্যথায়, যদি একটি ক্রুটিযুক্ত সার্ভারের সাথে সঙ্গতি বজায় রাখা আবশ্যক হয়, তাহলে একে "tls1.1" এ সেট করা যেতে পারে। এটি একটি অস্থায়ী সমাধান এবং সার্ভারটি দ্রুত সংশোধন করা উচিত।</translation> -<translation id="1861037019115362154"><ph name="PRODUCT_NAME" /> এ অক্ষম থাকা প্লাগইনগুলির একটি তালিকা নির্দিষ্ট করে এবং এই সেটিংটি পরিবর্তন করা থেকে ব্যবহারকারীদের আটকায়৷ - - '*' এবং '?' ওয়াইল্ডকার্ড অক্ষরগুলি অবাধ অক্ষরের ক্রমের সাথে মেলাতে ব্যবহার করা যেতে পারে৷ '*' অক্ষরগুলি একটি অবাধ সংখ্যার সাথে মেলে অন্যদিকে '?' একটি ঐচ্ছিক একক অক্ষরকে নির্দিষ্ট করে, অর্থাত্ শূন্য বা এক অক্ষরের সাথে মেলে৷ এড়ানোর অক্ষরটি হ'ল '\', তাই প্রকৃত '*', '?', বা '\' অক্ষরগুলির সাথে মেলাতে আপনি সেগুলির আগে একটি '\' লাগাতে পারেন৷ - - আপনি এই সেটিংটি সক্ষম করলে, প্লাগইনগুলির নির্দিষ্ট তালিকাটি <ph name="PRODUCT_NAME" /> এ আর কখনও ব্যবহৃত হবে না৷ প্লাগইনগুলি 'about:plugins' এ অক্ষম হিসাবে চিহ্নিত থাকবে এবং ব্যবহারকারীরা সেগুলি সক্ষম করতে পারবে না৷ - - লক্ষ্যনীয় যে এই নীতিটি EnabledPlugins এবং DisabledPluginsExceptions এর মাধ্যমে ওভাররাইড করা যেতে পারে৷ - - যদি এই নীতিটি সেট না করা হয় তাহলে, ব্যবহারকারীরা হার্ড-কোডযুক্ত অসঙ্গত, পুরোনো অথবা বিপজ্জনক প্লাগইন ছাড়া সিস্টেমে ইনস্টল থাকা অন্য যেকোনো প্লাগইন ব্যবহার করতে পারবে৷</translation> <translation id="1864269674877167562">এই নীতিটি যদি একটি ফাঁকা স্ট্রিং হিসাবে সেট করা থাকে বা কনফিগার করা না থাকে, তাহলে <ph name="PRODUCT_OS_NAME" /> ব্যবহারকারীকে সাইন ইন প্রবাহের সময় কোনো স্বয়ংপূর্ণ বিকল্প দেখাবে না। এই নীতিটি যদি একটি ডোমেন নাম প্রতিনিধিত্ব করে এমন একটি স্ট্রিং হিসাবে সেট করা থাকে, তাহলে <ph name="PRODUCT_OS_NAME" /> ব্যবহারকারীকে সাইন ইনের সময়ে স্বয়ংপূর্ণ বিকল্প দেখাবে যেখানে ব্যবহারকারী ডোমেন নাম এক্সটেনশান ছাড়া শুধুমাত্র তার ব্যবহারকারীর নাম লেখার অনুমতি পাবেন। ব্যবহারকারী এই ডোমেন নাম এক্সটেনশান ওভাররাইট করতে পারবেন।</translation> <translation id="1865417998205858223">মূল অনুমতিগুলি</translation> @@ -843,11 +834,6 @@ <translation id="3660562134618097814">লগইন করার সময় SAML IdP কুকি স্থানান্তর করে</translation> <translation id="3709266154059827597">এক্সটেনশান ইনস্টলেশান কালোতালিকা কনফিগার করুন</translation> <translation id="3711895659073496551">সাসপেন্ড</translation> -<translation id="3715448429089775791">YouTube নিরাপত্তা মোড বলপূর্বক সক্রিয় করে এবং ব্যবহারকারীদেরকে এই সেটিং পরিবর্তন করা থেকে আটকায়। - - আপনি এই সেটিংটি সক্ষম করলে, YouTube এ নিরাপত্তা মোড সর্বদা সক্রিয় থাকে। - - আপনি যদি এই সেটিংটি অক্ষম করেন অথবা একটি মান সেট না করেন, তাহলে YouTube এ নিরাপত্তা মোড বলবৎ হয় না।</translation> <translation id="3750220015372671395">এই সাইটগুলিতে কী তৈরি করা অবরোধ করুন</translation> <translation id="3756011779061588474">বিকাশকারী মোড অবরুদ্ধ করুন</translation> <translation id="3758089716224084329"><ph name="PRODUCT_NAME" /> এর ব্যবহার করা প্রক্সী সার্ভারটি নির্দিষ্ট করতে আপনাকে অনুমতি দেয় এবং ব্যবহারকারীদের প্রক্সী সেটিংস পরিবর্তন করা থেকে আটকায়। @@ -2089,12 +2075,6 @@ স্বীকৃত সংযোগ প্রকার শনাক্তকারীগুলি হল "ethernet", "wifi", "wimax", "bluetooth" এবং "cellular"৷</translation> <translation id="7763614521440615342">নতুন ট্যাব পৃষ্ঠার জন্য সামগ্রী প্রস্তাবনা দেখান</translation> -<translation id="7766336524667238790">সক্রিয় কিয়স্ক অধিবেশন সম্পর্কে তথ্য, যেমন আবেদন আইডি এবং সংস্করণ - অভিযোগ করুন। - - নীতিটি মিথ্যাতে সেট করা থাকলে, অধিবেশনের তথ্য - প্রতিবেদন করা হবে না। সত্যতে সেট থাকলে বা সেট না করে রাখা হলে, অধিবেশনের তথ্য - প্রতিবেদন করা হবে।</translation> <translation id="7774768074957326919">সিস্টেম প্রক্সি সেটিংস ব্যবহার করুন</translation> <translation id="7775831859772431793">আপনি এখানে প্রক্সী সার্ভারের URLটি নির্দিষ্ট করতে পারেন৷ @@ -2321,6 +2301,10 @@ <translation id="8369602308428138533">AC পাওয়ার চলাকালীন স্ক্রীন বন্ধে বিলম্ব</translation> <translation id="8382184662529825177">ডিভাইসটির ক্ষেত্রে সামগ্রী সুরক্ষার জন্য রিমোট প্রত্যায়নের ব্যবহার সক্ষম করুন</translation> <translation id="838870586332499308">ডেটা বিচরণ সক্ষম করুন</translation> +<translation id="8390049129576938611"><ph name="PRODUCT_NAME" /> এ অভ্যন্তরীণ PDF ভিউয়ার অক্ষম করে। এর পরিবর্তে এটিকে ডাউনলোড হিসাবে বিবেচনা করে এবং ডিফল্ট অ্যাপ্লিকেশান দিয়ে PDF ফাইল খোলার জন্য ব্যবহারকারীকে অনুমতি দেয়। + + এই নীতিটি সেট করা না থাকলে বা অক্ষম করা থাকলে, ব্যবহারকারী যদি PDF প্লাগইনটি অক্ষম না করে থাকে, তাহলে PDF ফাইলগুলি খোলার জন্য এটি ব্যবহার করা হবে।</translation> +<translation id="8402079500086185021">PDF ফাইলগুলি সর্বদা বহিঃস্থভাবে খুলুন</translation> <translation id="8412312801707973447">অনলাইন OCSP / CRL পরীক্ষা করা হয় কিনা</translation> <translation id="8413348101535146315"><ph name="PRODUCT_NAME" /> এর কার্য পরিচালকে প্রক্রিয়াগুলি সমাপ্ত করা সক্ষম করে। @@ -2341,17 +2325,6 @@ প্যাটার্নের উদাহরণগুলির জন্য http://www.chromium.org/developers/how-tos/chrome-frame-getting-started দেখুন।</translation> <translation id="8493645415242333585">ব্রাউজার ইতিহাস সংরক্ষণ করা অক্ষম করুন</translation> <translation id="8499172469244085141">ডিফল্ট সেটিংস (ব্যবহারকারীরা পাল্টাতে পারেন)</translation> -<translation id="8501011084242226370">প্লাগইনগুলির একটি তালিকা নির্দিষ্ট করে যা ব্যবহারকারী <ph name="PRODUCT_NAME" /> এ সক্ষম বা অক্ষম করতে পারে৷ - - বিধিবহির্ভূত অক্ষরগুলির ক্রমের সাথে মেলাতে ওয়াইল্ডকার্ড অক্ষর '*' এবং '?' ব্যবহার করা যেতে পারে৷ '*' অক্ষরগুলির একটি বিধিবহির্ভূত সংখ্যাকে মেলায়, যেখানে '?' একটি ঐচ্ছিক একক অক্ষরকে নির্দিষ্ট করে যেমন শূন্য বা এক অক্ষরের সাথে মেলানো৷ এস্কেপ অক্ষর হল '\', সুতরাং প্রকৃত '*', '?', বা '\' অক্ষরগুলি মেলাতে আপনি সেগুলির সামনে '\' লাগাতে পারেন৷ - - যদি আপনি এই সেটিংটি সক্ষম করেন, প্লাগইনগুলির সুনির্দিষ্ট তালিকা <ph name="PRODUCT_NAME" /> এ ব্যবহার করা যাবে৷ ব্যবহারকারীরা সেগুলিকে 'about:plugins' এ সক্ষম বা অক্ষম করতে পারেন, এমনকি প্লাগইনটি DisabledPlugins এ একটি প্যাটার্নে মিলে গেলেও৷ এছাড়াও ব্যবহারকারী DisabledPlugins, DisabledPluginsExceptions এবং EnabledPlugins এ কোনো প্যাটার্নে মেলে না এমন প্লাগইনগুলি সক্ষম এবং অক্ষম করতে পারেন৷ - - এই নীতিটির দ্বারা কঠোর প্লাগইন কালোতালিকাভুক্ত করার অনুমতি দেওয়া বোঝানো হয়, যেখানে 'DisabledPlugins' তালিকাতে সমস্ত প্লাগইন অক্ষম করা '*' বা সমস্ত Java প্লাগইন অক্ষম করা '*Java*' এর মতো ওয়াইল্ডকার্ডভুক্ত এন্টিগুলি বর্তমান থাকে, কিন্তু প্রশাসক 'IcedTea Java ২.৩' এর মতো কিছু নির্দিষ্ট সংস্করণ সক্ষমের ইচ্ছা প্রকাশ করে৷ - - মনে রাখবেন যে প্লাগইনের নাম এবং প্লাগইন গোষ্ঠীর নাম উভয়েরই ব্যতিক্রম আছে৷ প্রতিটি প্লাগইন গোষ্ঠী about:plugins এর একটি আলাদা বিভাগে প্রদর্শিত হয়, প্রতিটি বিভাগে এক বা একাধিক প্লাগইন থাকতে পারে৷ উদাহরণস্বরূপ, "Shockwave Flash" প্লাগইন "Adobe Flash Player" গোষ্ঠীর অন্তর্ভুক্ত এবং যদি সেই প্লাগইনটিকে কালোতালিকা থেকে ব্যতিক্রম রাখতে হয় তবে উভয় নামের ব্যতিক্রমগুলির তালিকাতে একটি মিল থাকতে হবে৷ - - যদি এই নীতিটিকে সেট না করেই রেখে দেওয়া হয়, তবে 'DisabledPlugins' এ প্যাটার্নগুলির সাথে মেলে এমন যেকোনো প্লাগইন লক করা অবস্থায় অক্ষম করা হবে এবং ব্যবহারকারী সেগুলিকে সক্ষম করতে পারবেন না৷</translation> <translation id="8519264904050090490">পরিচালিত ব্যবহারকারী ম্যানুয়াল ব্যতিক্রম URLগুলি</translation> <translation id="8544375438507658205"><ph name="PRODUCT_FRAME_NAME" />-এর ডিফল্টHTML পরিবেশক</translation> <translation id="8549772397068118889">সামগ্রী প্যাকগুলির বাইরের সাইটগুলি পরিদর্শন করার সময় সর্তক করুন</translation> @@ -2376,7 +2349,6 @@ একাধিক সার্ভারের নামগুলি কমা দিয়ে আলাদা করে৷ ওয়াইল্ডকার্ডগুলি (*) মঞ্জুরিপ্রাপ্ত৷ যদি আপনি এই নীতিটি সেট না করে ছেড়ে রাখেন তাহলে ইন্ট্রানেটে কোনো সার্ভার রয়েছে কিনা <ph name="PRODUCT_NAME" /> তা সনাক্ত করার চেষ্টা করবে এবং শুধুমাত্র তখনই এটি IWA অনুরোধগুলির প্রতিক্রিয়া জানাবে৷ যদি একটি সার্ভার ইন্টারনেট হিসাবে সনাক্ত হয় তখন এর থেকে IWA অনুরোধগুলি <ph name="PRODUCT_NAME" /> এর দ্বারা উপেক্ষিত হবে৷</translation> -<translation id="8668394701842594241"><ph name="PRODUCT_NAME" />এ সক্ষম থাকা প্লাগইনগুলির একটি তালিকা নির্দিষ্ট করে এবং ব্যবহারকারীদের এই সেটিংটি পরিবর্তন করা থেকে বাধা দেয়৷ ওয়াইল্ডকার্ড অক্ষর '*' এবং '?' গুলি যে কোনো অক্ষরের ক্রমের সাথে মেলাতে ব্যবহার করা যেতে পারে৷ '*' অক্ষরগুলির যে কোনো একটি সংখ্যার অক্ষরের সাথে মেলে অন্যদিকে '?' একটি ঐচ্ছিক একক অক্ষরকে নির্দিষ্ট করে, অর্থাত শূন্য বা এক অক্ষরের সাথে মেলে৷ এড়ানোর অক্ষরটি হ'ল '\', তাই প্রকৃত '*', '?', বা '\' অক্ষরগুলির সাথে মেলাতে আপনি সেগুলির আগে একটি '\' বসাতে পারেন৷ প্লাগইনগুলির একটি নির্দিষ্ট করা তালিকা ইনস্টল থাকলে তা সর্বদা <ph name="PRODUCT_NAME" />-এ ব্যবহৃত হয়৷ 'সম্পর্কে:প্লাগইনস' এবং ব্যবহারকারীরা প্লাগইনগুলি সক্ষম হিসাবে চিহ্নিত থাকে এবং ব্যবহারকারীরা সেগুলি অক্ষম করতে পারেনা৷ নোট করুন যে এই নীতিটি অক্ষমিত প্ল্যাগইন এবং অক্ষমিত প্ল্যাগইন ব্যতিক্রম-এর দু'টিকেই ওভাররাইড করে৷ যদি এই নীতিটি ব্যবহারকারীকে সেট না করা হিসাবে ছেড়ে দেওয়া থাকে তবে ব্যবহারকারী সিস্টেমে ইনস্টল থাকা যে কোনো প্লাগইন অক্ষম করতে পারে৷</translation> <translation id="8672321184841719703">লক্ষ্য স্বয়ংক্রিয়ভাবে আপডেট করা সংস্করণ</translation> <translation id="868068801094828689">Google এর কাছে <ph name="PRODUCT_NAME" /> এর ব্যবহার ও ক্র্যাশ-সংক্রান্ত ডেটার বেনামী প্রতিবেদন করা সক্ষম করে এবং এই ব্যবহারকারীদেরকে এই সেটিং পরিবর্তন করতে বাধা দেয়। @@ -2469,13 +2441,6 @@ এই নীতিটি মিথ্যাতে সেট করা থাকলে, ডিভাইসটি কনফিগারেশন ফাইলগুলি ডাউনলোড করতে Quirks সার্ভারের সাথে যোগাযোগ করার প্রচেষ্টা চালাবে না। যদি এই নীতি সত্য হিসাবে সেট বা কনফিগার করা না থাকে, তাহলে <ph name="PRODUCT_OS_NAME" /> স্বয়ংক্রিয়ভাবে Quirks সার্ভারের সাথে যোগাযোগ করবে এবং কনফিগারেশন ফাইলগুলি উপলব্ধ থাকলে সেগুলি ডাউনলোড করে ডিভাইসটিতে সংরক্ষণ করবে। এই ধরনের ফাইলগুলি, উদাহরণস্বরূপ, সংযুক্ত মনিটরের প্রদর্শন গুণমান উন্নত করার জন্য ব্যবহার করা হতে পারে।</translation> -<translation id="8905426178924715309">এই সেটিংটি থামিয়ে দেওয়া হয়েছে, দয়া করে এর পরিবর্তে ‘Google নিরাপদ অনুসন্ধান বলবৎ করুন’ এবং ‘YouTube নিরাপদ মোড বলবৎ করুন’ ব্যবহার করুন। ‘Google নিরাপদ অনুসন্ধান বলবৎ করুন’ অথবা ‘YouTube নিরাপদ মোড বলবৎ করুন’ নীতিগুলি সেট করা হলে, এই নীতিকে উপেক্ষা করা হবে। - - কুয়েরিগুলি নিরাপদ অনুসন্ধানকে সক্রিয় হিসেবে সেট করে এর মাধ্যমে Google ওয়েব অনুসন্ধানে কাজ করায় এবং এই সেটিং পরিবর্তন করতে ব্যবহারকারীদের বাধা দেয়। এছাড়াও, এই সেটিং YouTube এ নিরাপদ মোড বলবৎ করে। - - আপনি যদি এই সেটিংটি সক্ষম করেন, তাহলে Google অনুসন্ধান ও YouTube এ নিরাপদ অনুসন্ধান সর্বদা সক্রিয় থাকবে। - - আপনি যদি এই সেটিংটি অক্ষম করেন অথবা কোনো মান সেট না করেন, তাহলে Google অনুসন্ধান ও YouTube এ নিরাপদ অনুসন্ধান কার্যকরী হয় না।</translation> <translation id="8906768759089290519">অতিথি মোড সক্ষম করুন</translation> <translation id="8908294717014659003">ওয়েবসাইটগুলিকে মিডিয়া ক্যাপচার ডিভাইসে অ্যাক্সেসের মঞ্জুরি দেওয়া হবে কি না আপনাকে তা সেট করার মঞ্জুরি দেয়৷ মিডিয়া ক্যাপচার ডিভাইসে অ্যাক্সেস ডিফল্টভাবে মঞ্জুর করা যেতে পারে অথবা যখনই কোনো ওয়েবসাইট মিডিয়া ক্যাপচার ডিভাইসে অ্যাক্সেস চাইবে তখনই ব্যবহারকারীর কাছে তা জানতে চাওয়া হবে৷
diff --git a/components/policy/resources/policy_templates_ca.xtb b/components/policy/resources/policy_templates_ca.xtb index 5f7a7792..6272905 100644 --- a/components/policy/resources/policy_templates_ca.xtb +++ b/components/policy/resources/policy_templates_ca.xtb
@@ -203,15 +203,6 @@ 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. - - Si activeu aquest paràmetre, la llista de connectors especificada no s'utilitzarà mai a <ph name="PRODUCT_NAME" />. Els connectors estaran marcats com a desactivats a "about:plugins" i els usuaris no podran activar-los. - - Tingueu en compte que aquesta política es pot substituir per EnabledPlugins i DisabledPluginsExceptions. - - Si no definiu aquesta política, l'usuari no podrà utilitzar cap connector instal·lat al sistema, excepte en el cas de connectors codificats incompatibles, obsolets o perillosos.</translation> <translation id="1864269674877167562">Si aquesta política s'estableix en una cadena en blanc o no està configurada, <ph name="PRODUCT_OS_NAME" /> no mostrarà una opció d'emplenament automàtic durant el flux d'inici de sessió de l'usuari. Si aquesta política s'estableix en una cadena que representa un nom de domini, <ph name="PRODUCT_OS_NAME" /> mostrarà una opció de compleció automàtica durant l'inici de sessió de l'usuari que li permetrà escriure només el nom d'usuari, sense l'extensió del nom del domini. L'usuari podrà substituir aquesta extensió del nom del domini.</translation> <translation id="1865417998205858223">Permisos clau</translation> @@ -816,11 +807,6 @@ <translation id="3660562134618097814">Transfereix les galetes del proveïdor d'identitat SAML durant l'inici de sessió</translation> <translation id="3709266154059827597">Configura la llista negra d'instal·lació d'extensions</translation> <translation id="3711895659073496551">Suspèn</translation> -<translation id="3715448429089775791">Força l'activació del mode de seguretat de YouTube i impedeix que els usuaris canviïn aquesta opció de configuració. - - Si activeu aquesta opció, el mode de seguretat de YouTube està sempre activat. - - Si la desactiveu o no hi establiu cap valor, el mode de seguretat de YouTube no s'aplica.</translation> <translation id="3750220015372671395">Bloqueja la generació de claus en aquests llocs web</translation> <translation id="3756011779061588474">Bloquejar el mode de desenvolupador</translation> <translation id="3758089716224084329">Et permet especificar el servidor intermediari que <ph name="PRODUCT_NAME" /> utilitza i impedeix que els usuaris en canviïn la configuració. @@ -1976,12 +1962,6 @@ Els identificadors de tipus de connexió reconeguts són "ethernet", "wifi", "wimax", "bluetooth" i "xarxes mòbils".</translation> <translation id="7763614521440615342">Mostra suggeriments de contingut a la pàgina Pestanya nova</translation> -<translation id="7766336524667238790">Ofereix informació de la sessió de quiosc activa, com ara - l'identificador i la versió de l'aplicació. - - Si la política s'estableix en "false", no s'ofereix informació - de la sessió. Si s'estableix en "true" o no s'estableix, s'ofereix informació - de la sessió.</translation> <translation id="7774768074957326919">Utilitza la configuració del servidor intermediari del sistema</translation> <translation id="7775831859772431793">Permet especificar l'URL del servidor intermediari. @@ -2204,6 +2184,10 @@ <translation id="8369602308428138533">Retard de la desactivació de pantalla quan s'utilitza alimentació</translation> <translation id="8382184662529825177">Activa l'ús del testimoni remot del contingut protegit al dispositiu.</translation> <translation id="838870586332499308">Activa la itinerància de dades</translation> +<translation id="8390049129576938611">Desactiva el lector de PDF intern a <ph name="PRODUCT_NAME" />. En el seu lloc, tracta els fitxers PDF com una baixada i permet que l'usuari els obri amb l'aplicació predeterminada. + + Si aquesta política es deixa sense establir o es desactiva, s'utilitzarà el connector de PDF per obrir aquest tipus de fitxers (tret que l'usuari el desactivi).</translation> +<translation id="8402079500086185021">Obre sempre els fitxers PDF amb una altra aplicació</translation> <translation id="8412312801707973447">Si es realitzen comprovacions OCSP/CRL en línia</translation> <translation id="8413348101535146315">Permet finalitzar processos al gestor de tasques de <ph name="PRODUCT_NAME" />. @@ -2226,17 +2210,6 @@ Per veure exemples de patrons, consulteu l'enllaç https://www.chromium.org/developers/how-tos/chrome-frame-getting-started.</translation> <translation id="8493645415242333585">Desactiva el desament de l'historial de navegació</translation> <translation id="8499172469244085141">Configuració predeterminada (els usuaris la poden sobreescriure)</translation> -<translation id="8501011084242226370">Especifica una llista de connectors que l'usuari pot activar o desactivar a <ph name="PRODUCT_NAME" />. - - Els caràcters comodí "*" i "?" es poden utilitzar per cercar coincidències amb seqüències de caràcters arbitraris. "*" equival a un nombre arbitrari de caràcters, mentre que "?" especifica un sol caràcter opcional, és a dir, coincideix amb un caràcter o no coincideix amb cap caràcter. El caràcter d'escapada és "\". Per tant, per coincidir amb els caràcters "*", "?" o "\", podeu col·locar-hi "\" al davant. - - Si activeu aquesta configuració, la llista de connectors especificada es pot utilitzar a <ph name="PRODUCT_NAME" />. Els usuaris els poden activar o desactivar a "about:plugins", encara que el connector també coincideixi amb un patró de DisabledPlugins. Els usuaris també poden activar i desactivar connectors que no coincideixin amb cap patró de DisabledPlugins, de DisabledPluginsExceptions i d'EnabledPlugins. - - La finalitat d'aquesta política és permetre crear llistes negres estrictes de connectors en què la llista "DisabledPlugins" contingui entrades amb comodins, com ara desactivar tots els connectors ("*") o desactivar tots els connectors Java ("*Java*"), però on l'administrador vulgui activar-ne una versió concreta, com ara "IcedTea Java 2.3". Aquesta versió concreta es pot especificar en aquesta política. - - Tingueu en compte que cal eximir tant el nom del connector com el nom del grup del connector. Cada grup de connectors es mostra en una secció independent a "about:plugins"; cada secció pot tenir un o més connectors. Per exemple, el connector "Shockwave Flash" pertany al grup "Adobe Flash Player" i tots dos noms han de tenir una coincidència a la llista d'excepcions si cal eximir el connector de la llista negra. - - Si aquesta política es deixa sense configurar, els connectors que coincideixin amb els patrons de "DisabledPlugins" es bloquejaran i es desactivaran i l'usuari no podrà activar-los.</translation> <translation id="8519264904050090490">URL d'excepcions manuals d'usuari gestionat</translation> <translation id="8544375438507658205">Renderitzador HTML predeterminat per a <ph name="PRODUCT_FRAME_NAME" /></translation> <translation id="8549772397068118889">Mostra un advertiment quan es visitin llocs no inclosos en paquets de contingut.</translation> @@ -2271,15 +2244,6 @@ Separeu els diversos noms de servidor amb comes. Es permet l'ús de comodins (*). Si deixeu aquesta política sense definir, <ph name="PRODUCT_NAME" /> provarà de detectar si un servidor es troba a la intranet i, en aquest cas, respondrà a les sol·licituds IWA. Si es detecta un servidor com a Internet, aleshores <ph name="PRODUCT_NAME" /> ometrà les sol·licituds IWA que enviï.</translation> -<translation id="8668394701842594241">Especifica una llista de connectors que s'activen a <ph name="PRODUCT_NAME" /> i impedeix que els usuaris canviïn aquesta configuració. - - Els caràcters comodí "*" i "?" es poden utilitzar per fer que coincideixin amb seqüències de caràcters arbitraris. "*" coincideix amb un nombre arbitrari de caràcters mentre que "?" especifica un únic caràcter opcional, és a dir, coincideix amb els caràcters zero i 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 "\" a davant. - - La llista determinada de connectors sempre s'utilitza a <ph name="PRODUCT_NAME" /> si estan instal·lats. Els connectors es marquen com a activats a "about:plugins" i els usuaris no els poden desactivar. - - Tingueu en compte que aquesta política substitueix tant DisabledPlugins com DisabledPluginsExceptions. - - Si no es defineix aquesta política, l'usuari podrà desactivar qualsevol connector instal·lat al sistema.</translation> <translation id="8672321184841719703">Versió objectiu de l'actualització automàtica</translation> <translation id="868068801094828689">Permet l'enviament d'informes anònims a Google sobre dades d'errors i d'ús relacionades amb <ph name="PRODUCT_NAME" /> i impedeix que els usuaris modifiquin aquesta opció. @@ -2351,13 +2315,6 @@ Si aquesta política s'estableix en "false", el dispositiu no prova de contactar amb Quirks Server per baixar els fitxers de configuració. Si s'estableix en "true" o no s'estableix, <ph name="PRODUCT_OS_NAME" /> contacta automàticament amb el Quirks Server, baixa els fitxers de configuració, si estan disponibles, i els emmagatzema al dispositiu. Aquests fitxers es poden utilitzar, per exemple, per millorar la qualitat dels monitors connectats.</translation> -<translation id="8905426178924715309">Aquesta política està obsoleta; substituïu-la per ForceGoogleSafeSearch i per ForceYouTubeSafetyMode. S'ignorarà si ForceGoogleSafeSearch o ForceYouTubeSafetyMode estan establertes. - - Força que les consultes de la Cerca web de Google es facin amb la funció SafeSearch activada i impedeix que els usuaris canviïn aquesta opció de configuració. Aquesta opció també força el mode de seguretat a YouTube. - - Si activeu aquesta opció, SafeSearch estarà sempre activa a la Cerca de Google i a YouTube. - - Si desactiveu aquesta opció o si no hi establiu cap valor, SafeSearch no s'aplicarà a la Cerca de Google ni a YouTube.</translation> <translation id="8906768759089290519">Activa el mode de convidat</translation> <translation id="8908294717014659003">Us permet decidir si els llocs web poden accedir als vostres dispositius de captura multimèdia. Es pot proporcionar accés als dispositius de captura multimèdia de manera predeterminada o demanar permís a l'usuari cada vegada que un lloc web vol accedir als dispositius de captura multimèdia.
diff --git a/components/policy/resources/policy_templates_cs.xtb b/components/policy/resources/policy_templates_cs.xtb index d17f8745..dc61297 100644 --- a/components/policy/resources/policy_templates_cs.xtb +++ b/components/policy/resources/policy_templates_cs.xtb
@@ -191,15 +191,6 @@ 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 „\“. - - Pokud toto nastavení aktivujete, pluginy uvedené v seznamu nebudou v aplikaci <ph name="PRODUCT_NAME" /> nikdy použity. Na stránce about:plugins se pluginy zobrazí jako deaktivované a uživatelé je nebudou moci aktivovat. - - Tuto zásadu lze přepsat pomocí zásad EnabledPlugins a DisabledPluginsExceptions. - - Pokud zásadu nenastavíte, mohou uživatelé používat všechny pluginy nainstalované v systému, kromě pluginů nekompatibilních, zastaralých nebo nebezpečných.</translation> <translation id="1864269674877167562">Pokud tato zásada není nastavena nebo je nastavena na prázdný textový řetězec, <ph name="PRODUCT_OS_NAME" /> během procesu přihlášení nezobrazí možnost automatického doplňování. Pokud je tato zásada nastavena na textový řetězec, který představuje název domény, <ph name="PRODUCT_OS_NAME" /> během procesu přihlášení zobrazí možnost automatického doplňování a uživatel bude moci zadat pouze uživatelské jméno bez přípony s názvem domény. Příponu s názvem domény uživatel bude moci přepsat.</translation> <translation id="1865417998205858223">Klíčová oprávnění</translation> @@ -829,11 +820,6 @@ <translation id="3660562134618097814">Přenos souborů cookie od poskytovatele identity SAML při přihlášení</translation> <translation id="3709266154059827597">Konfigurace seznamu zakázaných položek instalace rozšíření</translation> <translation id="3711895659073496551">Pozastavit</translation> -<translation id="3715448429089775791">Vynutí aktivaci Bezpečného režimu YouTube a brání uživatelům, aby toto nastavení změnili. - -Pokud toto nastavení aktivujete, Bezpečný režim na YouTube bude vždy aktivní. - -Pokud toto nastavení deaktivujete nebo ho ponecháte nenastavené, Bezpečný režim YouTube vynucen nebude.</translation> <translation id="3750220015372671395">Blokovat generování klíčů na těchto stránkách</translation> <translation id="3756011779061588474">Blokovat režim pro vývojáře</translation> <translation id="3758089716224084329">Umožňuje zadat proxy server, který bude prohlížeč <ph name="PRODUCT_NAME" /> používat, a brání uživatelům ve změně nastavení proxy serveru. @@ -2068,9 +2054,6 @@ <translation id="7763479091692861127"> Typy připojení, které lze používat pro aktualizaci operačního systému. Aktualizace operačního systému může vzhledem k objemu dat velmi zatěžovat připojení a může mít za následek dodatečné poplatky. Z tohoto důvodu jsou ve výchozím nastavení zakázány pro typy připojení, které jsou považovány za nákladné, což je v současnosti mimo jiné připojení WiMax, Bluetooth nebo mobilní připojení. Podporované identifikátory typu připojení jsou „ethernet“, „wifi“, „wimax“, „bluetooth“ a „cellular“.</translation> <translation id="7763614521440615342">Zobrazovat na stránce Nová karta návrhy obsahu</translation> -<translation id="7766336524667238790">Hlášení informací o aktivní relaci veřejného terminálu, např. ID a verze aplikace. - -Pokud je tato zásada nastavena na hodnotu False, informace o relaci se hlásit nebudou. Pokud je nastavena na hodnotu True nebo nastavena není, informace o relaci se hlásit budou.</translation> <translation id="7774768074957326919">Použít systémová nastavení proxy serveru</translation> <translation id="7775831859772431793">Zde můžete zadat adresu URL proxy serveru. @@ -2294,6 +2277,10 @@ <translation id="8369602308428138533">Prodleva vypnutí obrazovky při napájení ze sítě</translation> <translation id="8382184662529825177">Povolit použití vzdáleného ověření identity k ochraně obsahu v zařízení</translation> <translation id="838870586332499308">Povolit datový roaming</translation> +<translation id="8390049129576938611">Zakáže v prohlížeči <ph name="PRODUCT_NAME" /> interní prohlížeč souborů PDF. Soubory PDF se budou stahovat a uživatel je bude moci otevřít ve výchozí aplikaci. + + Pokud tuto zásadu ponecháte nenastavenou nebo deaktivovanou, budou se soubory PDF otevírat pomocí pluginu PDF (pokud jej uživatel nezakáže).</translation> +<translation id="8402079500086185021">Soubory PDF otevírat vždy externě</translation> <translation id="8412312801707973447">Zda se budou provádět online kontroly OCSP/CRL</translation> <translation id="8413348101535146315">Umožňuje ukončování procesů ve Správci úloh prohlížeče <ph name="PRODUCT_NAME" />. @@ -2314,17 +2301,6 @@ Ukázkové vzory naleznete na stránce https://www.chromium.org/developers/how-tos/chrome-frame-getting-started.</translation> <translation id="8493645415242333585">Deaktivovat ukládání historie prohlížeče</translation> <translation id="8499172469244085141">Výchozí nastavení (uživatelé mohou zásady přepsat)</translation> -<translation id="8501011084242226370">Určuje seznam pluginů, které uživatel v <ph name="PRODUCT_NAME" /> může povolit nebo zakázat. - - Zástupnými znaky „*“ a „?“ lze nahradit sekvenci libovolných znaků.Znak „*“ odpovídá libovolnému počtu znaků a znak „?“ určuje jeden volitelný znak (tj. odpovídá jednomu nebo žádnému znaku). Řídicí znak je „\“, pokud tedy chcete hledat skutečné znaky „*“ nebo „?“, musíte před ně vložit znak „\“. - - Pokud toto nastavení aktivujete, specifikovaný seznam pluginů může být v <ph name="PRODUCT_NAME" /> použit. Uživatelé mohou plugin aktivovat nebo deaktivovat na stránce about:plugins i v případě, že odpovídá vzoru v seznamu DisabledPlugins. Uživatelé mohou také aktivovat a deaktivovat pluginy, které neodpovídají žádnému vzoru v seznamu DisabledPlugins, DisabledPluginsExceptions ani EnabledPlugins - - Táto zásada má umožnit striktní zakázání pluginů tam, kde seznam DisabledPlugins obsahuje zástupné znaky, jako například deaktivovat všechny pluginy „*“ nebo deaktivovat všechny pluginy Java „'*Java*“, avšak správce chce určité verze povolit (například „IcedTea Java 2.3“). Tuto konkrétní verzi lze určit v této zásadě. - - Upozorňujeme, že je třeba zadat výjimku pro název pluginu i pro název skupiny pluginů. Jednotlivé skupiny pluginů se na stránce about:plugins zobrazují v samostatných sekcích a každá sekce může obsahovat jeden nebo více pluginů. Plugin Shockwave Flash například patří do skupiny Adobe Flash Player. Pokud má být vyloučen ze seznamu zakázaných, musí být v seznamu výjimek uvedeny oba názvy. - - Pokud tato zásada není nastavena, bude jakýkoliv plugin, který odpovídá vzoru v seznamu DisabledPlugins, uzamčen jako deaktivovaný a uživatelé jej nebudou moci aktivovat.</translation> <translation id="8519264904050090490">Adresy URL ručních výjimek spravovaného uživatele</translation> <translation id="8544375438507658205">Výchozí modul vykreslení HTML pro plugin <ph name="PRODUCT_FRAME_NAME" /></translation> <translation id="8549772397068118889">Při návštěvě webů mimo obsahové balíčky zobrazit upozornění</translation> @@ -2349,15 +2325,6 @@ Chcete-li zadat několik názvů serverů, oddělte je čárkami. Zástupné znaky (*) jsou povoleny. Pokud zásada zůstane nenastavena, pokusí se <ph name="PRODUCT_NAME" /> zjistit, zda se server nachází v intranetu, a teprve poté bude reagovat na požadavky IWA. Pokud bude server zjištěn jako internet, bude <ph name="PRODUCT_NAME" /> požadavky IWA ignorovat.</translation> -<translation id="8668394701842594241">Určuje seznam aktivovaný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 „\“. - - Pokud jsou pluginy uvedené v seznamu nainstalovány, budou v aplikaci <ph name="PRODUCT_NAME" /> vždy použity. Na stránce about:plugins jsou tyto pluginy označeny jako aktivní a uživatelé je nemohou deaktivovat. - - Tato zásada přepisuje zásady DisabledPlugins a DisabledPluginsExceptions. - - Pokud zásadu nenastavíte, mohou uživatelé deaktivovat jakékoliv pluginy nainstalované v systému.</translation> <translation id="8672321184841719703">Cílová verze automatické aktualizace</translation> <translation id="868068801094828689">Aktivuje anonymní odesílání údajů o využití a selhání prohlížeče <ph name="PRODUCT_NAME" /> společnosti Google a brání uživatelům, aby toto nastavení změnili. @@ -2440,13 +2407,6 @@ Pokud tuto zásadu nenakonfigurujete nebo nastavíte na hodnotu True, systém <ph name="PRODUCT_OS_NAME" /> bude sever Quirks automaticky kontaktovat, stahovat z něj dostupné konfigurační soubory a ukládat je do zařízení.Tyto soubory mohou sloužit například k vylepšení kvality zobrazení na připojených monitorech.</translation> -<translation id="8905426178924715309">Podpora této zásady byla ukončena, použijte namísto ní zásady ForceGoogleSafeSearch a ForceYouTubeSafetyMode. Pokud je nastavena zásada ForceGoogleSafeSearch nebo ForceYouTubeSafetyMode, tato zásada bude ignorována. - -Vynutí, aby se při použití Vyhledávání Google vždy aktivovalo Bezpečné vyhledávání, a zabrání uživatelům toto nastavení změnit. Toto nastavení také vynutí bezpečný režim na YouTube. - -Pokud toto nastavení aktivujete, Bezpečné prohlížení ve Vyhledávání Google a na YouTube bude vždy aktivní. - -Pokud toto nastavení deaktivujete nebo nenastavíte žádnou hodnotu, Bezpečné vyhledávání nebude ve Vyhledávání Google a na YouTube vynucováno.</translation> <translation id="8906768759089290519">Aktivovat režim hosta</translation> <translation id="8908294717014659003">Umožňuje nastavit, zda webové stránky smějí používat zařízení pro pořizování mediálního obsahu. Přístup k zařízením pro pořizování mediálního obsahu může být povolen ve výchozím nastavení, nebo se uživateli může zobrazit dotaz pokaždé, když nějaké webové stránky budou chtít použít zařízení pro pořízení mediálního obsahu.
diff --git a/components/policy/resources/policy_templates_da.xtb b/components/policy/resources/policy_templates_da.xtb index 3a1aa8d..c87b04a7b 100644 --- a/components/policy/resources/policy_templates_da.xtb +++ b/components/policy/resources/policy_templates_da.xtb
@@ -207,15 +207,6 @@ 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. - - Hvis du aktiverer denne indstilling, anvendes den angivne liste over plugins aldrig i <ph name="PRODUCT_NAME" />. Plugins er markeret som deaktiveret i "about:plugins", og brugerne kan ikke aktivere dem. - - Bemærk, at denne politik kan tilsidesættes af EnabledPlugins og DisabledPluginsExceptions. - - Hvis denne politik ikke angives, kan brugeren bruge alle de plugins, der er installeret i systemet, med undtagelse af hardcodede inkompatible, forældede eller farlige plugins.</translation> <translation id="1864269674877167562">Hvis denne politik er angivet med en tom streng, eller hvis den ikke er konfigureret, viser <ph name="PRODUCT_OS_NAME" /> ikke et forslag til autofuldførelse under loginflowet. Hvis denne politik er angivet med en streng, der repræsenterer et domænenavn, viser <ph name="PRODUCT_OS_NAME" /> et forslag til autofuldførelse under loginflowet. Dette giver brugeren mulighed for kun at skulle angive sit brugernavn uden hele domænenavnet. Brugeren kan overskrive dette domænenavn.</translation> <translation id="1865417998205858223">Vigtige tilladelser</translation> @@ -822,11 +813,6 @@ <translation id="3660562134618097814">Overfør SAML-IdP-cookies ved login</translation> <translation id="3709266154059827597">Konfigurer sortliste for installation af udvidelser</translation> <translation id="3711895659073496551">Suspender</translation> -<translation id="3715448429089775791">Gennemtvinger aktivering af Beskyttet tilstand på YouTube og forhindrer, at brugerne kan ændre denne indstilling. - - Hvis du aktiverer denne indstilling, er Beskyttet tilstand på YouTube altid aktiveret. - - Hvis du deaktiverer denne indstilling eller ikke indstiller en værdi, gennemtvinges Beskyttet tilstand på YouTube ikke.</translation> <translation id="3750220015372671395">Bloker nøglegenerering på disse websites</translation> <translation id="3756011779061588474">Bloker udviklertilstand</translation> <translation id="3758089716224084329">Giver dig mulighed for at angive den proxyserver, der anvendes af <ph name="PRODUCT_NAME" />, og forhindrer brugerne i at ændre proxyindstillingerne. @@ -1998,12 +1984,6 @@ De genkendte forbindelsestype-id'er er "ethernet", "wifi", "wimax", "bluetooth" og "mobil".</translation> <translation id="7763614521440615342">Vis forslag til indhold på siden Ny fane</translation> -<translation id="7766336524667238790">Rapportér oplysninger om aktive terminalsessioner, f.eks. - applikations-id og -version. - - Hvis politikken er sat til falsk, rapporteres terminaloplysningerne - ikke. Hvis den angives til sand eller ikke angives, rapporteres - terminaloplysningerne.</translation> <translation id="7774768074957326919">Brug systemets proxyindstillinger</translation> <translation id="7775831859772431793">Du kan angive webadressen til proxyserveren her. @@ -2220,6 +2200,10 @@ <translation id="8369602308428138533">Skærmslukforsinkelse, når strømforsyning er tilsluttet</translation> <translation id="8382184662529825177">Aktivér brug af fjernattestering til indholdsbeskyttelse for enheden.</translation> <translation id="838870586332499308">Aktivér dataroaming</translation> +<translation id="8390049129576938611">Deaktiverer den interne PDF-fremviser i <ph name="PRODUCT_NAME" />. Behandler den i stedet som download og gør det muligt for brugeren at åbne PDF-filer via standardapplikationen. + + Hvis politikken ikke angives, eller hvis den deaktiveres, anvendes PDF-pluginnet til at åbne PDF-filer, medmindre brugeren deaktiverer pluginnet.</translation> +<translation id="8402079500086185021">Åbn altid PDF-filer eksternt</translation> <translation id="8412312801707973447">Om der udføres online kontrol af OCSP/CRL</translation> <translation id="8413348101535146315">Aktiverer mulighed for at afslutte processer i Jobliste for <ph name="PRODUCT_NAME" />. @@ -2240,17 +2224,6 @@ Se eksempler på mønstre på https://www.chromium.org/developers/how-tos/chrome-frame-getting-started.</translation> <translation id="8493645415242333585">Deaktiver lagring af browserhistorik</translation> <translation id="8499172469244085141">Standardindstillinger (brugere kan tilsidesætte)</translation> -<translation id="8501011084242226370">Angiver en liste over plugins, som brugeren kan aktivere eller deaktivere i <ph name="PRODUCT_NAME" />. - - Jokertegnene "*" og "?" kan bruges til at matche sekvenser af vilkårlige tegn. "*" matcher et vilkårligt antal tegn, mens "?" angiver et enkelt vilkårligt tegn, dvs. det matcher nuller og ettaller. Escape-tegnet er "\". Hvis du vil matche de egentlige "*"-, "?" eller "\"-tegn, skal du angive et "\" foran dem. - - Hvis du aktiverer denne indstilling, kan den angivne liste over plugins anvendes i <ph name="PRODUCT_NAME" />. Brugerne kan aktivere eller deaktivere dem i "about:plugins", selv hvis pluginnet også matcher DisabledPlugins. Brugerne kan også aktivere og deaktivere plugins, der ikke matcher nogen mønstre i DisabledPlugins, DisabledPluginsExceptions og EnabledPlugins. - - Denne politik har til formål at tillade, at plugins sortlistes konsekvent, hvis listen "DisabledPlugins" indeholder poster med jokertegn, f.eks. deaktiver alle plugins "*" eller deaktiver alle Java-plugins "*Java*", men administratoren ønsker at aktivere nogle bestemte versioner som f.eks. "IcedTea Java 2.3". Disse specifikke versioner kan angives i denne politik. - - Bemærk, at både pluginnavnet og gruppenavnet for pluginnet skal fritages. De enkelte plugingrupper er angivet i en særskilt sektion i about:plugins, og hver enkel sektion kan indeholde ét eller flere plugins. Pluginnet "Shockwave Flash" tilhører f.eks. gruppen "Adobe Flash Player", og begge navne skal matche en angivelse på listen over fritagelser, hvis det pågældende plugin skal fritages fra sortlisten. - - Hvis denne politik ikke er indstillet, vil de plugins, der matcher mønstrene i "DisabledPlugins", blive låst som deaktiveret, og brugeren vil ikke være i stand til at aktivere dem.</translation> <translation id="8519264904050090490">Webadresser for manuel undtagelse af administreret bruger</translation> <translation id="8544375438507658205">Standard HTML-gengivelse for <ph name="PRODUCT_FRAME_NAME" /></translation> <translation id="8549772397068118889">Vis en advarsel, når du er på websites uden for indholdspakkerne</translation> @@ -2287,15 +2260,6 @@ Adskil servernavne med kommaer. Jokertegn (*) er tilladt. Hvis denne politik ikke indstilles, prøver <ph name="PRODUCT_NAME" /> at registrere, om der er en server på intranettet, og kun i det tilfælde reageres der på IWA-anmodninger. Hvis en server registreres som internet, ignoreres IWA-anmodninger af <ph name="PRODUCT_NAME" />.</translation> -<translation id="8668394701842594241">Angiver en liste over plugins, som er aktiveret i <ph name="PRODUCT_NAME" /> og forhindrer brugerne i at ændre indstillingen. - - Jokertegnene "*" og "?" kan bruges til at matche sekvenser af vilkårlige tegn. "*" kan matche et vilkårligt antal tegn, mens "?" angiver en et bestemt tegn efter eget valg, f.eks. tegnene 0 eller 1. Flugttegnet er "\", så du kan matche tegnene "*", "?" eller "\" ved at sætte "\" foran dem. - - Den angivne liste over plugins anvendes altid i <ph name="PRODUCT_NAME" />, hvis dette er installeret. Plugins er markeret som aktiveret i "about:plugins", og brugerne kan ikke deaktivere dem. - - Bemærk, at denne politik tilsidesætter både DisabledPlugins og DisabledPluginsExceptions. - - Hvis denne politik ikke er angivet, kan brugeren deaktivere alle plugins, der er installeret i systemet.</translation> <translation id="8672321184841719703">Målversion for automatiske opdateringer</translation> <translation id="868068801094828689">Aktiverer anonym rapportering af brugs- og nedbrudsrelaterede data om <ph name="PRODUCT_NAME" /> til Google og forhindrer brugerne i at ændre denne indstilling. @@ -2385,13 +2349,6 @@ automatisk Quirks Server og downloader konfigurationsfiler, hvis de er tilgængelige, som derefter gemmes på enheden. Sådanne filer kan f.eks. anvendes til at forbedre kvaliteten af visningen af tilsluttede skærme.</translation> -<translation id="8905426178924715309">Denne politik er udfaset. Brug ForceGoogleSafeSearch og ForceYouTubeSafetyMode i stedet. Denne politik ignoreres, hvis en af politikkerne ForceGoogleSafeSearch eller ForceYouTubeSafetyMode er angivet. - - Gennemtvinger, at forespørgsler i Google Websøgning udføres med Beskyttet søgning slået til, og forhindrer brugere i at ændre denne indstilling. Denne indstilling gennemtvinger også Beskyttet tilstand på YouTube. - - Hvis du aktiverer denne indstilling, vil Beskyttet søgning i Google Søgning og på YouTube altid være aktiv. - - Hvis du deaktiverer denne indstilling eller ikke angiver en værdi, håndhæves Beskyttet søgning i Google Søgning og på YouTube ikke.</translation> <translation id="8906768759089290519">Aktivér gæstetilstand</translation> <translation id="8908294717014659003">Giver dig mulighed for at angive, om websites skal have adgang til optageenheder. Der kan gives adgang til optageenheder som standard, eller brugeren kan blive spurgt, hver gang et website ønsker at få adgang til optageenheder.
diff --git a/components/policy/resources/policy_templates_de.xtb b/components/policy/resources/policy_templates_de.xtb index bfc995e..964c29b 100644 --- a/components/policy/resources/policy_templates_de.xtb +++ b/components/policy/resources/policy_templates_de.xtb
@@ -191,15 +191,6 @@ 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. - - Wenn Sie diese Einstellung aktivieren, werden die Plug-ins der angegebenen Liste in <ph name="PRODUCT_NAME" /> nicht verwendet. Die Plug-ins sind in "about:plugins" als deaktiviert markiert und können von Nutzern nicht aktiviert werden. - - Beachten Sie, dass diese Richtlinie sowohl von "EnabledPlugins" als auch "DisabledPluginsExceptions" außer Kraft gesetzt werden kann. - - Ist die Richtlinie nicht konfiguriert, können Nutzer beliebige auf dem System installierte Plug-ins verwenden. Ausnahmen sind hartcodierte, inkompatible, veraltete und gefährliche Plug-ins.</translation> <translation id="1864269674877167562">Wenn diese Richtlinie nicht konfiguriert ist oder ein leerer String dafür festgelegt ist, zeigt <ph name="PRODUCT_OS_NAME" /> keine Option für die automatische Vervollständigung beim Anmeldevorgang an. Wenn die Richtlinie für einen String festgelegt ist, der einen Domainnamen darstellt, zeigt <ph name="PRODUCT_OS_NAME" /> eine Option für die automatische Vervollständigung beim Anmeldevorgang des Nutzers an, sodass er seinen Namen ohne die Domain-Namenserweiterung eingeben kann. Der Nutzer kann diese Domain-Namenserweiterung überschreiben.</translation> <translation id="1865417998205858223">Hauptberechtigungen</translation> @@ -802,11 +793,6 @@ <translation id="3660562134618097814">SAML-IdP-Cookies bei der Anmeldung übertragen</translation> <translation id="3709266154059827597">Schwarze Liste für Installation von Erweiterungen konfigurieren</translation> <translation id="3711895659073496551">Suspend-Modus</translation> -<translation id="3715448429089775791">Erzwingt die Aktivierung des YouTube-Sicherheitsmodus und verhindert, dass diese Einstellung von den Nutzern geändert werden kann - - Wenn Sie diese Einstellung aktivieren, ist der Sicherheitsmodus auf YouTube immer aktiv. - - Wenn Sie diese Einstellung deaktivieren oder keinen Wert festlegen, wird der Sicherheitsmodus auf YouTube nicht erzwungen.</translation> <translation id="3750220015372671395">Schlüsselgenerierung auf diesen Websites blockieren</translation> <translation id="3756011779061588474">Entwicklermodus blockieren</translation> <translation id="3758089716224084329">Ermöglicht Ihnen, den von <ph name="PRODUCT_NAME" /> verwendeten Proxy-Server anzugeben, und verhindert, dass Nutzer die Proxy-Einstellungen ändern. @@ -1807,7 +1793,7 @@ <translation id="7260277299188117560">P2P für automatische Updates aktivieren</translation> <translation id="7267809745244694722">Medientasten standardmäßig als Funktionstasten verwenden</translation> <translation id="7271085005502526897">Startseite bei erster Ausführung aus Standardbrowser importieren</translation> -<translation id="7273823081800296768">Wenn diese Einstellung aktiviert oder nicht konfiguriert ist, kann der Nutzer beim Herstellen der Verbindung ein Pairing von Clients und Hosts durchführen. Dadurch braucht nicht jedes Mal eine PIN eingegeben zu werden. +<translation id="7273823081800296768">Wenn diese Einstellung aktiviert oder nicht konfiguriert ist, kann der Nutzer beim Herstellen der Verbindung Clients und Hosts koppeln. Dadurch braucht nicht jedes Mal eine PIN eingegeben zu werden. Bei Deaktivierung dieser Einstellung ist diese Funktion nicht verfügbar.</translation> <translation id="7275334191706090484">Verwaltete Lesezeichen</translation> @@ -1967,12 +1953,6 @@ Zu den erkannten Verbindungstypkennungen gehören "ethernet", "wifi", "wimax", "bluetooth" und "cellular".</translation> <translation id="7763614521440615342">Inhaltsvorschläge auf der "Neuer Tab"-Seite anzeigen</translation> -<translation id="7766336524667238790">Durch diese Richtlinie werden Informationen zur aktiven Kiosksitzung gesendet, etwa - Anwendungs-ID und -version. - - Wenn für die Richtlinie "false" festgelegt wird, werden die Sitzungsinformationen - nicht gesendet. Wird für die Richtlinie "true" festgelegt oder wird sie nicht konfiguriert, - werden Sitzungsinformationen gesendet.</translation> <translation id="7774768074957326919">System-Proxy-Einstellungen verwenden</translation> <translation id="7775831859772431793">Hier können Sie die URL des Proxyservers angeben. @@ -2184,6 +2164,10 @@ <translation id="8369602308428138533">Verzögerung für die Bildschirmabschaltung im Netzbetrieb</translation> <translation id="8382184662529825177">Verwendung von Remote-Bescheinigung (Remote Attestation) zum Schutz von Inhalten für das Gerät aktivieren</translation> <translation id="838870586332499308">Daten-Roaming aktivieren</translation> +<translation id="8390049129576938611">Deaktiviert den internen PDF-Viewer in <ph name="PRODUCT_NAME" />. Stattdessen werden PDF-Dateien als Download behandelt und der Nutzer kann sie mit der Standard-Anwendung öffnen. + + Wenn diese Richtlinie deaktiviert oder nicht eingestellt ist, wird zum Öffnen von PDF-Dateien das PDF-Plug-in genutzt, sofern der Nutzer es nicht deaktiviert.</translation> +<translation id="8402079500086185021">PDF-Dateien immer extern öffnen</translation> <translation id="8412312801707973447">Ob online OCSP-/CRL-Prüfungen durchgeführt werden</translation> <translation id="8413348101535146315">Ermöglicht das Beenden von Prozessen im Task-Manager von <ph name="PRODUCT_NAME" />. @@ -2204,17 +2188,6 @@ Beispielmuster finden Sie unter https://www.chromium.org/developers/how-tos/chrome-frame-getting-started.</translation> <translation id="8493645415242333585">Speichern des Browserverlaufs deaktivieren</translation> <translation id="8499172469244085141">Standardeinstellungen (können vom Nutzer überschrieben werden)</translation> -<translation id="8501011084242226370">Gibt eine Liste von Plug-ins an, die der Nutzer in <ph name="PRODUCT_NAME" /> aktivieren oder deaktivieren kann. - - Die Platzhalterzeichen "*" und "?" können verwendet werden, um beliebige Zeichenfolgen zuzuordnen. "*" entspricht einer beliebigen Anzahl von Zeichen, während "?" ein optionales einzelnes Zeichen darstellt (kein oder ein Zeichen). Als Escape-Zeichen wird "\" verwendet. Dieses können Sie vor "*" oder "?" setzen, um nach diesen Zeichen (Sternchen bzw. Fragezeichen) zu suchen. - - Wenn Sie diese Einstellung aktivieren, kann die angegebene Liste von Plug-ins in <ph name="PRODUCT_NAME" /> verwendet werden. Nutzer können diese in "about:plugins" aktivieren oder deaktivieren, selbst wenn das Plug-in auch mit einem Muster in DisabledPlugins übereinstimmt. Zudem können Nutzer Plug-ins aktivieren oder deaktivieren, die mit keinen Mustern in DisabledPlugins, DisabledPluginsExceptions und EnabledPlugins übereinstimmen. - - Diese Richtlinie soll einen strengen Ausschluss von Plug-ins ermöglichen. Dabei enthält die Liste "DisabledPlugins" Platzhaltereinträge wie "*" zur Deaktivierung aller Plug-ins oder "*Java*" zur Deaktivierung aller Java-Plug-ins. Der Administrator kann jedoch bestimmte Versionen wie "IcedTea Java 2.3" aktivieren. Diese spezifischen Versionen können in dieser Richtlinie festgelegt werden. - - Beachten Sie, dass sowohl der Plug-in-Name als auch der Plug-in-Gruppenname ausgenommen werden müssen. Jede Plug-in-Gruppe wird in einem separaten Abschnitt unter "about:plugins" angezeigt. Jeder Abschnitt kann ein oder mehrere Plug-ins enthalten. So gehört beispielsweise das Plug-in "Shockwave Flash" der Gruppe "Adobe Flash Player" an. Wenn dieses Plug-in von der schwarzen Liste ausgenommen werden soll, muss in der Ausnahmeliste für beide Namen eine Übereinstimmung vorhanden sein. - - Wird diese Richtlinie nicht konfiguriert, werden alle Plug-ins, die mit den Mustern in "DisabledPlugins" übereinstimmen, als deaktiviert gesperrt. Sie können dann nicht vom Nutzer aktiviert werden.</translation> <translation id="8519264904050090490">Manuell festgelegte Ausnahme-URLs für verwalteten Nutzer</translation> <translation id="8544375438507658205">Standardanwendung für HTML-Darstellung in <ph name="PRODUCT_FRAME_NAME" /></translation> <translation id="8549772397068118889">Vor dem Besuch von Websites außerhalb von Inhaltspaketen warnen</translation> @@ -2250,7 +2223,6 @@ Fügen Sie zwischen den verschiedenen Servernamen ein Komma als Trennzeichen ein. Platzhalter (*) sind zulässig. Wenn Sie diese Richtlinie nicht konfigurieren, versucht <ph name="PRODUCT_NAME" /> zu ermitteln, ob der fragliche Server sich im Intranet befindet, und reagiert nur dann auf IWA-Anfragen. Wenn der Server sich dagegen im Internet befindet, werden dessen IWA-Anfragen von <ph name="PRODUCT_NAME" /> ignoriert.</translation> -<translation id="8668394701842594241">Gibt eine Liste von Plug-ins an, die in <ph name="PRODUCT_NAME" /> aktiviert sind, und verhindert, dass Nutzer diese Einstellung ändern. 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. Die angegebene Liste der Plug-ins wird in <ph name="PRODUCT_NAME" /> immer verwendet, wenn sie installiert sind. Die Plug-ins sind in "about:plugins" als aktiv markiert und können von Nutzern nicht deaktiviert werden. Beachten Sie, dass diese Richtlinie sowohl "DisabledPlugins" als auch "DisabledPluginsExceptions" außer Kraft setzt. Wenn die Richtlinie nicht konfiguriert ist, können Nutzer beliebige auf dem System installierte Plug-ins deaktivieren.</translation> <translation id="8672321184841719703">Automatische Aktualisierung auf Zielversion</translation> <translation id="868068801094828689">Ermöglicht die anonyme Meldung von Nutzungs- und Systemabsturzdaten zu <ph name="PRODUCT_NAME" /> an Google und verhindert, dass diese Einstellung von Nutzern geändert werden kann. @@ -2343,13 +2315,6 @@ automatisch den Quirks-Server und lädt Konfigurationsdateien herunter, sofern welche vorhanden sind, und speichert sie auf dem Gerät. Solche Dateien können beispielsweise verwendet werden, um die Displayqualität angeschlossener Monitore zu verbessern.</translation> -<translation id="8905426178924715309">Diese Richtlinie wird nicht mehr angeboten. Verwenden Sie stattdessen "ForceGoogleSafeSearch" und "ForceYouTubeSafetyMode". Die Richtlinie wird ignoriert, wenn entweder "ForceGoogleSafeSearch" oder "ForceYouTubeSafetyMode" festgelegt ist. - - Durch diese Richtlinie wird die Ausführung der Google Websuche mit aktivierter SafeSearch-Funktion erzwungen und verhindert, dass Nutzer die Einstellung ändern. Darüber hinaus wird die Verwendung des sicheren Modus bei YouTube erzwungen. - - Wenn diese Einstellung aktiviert ist, ist SafeSearch in der Google-Suche und bei YouTube immer aktiviert. - - Wenn diese Einstellung deaktiviert ist oder kein Wert festgelegt wurde, wird SafeSearch in der Google-Suche und bei YouTube nicht erzwungen.</translation> <translation id="8906768759089290519">Gastmodus aktivieren</translation> <translation id="8908294717014659003">Hier können Sie festlegen, ob Websites der Zugriff auf Medienaufnahmegeräte erlaubt werden soll. Der Zugriff auf Medienaufnahmegeräte kann standardmäßig zugelassen werden oder Sie können einstellen, dass der Nutzer jedes Mal gefragt wird, wenn eine Website auf Medienaufnahmegeräte zugreifen möchte.
diff --git a/components/policy/resources/policy_templates_el.xtb b/components/policy/resources/policy_templates_el.xtb index 810af64..5feaf1f 100644 --- a/components/policy/resources/policy_templates_el.xtb +++ b/components/policy/resources/policy_templates_el.xtb
@@ -209,15 +209,6 @@ Αν η πολιτική δεν ρυθμιστεί ή οριστεί ως "tls1.2", τότε το <ph name="PRODUCT_NAME" /> δεν εκτελεί πλέον αυτήν την εναλλακτική διαδικασία. Έχετε υπόψη, ότι αυτή η ενέργεια δεν απενεργοποιεί την υποστήριξη για παλαιότερες εκδόσεις TLS, αλλά ορίζει μόνο αν το <ph name="PRODUCT_NAME" /> θα παρακάμπτει τους διακομιστές που περιέχουν σφάλματα και δεν μπορούν να διαπραγματευτούν σωστά τις εκδόσεις. Αλλιώς, αν πρέπει να διατηρηθεί η συμβατότητα με έναν προβληματικό διακομιστή, αυτή η πολιτική μπορεί να οριστεί ως "tls1.1". Αυτή είναι μια πρόχειρη λύση και ο διακομιστής θα πρέπει να διορθωθεί το συντομότερο.</translation> -<translation id="1861037019115362154">Καθορίζει μια λίστα προσθηκών που είναι απενεργοποιημένες στο <ph name="PRODUCT_NAME" /> και αποτρέπει την αλλαγή αυτής της ρύθμισης από τους χρήστες. - - Οι χαρακτήρες μπαλαντέρ "*" και "?" μπορούν να χρησιμοποιηθούν για την αντιστοίχιση ακολουθιών αυθαίρετων χαρακτήρων. Ο χαρακτήρας "*" αντιστοιχεί σε έναν αυθαίρετο αριθμό χαρακτήρων ενώ ο χαρακτήρας "?" προσδιορίζει έναν προαιρετικό μεμονωμένο χαρακτήρα, π.χ. αντιστοιχεί σε μηδέν ή έναν χαρακτήρα. Ο χαρακτήρας διαφυγής είναι το "\", επομένως για να αντιστοιχίσετε τους τρέχοντες χαρακτήρες "*", "?" ή "\", μπορείτε να τοποθετήσετε τον χαρακτήρα "\" πριν από αυτούς. - - Εάν ενεργοποιήσετε αυτή τη ρύθμιση, η προσδιορισμένη λίστα προσθηκών δεν θα χρησιμοποιείται ποτέ στο <ph name="PRODUCT_NAME" />. Οι προσθήκες επισημαίνονται ως απενεργοποιημένες στην περιοχή "σχετικά με:προσθήκες" και οι χρήστες δεν μπορούν να τις ενεργοποιήσουν. - - Λάβετε υπόψη σας ότι αυτή η πολιτική μπορεί να αντικατασταθεί από τα EnabledPlugins και DisabledPluginsExceptions. - - Εάν αυτή η πολιτική δεν οριστεί ο χρήστης μπορεί να χρησιμοποιήσει οποιαδήποτε προσθήκη έχει εγκατασταθεί στο σύστημα εκτός από προσθήκες μόνιμα κωδικοποιημένες ασύμβατες, μη ενημερωμένες ή επικίνδυνες.</translation> <translation id="1864269674877167562">Αν αυτή η πολιτική οριστεί σε κενή συμβολοσειρά ή δεν διαμορφωθεί, το <ph name="PRODUCT_OS_NAME" /> δεν θα εμφανίσει επιλογή αυτόματης συμπλήρωσης κατά τη διάρκεια της ροής σύνδεσης χρήστη. Αν αυτή η πολιτική οριστεί σε συμβολοσειρά που αντιπροσωπεύει κάποιο όνομα τομέα, το <ph name="PRODUCT_OS_NAME" /> θα εμφανίσει μια επιλογή αυτόματης συμπλήρωσης κατά τη διάρκεια της σύνδεσης χρήστη, επιτρέποντας στο χρήστη να πληκτρολογήσει μόνο το όνομα χρήστη χωρίς την επέκταση του ονόματος τομέα. Ο χρήστης θα μπορεί να αντικαταστήσει αυτήν την επέκταση ονόματος τομέα.</translation> <translation id="1865417998205858223">Βασικά δικαιώματα</translation> @@ -860,11 +851,6 @@ <translation id="3660562134618097814">Μεταφορά cookie SAML IdP κατά τη σύνδεση</translation> <translation id="3709266154059827597">Διαμόρφωση λίστας αποκλεισμένων για την εγκατάσταση επέκτασης</translation> <translation id="3711895659073496551">Αναστολή</translation> -<translation id="3715448429089775791">Ορίζει την ασφαλή λειτουργία YouTube αναγκαστικά σε ενεργή και δεν επιτρέπει στους χρήστες να αλλάξουν αυτήν τη ρύθμιση. - - Αν ενεργοποιήσετε αυτήν τη ρύθμιση, θα είναι πάντα ενεργή η ασφαλής λειτουργία YouTube. - - Αν απενεργοποιήσετε αυτήν τη ρύθμιση ή αν δεν ορίσετε καμία τιμή, δεν θα γίνει επιβολή της ασφαλούς λειτουργίας YouTube.</translation> <translation id="3750220015372671395">Αποκλεισμός δημιουργίας κλειδιού σε αυτούς τους ιστότοπους</translation> <translation id="3756011779061588474">Αποκλεισμός λειτουργίας προγραμματιστή</translation> <translation id="3758089716224084329">Σας επιτρέπει να καθορίσετε τον διακομιστή μεσολάβησης που χρησιμοποιείται από το <ph name="PRODUCT_NAME" /> και εμποδίζει τους χρήστες να αλλάξουν τις ρυθμίσεις διακομιστή μεσολάβησης. @@ -2114,12 +2100,6 @@ Τα αναγνωριστικά τύπου σύνδεσης είναι "ethernet", "wifi", "wimax", "bluetooth" και "cellular".</translation> <translation id="7763614521440615342">Εμφάνιση προτάσεων περιεχομένου στη Σελίδα σε νέα καρτέλα</translation> -<translation id="7766336524667238790">Αναφορά πληροφοριών σχετικά με την ενεργή περίοδο σύνδεσης kiosk, όπως είναι - η έκδοση και το αναγνωριστικό εφαρμογής. - - Αν η πολιτική έχει οριστεί ως ψευδής, οι πληροφορίες περιόδου δεν θα - αναφέρονται. Αν έχει οριστεί ως αληθής ή δεν έχει οριστεί, οι πληροφορίες - περιόδου σύνδεσης θα αναφέρονται.</translation> <translation id="7774768074957326919">Χρήση ρυθμίσεων διακομιστή μεσολάβησης συστήματος</translation> <translation id="7775831859772431793">Εδώ μπορείτε να καθορίσετε το URL του διακομιστή μεσολάβησης. @@ -2356,6 +2336,10 @@ <translation id="8369602308428138533">Καθυστέρηση απενεργοποίησης οθόνης κατά τη λειτουργία με εναλλασσόμενο ρεύμα</translation> <translation id="8382184662529825177">Ενεργοποίηση της χρήσης απομακρυσμένης διαβεβαίωσης για την προστασία περιεχομένου της συσκευής</translation> <translation id="838870586332499308">Ενεργοποίηση περιαγωγής δεδομένων</translation> +<translation id="8390049129576938611">Απενεργοποιεί το εσωτερικό πρόγραμμα προβολής PDF στο <ph name="PRODUCT_NAME" />. Αντ' αυτού, το αντιμετωπίζει ως λήψη και επιτρέπει στον χρήστη να ανοίγει αρχεία PDF με το προεπιλεγμένο πρόγραμμα. + + Εάν αυτή η πολιτική δεν ρυθμιστεί ή απενεργοποιηθεί, η προσθήκη PDF θα χρησιμοποιηθεί για το άνοιγμα αρχείων PDF, εκτός αν απενεργοποιηθεί από τον χρήστη.</translation> +<translation id="8402079500086185021">Να γίνεται πάντα εξωτερικό άνοιγμα των αρχείων PDF</translation> <translation id="8412312801707973447">Εάν εκτελούνται οι έλεγχοι OCSP/CRL στο διαδίκτυο</translation> <translation id="8413348101535146315">Επιτρέπει τον τερματισμό διεργασιών στη Διαχείριση εργασιών του προϊόντος <ph name="PRODUCT_NAME" />. @@ -2376,17 +2360,6 @@ Για παραδείγματα μοτίβων, ανατρέξτε στη διεύθυνση https://www.chromium.org/developers/how-tos/chrome-frame-getting-started.</translation> <translation id="8493645415242333585">Απενεργοποίηση αποθήκευσης ιστορικού περιήγησης</translation> <translation id="8499172469244085141">Προεπιλεγμένες ρυθμίσεις (οι χρήστες μπορούν να τις αλλάξουν)</translation> -<translation id="8501011084242226370">Καθορίζει μια λίστα προσθηκών τις οποίες μπορεί να ενεργοποιήσει ή να απενεργοποιήσει ο χρήστης στο <ph name="PRODUCT_NAME" />. - - Οι χαρακτήρες μπαλαντέρ "*" και "?" μπορούν να χρησιμοποιηθούν για αντιστοίχιση με ακολουθίες αυθαίρετων χαρακτήρων. Ο χαρακτήρας "*" αντιστοιχεί σε έναν αυθαίρετο αριθμό χαρακτήρων, ενώ ο χαρακτήρας "?" καθορίζει έναν προαιρετικό μεμονωμένο χαρακτήρα, δηλαδή αντιστοιχεί σε κανέναν ή σε ένα χαρακτήρα. Ο χαρακτήρας διαφυγής είναι "\", επομένως για την ακριβή αντιστοίχιση των χαρακτήρων "*", "?" ή "\", μπορείτε να τοποθετήσετε ένα "\" μπροστά από αυτούς. - - Εάν ενεργοποιήσετε αυτήν τη ρύθμιση, η καθορισμένη λίστα προσθηκών μπορεί να χρησιμοποιηθεί στο <ph name="PRODUCT_NAME" />. Οι χρήστες μπορούν να τις ενεργοποιήσουν ή να τις απενεργοποιήσουν στο "about:plugins", ακόμα και αν η εκάστοτε προσθήκη αντιστοιχεί επίσης σε κάποιο μοτίβο στο DisabledPlugins. Οι χρήστες μπορούν επίσης να ενεργοποιήσουν και να απενεργοποιήσουν προσθήκες οι οποίες δεν αντιστοιχούν σε κανένα μοτίβο στα DisabledPlugins, DisabledPluginsExceptions και EnabledPlugins. - - Αυτή η πολιτική έχει ως σκοπό να επιτρέπει την αυστηρή προσθήκη στοιχείων στη μαύρη λίστα προσθηκών, όπου η λίστα "DisabledPlugins" περιέχει καταχωρίσεις με χαρακτήρες μπαλαντέρ, όπως απενεργοποίηση όλων των προσθηκών "*" ή απενεργοποίηση όλων των προσθηκών Java "*Java*", ενώ ο διαχειριστής θέλει να ενεργοποιήσει κάποια συγκεκριμένη έκδοση, όπως "IcedTea Java 2.3". Αυτή η συγκεκριμένη έκδοση μπορεί να καθοριστεί σε αυτήν την πολιτική. - - Λάβετε υπόψη ότι τόσο το όνομα της προσθήκης, όσο και το όνομα της ομάδας της προσθήκης θα πρέπει να εξαιρεθούν. Κάθε ομάδα προσθηκών εμφανίζεται σε διαφορετική ενότητα στο "about:plugins". Κάθε ενότητα μπορεί να περιέχει μία ή περισσότερες προσθήκες. Για παράδειγμα, η προσθήκη "Shockwave Flash" ανήκει στην ομάδα "Adobe Flash Player" και τα δύο ονόματα θα πρέπει να έχουν κάποια αντιστοίχιση στη λίστα εξαιρέσεων εάν πρόκειται να εξαιρεθεί από τη μαύρη λίστα η συγκεκριμένη προσθήκη. - - Εάν δεν οριστεί αυτή η πολιτική, όλες οι προσθήκες οι οποίες αντιστοιχούν σε μοτίβα στο "DisabledPlugins" θα κλειδωθούν και θα απενεργοποιηθούν και δεν θα είναι δυνατή η ενεργοποίησή τους από τον χρήστη.</translation> <translation id="8519264904050090490">Διευθύνσεις URL μη αυτόματης εξαίρεσης χρηστών διαχείρισης</translation> <translation id="8544375438507658205">Προεπιλεγμένη λειτουργία απόδοσης HTML για το <ph name="PRODUCT_FRAME_NAME" /></translation> <translation id="8549772397068118889">Να προειδοποιείται ο χρήστης όταν επισκέπτεται ιστότοπους εκτός των πακέτων περιεχομένου</translation> @@ -2422,15 +2395,6 @@ Διαχωρισμός πολλών ονομάτων διακομιστών με κόμματα. Επιτρέπονται χαρακτήρες μπαλαντέρ (*). Αν δεν ορίσετε αυτήν την πολιτική, το <ph name="PRODUCT_NAME" /> θα προσπαθήσει να διαπιστώσει αν ένας διακομιστής ανήκει στο εσωτερικό δίκτυο και μόνο τότε θα απαντήσει σε αιτήματα IWA. Αν διαπιστωθεί ότι κάποιος διακομιστής προέρχεται από το διαδίκτυο, τα αιτήματα IWA από αυτόν θα παραβλέπονται από το <ph name="PRODUCT_NAME" />.</translation> -<translation id="8668394701842594241">Καθορίζει μια λίστα προσθηκών οι οποίες ενεργοποιούνται στο <ph name="PRODUCT_NAME" /> και αποτρέπει την αλλαγή αυτής της ρύθμισης από τους χρήστες. - - Οι χαρακτήρες μπαλαντέρ "*" και "?" μπορούν να χρησιμοποιηθούν για να αντιπροσωπεύσουν ακολουθίες αυθαίρετων χαρακτήρων. Το "*" αντιστοιχεί σε έναν αυθαίρετο αριθμό χαρακτήρων, ενώ το "?" καθορίζει έναν προαιρετικό μοναδικό χαρακτήρα, δηλαδή αντιστοιχεί στους χαρακτήρες μηδέν ή ένα. Ο χαρακτήρας διαφυγής είναι το "\", επομένως για την εμφάνιση των πραγματικών χαρακτήρων "*", "?" ή "\", μπορείτε να τοποθετήσετε ένα "\" μπροστά τους. - - Η καθορισμένη λίστα προσθηκών χρησιμοποιείται πάντα στο <ph name="PRODUCT_NAME" /> εφόσον έχει γίνει εγκατάσταση. Οι προσθήκες επισημαίνονται ως ενεργοποιημένες στο στοιχείο "about:plugins" και οι χρήστες δεν μπορούν να τις απενεργοποιήσουν. - - Λάβετε υπόψη ότι αυτή η πολιτική παρακάμπτει τόσο το στοιχείο DisabledPlugins όσο και το στοιχείο DisabledPluginsExceptions. - - Αν αυτή η πολιτική δεν καθοριστεί, ο χρήστης μπορεί να απενεργοποιήσει οποιαδήποτε προσθήκη που είναι εγκαταστημένη στο σύστημα.</translation> <translation id="8672321184841719703">Στόχευση έκδοσης αυτόματης ενημέρωσης</translation> <translation id="868068801094828689">Ενεργοποιεί την αποστολή ανώνυμων αναφορών χρήσης και δεδομένων που σχετίζονται με σφάλματα για το <ph name="PRODUCT_NAME" /> στο Google και αποτρέπει την αλλαγή αυτής της ρύθμισης από τους χρήστες. @@ -2534,13 +2498,6 @@ επικοινωνήσει αυτόματα με τον διακομιστή Quirks, θα κατεβάσει αρχεία διαμόρφωσης, αν είναι διαθέσιμα, και θα τα αποθηκεύσει στη συσκευή. Αυτά τα αρχεία μπορούν, για παράδειγμα, να χρησιμοποιηθούν για τη βελτίωση της ποιότητας εμφάνισης των προσαρτημένων οθονών.</translation> -<translation id="8905426178924715309">Αυτή η πολιτική έχει καταργηθεί. Αντ' αυτής χρησιμοποιήστε τις πολιτικές ForceGoogleSafeSearch και το ForceYouTubeSafetyMode. Αυτή η πολιτική θα παραβλεφθεί, αν έχει οριστεί η πολιτική ForceGoogleSafeSearch ή η πολιτική ForceYouTubeSafetyMode. - - Εξαναγκάζει τα ερωτήματα στην Αναζήτηση στον Ιστό Google να εκτελούνται με την Ασφαλή Αναζήτηση να έχει οριστεί ως ενεργή και αποτρέπει την αλλαγή αυτής της ρύθμισης από τους χρήστες. Επίσης, η συγκεκριμένη ρύθμιση ενεργοποιεί υποχρεωτικά την Ασφαλή λειτουργία στο YouTube. - - Αν ενεργοποιήσετε αυτήν τη ρύθμιση, η Ασφαλής Αναζήτηση στην Αναζήτηση Google και στο YouTube θα είναι πάντα ενεργή. - - Αν απενεργοποιήσετε αυτήν τη ρύθμιση ή δεν ορίσετε μια τιμή, δεν θα γίνει επιβολή της Ασφαλούς Αναζήτησης στην Αναζήτηση Google και στο YouTube.</translation> <translation id="8906768759089290519">Ενεργοποίηση λειτουργίας επισκέπτη</translation> <translation id="8908294717014659003">Σας επιτρέπει να ορίσετε εάν επιτρέπεται στους ιστότοπους η πρόσβαση σε συσκευές μέσων εγγραφής. Η πρόσβαση στις συσκευές μέσω καταγραφής ενδέχεται να επιτρέπεται από προεπιλογή ή ενδέχεται να γίνεται ερώτηση στον χρήστη κάθε φορά που ένας ιστότοπος ζητά πρόσβαση στις συσκευές μέσων εγγραφής.
diff --git a/components/policy/resources/policy_templates_en-GB.xtb b/components/policy/resources/policy_templates_en-GB.xtb index 56a67ee..4e57545 100644 --- a/components/policy/resources/policy_templates_en-GB.xtb +++ b/components/policy/resources/policy_templates_en-GB.xtb
@@ -209,15 +209,6 @@ 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. - - If you enable this setting, the specified list of plugins is never used in <ph name="PRODUCT_NAME" />. The plugins are marked as disabled in 'about:plugins' and users cannot enable them. - - Note that this policy can be overridden by EnabledPlugins and DisabledPluginsExceptions. - - If this policy is left not set the user can use any plugin installed on the system except for hard-coded incompatible, outdated or dangerous plugins.</translation> <translation id="1864269674877167562">If this policy is set to a blank string or not configured, <ph name="PRODUCT_OS_NAME" /> will not show an auto-complete option during user sign-in flow. If this policy is set to a string representing a domain name, <ph name="PRODUCT_OS_NAME" /> will show an auto-complete option during user sign-in allowing the user to type in only their user name without the domain name extension. The user will be able to overwrite this domain name extension.</translation> <translation id="1865417998205858223">Key Permissions</translation> @@ -860,11 +851,6 @@ <translation id="3660562134618097814">Transfer SAML IdP cookies during login</translation> <translation id="3709266154059827597">Configure extension installation blacklist</translation> <translation id="3711895659073496551">Suspend</translation> -<translation id="3715448429089775791">Forces YouTube Safety Mode to active and prevents users from changing this setting. - - If you enable this setting, Safety Mode on YouTube is always active. - - If you disable this setting or do not set a value, Safety Mode on YouTube is not enforced.</translation> <translation id="3750220015372671395">Block key generation on these sites</translation> <translation id="3756011779061588474">Block developer mode</translation> <translation id="3758089716224084329">Allows you to specify the proxy server used by <ph name="PRODUCT_NAME" /> and prevents users from changing proxy settings. @@ -2130,12 +2116,6 @@ The recognised connection type identifiers are "ethernet", "wifi", "wimax", "bluetooth" and "cellular".</translation> <translation id="7763614521440615342">Show content suggestions on the New Tab page</translation> -<translation id="7766336524667238790">Report information about the active kiosk session, such as - application ID and version. - - If the policy is set to false, the session information will not be - reported. If set to true or left unset, session information will be - reported.</translation> <translation id="7774768074957326919">Use system proxy settings</translation> <translation id="7775831859772431793">You can specify the URL of the proxy server here. @@ -2374,6 +2354,10 @@ <translation id="8369602308428138533">Screen off delay when running on AC power</translation> <translation id="8382184662529825177">Enable the use of remote attestation for content protection for the device</translation> <translation id="838870586332499308">Enable data roaming</translation> +<translation id="8390049129576938611">Disables the internal PDF viewer in <ph name="PRODUCT_NAME" />. Instead, it treats it as download and allows the user to open PDF files with the default application. + + If this policy is left not set or disabled the PDF plug-in will be used to open PDF files, unless the user disables it.</translation> +<translation id="8402079500086185021">Always Open PDF files externally</translation> <translation id="8412312801707973447">Whether online OCSP/CRL checks are performed</translation> <translation id="8413348101535146315">Enables ending processes in <ph name="PRODUCT_NAME" />'s Task Manager. @@ -2394,17 +2378,6 @@ For example patterns see https://www.chromium.org/developers/how-tos/chrome-frame-getting-started.</translation> <translation id="8493645415242333585">Disable saving browser history</translation> <translation id="8499172469244085141">Default Settings (users can override)</translation> -<translation id="8501011084242226370">Specifies a list of plug-ins that user can enable or disable in <ph name="PRODUCT_NAME" />. - - 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. - - If you enable this setting, the specified list of plug-ins can be used in <ph name="PRODUCT_NAME" />. Users can enable or disable them in 'about:plugins', even if the plug-in also matches a pattern in DisabledPlugins. Users can also enable and disable plug-ins that don't match any patterns in DisabledPlugins, DisabledPluginsExceptions and EnabledPlugins. - - This policy is meant to allow for strict plug-in blacklisting where the 'DisabledPlugins' list contains wildcarded entries like disable all plug-ins '*' or disable all Java plug-ins '*Java*' but the administrator wishes to enable some particular version like 'IcedTea Java 2.3'. This particular versions can be specified in this policy. - - Note that both the plug-in name and the plug-in's group name have to be exempted. Each plug-in group is shown in a separate section in about:plug-ins; each section may have one or more plug-ins. For example, the "Shockwave Flash" plug-in belongs to the "Adobe Flash Player" group, and both names have to have a match in the exceptions list if that plug-in is to be exempted from the blacklist. - - If this policy is left not set, any plug-in that matches the patterns in the 'DisabledPlugins' will be locked disabled and the user won't be able to enable them.</translation> <translation id="8519264904050090490">Managed user manual exception URLs</translation> <translation id="8544375438507658205">Default HTML renderer for <ph name="PRODUCT_FRAME_NAME" /></translation> <translation id="8549772397068118889">Warn when visiting sites outside of content packs</translation> @@ -2440,15 +2413,6 @@ Separate multiple server names with commas. Wildcards (*) are allowed. If you leave this policy unset <ph name="PRODUCT_NAME" /> will try to detect if a server is on the Intranet and only then will it respond to IWA requests. If a server is detected as Internet then IWA requests from it will be ignored by <ph name="PRODUCT_NAME" />.</translation> -<translation id="8668394701842594241">Specifies a list of plug-ins that are enabled in <ph name="PRODUCT_NAME" /> and prevents users from changing this setting. - - The wild card 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. - - The specified list of plug-ins is always used in <ph name="PRODUCT_NAME" /> if they are installed. The plug-ins are marked as enabled in 'about:plug-ins' and users cannot disable them. - - Note that this policy overrides both DisabledPlug-ins and DisabledPlug-insExceptions. - - If this policy is left unset, the user can disable any plug-in installed on the system.</translation> <translation id="8672321184841719703">Target Auto-Update Version</translation> <translation id="868068801094828689">Enables anonymous reporting of usage and crash-related data about <ph name="PRODUCT_NAME" /> to Google and prevents users from changing this setting. @@ -2540,13 +2504,6 @@ installs the <ph name="EXTENSION_POLICY_EXAMPLE_EXTENSION_NAME" /> app from the standard Chrome Web Store "update" URL. For more information about hosting extensions, see: <ph name="LINK_TO_EXTENSION_DOC2" />.</translation> <translation id="8889588091638298603">The Quirks Server provides hardware-specific configuration files, like ICC display profiles to adjust monitor calibration. When this policy is set to false, the device will not attempt to contact the Quirks Server to download configuration files. If this policy is true or not configured then <ph name="PRODUCT_OS_NAME" /> will automatically contact the Quirks Server and download configuration files, if available, and store them on the device. Such files might, for example, be used to improve display quality of attached monitors.</translation> -<translation id="8905426178924715309">This policy is deprecated, please use ForceGoogleSafeSearch and ForceYouTubeSafetyMode instead. This policy will be ignored if either the ForceGoogleSafeSearch or ForceYouTubeSafetyMode policies are set. - - Forces queries in Google Web Search to be done with SafeSearch set to active and prevents users from changing this setting. This setting also forces Safety Mode on YouTube. - - If you enable this setting, SafeSearch in Google Search and YouTube is always active. - - If you disable this setting or do not set a value, SafeSearch in Google Search and YouTube is not enforced.</translation> <translation id="8906768759089290519">Enable guest mode</translation> <translation id="8908294717014659003">Allows you to set whether websites are allowed to get access to media capture devices. Access to media capture devices can be allowed by default, or the user can be asked every time a website wants to get access to media capture devices.
diff --git a/components/policy/resources/policy_templates_es-419.xtb b/components/policy/resources/policy_templates_es-419.xtb index c0a34c5f..f6b6faa3 100644 --- a/components/policy/resources/policy_templates_es-419.xtb +++ b/components/policy/resources/policy_templates_es-419.xtb
@@ -202,15 +202,6 @@ 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. - - Si habilitas esta configuración, la lista especificada de complementos nunca se utiliza en <ph name="PRODUCT_NAME" />. Los complementos se marcan como inhabilitados en "about:plugins" y los usuarios no pueden habilitarlos. - - Ten en cuenta que tanto EnabledPlugins como DisabledPluginsExceptions pueden omitir esta política. - - Si no se establece esta política, el usuario puede usar cualquier complemento instalado en el sistema, salvo los complementos peligrosos, obsoletos o incompatibles codificados de forma rígida.</translation> <translation id="1864269674877167562">Si esta política no se configura o se establece como un string en blanco, <ph name="PRODUCT_OS_NAME" /> no mostrará una opción de autocompletar durante el flujo de acceso del usuario. Si esta política se establece como un string que representa un nombre de dominio, <ph name="PRODUCT_OS_NAME" /> mostrará una opción de autocompletar durante el acceso del usuario, lo que permitirá que el usuario escriba solamente el nombre de usuario sin la extensión del nombre de dominio. El usuario podrá sobrescribir esta extensión de nombre de dominio.</translation> <translation id="1865417998205858223">Permisos de clave</translation> @@ -747,7 +738,7 @@ <translation id="3322771899429619102">Te permite configurar una lista de patrones de URL que especifican los sitios que están autorizados a utilizar la generación de claves. Si un patrón de URL tiene configurada la política "KeygenBlockedForUrls", se anulan estas excepciones. Si esta política no se configura, se usará el valor global predeterminado para todos los sitios, ya sea de la política "DefaultKeygenSetting" si está configurada o de otro tipo de configuración personal del usuario.</translation> -<translation id="3322902067538988734">Si esta política se establece como verdadera, el usuario deberá acceder a <ph name="PRODUCT_NAME" /> con su perfil antes de usar el navegador. El valor predeterminado BrowserGuestModeEnabled se establecerá como verdadero. +<translation id="3322902067538988734">Si esta política se establece como verdadera, el usuario deberá acceder a <ph name="PRODUCT_NAME" /> con su perfil antes de usar el navegador. El valor predeterminado BrowserGuestModeEnabled se establecerá como falso. Si esta política se establece como falsa o no se configura, el usuario podrá usar el navegador sin acceder a <ph name="PRODUCT_NAME" />.</translation> <translation id="3381968327636295719">Utilizar el navegador del host de manera predeterminada</translation> @@ -805,11 +796,6 @@ <translation id="3660562134618097814">Transferir cookies del IdP de SAML durante el acceso</translation> <translation id="3709266154059827597">Configurar la lista negra de instalación de extensiones</translation> <translation id="3711895659073496551">Suspender</translation> -<translation id="3715448429089775791">Fuerza el modo de seguridad de YouTube como activo e impide que los usuarios modifiquen esta configuración. - - Si se habilita esta configuración, el modo de seguridad en YouTube siempre está activo. - - Si se inhabilita esta configuración o no se establece un valor, el modo de seguridad en YouTube no se fuerza.</translation> <translation id="3750220015372671395">Bloquear generación de claves en estos sitios</translation> <translation id="3756011779061588474">Bloquear modo de programador</translation> <translation id="3758089716224084329">Te permite establecer el servidor proxy que usa <ph name="PRODUCT_NAME" /> y evita que los usuarios cambien la configuración del proxy. @@ -1970,9 +1956,6 @@ Los identificadores de tipos de conexión reconocidos son "ethernet", "wifi", "wimax", "bluetooth" y "celular".</translation> <translation id="7763614521440615342">Mostrar sugerencias de contenido en la página Nueva pestaña</translation> -<translation id="7766336524667238790">Informa datos sobre la sesión de kiosco activa, como el ID de aplicación y la versión. - - Si la política se establece en false, no se informarán los datos de la sesión. Si se establece en true o no se establece, se informarán los datos de la sesión.</translation> <translation id="7774768074957326919">Usar la configuración del proxy del sistema</translation> <translation id="7775831859772431793">Puedes especificar la URL del servidor proxy aquí. @@ -2197,6 +2180,10 @@ <translation id="8369602308428138533">Demora de pantalla apagada con alimentación de CA</translation> <translation id="8382184662529825177">Habilita el uso de la atestación remota para la protección de contenido del dispositivo.</translation> <translation id="838870586332499308">Activar la itinerancia de datos</translation> +<translation id="8390049129576938611">Inhabilita la app interna para ver archivos PDF <ph name="PRODUCT_NAME" />. Los considera archivos de descarga y le permite al usuario abrirlos con la aplicación predeterminada. + + Si esta política no se establece o se inhabilita, el complemento de PDF se usará para abrir archivos PDF a menos que el usuario lo inhabilite.</translation> +<translation id="8402079500086185021">Abrir siempre archivos PDF de forma externa</translation> <translation id="8412312801707973447">Se realizan comprobaciones OCSP/CRL si estás conectado.</translation> <translation id="8413348101535146315">Permite finalizar procesos en el Administrador de tareas de <ph name="PRODUCT_NAME" />. @@ -2217,17 +2204,6 @@ Para ver ejemplos de patrones, visita https://www.chromium.org/developers/how-tos/chrome-frame-getting-started.</translation> <translation id="8493645415242333585">Inhabilitar el almacenamiento del historial del navegador</translation> <translation id="8499172469244085141">Configuración predeterminada (los usuarios pueden modificarla)</translation> -<translation id="8501011084242226370">Especifica la lista de complementos que el usuario puede habilitar o inhabilitar en <ph name="PRODUCT_NAME" />. - - Los caracteres comodín "*" y "?" se pueden utilizar para generar coincidencias con secuencias de caracteres arbitrarios. El carácter "*" coincide con un número arbitrario de caracteres, mientras que "?" especifica un carácter individual opcional, es decir, coincide, como máximo, con un carácter. El carácter de escape es "\": Por lo tanto, para que haya coincidencias con los caracteres reales "*", "?" o "\", puedes ingresar "\" delante de ellos. - - Si habilitas esta configuración, la lista de complementos especificada se puede utilizar en <ph name="PRODUCT_NAME" />. Los usuarios pueden habilitarlos o inhabilitarlos en "about:plugins", incluso aunque el complemento coincida con un patrón de DisabledPlugins. Los usuarios también pueden habilitar o inhabilitar complementos que no coinciden con ningún patrón de DisabledPlugins, DisabledPluginsExceptions ni EnabledPlugins. - - El objetivo de esta política es posibilitar la inclusión precisa de complementos a la lista negra en casos donde la lista DisabledPlugins contiene entradas con comodín (como "*" para inhabilitar todos los complementos o "*Java*" para inhabilitar todos los complementos de Java), pero el administrador quiere habilitar una versión en particular (por ejemplo, "Java IcedTea 2.3"). Tales versiones se pueden especificar en esta política. - - Ten en cuenta que se deben excluir el nombre del complemento y el nombre del grupo al que pertenece. Cada grupo aparece en una sección separada en la página about:plugins; cada sección puede contener uno o más complementos. Por ejemplo, el complemento "Shockwave Flash" pertenece al grupo "Adobe Flash Player", y ambos nombres deben tener una coincidencia en la lista de excepciones si se quiere excluir ese complemento de la lista negra. - - Si no se establece esta política, se bloquearán e inhabilitarán todos los complementos que coincidan con los patrones de la lista DisabledPlugins, y el usuario no podrá habilitarlos.</translation> <translation id="8519264904050090490">Direcciones URL de excepción manual de usuario administrado</translation> <translation id="8544375438507658205">Procesador HTML predeterminado para <ph name="PRODUCT_FRAME_NAME" /></translation> <translation id="8549772397068118889">Advierte cuando se visitan sitios fuera de los paquetes de contenido.</translation> @@ -2252,7 +2228,6 @@ Los distintos nombres de servidor se deben separar con comas. Se permite el uso de caracteres comodín (*). Si no se establece esta política, <ph name="PRODUCT_NAME" /> intentará detectar si un servidor se encuentra en la intranet y solo entonces responderá las solicitudes de IWA. Si se detecta un servidor como Internet, <ph name="PRODUCT_NAME" /> ignorará las solicitudes de IWA que provengan de ese servidor.</translation> -<translation id="8668394701842594241">Especifica una lista de complementos que están habilitados en <ph name="PRODUCT_NAME" /> y evita que los usuarios cambien esta configuración. Los caracteres comodines "*" y "?" se pueden usar para que coincidan con las secuencias de caracteres arbitrarios. "*" coincide con un número arbitrario de caracteres y "?" especifica un solo carácter opcional, es decir, coincide con un carácter o con ninguno. El carácter de escape es "\" y se puede colocar delante de "*", "?" o "\" para obtener coincidencias con ellos. <ph name="PRODUCT_NAME" /> usa siempre la lista especificada de complementos, si están instalados. Los complementos se marcan como habilitados en "about: plugins" y los usuarios no pueden inhabilitarlos. Ten en cuenta que esta política anula tanto DisabledPlugins como DisabledPluginsExceptions. Si esta política no se configura, el usuario puede inhabilitar cualquier complemento instalado en el sistema.</translation> <translation id="8672321184841719703">Versión de destino para las actualizaciones automáticas</translation> <translation id="868068801094828689">Habilita la opción de informar a Google de manera anónima acerca del uso y datos relacionados con bloqueos de <ph name="PRODUCT_NAME" />, e impide que los usuarios cambien esta configuración. @@ -2348,13 +2323,6 @@ si están disponibles, y los guardará en el dispositivo. Estos archivos pueden usarse, por ejemplo, para mejorar la calidad de visualización de los monitores conectados.</translation> -<translation id="8905426178924715309">Esta política dejó de estar disponible; se deben usar ForceGoogleSafeSearch y ForceYouTubeSafetyMode en su lugar. Esta política se ignorará si se establecen las políticas ForceGoogleSafeSearch o ForceYouTubeSafetyMode. - - Permite forzar las consultas en la Búsqueda web de Google para que se realicen con SafeSearch activado y evitar que los usuarios modifiquen esta configuración. Esta configuración también fuerza el modo de seguridad en YouTube. - - Si se habilita esta opción, SafeSearch está siempre activado en la Búsqueda de Google y en YouTube. - - Si se inhabilita esta opción o no se establece un valor, no se aplicará SafeSearch en la Búsqueda de Google ni en YouTube.</translation> <translation id="8906768759089290519">Activar el modo de invitado</translation> <translation id="8908294717014659003">Te permite establecer si se autoriza que los sitios web tengan acceso a dispositivos de captura de contenido multimedia. El acceso a estos dispositivos puede permitirse de manera predeterminada, o se puede preguntar al usuario cada vez que un sitio web quiera acceder a dispositivos de captura de contenido multimedia.
diff --git a/components/policy/resources/policy_templates_es.xtb b/components/policy/resources/policy_templates_es.xtb index e619e66..68199bcf 100644 --- a/components/policy/resources/policy_templates_es.xtb +++ b/components/policy/resources/policy_templates_es.xtb
@@ -208,15 +208,6 @@ 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 esto no inhabilita la compatibilidad con versiones más antiguas de TLS, solo determina si <ph name="PRODUCT_NAME" /> evita el uso de servidores con errores que no puedan negociar las versiones correctamente. 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. - - Si habilitas esta opción, <ph name="PRODUCT_NAME" /> nunca utilizará la lista de complementos especificada. Los complementos se marcan como inhabilitados en "about:plugins" y los usuarios no pueden habilitarlos. - - Ten en cuenta que las políticas EnabledPlugins y DisabledPluginsExceptions pueden anular esta política. - - Si no se establece esta política, el usuario podrá utilizar cualquier complemento que esté instalado en el sistema, salvo complementos codificados incompatibles, obsoletos o peligrosos.</translation> <translation id="1864269674877167562">Si se ha asignado una cadena en blanco a la política o si esta no se configura, <ph name="PRODUCT_OS_NAME" /> no mostrará una opción para autocompletar los datos durante el flujo de inicio de sesión del usuario. Si se ha asignado una cadena que representa un nombre de dominio a esta política, <ph name="PRODUCT_OS_NAME" /> mostrará dicha opción durante el inicio de sesión del usuario, por lo que este podrá introducir solo su nombre de usuario sin la extensión de nombre de dominio. El usuario podrá anular esta extensión de nombre de dominio.</translation> <translation id="1865417998205858223">Permisos clave</translation> @@ -862,11 +853,6 @@ <translation id="3660562134618097814">Transferir las cookies del proveedor de identidad SAML durante el inicio de sesión</translation> <translation id="3709266154059827597">Configurar lista negra de instalación de extensiones</translation> <translation id="3711895659073496551">Suspender</translation> -<translation id="3715448429089775791">Activa el modo de seguridad de YouTube y evita que los usuarios modifiquen esta opción. - - Si habilitas esta opción, el modo de seguridad de YouTube siempre estará activado. - - Si la inhabilitas o no se le asigna ningún valor, no se aplicará el modo de seguridad de YouTube.</translation> <translation id="3750220015372671395">Bloquear la generación de claves en estos sitios web</translation> <translation id="3756011779061588474">Bloquear el modo de desarrollador</translation> <translation id="3758089716224084329">Permite especificar el servidor proxy que utiliza <ph name="PRODUCT_NAME" /> e impide que los usuarios cambien la configuración del proxy. @@ -2118,9 +2104,6 @@ Los identificadores de tipos de conexiones reconocidos son Ethernet, Wi-Fi, WiMAX, Bluetooth y redes móviles.</translation> <translation id="7763614521440615342">Mostrar sugerencias de contenido en la página Nueva pestaña</translation> -<translation id="7766336524667238790">Proporciona información sobre la sesión del kiosco activa, como el ID de la aplicación y la versión. - -Si se asigna el valor false a la política, no se proporcionará información sobre la sesión. Si se asigna el valor true o si la política no se configura, sí se proporcionará información sobre la sesión.</translation> <translation id="7774768074957326919">Utilizar configuración de proxy del sistema</translation> <translation id="7775831859772431793">Permite especificar la URL del servidor proxy. @@ -2358,6 +2341,10 @@ <translation id="8369602308428138533">Retraso de desconexión de la pantalla cuando el dispositivo está conectado a la red</translation> <translation id="8382184662529825177">Habilitar el uso de la confirmación remota para la protección del contenido del dispositivo</translation> <translation id="838870586332499308">Habilitar la itinerancia de datos</translation> +<translation id="8390049129576938611">Inhabilita el visor de PDF interno en <ph name="PRODUCT_NAME" />. En su lugar, trata el archivo PDF como una descarga y permite al usuario abrir archivos PDF con la aplicación predeterminada. + + Si esta política no se establece o se inhabilita, el complemento de PDF se usará para abrir archivos PDF a menos que el usuario lo inhabilite.</translation> +<translation id="8402079500086185021">Abrir siempre los archivos PDF de forma externa</translation> <translation id="8412312801707973447">Se realizan comprobaciones OCSP/CRL si estás online</translation> <translation id="8413348101535146315">Permite finalizar procesos en el administrador de tareas de <ph name="PRODUCT_NAME" />. @@ -2378,17 +2365,6 @@ Puedes consultar ejemplos de patrones en la página https://www.chromium.org/developers/how-tos/chrome-frame-getting-started.</translation> <translation id="8493645415242333585">Inhabilitar almacenamiento del historial de navegación</translation> <translation id="8499172469244085141">Configuración predeterminada (los usuarios pueden modificarla)</translation> -<translation id="8501011084242226370">Especifica una lista de complementos que el usuario puede habilitar o inhabilitar en <ph name="PRODUCT_NAME" />. - -Los caracteres comodín "*" y "?" se pueden utilizar para buscar coincidencias con secuencias de caracteres arbitrarios. El comodín "*" coincide con cualquier número de caracteres, mientras que "?" especifica un único carácter opcional, es decir, coincide con uno o con ningún carácter. El carácter de escape es "\", por lo que para que coincida con los caracteres "*", "?" o "\" debes colocar el carácter "\" delante de ellos. - -Si habilitas esta opción, podrás utilizar la lista especificada de complementos en <ph name="PRODUCT_NAME" />. Los usuarios pueden habilitarlos o inhabilitarlos en la página about:plugins, aunque el complemento también coincida con un patrón de DisabledPlugins. Los usuarios también pueden habilitar o inhabilitar complementos que no coincidan con ningún patrón de DisabledPlugins, DisabledPluginsExceptions y EnabledPlugins. - -Esta política se puede utilizar para incluir complementos en una lista negra estricta si la lista DisabledPlugins contiene entradas con comodines, como inhabilitar todos los complementos "*" o inhabilitar todos los complementos de Java "*Java*", pero el administrador quiere habilitar alguna versión concreta (por ejemplo, IcedTea Java 2.3). Estas versiones concretas se pueden especificar en esta política. - -Ten en cuenta que no se debe incluir ni el nombre del complemento ni el nombre de grupo del complemento. Cada grupo de complementos se muestra en una sección independiente en la página about:plugins, y cada sección puede tener uno o varios complementos. Por ejemplo, el complemento Shockwave Flash pertenece al grupo Adobe Flash Player, y ambos nombres deben coincidir con un elemento de la lista de excepciones si ese complemento se debe excluir de la lista negra. - -Si no se establece esta política, cualquier complemento que coincida con los patrones de DisabledPlugins se bloqueará e inhabilitará, y el usuario no podrá habilitarlo.</translation> <translation id="8519264904050090490">URLs de excepción manual de usuario administrado</translation> <translation id="8544375438507658205">Procesador de HTML predeterminado de <ph name="PRODUCT_FRAME_NAME" /></translation> <translation id="8549772397068118889">Advertir cuando se visitan sitios no incluidos en paquetes de contenido</translation> @@ -2424,15 +2400,6 @@ Los distintos nombres de servidor se deben separar con comas. Se permite el uso de caracteres comodín (*). Si no se establece esta política, <ph name="PRODUCT_NAME" /> intentará detectar si un servidor se encuentra en la intranet y solo entonces responderá a las solicitudes de IWA. Si se detecta Internet como servidor, <ph name="PRODUCT_NAME" /> ignorará las solicitudes de IWA que procedan de él.</translation> -<translation id="8668394701842594241">Permite especificar una lista de complementos habilitados en <ph name="PRODUCT_NAME" /> e impide que los usuarios cambien esta configuración. - - Se pueden utilizar los caracteres comodín "*" y "?" para obtener coincidencias de secuencias de caracteres arbitrarios. "*" puede coincidir 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 "*", de "?" o de "\" para obtener coincidencias con esos caracteres. - - <ph name="PRODUCT_NAME" /> usará la lista de complementos especificada siempre que estos estén instalados. Los complementos se marcan como habilitados en "about:plugins" y los usuarios no los pueden inhabilitar. - - Ten en cuenta que esta política anula las políticas DisabledPlugins y DisabledPluginsExceptions. - - Si no se establece esta política, el usuario podrá inhabilitar todos los complementos que se instalen en el sistema.</translation> <translation id="8672321184841719703">Versión de destino de actualizaciones automáticas</translation> <translation id="868068801094828689">Habilita el envío de informes anónimos a Google sobre datos de fallos y de uso relacionados con <ph name="PRODUCT_NAME" /> e impide que los usuarios cambien esta opción. @@ -2540,13 +2507,6 @@ automáticamente con Quirks Server, descargará los archivos de configuración si están disponibles y los almacenará en el dispositivo. Estos archivos pueden utilizarse, por ejemplo, para mejorar la calidad de la pantalla de los monitores conectados.</translation> -<translation id="8905426178924715309">Esta política está obsoleta, utiliza ForceGoogleSafeSearch y ForceYouTubeSafetyMode en su lugar. Esta política se ignorará si están establecidas ForceGoogleSafeSearch o ForceYouTubeSafetyMode. - - Fuerza las consultas en la Búsqueda web de Google para que se realicen con SafeSearch activado e impide que los usuarios modifiquen esta configuración. Además, esta opción fuerza el modo de seguridad en YouTube. - - Si habilitas esta opción, SafeSearch estará siempre activo en la Búsqueda de Google y en YouTube. - - Si esta opción se inhabilita o no se establece un valor, SafeSearch no se aplicará en la Búsqueda de Google ni en YouTube.</translation> <translation id="8906768759089290519">Habilitar el modo de invitado</translation> <translation id="8908294717014659003">Te permite establecer si los sitios web pueden acceder a los dispositivos de captura multimedia. El acceso a los dispositivos de captura multimedia se puede establecer de forma predeterminada o se puede configurar para que el usuario reciba un mensaje cada vez que un sitio web quiera acceder a estos dispositivos.
diff --git a/components/policy/resources/policy_templates_et.xtb b/components/policy/resources/policy_templates_et.xtb index 09fa6587..ceef2ff 100644 --- a/components/policy/resources/policy_templates_et.xtb +++ b/components/policy/resources/policy_templates_et.xtb
@@ -209,15 +209,6 @@ 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 „\”. - - Seade lubamisel ei kasutata rakenduses <ph name="PRODUCT_NAME" /> kunagi loendis olevaid pistikprogramme. Pistikprogrammid on jaotises „about:plugins” märgitud keelatuks ja kasutajad ei saa neid lubada. - - Pidage meeles, et seda reeglit saab alistada reeglitega „EnabledPlugins” ja „DisabledPluginsExceptions”. - - Kui jätate selle reegli määramata, siis on võimalik kasutada kõiki süsteemi installitud pistikprogramme, v.a püsiprogrammeeritud ühildumatud, aegunud ja ohtlikud pistikprogrammid.</translation> <translation id="1864269674877167562">Kui selle reegli jaoks valitakse tühi string või jäetakse reegel seadistamata, ei näita <ph name="PRODUCT_OS_NAME" /> kasutaja sisselogimisvoos automaatse täitmise valikut. Kui selleks reegliks on määratud string, mis esindab domeeni nime, kuvab <ph name="PRODUCT_OS_NAME" /> kasutaja sisselogimisel automaatse täitmise valiku, võimaldades kasutajal sisestada ainult oma kasutajanime ilma domeeninime laiendita. Kasutaja saab selle domeeninime laiendi alistada.</translation> <translation id="1865417998205858223">Võtmeload</translation> @@ -853,11 +844,6 @@ <translation id="3660562134618097814">SAML IdP küpsisefailide ülekandmine sisselogimisel</translation> <translation id="3709266154059827597">Laienduste installimise musta nimekirja seadistamine</translation> <translation id="3711895659073496551">Peata</translation> -<translation id="3715448429089775791">Jõustab YouTube’i ohutu režiimi ja takistab kasutajaid seadet muutmast. - - Kui lubate seade, on YouTube’i ohutu režiim alati aktiivne. - - Kui keelate seade või jätate väärtuse määramata, ei jõustata YouTube’i ohutut režiimi.</translation> <translation id="3750220015372671395">Blokeeri võtmete loomine nendel saitidel</translation> <translation id="3756011779061588474">Arendaja režiimi blokeerimine</translation> <translation id="3758089716224084329">Võimaldab määrata rakenduse <ph name="PRODUCT_NAME" /> kasutatava puhverserveri ega lase kasutajatel puhverserveri seadeid muuta. @@ -2117,11 +2103,6 @@ Tunnustatud ühendustüübi identifikaatorid on „ethernet”, „wifi”, „wimax”, „bluetooth” ja „cellular”.</translation> <translation id="7763614521440615342">Kuva uuel vahelehel sisu soovitused</translation> -<translation id="7766336524667238790">Saadab teavet kioski aktiivse seansi kohta (nt - rakenduse ID ja versioon). - - Kui selle reegli väärtuseks määratakse Väär, siis teavet seansi kohta ei - saadeta. Kui väärtuseks määratakse Tõene või seda ei määrata, saadetakse teavet seansi kohta.</translation> <translation id="7774768074957326919">Kasuta süsteemi puhverserveri seadeid</translation> <translation id="7775831859772431793">Siin saate määrata puhverserveri URL-i. @@ -2361,6 +2342,10 @@ <translation id="8369602308428138533">Ekraani väljalülitamise viiteaeg võrgutoite kasutamisel</translation> <translation id="8382184662529825177">Kaugatesteerimise lubamine seadme sisu kaitsmiseks</translation> <translation id="838870586332499308">Luba andmeside rändlusteenus</translation> +<translation id="8390049129576938611">Keelab sisemise PDF-vaaturi rakenduses <ph name="PRODUCT_NAME" />. Selle asemel koheldakse seda allalaadimisena ja kasutaja saab PDF-faile vaikerakendusega avada. + + Kui keelate reegli või jätate selle määramata, kasutatakse PDF-failide avamiseks PDF-i pistikprogrammi, välja arvatud juhul, kui kasutaja selle keelab.</translation> +<translation id="8402079500086185021">Ava PDF-failid alati väliselt</translation> <translation id="8412312801707973447">Kontrolli võrgus OCSP-d/CRL-i</translation> <translation id="8413348101535146315">Lubab protsessid brauseri <ph name="PRODUCT_NAME" /> tegumihalduris lõpetada. @@ -2381,17 +2366,6 @@ Vaadake näidismustreid aadressilt http://www.chromium.org/developers/how-tos/chrome-frame-getting-started.</translation> <translation id="8493645415242333585">Keela brauseri ajaloo salvestamine</translation> <translation id="8499172469244085141">Vaikeseaded (kasutajad saavad alistada)</translation> -<translation id="8501011084242226370">Määrab pistikprogrammide loendi, mille kasutaja saab rakenduses <ph name="PRODUCT_NAME" /> lubada või keelata. - - Juhuslike märkide jadade vastendamiseks võib kasutada metamärke „*” ja „?”. „*” vastab mis tahes märkide arvule, „?” vastab ühele valikulisele tähemärgile, st nullile või ühele tähemärgile. Paomärk on „\”. See tähendab, et tegelike märkide „*”, „?” või „\” vastendamiseks võite nende ette lisada märgi „\”. - - Kui lubate sätte, tohib määratud pistikprogrammide loendit rakenduses <ph name="PRODUCT_NAME" /> kasutada. Kasutajad saavad neid jaotises „about:plugins” lubada ja keelata isegi juhul, kui pistikprogramm vastab atribuudis DisabledPlugins olevale mustrile. Kasutajad saavad ka lubada ja keelata pistikprogramme, mis ei vasta ühelegi mustrile atribuutides DisabledPlugins, DisabledPluginsExceptions ja EnabledPlugins. - - Reegli eesmärk on lubada pistikprogrammide ranget keelatud loendisse määramist ja loend „DisabledPlugins” sisaldab metamärkidega kirjeid, näiteks kõikide pistikprogrammide keelamine „*” või kõikide Java pistikprogrammide keelamine „*Java*”, kuid administraator soovib lubada kindla versiooni, näiteks „IcedTea Java 2.3”. Reegel võimaldab määrata konkreetsed versioonid. - - Pange tähele, et keelatud loendist tuleb välistada nii pistikprogrammi nimi kui ka pistikprogrammi grupi nimi. Iga pistikprogrammi grupp kuvatakse lehel about:plugins eraldi jaotises ja igas jaotises võib olla üks või mitu pistikprogrammi. Näiteks pistikprogramm „Shockwave Flash” kuulub gruppi „Adobe Flash Player” ja mõlemal nimel peab olema erandite loendis vaste, kui soovite pistikprogrammi keelatud loendist välistada. - - Kui jätate reegli määramata, keelatakse kõik pistikprogrammid, mis vastavad atribuudis „DisabledPlugins” olevatele mustritele ja kasutaja ei saa neid lubada.</translation> <translation id="8519264904050090490">Kasutaja käsitsi sisestatavate URL-ide erandite haldamine</translation> <translation id="8544375438507658205">Rakenduse <ph name="PRODUCT_FRAME_NAME" /> HTML-i vaikerenderdaja</translation> <translation id="8549772397068118889">Hoiatamine sisupakettidest väljaspool olevate saitide külastamisel</translation> @@ -2427,15 +2401,6 @@ Eraldage serveri nimed komadega. Metamärgid (*) on lubatud. Kui jätate selle reegli määramata, üritab <ph name="PRODUCT_NAME" /> tuvastada, kas server on intranetis, ja alles siis vastab IWA taotlustele. Kui server tuvastatakse Internetis, siis eirab <ph name="PRODUCT_NAME" /> sealt tulevaid IWA taotlusi.</translation> -<translation id="8668394701842594241">Määrab pistikprogrammide loendi, mis on rakenduses <ph name="PRODUCT_NAME" /> lubatud, 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 „\”. - - Määratud pistikprogramme kasutatakse alati rakenduses <ph name="PRODUCT_NAME" />, kui need on installitud. Pistikprogrammid on jaotises „about:plugins” lubatuks märgitud ja kasutajad ei saa neid keelata. - - Pidage meeles, et need see reegel alistab reeglid DisabledPlugins ja DisabledPluginsExceptions. - - Kui reeglit ei määrata, siis saab kasutaja keelata kõik süsteemi installitud pistikprogrammid.</translation> <translation id="8672321184841719703">Automaatse värskendamise sihtversioon</translation> <translation id="868068801094828689">Lubab rakenduse <ph name="PRODUCT_NAME" /> kasutamise ja kokkujooksmisega seotud andmete anonüümse edastamise Google’ile ning takistab kasutajaid seadet muutmast. @@ -2535,13 +2500,6 @@ Quirks Serveriga automaatselt ühendust, laadib konfiguratsioonifailid alla, kui need on saadaval, ja salvestab need seadmesse. Neid faile võib näiteks kasutada ühendatud monitoride pildikvaliteedi parandamiseks.</translation> -<translation id="8905426178924715309">Selle reegli tugi on katkestatud, kasutage selle asemel reegleid ForceGoogleSafeSearch ja ForceYouTubeSafetyMode. Seda reeglit eiratakse, kui reegel ForceGoogleSafeSearch või ForceYouTubeSafetyMode on määratud. - - Sunnib Google'i veebiotsingute tegemisel kasutama SafeSearchi ja takistab kasutajatel seade muutmist. See seade jõustab turvarežiimi ka YouTube'is. - - Seade lubamisel on funktsioon SafeSearch Google'i otsingus ja YouTube'is alati aktiivne. - - Kui keelate seade või ei määra väärtust, ei jõustata Google'i otsingus ja YouTube'is SafeSearchi kasutamist.</translation> <translation id="8906768759089290519">Luba külastajarežiim</translation> <translation id="8908294717014659003">Võimaldab määrata veebisaitidele juurdepääsu meediahõiveseadmetele. Juurdepääsu meediahõiveseadmetele saab lubada vaikimisi või lasta iga kord kasutajalt küsida, kui mõni veebisait neile juurdepääsu soovib.
diff --git a/components/policy/resources/policy_templates_fa.xtb b/components/policy/resources/policy_templates_fa.xtb index f96741e..abc6460 100644 --- a/components/policy/resources/policy_templates_fa.xtb +++ b/components/policy/resources/policy_templates_fa.xtb
@@ -203,15 +203,6 @@ اگر این خطمشی پیکربندی نشود یا اگر روی «tls1.2» تنظیم شود، <ph name="PRODUCT_NAME" /> دیگر این روند جایگزینی را انجام نمیدهد. توجه داشته باشید تنها در صورتی که <ph name="PRODUCT_NAME" /> روی سرورهای دارای اشکال کار کند که نمیتوانند نسخهها را بهدرستی منتقل کنند، این کار پشتیبانی برای نسخههای TLS قدیمی را غیرفعال نمیکند. اما اگر سازگاری با یک سرور دارای اشکال باید حفظ شود، میتوان این خطمشی را روی «tls1.1» تنظیم کرد. این یک چاره موقت است و اشکال سرور باید سریعاً برطرف شود.</translation> -<translation id="1861037019115362154">فهرستی از افزایههایی را مشخص میکند که در <ph name="PRODUCT_NAME" /> غیرفعال شدهاند و نمیگذارند کاربران این تنظیم را تغییر دهند. - - نویسههای عام '*' و '?' را میتوان برای تطبیق زنجیره نویسههای اختیاری استفاده کرد. '*' با تعداد نویسههای اختیاری مطابق است در حالیکه '?' یک نویسه اختیاری را مشخص میکند یعنی برابر با نویسههای صفر یا یک است. نویسه گریز '\' است بنابراین برای تطابق با نویسههای واقعی '*' ،'?' ، و '\' میتوانید شما '\' را جلوی آنها قرار دهید. - - اگر این تنظیم را فعال کنید فهرست خاص افزایهها هرگز در <ph name="PRODUCT_NAME" /> استفاده نمیشود. افزایهها در'about:plugins' به صورت غیرفعال علامتگذاری شده اند و کاربر نمیتواند آنها را فعال کند. - - توجه داشته باشید که این خطمشی در EnabledPlugins و DisabledPluginsExceptions لغو میشود. - - اگر این خطمشی تنظیم نشود کاربر میتواند از هر افزایه نصب شده در سیستم استفاده کند بجز افزایههای خطرناک، قدیمی و ناسازگار با سخت رمزی.</translation> <translation id="1864269674877167562">اگر این خطمشی روی رشتهای خالی تنظیم شود یا پیکربندی نشود، <ph name="PRODUCT_OS_NAME" />گزینه تکمیل خودکار را درحین فرآیند ورود به سیستم کاربر نشان نمیدهد. اگر این خطمشی روی یک رشته نشانگر نام دامنه تنظیم شود، <ph name="PRODUCT_OS_NAME" />گزینه تکمیل خودکار را درحین فرآیند ورود به سیستم کاربر نشان می دهد و به کاربر امکان میدهد فقط نام کاربری خود را بدون افزونه نام دامنه وارد کند. کاربر میتواند این افزونه نام دامنه را بازنویسی کند.</translation> <translation id="1865417998205858223">مجوزهای کلیدی</translation> @@ -805,11 +796,6 @@ <translation id="3660562134618097814">انتقال کوکیهای SAML IdP هنگام ورود به سیستم</translation> <translation id="3709266154059827597">پیکربندی فهرست سیاه نصب برنامههای افزودنی</translation> <translation id="3711895659073496551">تعویق</translation> -<translation id="3715448429089775791">حالت ایمنی YouTube را به اجبار فعال میکند و اجازه نمیدهد کاربران این تنظیم را تغییر دهند. - - اگر این تنظیم را فعال کنید، حالت ایمنی در YouTube همیشه فعال است. - - اگر این تنظیم را غیرفعال کنید یا مقداری را تعیین نکنید، حالت ایمنی در YouTube بهصورت اجباری اجرا نمیشود.</translation> <translation id="3750220015372671395">مسدود کردن تولید کلید در این سایتها</translation> <translation id="3756011779061588474">مسدود کردن حالت برنامهنویس</translation> <translation id="3758089716224084329">به شما امکان میدهد ازطریق <ph name="PRODUCT_NAME" /> سرور پروکسی مورد استفاده را مشخص کنید و به کاربران اجازه نمیدهد تنظیمات پروکسی را تغییر دهند. @@ -1964,12 +1950,6 @@ شناسههای نوع اتصال شناسایی شده "اترنت"، "wifi"، "wimax، "بلوتوث" و "تلفن همراه" هستند.</translation> <translation id="7763614521440615342">نمایش پیشنهادهای محتوا در صفحه «برگه جدید»</translation> -<translation id="7766336524667238790">گزارش اطلاعاتی درباره جلسه کیوسک فعال مانند - شناسه و نسخه برنامه - - اگر این تنظیم روی تادرست تنظیم شود، اطلاعات جلسه - گزارش نمیشود. اگر روی درست تنظیم شود یا تنظیم نشود، اطلاعات جلسه - گزارش میشود.</translation> <translation id="7774768074957326919">استفاده از تنظیمات پروکسی سیستم</translation> <translation id="7775831859772431793">در اینجا میتوانید نشانی وب سرور پروکسی را مشخص کنید. @@ -2186,6 +2166,10 @@ <translation id="8369602308428138533">تأخیر خاموش شدن صفحه هنگام کار با برق</translation> <translation id="8382184662529825177">فعال کردن استفاده از اعطای گواهی راه دور برای محافظت از محتوا برای دستگاه</translation> <translation id="838870586332499308">رومینگ دادهها فعال شود</translation> +<translation id="8390049129576938611">نمایشگر PDF داخلی را در <ph name="PRODUCT_NAME" /> غیرفعال میکند. درعوض، با آن مثل بارگیری رفتار میکند و به کاربر امکان میدهد تا فایلهای PDF را با برنامه پیشفرض باز کند. + + اگر این خطمشی تنظیمنشده یا غیرفعال باقی بماند، افزایه PDF برای باز کردن فایلهای PDF استفاده میشود، مگر آنکه کاربر آن را غیرفعال کند.</translation> +<translation id="8402079500086185021">فایلهای PDF همیشه بهصورت خارجی باز شوند</translation> <translation id="8412312801707973447">آیا بررسیهای OCSP/CRL آنلاین اجرا شود</translation> <translation id="8413348101535146315">پایان بخشیدن به پردازشهای «مدیر فعالیتهای» <ph name="PRODUCT_NAME" /> را امکانپذیر میکند. @@ -2206,17 +2190,6 @@ برای دیدن الگوهای نمونه به https://www.chromium.org/developers/how-tos/chrome-frame-getting-started بروید.</translation> <translation id="8493645415242333585">غیر فعال کردن ذخیره سابقه مرور</translation> <translation id="8499172469244085141">تنظیمات پیش فرض (کاربران میتوانند در اولویت قرار دهند)</translation> -<translation id="8501011084242226370">فهرست افزایههایی را مشخص میکند که کاربر میتواند در <ph name="PRODUCT_NAME" /> فعال یا غیرفعال کند. - - نویسههای عام '*' و '?' را میتوان استفاده کرد تا با زنجیره نویسههای اختیاری مطابقت داشته باشد. '*' مطابق با شماره اختیاری نویسهها است در حالی که '?' یک نویسه اختیاری را مشخص میکند، مثلاً مطابق بانویسههای صفر و یک است. نویسه خروج '\' است، بنابراین برای اینکه نویسههای '*', '?', یا '\' را داشته باشید، میتوانید '\' را در جلوی آنها قرار دهید. - - اگر این تنظیم را فعال کنید، فهرست تعیین شده افزایهها را میتوان در <ph name="PRODUCT_NAME" /> استفاده کرد. کاربران میتوانند آنها را در 'about:plugins' فعال و غیرفعال کنند حتی اگر افزایه هم با الگویی در DisabledPlugins مطابقت داشته باشد. کاربران میتوانند افزایههایی را فعال و غیرفعال کنند که با الگویی در DisabledPlugins، DisabledPluginsExceptions و مطابقت داشته باشد. - - این خطمشی برای این است که اکیداً افزایه را در فهرست سیاه قرار دهد که در آن فهرست 'DisabledPlugins' شامل ورودیهای نویسه عام میشود مانند غیرفعال کردن همه افزایهها '*' یا غیرفعال کردن همه افزایههای جاوا اما خواستهای سرپرست برای فعال کردن برخی نسخههای خاص مانند 'IcedTea Java 2.3'. این نسخههای خاص میتوانند در این خطمشی تعیین شوند. - - توجه داشته باشید که هم نام افزایه و نام گروه افزایه باید معاف شود. هر گروه افزایه در بخش جدا در about:plugins نشان داده میشود; هر بخش ممکن است یک یا چند افزایه داشته باشد. برای مثال، "Shockwave Flash" plugin به گروه "Adobe Flash Player" مربوط است و هر دو نام باید مورد مطابقی در فهرست استثنائات داشته باشد درصورتیکه آن افزایه قرار است از فهرست سیاه معاف شود. - - درصورتیکه این خطمشی تنظیم نشود هر افزایهای که با الگوها در 'DisabledPlugins' مطابقت داشته باشد قفل میشود، غیرفعال میشود و کاربر نمیتواند آنها را فعال کند.</translation> <translation id="8519264904050090490">آدرسهای اینترنتی استثنای دستی کاربر مدیریت شده</translation> <translation id="8544375438507658205">مجری و تفسیرگر پیشفرض HTML برای <ph name="PRODUCT_FRAME_NAME" /></translation> <translation id="8549772397068118889">هشدار در هنگام بازدید از سایتهای خارج از بستههای محتوا</translation> @@ -2241,7 +2214,6 @@ نام چند سرور را با ویرگول جدا نمایید. نویسه عام (*) مجاز است. اگر این خط مشی را بدون تنظیم رها کنید، <ph name="PRODUCT_NAME" /> برای شناسایی وجود سرور در اینترانت تلاش میکند و تنها پس از این به درخواستهای IWA پاسخ خواهد داد. در صورتی که سرور به عنوان اینترنت شناسایی شود، <ph name="PRODUCT_NAME" /> درخواستهای IWA صادر شده از طرف سرور را نادیده میگیرد.</translation> -<translation id="8668394701842594241">فهرست افزایههای فعال در <ph name="PRODUCT_NAME" /> را مشخص کرده و به کاربران اجازه تغییر این تنظیم را نمیدهد. نویسههای عمومی "*" و "؟" میتوانند برای تطابق توالی نویسههای اختیاری استفاده شوند. "*" با تعداد دلخواهی از نویسهها مطابقت میکند در حالی که "؟" به جای یک نویسه اختیاری به کار میرود، یعنی با صفر یا یک نویسه مطابقت میکند. نویسه گریز "\" است که برای مطابقت با نویسههای "*"، "؟" یا "\" به کار میرود. فهرست افزایههای مشخص شده در صورت نصب بودن، همیشه در <ph name="PRODUCT_NAME" /> استفاده میشوند. این افزایهها در "about:plugins" بهعنوان فعال علامتگذاری میشوند و کاربران نمیتوانند آنها را غیرفعال کنند. توجه کنید که این قانون، تنظیمات قانونهای DisabledPlugins و DisabledPluginsExceptions را لغو میکند. اگر این قانون تنظیم نشده باقی بماند، کاربر میتواند هر افزایه نصب شده بر روی سیستم را غیرفعال کند.</translation> <translation id="8672321184841719703">نسخه بهروزرسانی خودکار هدف</translation> <translation id="868068801094828689">ارسال گزارش بینام دادههای مربوط به مصرف و خرابی <ph name="PRODUCT_NAME" /> را به Google فعال میکند و مانع میشود که کاربران این تنظیم را تغییر دهند. @@ -2344,13 +2316,6 @@ پیکربندی را (اگر موجود باشند) بارگیری میکند و آنها را در دستگاه ذخیره میکند. چنین فایلهایی ممکن است بهطور مثال برای بهبود کیفیت نمایش نمایشگرهای متصل استفاده شوند.</translation> -<translation id="8905426178924715309">این خطمشی منسوخ شده است، لطفاً بهجای آن از ForceGoogleSafeSearch و ForceYouTubeSafetyMode استفاده کنید. اگر ForceGoogleSafeSearch یا ForceYouTubeSafetyMode تنظیم شوند، این خطمشی نادیده گرفته میشود. - - جستجوها در «جستجوی وب Google» را مجبور میکند با حالت فعال «جستجوی ایمن» انجام شوند و کاربران نمیتوانند این تنظیم را تغییر دهند. این تنظیم همچنین «حالت ایمنی» اجباری را در YouTube فعال میکند. - - اگر این تنظیم را فعال کنید، «جستجوی ایمن» در جستجوی Google و YouTube همواره فعال است. - - اگر این تنظیم را غیرفعال کنید یا مقداری را تنظیم نکنید، «جستجوی ایمن» در جستجوی Google و YouTube اجبار نمیشود.</translation> <translation id="8906768759089290519">حالت مهمان فعال شود</translation> <translation id="8908294717014659003">به شما اجازه میدهد تنظیم کنید آیا وب سایتها مجاز هستند به دستگاههای ضبط رسانه دسترسی داشته باشند، یا هربار که کاربر میخواهد به دستگاههای ضبط رسانه دسترسی داشته باشد از وی پرسیده شود.
diff --git a/components/policy/resources/policy_templates_fi.xtb b/components/policy/resources/policy_templates_fi.xtb index 892fbf2..7c00de2 100644 --- a/components/policy/resources/policy_templates_fi.xtb +++ b/components/policy/resources/policy_templates_fi.xtb
@@ -203,15 +203,6 @@ 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 \. - - Jos otat asetuksen käyttöön, määritettyjä laajennuksia ei koskaan käytetä tuotteessa <ph name="PRODUCT_NAME" />. Laajennukset merkitään pois käytöstä oleviksi about:plugins-kohdassa, eivätkä käyttäjät voi ottaa niitä käyttöön. - - Huomaa, että tämä käytäntö voidaan ohittaa EnabledPlugins- ja DisabledPluginsExceptions-käytännöillä. - - Jos tätä käytäntöä ei ole määritetty, käyttäjät voivat käyttää mitä tahansa järjestelmään asennettuja laajennuksia, paitsi laajennuksia, jotka on määritetty epäyhteensopiviksi, vanhentuneiksi tai vaarallisiksi.</translation> <translation id="1864269674877167562">Jos tämän käytännön arvoksi asetetaan tyhjä merkkijono tai sitä ei määritetä, <ph name="PRODUCT_OS_NAME" /> ei näytä automaattisesti täydennettyä verkkotunnusta kirjautumisen yhteydessä. Jos tämän käytännön arvoksi asetetaan verkkotunnusta vastaava merkkijono, <ph name="PRODUCT_OS_NAME" /> näyttää kirjautumisen yhteydessä automaattisesti täydennetyn verkkotunnuksen, jolloin käyttäjän tarvitsee kirjoittaa vain käyttäjänimi ilman verkkotunnusta. Käyttäjä voi myös korvata automaattisesti täydennetyn osan muulla verkkotunnuksella.</translation> <translation id="1865417998205858223">Tärkeimmät käyttöoikeudet</translation> @@ -814,11 +805,6 @@ <translation id="3660562134618097814">SAML-tunnistuspalvelun evästeiden siirto kirjautumisen aikana</translation> <translation id="3709266154059827597">Määritä, mitä laajennuksia ei saa asentaa</translation> <translation id="3711895659073496551">Keskeytä</translation> -<translation id="3715448429089775791">Pakottaa YouTuben rajoitetun tilan käyttöön ja estää käyttäjiä muokkaamasta tätä asetusta. - - Jos tämä asetus on käytössä, YouTuben rajoitettu tila on aina aktiivisena. - - Jos tämä asetus on pois käytöstä tai sille ei aseteta arvoa, YouTuben rajoitettua tilaa ei pakoteta käyttöön.</translation> <translation id="3750220015372671395">Estä avainten luominen näillä sivustoilla</translation> <translation id="3756011779061588474">Estä kehittäjätila</translation> <translation id="3758089716224084329">Voit määrittää välityspalvelimen, jota <ph name="PRODUCT_NAME" /> käyttää, ja estää käyttäjiä muokkaamasta välityspalvelinasetuksia. @@ -1981,12 +1967,6 @@ Tunnistettuja yhteystyypin tunnuksia ovat ethernet, wifi, wimax, bluetooth ja cellular.</translation> <translation id="7763614521440615342">Näytä sisältöehdotuksia Uusi välilehti ‑sivulla</translation> -<translation id="7766336524667238790">Raportoi aktiivisen kioskikäyttökerran tietoja, kuten - sovellustunnuksen ja -version. - - Jos käytännön arvo on Epätosi, käyttökertatietoja ei - raportoida. Jos arvo on Tosi tai sitä ei aseteta, käyttökertatiedot - raportoidaan.</translation> <translation id="7774768074957326919">Käytä järjestelmän välityspalvelimen asetuksia</translation> <translation id="7775831859772431793">Voit määrittää välityspalvelimen URL-osoitteen tässä. @@ -2208,6 +2188,10 @@ <translation id="8369602308428138533">Ruudun sammutuksen viive käytettäessä laitetta verkkovirralla</translation> <translation id="8382184662529825177">Poista käytöstä etävahvistuksen käyttö laitteen sisällön suojauksen vuoksi</translation> <translation id="838870586332499308">Ota mobiilitiedonsiirto käyttöön roaming-tilassa</translation> +<translation id="8390049129576938611">Poista käytöstä tuotteen <ph name="PRODUCT_NAME" /> sisäinen PDF-katseluohjelma. Tuote kohtelee PDF-tiedostoja latauksina ja sallii niiden avaamisen käyttäjän valitsemalla oletussovelluksella. + + Jos tätä käytäntöä ei määritetä tai se poistetaan käytöstä, PDF-tiedostot avataan käyttämällä PDF-laajennusta, ellei käyttäjä poista laajennusta käytöstä.</translation> +<translation id="8402079500086185021">Avaa PDF-tiedostot aina ulkoisella sovelluksella</translation> <translation id="8412312801707973447">OCSP-/CRL-tarkistusten suorittaminen</translation> <translation id="8413348101535146315">Tämä käytäntö sallii prosessien lopettamisen <ph name="PRODUCT_NAME" />n tehtävänhallinnassa. @@ -2228,17 +2212,6 @@ Esimerkkimalleja on osoitteessa http://www.chromium.org/developers/how-tos/chrome-frame-getting-started.</translation> <translation id="8493645415242333585">Poista selainhistorian tallentaminen käytöstä</translation> <translation id="8499172469244085141">Oletusasetukset (käyttäjät voivat ohittaa)</translation> -<translation id="8501011084242226370">Määrittää laajennukset, jotka käyttäjä voi ottaa käyttöön tai poistaa käytöstä tuotteessa <ph name="PRODUCT_NAME" />. - - Jokerimerkeillä * ja ? voidaan korvata satunnaisten merkkien jonoja. * vastaa satunnaista merkkien lukumäärää ja ? määrittää yhden valinnaisen merkin, eli se vastaa yhtä tai nollaa merkkiä. Koodinvaihtomerkki on \, joten jos haluat käyttää merkkejä *, ? tai \ ilman niiden lisämerkitystä, niiden eteen täytyy lisätä merkki \. - - Jos otat tämän asetuksen käyttöön, luettelossa määritettyjä laajennuksia voi käyttää tuotteessa <ph name="PRODUCT_NAME" />. Käyttäjät voivat ottaa laajennuksia käyttöön tai poistaa niitä käytöstä sivulla about:plugins, vaikka laajennus vastaisi myös DisabledPlugins-luettelon mallia. Käyttäjät voivat myös ottaa käyttöön tai poistaa käytöstä laajennuksia, jotka eivät vastaa DisabledPlugins-, DisabledPluginsExceptions- ja EnabledPlugins-luetteloiden malleja. - - Tämän käytännön avulla voit määrittää tarkan kiellettyjen laajennuksien DisabledPlugins-luettelon, joka sisältää jokerimerkilliset kohteet, kuten kaikki laajennukset käytöstä poistava * tai kaikki Java-laajennukset käytöstä poistava Java*. Järjestelmänvalvoja voi kuitenkin sallia tiettyjä laajennuksien versioita, kuten IcedTea Java 2.3. Sallitut versiot voi määrittää tämän käytännön avulla. - - Huomaa, että sekä laajennuksen että laajennuksen ryhmän nimi täytyy lisätä poikkeusluetteloon. Kaikki laajennusryhmät näkyvät erillisissä osioissa sivulla about:plugins, ja kussakin osiossa voi olla yksi tai useampia laajennuksia. Esimerkiksi Shockwave Flash -laajennus kuuluu Adobe Flash Player -ryhmään, ja molemmat nimet täytyy lisätä poikkeusluetteloon, jos haluat sallia kyseisen laajennuksen käytön. - - Jos tätä käytäntöä ei ole määritetty, mitään DisabledPlugins-luettelon malleja vastaavia laajennuksia ei voi käyttää eikä käyttäjä voi muuttaa asetusta.</translation> <translation id="8519264904050090490">Hallinnoidun käyttäjän manuaalisten poikkeuksien URL-osoitteet</translation> <translation id="8544375438507658205">HTML-osoitteiden oletushahmonnin tuotteelle <ph name="PRODUCT_FRAME_NAME" /></translation> <translation id="8549772397068118889">Varoita, kun sisältöpaketteihin kuulumaton sivusto avataan</translation> @@ -2275,7 +2248,6 @@ Erota palvelinten nimet pilkulla. Jokerimerkit (*) sallitaan. Jos et aseta käytäntöä, <ph name="PRODUCT_NAME" /> pyrkii tarkistamaan, onko palvelin sisäverkossa, ja vastaa vasta sitten IWA-pyyntöihin. Jos palvelimen todetaan sijaitsevan sisäverkossa, <ph name="PRODUCT_NAME" /> ohittaa sen IWA-pyynnöt.</translation> -<translation id="8668394701842594241">Määrittää laajennukset, joita voi käyttää tuotteessa <ph name="PRODUCT_NAME" />, ja estää käyttäjiä muuttamasta tätä asetusta. Jokerimerkeillä * ja ? voidaan korvata mitä tahansa merkkejä. * korvaa rajoittamattoman määrän merkkejä, kun taas ? korvaa yksittäisen valinnaisen merkin, eli nolla merkkiä tai yhden merkin. Vaihtomerkki on \, joten jos haluat käyttää merkkejä *, ? tai \ ilman niiden jokerimerkkimerkitystä, lisää niiden eteen merkki \. Luettelossa olevia laajennuksia käytetään aina tuotteessa <ph name="PRODUCT_NAME" />, jos ne on asennettu. Laajennukset merkitään käytössä oleviksi kohdassa about:plugins, eivätkä käyttäjät voi poistaa niitä käytöstä. Huomaa, että tämä käytäntö ohittaa sekä käytännön DisabledPlugins että DisabledPluginsExceptions. Jos tätä käytäntöä ei ole määritetty, käyttäjä voi poistaa käytöstä minkä tahansa järjestelmään asennetun laajennuksen.</translation> <translation id="8672321184841719703">Automaattisen päivityksen version määrittäminen</translation> <translation id="868068801094828689">Määrittää, voiko <ph name="PRODUCT_NAME" /> lähettää Googlelle anonyymejä käyttö- ja virhetietoja, ja estää käyttäjiä muokkaamasta tätä asetusta. @@ -2367,13 +2339,6 @@ automaattisesti yhteyttä Quirks Serveriin ja lataa määritystiedostot, jos ne ovat saatavilla, ja tallentaa ne laitteelle. Näitä tiedostoja voidaan käyttää esimerkiksi liitettyjen näyttöjen laadun parantamiseen.</translation> -<translation id="8905426178924715309">Tämä käytäntö on vanhentunut, ja sen tilalla tulee käyttää käytäntöjä ForceGoogleSafeSearch ja ForceYouTubeSafetyMode. Tämä käytäntö ohitetaan, jos joko ForceGoogleSafeSearch tai ForceYouTubeSafetyMode on asetettu. - - Pakottaa SafeSearch-tilan käyttöön Google-haun kyselyissä ja estää käyttäjiä muuttamasta asetusta. Lisäksi tämä käytäntö pakottaa rajoitetun tilan käyttöön YouTubessa. - - Jos tämä asetus on käytössä, Google-haun SafeSearch ja YouTuben rajoitettu tila ovat aina käytössä. - - Jos tämä asetus poistetaan käytöstä tai jos sille ei aseteta mitään arvoa, Google-haun SafeSearchia ja YouTuben rajoitettua tilaa ei pakoteta käyttöön.</translation> <translation id="8906768759089290519">Ota vierastila käyttöön</translation> <translation id="8908294717014659003">Voit määrittää, mitkä sivut saavat käyttää mediantallennuslaitteita. Mediantallennuslaitteiden käyttö voidaan sallia oletuksena, tai käyttäjältä voidaan kysyä aina, kun sivusto haluaa käyttää tallennuslaitteita.
diff --git a/components/policy/resources/policy_templates_fil.xtb b/components/policy/resources/policy_templates_fil.xtb index 7bc9b000..da40370 100644 --- a/components/policy/resources/policy_templates_fil.xtb +++ b/components/policy/resources/policy_templates_fil.xtb
@@ -207,15 +207,6 @@ 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. - - Kung pinagana mo ang setting na ito, hindi kailanman gagamitin sa <ph name="PRODUCT_NAME" /> ang tinukoy na listahan ng mga plugin. Nilalagyan ng marka ang mga plugin bilang hindi pinapagana sa 'about:plugins' at hindi mapapagana ng mga user ang mga ito. - - Tandaan na maaaring i-override ng EnabledPlugins at DisabledPluginsExceptions ang patakarang ito. - - Kung hinayaang hindi nakatakda ang patakarang ito, magagamit ng user ang anumang plugin na naka-install sa system maliban sa mga naka-hard-code na plugin na hindi tugma, luma o mapanganib.</translation> <translation id="1864269674877167562">Kung nakatakda sa isang blangkong string o hindi naka-configure ang patakaran na ito, hindi magpapakita ang <ph name="PRODUCT_OS_NAME" /> ng isang opsyon sa pag-autocomplete sa flow ng pag-sign in ng user. Kung ang patakaran na ito ay nakatakda sa isang string na kumakatawan sa isang domain name, magpapakita ang <ph name="PRODUCT_OS_NAME" /> ng opsyon sa pag-autocomplete sa pag-sign in ng user na nagbibigay-daan sa user na i-type lang ang kanyang user name nang wala ang extension ng domain name. Magagawa ng user na i-overwrite ang extension ng domain name na ito.</translation> <translation id="1865417998205858223">Mga Pangunahing Pahintulot</translation> @@ -857,11 +848,6 @@ <translation id="3660562134618097814">Ilipat ang cookies ng SAML IdP sa pag-log in</translation> <translation id="3709266154059827597">I-configure ang blacklist ng pag-install ng extension</translation> <translation id="3711895659073496551">Suspendihin</translation> -<translation id="3715448429089775791">Pinupuwersang maging aktibo ang YouTube Safety Mode at pinipigilan ang mga user sa pagbabago sa setting na ito. - - Kung i-enable mo ang setting na ito, palaging aktibo ang Safety Mode sa YouTube. - - Kung i-disable mo ang setting na ito o hindi nagtakda ng value, hindi ipapatupad ang Safety Mode sa YouTube.</translation> <translation id="3750220015372671395">I-block ang pagbuo ng key sa mga site na ito</translation> <translation id="3756011779061588474">I-block ang mode ng developer</translation> <translation id="3758089716224084329">Binibigyang-daan kang tukuyin ang proxy server na ginamit ng <ph name="PRODUCT_NAME" /> at pinipigilan ang mga user na baguhin ang mga setting ng proxy. @@ -2122,12 +2108,6 @@ Ang mga kilalang identifier ng uri ng koneksyon ay "ethernet," "wifi," "wimax," "bluetooth" at "cellular."</translation> <translation id="7763614521440615342">Ipakita ang mga suhestyon sa content sa page ng Bagong Tab</translation> -<translation id="7766336524667238790">Nag-uulat ng impormasyon tungkol sa aktibong session sa kiosk, gaya ng - application ID at bersyon. - - Kung itatakda ang patakaran sa false, hindi iuulat ang impormasyon ng - session. Kung itatakda sa true o kung sadyang hindi itatakda, iuulat ang impormasyon - ng session.</translation> <translation id="7774768074957326919">Gumamit ng mga setting ng proxy ng system</translation> <translation id="7775831859772431793">Maaari mong itakda rito ang URL ng proxy server. @@ -2364,6 +2344,10 @@ <translation id="8369602308428138533">Delay ng pag-off ng screen kapag tumatakbo habang nakasaksak sa kuryente</translation> <translation id="8382184662529825177">I-enable ang paggamit ng malayuang pagpapatotoo para sa pagprotekta sa nilalaman para sa device</translation> <translation id="838870586332499308">Payagan ang roaming ng data</translation> +<translation id="8390049129576938611">Dini-disable ang internal PDF viewer sa <ph name="PRODUCT_NAME" />. Sa halip, itinuturing nito ito bilang download at pinapayagan ang user na magbukas ng mga PDF na file gamit ang default na application. + + Kung iiwanang hindi nakatakda o naka-disable ang patakarang ito, gagamitin ang PDF plugin upang magbukas ng mga PDF file maliban na lang kung idi-disable ito ng user.</translation> +<translation id="8402079500086185021">Palaging Magbukas ng mga PDF file nang external</translation> <translation id="8412312801707973447">Kung isinasagawa ang mga online na pagsusuri sa OCSP/CRL</translation> <translation id="8413348101535146315">Ine-enable ang pagwawakas ng mga proseso sa Task Manager ng <ph name="PRODUCT_NAME" />. @@ -2384,17 +2368,6 @@ Para sa mga halimbawang pattern, tingnan ang https://www.chromium.org/developers/how-tos/chrome-frame-getting-started.</translation> <translation id="8493645415242333585">Huwag paganahin ang pag-save ng kasaysayan ng browser</translation> <translation id="8499172469244085141">Mga Default na Setting (maaaring i-override ng mga user)</translation> -<translation id="8501011084242226370">Tumutukoy ng listahan ng mga plugin na maaaring i-enable o i-disable ng user sa <ph name="PRODUCT_NAME" />. - - Maaaring gamitin ang mga wildcard character na '*' at '?' upang itugma sa mga sequence ng mga arbitrary character. Tumutugma ang '*' sa isang arbitrary na bilang ng mga character habang tinutukoy ng '?' ang isang opsyonal na iisang character, na tumutugma sa mga character na zero o one. Ang escape character ay '\', kaya upang itugma ang mga aktwal na character na '*', '?', o '\', maaari kang maglagay ng '\' sa harap ng mga ito. - - Kung i-e-enable mo ang setting na ito, magagamit ang mga natukoy na listahan ng mga plugin sa <ph name="PRODUCT_NAME" />. Maaaring i-enable o i-disable ng mga user ang mga iyon sa 'about:plugins,' kahit na tumutugma rin ang plugin sa isang pattern sa DisabledPlugins. Maaari ding mag-enable at mag-disable ang mga user ng mga plugin na hindi tumutugma sa anumang mga pattern sa DisabledPlugins, DisabledPluginsExceptions at EnabledPlugins. - - Nakalaan ang patakarang ito upang payagan ang mahigpit na pag-blacklist ng plugin kung saan naglalaman ang listahan ng 'DisabledPlugins' ng mga naka-wildcard na entry tulad ng i-disable ang lahat ng plugin na '*' o i-disable ang lahat ng Java plugin na '*Java*' ngunit hinihiling ng administrator na i-enable ang ilang partikular na bersyon tulad ng 'IcedTea Java 2.3.' Matutukoy ang mga partikular na bersyong ito sa patakarang ito. - - Tandaan na hindi dapat kasama ang parehong pangalan ng plugin at ang pangalan ng pangkat ng plugin. Ipinapakita ang bawat pangkat ng plugin sa isang hiwalay na seksyon sa about:plugins; maaaring may isa o higit pang mga plug-in ang bawat seksyon. Halimbawa, nabibilang ang plugin na "Shockwave Flash" sa pangkat na "Adobe Flash Player," at kailangan may katugma ang parehong pangalan sa listahan ng mga exception kung hindi isasama ang plugin na iyon sa blacklist. - - Kung iniwang hindi nakatakda ang patakarang ito, ila-lock nang naka-disable ang anumang plugin na tumutugma sa mga pattern sa 'DisabledPlugins' at hindi ma-e-enable ng user ang mga iyon.</translation> <translation id="8519264904050090490">Mga pinapamahalaang URL ng manu-manong exception ng user</translation> <translation id="8544375438507658205">Default na taga-render ng HTML para sa <ph name="PRODUCT_FRAME_NAME" /></translation> <translation id="8549772397068118889">Magbabala kapag bumibisita ng mga site na nasa labas ng mga pack ng nilalaman</translation> @@ -2435,15 +2408,6 @@ Paghiwalayin ang maraming pangalan ng server gamit ang mga kuwit. Pinapayagan ang mga wildcard (*). Kung iiwanan mong hindi nakatakda ang patakarang ito, susubukan ng <ph name="PRODUCT_NAME" /> na i-detect kung nasa Intranet ang server, at kung oo ay doon lang ito tutugon sa mga kahilingan ng IWA. Kung na-detect ang server bilang Internet, babalewalain ng <ph name="PRODUCT_NAME" /> ang mga kahilingan ng IWA mula dito.</translation> -<translation id="8668394701842594241">Tumutukoy ng isang listahan ng mga plugin na pinagana sa <ph name="PRODUCT_NAME" /> at pumipigil sa mga user na baguhin ang setting na ito. - - Magagamit ang mga wildcard na character na '*' at '?' upang itugma ang mga pagkakasunud-sunod ng mga arbitrary na character. Itinutugma ng '*' ang isang arbitrary na numero ng mga character habang tinutukoy ng '?' ang isang opsyonal na isahang character, hal. itinutugma ang zero o isang character. Ang escape na character ay '\', kaya upang tumugma sa aktwal na '*', '?', o '\' na mga character, maaari kang maglagay ng isang '\' sa harap ng mga ito. - - Palaging ginagamit sa <ph name="PRODUCT_NAME" /> ang tinukoy na listahan ng mga plugin kung naka-install ang mga ito. Ang mga plugin ay minamarkahan bilang pinagana sa 'about:plugins' at hindi magagawa ng mga user na hindi paganahin ang mga ito. - - Tandaang ino-override ng patakarang ito ang parehong DisabledPlugins at DisabledPluginsExceptions. - - Kung hinayaang hindi nakatakda ang patakarang ito maaaring hindi paganahin ng user ang anumang plugin na naka-install sa system.</translation> <translation id="8672321184841719703">Target Auto Update Na Bersyon</translation> <translation id="868068801094828689">Ine-enable ang anonymous na pag-uulat sa Google ng data ng paggamit at nauugnay sa pag-crash ng <ph name="PRODUCT_NAME" /> at pinipigilan ang mga user sa pagbabago sa setting na ito. @@ -2542,13 +2506,6 @@ sa Quirks Server at ida-download nito ang mga configuration file, kung available, at iiimbak ang mga ito sa device. Ang mga naturang file, halimbawa, ay maaaring gamitin upang pagandahin ang kalidad ng display ng mga naka-attach na monitor.</translation> -<translation id="8905426178924715309">Hindi na ginagamit ang patakarang ito, pakigamit na lang ang ForceGoogleSafeSearch at ForceYouTubeSafetyMode. Babalewalain ang patakarang ito kung itatakda ang alinman sa mga patakarang ForceGoogleSafeSearch o ForceYouTubeSafetyMode. - - Pinupuwersang isagawa ang mga query sa Google Web Search nang nakatakda ang SafeSearch sa aktibo at pinipigilan ang mga user na baguhin ang setting na ito. Ipinapatupad din ng setting na ito ang Safety Mode sa YouTube. - - Kung ie-enable mo ang setting na ito, palaging aktibo ang SafeSearch sa Google Search at YouTube. - - Kung idi-disable mo ang setting na ito o kung hindi ka magtatakda ng value, hindi ipapatupad ang SafeSearch sa Google Search at YouTube.</translation> <translation id="8906768759089290519">Payagan ang mode ng bisita</translation> <translation id="8908294717014659003">Binibigyang-daan kang itakda kung papayagan ang mga website na makakuha ng access sa mga media capture na device. Maaaring payagan bilang default ang access sa mga media capture na device, o maaaring tanungin ang user sa tuwing may website na nagnanais na mag-access sa mga media capture na device.
diff --git a/components/policy/resources/policy_templates_fr.xtb b/components/policy/resources/policy_templates_fr.xtb index c26c44bb..29019e9 100644 --- a/components/policy/resources/policy_templates_fr.xtb +++ b/components/policy/resources/policy_templates_fr.xtb
@@ -211,15 +211,6 @@ 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. - - En cas d'activation de ce paramètre, la liste de plug-ins définie n'est jamais utilisée dans <ph name="PRODUCT_NAME" />. Les plug-ins sont marqués comme désactivés dans "about:plugins", et les utilisateurs n'ont pas la possibilité de les activer. - - Notez que cette règle peut être remplacée par EnabledPlugins et DisabledPluginsExceptions. - - En cas de non-configuration de ce paramètre, l'utilisateur peut utiliser n'importe quel plug-in installé sur le système, à l'exception des plug-ins codés en dur incompatibles, et des plug-ins obsolètes ou dangereux.</translation> <translation id="1864269674877167562">Si cette règle est définie sur une chaîne vide ou n'est pas configurée, <ph name="PRODUCT_OS_NAME" /> n'affichera pas d'option de saisie semi-automatique lors de la procédure de connexion de l'utilisateur. Si cette règle est définie sur une chaîne représentant un nom de domaine, <ph name="PRODUCT_OS_NAME" /> affichera une option de saisie semi-automatique lors de la procédure de connexion. Ceci permettra à l'utilisateur de ne saisir que son nom d'utilisateur sans préciser l'extension du nom de domaine. L'utilisateur sera autorisé à modifier cette extension du nom de domaine.</translation> <translation id="1865417998205858223">Autorisations de clés</translation> @@ -866,11 +857,6 @@ <translation id="3660562134618097814">Transférer des cookies de fournisseurs d'identité SAML lors de la connexion</translation> <translation id="3709266154059827597">Configurer la liste noire d'installation des extensions</translation> <translation id="3711895659073496551">Arrêter</translation> -<translation id="3715448429089775791">Force l'activation du mode sécurisé de YouTube et empêche les utilisateurs de modifier ce paramètre. - - Si vous activez ce paramètre, le mode sécurisé de YouTube est toujours actif. - - Si vous le désactivez ou ne définissez aucune valeur, le mode sécurisé de YouTube n'est pas appliqué.</translation> <translation id="3750220015372671395">Bloquer la génération de clé sur ces sites</translation> <translation id="3756011779061588474">Bloquer le mode développeur</translation> <translation id="3758089716224084329">Permet de préciser le serveur proxy utilisé par <ph name="PRODUCT_NAME" /> et d'empêcher les utilisateurs de modifier les paramètres de proxy. @@ -2143,12 +2129,6 @@ Les identifiants des types de connexion reconnus sont "ethernet", "wifi", "wimax", "bluetooth" et "cellular".</translation> <translation id="7763614521440615342">Afficher des recommandations de contenus sur la page "Nouvel onglet"</translation> -<translation id="7766336524667238790">Transmettre des informations sur la session kiosque active, - telles que l'ID et la version de l'application. - - Si la règle est définie sur "False", les informations sur la session ne seront - pas transmises. Si elle est définie sur "True" ou si elle n'est pas configurée, - les informations sur la session seront transmises.</translation> <translation id="7774768074957326919">Utiliser les paramètres proxy du système</translation> <translation id="7775831859772431793">Vous pouvez indiquer ici l'URL du serveur proxy. @@ -2387,6 +2367,10 @@ <translation id="8369602308428138533">Délai d'arrêt de l'écran (secteur)</translation> <translation id="8382184662529825177">Autoriser l'utilisation de l'attestation à distance pour assurer la protection du contenu de l'appareil</translation> <translation id="838870586332499308">Activer l'itinérance des données</translation> +<translation id="8390049129576938611">Désactive la visionneuse de documents PDF intégrée dans <ph name="PRODUCT_NAME" />. Les fichiers PDF sont alors traités comme des téléchargements que l'utilisateur peut ouvrir avec l'application par défaut. + + Si cette règle n'est pas définie ou si elle est désactivée, le plug-in PDF est utilisé pour ouvrir les fichiers PDF, sauf si l'utilisateur le désactive.</translation> +<translation id="8402079500086185021">Toujours ouvrir les fichiers PDF en externe</translation> <translation id="8412312801707973447">Si des contrôles OCSP/CRL en ligne sont effectués</translation> <translation id="8413348101535146315">Permet de mettre fin aux processus dans le gestionnaire des tâches de <ph name="PRODUCT_NAME" />. @@ -2407,17 +2391,6 @@ Pour voir des exemples de formats, accédez à l'adresse https://www.chromium.org/developers/how-tos/chrome-frame-getting-started.</translation> <translation id="8493645415242333585">Désactiver l'enregistrement de l'historique du navigateur</translation> <translation id="8499172469244085141">Paramètres par défaut (les utilisateurs peuvent les contourner)</translation> -<translation id="8501011084242226370">Indique une liste de plug-ins que l'utilisateur peut activer ou désactiver dans <ph name="PRODUCT_NAME" />. - - Les caractères génériques "*" et "?" permettent de représenter des séquences de caractères arbitraires. "*" représente un nombre arbitraire de caractères, tandis que "?" désigne un seul caractère ou pas de caractère du tout. "\" est le caractère d'échappement que vous devez utiliser devant "*", "?" ou "\" pour que ces caractères soient pris en compte tels quels. - - Si vous activez ce paramètre, la liste spécifiée de plug-ins peut être utilisée dans <ph name="PRODUCT_NAME" />. Les utilisateurs peuvent les activer ou les désactiver via l'attribut "about:plugins", même s'ils correspondent à un schéma dans "DisabledPlugins". Les utilisateurs peuvent également activer et désactiver les plug-ins qui ne correspondent à aucun schéma dans "DisabledPlugins", "DisabledPluginsExceptions" et "EnabledPlugins". - - Cette règle a pour but de permettre l'ajout strict de plug-ins à une liste noire lorsque la liste "DisabledPlugins" contient des entrées comportant des caractères génériques tels que "*" pour la désactivation de tous les plug-ins ou "*Java*" pour la désactivation de tous les plug-ins Java, mais que l'administrateur souhaite activer une version spécifique telle que "IcedTea Java 2.3". Dans ce cas, il peut spécifier cette version spécifique dans cette règle. - - Sachez que le nom du plug-in et son nom de groupe doivent tous les deux être exemptés. Chaque groupe de plug-ins s'affiche dans une section séparée dans "about:plugins", et chaque section peut contenir un plug-in ou plus. Par exemple, le plug-in "Shockwave Flash" fait partie du groupe "Adobe Flash Player". Ces deux noms doivent donc être indiqués dans la liste d'exceptions pour que le plug-in soit exclu de la liste noire. - - Si vous ne définissez pas cette règle, tout plug-in correspondant à un schéma dans "DisabledPlugins" est désactivé et verrouillé, et l'utilisateur ne peut pas l'activer.</translation> <translation id="8519264904050090490">URL d'exception manuelle des utilisateurs gérés</translation> <translation id="8544375438507658205">Moteur de rendu HTML par défaut pour <ph name="PRODUCT_FRAME_NAME" /></translation> <translation id="8549772397068118889">Prévenir en cas de consultation de sites en dehors des packs de contenu</translation> @@ -2453,15 +2426,6 @@ Si vous utilisez plusieurs serveurs, séparez leur nom par une virgule. Les caractères génériques (*) sont autorisés. Si vous ne définissez pas cette règle, <ph name="PRODUCT_NAME" /> tente d'identifier si le serveur est sur l'Intranet, auquel cas il répond aux requêtes IWA. Si le serveur est sur Internet, les requêtes IWA sont ignorées par <ph name="PRODUCT_NAME" />.</translation> -<translation id="8668394701842594241">Répertorie les plug-ins activés dans <ph name="PRODUCT_NAME" /> et empêche les utilisateurs de modifier ce paramètre. - -Les caractères génériques "*" et "?" remplacent des séquences de caractères arbitraires. "*" correspond à un nombre aléatoire de caractères, tandis que "?" représente un caractère unique facultatif, c'est-à-dire qu'il remplace zéro ou un caractère. Placé devant les caractères "*", "?" ou "\", le caractère d'échappement "\" permet de rechercher ces caractères eux-mêmes. - -La liste de plug-ins indiquée est toujours utilisée dans <ph name="PRODUCT_NAME" /> si ceux-ci sont installés. Les plug-ins sont marqués comme activés dans "about:plugins" et les utilisateurs ne peuvent pas les désactiver. - -Notez que cette règle remplace à la fois "DisabledPlugins" et "DisabledPluginsExceptions". - -Si cette règle n'est pas configurée, l'utilisateur peut désactiver n'importe quel plug-in installé sur le système.</translation> <translation id="8672321184841719703">Cibler une version pour les mises à jour automatiques</translation> <translation id="868068801094828689">Permet d'envoyer des rapports anonymes sur les données relatives à l'utilisation et aux erreurs concernant <ph name="PRODUCT_NAME" /> à Google, et empêche les utilisateurs de modifier ce paramètre. @@ -2569,13 +2533,6 @@ automatiquement contacter Quirks Server et télécharger les fichiers de configuration, s'ils sont disponibles, et les enregistrer sur l'appareil. Ces fichiers pourront, par exemple, être utilisés pour améliorer la qualité d'affichage des moniteurs connectés.</translation> -<translation id="8905426178924715309">Cette règle est abandonnée. Veuillez utiliser ForceGoogleSafeSearch et ForceYouTubeSafetyMode de préférence. Cette règle sera ignorée si des règles ForceGoogleSafeSearch ou ForceYouTubeSafetyMode sont configurées. - - Cette règle entraîne l'activation obligatoire de SafeSearch pour les recherches sur le Web Google. Ce paramètre ne peut pas être modifié par l'utilisateur. Le mode sécurisé de YouTube est également activé. - - Si vous activez ce paramètre, SafeSearch est toujours actif dans la recherche Google et sur YouTube. - - Si vous désactivez ce paramètre ou si vous ne le configurez pas, SafeSearch ne s'appliquera pas à la recherche Google ni à YouTube.</translation> <translation id="8906768759089290519">Activer le mode invité</translation> <translation id="8908294717014659003">Vous permet de définir si les sites Web sont autorisés à accéder aux périphériques de capture multimédia. L'accès aux périphériques de capture multimédia peut être autorisé par défaut, ou l'utilisateur doit confirmer son autorisation chaque fois qu'un site Web souhaite accéder à ceux-ci.
diff --git a/components/policy/resources/policy_templates_gu.xtb b/components/policy/resources/policy_templates_gu.xtb index 38357f3d..62733c3 100644 --- a/components/policy/resources/policy_templates_gu.xtb +++ b/components/policy/resources/policy_templates_gu.xtb
@@ -209,15 +209,6 @@ જો આ નીતિ ગોઠવવામાં ન આવી હોય અથવા તે "tls1.2" પર સેટ થયેલી હોય તો <ph name="PRODUCT_NAME" /> હવે આ ફોલબેકનો અમલ કરશે નહીં. નોંધો કે આ જૂના TLS સંસ્કરણો માટેના સમર્થનને અક્ષમ કરતું નથી, પછી ભલે સંસ્કરણોને યોગ્ય રીતે નિગોશિએટ ન કરી શકતા, બગવાળા સર્વર્સને ઠીક કરવા માટે <ph name="PRODUCT_NAME" /> કામ કરે કે ન કરે. અન્યથા, જો બગ ધરાવતાં સર્વર માટે સુસંગતતા જાળવવી આવશ્યક હોય, તો આ નીતિ "tls1.1" પર સેટ કરવામાં આવી શકે છે. આ એક કામચલાઉ પગલું છે અને સર્વરને ઝડપથી ઠીક કરવું જોઈએ.</translation> -<translation id="1861037019115362154"><ph name="PRODUCT_NAME" /> માં અક્ષમ પ્લગઇન્સની સૂચિનો ઉલ્લેખ કરે છે અને વપરાશકર્તાઓને આ સેટિંગ બદલતા અટકાવે છે. - - આર્બીટ્રેરી અક્ષરોના ક્રમ સાથે મેચ કરવા માટે '*' અને '?' વાઇલ્ડ કાર્ડ અક્ષરોનો ઉપયોગ કરી શકાય છે. '*' એ આર્બીટ્રેરી અક્ષરોની સંખ્યા સાથે મેળ ખાય છે જ્યારે '?' એ એક વૈકલ્પિક એકલ અક્ષરનો ઉલ્લેખ કરે છે, એટલે કે શૂન્ય અથવા એક સાથે મેળ ખાતાં અક્ષરો. એસ્કેપ અક્ષર એ '\' છે, તેથી ચોક્કસ '*', '?', અથવા '\' અક્ષરો સાથે મેળ કરવા, તમે તેમની આગળ એક '\' મૂકી શકો છો. - - જો તમે આ સેટિંગ સક્ષમ કરો છો, તો પ્લગઇન્સની ઉલ્લેખિત સૂચિનો ઉપયોગ તમે <ph name="PRODUCT_NAME" /> માં ક્યારેય કરી શકતા નથી. પ્લગઇન્સ 'about:plugins' માં અક્ષમ તરીકે માર્ક કરેલા હોય છે અને વપરાશકર્તાઓ તેમને સક્ષમ કરી શકતા નથી. - - નોંધ રાખો કે આ નીતિ EnabledPlugins અને DisabledPluginsExceptions દ્વારા ઓવરરાઇડ થઈ શકે છે. - - જો આ નીતિ સેટ કર્યા વગર છોડી હોય, તો વપરાશકર્તા સિસ્ટમ પર ઇન્સ્ટોલ કરેલા હાર્ડ-કોડેડ અસંગત, જૂના અથવા જોખમકારક પ્લગઇન્સ સિવાયનાં કોઈપણ પ્લગઇનનો ઉપયોગ કરી શકે છે.</translation> <translation id="1864269674877167562">જો આ નીતિને ખાલી સ્ટ્રિંગ પર સેટ કરવામાં આવી હોય અથવા ગોઠવવામાં ન આવી હોય, તો વપરાશકર્તા સાઇન-ઇન ફ્લો દરમિયાન <ph name="PRODUCT_OS_NAME" /> સ્વતઃપૂર્ણ વિકલ્પ બતાવશે નહીં. જો આ નીતિને ડોમેન નામ દર્શાવતી સ્ટ્રિંગ પર સેટ કરી હોય, તો વપરાશકર્તા સાઇન-ઇન દરમિયાન <ph name="PRODUCT_OS_NAME" /> સ્વતઃપૂર્ણ વિકલ્પ બતાવશે જે દ્વારા તે વપરાશકર્તાને ડોમેન નામ એક્સ્ટેન્શન વગર માત્ર તેમના વપરાશકર્તા નામને લખવાની મંજૂરી આપશે. વપરાશકર્તા આ ડોમેન નામ એક્સ્ટેન્શનને અધિલેખિત કરવામાં સમર્થ હશે.</translation> <translation id="1865417998205858223">કી પરવાનગીઓ</translation> @@ -852,11 +843,6 @@ <translation id="3660562134618097814">લોગિન દરમિયાન SAML IdP કુકીઝ સ્થાનાંતરિત કરવી</translation> <translation id="3709266154059827597">એક્સ્ટેંશન સ્થાપના બ્લેકલિસ્ટને ગોઠવે છે</translation> <translation id="3711895659073496551">સસ્પેન્ડ કરો</translation> -<translation id="3715448429089775791">YouTube સલામતી મોડને સક્રિય થવાની ફરજ પાડે છે અને વપરાશકર્તાઓને આ સેટિંગ બદલતાં અટકાવે છે. - - જો તમે આ સેટિંગને સક્ષમ કરો છો, તો YouTube પર સલામતી મોડ હંમેશા સક્રિય રહે છે. - - જો તમે આ સેટિંગને અક્ષમ કરો છો અથવા કોઈ મૂલ્ય સેટ કરતાં નથી, તો YouTube પર સલામતી મોડ લાગુ થતો નથી.</translation> <translation id="3750220015372671395">આ સાઇટ્સ પર કી જનરેશનને અવરોધિત કરો</translation> <translation id="3756011779061588474">વિકાસકર્તા મોડને અવરોધિત કરો</translation> <translation id="3758089716224084329">તમને <ph name="PRODUCT_NAME" /> દ્વારા ઉપયોગમાં લેવાતાં પ્રોક્સી સર્વરનો ઉલ્લેખ કરવાની મંજૂરી આપે છે અને વપરાશકર્તાઓને પ્રોક્સી સેટિંગ્સને બદલવાથી અટકાવે છે. @@ -2115,11 +2101,6 @@ ઓળખાયેલ કનેક્શન પ્રકાર ઓળખકર્તાઓ "ઇથરનેટ", "wifi", "wimax", "bluetooth" અને "cellular" છે.</translation> <translation id="7763614521440615342">નવું ટૅબ પૃષ્ઠ પર સામગ્રી સૂચનો બતાવો</translation> -<translation id="7766336524667238790">ઍપ્લિકેશન ID અને સંસ્કરણ જેવા સક્રિય કિઓસ્ક સત્ર વિશે માહિતીની જાણ કરો. - - જો નીતિ false પર સેટ કરવામાં આવી હોય, તો સત્ર માહિતીની જાણ કરવામાં આવશે - નહીં. જો true પર સેટ કરવામાં આવી હોય અથવા સેટ કર્યા વિના છોડી દેવામાં આવી હોય, - તો સત્ર માહિતીની જાણ કરવામાં આવશે.</translation> <translation id="7774768074957326919">સિસ્ટમ પ્રોક્સી સેટિંગનો ઉપયોગ કરો</translation> <translation id="7775831859772431793">તમે અહીં પ્રોક્સી સર્વરના URL નો ઉલ્લેખ કરી શકો છો. @@ -2356,6 +2337,10 @@ <translation id="8369602308428138533">AC પાવર પર ચાલી રહ્યું હોય ત્યારે સ્ક્રીન બંધ વિલંબ</translation> <translation id="8382184662529825177">ઉપકરણ માટે સામગ્રી સુરક્ષા માટે દૂરસ્થ પ્રમાણનના ઉપયોગને સક્ષમ કરો</translation> <translation id="838870586332499308">ડેટા રોમિંગ સક્રિય કરો</translation> +<translation id="8390049129576938611">આંતરિક PDF દર્શકને <ph name="PRODUCT_NAME" /> માં અક્ષમ કરે છે. તેના બદલે તે તેને ડાઉનલોડ તરીકે ગણે છે અને વપરાશકર્તાને ડિફૉલ્ટ ઍપ્લિકેશન વડે PDF ફાઇલોને ખોલવાની મંજૂરી આપે છે. + + જો આ નીતિ સેટ કરેલ ન હોય અથવા તો અક્ષમ કરેલ હોય, તો PDF ફાઇલોને ખોલવા માટે ત્યાં સુધી PDF પ્લગ-ઇનનો ઉપયોગ કરવામાં આવશે જ્યાં સુધી વપરાશકર્તા તેને અક્ષમ કરી ન દે.</translation> +<translation id="8402079500086185021">હંમેશાં PDF ફાઇલોને બાહ્ય રીતે ખોલો</translation> <translation id="8412312801707973447">પછી ભલે ઑનલાઇન OCSP/CRL ચેક્સ કરવામાં આવ્યા હોય</translation> <translation id="8413348101535146315"><ph name="PRODUCT_NAME" /> ના કાર્ય વ્યવસ્થાપકમાં સમાપ્તિની પ્રક્રિયા સક્ષમ કરે છે. @@ -2376,17 +2361,6 @@ ઉદાહરણની પેટર્ન્સ માટે http://www.chromium.org/developers/how-tos/chrome-frame-getting-started જુઓ.</translation> <translation id="8493645415242333585">બ્રાઉઝર ઇતિહાસ સાચવવાનું અક્ષમ કરો</translation> <translation id="8499172469244085141">ડિફૉલ્ટ સેટિંગ્સ (વપરાશકર્તાઓ ઓવરરાઇડ કરી શકે છે)</translation> -<translation id="8501011084242226370">વપરાશકર્તા <ph name="PRODUCT_NAME" /> માં સક્ષમ અથવા અક્ષમ કરી શકે છે તે પ્લગિન્સની સૂચિનો ઉલ્લેખ કરે છે. - - વાઇલ્ડ કાર્ડ અક્ષરો '*' અને '?' નો ઉપયોગ નિયમહીન અક્ષરોની શ્રેણીથી મેળ કરવા માટે થઈ શકે છે. '*' નિયમહીન અક્ષરોની સંખ્યાથી મેળ ખાય છે જ્યારે કે '?' વૈકલ્પિક એકલ અક્ષરનો ઉલ્લેખ કરે છે, એટલે કે શૂન્ય અથવા એક અક્ષરથી મેળ ખાય છે. એસ્કેપ અક્ષર '\' છે, તેથી વાસ્તવિક '*', '?', અથવા '\' અક્ષરોને મેળ કરવા માટે, તમે તેમની આગળ '\' મૂકી શકો છો. - - જો તમે આ સેટિંગ સક્ષમ કરી છે, તો પ્લગિન્સની નિર્દિષ્ટ સૂચિનો ઉપયોગ <ph name="PRODUCT_NAME" /> માં થઈ શકે છે. વપરાશકર્તાઓ તેમને 'about:plugins' માં સક્ષમ અથવા અક્ષમ કરી શકે છે, પછી ભલેને પ્લગિન DisabledPlugins માં નમૂનાથી પણ મેળ ખાતું હોય. વપરાશકર્તાઓ DisabledPlugins, DisabledPluginsExceptions અને EnabledPlugins માં કોઈપણ નમૂનાથી મેળ ખાતાં ન હોય તેવા પ્લગિન્સને સક્ષમ અથવા અક્ષમ પણ કરી શકે છે. - - આ નીતિ ચુસ્ત પ્લગિનને બ્લેકલિસ્ટ કરવાની મંજૂરી આપવા માટે બનાવાઈ છે જ્યાં 'DisabledPlugins' સૂચિમાં વાઇલ્ડ કાર્ડ કરેલ એન્ટ્રીઓ શામેલ છે જેમ કે બધા '*' પ્લગિન્સને અક્ષમ કરો અથવા બધા '*Java*' Java પ્લગિન્સને અક્ષમ કરો પરંતુ વ્યવસ્થાપક 'IcedTea Java 2.3' જેવા કેટલાક ચોક્કસ સંસ્કરણને સક્ષમ કરવા માગે છે. આ ચોક્કસ સંસ્કરણનો ઉલ્લેખ આ નીતિમાં કરી શકાય છે. - - નોંધો કે પ્લગિન નામ અને પ્લગિનનું જૂથ નામ એમ બંનેને છૂટ આપવી પડશે. દરેક પ્લગિન જૂથ about:plugins માં અલગ વિભાગમાં બતાવાય છે અને દરેક વિભાગમાં એક અથવા વધુ પ્લગિન્સ હોઈ શકે છે. ઉદાહરણ તરીકે, "Shockwave Flash" પ્લગિન "Adobe Flash Player" જૂથનું છે અને જો તે પ્લગિનને બ્લેકલિસ્ટમાંથી છૂટ અપાઈ છે તો તે બંને નામોના અપવાદ સૂચિમાં મેળ હોવો જરૂરી છે. - - જો આ નીતિ સેટ કર્યા વિનાની રહેવા દીધી છે, તો કોઈપણ પ્લગિન જે 'DisabledPlugins' માં નમૂનાથી મેળ ખાય છે તે લોક કરવામાં, અક્ષમ કરવામાં આવશે અને વપરાશકર્તા તેમને સક્ષમ કરવામાં સમર્થ થશે નહીં.</translation> <translation id="8519264904050090490">સંચાલિત વપરાશકર્તા માર્ગદર્શિકા અપવાદ URL</translation> <translation id="8544375438507658205"><ph name="PRODUCT_FRAME_NAME" /> માટેનું ડિફૉલ્ટ HTML રેંડરર</translation> <translation id="8549772397068118889">જ્યારે સામગ્રી પૅક્સની બહારની સાઇટ્સની મુલાકાત લઈ રહ્યાં હોય ત્યારે ચેતવો</translation> @@ -2422,15 +2396,6 @@ બહુવિધ સર્વર નામોને અલ્પવિરામ ચિહ્નથી અલગ કરો. વાઇલ્ડ કાર્ડ્સ (*) ની મંજૂરી છે. જો તમે આ નીતિ સેટ કર્યા વિના છોડો છો, તો <ph name="PRODUCT_NAME" /> તે શોધવાનો પ્રયાસ કરશે કે સર્વર ઇન્ટ્રાનેટ પર છે કે કેમ અને ત્યારે પછી જ તે IWA વિનંતીઓનો પ્રતિસાદ આપશે. જો સર્વર ઇન્ટરનેટ તરીકે મળે છે તો પછી તેના તરફથી IWA વિનંતીઓને <ph name="PRODUCT_NAME" /> દ્વારા અવગણવામાં આવશે.</translation> -<translation id="8668394701842594241">પ્લગઇન્સની તે સૂચિનો ઉલ્લેખ કરો કે જે <ph name="PRODUCT_NAME" /> માં સક્ષમ કરેલી છે અને વપરાશકર્તાને આ સેટિંગ બદલવાથી રોકે છે. - - વાઇલ્ડકાર્ડ અક્ષરો '*' અને '?' નો ઉપયોગ આર્બિટરી અક્ષરોના ક્રમોને મેચ કરવા માટે કરી શકાય છે. '*' અક્ષરોના આર્બિટરી અંકને મેચ કરે છે જ્યારે '?' વૈકલ્પિક એકલ અક્ષરનો ઉલ્લેખ કરે છે, ઉ.દા.. શૂન્ય અથવા એક અક્ષરને મેચ કરે છે. બાકી અક્ષર '\' છે, જેથી વાસ્તવિક '*', '?' અથવા '\' અક્ષરોને મેચ કરવા માટે તમે તેમની સામે '\' મૂકી શકો છો. - - પ્લગઇન્સની ઉલ્લેખિત સૂચિનો ઉપયોગ હંમેશા <ph name="PRODUCT_NAME" /> માં થાય છે, જો તે ઇન્સ્ટોલ કરેલું હોય તો. 'વિશે:પ્લગઇન્સ' માં પલ્ગઇન્સ સક્ષમ કરેલા તરીકે માર્ક કરેલા હોય છે અને વપરાશકર્તા તેને અક્ષમ કરી શકતા નથી. - - ધ્યાન રાખો કે આ નીતિ DisabledPlugins અને DisabledPluginsExceptions બન્ને ઓવરરાઇડ કરે છે. - - જો આ નીતિ સેટ કરેલી નથી, તો વપરાશકર્તા સિસ્ટમ પર ઇન્સ્ટોલ કરેલા બધા પ્લગઇન્સને અક્ષમ કરી શકે છે.</translation> <translation id="8672321184841719703">લક્ષ્ય સ્વતઃ અપડેટ સંસ્કરણ</translation> <translation id="868068801094828689">Google પર <ph name="PRODUCT_NAME" /> વિશેના ઉપયોગની અનામ રિપોર્ટિંગ અને ક્રેશ-સંબંધિત ડેટાને સક્ષમ કરે છે અને વપરાશકર્તાઓને આ સેટિંગ બદલવાથી રોકે છે. @@ -2539,13 +2504,6 @@ ડાઉનલોડ કરશે અને તેમને ઉપકરણ પર સંગ્રહિત કરશે. આવી ફાઇલોનો ઉપયોગ કદાચ, ઉદાહરણ તરીકે, જોડાયેલ મોનિટર્સની પ્રદર્શન ગુણવત્તાને બહેતર બનાવવા માટે કરવામાં આવે છે.</translation> -<translation id="8905426178924715309">આ નીતિ ટાળવામાં આવી છે, કૃપા કરીને તેને બદલે ForceGoogleSafeSearch અને ForceYouTubeSafetyMode નો ઉપયોગ કરો. જો ForceGoogleSafeSearch અથવા ForceYouTubeSafetyMode નીતિને સેટ કરવામાં આવી હશે, તો આ નીતિને અવગણવામાં આવશે. - - ક્વેરીઝને Google વેબ શોધમાં સક્રિય પર સેટ સલામત શોધ સાથે પૂર્ણ કરવાની ફરજ પાડે છે અને વપરાશકર્તાઓને આ સેટિંગ બદલતાં અટકાવે છે. આ સેટિંગ YouTube પર સલામત મોડને પણ ફરજ પાડે છે. - - જો તમે આ સેટિંગ સક્ષમ કરો છો, તો Google શોધ અને YouTube માં સલામત શોધ હંમેશાં સક્રિય રહે છે. - - જો તમે આ સેટિંગને અક્ષમ કરો છો અથવા કોઈ મૂલ્ય સેટ કરતાં નથી, તો Google શોધ અને YouTube માં સલામત શોધ લાગુ થતી નથી.</translation> <translation id="8906768759089290519">અતિથિ મોડને સક્રિય કરો</translation> <translation id="8908294717014659003">વેબસાઇટ્સને મીડિયા કૅપ્ચર ઉપકરણોની ઍક્સેસ મેળવવાની મંજૂરી આપવી કે નહીં તે તમને સેટ કરવા દે છે. મીડિયા કૅપ્ચર ઉપકરણોની ઍક્સેસની ડિફોલ્ટ રૂપે મંજૂરી આપેલી હોઈ શકે છે અથવા વેબસાઇટને મીડિયા કૅપ્ચર ઉપકરણોની ઍક્સેસ મેળવવા માંગે ત્યારે દર વખતે વપરાશકર્તાને પૂછવામાં આવી શકે છે.
diff --git a/components/policy/resources/policy_templates_hi.xtb b/components/policy/resources/policy_templates_hi.xtb index 3b6a9a5..ba87f92 100644 --- a/components/policy/resources/policy_templates_hi.xtb +++ b/components/policy/resources/policy_templates_hi.xtb
@@ -214,15 +214,6 @@ यदि यह पॉलिसी कॉन्फ़िगर नहीं है या इसे "tls1.2" पर सेट किया हुआ है, तो फिर <ph name="PRODUCT_NAME" /> वापसी की इस प्रक्रिया को अब निष्पादित नहीं करता है. ध्यान दें कि इससे पहले वाले TLS वर्शन का समर्थन अक्षम नहीं होता, केवल <ph name="PRODUCT_NAME" /> बग वाले सर्वर पर काम करेगा या नहीं जो वर्शन से ठीक से व्यवहार नहीं कर सकते हैं. अन्यथा, यदि बग वाले सर्वर के साथ संगतता बनाए रखना अनिवार्य हो, तो इस पॉलिसी को "tls1.1" पर सेट किया जा सकता है. यह एक अस्थायी उपाय है और सर्वर को जल्दी ही ठीक किया जाना चाहिए.</translation> -<translation id="1861037019115362154"><ph name="PRODUCT_NAME" /> में अक्षम किए गए प्लग इन की सूची निर्दिष्ट करती है और उपयोगकर्ताओं को यह सेटिंग बदलने से रोकती है. - - वाइल्डकार्ड वर्ण '*' और '?' का उपयोग स्वैच्छिक वर्णों के क्रम मिलाने के लिए किया जा सकता है. '*' का मिलान वर्णों की स्वैच्छिक संख्या से होता है जबकि '?' एक वैकल्पिक एकल वर्ण निर्दिष्ट करता है, जो शून्य या एक से मिलान करता है. एस्केप वर्ण '\' है, इसलिए वास्तविक '*', '?', या '\' वर्णों के मिलान के लिए आप उनके आगे '\' रख सकते हैं. - - यदि आप यह सेटिंग सक्षम करते हैं, तो <ph name="PRODUCT_NAME" /> में प्लग इन की निर्दिष्ट सूची का उपयोग कभी भी नहीं किया जाएगा. प्लग इन, 'about:plugins' में अक्षम चिह्नित किए जाते हैं और उपयोगकर्ता उन्हें सक्षम नहीं कर सकते. - - ध्यान दें कि यह नीति EnabledPlugins और DisabledPluginsExceptions द्वारा ओवरराइड की जा सकती है. - - यदि यह नीति सेट किए बिना छोड़ दी जाती है, तो उपयोगकर्ता हार्ड कोड किए गए असंगत, पुराने या खतरनाक प्लग इन के अलावा सिस्टम पर इंस्टॉल किसी भी प्लग इन का उपयोग कर सकता है.</translation> <translation id="1864269674877167562">यदि इस पॉलिसी को किसी खाली स्ट्रिंग पर सेट किया जाता है या कॉन्फ़िगर नहीं किया जाता है, तो <ph name="PRODUCT_OS_NAME" /> प्रवेश प्रवाह के दौरान कोई स्वत:पूर्ण विकल्प नहीं दिखाएगा. यदि इस पॉलिसी को डोमेन नाम का प्रतिनिधित्व करने वाली किसी स्ट्रिंग पर सेट किया जाता है, तो <ph name="PRODUCT_OS_NAME" /> उपयोगकर्ता के प्रवेश करने के दौरान एक स्वत:पूर्ण विकल्प दिखाएगा जिससे उपयोगकर्ता डोमेन नाम एक्सेटेंशन के बिना केवल अपना उपयोगकर्ता नाम लिख सकेगा. उपयोगकर्ता इस डोमेन नाम एक्सटेंशन को ओवरराइट कर सकेगा.</translation> <translation id="1865417998205858223">प्रमुख अनुमतियां</translation> @@ -842,11 +833,6 @@ <translation id="3660562134618097814">प्रवेश के दौरान SAML IdP कुकी ट्रांसफर करें</translation> <translation id="3709266154059827597">एक्सटेंशन इंस्टॉलेशन प्रतिबंध कॉन्फ़िगर करें</translation> <translation id="3711895659073496551">निलंबित</translation> -<translation id="3715448429089775791">YouTube सुरक्षा मोड को बलपूर्वक सक्रिय होने देती है और उपयोगकर्ताओं को इस सेटिंग को बदलने से रोकती है. - - यदि आप इस सेटिंग को सक्षम करते हैं, तो YouTube पर सुरक्षा मोड हमेशा सक्रिय रहता है. - - यदि आप इस सेटिंग को अक्षम करते हैं या कोई मान सेट नहीं करते हैं, तो YouTube पर सुरक्षा मोड को लागू नहीं किया जाता है.</translation> <translation id="3750220015372671395">इन साइट पर कुंजी जेनरेशन अवरुद्ध करें</translation> <translation id="3756011779061588474">डेवलपर मोड अवरुद्ध करें</translation> <translation id="3758089716224084329">आपको <ph name="PRODUCT_NAME" /> द्वारा उपयोग किया जाने वाला प्रॉक्सी सर्वर निर्दिष्ट करने देती है और उपयोगकर्ताओं को प्रॉक्सी सेटिंग बदलने से रोकती है. @@ -2077,12 +2063,6 @@ मान्यता प्राप्त कनेक्शन प्रकार पहचानकर्ता हैं "इथरनेट", "wifi", "wimax", "bluetooth" और "सेल्युलर".</translation> <translation id="7763614521440615342">नया टैब पृष्ठ पर सामग्री के सुझाव दिखाएं</translation> -<translation id="7766336524667238790">सक्रिय कियोस्क सत्र के बारे में जानकारी की रिपोर्ट करें, जैसे - ऐप्लिकेशन आईडी और वर्शन. - - यदि पॉलिसी को असत्य पर सेट किया जाता है, तो सत्र की जानकारी को - रिपोर्ट नहीं किया जाएगा. यदि सत्य पर सेट किया जाता है या बिना सेट किए छोड़ा जाता है, तो सत्र की जानकारी को - रिपोर्ट किया जाएगा.</translation> <translation id="7774768074957326919">सिस्टम प्रॉक्सी सेटिंग का उपयोग करें</translation> <translation id="7775831859772431793">आप यहां प्रॉक्सी सर्वर का URL निर्दिष्ट कर सकते हैं. @@ -2311,6 +2291,10 @@ <translation id="8369602308428138533">AC पावर पर चलते समय स्क्रीन बंद विलंब</translation> <translation id="8382184662529825177">डिवाइस के लिए सामग्री सुरक्षा के लिए दूरस्थ अनुप्रमाणन के उपयोग को सक्षम करें</translation> <translation id="838870586332499308">डेटा रोमिंग सक्षम करें</translation> +<translation id="8390049129576938611"><ph name="PRODUCT_NAME" /> में आंतरिक PDF व्यूअर अक्षम करती है. इसके बजाय यह इसे डाउनलोड के रूप में देखता है और उपयोगकर्ता को डिफ़ॉल्ट ऐप्लिकेशन से PDF फ़ाइलें खोलने की अनुमति देता है. + + यदि यह नीति सेट नहीं की जाती है या अक्षम होती है, तो PDF फ़ाइलों को खोलने के लिए तब तक PDF प्लग इन का उपयोग किया जाएगा जब तक कि उपयोगकर्ता इसे अक्षम नहीं कर देता.</translation> +<translation id="8402079500086185021">PDF फ़ाइलों को हमेशा बाहरी रूप से खोलें</translation> <translation id="8412312801707973447">क्या ऑनलाइन OCSP/CRL जांचें निष्पादित की जा रही हैं</translation> <translation id="8413348101535146315"><ph name="PRODUCT_NAME" /> के काम का प्रबंधक में प्रक्रियाओं की समाप्ति को सक्षम करती है. @@ -2331,17 +2315,6 @@ उदाहरण पैटर्न के लिए https://www.chromium.org/developers/how-tos/chrome-frame-getting-started देखें.</translation> <translation id="8493645415242333585">ब्राउज़र इतिहास सहेजना अक्षम करें</translation> <translation id="8499172469244085141">डिफ़ॉल्ट सेटिंग (उपयोगकर्ता ओवरराइड कर सकते हैं)</translation> -<translation id="8501011084242226370">ऐसे प्लग इन की सूची निर्दिष्ट करती है जिसे उपयोगकर्ता <ph name="PRODUCT_NAME" /> में सक्षम या अक्षम कर सकते हैं. - - वाइल्डकार्ड वर्ण '*' और '?' का उपयोग अनियंत्रित वर्णों के क्रमों से मिलान करने के लिए किया जा सकता है. '*' का मिलान वर्णों की अनियंत्रित संख्या से होता है जबकि '?' एक वैकल्पिक एकल वर्ण को निर्दिष्ट करता है, अर्थात उसका मिलान शून्य या एक वर्ण से होता है. एस्केप वर्ण '\' है, इसलिए वास्तविक '*', '?', या '\' वर्णों का मिलान करने के लिए, आप उनके आगे एक '\' रख सकते हैं. - - यदि आप इस सेटिंग को सक्षम करते हैं, तो प्लग इन की निर्दिष्ट सूची का उपयोग <ph name="PRODUCT_NAME" /> में किया जा सकता है. उपयोगकर्ता उन्हें 'about:plugins' में सक्षम या अक्षम कर सकते हैं, भले ही प्लग इन का मिलान DisabledPlugins के प्रतिमान से भी होता हो. उपयोगकर्ता ऐसे प्लग इन को भी सक्षम या अक्षम कर सकते हैं जिनका मिलान DisabledPlugins, DisabledPluginsExceptions और EnabledPlugins के किसी भी प्रतिमान से नहीं होता. - - यह नीति सख्त प्लग इन को सख्त रूप से काली सूची में डालने की अनुमति देने के लिए है जहां 'DisabledPlugins' सूची में वाइल्डकार्ड प्रविष्टियां जैसे सभी प्लग इन '*' को अक्षम करना या सभी Java प्लग इन '*Java*' को अक्षम करना शामिल है लेकिन व्यवस्थापक कुछ विशिष्ट वर्शन जैसे 'IcedTea Java 2.3' को सक्षम करना चाहता है. इस विशिष्ट वर्शन को इस नीति में निर्दिष्ट किया जा सकता है. - - ध्यान रखें कि प्लग इन का नाम और प्लग इन का समूह नाम दोनों को अलग रखा जाना चाहिए. प्रत्येक प्लग इन समूह को about:plugins में एक अलग अनुभाग में दिखाया जाता है; प्रत्येक अनुभाग में एक या अधिक प्लग इन हो सकते हैं. उदाहरण के लिए, "Shockwave Flash" प्लग इन का संबंध "Adobe Flash Player" समूह से होता है, और यदि उस प्लग इन को काली सूची से अलग रखा जाना है तो दोनों नामों का मिलान अपवादों की सूची में होना चाहिए. - - यदि इस नीति को सेट किए बिना छोड़ दिया जाता है तो 'DisabledPlugins' के प्रतिमानों से मिलान करने वाला कोई भी प्लग इन अवरुद्ध अक्षम कर दिया जाएगा और उपयोगकर्ता उन्हें सक्षम नहीं कर सकेगा.</translation> <translation id="8519264904050090490">प्रबंधित उपयोगकर्ता मैन्युअल अपवाद URL</translation> <translation id="8544375438507658205"><ph name="PRODUCT_FRAME_NAME" /> के लिए सामान्य HTML रेंडरर</translation> <translation id="8549772397068118889">सामग्री पैक से बाहर की साइटें विज़िट करने पर चेतावनी दें</translation> @@ -2378,7 +2351,6 @@ एकाधिक सर्वर नामों को अल्पविराम द्वारा अलग करें. वाइल्डकार्ड (*) की अनुमति है. यदि आप इस नीति को सेट किए बिना छोड़ देते हैं तो <ph name="PRODUCT_NAME" /> यह पता लगाने का प्रयास करेगा कि क्या सर्वर इंट्रानेट पर है और केवल तभी वह IWA अनुरोधों को प्रतिसाद देगा. यदि कोई सर्वर इंटरनेट के रूप में पता लगाया जाता है तो उसके IWA अनुरोधों को <ph name="PRODUCT_NAME" /> द्वारा अनदेखा कर दिया जाएगा.</translation> -<translation id="8668394701842594241"><ph name="PRODUCT_NAME" /> में सक्षम किए गए प्लग इन की सूची निर्दिष्ट करती है और उपयोगकर्ताओं को यह सेटिंग परिवर्तित करने से रोकती है. arbitrary वर्णों के अनुक्रम का मिलान करने के लिए वाइल्ड वर्णों '*' और '?' का उपयोग किया जा सकता है. '*' वर्णों की arbitrary संख्याओं का मिलान करता है जबकि '?' वैकल्पिक एकल वर्ण निर्दिष्ट करता है, अर्थात शून्य या एक वर्णों का मिलान करता है. '\' एस्केप वर्ण है, अत: वास्तविक '*', '?', या '\' वर्णों से मिलान करने के लिए, आप '\' को उनके आगे रख सकते हैं. प्लग इन की निर्दिष्ट सूची हमेशा <ph name="PRODUCT_NAME" /> में उपयोग की जाती है, यदि उन्हें इंस्टॉल किया गया हो. प्लग इन को 'about:plugins' में सक्षम किए गए के रूप में चिह्नित किया गया है और उपयोगकर्ताओं को अक्षम नहीं किया जा सकता. ध्यान दें कि यह नीति DisabledPlugins और DisabledPluginsExceptions दोनों को ओवरराइड करती है. यदि इस नीति को सेट किए बिना छोड़ दिया जाता है, तो उपयोगकर्ता सिस्टम पर इंस्टॉल किए गए किसी भी प्लग इन को अक्षम कर सकता है.</translation> <translation id="8672321184841719703">स्वत: अपडेट वर्शन को लक्ष्य बनाएं</translation> <translation id="868068801094828689"><ph name="PRODUCT_NAME" /> के बारे में Google को उपयोग और क्रैश से संबंधित डेटा की अनाम रिपोर्टिंग सक्षम करती है और उपयोगकर्ताओं को इस सेटिंग को बदलने से रोकती है. @@ -2475,13 +2447,6 @@ Quirks Server से संपर्क करेगा और, यदि उपलब्ध हो, तो कॉन्फ़िगरेशन फ़ाइलों को डाउनलोड करेगा, और उन्हें डिवाइस पर संग्रहीत करेगा. उदाहरण के लिए, हो सकता है कि ऐसी फ़ाइलों का उपयोग अटैच किए गए मॉनीटर के प्रदर्शन की गुणवत्ता को बेहतर बनाने के लिए किया जाए.</translation> -<translation id="8905426178924715309">इस पॉलिसी को बहिष्कृत किया गया है, कृपया इसके स्थान पर ForceGoogleSafeSearch और ForceYouTubeSafetyMode का उपयोग करें. यदि ForceGoogleSafeSearch या ForceYouTubeSafetyMode पॉलिसी सेट की जाती हैं, तो इस पॉलिसी को अनदेखा कर दिया जाएगा. - - यह Google वेब खोज में की जाने वाली क्वेरी को सक्रिय पर सेट की गई सुरक्षित खोज के साथ किए जाने के लिए बाध्य करती है और उपयोगकर्ताओं को यह सेटिंग बदलने से रोकती है. यह सेटिंग YouTube पर सुरक्षा मोड को भी बाध्य करती है. - - यदि आप इस सेटिंग को सक्षम करते हैं, तो Google खोज और YouTube में सुरक्षित खोज हमेशा सक्रिय रहती है. - - यदि आप इस सेटिंग को अक्षम करते हैं या कोई मान सेट नहीं करते हैं, तो Google खोज और YouTube में सुरक्षित खोज बाध्य नहीं की जाती है.</translation> <translation id="8906768759089290519">मेहमान मोड सक्षम करें</translation> <translation id="8908294717014659003">आपको यह सेट करने की सुविधा देती है कि वेबसाइटों को मीडिया कैप्चर डिवाइस तक पहुंचने की अनुमति है या नहीं. मीडिया कैप्चर डिवाइस तक पहुंच की अनुमति डिफ़ॉल्ट रूप से दी जा सकती है, या यदि कोई वेबसाइट मीडिया कैप्चर डिवाइस तक पहुंचना चाहती है, तो हर बार उपयोगकर्ता से पूछा जा सकता है.
diff --git a/components/policy/resources/policy_templates_hr.xtb b/components/policy/resources/policy_templates_hr.xtb index edfca66..8aaf4b6 100644 --- a/components/policy/resources/policy_templates_hr.xtb +++ b/components/policy/resources/policy_templates_hr.xtb
@@ -207,15 +207,6 @@ 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 "\". - - Ako omogućite tu postavku, određeni popis dodataka nikada se neće upotrebljavati u proizvodu <ph name="PRODUCT_NAME" />. Dodaci su označeni kao onemogućeni u stavci "about:plugins" i korisnici ih ne mogu omogućiti. - - Uzmite u obzir da ovo pravilo može biti nadjačano pravilima EnabledPlugins i DisabledPluginsExceptions. - - Ako to pravilo nije postavljeno, korisnik može upotrijebiti bilo koji dodatak koji je instaliran na sustavu, osim ukodiranih nekompatibilnih, zastarjelih ili opasnih dodataka.</translation> <translation id="1864269674877167562">Ako se to pravilo postavi na prazan niz ili se ne konfigurira, <ph name="PRODUCT_OS_NAME" /> neće prikazivati opciju samodovršavanja prilikom tijeka korisničke prijave. Ako se to pravilo postavi na niz koji predstavlja naziv domene, <ph name="PRODUCT_OS_NAME" /> prikazivat će opciju samodovršavanja prilikom korisničke prijave koja omogućuje korisniku da unese samo svoje korisničko ime bez proširenja s nazivom domene. Korisnik će moći unijeti neko drugo proširenje s nazivom domene.</translation> <translation id="1865417998205858223">Glavna dopuštenja</translation> @@ -814,11 +805,6 @@ <translation id="3660562134618097814">Prenesi kolačiće SAML IdP-a tijekom prijave</translation> <translation id="3709266154059827597">Konfiguriraj crnu listu instalacije proširenja</translation> <translation id="3711895659073496551">Obustavi</translation> -<translation id="3715448429089775791">Nameće aktiviranje Sigurnog načina rada na YouTubeu i korisnicima onemogućuje promjenu te postavke. - - Ako omogućite tu postavku, Siguran način rada na YouTubeu uvijek je aktivan. - - Ako onemogućite tu postavku ili ne postavite vrijednost, Siguran način rada na YouTubeu neće se primijeniti.</translation> <translation id="3750220015372671395">Blokiraj generiranje ključeva na ovim web-lokacijama</translation> <translation id="3756011779061588474">Blokiraj način rada razvojnog programera</translation> <translation id="3758089716224084329">Omogućuje vam da odredite proxy poslužitelj kojim se koristi <ph name="PRODUCT_NAME" /> i onemogućuje korisnicima da mijenjaju postavke proxyja. @@ -1982,12 +1968,6 @@ Prepoznati identifikatori vrste veze jesu "ethernet", "wifi", "wimax", "bluetooth" i "mobilna".</translation> <translation id="7763614521440615342">Prikaz prijedloga sadržaja na web-stranici nove kartice</translation> -<translation id="7766336524667238790">Prijavljuje informacije o aktivnoj sesiji kioska, primjerice, - ID aplikacije i verziju. - - Ako se pravilo postavi na "False", informacije sesije neće se - prijavljivati. Ako se postavi na "True" ili se ne postavi, prijavljivat - će se informacije sesije.</translation> <translation id="7774768074957326919">Upotrijebi proxy postavke sustava</translation> <translation id="7775831859772431793">Ovdje možete navesti URL proxy poslužitelja. @@ -2208,6 +2188,10 @@ <translation id="8369602308428138533">Odgoda isključivanja zaslona za vrijeme napajanja izmjeničnom strujom</translation> <translation id="8382184662529825177">Omogući upotrebu daljinske ovjere za zaštitu sadržaja za uređaj</translation> <translation id="838870586332499308">Omogući roaming podataka</translation> +<translation id="8390049129576938611">Onemogućuje interni preglednik PDF-ova na usluzi <ph name="PRODUCT_NAME" />. Tretira ga kao preuzimanje i omogućuje uređaju da otvara PDF datoteke zadanom aplikacijom. + + Ako se to pravilo ne postavi ili se onemogući, a korisnik nije onemogućio dodatak za PDF-ove, za otvaranje PDF datoteka upotrebljavat će se dodatak za PDF-ove.</translation> +<translation id="8402079500086185021">Uvijek otvaraj PDF datoteke vanjski</translation> <translation id="8412312801707973447">Izvršavaju li se mrežne provjere OCSP/CRL</translation> <translation id="8413348101535146315">Omogućuje završavanje postupaka u Upravitelju zadataka usluge <ph name="PRODUCT_NAME" />. @@ -2228,17 +2212,6 @@ Primjere uzoraka pogledajte na https://www.chromium.org/developers/how-tos/chrome-frame-getting-started.</translation> <translation id="8493645415242333585">Onemogući pohranjivanje povijesti preglednika</translation> <translation id="8499172469244085141">Zadane postavke (korisnici ih mogu prebrisati)</translation> -<translation id="8501011084242226370">Navodi popis dodataka koje korisnik može omogućiti ili onemogućiti na usluzi <ph name="PRODUCT_NAME" />. - - Zamjenski znakovi "*" i "?" mogu se upotrijebiti za podudaranje nizova proizvoljnih znakova. Znak "*" odgovara arbitrarnom broju znakova, dok znak "?" označava opcionalan jedan znak, na primjer odgovara nultom ili jednom znaku. Znak za izlazak jest "\", pa da biste dobili podudaranja sa stvarnim znakovima "*", "?" ili "\", možete staviti znak "\" ispred njih. - - Ako omogućite ovu postavku, na usluzi <ph name="PRODUCT_NAME" /> moguće je upotrijebiti određeni popis dodataka. Korisnici ih mogu omogućiti ili onemogućiti u dijelu "'about:plugins", čak i ako dodatak također odgovara uzorku u DisabledPlugins. Korisnici također mogu omogućiti i onemogućiti dodatke koji ne odgovaraju nijednom uzorku u DisabledPlugins, DisabledPluginsExceptions i EnabledPlugins. - - Namjena je ovog pravila dopustiti strogu crnu listu dodataka, gdje popis "DisabledPlugins" sadrži unose zamjenskih znakova kao što su "onemogući sve dodatke "*" ili onemogući sve Java dodatke "*Java*", dok administrator želi omogućiti neke određene verzije, poput "IcedTea Java 2.3". Te određene verzije moguće je navesti u ovom pravilu. - - Imajte na umu da je potrebno izuzeti i naziv dodatka i naziv grupe dodataka. Svaka grupa dodataka prikazana je u zasebnom odjeljku u about:plugins; svaki odjeljak može imati jedan dodatak ili više njih. Na primjer, dodatak "Shockwave Flash" pripada grupi "Adobe Flash Player", a oba naziva moraju imati svoje podudaranje na popisu iznimki ako se taj dodatak planira izuzeti s crne liste. - - Ako se pravilo ne postavi, svaki dodatak koji odgovara uzorcima u "DisabledPlugins" bit će zaključano onemogućen i korisnik ga neće moći omogućiti.</translation> <translation id="8519264904050090490">URL-ovi ručnih iznimaka upravljanih korisnika</translation> <translation id="8544375438507658205">Zadani alat za prikazivanje HTML-a za <ph name="PRODUCT_FRAME_NAME" /></translation> <translation id="8549772397068118889">Upozori kada se posjećuju web-lokacije izvan paketa sadržaja</translation> @@ -2274,7 +2247,6 @@ Razdvojite više poslužitelja zarezima. Zamjenski su znakovi (*) dopušteni. Ako ne postavite ovo pravilo, <ph name="PRODUCT_NAME" /> pokušat će otkriti je li poslužitelj na intranetu te će jedino tada odgovoriti na IWA zahtjeve. Ako otkrije da se radi o poslužitelju na internetu, <ph name="PRODUCT_NAME" /> zanemarit će njegove IWA zahtjeve.</translation> -<translation id="8668394701842594241">Određuje popis dodataka koji su omogućeni u proizvodu <ph name="PRODUCT_NAME" /> i sprječava korisnike da promijene ovu postavku. Zamjenski znakovi "*" i "?" mogu se upotrijebiti za podudarne nizove proizvoljnih znakova. "*" odgovara proizvoljnom broju znakova, dok "?" određuje izborni pojedinačni znak, tj. odgovara znaku nula ili jedan. Prespojni znak je "\", tako da za podudaranje sa stvarnim znakovima "*", "?" ili "\" ispred njih stavite znak "\". Navedeni popis dodataka uvijek se upotrebljava u proizvodu <ph name="PRODUCT_NAME" /> ako je instaliran. Dodaci su označeni kao omogućeni u stavci "about:plugins" i korisnici ih ne mogu onemogućiti. Uzmite u obzir da ovo pravilo nadjačava pravila "DisabledPlugins" i "DisabledPluginsExceptions".</translation> <translation id="8672321184841719703">Ciljna verzija automatskog ažuriranja</translation> <translation id="868068801094828689">Omogućuje anonimno slanje izvješća o upotrebi i podataka u vezi s rušenjima preglednika <ph name="PRODUCT_NAME" /> Googleu i korisnicima onemogućuje promjenu te postavke. @@ -2359,13 +2331,6 @@ automatski će kontaktirati Quirks Server i preuzeti konfiguracijske datoteke ako su dostupne i pohraniti ih na uređaj. Pomoću tih se datoteka, na primjer, može poboljšati kvaliteta prikaza priključenih monitora.</translation> -<translation id="8905426178924715309">To je pravilo obustavljeno, pa umjesto njega upotrijebite "ForceGoogleSafeSearch" i "ForceYouTubeSafetyMode". Pravilo će se zanemariti ako se postave pravila "ForceGoogleSafeSearch" ili "ForceYouTubeSafetyMode". - - Nameće da se upiti u Google pretraživanju weba provode uz aktivirano Sigurno pretraživanje i korisnicima sprječava promjenu te postavke. Ta postavka nameće i Siguran način rada na YouTubeu. - - Ako omogućite tu postavku, Sigurno pretraživanje u Google pretraživanju i na YouTubeu uvijek će biti aktivno. - - Ako onemogućite tu postavku ili ne postavite neku vrijednost, Sigurno pretraživanje u Google pretraživanju i na YouTubeu neće se primjenjivati.</translation> <translation id="8906768759089290519">Omogući način gosta</translation> <translation id="8908294717014659003">Omogućuje vam da postavite hoće li web-lokacijama biti dopušten pristup medijskim uređajima za snimanje. Pristup medijskim uređajima za snimanje može biti dopušten prema zadanim postavkama ili se korisniku može postaviti pitanje svaki put kada web-lokacija želi pristupiti tim uređajima.
diff --git a/components/policy/resources/policy_templates_hu.xtb b/components/policy/resources/policy_templates_hu.xtb index 738b038..9e473625 100644 --- a/components/policy/resources/policy_templates_hu.xtb +++ b/components/policy/resources/policy_templates_hu.xtb
@@ -207,15 +207,6 @@ 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. - - Ha engedélyezi ezt a beállítást, a megadott listán szereplő bővítményt a(z) <ph name="PRODUCT_NAME" /> sosem fogja használni. A bővítmények kikapcsolt állapotúnak vannak jelölve az „about:plugins” részben, és a felhasználók nem tudják bekapcsolni őket. - - Ne feledje, hogy ezt a házirendet felülírhatják a DisabledPlugins és a DisabledPluginsExceptions értékei. - - Ha a házirend beállítatlanul marad, a felhasználó a nem változtatható inkompatibilis, elavult vagy veszélyes bővítmények kivételével a rendszerre telepített valamennyi bővítményt használhatja.</translation> <translation id="1864269674877167562">Ha a házirend értéke üres karakterlánc, vagy ha nincs beállítva, a <ph name="PRODUCT_OS_NAME" /> nem jelenít meg automatikus kiegészítési lehetőséget a felhasználói bejelentkezési folyamat során. Ha a házirend beállítása egy domainnevet jelképező karakterlánc, a <ph name="PRODUCT_OS_NAME" /> megjeleníti az automatikus kiegészítési lehetőséget a felhasználó bejelentkezése során, így annak csak a felhasználónevét kell beírnia (a domainnév nélkül). A felhasználó felülírhatja a domainnév-kiegészítést.</translation> <translation id="1865417998205858223">Kulcsengedélyek</translation> @@ -818,11 +809,6 @@ <translation id="3660562134618097814">SAML IdP cookie-k átadása a bejelentkezés során</translation> <translation id="3709266154059827597">Bővítménytelepítési feketelista beállítása</translation> <translation id="3711895659073496551">Felfüggesztés</translation> -<translation id="3715448429089775791">Aktív állapotúra kényszeríti a YouTube Biztonságos módot, és megakadályozza, hogy a felhasználók módosítsák ezt a beállítást. - - Ha engedélyezi ezt a beállítást, a YouTube-on mindig aktív lesz a Biztonságos mód. - - Ha kikapcsolja a beállítást, illetve nem ad meg neki értéket, a rendszer nem kényszeríti a Biztonságos módot a YouTube-on.</translation> <translation id="3750220015372671395">Kulcslétrehozás letiltása a következő webhelyeken</translation> <translation id="3756011779061588474">Fejlesztői mód letiltása</translation> <translation id="3758089716224084329">Lehetővé teszi a(z) <ph name="PRODUCT_NAME" /> által használt proxyszerver meghatározását, és megakadályozza, hogy a felhasználók megváltoztassák a proxybeállításokat. @@ -1986,12 +1972,6 @@ A felismert kapcsolattípus-azonosítók a következők: Ethernet, Wi-Fi, WiMax, Bluetooth és mobil.</translation> <translation id="7763614521440615342">Tartalomjavaslatok az Új lap oldalon</translation> -<translation id="7766336524667238790">Információk (például alkalmazásazonosító és -verzió) jelentése - az aktív kioszkmunkamenetről. - - Ha a házirend értéke hamis, a böngésző nem jelenti a munkamenet - információit. Ha igaz, illetve ha nincs beállítva, a böngésző jelenti - ezeket az információkat.</translation> <translation id="7774768074957326919">A rendszer proxybeállításainak használata</translation> <translation id="7775831859772431793">Itt határozhatja meg a proxyszerver URL-jét. @@ -2213,6 +2193,10 @@ <translation id="8369602308428138533">Képernyő kikapcsolásának késleltetése hálózati áramról való működés során</translation> <translation id="8382184662529825177">Távoli hitelesítés engedélyezése az eszközön lévő tartalmak védelme érdekében</translation> <translation id="838870586332499308">Adatbarangolás engedélyezése</translation> +<translation id="8390049129576938611">Kikapcsolja a belső PDF-olvasót a(z) <ph name="PRODUCT_NAME" /> termékben. Ehelyett letöltésként kezeli, és engedélyezi a felhasználó számára PDF-fájlok megnyitását az alapértelmezett alkalmazással. + + Ha a házirend nincs megadva vagy ki van kapcsolva, a rendszer a PDF beépülő modult használja a PDF-fájlok megnyitásához, kivéve, ha a felhasználó letiltja ezt.</translation> +<translation id="8402079500086185021">A PDF-fájlok megnyitása mindig külsőleg történjen</translation> <translation id="8412312801707973447">Végbemenjenek-e online OCSP-/CRL-ellenőrzések</translation> <translation id="8413348101535146315">Lehetővé teszi a folyamatok befejezését a <ph name="PRODUCT_NAME" /> Folyamatkezelőjében. @@ -2233,17 +2217,6 @@ Példamintákat a következő helyen talál: https://www.chromium.org/developers/how-tos/chrome-frame-getting-started.</translation> <translation id="8493645415242333585">Böngészési előzmények mentésének tiltása</translation> <translation id="8499172469244085141">Alapértelmezett beállítások (a felhasználók felülbírálhatják)</translation> -<translation id="8501011084242226370">Megadja azon plug-inek listáját, amelyeket a felhasználó engedélyezhet vagy letilthat a <ph name="PRODUCT_NAME" /> böngészőben. - - A „*” és „?” helyettesítő karakterek használatával adhat meg egyezést tetszőleges karakterláncokra. A „*” tetszőleges számú karakternek felel meg, míg a „?” egyetlen karaktert határoz meg (azaz nulla vagy egy karakternek felel meg). A feloldó karakter a „\”, ezért tényleges „*”, „?” vagy „\” karakterek egyeztetéséhez beírhat eléjük egy „\” jelet. - - Ha engedélyezi ezt a beállítást, akkor a listában megadott plug-inek használhatók a <ph name="PRODUCT_NAME" /> böngészőben. A felhasználók az „about:plugins” oldalon engedélyezhetik vagy tilthatják le ezeket, még akkor is, ha a plug-in egyezést mutat a DisabledPlugins egyik mintájával. A felhasználók ezenkívül engedélyezhetik vagy letilthatják azokat a plug-ineket is, amelyek nem egyeznek a DisabledPlugins, a DisabledPluginsExceptions és az EnabledPlugins listák egyik mintájával sem. - - Ez a házirend a plug-inek szigorú tiltólistázására szolgál, amennyiben a „DisabledPlugins” listán szerepelnek helyettesítő karaktert tartalmazó bejegyzések, például az összes plug-in („*”) vagy az összes Java plug-in („*Java*”) letiltása, ám a rendszergazda engedélyezne konkrét verziókat (pl. „IcedTea Java 2.3”). Ezeket a konkrét verziókat lehet megadni ebben a házirendben. - - Felhívjuk figyelmét, hogy mind a plug-in nevét, mind a plug-in csoportjának nevét fel kell venni a kivételek közé. Az egyes plug-in csoportok az about:plugins oldal külön szakaszaiban láthatók; minden szakaszban egy vagy több plug-in szerepelhet. A „Shockwave Flash” plug-in például az „Adobe Flash Player” csoportba tartozik, és mindkét névnek szerepelnie kell a kivétellistán, ha a plug-in kivételt képez a tiltott lista elemei között. - - Ha a házirend nincs beállítva, akkor a „DisabledPlugins” mintáinak megfelelő összes plug-in le lesz tiltva, és a felhasználó nem engedélyezheti őket.</translation> <translation id="8519264904050090490">Felügyelt felhasználó manuális kivételi URL-jei</translation> <translation id="8544375438507658205">Alapértelmezett HTML-megjelenítő a <ph name="PRODUCT_FRAME_NAME" /> számára</translation> <translation id="8549772397068118889">Figyelmeztetés tartalomcsomagokon kívüli webhelyek felkeresése esetén</translation> @@ -2279,7 +2252,6 @@ Több szervernév megadása esetén azokat vesszővel kell elválasztani. A helyettesítő karakterek (*) engedélyezettek. Ha nem állítja be ezt a házirendet, a <ph name="PRODUCT_NAME" /> megpróbálja érzékelni, hogy egy szerver az intraneten van-e, és csak akkor válaszol az IWA-kérésekre. Ha a szervert az interneten lévőnek észleli, a <ph name="PRODUCT_NAME" /> figyelmen kívül hagyja annak IWA-kéréseit.</translation> -<translation id="8668394701842594241">Megadja a(z) <ph name="PRODUCT_NAME" /> számára engedélyezett 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 "?" karakterekkel bármilyen karaktersorozatokat helyettesíthet. A "*" tetszőleges számú karaktert helyettesít, míg a "?" nulla vagy egy karaktert. Az escape karakter a "\", ezért ha a tényleges "*", "?" vagy "\" karaktert szeretné beírni, elé kell tennie egy "\" karaktert. A(z) <ph name="PRODUCT_NAME" /> mindig használja a megadott bővítménylistát, ha telepítve van. A bővítmények bekapcsolt állapotúnak vannak jelölve az "about: plugins" részben, és a felhasználók nem tudják kikapcsolni őket. Ne feledje, hogy ez a házirend felülírja a DisabledPlugins és DisabledPluginsExceptions értékeket. Ha ez a házirend beállítatlanul marad, a felhasználó a rendszerre telepített valamennyi bővítményt le tudja tiltani.</translation> <translation id="8672321184841719703">Cél automatikus frissítési verziója</translation> <translation id="868068801094828689">Lehetővé teszi a használati és az összeomlással kapcsolatos adatok névtelen jelentését a <ph name="PRODUCT_NAME" /> termékről a Google-nak, és megakadályozza, hogy a felhasználók módosítsák a beállítást. @@ -2374,13 +2346,6 @@ a kapcsolatot a Quirks Serverrel, és letölti a konfigurációs fájlokat (ha rendelkezésre állnak), majd az eszközön tárolja őket. Az ilyen fájlok használhatók például arra, hogy javítsák a csatlakozó monitorok képminőségét.</translation> -<translation id="8905426178924715309">Ez a házirend elavult, kérjük, használja helyette a ForceGoogleSafeSearch és a ForceYouTubeSafetyMode házirendet. Ha a ForceGoogleSafeSearch vagy a ForceYouTubeSafetyMode be van állítva, akkor ezt a házirendet figyelmen kívül hagyja a böngésző. - - Hatására a Google Internetes Kereső bekapcsolt Biztonságos Keresés mellett végez lekérdezéseket, és megakadályozza, hogy a felhasználók módosítsák ezt a beállítást. Ezenkívül a YouTube-on is aktiválja a Biztonságos módot. - - Ha engedélyezi a beállítást, akkor a Google Keresésben és a YouTube-on a Biztonságos Keresés mindig aktív. - - Ha letiltja ezt a beállítást, vagy ha nem állít be hozzá értéket, akkor a Biztonságos Keresést sem a Google Keresésben, sem a YouTube-on nem kényszeríti ki a böngésző.</translation> <translation id="8906768759089290519">Vendég mód bekapcsolása</translation> <translation id="8908294717014659003">Lehetővé teszi annak beállítását, hogy a webhelyek hozzáférhetnek-e a felvevőeszközökhöz. A felvevőeszközökhöz való hozzáférés engedélyezhető alapértelmezés szerint, vagy a rendszer rákérdezhet minden alkalommal, amikor egy webhely megpróbál hozzájuk férni.
diff --git a/components/policy/resources/policy_templates_id.xtb b/components/policy/resources/policy_templates_id.xtb index 7138545a..a1daeb9 100644 --- a/components/policy/resources/policy_templates_id.xtb +++ b/components/policy/resources/policy_templates_id.xtb
@@ -207,15 +207,6 @@ Jika kebijakan ini tidak dikonfigurasi atau jika disetel ke "tls1.2", <ph name="PRODUCT_NAME" /> akan berhenti 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. - - Jika Anda mengaktifkan setelan ini, daftar plugin tertentu tidak akan pernah digunakan di <ph name="PRODUCT_NAME" />. Plugin ditandai sebagai nonaktif di 'about:plugins' dan pengguna tidak dapat mengaktifkannya. - - Perhatikan bahwa kebijakan ini dapat ditimpa oleh EnabledPlugins dan DisabledPluginsExceptions. - - Jika kebijakan ini tidak disetel, pengguna dapat menggunakan plugin apa pun yang dipasang pada sistem kecuali untuk plugin berbahaya, usang, atau tidak kompatibel yang sulit dikodekan.</translation> <translation id="1864269674877167562">Jika kebijakan ini disetel sebagai string kosong atau tidak dikonfigurasi, <ph name="PRODUCT_OS_NAME" /> tidak akan menampilkan opsi pelengkapan otomatis selama alur proses masuk pengguna. Jika kebijakan ini disetel sebagai string yang mewakili nama domain, <ph name="PRODUCT_OS_NAME" /> akan menampilkan opsi pelengkapan otomatis selama proses masuk pengguna, sehingga pengguna dapat mengetikkan nama penggunanya tanpa ekstensi nama domain. Pengguna dapat mengganti ekstensi nama domain ini.</translation> <translation id="1865417998205858223">Izin Kunci</translation> @@ -819,11 +810,6 @@ <translation id="3660562134618097814">Transfer cookie SAML IdP saat proses masuk.</translation> <translation id="3709266154059827597">Konfigurasikan daftar hitam pemasangan ekstensi</translation> <translation id="3711895659073496551">Tangguhkan</translation> -<translation id="3715448429089775791">Memaksakan Mode Perlindungan YouTube untuk mengaktifkan dan mencegah pengguna mengubah setelan ini. - - Jika Anda mengaktifkan setelan ini, Mode Perlindungan di YouTube selalu aktif. - - Jika Anda menonaktifkan setelan ini atau tidak menyetel nilai, Mode Perlindungan di YouTube tidak akan diterapkan.</translation> <translation id="3750220015372671395">Blokir pembuatan kunci di situs ini</translation> <translation id="3756011779061588474">Blokir mode pengembang</translation> <translation id="3758089716224084329">Memungkinkan Anda menentukan server proxy yang digunakan oleh <ph name="PRODUCT_NAME" /> dan mencegah pengguna mengubah setelan proxy. @@ -1988,12 +1974,6 @@ Pengenal jenis koneksi yang diketahui saat ini adalah "ethernet", "wifi", "wimax", "bluetooth", dan "cellular".</translation> <translation id="7763614521440615342">Tampilkan saran konten di laman Tab Baru</translation> -<translation id="7766336524667238790">Laporkan informasi tentang sesi kios aktif, misalnya - ID dan versi aplikasi - - Jika kebijakan disetel ke False, informasi sesi tidak akan dilaporkan. - Jika disetel ke True atau tidak disetel, informasi sesi akan - dilaporkan.</translation> <translation id="7774768074957326919">Gunakan setelan proxy sistem</translation> <translation id="7775831859772431793">Anda dapat menetapkan URL server proxy di sini. @@ -2215,6 +2195,10 @@ <translation id="8369602308428138533">Penundaan mematikan layar saat menggunakan daya AC</translation> <translation id="8382184662529825177">Mengaktifkan penggunaan pengesahan jarak jauh untuk perlindungan konten bagi perangkat</translation> <translation id="838870586332499308">Aktifkan roaming data</translation> +<translation id="8390049129576938611">Menonaktifkan penampil PDF internal di <ph name="PRODUCT_NAME" />. Bukan memperlakukannya sebagai download dan mengizinkan membuka file PDF menggunakan aplikasi default. + + Jika kebijakan ini tidak disetel atau dinonaktifkan, plugin PDF akan digunakan untuk membuka file PDF kecuali pengguna menonaktifkannya.</translation> +<translation id="8402079500086185021">Selalu Buka file PDF menggunakan secara eksternal</translation> <translation id="8412312801707973447">Apakah pemeriksaan OCSP/CRL online dilakukan atau tidak</translation> <translation id="8413348101535146315">Memungkinkan proses diakhiri di Pengelola Tugas <ph name="PRODUCT_NAME" />. @@ -2235,17 +2219,6 @@ Untuk melihat contoh pola, buka https://www.chromium.org/developers/how-tos/chrome-frame-getting-started.</translation> <translation id="8493645415242333585">Menonaktifkan penyimpanan riwayat browser</translation> <translation id="8499172469244085141">Setelan Default (pengguna dapat menggantinya)</translation> -<translation id="8501011084242226370">Menentukan daftar plugin yang dapat diaktifkan atau dinonaktifkan oleh pengguna di <ph name="PRODUCT_NAME" />. - - Karakter pengganti '*' dan '?' dapat digunakan untuk mencocokkan rangkaian karakter acak. '*' mencocokkan sejumlah karakter acak sedangkan '?' menentukan karakter tunggal opsional, yaitu mencocokkan karakter nol atau satu. Karakter lepasan adalah '\', sehingga untuk mencocokkan karakter '*', '?', atau '\' aktual, Anda dapat meletakkan '\' di depannya. - - Jika Anda mengaktifkan setelan ini, daftar plugin yang ditentukan dapat digunakan di <ph name="PRODUCT_NAME" />. Pengguna dapat mengaktifkan atau menonaktifkannya dalam 'about:plugins', walaupun plugin juga mencocokkan pola di DisabledPlugins. Pengguna juga dapat mengaktifkan dan menonaktifkan plugin yang tidak mencocokkan dengan pola apa pun di DisabledPlugins, DisabledPluginsExceptions, dan EnabledPlugins. - - Kebijakan ini ditujukan agar pencantuman plugin ke daftar hitam secara ketat dapat dilakukan apabila daftar 'DisabledPlugins' berisi entri berkarakter pengganti seperti menonaktifkan semua plugin '*' atau menonaktifkan semua plugin Java '*Java*', namun administrator ingin mengaktifkan beberapa versi tertentu misalnya 'IcedTea Java 2.3'. Versi tertentu ini dapat ditentukan dalam kebijakan ini. - - Harap diingat bahwa baik nama plugin dan nama grup plugin perlu dibebaskan. Setiap grup plugin ditampilkan dalam bagian yang terpisah di about:plugins; masing-masing bagian dapat memiliki satu plugin atau lebih. Misalnya, plugin "Shockwave Flash" adalah milik grup "Adobe Flash Player", dan kedua nama tersebut perlu memiliki kecocokan dalam daftar pengecualian apabila plugin tersebut akan dibebaskan dari daftar hitam. - - Jika kebijakan ini tidak disetel, plugin apa pun yang mencocokan pola di 'DisabledPlugins' akan terus dinonaktifkan dan pengguna tidak akan dapat mengaktifkannya.</translation> <translation id="8519264904050090490">URL pengecualian manual pengguna yang dikelola</translation> <translation id="8544375438507658205">Pengurai HTML default untuk <ph name="PRODUCT_FRAME_NAME" /></translation> <translation id="8549772397068118889">Memperingatkan saat mengunjungi situs di luar paket konten</translation> @@ -2281,7 +2254,6 @@ Pisahkan beberapa nama server dengan koma. Karakter pengganti (*) diizinkan. Jika Anda membiarkan kebijakan ini tidak disetel, <ph name="PRODUCT_NAME" /> akan mencoba mendeteksi apakah server ada di internet dan akan menanggapi permintaan IWA setelahnya. Jika server terdeteksi sebagai internet, permintaan IWA darinya akan diabaikan oleh <ph name="PRODUCT_NAME" />.</translation> -<translation id="8668394701842594241">Menentukan daftar plugin yang diaktifkan di <ph name="PRODUCT_NAME" /> dan mencegah pengguna mengubah setelan ini. Karakter pengganti '*' dan '?' dapat digunakan untuk mencocokkan rangkaian karakter sembarang. '*' mencocokkan jumlah sembarang dari karakter, sedangkan '?' menentukan karakter tunggal opsional, yaitu mencocokkan dengan nol atau satu karakter. Karakter hindar adalah '\', jadi untuk mencocokkan '*', '?', atau karakter '\' yang sebenarnya, Anda dapat menempatkan sebuah '\' di depannya. Daftar plugin tertentu selalu digunakan di <ph name="PRODUCT_NAME" /> jika dipasang. Plugin ditandai sebagai diaktifkan pada 'about:plugins' dan pengguna tidak dapat menonaktifkannya. Perhatikan bahwa kebijakan ini menimpa DisabledPlugins dan DisabledPluginsExceptions. Jika kebijakan ini dibiarkan tidak disetel, pengguna dapat menonaktifkan plugin apa pun yang dipasang di dalam sistem.</translation> <translation id="8672321184841719703">Versi Pembaruan Otomatis Target</translation> <translation id="868068801094828689">Memungkinkan pelaporan penggunaan anonim dan data mogok <ph name="PRODUCT_NAME" /> ke Google dan mencegah pengguna mengubah setelan ini. @@ -2374,13 +2346,6 @@ otomatis menghubungi Quirks Server dan mengunduh file konfigurasi, jika tersedia, dan menyimpannya di perangkat. File tersebut dapat, misalnya, digunakan untuk meningkatkan kualitas tampilan monitor yang terpasang.</translation> -<translation id="8905426178924715309">Kebijakan ini tidak digunakan lagi, gunakan ForceGoogleSafeSearch dan ForceYouTubeSafetyMode sebagai gantinya. Kebijakan ini akan diabaikan jika kebijakan ForceGoogleSafeSearch atau ForceYouTubeSafetyMode disetel. - - Memaksa kueri di Google Penelusuran Web untuk dilakukan dengan TelusurAman yang diaktifkan, dan mencegah pengguna mengubah setelan ini. Setelan ini juga memaksa Mode Perlindungan di YouTube. - - Jika Anda mengaktifkan setelan ini, TelusurAman di Google Penelusuran dan YouTube akan selalu aktif. - - Jika Anda menonaktifkan setelan ini atau tidak menyetel nilai, TelusurAman di Google Penelusuran dan YouTube tidak akan diberlakukan.</translation> <translation id="8906768759089290519">Aktifkan mode tamu</translation> <translation id="8908294717014659003">Memungkinkan Anda menyetel apakah situs web diizinkan untuk mengakses perangkat tangkap media. Akses ke perangkat tangkap media dapat diizinkan secara default, atau dapat ditanyakan pada pengguna setiap saat situs web ingin mendapatkan akses ke perangkat tangkap media.
diff --git a/components/policy/resources/policy_templates_it.xtb b/components/policy/resources/policy_templates_it.xtb index aa2c084a..29b9f2d 100644 --- a/components/policy/resources/policy_templates_it.xtb +++ b/components/policy/resources/policy_templates_it.xtb
@@ -192,15 +192,6 @@ 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" /> eviterà i server che presentano errori e che non sono in grado di trattare 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 "\". - - Se attivi questa impostazione, l'elenco di plug-in specificato non verrà mai utilizzato in <ph name="PRODUCT_NAME" />. I plug-in vengono contrassegnati come non attivi in "about:plugins" e gli utenti non possono attivarli. - - Tieni presente che questa norma può essere sostituita dalle norme EnabledPlugins e DisabledPluginsExceptions. - - Se questa norma non viene impostata, gli utenti potranno utilizzare qualsiasi plug-in installato sul sistema, tranne i plug-in hard-coded, non compatibili, obsoleti o pericolosi.</translation> <translation id="1864269674877167562">Se questa norma non viene configurata o se viene impostata una stringa vuota, non verrà mostrata un'opzione di completamento automatico durante il flusso di accesso dell'utente in <ph name="PRODUCT_OS_NAME" />. Se per questa norma viene impostata una stringa che rappresenta un nome di dominio, durante l'accesso dell'utente in <ph name="PRODUCT_OS_NAME" /> verrà mostrata un'opzione di completamento automatico che consentirà all'utente di digitare soltanto il nome utente senza l'estensione del nome di dominio. L'utente potrà sovrascrivere l'estensione del nome di dominio.</translation> <translation id="1865417998205858223">Autorizzazioni chiave</translation> @@ -797,11 +788,6 @@ <translation id="3660562134618097814">Trasferisci i cookie dell'IdP SAML durante l'accesso</translation> <translation id="3709266154059827597">Configura blacklist per l'installazione delle estensioni</translation> <translation id="3711895659073496551">Sospensione</translation> -<translation id="3715448429089775791">Forza l'attivazione della Modalità di protezione di YouTube e impedisce agli utenti di cambiare questa impostazione. - - Se viene attivata questa impostazione, la Modalità di protezione di YouTube è sempre attiva. - - Se viene disattivata questa impostazione o se non viene impostato un valore, non viene applicata la Modalità di protezione di YouTube.</translation> <translation id="3750220015372671395">Blocca la generazione di chiavi su questi siti</translation> <translation id="3756011779061588474">Blocca modalità sviluppatore</translation> <translation id="3758089716224084329">Consente di specificare il server proxy utilizzato da <ph name="PRODUCT_NAME" /> e impedisce agli utenti di modificare le impostazioni proxy. @@ -1931,9 +1917,6 @@ Gli identificatori dei tipi di connessione riconosciuti sono "ethernet", "wifi", "wimax", "bluetooth" e "cellulare".</translation> <translation id="7763614521440615342">Mostra suggerimenti di contenuti nella pagina Nuova scheda</translation> -<translation id="7766336524667238790">Consente di segnalare informazioni sulla sessione kiosk attiva, ad esempio l'ID e la versione dell'applicazione. - - Se la norma viene impostata su false, le informazioni relative alla sessione non vengono segnalate. Se viene impostata su true o non viene impostata, tali informazioni vengono segnalate.</translation> <translation id="7774768074957326919">Utilizza le impostazioni proxy di sistema</translation> <translation id="7775831859772431793">Qui puoi specificare l'URL del server proxy. @@ -2143,6 +2126,10 @@ <translation id="8369602308428138533">Ritardo disattivazione schermo in caso di utilizzo di CA</translation> <translation id="8382184662529825177">Attiva l'utilizzo dell'attestazione remota per la protezione dei contenuti per il dispositivo</translation> <translation id="838870586332499308">Attiva roaming dati</translation> +<translation id="8390049129576938611">Consente di disattivare il visualizzatore di PDF interno di <ph name="PRODUCT_NAME" />. I file PDF vengono gestiti come download che l'utente può aprire con l'applicazione predefinita. + + Se questa norma non viene impostata o viene disattivata, per aprire i file PDF verrà utilizzato il plug-in di PDF, se l'utente non lo disattiva.</translation> +<translation id="8402079500086185021">Apri sempre file PDF esternamente</translation> <translation id="8412312801707973447">Esecuzione dei controlli OCSP/CRL online</translation> <translation id="8413348101535146315">Consente di terminare i processi nella funzione Task Manager di <ph name="PRODUCT_NAME" />. @@ -2163,17 +2150,6 @@ Per avere pattern di esempio, visita il sito https://www.chromium.org/developers/how-tos/chrome-frame-getting-started.</translation> <translation id="8493645415242333585">Disabilita salvataggio della cronologia del browser</translation> <translation id="8499172469244085141">Impostazioni predefinite (gli utenti possono ignorarle)</translation> -<translation id="8501011084242226370">Specifica un elenco di plug-in che l'utente può attivare o disattivare in <ph name="PRODUCT_NAME" />. - - I caratteri jolly "*" e "?" corrispondono a sequenze di caratteri arbitrari. "*" corrisponde a un numero di caratteri arbitrario, mentre "?" specifica un carattere singolo opzionale, ad esempio, caratteri zero o uno. Il carattere di escape è "\" e viene anteposto ai caratteri "*" e "?" per ricercarli come valori letterali. - - Se questa impostazione viene attivata, l'elenco di plug-in specificato può essere utilizzato in <ph name="PRODUCT_NAME" />. Gli utenti possono attivarli o disattivarli in "about:plugins", anche se il plug-in corrisponde a un pattern in DisabledPlugins. Gli utenti possono anche attivare e disattivare i plug-in che non corrispondono ad alcun pattern in DisabledPlugins, DisabledPluginsExceptions e EnabledPlugins. - - Questa norma consente di creare una lista nera rigida dei plug-in, in cui l'elenco "DisabledPlugins" contiene voci con caratteri jolly come disattiva tutti i plug-in "*" o disattiva tutti i plug-in Java "*Java*", ma l'amministratore desidera attivare alcune versioni specifiche come "IcedTea Java 2.3". Queste versioni specifiche possono essere definite in questa norma. - - Nota che devono essere esclusi sia il nome del plug-in sia il nome del gruppo del plug-in. Ogni gruppo di plug-in viene visualizzato in una sezione distinta in about:plugins. Ogni sezione può contenere uno o più plug-in. Ad esempio, il plug-in "Shockwave Flash" fa parte del gruppo "Adobe Flash Player" ed entrambi i nomi devono avere una corrispondenza nell'elenco delle eccezioni, se quel determinato plug-in deve essere escluso dalla lista nera. - - Se questa norma non viene impostata, i plug-in che corrispondono a pattern in "DisabledPlugins" vengono bloccati e l'utente non può attivarli.</translation> <translation id="8519264904050090490">URL delle eccezioni manuali per gli utenti gestiti</translation> <translation id="8544375438507658205">Renderer HTML predefinito per <ph name="PRODUCT_FRAME_NAME" /></translation> <translation id="8549772397068118889">Avvisa quando vengono visitati siti non presenti nei pacchetti di contenuti</translation> @@ -2198,7 +2174,6 @@ Separa più nomi di server con delle virgole. Sono ammessi i caratteri jolly (*). Se questa norma non viene impostata <ph name="PRODUCT_NAME" /> tenterà di rilevare se sulla Intranet è presente un server e solo allora risponderà alle richieste IWA. Se viene rilevato un server su Internet, le sue richieste IWA verranno ignorate da <ph name="PRODUCT_NAME" />.</translation> -<translation id="8668394701842594241">Consente di specificare un elenco di plug-in 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 è "\" quindi, per indicare i caratteri "*", "?" e "\" effettivi, puoi inserire prima di tali caratteri un simbolo "\". L'elenco di plug-in specificato verrà utilizzato sempre in <ph name="PRODUCT_NAME" /> se i plug-in sono installati. I plug-in verranno contrassegnati come attivi in "about:plugins" e gli utenti non potranno disattivarli. Tieni presente che questa norma ha la precedenza sulle norme DisabledPlugins e DisabledPluginsExceptions. Se questa norma non viene impostata, gli utenti potranno disattivare qualsiasi plug-in installato sul sistema.</translation> <translation id="8672321184841719703">Scegli versione target dell'aggiornamento automatico</translation> <translation id="868068801094828689">Consente di attivare la segnalazione anonima a Google dei dati sull'utilizzo e sugli arresti anomali di <ph name="PRODUCT_NAME" /> e di impedire agli utenti di modificare questa impostazione. @@ -2271,13 +2246,6 @@ Se questa norma viene impostata su false, il dispositivo non tenterà di contattare Quirks Server per scaricare i file di configurazione. Se la norma viene impostata su true o non viene configurata, <ph name="PRODUCT_OS_NAME" /> contatterà automaticamente Quirks Server, scaricherà i file di configurazione, se disponibili, e li memorizzerà sul dispositivo. Tali file potrebbero essere utilizzati, ad esempio, per migliorare la qualità del display dei monitor collegati.</translation> -<translation id="8905426178924715309">Questa norma è stata ritirata; utilizzare le norme ForceGoogleSafeSearch e ForceYouTubeSafetyMode. Questa norma viene ignorata se viene impostata la norma ForceGoogleSafeSearch o ForceYouTubeSafetyMode. - - Consente di forzare l'esecuzione delle query nella Ricerca Google con l'opzione SafeSearch attiva e di impedire agli utenti di modificare l'impostazione. Questa impostazione forza inoltre l'attivazione della Modalità di protezione su YouTube. - - Se questa impostazione viene attivata, il filtro SafeSearch nella Ricerca Google e su YouTube è sempre attivo. - - Se l'impostazione viene disattivata o non viene impostato un valore, il filtro SafeSearch nella Ricerca Google e su YouTube non viene applicato.</translation> <translation id="8906768759089290519">Attiva modalità ospite</translation> <translation id="8908294717014659003">Consente di stabilire se i siti web possono accedere ai dispositivi di acquisizione dei contenuti multimediali. L'accesso ai dispositivi di acquisizione dei contenuti multimediali può essere consentito per impostazione predefinita oppure l'utente può visualizzare una richiesta ogni volta che un sito web vuole accedere ai dispositivi di acquisizione dei contenuti multimediali.
diff --git a/components/policy/resources/policy_templates_iw.xtb b/components/policy/resources/policy_templates_iw.xtb index 99a38b20..2a66fdf1 100644 --- a/components/policy/resources/policy_templates_iw.xtb +++ b/components/policy/resources/policy_templates_iw.xtb
@@ -201,15 +201,6 @@ אם המדיניות הזו לא תוגדר או תיקבע כ-"tls1.2", <ph name="PRODUCT_NAME" /> לא יחזור יותר לגרסה קודמת. שים לב ששינוי זה אינו משבית את התמיכה בגירסאות ישנות יותר של TLS, ורק קובע אם <ph name="PRODUCT_NAME" /> יעקוף שרתים עם באגים שלא יכולים להתאים גירסאות בצורה תקינה. לחלופין, אם יש לשמור על תאימות לשרת שבו קיימים באגים, אפשר לקבוע את המדיניות הזו כ-"tls1.1". זהו פתרון זמני ויש לתקן במהירות את השרת.</translation> -<translation id="1861037019115362154">קובע רשימה של יישומי פלאגין שמושבתים ב-<ph name="PRODUCT_NAME" /> ומונע ממשתמשים לשנות הגדרה זו. - - ניתן להשתמש בתווים הכלליים לחיפוש '*' ו-'?' כדי להתאים לרצפים של תווים שרירותיים. '*' תואם למספר שרירותי של תווים ואילו '?' מציין תו בודד אופציונלי, כלומר תואם לתווים אפס או אחד. תו היציאה הוא '\', ולכן כדי למצוא התאמה בפועל לתווים '*', '?' או '\', תוכל להוסיף לפניהם את התו '\'. - - אם תהפוך הגדרה זו לפעילה, <ph name="PRODUCT_NAME" /> לא ישתמש לעולם ברשימת יישומי הפלאגין שמופיעה. יישומי הפלאגין מסומנים כמושבתים ב-'about:plugins' והמשתמשים אינם יכולים להפעיל אותם. - - שים לב כי מדיניות זו מבטלת את המדיניות EnabledPlugins ואת המדיניות DisabledPluginsExceptions. - - אם מדיניות זו לא הוגדרה, המשתמש יכול להשתמש בכל פלאגין המותקן במערכת, למעט יישומי פלאגין המקודדים באופן קשיח, אינם תואמים, מיושנים או מסוכנים.</translation> <translation id="1864269674877167562">אם מדיניות זו מוגדרת למחרוזת ריקה או שאינה מוגדרת כלל, <ph name="PRODUCT_OS_NAME" /> לא יציג אפשרות להשלמה אוטומטית במהלך זרימת הכניסה של משתמש. אם מדיניות זו מוגדרת למחרוזת המייצגת שם דומיין, <ph name="PRODUCT_OS_NAME" /> יציג אפשרות להשלמה אוטומטית בכניסה של המשתמש ויאפשר למשתמש להקליד רק את שם המשתמש שלו ללא סיומת שם הדומיין. המשתמש יוכל להחליף את הסיומת של שם דומיין זה.</translation> <translation id="1865417998205858223">הרשאות עיקריות</translation> @@ -812,11 +803,6 @@ <translation id="3660562134618097814">העבר קובצי cookie של SAML IdP במהלך ההתחברות</translation> <translation id="3709266154059827597">הגדר רשימה שחורה של התקנת תוספים</translation> <translation id="3711895659073496551">השהה</translation> -<translation id="3715448429089775791">מדיניות זו מאלצת הפעלה של מצב בטיחות ב-YouTube ומונעת שינוי של הגדרה זו על ידי משתמשים. - - אם אתה מפעיל הגדרה זו, מצב בטיחות ב-YouTube יהיה תמיד פעיל. - - אם אתה משבית הגדרה זו או לא מגדיר ערך, לא מתבצעת הפעלה כפויה של מצב בטיחות ב-YouTube.</translation> <translation id="3750220015372671395">חסימה של יצירת מפתחות באתרים אלה</translation> <translation id="3756011779061588474">חסימה של מצב מפתח</translation> <translation id="3758089716224084329">מאפשרת לך לציין את שרת ה-proxy שבו משתמש <ph name="PRODUCT_NAME" /> ומונעת ממשתמשים לשנות את הגדרות שרת ה-proxy. @@ -1961,10 +1947,6 @@ מזהי סוגי החיבור המוכרים הם "Ethernet", "WiFi", "WiMAX", "Bluetooth" ו"סלולרי".</translation> <translation id="7763614521440615342">הצג הצעות תוכן בדף 'כרטיסייה חדשה'</translation> -<translation id="7766336524667238790">דווח פרטים על הפעלת הקיוסק הפעילה, כדוגמת - המזהה והגרסה של היישום. - - אם המדיניות מוגדרת כ-false, פרטי ההפעלה לא ידווחו. אם היא מוגדרת כ-true או אינה מוגדרת, פרטי ההפעלה ידווחו.</translation> <translation id="7774768074957326919">השתמש בהגדרות Proxy של המערכת</translation> <translation id="7775831859772431793">כאן תוכל לציין את כתובת האתר של שרת ה-proxy. @@ -2182,6 +2164,9 @@ <translation id="8369602308428138533">השהיה של כיבוי מסך כשנעשה שימוש בשקע חשמל</translation> <translation id="8382184662529825177">הפעל את השימוש בהזדהות מרחוק להגנה על תוכן עבור המכשיר הזה</translation> <translation id="838870586332499308">הפעל נתוני נדידה</translation> +<translation id="8390049129576938611">משבית את מציג ה-PDF הפנימי של <ph name="PRODUCT_NAME" />. במקום להשתמש במציג הפנימי, המערכת מתייחסת לקובצי PDF כהורדה ומאפשרת למשתמש לפתוח אותם באפליקציה המוגדרת כברירת מחדל. + אם לא תוגדר מדיניות למקרים אלה או שהמדיניות תושבת, המערכת תשתמש בפלאגין ה-PDF לפתיחת קובצי PDF, אלא אם המשתמש ישבית אותו.</translation> +<translation id="8402079500086185021">השתמש באמצעי חיצוני לפתיחת קובצי PDF תמיד</translation> <translation id="8412312801707973447">האם מבוצעות בדיקות OCSP/CRL מקוונות</translation> <translation id="8413348101535146315">מאפשרת לסיים תהליכים במנהל המשימות של <ph name="PRODUCT_NAME" />. @@ -2202,17 +2187,6 @@ כדי לראות דפוסים לדוגמה, עבור לכתובת http://www.chromium.org/developers/how-tos/chrome-frame-getting-started.</translation> <translation id="8493645415242333585">השבת שמירה של היסטוריית דפדפן</translation> <translation id="8499172469244085141">הגדרות ברירת מחדל (המשתמשים יכולים לעקוף אותן)</translation> -<translation id="8501011084242226370">מציינת רשימה של יישומי פלאגין שהמשתמש יכול להפעיל או להשבית ב-<ph name="PRODUCT_NAME" />. - - ניתן להשתמש בתווים הכלליים '*' ו-'?' כך שיתאימו לרצף של תווים שרירותיים. '*' תואם למספר שרירותי של תווים, בעוד ש-'?' מציין תו יחיד אופציונלי, זאת אומרת, תואם לתווי 0 או 1. תו הביטול הוא '\', לכן כדי שיתאמו לתווי '*', '?' או '\' אמיתיים, תוכל למקם את התו '\' לפניהם. - - אם תפעיל את ההגדרה הזו, ניתן להשתמש ברשימת יישומי הפלאגין המצוינת ב-<ph name="PRODUCT_NAME" />. משתמשים יוכלו להפעיל או להשבית אותם ב-about:plugins, גם אם הפלאגין תואם לדפוס ב-DisabledPlugins. משתמשים יכולים גם להפעיל ולהשבית יישומי פלאגין שלא תואמים לדפוסים כלשהם ב-DisabledPlugins, DisabledPluginsExceptions ו-EnabledPlugins. - - מטרת המדיניות הזו היא לאפשר הוספה קפדנית של פלאגין לרשימה השחורה כשהרשימה DisabledPlugins מכילה ערכים עם תו כללי, כמו השבתה של כל יישומי הפלאגין '*' או השבתה של כל יישומי הפלאגין של Java '*Java*', אבל מנהל המערכת רוצה להפעיל גרסה ספציפית כלשהי כמו 'IcedTea Java 2.3'. ניתן לציין את הגרסה הספציפית הזו במדיניות הזו. - - שים לב שיש לפטור מכך את שם הפלאגין או את שם הקבוצה של יישומי הפלאגין. כל קבוצה של יישומי פלאגין מוצגת בקטע נפרד ב-about:plugins; בכל קטע יכול להיות פלאגין אחד או יותר. לדוגמה, הפלאגין Shockwave Flash שייך לקבוצה Adobe Flash Player ועבור שני השמות חייבת להיות התאמה ברשימת החריגים אם יש לפטור את הפלאגין הזה מהרשימה השחורה. - - אם המדיניות הזו אינה מוגדרת, כל פלאגין התואם לדפוסים ב-DisabledPlugins יינעל ויושבת, והמשתמש לא יוכל להפעיל אותו.</translation> <translation id="8519264904050090490">כתובות אתרים של חריגים ידניים של משתמשים מנוהלים</translation> <translation id="8544375438507658205">מעבד HTML המוגדר כברירת מחדל עבור <ph name="PRODUCT_FRAME_NAME" /></translation> <translation id="8549772397068118889">הצג אזהרה בעת ביקור באתרים שמחוץ לחבילות תוכן</translation> @@ -2238,7 +2212,6 @@ הפרד בין שמות מרובים של שרתים באמצעות פסיקים. ניתן להשתמש בתווים כלליים (*). אם לא תגדיר מדיניות זו, <ph name="PRODUCT_NAME" /> ינסה לזהות אם השרת נמצא באינטראנט, ורק אז יגיב לבקשות IWA. אם שרת יזוהה כמחובר לאינטרנט, <ph name="PRODUCT_NAME" /> יתעלם מבקשות IWA המגיעות ממנו.</translation> -<translation id="8668394701842594241">מציג רשימה של יישומי פלאגין המופעלים ב-<ph name="PRODUCT_NAME" /> ומונעים ממשתמשים לשנות הגדרה זו. ניתן להשתמש בתווים הכלליים (*) ו-(?) כדי להתאים רצפים של תווים שרירותיים. (*) תואם למספר שרירותי של תווים ואילו (?) מציין תו בודד אופציונלי, כלומר תואם לתווים אפס או אחד. תו היציאה הוא (\), ולכן כדי למצוא התאמה בפועל לתווים (*), (?) או (\), תוכל להוסיף לפניהם את התו (\). <ph name="PRODUCT_NAME" /> תמיד משתמש ברשימת יישומי הפלאגין שמופיעה, אם הם מותקנים. יישומי הפלאגין מסומנים כמופעלים ב-about:plugins והמשתמשים אינם יכולים להשבית אותם. שים לב כי מדיניות זו עוקפת את המדיניות DisabledPlugins והמדיניות DisabledPluginsExceptions. אם מדיניות זו לא הוגדרה, המשתמש יכול להשבית כל פלאגין המותקן במערכת.</translation> <translation id="8672321184841719703">גירסת עדכון אוטומטי המוגדרת כיעד</translation> <translation id="868068801094828689">מדיניות זו מאפשרת לשלוח ל-Google דיווח אנונימי על נתוני שימוש ונתונים הקשורים לקריסות בנוגע ל-<ph name="PRODUCT_NAME" />, ומונעת ממשתמשים לשנות הגדרה זו. @@ -2328,13 +2301,6 @@ באופן אוטומטי עם Quirks Server, יוריד קובצי תצורה אם הם זמינים ויאחסן אותם במכשיר. הקבצים האלה יכולים לשמש, לדוגמה, כדי לשפר את איכות התצוגה בצגים המחוברים.</translation> -<translation id="8905426178924715309">מדיניות זו הוצאה משימוש. השתמש ב-ForceGoogleSafeSearch וב-ForceYouTubeSafetyMode במקומה. מדיניות זו לא תובא בחשבון אם ForceGoogleSafeSearch או ForceYouTubeSafetyMode יוגדרו. - - מדיניות זו מאלצת ביצוע שאילתות בחיפוש האינטרנט של Google כאשר 'חיפוש בטוח' מוגדר כ'פעיל' ומונעת את השינוי של הגדרה זו על ידי המשתמשים. הגדרה זו גם מאלצת את YouTube לפעול במצב בטוח. - - אם תפעיל הגדרה זו, 'חיפוש בטוח' בחיפוש Google וב-YouTube יהיה פעיל תמיד. - - אם תשבית הגדרה זו או לא תגדיר ערך, לא תתבצע אכיפה של 'חיפוש בטוח' בחיפוש Google וב-YouTube.</translation> <translation id="8906768759089290519">הפעל מצב אורח</translation> <translation id="8908294717014659003">מאפשר לך לקבוע אם אתרים מורשים לקבל גישה למכשירי לכידת מדיה. ניתן לאפשר גישה למכשירי לכידת מדיה כברירת מחדל, או שבכל פעם שאתר רוצה לקבל גישה למכשירי לכידת מדיה, תוצג בקשה למשתמש.
diff --git a/components/policy/resources/policy_templates_ja.xtb b/components/policy/resources/policy_templates_ja.xtb index 38b7018..f53fec9 100644 --- a/components/policy/resources/policy_templates_ja.xtb +++ b/components/policy/resources/policy_templates_ja.xtb
@@ -208,15 +208,6 @@ このポリシーが設定されていないか、「tls1.2」に設定されている場合、<ph name="PRODUCT_NAME" /> でこのフォールバックは実行されなくなります。なお、これは以前の TLS バージョンのサポートを無効にするものではなく、バージョン ネゴシエーションを正しく実行できないサーバーのバグを <ph name="PRODUCT_NAME" /> で回避するかどうかを決めるものです。 バグが発生したサーバーとの互換性を維持する必要がある場合は、このポリシーを「tls1.1」に設定します。これは暫定的な措置であり、サーバーのバグは速やかに修正する必要があります。</translation> -<translation id="1861037019115362154"><ph name="PRODUCT_NAME" /> で無効にするプラグインのリストを指定し、ユーザーがこの設定を変更できないようにします。 - - 任意の文字列に一致するワイルドカード文字「*」と「?」を使用できます。「*」は任意の文字数の文字列に一致しますが、「?」は省略可能な 1 文字を示します。つまり、0 または 1 文字に一致します。エスケープ文字は「\」であり、実際の「*」、「?」、「\」文字に一致させるには、これらの文字の前に「\」を指定します。 - - この設定を有効にすると、指定したプラグインのリストは <ph name="PRODUCT_NAME" /> では使用されません。プラグインは「about:plugins」で無効であることが表示され、ユーザーが有効にすることはできません。 - - このポリシーは EnabledPlugins と DisabledPluginsExceptions で上書きすることができます。 - - このポリシーが未設定の場合、ユーザーはシステムにインストールされた任意のプラグインを使用できます。ただし、ハードコードされ互換性のない、古い、または危険なプラグインを除きます。</translation> <translation id="1864269674877167562">このポリシーが空の文字列または未設定の場合は、<ph name="PRODUCT_OS_NAME" /> でユーザーのログインフロー時にオートコンプリートのオプションは表示されません。 このポリシーがドメイン名を表す文字列に設定されている場合は、<ph name="PRODUCT_OS_NAME" /> でユーザーがログインする際にオートコンプリートのオプションが表示されます。この場合、ユーザーはドメイン名の部分を省略してユーザー名を入力するだけで済みます。また、ユーザーはこのドメイン名の部分を上書きすることもできます。</translation> <translation id="1865417998205858223">キーの権限</translation> @@ -813,11 +804,6 @@ <translation id="3660562134618097814">ログイン時に SAML IdP Cookie を転送する</translation> <translation id="3709266154059827597">拡張機能インストールのブラックリストを設定する</translation> <translation id="3711895659073496551">停止する</translation> -<translation id="3715448429089775791">YouTube のセーフモードを強制的に有効にして、ユーザーがこの設定を変更できないようにします。 - - この設定を有効にすると、YouTube のセーフモードは常に有効になります。 - - この設定を無効にした場合、または値を設定しない場合、YouTube のセーフモードは有効になりません。</translation> <translation id="3750220015372671395">指定サイトでのキー生成をブロックする</translation> <translation id="3756011779061588474">デベロッパー モードをブロックする</translation> <translation id="3758089716224084329"><ph name="PRODUCT_NAME" /> が使用するプロキシ サーバーを指定できます。この場合、ユーザーがプロキシ設定を変更することはできません。 @@ -1978,9 +1964,6 @@ 認識される接続タイプ ID は「ethernet」、「wifi」、「wimax」、「bluetooth」、「cellular」です。</translation> <translation id="7763614521440615342">[新しいタブ] ページにおすすめのコンテンツを表示します</translation> -<translation id="7766336524667238790">アクティブなキオスク セッションに関する情報(アプリケーション ID、バージョンなど)を報告します。 - -このポリシーを false に設定した場合、セッションに関する情報は報告されません。true に設定するか未設定のままにした場合は、セッションに関する情報が報告されます。</translation> <translation id="7774768074957326919">システムのプロキシ設定を使用する</translation> <translation id="7775831859772431793">プロキシ サーバーの URL をここで指定できます。 @@ -2201,6 +2184,10 @@ <translation id="8369602308428138533">画面がオフになるまでの時間(AC 電源での実行時)</translation> <translation id="8382184662529825177">デバイスのコンテンツ保護に関するリモート認証の使用を有効にする</translation> <translation id="838870586332499308">データ ローミングを有効にする</translation> +<translation id="8390049129576938611"><ph name="PRODUCT_NAME" /> で内部 PDF ビューアを無効にします。この場合、ユーザーはダウンロードしたファイルと同じように、PDF ファイルをデフォルトのアプリで開くことができます。 + + このポリシーを未設定のままにするか無効にした場合は、ユーザーが PDF プラグインを無効にしない限り、PDF ファイルは PDF プラグインで開かれます。</translation> +<translation id="8402079500086185021">PDF ファイルを常に外部アプリで開く</translation> <translation id="8412312801707973447">オンライン OCSP/CRL チェックを実行するかどうかを指定する</translation> <translation id="8413348101535146315"><ph name="PRODUCT_NAME" /> のタスク マネージャでプロセスを終了できるようにします。 @@ -2221,17 +2208,6 @@ パターンの例については、https://www.chromium.org/developers/how-tos/chrome-frame-getting-started をご覧ください。</translation> <translation id="8493645415242333585">ブラウザの履歴の保存を無効にする</translation> <translation id="8499172469244085141">デフォルト設定(ユーザーによるオーバーライド可能)</translation> -<translation id="8501011084242226370">ユーザーが <ph name="PRODUCT_NAME" /> で有効または無効にできるプラグインのリストを指定します。 - - 「*」と「?」はワイルドカード文字で、照合の際に任意の文字数の文字列に相当するものとして使用できます。「*」は任意の数の文字、「?」は 1 文字以下(つまり 0 文字か 1 文字)の照合に使用します。エスケープ文字は「\」です。「*」、「?」、または「\」を実際の文字として使用したい場合は、その直前に「\」を挿入します。 - - この設定を有効にすると、指定したプラグインのリストを <ph name="PRODUCT_NAME" /> で使用できるようになります。ユーザーは、プラグインが DisabledPlugins 内のパターンに一致する場合でも、「about:plugins」でそのプラグインを有効または無効にできます。また、DisabledPlugins、DisabledPluginsExceptions、EnabledPlugins 内のパターンに一致しないプラグインについても有効または無効にできます。 - - このポリシーを使用することで、プラグインの厳格なブラックリストを作成できます。たとえば、「DisabledPlugins」リストにすべてのプラグインを無効にする「*」やすべての Java プラグインを無効にする「*Java*」などのワイルドカード エントリが含まれている場合でも、特定のバージョン(たとえば「IcedTea Java 2.3」)のみを有効にしたい場合はこのポリシーに指定することで有効にできます。 - - プラグイン名とプラグインのグループ名の両方を除外する必要がありますので注意してください。各プラグイン グループは、about:plugins 内の別々のセクションとして記述されています。1 つのセクションには 1 つ以上のプラグインが含まれています。たとえば、「Shockwave Flash」プラグインは「Adobe Flash Player」グループに含まれており、ブラックリストから除外するには両方の名前が例外リストのエントリと一致する必要があります。 - - このポリシーが未設定の場合、「DisabledPlugins」のパターンに一致するプラグインはすべて無効に固定され、ユーザーはこれらのプラグインを有効にできなくなります。</translation> <translation id="8519264904050090490">管理対象ユーザーの手動による例外 URL</translation> <translation id="8544375438507658205"><ph name="PRODUCT_FRAME_NAME" /> のデフォルトの HTML レンダラ</translation> <translation id="8549772397068118889">コンテンツ パック外部のサイトを訪問したときに警告する</translation> @@ -2267,7 +2243,6 @@ サーバー名を複数指定する場合はカンマで区切ります。ワイルドカード(*)を使用できます。 このポリシーを設定しない場合、<ph name="PRODUCT_NAME" /> はサーバーがイントラネット上にあるかどうか検出を試み、その上で IWA リクエストに応答します。サーバーがインターネット上で検出された場合、そのサーバーからの IWA リクエストは <ph name="PRODUCT_NAME" /> では無視されます。</translation> -<translation id="8668394701842594241"><ph name="PRODUCT_NAME" /> で有効にするプラグインのリストを指定し、ユーザーがこの設定を変更できないようにします。任意の文字列に一致するワイルドカード文字「*」と「?」を使用できます。「*」は任意の数の文字に一致しますが、「?」は省略可能な 1 文字を示します。つまり、0 または 1 文字に一致します。エスケープ文字は「\」であり、実際の「*」、「?」、「\」文字に一致させるには、これらの文字の前に「\」を指定します。指定したプラグインのリストをインストールすると常に <ph name="PRODUCT_NAME" /> で使用されるようになります。プラグインは「about:plugins」で有効であることが表示され、ユーザーが無効にすることはできません。このポリシーは、DisabledPlugins と DisabledPluginsExceptions の両方を上書きします。このポリシーが未設定の場合、ユーザーはシステムにインストールされたプラグインを無効にできます。</translation> <translation id="8672321184841719703">自動更新の対象バージョンを指定</translation> <translation id="868068801094828689"><ph name="PRODUCT_NAME" /> の使用状況と障害関連のデータを匿名で Google に報告し、ユーザーがこの設定を変更できないようにします。 @@ -2360,13 +2335,6 @@ 設定ファイルがある場合はダウンロードされて端末に保存されます。 こうした設定ファイルは、接続しているモニターの画質向上などの 目的で使用されます。</translation> -<translation id="8905426178924715309">このポリシーはサポート終了となりました。代わりに ForceGoogleSafeSearch と ForceYouTubeSafetyMode を使用してください。ForceGoogleSafeSearch ポリシーまたは ForceYouTubeSafetyMode ポリシーのいずれかが設定されている場合、このポリシーは無視されます。 - -Google ウェブ検索のクエリの実行時に SafeSearch を強制適用するとともに、ユーザーによるこの設定の変更を禁止します。この設定により、YouTube でもセーフモードが強制適用されます。 - -この設定を有効にした場合、Google 検索と YouTube では SafeSearch が常時有効になります。 - -この設定を無効にするか値を設定していない場合、Google 検索と YouTube で SafeSearch は強制適用されません。</translation> <translation id="8906768759089290519">ゲスト モードを有効にする</translation> <translation id="8908294717014659003">メディア キャプチャ デバイスのアクセスをウェブサイトに許可するかどうかを設定できます。デフォルトでメディア キャプチャ デバイスへのアクセスを許可するか、メディア キャプチャ デバイスへのアクセス要求がウェブサイトからあるたびにユーザーに確認することができます。
diff --git a/components/policy/resources/policy_templates_kn.xtb b/components/policy/resources/policy_templates_kn.xtb index 2dfa637..e97629f 100644 --- a/components/policy/resources/policy_templates_kn.xtb +++ b/components/policy/resources/policy_templates_kn.xtb
@@ -202,15 +202,6 @@ ಈ ನೀತಿಯನ್ನು ಕಾನ್ಫಿಗರ್ ಮಾಡದಿದ್ದರೆ ಅಥವಾ ಅದನ್ನು "tls1.2" ಗೆ ಹೊಂದಿಸಿದ್ದರೆ <ph name="PRODUCT_NAME" /> ಇನ್ನು ಮುಂದೆ ಈ ಫಾಲ್ಬ್ಯಾಕ್ ಕುರಿತು ಕಾರ್ಯನಿರ್ವಹಿಸುವುದಿಲ್ಲ. ಇದು ಹಳೆಯ TLS ಆವೃತ್ತಿಗಳಿಗೆ ಬೆಂಬಲವನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸುವುದಿಲ್ಲ ಎಂಬುದನ್ನು ಗಮನದಲ್ಲಿರಿಸಿಕೊಳ್ಳಿ, <ph name="PRODUCT_NAME" /> ಮಾತ್ರ ಸರಿಯಾಗಿ ಕಾರ್ಯಗತಗೊಳಿಸದ ಆವೃತ್ತಿಗಳಲ್ಲಿ ದೋಷ ಸರ್ವರ್ಗಳು ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತವೆ. ಇಲ್ಲವಾದರೆ, ದೋಷಯುಕ್ತ ಸರ್ವರ್ಗೆ ಹೊಂದಾಣಿಕೆ ಮಾಡಿದಲ್ಲಿ ನಿರ್ವಹಿಸಬೇಕಾಗುವದು, ಈ ನೀತಿಯನ್ನು "tls1.1" ಗೆ ಹೊಂದಿಸಬಹುದು. ಇದು ಸ್ಟಾಪ್ಗ್ಯಾಪ್ ಕ್ರಮವಾಗಿದೆ ಮತ್ತು ಸರ್ವರ್ ಅನ್ನು ವೇಗವಾಗಿ ಅಳವಡಿಸಬೇಕಾಗಿರುತ್ತದೆ.</translation> -<translation id="1861037019115362154"><ph name="PRODUCT_NAME" /> ನಲ್ಲಿ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾದ ಪ್ಲಗಿನ್ಗಳ ಪಟ್ಟಿಯನ್ನು ನಿರ್ದಿಷ್ಟಪಡಿಸುತ್ತದೆ ಮತ್ತು ಈ ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ಬದಲಾಯಿಸುವುದರಿಂದ ಬಳಕೆದಾರರನ್ನು ತಡೆಯುತ್ತದೆ. - - ಅನಿಯಂತ್ರಿತ ಅಕ್ಷರಗಳ ಸರಣಿಗಳನ್ನು ಹೊಂದಾಣಿಕೆ ಮಾಡಲು ವೈಲ್ಡ್ಕಾರ್ಡ್ ಅಕ್ಷರಗಳಾದ '*' ಮತ್ತು '?' ಅನ್ನು ಬಳಸಬಹುದಾಗಿದೆ. '*' ಅನಿಯಂತ್ರಿತ ಅಕ್ಷರಗಳ ಸಂಖ್ಯೆಗೆ ಹೊಂದಾಣಿಕೆಯಾಗುತ್ತದೆ ಅದೇ ಸಮಯದಲ್ಲಿ '?' ಐಚ್ಖಿಕ ಒಂದು ಅಕ್ಷರವನ್ನು ನಿರ್ದಿಷ್ಟಪಡಿಸುತ್ತದೆ, ಅಂದರೆ ಸೊನ್ನೆ ಅಥವಾ ಒಂದು ಅಕ್ಷರಗಳನ್ನು ಹೊಂದಾಣಿಕೆ ಮಾಡುತ್ತದೆ. ಎಸ್ಕೇಪ್ ಅಕ್ಷರವು '\' ಆಗಿದೆ, ಇದರಿಂದಾಗಿ ನೈಜವಾದ '*', '?', ಅಥವಾ '\' ಅಕ್ಷರಗಳನ್ನು ಹೊಂದಾಣಿಕೆ ಮಾಡಲು, ಅದರ ಮುಂದೆ ನೀವು '\' ಅನ್ನು ಹಾಕಬಹುದು. - - ಈ ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ನೀವು ಸಕ್ರಿಯಗೊಳಿಸಿದಲ್ಲಿ, ನಿರ್ದಿಷ್ಟಪಡಿಸಿದ ಪ್ಲಗಿನ್ಗಳ ಪಟ್ಟಿಯನ್ನು <ph name="PRODUCT_NAME" /> ರಲ್ಲಿ ಎಂದಿಗೂ ಬಳಸಲಾಗುವುದಿಲ್ಲ. ಪ್ಲಗಿನ್ಗಳನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿರುವಂತೆ 'about:plugins' ರಲ್ಲಿ ಗುರುತಿಸಲಾಗಿದೆ ಮತ್ತು ಬಳಕೆದಾರರು ಅವುಗಳನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲಾಗುವುದಿಲ್ಲ. - - EnabledPlugins ಮತ್ತು DisabledPluginsExceptions ರಿಂದ ಈ ನೀತಿಯನ್ನು ಅತಿಕ್ರಮಿಸಬಹುದಾಗಿದೆ ಎಂಬುದನ್ನು ಗಮನಿಸಿ. - - ಈ ನೀತಿಯನ್ನು ಹೊಂದಿಸದೆ ಬಿಟ್ಟರೆ ಬಳಕೆದಾರರು ಹಾರ್ಡ್-ಕೋಡೆಡ್ ಅಸಾಮರ್ಥ್ಯದ, ಅವಧಿ ಮುಗಿದಿರುವ ಅಥವಾ ಅಪಾಯಕರ ಪ್ಲಗಿನ್ಗಳನ್ನು ಹೊರತುಪಡಿಸಿ ಸಿಸ್ಟಂನಲ್ಲಿ ಸ್ಥಾಪಿಸಲಾಗಿರುವ ಯಾವುದೇ ಪ್ಲಗಿನ್ ಅನ್ನು ಬಳಸಬಹುದಾಗಿದೆ.</translation> <translation id="1864269674877167562">ಈ ನೀತಿಯನ್ನು ಖಾಲಿ ಸ್ಟ್ರಿಂಗ್ಗೆ ಅಥವಾ ಕಾನ್ಫಿಗರ್ ಮಾಡಲಾಗಿಲ್ಲ ಎಂಬುದಕ್ಕೆ ಹೊಂದಿಸಿದ್ದರೆ, ಬಳಕೆದಾರ ಸೈನ್-ಇನ್ ಫ್ಲೋ ಸಂದರ್ಭದಲ್ಲಿ ಸ್ವಯಂಪೂರ್ಣತೆ ಆಯ್ಕೆಯನ್ನು <ph name="PRODUCT_OS_NAME" /> ತೋರಿಸುವುದಿಲ್ಲ. ಈ ನೀತಿಯನ್ನು ಡೊಮೇನ್ ಹೆಸರನ್ನು ಪ್ರತಿನಿಧಿಸುವ ಸ್ಟ್ರಿಂಗ್ಗೆ ಹೊಂದಿಸಿದ್ದರೆ, ಬಳಕೆದಾರ ಸೈನ್-ಇನ್ ಸಂದರ್ಭದಲ್ಲಿ ಸ್ವಯಂಪೂರ್ಣತೆ ಆಯ್ಕೆಯನ್ನು <ph name="PRODUCT_OS_NAME" /> ತೋರಿಸುತ್ತದೆ, ಈ ಮೂಲಕ ಡೊಮೇನ್ ಹೆಸರು ವಿಸ್ತರಣೆ ಇಲ್ಲದೆಯೇ ಕೇವಲ ಅವರ ಬಳಕೆದಾರ ಹೆಸರನ್ನು ಟೈಪ್ ಮಾಡಲು ಬಳಕೆದಾರರಿಗೆ ಅನುಮತಿಸುತ್ತದೆ. ಬಳಕೆದಾರರಿಗೆ ಈ ಡೊಮೇನ್ ಹೆಸರು ವಿಸ್ತರಣೆಯನ್ನು ಓವರ್ವ್ರೈಟ್ ಮಾಡಲು ಸಾಧ್ಯವಾಗುತ್ತದೆ.</translation> <translation id="1865417998205858223">ಪ್ರಮುಖ ಅನುಮತಿಗಳು</translation> @@ -806,11 +797,6 @@ <translation id="3660562134618097814">ಲಾಗಿನ್ ಸಮಯದಲ್ಲಿ SAML IdP ಕುಕೀಗಳನ್ನು ವರ್ಗಾಯಿಸಿ</translation> <translation id="3709266154059827597">ವಿಸ್ತರಣೆ ಸ್ಥಾಪನೆಯ ಶ್ವೇತಪಟ್ಟಿಯನ್ನು ಕಾನ್ಫಿಗರ್ ಮಾಡಿ</translation> <translation id="3711895659073496551">ಅಮಾನತು</translation> -<translation id="3715448429089775791">YouTube ಸುರಕ್ಷತೆ ಮೋಡ್ ಸಕ್ರಿಯವಾಗಿರುವಂತೆ ಒತ್ತಾಯಿಸುತ್ತದೆ ಮತ್ತು ಈ ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ಬಳಕೆದಾರರು ಬದಲಾಯಿಸುವುದನ್ನು ತಡೆಯುತ್ತದೆ. - - ಈ ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ನೀವು ಸಕ್ರಿಯಗೊಳಿಸಿದರೆ, YouTube ನಲ್ಲಿನ ಸುರಕ್ಷತೆ ಮೋಡ್ ಯಾವಾಗಲೂ ಸಕ್ರಿಯವಾಗಿರುತ್ತದೆ. - - ನೀವು ಈ ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿದರೆ ಅಥವಾ ಮೌಲ್ಯವನ್ನು ಹೊಂದಿಸದಿದ್ದರೆ, YouTube ನಲ್ಲಿನ ಸುರಕ್ಷತೆ ಮೋಡ್ ಅನ್ನು ಜಾರಿಗೊಳಿಸಲಾಗುವುದಿಲ್ಲ.</translation> <translation id="3750220015372671395">ಈ ಸೈಟ್ಗಳಿಗೆ ಕೀ ರಚನೆ ನಿರ್ಬಂಧಿಸಿ</translation> <translation id="3756011779061588474">ಡೆವಲಪರ್ ಮೋಡ್ ನಿರ್ಬಂಧಿಸಿ</translation> <translation id="3758089716224084329"><ph name="PRODUCT_NAME" /> ಮೂಲಕ ಬಳಸಲಾದ ಪ್ರಾಕ್ಸಿ ಸರ್ವರ್ ಅನ್ನು ನಿರ್ದಿಷ್ಟಪಡಿಸಲು ನಿಮ್ಮನ್ನು ಅನುಮತಿಸುತ್ತದೆ ಮತ್ತು ಪ್ರಾಕ್ಸಿ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ಬದಲಿಸುವುದರಿಂದ ಬಳಕೆದಾರರನ್ನು ತಡೆಯುತ್ತದೆ. @@ -1980,9 +1966,6 @@ ಅಂಗೀಕರಿಸಲಾದ ಸಂಪರ್ಕ ಪ್ರಕಾರ ಗುರುತಿಸುವಿಕೆಗಳು ಎಂದರೆ "ethernet", "wifi", "wimax", "bluetooth" ಮತ್ತು "cellular".</translation> <translation id="7763614521440615342">ಹೊಸ ಟ್ಯಾಬ್ ಪುಟದಲ್ಲಿ ವಿಷಯ ಸಲಹೆಗಳನ್ನು ತೋರಿಸಿ</translation> -<translation id="7766336524667238790">ಅಪ್ಲಿಕೇಶನ್ ಐಡಿ ಮತ್ತು ಆವೃತ್ತಿಯಂತಹ ಸಕ್ರಿಯ ಕಿಯೋಸ್ಕ್ ಸೆಷನ್ ಕುರಿತು ಮಾಹಿತಿಯನ್ನು ವರದಿ ಮಾಡಿ. - -ನೀತಿಯನ್ನು ತಪ್ಪು ಎಂಬುದಕ್ಕೆ ಹೊಂದಿಸಿದರೆ, ಸೆಷನ್ ಮಾಹಿತಿಯನ್ನು ವರದಿ ಮಾಡಲಾಗುವುದಿಲ್ಲ. ಸರಿ ಎಂಬುದಕ್ಕೆ ಹೊಂದಿಸಿದರೆ ಅಥವಾ ಹೊಂದಿಸದೇ ಬಿಟ್ಟರೆ, ಸೆಷನ್ ಮಾಹಿತಿಯನ್ನು ವರದಿ ಮಾಡಲಾಗುತ್ತದೆ.</translation> <translation id="7774768074957326919">ಸಿಸ್ಟಂ ಪ್ರಾಕ್ಸಿ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ಬಳಸಿ</translation> <translation id="7775831859772431793">ನೀವು ಇಲ್ಲಿ ಪ್ರಾಕ್ಸಿ ಸರ್ವರ್ನ URL ಅನ್ನು ನಿರ್ದಿಷ್ಟಪಡಿಸಬಹುದು. @@ -2198,6 +2181,10 @@ <translation id="8369602308428138533">AC ಪವರ್ನಲ್ಲಿರನ್ ಆಗುತ್ತಿರುವಾಗ ಪರದೆ ಆಫ್ ವಿಳಂಬವಾಗುತ್ತದೆ</translation> <translation id="8382184662529825177">ವಿಷಯ ಸಂರಕ್ಷಣೆಗಾಗಿ ರಿಮೋಟ್ ದೃಢೀಕರಣ ಬಳಕೆಯನ್ನು ಸಾಧನಕ್ಕಾಗಿ ಸಕ್ರಿಯಗೊಳಿಸಿ</translation> <translation id="838870586332499308">ಡೇಟಾ ರೋಮಿಂಗ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ</translation> +<translation id="8390049129576938611"><ph name="PRODUCT_NAME" /> ನಲ್ಲಿ ಆಂತರಿಕ PDF ವೀಕ್ಷಣೆಯನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸುತ್ತದೆ. ಬದಲಿಗೆ ಇದು ಡೌನ್ಲೋಡ್ ಎಂದು ಪರಿಗಣಿಸುತ್ತದೆ ಮತ್ತು ಡಿಫಾಲ್ಟ್ ಅಪ್ಲಿಕೇಶನ್ ಮೂಲಕ PDF ಫೈಲ್ಗಳನ್ನು ತೆರೆಯಲು ಅನುಮತಿಸುತ್ತದೆ. + + ಈ ನೀತಿಯನ್ನು ಹೊಂದಿಸದಿದ್ದರೆ ಅಥವಾ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿದರೆ, ಬಳಕೆದಾರರು ಇದನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸದ ಹೊರತು PDF ಫೈಲ್ಗಳನ್ನು ತೆರೆಯಲು PDF ಪ್ಲಗಿನ್ ಅನ್ನು ಬಳಸಲಾಗುತ್ತದೆ.</translation> +<translation id="8402079500086185021">PDF ಫೈಲ್ಗಳನ್ನು ಯಾವಾಗಲೂ ಬಾಹ್ಯವಾಗಿ ತೆರೆಯಿರಿ</translation> <translation id="8412312801707973447">ಆನ್ಲೈನ್ OCSP/CRL ಪರಿಶೀಲನೆಗಳನ್ನು ಕಾರ್ಯಾಚರಿಸಲಾಗುತ್ತದೆಯೇ</translation> <translation id="8413348101535146315"><ph name="PRODUCT_NAME" /> ನ ಕಾರ್ಯ ನಿರ್ವಾಹಕದಲ್ಲಿ ಕೊನೆಗೊಳ್ಳುವ ಪ್ರಕ್ರಿಯೆಗಳನ್ನು ಸಕ್ರಿಯಗೊಳಿಸುತ್ತದೆ. @@ -2218,17 +2205,6 @@ ಉದಾಹರಣೆಯ ಪ್ಯಾಟರ್ನ್ಗಳಿಗೆ https://www.chromium.org/developers/how-tos/chrome-frame-getting-started ಅನ್ನು ವೀಕ್ಷಿಸಿ.</translation> <translation id="8493645415242333585">ಉಳಿಸುವ ಬ್ರೌಸರ್ ಇತಿಹಾಸವನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ</translation> <translation id="8499172469244085141">ಡಿಫಾಲ್ಟ್ ಸೆಟ್ಟಿಂಗ್ಗಳು (ಬಳಕೆದಾರರು ಅತಿಕ್ರಮಿಸಬಹುದು)</translation> -<translation id="8501011084242226370"><ph name="PRODUCT_NAME" /> ನಲ್ಲಿ ಬಳಕೆದಾರರು ಸಕ್ರಿಯ ಅಥವಾ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಬಹುದಾದ ಪ್ಲಗಿನ್ಗಳ ಪಟ್ಟಿಯನ್ನು ನಿರ್ದಿಷ್ಟಪಡಿಸುತ್ತದೆ. - - ವೈಲ್ಡ್ಕಾರ್ಡ್ ಅಕ್ಷರಗಳಾದ '*' ಮತ್ತು '?' ಅನ್ನು ಅಭಿಪ್ರಾಯಾನುಸಾರವಾದ ಅಕ್ಷರಗಳನ್ನು ಹೊಂದಿಸಲು ಬಳಸಬಹುದಾಗಿದೆ. '*' ಅಭಿಪ್ರಾಯಾನುಸಾರವಾದ ಸಂಖ್ಯೆಯನ್ನು ಹೋಲುತ್ತದೆ ಮತ್ತು '?' ಐಚ್ಛಿಕ ಏಕ ಅಕ್ಷರವನ್ನು ಸೂಚಿಸುತ್ತದೆ, ಅಂದರೆ ಸೊನ್ನೆ ಅಥವಾ ಒಂದು ಅಕ್ಷರವನ್ನು ಹೋಲುತ್ತದೆ. ನೈಜವಾದ '*', '?', ಅಥವಾ '\' ಹೋಲುವುದಕ್ಕಾಗಿ ಎಸ್ಕೇಪ್ ಅಕ್ಷರವು '\' ಆಗಿದೆ, ಅವುಗಳ ಮುಂದೆ ನೀವು '\' ಅನ್ನು ಹಾಕಬಹುದು. - - ನೀವು ಈ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿದರೇ, ನಿರ್ದಿಷ್ಟಪಡಿಸಿದ ಪಟ್ಟಿಯ ಪ್ಲಗಿನ್ಗಳನ್ನು <ph name="PRODUCT_NAME" /> ನಲ್ಲಿ ಬಳಸಬಹುದು. ಬಳಕೆದಾರರು ಅವುಗಳನ್ನು 'about:plugins' ನಲ್ಲಿ ಸಕ್ರಿಯ ಅಥವಾ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಬಹುದು, DisabledPlugin ಗಳ ಮಾದರಿಯಲ್ಲಿದ್ದರೂ ಸಹ ಪ್ಲಗಿನ್ ಹೊಂದುತ್ತದೆ. ಬಳಕೆದಾರರು DisabledPlugins, DisabledPluginsExceptions ಮತ್ತು EnabledPlugins ಗಳಲ್ಲಿನ ಯಾವುದೇ ನಮೂನೆಗಳಿಗೆ ಹೊಂದದಂತಹ ಪ್ಲಗಿನ್ಗಳನ್ನು ಸಕ್ರಿಯ ಅಥವಾ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಬಹುದು. - - ಈ ನೀತಿಯು ಎಲ್ಲಾ ಪ್ಲಗಿನ್ಗಳನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲು '*' ಅಥವಾ ಎಲ್ಲಾ Java ಪ್ಲಗಿನ್ಗಳನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸು '*Java*' ನಂತಹ ವೈಲ್ಡ್ಕಾರ್ಡ್ ನಮೂದನೆಗಳನ್ನು ಒಳಗೊಂಡಿರುವ 'DisabledPlugins' ಪಟ್ಟಿಯಲ್ಲಿ ನಿರ್ಬಂಧಿತ ಪ್ಲಗಿನ್ ಕಪ್ಪುಪಟ್ಟಿಗಾಗಿ ಅನುಮತಿಸಬೇಕಾಗಿದೆ ಆದರೆ ನಿರ್ವಾಹಕರು 'IcedTea Java 2.3' ನಂತಹ ಕೆಲವು ನಿರ್ದಿಷ್ಟ ಆವೃತ್ತಿಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲು ಬಯಸುತ್ತಾರೆ. - - ಪ್ಲಗಿನ್ ಹೆಸರು ಮತ್ತು ಪ್ಲಗಿನ್ಗಳ ಗುಂಪಿನ ಹೆಸರುಗಳೆರಡಕ್ಕೂ ವಿನಾಯಿತಿ ನೀಡಬೇಕೆಂಬುದನ್ನು ಗಮನಿಸಿ. ಪ್ರತಿ ಪ್ಲಗಿನ್ ಗುಂಪು about:plugins ನಲ್ಲಿ ಪ್ರತ್ಯೇಖ ವಿಭಾಗದಲ್ಲಿ ತೋರಿಸಲಾಗುತ್ತದೆ; ಪ್ರತಿ ವಿಭಾಗಗಳು ಒಂದು ಅಥವಾ ಹೆಚ್ಚು ಪ್ಲಗಿನ್ಗಳನ್ನು ಹೊಂದಿರಬಹುದು. ಉದಾಹರಣೆಗೆ, "Shockwave Flash" ಪ್ಲಗಿನ್ "Adobe Flash Player" ಗುಂಪಿಗೆ ಸೇರಿರುವ ಪ್ಲಗಿನ್ ಆಗಿದೆ, ಮತ್ತು ಕಪ್ಪುಪಟ್ಟಿಯಿಂದ ವಿನಾಯಿತಿ ಪಡೆಯಲಿರುವ ಪ್ಲಗಿನ್ ಆಗಿದ್ದರೆ. ಎರಡೂ ಹೆಸರುಗಳು ವಿನಾಯಿತಿ ಪಟ್ಟಿಯೊಳಗೆ ಹೊಂದಿಕೆಯನ್ನು ಹೊಂದಿರಬೇಕು. - - ಈ ನೀತಿಯನ್ನು ಯಾವುದೇ ಪ್ಲಗಿನ್ಗೆ ಹೊಂದಿಸದೆ ಬಿಟ್ಟರೇ ಅದು 'DisabledPlugins' ಗಳಲ್ಲಿನ ಮಾದರಿಗಳ ಹೊಂದಾಣಿಕೆಗಳಿಗೆ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ ಲಾಕ್ ಮಾಡುತ್ತದೆ ಮತ್ತು ಬಳಕೆದಾರರಿಗೆ ಅವುಗಳನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ.</translation> <translation id="8519264904050090490">ನಿರ್ವಹಿಸಲಾದ ಬಳಕೆದಾರ ಮ್ಯಾನುಯಲ್ ವಿನಾಯಿತಿ URLಗಳು</translation> <translation id="8544375438507658205"><ph name="PRODUCT_FRAME_NAME" /> ಗಾಗಿ ಡಿಫಾಲ್ಟ್ HTML ರೆಂಡರರ್</translation> <translation id="8549772397068118889">ವಿಷಯ ಪ್ಯಾಕ್ಗಳ ಹೊರಗಿನ ಸೈಟ್ಗಳಿಗೆ ಭೇಟಿ ನೀಡುವಾಗ ಎಚ್ಚರಿಸಿ</translation> @@ -2253,7 +2229,6 @@ ಬಹು ಸರ್ವರ್ ಹೆಸರುಗಳನ್ನು ಅಲ್ಪವಿರಾಮಗಳಿಂದ ಬೇರ್ಪಡಿಸಿ. ವೈಲ್ಡ್ಕಾರ್ಡ್ಗಳನ್ನು (*) ಅನುಮತಿಸಲಾಗುತ್ತದೆ. ಈ ನೀತಿಯನ್ನು ನೀವು ಹೊಂದಿಸದೆ ಹಾಗೇ ಬಿಟ್ಟರೆ ಸರ್ವರ್ ಇಂಟ್ರಾನೆಟ್ನಲ್ಲಿದೆಯೇ ಎಂಬುದನ್ನು ಪತ್ತೆಹಚ್ಚಲು <ph name="PRODUCT_NAME" /> ಪ್ರಯತ್ನಿಸುತ್ತದೆ ನಂತರ ಮಾತ್ರವೇ ಅದು IWA ವಿನಂತಿಗಳಿಗೆ ಪ್ರತಿಕ್ರಿಯಿಸುತ್ತದೆ. ಸರ್ವರ್ ಅನ್ನು ಇಂಟರ್ನೆಟ್ನಂತೆ ಪತ್ತೆಹಚ್ಚಲಾಗಿದ್ದರೆ ನಂತರ ಅದರಿಂದ IWA ವಿನಂತಿಗಳನ್ನು <ph name="PRODUCT_NAME" /> ನಿರ್ಲಕ್ಷಿಸುತ್ತದೆ.</translation> -<translation id="8668394701842594241"><ph name="PRODUCT_NAME" />ರಲ್ಲಿ ಸಕ್ರಿಯಗೊಳಿಸಿದ ಪ್ಲಗಿನ್ಗಳ ಪಟ್ಟಿಯನ್ನು ನಿರ್ದಿಷ್ಟಗೊಳಿಸುತ್ತದೆ ಮತ್ತು ಈ ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ಬದಲಾಯಿಸುವುದರಿಂದ ಬಳಕೆದಾರರನ್ನು ದೂರವಿರಿಸುತ್ತದೆ. ವೈಲ್ಡ್ಕಾರ್ಡ್ ಅಕ್ಷರಗಳಾದ '*' ಮತ್ತು '?' ಬಳಸಿಕೊಂಡು ಆರ್ಬಿಟ್ರರಿ ಅಕ್ಷರಗಳ ಅನುಕ್ರಮಗಳ ತಾಳೆ ನೋಡಬಹುದಾಗಿದೆ. ಅಂದರೆ '?' ಐಚ್ಚಿಕ ಏಕ ಅಕ್ಷರವೆಂದು ಪರಿಗಣಿಸಿದರೆ ಅಕ್ಷರಗಳ ಆರ್ಬಿಟ್ರರಿ ಸಂಖ್ಯೆಯನ್ನು '*' ಹೊಂದಿಸುತ್ತದೆ ಅಂದರೆ, ಸೊನ್ನೆ ಅಥವಾ ಒಂದು ಅಕ್ಷರಗಳನ್ನು ತಾಳೆ ಮಾಡುತ್ತದೆ. ಎಸ್ಕೇಪ್ ಅಕ್ಷರವು '\' ಆಗಿದೆ, ಹಾಗಾಗೀ ನೈಜ '*', '?', ಅಥವಾ '\' ಅಕ್ಷರಗಳನ್ನು ತಾಳೆ ನೋಡಲು, ನೀವು ಅವುಗಳ ಮುಂದೆ '\' ಅನ್ನು ಇರಿಸಬಹುದಾಗಿದೆ. ಸ್ಥಾಪಿಸಿದಲ್ಲಿ ಪ್ಲಗಿನ್ಗಳ ನಿರ್ದಿಷ್ಟ ಪಡಿಸಿದ ಪಟ್ಟಿಯನ್ನು <ph name="PRODUCT_NAME" /> ರಲ್ಲಿ ಬಳಸಲಾಗಿದೆ. ಪ್ಲಗಿನ್ಗಳನ್ನು 'ಬಗ್ಗೆ:ಪ್ಲಗಿನ್ಗಳು' ರಲ್ಲಿ ಸಕ್ರಿಯಗೊಳಿಸಿದಂತೆ ಗುರುತಿಸಲಾಗುತ್ತದೆ ಮತ್ತು ಬಳಕೆದಾರರು ಅವುಗಳನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗುವುದಿಲ್ಲ. ಈ ನೀತಿಯು DisabledPlugins ಮತ್ತು DisabledPluginsExceptions ಎರಡನ್ನು ಅತಿಕ್ರಮಿಸುತ್ತದೆ ಎಂಬುದನ್ನು ಗಮನದಲ್ಲಿಡಿ. ಈ ನೀತಿಯನ್ನು ಬಿಟ್ಟಿದ್ದರೆ ಬಳಕೆದಾರರನ್ನು ಹೊಂದಿಸಿಲ್ಲದಿದ್ದರೆ ಬಳಕೆದಾರರು ಸಿಸ್ಟಂನಲ್ಲಿ ಸ್ಥಾಪಿಸಲಾಗಿರುವ ಯಾವುದೇ ಪ್ಲಗಿನ್ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಬಹುದಾಗಿದೆ.</translation> <translation id="8672321184841719703">ಲಕ್ಷ್ಯ ಸ್ವಯಂ ಅಪ್ಡೇಟ್ ಆದ ಆವೃತ್ತಿ</translation> <translation id="868068801094828689">ಬಳಕೆ ಮತ್ತು <ph name="PRODUCT_NAME" /> ಕುರಿತು ಕ್ರ್ಯಾಷ್ ಸಂಬಂಧಿತ ಡೇಟಾವನ್ನು Google ಗೆ ಅನಾಮಧೇಯವಾಗಿ ವರದಿ ನೀಡುವುದನ್ನು ಸಕ್ರಿಯಗೊಳಿಸುತ್ತದೆ ಹಾಗೂ ಈ ಸೆಟ್ಟಿಂಗ್ ಬದಲಾವಣೆ ಮಾಡದಂತೆ ಬಳಕೆದಾರರನ್ನು ತಡೆಯುತ್ತದೆ. @@ -2334,13 +2309,6 @@ ಈ ನೀತಿಯು ನಿಜವಾಗಿದ್ದರೆ ಅಥವಾ ಕಾನ್ಫಿಗರ್ ಮಾಡದೇ ಇದ್ದರೆ ಆಗ Quirks ಸರ್ವರ್ ಅನ್ನು <ph name="PRODUCT_OS_NAME" /> ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಸಂಪರ್ಕಿಸುತ್ತದೆ ಮತ್ತು ಲಭ್ಯವಿದ್ದರೆ ಕಾನ್ಫಿಗರೇಶನ್ ಫೈಲ್ಗಳನ್ನು ಡೌನ್ಲೋಡ್ ಮಾಡುತ್ತದೆ ಮತ್ತು ಅವುಗಳನ್ನು ಸಾಧನದಲ್ಲಿ ಸಂಗ್ರಹಿಸುತ್ತದೆ. ಅಂತಹ ಫೈಲ್ಗಳನ್ನು ಉದಾಹರಣೆಗಾಗಿ ಲಗತ್ತಿಸಿದ ಮಾನಿಟರ್ಗಳ ಪ್ರದರ್ಶನ ಗುಣಮಟ್ಟ ಸುಧಾರಿಸಲು ಬಳಸಬಹುದು.</translation> -<translation id="8905426178924715309">ಈ ನೀತಿಯನ್ನು ತಡೆಹಿಡಿಯಲಾಗಿದೆ. ಬದಲಿಗೆ ForceGoogleSafeSearch ಮತ್ತು ForceYouTubeSafetyMode ಬಳಸಿ. ForceGoogleSafeSearch ಅಥವಾ ForceYouTubeSafetyMode ನೀತಿಗಳಲ್ಲಿ ಯಾವುದನ್ನಾದರೂ ಹೊಂದಿಸಿದ್ದರೆ ಈ ನೀತಿಯನ್ನು ನಿರ್ಲಕ್ಷಿಸಲಾಗುತ್ತದೆ. - - ಸಕ್ರಿಯ ಎಂದು ಹೊಂದಿಸಲಾಗಿರುವ SafeSearch ಜೊತೆ ಮಾಡಲು Google ವೆಬ್ ಹುಡುಕಾಟದಲ್ಲಿ ಪ್ರಶ್ನೆಗಳನ್ನು ಹೇರುತ್ತದೆ ಹಾಗೂ ಈ ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ಬಳಕೆದಾರರು ಬದಲಾಯಿಸದಂತೆ ತಡೆಯುತ್ತದೆ. YouTube ನಲ್ಲಿ ಸುರಕ್ಷತೆ ಮೋಡ್ ಅನ್ನು ಸಹ ಈ ಸೆಟ್ಟಿಂಗ್ ಹೇರುತ್ತದೆ. - - ಈ ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ನೀವು ಸಕ್ರಿಯಗೊಳಿಸಿದರೆ, Google ಹುಡುಕಾಟ ಮತ್ತು YouTube ನಲ್ಲಿ SafeSearch ಯಾವಾಗಲೂ ಸಕ್ರಿಯವಾಗಿರುತ್ತದೆ. - - ಈ ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ನೀವು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿದರೆ ಅಥವಾ ಮೌಲ್ಯವನ್ನು ಹೊಂದಿಸದಿದ್ದರೆ, Google ಹುಡುಕಾಟ ಮತ್ತು YouTube ನಲ್ಲಿ SafeSearch ಜಾರಿಗೊಳಿಸಲಾಗುವುದಿಲ್ಲ.</translation> <translation id="8906768759089290519">ಅತಿಥಿ ಮೋಡ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ</translation> <translation id="8908294717014659003">ಮಾಧ್ಯಮ ಸೆರೆಹಿಡಿಯುವ ಸಾಧನಗಳಿಗೆ ಪ್ರವೇಶವನ್ನು ಪಡೆಯಲು ವೆಬ್ಸೈಟ್ಗಳನ್ನು ಅನುಮತಿಸಲಾಗಿದೆಯೇ ಎಂಬುದನ್ನು ಹೊಂದಿಸಲು ನಿಮಗೆ ಅನುಮತಿಸುತ್ತದೆ. ಮಾಧ್ಯಮ ಸೆರೆಹಿಡಿಯುವ ಸಾಧನಗಳನ್ನು ಪ್ರವೇಶಿಸಲು ಡಿಫಾಲ್ಟ್ ಆಗಿ ಅನುಮತಿಸಬಹುದಾಗಿದೆ ಅಥವಾ ಬಳೆಕದಾರರು ಮಾಧ್ಯಮ ಸೆರೆಹಿಡಿಯುವ ಸಾಧನಗಳಿಗೆ ಪ್ರವೇಶವನ್ನು ಪಡೆಯಲು ಪ್ರತಿ ಬಾರಿಯೂ ಕೇಳಬೇಕಾಗುತ್ತದೆ.
diff --git a/components/policy/resources/policy_templates_ko.xtb b/components/policy/resources/policy_templates_ko.xtb index 87b63a2..7b45749 100644 --- a/components/policy/resources/policy_templates_ko.xtb +++ b/components/policy/resources/policy_templates_ko.xtb
@@ -209,15 +209,6 @@ 이 정책이 설정되어 있지 않거나 'tls1.2'로 설정된 경우 <ph name="PRODUCT_NAME" />에서 더 이상 이 대체 프로세스를 수행하지 않습니다. 이 경우에도 오래된 TLS 버전 지원이 중단되지 않으며, 버전을 올바르게 협상하지 못하는 버그가 있는 서버 문제를 <ph name="PRODUCT_NAME" />에서 해결할 것인지만 결정합니다. 버그가 발생한 서버와의 호환성이 유지되어야 하는 경우 이 정책을 'tls1.1'로 설정해야 합니다. 이는 임시 조치이며 신속하게 서버 문제를 해결해야 합니다.</translation> -<translation id="1861037019115362154"><ph name="PRODUCT_NAME" />에서 사용 중지되는 플러그인 목록을 지정하고 사용자가 이 설정을 변경하지 못하게 합니다. - - 와일드카드 문자('*' 및 '?')를 사용하여 일련의 임의 문자를 비교할 수 있습니다. '*'는 임의의 여러 문자와 일치하며 '?'는 선택적인 단일 문자를 지정합니다(즉, 일치하는 문자가 없거나 한 글자와 일치시킴). 실제 '*', '?' 또는 '\' 문자를 비교할 때는 이스케이프 문자인 '\'자를 이러한 문자 앞에 배치하여 사용합니다. - - 이 설정을 사용하면 지정된 플러그인 목록이 <ph name="PRODUCT_NAME" />에서 사용되지 않습니다. 플러그인은 'about:plugins'에서 사용 중지로 표시되며 사용자가 이를 사용하도록 설정할 수 없습니다. - - 이 정책은 EnabledPlugins 및 DisabledPluginsExceptions에 의해 무시될 수 있습니다. - - 이 정책을 설정하지 않은 경우 사용자가 시스템에 설치된 모든 플러그인을 사용할 수 있습니다. 단, 호환되지 않으며 오래되고 위험한 하드 코딩된 플러그인은 제외됩니다.</translation> <translation id="1864269674877167562">이 정책이 빈 문자열로 설정되거나 설정되지 않는 경우 <ph name="PRODUCT_OS_NAME" />(은)는 사용자 로그인 과정에서 자동완성 옵션을 표시하지 않습니다. 이 정책이 도메인 이름을 나타내는 문자열로 설정되는 경우 <ph name="PRODUCT_OS_NAME" />에서 사용자 로그인 시 자동완성 옵션을 표시해 사용자가 도메인 이름 확장자 없이 사용자 이름만 입력할 수 있습니다. 사용자는 이 도메인 이름 확장자를 덮어쓸 수 있습니다.</translation> <translation id="1865417998205858223">주요 권한</translation> @@ -860,11 +851,6 @@ <translation id="3660562134618097814">로그인 중 SAML IdP 쿠키 전송</translation> <translation id="3709266154059827597">확장 프로그램 설치 차단목록 설정</translation> <translation id="3711895659073496551">일시중지</translation> -<translation id="3715448429089775791">YouTube 안전 모드를 강제로 활성화하고 사용자가 이 설정을 변경할 수 없도록 합니다. - - 이 설정을 사용하도록 설정하면 YouTube의 안전 모드가 항상 활성화됩니다. - - 이 설정을 사용 중지하거나 값을 설정하지 않으면 YouTube의 안전 모드가 강제로 실행되지 않습니다.</translation> <translation id="3750220015372671395">이 사이트에서 키 생성 차단</translation> <translation id="3756011779061588474">개발자 모드 차단</translation> <translation id="3758089716224084329"><ph name="PRODUCT_NAME" />에서사용하는 프록시 서버를 지정하도록 하며 사용자가 프록시 설정을 변경하지 못하게 합니다. @@ -2123,12 +2109,6 @@ 인식할 수 있는 연결 유형 식별자는 'ethernet', 'wifi', 'wimax', 'bluetooth' 및 'cellular'입니다.</translation> <translation id="7763614521440615342">새 탭 페이지에 콘텐츠 추천 표시</translation> -<translation id="7766336524667238790">활성 키오스크 세션에 대한 - 정보(예: 애플리케이션 ID 및 버전)를 보고합니다. - - 정책이 'false'로 설정된 경우 세션 정보가 보고되지 않으며 - 'true'로 설정되거나 설정하지 않으면 세션 정보가 - 보고됩니다.</translation> <translation id="7774768074957326919">시스템 프록시 설정 사용</translation> <translation id="7775831859772431793">여기에서 프록시 서버의 URL을 지정할 수 있습니다. @@ -2365,6 +2345,10 @@ <translation id="8369602308428138533">AC 전원으로 실행할 때 화면 꺼짐 지연</translation> <translation id="8382184662529825177">기기의 콘텐츠 보호에 원격 인증을 사용합니다.</translation> <translation id="838870586332499308">데이터 로밍 사용</translation> +<translation id="8390049129576938611"><ph name="PRODUCT_NAME" />의 내부 PDF 뷰어를 사용 중지합니다. 대신 이를 다운로드로 처리하며 사용자가 기본 애플리케이션으로 PDF 파일을 열 수 있습니다. + + 이 정책이 설정되어 있지 않거나 사용 중지되어 있으면 사용자가 사용 중지하지 않는 한 PDF 플러그인을 사용하여 PDF 파일이 열립니다.</translation> +<translation id="8402079500086185021">항상 외부에서 PDF 파일 열기</translation> <translation id="8412312801707973447">온라인 OCSP/CRL 확인 수행 여부</translation> <translation id="8413348101535146315"><ph name="PRODUCT_NAME" />의 작업 관리자에서 종료 프로세스를 사용 설정합니다. @@ -2385,17 +2369,6 @@ 예제 패턴은 https://www.chromium.org/developers/how-tos/chrome-frame-getting-started 페이지를 참조하세요.</translation> <translation id="8493645415242333585">브라우저 기록 저장 사용 중지</translation> <translation id="8499172469244085141">기본 설정(사용자가 변경할 수 있음)</translation> -<translation id="8501011084242226370">사용자가 <ph name="PRODUCT_NAME" />에서 사용하거나 사용 중지할 수 있는 플러그인 목록을 지정합니다. - - 와일드카드 문자 '*' 및 '?'를 사용하여 일련의 임의 문자를 비교할 수 있습니다. '*'는 임의의 여러 문자와 일치하며 '?'는 선택적인 단일 문자를 지정합니다(즉, 일치하는 문자가 없거나 한 글자와 일치시킴). 실제 '*', '?', 또는 '\' 문자를 비교할 때는 이스케이프 문자인 '\'를 이러한 문자 앞에 배치하여 사용합니다. - - 이 설정을 사용하면 지정된 플러그인 목록이 <ph name="PRODUCT_NAME" />에서 사용됩니다. 사용자는 플러그인이 DisabledPlugins의 패턴과 일치하더라도 'about:plugins'에서 플러그인을 사용하거나 사용 중지할 수 있습니다. 또한 DisabledPlugins, DisabledPluginsExceptions, EnabledPlugins의 모든 패턴과 일치하지 않는 경우에도 해당 플러그인을 사용하거나 사용 중지할 수 있습니다. - - 이 정책은 'DisabledPlugins' 목록에 모든 플러그인을 사용 중지하는 '*' 또는 모든 자바 플러그인을 사용 중지하는 '*Java*'와 같은 와일드카드 항목을 포함하지만 관리자가 'IcedTea Java 2.3'과 같은 특정 버전을 사용하도록 설정할 수 있게 하는 엄격한 플러그인 차단을 위한 것입니다. 특정 버전은 이 정책에 지정할 수 있습니다. - - 플러그인 이름 및 플러그인의 그룹명은 모두 제외해야 합니다. 각 플러그인 그룹은 about:plugins의 별도 섹션에 표시되며 각 섹션에는 하나 이상의 플러그인이 포함되어야 합니다. 예를 들어 'Shockwave Flash' 플러그인은 'Adobe Flash Player' 그룹에 포함되며 해당 플러그인이 블랙리스트에서 제외되어야 하는 경우 두 이름이 모두 예외 목록에 포함되어 있어야 합니다. - - 이 정책을 설정하지 않으면 'DisabledPlugins'의 패턴과 일치하는 모든 플러그인이 잠겨 사용 중지되며 사용자가 다시 사용할 수 없습니다.</translation> <translation id="8519264904050090490">관리 사용자 직접 예외 URL</translation> <translation id="8544375438507658205"><ph name="PRODUCT_FRAME_NAME" />의 기본 HTML 렌더러</translation> <translation id="8549772397068118889">콘텐츠 팩 외부 사이트를 방문할 때 표시되는 경고입니다.</translation> @@ -2431,15 +2404,6 @@ 여러 개의 서버 이름은 콤마(,)로 구분되며 와일드카드(*)를 사용할 수 있습니다. 이 정책을 설정하지 않으면 서버가 인트라넷에 있는 경우 <ph name="PRODUCT_NAME" />이(가) 감지하여 IWA 요청에만 응답합니다. 서버가 인트라넷으로 감지된 경우 <ph name="PRODUCT_NAME" />이(가) IWA 요청을 무시합니다.</translation> -<translation id="8668394701842594241"><ph name="PRODUCT_NAME" />에서 사용하도록 설정된 플러그인 목록을 지정하고 사용자가 이 설정을 변경하지 못하게 합니다. - - 와일드카드 문자('*' 및 '?')를 사용하여 일련의 임의 문자를 비교할 수 있습니다. '*'는 임의의 여러 문자와 일치하며 '?'는 선택적인 단일 문자를 지정합니다(즉, 일치하는 문자가 없거나 한 글자와 일치시킴). 실제 '*', '?' 또는 '\' 문자를 비교할 때는 이스케이프 문자인 '\'자를 이러한 문자 앞에 배치하여 사용합니다. - - 지정된 플러그인 목록이 설치되어 있는 경우 <ph name="PRODUCT_NAME" />에서 항상 사용됩니다. 플러그인은 'about:plugins'에서 사용 설정된 것으로 표시되며 사용자가 사용 중지할 수 없습니다. - - 이 정책은 DisabledPlugins 및 DisabledPluginsExceptions를 모두 무시합니다. - - 이 정책이 설정되어 있지 않은 경우 사용자가 시스템에 설치된 모든 플러그인을 사용 중지할 수 있습니다.</translation> <translation id="8672321184841719703">자동 업데이트 버전 타겟팅</translation> <translation id="868068801094828689"><ph name="PRODUCT_NAME" />와(과) 관련된 사용 및 비정상 종료 관련 데이터를 Google에 익명으로 보고하도록 허용하며 사용자가 이 설정을 변경할 수 없도록 합니다. @@ -2539,13 +2503,6 @@ 자동으로 Quirks 서버에 연결하고 구성 파일을 다운로드하며 가능한 경우 기기에 파일을 저장합니다. 이러한 파일은 연결된 모니터의 디스플레이 품질 개선 등에 사용될 수 있습니다.</translation> -<translation id="8905426178924715309">이 정책은 지원 중단되었으므로 대신 ForceGoogleSafeSearch 및 ForceYouTubeSafetyMode를 사용하시기 바랍니다. ForceGoogleSafeSearch 또는 ForceYouTubeSafetyMode 정책이 설정된 경우 이 정책이 무시됩니다. - - 세이프서치가 활성화되도록 설정된 상태에서 Google 웹 검색이 이루어지며 사용자가 이 설정을 바꾸지 못하도록 합니다. 또한 이 설정은 YouTube에서 안전 모드를 사용하도록 합니다. - - 이 설정을 사용하면 Google 검색 및 YouTube에서 세이프서치가 항상 활성화됩니다. - - 이 설정을 사용 중지하거나 값을 설정하지 않으면 Google 검색 및 YouTube에 세이프서치가 적용되지 않습니다.</translation> <translation id="8906768759089290519">손님 모드 사용</translation> <translation id="8908294717014659003">미디어 캡쳐 장치에 대한 웹사이트의 액세스 허용 여부를 설정할 수 있습니다. 미디어 캡쳐 장치에 대해 액세스를 기본적으로 허용하거나 웹사이트가 액세스하려고 할 때마다 확인하도록 설정할 수도 있습니다.
diff --git a/components/policy/resources/policy_templates_lt.xtb b/components/policy/resources/policy_templates_lt.xtb index 2d729e4..4a9a1bda 100644 --- a/components/policy/resources/policy_templates_lt.xtb +++ b/components/policy/resources/policy_templates_lt.xtb
@@ -209,15 +209,6 @@ 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 „\“. - - Jei įgalinate šį nustatymą, nurodytas papildinių sąrašas niekada nenaudojamas „<ph name="PRODUCT_NAME" />“. Papildiniai žymimi kaip neleidžiami skiltyje „about:plugins“ ir naudotojai negali jų įgalinti. - - Atminkite, kad šią politiką galima pakeisti taikant „EnabledPlugins“ (įgalinti papildiniai) ir „DisabledPluginsExceptions“ (neleidžiamų papildinių išimtys). - - Nenustačius šios politikos, naudotojas (-a) gali naudoti bet kokį sistemoje įdiegtą papildinį, išskyrus užprogramuotuosius nesuderinamus, pasenusius ar pavojingus papildinius.</translation> <translation id="1864269674877167562">Jei ši politika nustatyta į tuščią eilutę arba yra nesukonfigūruota, „<ph name="PRODUCT_OS_NAME" />“ nerodys automatinio užbaigimo parinkties naudotojų prisijungimo eigoje. Jei ši politika nustatyta į eilutę, kuri nurodo domeno pavadinimą, „<ph name="PRODUCT_OS_NAME" />“ rodys automatinio užbaigimo parinktį prisijungiant ir naudotojai galės įvesti tik savo naudotojo vardą be domeno pavadinimo plėtinio. Naudotojas galės nepaisyti šio domeno pavadinimo plėtinio.</translation> <translation id="1865417998205858223">Raktų leidimai</translation> @@ -862,11 +853,6 @@ <translation id="3660562134618097814">„SAML IdP“ slapukų perkėlimas prisijungiant</translation> <translation id="3709266154059827597">Konfigūruoti plėtinių diegimo juodąjį sąrašą</translation> <translation id="3711895659073496551">Laikinai sustabdyti</translation> -<translation id="3715448429089775791">Priverstinai suaktyvinamas „YouTube“ saugos režimas; naudotojams neleidžiama keisti šio nustatymo. - - Jei įgalinsite šį nustatymą, „YouTube“ saugos režimas bus visada aktyvus. - - Jei šį nustatymą išjungsite arba nenustatysite vertės, „YouTube“ saugos režimas nebus vykdomas.</translation> <translation id="3750220015372671395">Blokuoti rakto generavimą šiose svetainėse</translation> <translation id="3756011779061588474">Blokuoti kūrėjo režimą</translation> <translation id="3758089716224084329">Leidžiama nurodyti „<ph name="PRODUCT_NAME" />“ naudojamą tarpinį serverį ir neleidžiama naudotojams keisti tarpinio serverio nustatymų. @@ -2133,12 +2119,6 @@ Atpažįstami ryšio tipo identifikatoriai yra „ethernet“, „wifi“, „wimax“, „bluetooth“ ir „cellular“.</translation> <translation id="7763614521440615342">Rodyti turinio pasiūlymus naujo skirtuko puslapyje</translation> -<translation id="7766336524667238790">Pateikiama informacija apie aktyvią viešojo terminalo sesiją, pvz., - programos ID ir versija. - - Jei politika nustatyta į „false“, sesijos informacija nebus - pateikta. Jei ji nustatyta į „true“ arba yra nenustatyta, sesijos informacija bus - teikiama.</translation> <translation id="7774768074957326919">Naudoti sistemos tarpinio serverio nustatymus</translation> <translation id="7775831859772431793">Čia galite nurodyti įgaliotojo serverio URL. @@ -2376,6 +2356,10 @@ <translation id="8369602308428138533">Ekrano išjungimo delsa, kai naudojama kintamosios srovės energija</translation> <translation id="8382184662529825177">Įgalinti nuotolinio patvirtinimo naudojimą siekiant apsaugoti įrenginio turinį</translation> <translation id="838870586332499308">Įgalinti duomenų tarptinklinį ryšį</translation> +<translation id="8390049129576938611">Išjungiama vidinė PDF peržiūros priemonė „<ph name="PRODUCT_NAME" />“. Failai laikomi atsisiuntimu ir naudotojui leidžiama atidaryti PDF failus naudojant numatytąją programą. + + Jei ši politika nenustatyta ar išjungta, PDF failams atidaryti bus naudojamas PDF papildinys (jei naudotojas jo neišjungė).</translation> +<translation id="8402079500086185021">Visada atidaryti PDF failus už programos ribų</translation> <translation id="8412312801707973447">Ar atliekami OCSP / CRL patikrinimai prisijungus</translation> <translation id="8413348101535146315">Leidžiama užbaigti procesus „<ph name="PRODUCT_NAME" />“ užduočių tvarkytuvėje. @@ -2396,17 +2380,6 @@ Šablonų pavyzdžių galite rasti apsilankę adresu https://www.chromium.org/developers/how-tos/chrome-frame-getting-started.</translation> <translation id="8493645415242333585">Neleisti išsaugoti naršyklės istorijos</translation> <translation id="8499172469244085141">Numatytieji nustatymai (naudotojai gali nepaisyti)</translation> -<translation id="8501011084242226370">Nurodomi papildiniai, kuriuos naudotojai gali įgalinti arba išjungti „<ph name="PRODUCT_NAME" />“. - - Pakaitos simbolius „*“ ir „?“ galima naudoti siekiant atitikti atsitiktinių simbolių sekas. „*“ atitinka atsitiktinį simbolių skaičių, o „?“ nurodo pasirenkamą atskirą simbolį, t. y. neatitinka jokių simbolių arba atitinka vieną simbolį. Kaitos ženklas yra „\“, todėl norėdami atitikti faktinius simbolius „*“, „?“ ar „\“ galite jų priekyje pridėti „\“. - - Jei įgalinsite šį nustatymą, nurodytą papildinių sąrašą galėsite naudoti „<ph name="PRODUCT_NAME" />“. Naudotojai galės įgalinti arba išjungti juos nuėję į „about:plugins“, net jei papildinys taip pat atitinka šabloną pagal politiką „DisabledPlugins“. Naudotojai taip pat gali įgalinti ir išjungti jokių šablonų neatitinkančius papildinius politikos nuostatose „DisabledPlugins“, „DisabledPluginsExceptions“ ir „EnabledPlugins“. - - Šia politika taip pat leidžiama griežtai įtraukti papildinius į juodąjį sąrašą, kai sąraše „DisabledPlugins“ yra pakaitos simbolių įrašų, pvz., išjungti visus papildinius „*“ arba išjungti visus „Java“ papildinius „*Java*“, bet administratorius nori įgalinti konkrečią versiją, pvz., „IcedTea Java 2.3“. Šias konkrečias versijas galima nurodyti šioje politikoje. - - Atminkite, kad papildinio pavadinimas ir papildinio grupės pavadinimas turi būti išskirti. Kiekviena papildinių grupė rodoma atskiroje „about:plugins“ skiltyje; kiekvienoje skiltyje gali būti vienas ar daugiau papildinių. Pavyzdžiui, „Shockwave Flash“ papildinys priklauso „Adobe Flash“ leistuvės grupei, todėl abu pavadinimai turi atitikti sąraše nurodytas išimtis, jei tas papildinys turi būti išskirtas iš juodojo sąrašo. - - Jei ši politika nenustatyta, bet kuris politikos „DisabledPlugins“ šablonus atitinkantis papildinys bus užrakintas, išjungtas ir naudotojas negalės jo įgalinti.</translation> <translation id="8519264904050090490">Tvarkomi naudotojo neautomatinių išimčių URL</translation> <translation id="8544375438507658205">Numatytasis „<ph name="PRODUCT_FRAME_NAME" />“ HTML teikėjas</translation> <translation id="8549772397068118889">Įspėti, kai apsilankoma svetainėse, nesančiose turinio paketuose</translation> @@ -2442,15 +2415,6 @@ Kelis serverių pavadinimus atskirkite kableliais. Leidžiama naudoti pakaitos simbolius (*). Jei nenustatysite šios politikos, „<ph name="PRODUCT_NAME" />“ bandys nustatyti, ar serveris yra intranete ir tik tada atsakys į IWA užklausas. Jei serveris aptinkamas internete, „<ph name="PRODUCT_NAME" />“ nepaisys jo siunčiamų IWA užklausų.</translation> -<translation id="8668394701842594241">Nurodomas „<ph name="PRODUCT_NAME" />“ įgalintų papildinių sąrašas ir naudotojams šio nustatymo keisti neleidžiama. - - Kad įrašai atitiktų abejotinų simbolių sekas, galima naudoti pakaitos simbolius „*“ ir „?“. „*“ atitinka abejotiną simbolių skaičių, o „?“ nurodo vieną pasirinktinį simbolį, t. y. atitinka nulio arba vieneto simbolį. Kaitos simbolis yra „\“, taigi, kad simboliai atitiktų faktinius „*“, „?“ arba „\“ simbolius, prieš juos galite įvesti „\“. - - „<ph name="PRODUCT_NAME" />“ visada naudojamas nurodytas papildinių sąrašas, jei jie yra įdiegti. Papildiniai žymimi kaip įgalinti skiltyje „about:plugins“ ir naudotojai negali jų neleisti. - - Atminkite, kad nustačius šią politiką bus nepaisoma nei neleidžiamų papildinių, nei neleidžiamų papildinių išimčių politikos. - - Nenustačius šios politikos, naudotojas (-a) gali neleisti sistemoje įdiegtų papildinių.</translation> <translation id="8672321184841719703">Taikomo automatinio naujinio versija</translation> <translation id="868068801094828689">Įgalinamas anonimiškų „Google“ skirtų „<ph name="PRODUCT_NAME" />“ naudojimo ir su strigtimis susijusių duomenų ataskaitų teikimas; naudotojams šio nustatymo keisti neleidžiama. @@ -2558,13 +2522,6 @@ automatiškai susisieks su „Quirks Server“ ir atsisiųs konfigūracijos failus (jei įmanoma) ir saugos juos įrenginyje. Pvz., tokie failai gali būti naudojami siekiant pagerinti prijungtų monitorių vaizdo kokybę.</translation> -<translation id="8905426178924715309">Ši politika nebenaudojama. Vietoje jos naudokite „ForceGoogleSafeSearch“ ir „ForceYouTubeSafetyMode“. Šios politikos nepaisoma, jei nustatyta politika „ForceGoogleSafeSearch“ arba „ForceYouTubeSafetyMode“. - - „Google“ žiniatinklio paieškos užklausos priverstinai vykdomos naudojant suaktyvintą Saugią paiešką, o naudotojams neleidžiama keisti šio nustatymo. Pasirinkus šį nustatymą taip pat priverstinai įjungiamas saugos režimas sistemoje „YouTube“. - - Jei įgalinsite šį nustatymą, Saugi paieška „Google“ paieškoje ir sistemoje „YouTube“ bus visada aktyvi. - - Jei šį nustatymą išjungsite arba nenustatysite vertės, Saugi paieška „Google“ paieškoje ir sistemoje „YouTube“ nebus priverstinai vykdoma.</translation> <translation id="8906768759089290519">Įgalinti svečio režimą</translation> <translation id="8908294717014659003">Leidžiama jums nustatyti, ar svetainėms leidžiama prieiga prie medijos vaizdų įvedimo įrenginių. Medijos vaizdų įvedimo įrenginių prieiga gali būti leidžiama pagal numatytuosius nustatymus arba naudotojo (-os) gali būti klausiama kiekvieną kartą, kai svetainė nori gauti prieigą prie medijos vaizdų įvedimo įrenginių.
diff --git a/components/policy/resources/policy_templates_lv.xtb b/components/policy/resources/policy_templates_lv.xtb index 5631fbc..ff19db2 100644 --- a/components/policy/resources/policy_templates_lv.xtb +++ b/components/policy/resources/policy_templates_lv.xtb
@@ -211,15 +211,6 @@ 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 “\”. - - Ja šis iestatījums ir iespējots, pārlūkā <ph name="PRODUCT_NAME" /> nekad netiek lietoti sarakstā iekļautie spraudņi. Lapā “about:plugins” norādītie spraudņi tiek atzīmēti kā atspējoti, un lietotāji nevar tos iespējot. - - Ņemiet vērā, ka šo politiku var ignorēt, iestatot politikas EnabledPlugins un DisabledPluginsExceptions. - - Ja šī politika nav iestatīta, lietotājs var izmantot jebkuru datorā instalēto spraudni, izņemot nesaderīgus, novecojušus vai bīstamus spraudņus.</translation> <translation id="1864269674877167562">Ja kā šīs politikas vērtība tiek iestatīta tukša virkne vai ja politika nav konfigurēta, operētājsistēmā <ph name="PRODUCT_OS_NAME" /> lietotāja pierakstīšanās plūsmā netiks rādīta automātiskās pabeigšanas opcija. Ja kā šīs politikas vērtība tiek iestatīta virkne ar domēna nosaukumu, operētājsistēmā <ph name="PRODUCT_OS_NAME" /> lietotāja pierakstīšanās plūsmā tiks parādīta automātiskās pabeigšanas opcija, ļaujot lietotājam ievadīt tikai lietotājvārdu bez domēna nosaukuma paplašinājuma. Lietotājs varēs pārrakstīt šo domēna nosaukuma paplašinājumu.</translation> <translation id="1865417998205858223">Atslēgu atļaujas</translation> @@ -865,11 +856,6 @@ <translation id="3660562134618097814">SAML identitātes nodrošinātāja sīkfailu pārsūtīšana pieteikšanās laikā</translation> <translation id="3709266154059827597">Konfigurē paplašinājumu instalēšanas melno sarakstu</translation> <translation id="3711895659073496551">Darbības apturēšana</translation> -<translation id="3715448429089775791">Šī politika tiek izmantota, lai piespiedu kārtā iestatītu YouTube drošības režīmu kā aktīvu un neļautu lietotājiem mainīt šo iestatījumu. - - Ja iespējojat šo iestatījumu, drošības režīms pakalpojumā YouTube vienmēr ir aktīvs. - - Ja atspējojat šo iestatījumu vai neiestatāt vērtību, drošības režīms pakalpojumā YouTube netiek izmantots piespiedu kārtā.</translation> <translation id="3750220015372671395">Bloķēt atslēgu ģenerēšanu šajās vietnēs</translation> <translation id="3756011779061588474">Bloķēt izstrādātāja režīmu</translation> <translation id="3758089716224084329">Ļauj norādīt <ph name="PRODUCT_NAME" /> izmantoto starpniekserveri un neļauj lietotājiem mainīt starpniekserveru iestatījumus. @@ -2125,12 +2111,6 @@ Atpazītie savienojumu veidu identifikatori ir “ethernet”, “wifi”, “wimax”, “bluetooth” un “cellular”.</translation> <translation id="7763614521440615342">Rādīt satura ieteikumus lapā “Jauna cilne”</translation> -<translation id="7766336524667238790">Tiek sniegta informācija par aktīvo kioska režīma sesiju, - piemēram, lietojumprogrammas ID un versiju. - - Ja šai politikai ir iestatīta vērtība Nepatiesa, netiek sniegta - informācija par sesiju. Ja ir iestatīta vērtība Patiesa - vai nav iestatīta nekāda vērtība, informācija tiek sniegta.</translation> <translation id="7774768074957326919">Izmantot sistēmas starpniekservera iestatījumus</translation> <translation id="7775831859772431793">Šeit varat norādīt starpniekservera URL. @@ -2369,6 +2349,10 @@ <translation id="8369602308428138533">Aizkave līdz ekrāna izslēgšanai, ja ierīce darbojas ar maiņstrāvu</translation> <translation id="8382184662529825177">Iespējot attālās apstiprināšanas lietošanu ierīces satura aizsardzībai</translation> <translation id="838870586332499308">Iespējot datu viesabonēšanu</translation> +<translation id="8390049129576938611">Atspējo <ph name="PRODUCT_NAME" /> iekšējo PDF skatītāju. Tā vietā PDF faili tiek apstrādāti kā lejupielādes, un lietotājs tos var atvērt noklusējuma lietojumprogrammā. + + Ja šī politika nav iestatīta vai ir atspējota, PDF failu atvēršanai tiek lietots PDF spraudnis, ja vien lietotājs to neatspējo.</translation> +<translation id="8402079500086185021">Vienmēr atvērt PDF failus ārēji</translation> <translation id="8412312801707973447">Vai tiek veiktas OCSP/CRL pārbaudes tiešsaistē</translation> <translation id="8413348101535146315">Iespējo procesu beigšanu <ph name="PRODUCT_NAME" /> uzdevumu pārvaldniekā. @@ -2389,17 +2373,6 @@ Šablonu piemērus skatiet šeit: https://www.chromium.org/developers/how-tos/chrome-frame-getting-started.</translation> <translation id="8493645415242333585">Atspējo pārlūkošanas vēstures saglabāšanu</translation> <translation id="8499172469244085141">Noklusējuma iestatījumi (lietotāji var ignorēt)</translation> -<translation id="8501011084242226370">Tiek norādīts saraksts ar spraudņiem, kurus lietotājs var iespējot vai atspējot pārlūkā <ph name="PRODUCT_NAME" />. - - Aizstājējzīmes “*” un “?” var tikt izmantotas, lai meklētu atbilstības brīvi noteiktām rakstzīmēm. Aizstājējzīme “*” atbilst brīvi noteiktam rakstzīmju skaitam, turpretī “?” norāda vienu izvēles rakstzīmi, t.i., atbilst vienai rakstzīmei vai neatbilst nevienai. “\” ir atsoļa rakstzīme. Lai tiktu atrasta atbilstība rakstzīmēm “*”, “?” vai “\”, varat pirms tām ievietot rakstzīmi “\”. - - Iespējojot šo iestatījumu, norādītos spraudņus var izmantot pārlūkā <ph name="PRODUCT_NAME" />. Lietotāji var iespējot vai atspējojot šos spraudņus, dodoties uz about:plugins, pat ja spraudnis atbilst arī saraksta DisabledPlugins rakstiem. Turklāt lietotāji var iespējot un atspējot spraudņus, kas neatbilst nevienam sarakstu DisabledPlugins, DisabledPluginsExceptions un EnabledPlugins rakstam. - - Šī politika tiek izmantota, lai atļautu spraudņu melnos sarakstus gadījumos, kad sarakstā DisabledPlugins ir ieraksti ar aizstājējzīmēm, piemēram, “*” (atspējot visus spraudņus) vai “*Java*” (atspējot visus Java spraudņus), taču administrators vēlas iespējot konkrētu spraudņa versiju, piemēram, “IcedTea Java 2.3”. Šīs konkrētās versijas var norādīt šajā politikā. - - Ņemiet vērā, ka ir jāizslēdz gan spraudņa nosaukums, gan spraudņa grupas nosaukums. Katra spraudņu grupa tiek attēlota atsevišķā about:plugins sadaļā. Katrā sadaļā var būt viens vai vairāki spraudņi. Piemēram, spraudnis Shockwave Flash ir ietverts grupā Adobe Flash Player, tāpēc, lai šis spraudnis tiktu izslēgts no melnā saraksta, abiem nosaukumiem ir jāatbilst ierakstiem izņēmumu sarakstā. - - Ja šī politika netiek iestatīta, jebkurš spraudnis, kas atbildīs saraksta DisabledPlugins rakstiem, tiks atspējots un lietotājs nevarēs to iespējot.</translation> <translation id="8519264904050090490">Pārvaldīto lietotāju manuālo izņēmumu vietrāži URL</translation> <translation id="8544375438507658205"><ph name="PRODUCT_FRAME_NAME" /> noklusējuma HTML renderētājs</translation> <translation id="8549772397068118889">Brīdināt, kad tiek apmeklētas satura pakotnēs neiekļautas vietnes.</translation> @@ -2435,15 +2408,6 @@ Serveru nosaukumus atdaliet ar komatu. Ir atļautas aizstājējzīmes (*). Ja neiestatīsiet šo politiku, <ph name="PRODUCT_NAME" /> mēģinās noteikt, vai serveris darbojas iekštīklā, un tikai pēc tam atbildēs IWA pieprasījumiem. Ja serveris ir atzīts par iekštīklu, <ph name="PRODUCT_NAME" /> ignorēs no tā nosūtītos IWA pieprasījumus.</translation> -<translation id="8668394701842594241">Norāda produktā <ph name="PRODUCT_NAME" /> iespējoto spraudņu sarakstu un neļauj lietotājiem mainīt šo iestatījumu. - - Var lietot aizstājējzīmes * un ?, lai veidotu atbilstību mainīgām rakstzīmēm. * atbilst mainīgu rakstzīmju virknei, bet ? norāda vienu noteiktu rakstzīmi, piemēram, atbilst nullei vai vienai rakstzīmei. Atsoļa rakstzīme ir \, tādējādi, lai veidotu atbilstību faktiskajām rakstzīmēm *, ? un \, to sākumā var ievadīt \. - - Produktā <ph name="PRODUCT_NAME" /> vienmēr tiek lietoti sarakstā iekļautie spraudņi, ja tie ir instalēti. Politikā about:plugins norādītie spraudņi tiek atzīmēti kā iespējoti, un lietotāji tos nevar atspējot. - - Ņemiet vērā, ka šī politika ignorē gan politiku DisabledPlugins, gan DisabledPluginsExceptions. - - Ja šī politika nav iestatīta, lietotājs var atspējot jebkuru datorā instalēto spraudni.</translation> <translation id="8672321184841719703">Automātiskā atjauninājuma vēlamā versija</translation> <translation id="868068801094828689">Iespējo anonīmu pārskatu sūtīšanu Google serveriem ar lietojuma un avāriju datiem pārlūkā <ph name="PRODUCT_NAME" />, kā arī neļauj lietotājiem mainīt šo iestatījumu. @@ -2552,13 +2516,6 @@ automātiski sazināsies ar Quirks serveri, lejupielādēs konfigurācijas failus (ja pieejami) un saglabās tos ierīcē. Šādi faili, piemēram, var tikt izmantoti pievienoto monitoru attēlojuma kvalitātes uzlabošanai.</translation> -<translation id="8905426178924715309">Šī politika ir novecojusi. Lūdzu, tās vietā izmantojiet politikas ForceGoogleSafeSearch un ForceYouTubeSafetyMode. Ja ir iestatīta politika ForceGoogleSafeSearch vai ForceYouTubeSafetyMode, šī politika tiek ignorēta. - - Ja ir iestatīta šī politika, pakalpojumā “Google meklēšana tīmeklī” ievadītajiem vaicājumiem vienmēr tiek aktivizēts filtrs Droša meklēšana un lietotāji nevar mainīt šo iestatījumu, savukārt pakalpojumā YouTube tiek veikta drošā režīma piespiedu iespējošana. - - Ja iespējosiet šo iestatījumu, pakalpojumos “Google meklēšana” un YouTube vienmēr būs aktīvs filtrs Droša meklēšana. - - Ja atspējosiet šo iestatījumu vai neiestatīsiet nekādu vērtību, filtrs Droša meklēšana netiks izmantots piespiedu kārtā pakalpojumā “Google meklēšana” un YouTube.</translation> <translation id="8906768759089290519">Iespējot viesa režīmu</translation> <translation id="8908294717014659003">Ļauj iestatīt, vai vietnēm ir atļauts iegūt piekļuvi multivides tveršanas ierīcēm. Piekļuve multivides tveršanas ierīcēm var būt atļauta pēc noklusējuma, vai lietotājam var tikt parādīts atbilstošs jautājums katru reizi, kad vietne vēlas iegūt piekļuvi multivides tveršanas ierīcēm.
diff --git a/components/policy/resources/policy_templates_ml.xtb b/components/policy/resources/policy_templates_ml.xtb index 0a9806b..e081ad8 100644 --- a/components/policy/resources/policy_templates_ml.xtb +++ b/components/policy/resources/policy_templates_ml.xtb
@@ -210,15 +210,6 @@ ഈ നയം കോൺഫിഗർ ചെയ്തിട്ടില്ലെങ്കിലോ "tls1.2" എന്ന് സജ്ജമാക്കിയിരിക്കുന്നെങ്കിലോ, <ph name="PRODUCT_NAME" /> ഇനി ഈ ഫാൾബാക്ക് നടത്തുന്നതല്ല. ഇത് പഴയ TLS പതിപ്പുകൾക്കുള്ള പിന്തുണ പ്രവർത്തനരഹിതമാക്കില്ലെന്നും, <ph name="PRODUCT_NAME" /> ബഗ് ഉള്ള സെർവറുകളിൽ മാത്രം പ്രവർത്തിക്കുകയും അത് ശരിയായി പതിപ്പുകളെ മാറ്റില്ലെന്നതും ശ്രദ്ധിക്കുക. അല്ലെങ്കിൽ, ബഗ് ഉള്ള സെർവറുമായി അനുയോജ്യമായിരിക്കേണ്ടതാണെങ്കിൽ, ഈ നയത്തെ "tls1.1" എന്ന് സജ്ജമാക്കാം. ഇതൊരു താൽക്കാലിക പരിഹാരം മാത്രമാണ്, അതിനാൽ സെർവർ പ്രശ്നം ഉടൻ തന്നെ പരിഹരിക്കേണ്ടതാണ്.</translation> -<translation id="1861037019115362154"><ph name="PRODUCT_NAME" /> എന്നതിൽ അപ്രാപ്തമാക്കിയ പ്ലഗിനുകളുടെ ഒരു ലിസ്റ്റ് വ്യക്തമാക്കുകയും ഉപയോക്താക്കളെ ഈ ക്രമീകരണം മാറ്റുന്നതിൽ നിന്നും തടയുകയും ചെയ്യുന്നു. - - വൈൽഡ് കാർഡ് പ്രതീകങ്ങളായ '*', '?' എന്നിവ ആർബിട്രറി പ്രതീകങ്ങളുടെ ശ്രേണികളെ പൊരുത്തപ്പെടുത്തുന്നതിനായി ഉപയോഗിച്ചേക്കാം. ഏക ഓപ്ഷണൽ പ്രതീകത്തെ '?' വ്യക്തമാക്കുമ്പോൾ പ്രതീകങ്ങളുടെ ഒരു ആർബിട്രറി നമ്പറിനെ '*' പൊരുത്തപ്പെടുത്തുന്നു, അതായത് പൂജ്യമോ ഒന്നോ പ്രതീകങ്ങളുമായി പൊരുത്തപ്പെടുത്തുന്നു. '\' എസ്ക്കേപ്പ് പ്രതീകമാണ്, അതുകൊണ്ട് '*', '?', അല്ലെങ്കിൽ '\' തുടങ്ങിയ ശരിക്കുള്ള പ്രതീകങ്ങളുമായി പൊരുത്തപ്പെടുത്തുന്നതിന് അവയ്ക്ക് മുന്നിൽ ഒരു '\' ഇട്ടാൽ മതി. - - നിങ്ങൾ ഈ ക്രമീകരണം പ്രാപ്തമാക്കുകയാണെങ്കിൽ, പ്ലഗിനുകളുടെ വ്യക്തമാക്കിയ ലിസ്റ്റ് <ph name="PRODUCT_NAME" />-ൽ ഒരിക്കലും ഉപയോഗിക്കില്ല. പ്ലഗിനുകളെ 'about:plugins' എന്നതിൽ അപ്രാപ്തമാക്കിയതായി അടയാളപ്പെടുത്തിയിരിക്കുന്നതിനാൽ ഉപയോക്താക്കൾക്ക് അവയെ പ്രാപ്തമാക്കാൻ കഴിയില്ല. - - ഈ നയം EnabledPlugins, DisabledPluginsExceptions എന്നിവയെ അസാധുവാക്കുമെന്ന കാര്യം ഓർക്കുക. - - ഈ നയം സജ്ജീകരിക്കാത്ത നിലയിലാണെങ്കിൽ ഉപയോക്താവിന് സിസ്റ്റത്തിൽ ഇൻസ്റ്റാളുചെയ്തിരിക്കുന്ന അനുയോജ്യമല്ലാത്തെ ദൃഢകോഡുകളുള്ള, കാലഹരണപ്പെട്ട, അപകടകരമായ പ്ലഗിനുകൾ ഒഴികെ ഏതൊരു പ്ലഗിനും ഉപയോഗിക്കാൻ കഴിയും.</translation> <translation id="1864269674877167562">ഈ നയം ശൂന്യമായ സ്ട്രിംഗായി സജ്ജമാക്കുകയോ കോൺഫിഗർചെയ്യാതിരിക്കുകയോ ആണെങ്കിൽ, ഉപയോക്തൃ സൈൻ ഇൻ ഫ്ലോയുടെ സമയത്ത് <ph name="PRODUCT_OS_NAME" /> സ്വയംപൂർത്തിയാക്കൽ ഓപ്ഷൻ കാണിക്കില്ല. ഈ നയം, ഡൊമെയ്ൻ പേരിനെ പ്രതിനിധീകരിക്കുന്ന സ്ട്രിംഗിലേക്കാണ് സജ്ജമാക്കിയിരിക്കുന്നതെങ്കിൽ, ഡൊമെയ്ൻ പേര് വിപുലീകരണം ഇല്ലാതെ അവരുടെ ഉപയോക്തൃ നാമം മാത്രം ടൈപ്പുചെയ്യുന്നതിന് ആ ഉപയോക്താവിനെ അനുവദിക്കുന്ന ഒരു സ്വയംപൂർത്തിയാക്കൽ ഓപ്ഷൻ, ഉപയോക്തൃ സൈൻ ഇൻ സമയത്ത് <ph name="PRODUCT_OS_NAME" /> കാണിക്കും. ഉപയോക്താവിന് ഈ ഡൊമെയ്ൻ പേര് വിപുലീകരണം തിരുത്തിയെഴുതാനാകും.</translation> <translation id="1865417998205858223">പ്രധാന അനുമതികൾ</translation> @@ -865,11 +856,6 @@ <translation id="3660562134618097814">ലോഗിൻ സമയത്ത് SAML IdP കുക്കികൾ കൈമാറുക</translation> <translation id="3709266154059827597">വിപുലീകരണ ഇന്സ്റ്റാളേഷന്റെ അനുമതിയില്ലാത്ത ലിസ്റ്റ് കോണ്ഫിഗര് ചെയ്യുക</translation> <translation id="3711895659073496551">താൽക്കാലികമായി നിർത്തുക</translation> -<translation id="3715448429089775791">സജീവമാക്കുന്നതിനും ഈ ക്രമീകരണം മാറ്റുന്നതിന് ഉപയോക്താക്കളെ തടയുന്നതിനുമുള്ള YouTube സുരക്ഷ മോഡ് സജ്ജമാക്കാൻ നിർബന്ധിക്കുന്നു. - - ഈ ക്രമീകരണം പ്രവർത്തനക്ഷമമാക്കുമ്പോൾ YouTube-ലെ സുരക്ഷ മോഡ് എല്ലായ്പ്പോഴും സജീവമായിരിക്കും. - - പ്രവർത്തനരഹിതമാക്കിയിട്ടുണ്ടെങ്കിലോ ഒരു മൂല്യം സജ്ജീകരിച്ചിട്ടില്ലെങ്കിലോ YouTube-ലെ സുരക്ഷ മോഡ് പ്രായോഗികമാകില്ല.</translation> <translation id="3750220015372671395">ഈ സൈറ്റുകളിൽ കീ സൃഷ്ടിക്കൽ ബ്ലോക്കുചെയ്യുക</translation> <translation id="3756011779061588474">ഡെവലപ്പർ മോഡ് തടയുക</translation> <translation id="3758089716224084329"><ph name="PRODUCT_NAME" /> ഉപയോഗിക്കുന്ന പ്രോക്സി സെർവർ വ്യക്തമാക്കാൻ നിങ്ങളെ അനുവദിക്കുന്നു, പ്രോക്സി ക്രമീകരണം മാറ്റുന്നതിൽ നിന്ന് ഉപയോക്താക്കളെ തടയുകയും ചെയ്യുന്നു. @@ -2139,12 +2125,6 @@ "ethernet", "wifi", "wimax", "bluetooth", "cellular" എന്നിവയാണ് അംഗീകൃത കണക്ഷൻ തര ഐഡന്റിഫയറുകൾ.</translation> <translation id="7763614521440615342">പുതിയ ടാബ് പേജിൽ ഉള്ളടക്ക നിർദ്ദേശങ്ങൾ കാണിക്കുക</translation> -<translation id="7766336524667238790">അപ്ലിക്കേഷൻ ഐഡി, പതിപ്പ് എന്നിങ്ങനെയുള്ള സജീവ കിയോസ്ക് - സെഷനെക്കുറിച്ചുള്ള വിവരങ്ങൾ റിപ്പോർട്ടുചെയ്യുക. - - നയത്തെ 'false' എന്ന് സജ്ജമാക്കുകയാണെങ്കിൽ, സെഷൻ വിവരങ്ങൾ - റിപ്പോർട്ടുചെയ്യപ്പെടില്ല. 'true' എന്ന് സജ്ജമാക്കുകയാണെങ്കിലോ സജ്ജമാക്കാതെ - വിടുകയാണെങ്കിലോ, സെഷൻ വിവരങ്ങൾ റിപ്പോർട്ടുചെയ്യപ്പെടും.</translation> <translation id="7774768074957326919">സിസ്റ്റം പ്രോക്സി ക്രമീകരണങ്ങള് ഉപയോഗിക്കുക</translation> <translation id="7775831859772431793">പ്രോക്സി സെർവറിന്റെ URL നിങ്ങൾക്ക് ഇവിടെ വ്യക്തമാക്കാനാകും. @@ -2383,6 +2363,10 @@ <translation id="8369602308428138533"> AC പവറിൽ പ്രവർത്തിക്കുമ്പോഴുള്ള സ്ക്രീൻ ഓഫ് കാലതാമസം</translation> <translation id="8382184662529825177">ഉപകരണത്തിനായുള്ള ഉള്ളടക്ക പരിരക്ഷയ്ക്ക് വിദൂര അറ്റസ്റ്റേഷന്റെ ഉപയോഗം പ്രവർത്തനക്ഷമമാക്കുക</translation> <translation id="838870586332499308">ഡാറ്റ റോമിംഗ് പ്രാപ്തമാക്കുക</translation> +<translation id="8390049129576938611"><ph name="PRODUCT_NAME" /> എന്നതിലെ ഇന്റേണൽ PDF വ്യൂവർ പ്രവർത്തനരഹിതമാക്കുന്നു. പകരം ഇതിനെ ഡൗൺലോഡായി കണക്കാക്കുകയും ഡിഫോൾട്ട് അപ്ലിക്കേഷൻ ഉപയോഗിച്ച് PDF ഫയലുകൾ തുറക്കാൻ ഉപയോക്താവിനെ അനുവദിക്കുകയും ചെയ്യുന്നു. + + ഈ നയം സജ്ജമാക്കാതെ വിടുകയോ പ്രവർത്തനരഹിതമാക്കുകയോ ആണെങ്കിൽ, ഉപയോക്താവ് PDF പ്ലഗിൻ പ്രവർത്തനരഹിതമാക്കിയില്ലെങ്കിൽ PDF ഫയലുകൾ തുറക്കാൻ അത് ഉപയോഗിക്കും.</translation> +<translation id="8402079500086185021">PDF ഫയലുകളെ എപ്പോഴും എക്സ്റ്റേണലായി തുറക്കുക</translation> <translation id="8412312801707973447">ഓൺലൈൻ OCSP/CRL ചെക്കുകൾ നടപ്പിലാക്കിയിട്ടുണ്ടോ</translation> <translation id="8413348101535146315"><ph name="PRODUCT_NAME" /> എന്നതിന്റെ ടാസ്ക് മാനേജറിൽ, പ്രോസസ്സുകൾ അവസാനിപ്പിക്കുന്നത് പ്രവർത്തനക്ഷമമാക്കുന്നു. @@ -2403,18 +2387,6 @@ ഉദാഹരണ പാറ്റേണുകൾക്കായി, https://www.chromium.org/developers/how-tos/chrome-frame-getting-started കാണുക.</translation> <translation id="8493645415242333585">ബ്രൌസര് ചരിത്രം സംരക്ഷിക്കുന്നത് അപ്രാപ്തമാക്കുക</translation> <translation id="8499172469244085141">സ്ഥിരസ്ഥിതി ക്രമീകരണങ്ങൾ (ഉപയോക്താക്കൾക്ക് അസാധുവാക്കാൻ കഴിയും)</translation> -<translation id="8501011084242226370"><ph name="PRODUCT_NAME" />-ൽ ഉപയോക്താവിന് പ്രവർത്തനക്ഷമമാക്കാവുന്നതോ പ്രവർത്തനരഹിതമാക്കാവുന്നതോ ആയ പ്ലഗിന്നുകളുടെ ഒരു ലിസ്റ്റ് വ്യക്തമാക്കുന്നു. - - - വൈൽഡ്കാർഡ് പ്രതീകങ്ങളായ '*', '?' എന്നിവ അനിയന്ത്രിതമായ പ്രതീകങ്ങളുടെ അനുക്രമങ്ങൾ പൊരുത്തപ്പെടുത്തുന്നതിന് ഉപയോഗിക്കാം. '?' എന്നത് ഒരൊറ്റ പ്രതീക ഓപ്ഷണലിനെ വ്യക്തമാക്കുമ്പോൾ '*' എന്നത് പ്രതീകങ്ങളുടെ അനിയന്ത്രിത നമ്പറുകളെ പൊരുത്തപ്പെടുത്തുന്നു, അതായത് പൂജ്യം അല്ലെങ്കിൽ ഒരു പ്രതീകം പൊരുത്തപ്പെടുത്തുന്നു. '\' എന്നത് എസ്കേപ്പ് പ്രതീകമായതിനാൽ യഥാർത്ഥമായ '*', '?' അല്ലെങ്കിൽ '\' പ്രതീകങ്ങൾ പൊരുത്തപ്പെടുത്താൻ, നിങ്ങൾക്ക് അവയ്ക്ക് മുമ്പിലായി ഒരു '\' ചേർക്കാം. - - നിങ്ങൾ ഈ ക്രമീകരണം പ്രവർത്തനക്ഷമമാക്കുകയാണെങ്കിൽ, വ്യക്തമാക്കിയ പ്ലഗ്ഗിന്നുകളുടെ ലിസ്റ്റ് <ph name="PRODUCT_NAME" />-ൽ ഉപയോഗിക്കാനാവും. പ്ലഗിൻ DisabledPlugins-ലെ ഒരു പാറ്റേൺ പൊരുത്തപ്പെടുത്തുന്നുവെങ്കിൽപ്പോലും ഉപയോക്താക്കൾക്ക് അവ 'about:plugins' എന്നതിൽ പ്രവർത്തനക്ഷമമാക്കാനോ പ്രവർത്തനരഹിതമാക്കാനോ കഴിയും. ഉപയോക്താക്കൾക്ക് DisabledPlugins, DisabledPluginsExceptions, EnabledPlugins എന്നിവയിലെ പാറ്റേണുകളുമായൊന്നും പൊരുത്തമില്ലാത്ത പ്ലഗിന്നുകൾ പ്രവർത്തനക്ഷമമാക്കാനും പ്രവർത്തനരഹിതമാക്കാനുമാകും. - - എല്ലാ പ്ലഗിന്നുകളും '*' പ്രവർത്തനരഹിതമാക്കുക് അല്ലെങ്കിൽ എല്ലാ Java പ്ലഗിന്നുകളും '*Java*' പ്രവർത്തനരഹിതമാക്കുക എന്നിവ പോലുള്ള വൈൽഡ്കാർഡ് എൻട്രികൾ അടങ്ങിയിരിക്കുന്ന 'DisabledPlugins' ലിസ്റ്റിൽ കൃത്യമായ പ്ലഗിൻ ബ്ലാക്ക്ലിസ്റ്റുചെയ്യലിനായി അനുവദിക്കാൻ ഉദ്ദേശിച്ചുള്ളതാണ് ഈ നയമെങ്കിലും, അഡ്മിനിസ്ട്രേറ്റർ 'IcedTea Java 2.3' പോലുള്ള ചില പ്രത്യേക പതിപ്പ് പ്രവർത്തനക്ഷമമാക്കാൻ താൽപ്പര്യപ്പെടുന്നു. ഈ നയത്തിൽ ഈ പ്രത്യേക പതിപ്പുകൾ വ്യക്തമാക്കിയിരിക്കുന്നു. - - പ്ലഗിൻ പേരും പ്ലഗിൻ ഗ്രൂപ്പിന്റെ പേരും ഒഴിവാക്കേണ്ടതുണ്ടെന്ന കാര്യം ശ്രദ്ധിക്കുക. ഓരോ പ്ലഗിൻ ഗ്രൂപ്പും about:plugins-ലെ വ്യത്യസ്ത വിഭാഗത്തിൽ ദൃശ്യമാക്കിയിരിക്കുന്നു; ഓരോ വിഭാഗത്തിലും ഒന്നോ അതിലധികമോ പ്ലഗിനുകൾ ഉണ്ടാകും. ഉദാഹരണത്തിന്, "Shockwave Flash" എന്നത് "Adobe Flash Player" ഗ്രൂപ്പിന്റെ ഭാഗമാണ്, ബ്ലാക്ക്ലിസ്റ്റിൽ നിന്നും പ്ലഗിൻ ഒഴിവാക്കേണ്ടതുണ്ടെങ്കിൽ രണ്ടുപേരുകൾക്കും ഒഴിവാക്കലുകളുടെ ലിസ്റ്റിൽ ഒരു പൊരുത്തമുണ്ടായിരിക്കണം. - - ഈ നയം സജ്ജീകരിക്കാതെ വിടുകയാണെങ്കിൽ, 'DisabledPlugins' എന്നതിലെ പാറ്റേണുകളുമായി പൊരുത്തപ്പെടുന്ന ഏതൊരു പ്ലഗിന്നും ലോക്കുചെയ്ത് പ്രവർത്തനരഹിതമാകും, അവ ഉപയോക്താവിന് പ്രവർത്തനക്ഷമമാക്കാനാകില്ല.</translation> <translation id="8519264904050090490">നിയന്ത്രിത ഉപയോക്തൃ മാനുവൽ ഒഴിവാക്കൽ URL-കൾ</translation> <translation id="8544375438507658205"><ph name="PRODUCT_FRAME_NAME" />-നായുള്ള സ്ഥിരസ്ഥിതി HTML റെന്ഡറര്</translation> <translation id="8549772397068118889">ഉള്ളടക്ക പാക്കുകളുടെ പുറത്തുള്ള സൈറ്റുകൾ സന്ദർശിക്കുമ്പോൾ മുന്നറിയിപ്പ് നൽകുക</translation> @@ -2453,15 +2425,6 @@ ഒന്നിലേറെ സെർവർ പേരുകൾ കോമ ഉപയോഗിച്ച് വേർതിരിക്കുക. വൈൽഡ്കാർഡുകൾ (*) അനുവദനീയമാണ്. നിങ്ങൾ ഈ നയം സജ്ജമാക്കാതെ വിട്ടാൽ, ഇൻട്രാനെറ്റിൽ ഒരു സെർവർ ഉണ്ടെങ്കിൽ <ph name="PRODUCT_NAME" /> അത് കണ്ടെത്താൻ ശ്രമിക്കും, അതിനുശേഷം മാത്രമേ IWA അഭ്യർത്ഥനകൾക്ക് പ്രതികരണം നൽകുകയുള്ളൂ. ഇന്റർനെറ്റായി ഒരു സെർവർ കണ്ടെത്തുകയാണെങ്കിൽ, അതിൽ നിന്നുള്ള IWA അഭ്യർത്ഥനകൾ <ph name="PRODUCT_NAME" /> അവഗണിക്കും.</translation> -<translation id="8668394701842594241"><ph name="PRODUCT_NAME" /> എന്നതിൽ പ്രാപ്തമാക്കിയ പ്ലഗിനുകളുടെ ഒരു ലിസ്റ്റ് വ്യക്തമാക്കുന്നു, ഒപ്പം ഉപയോക്താക്കളെ ഈ ക്രമീകരണം മാറ്റുന്നതിൽ നിന്നും തടയുകയും ചെയ്യുന്നു. - - വൈൽഡ് കാർഡ് പ്രതീകങ്ങളായ '*', '?' എന്നിവ ആർബിട്രറി പ്രതീകങ്ങളുടെ ശ്രേണികളെ തുല്യമാക്കുന്നതിനായി ഉപയോഗിച്ചേക്കാം. ഒരു ഓപ്ഷണൽ ഏക പ്രതീകത്തെ '?' വ്യക്തമാക്കുമ്പോൾ പ്രതീകങ്ങളുടെ ഒരു ആർബിട്രറി നമ്പറിനെ '*' തുല്യമാക്കുന്നു, അതായത് പൂജ്യമോ ഒന്നോ പ്രതീകങ്ങളുമായി തുല്യമാക്കുന്നു. എസ്ക്കേപ്പ് പ്രതീകമാണ് '\', അതുകൊണ്ട് '*', '?', അല്ലെങ്കിൽ '\' തുടങ്ങിയ ശരിക്കുള്ള പ്രതീകങ്ങൾക്ക് തുല്യമാക്കാൻ അവയ്ക്ക് മുന്നിൽ ഒരു '\' ഇട്ടാൽ മതി. - - പ്ലഗിനുകളുടെ വ്യക്തമാക്കിയ ലിസ്റ്റ് അവ ഇൻസ്റ്റാൾ ചെയ്തിട്ടുണ്ടെങ്കിൽ എല്ലായ്പ്പോഴും <ph name="PRODUCT_NAME" /> എന്നതിൽ ഉപയോഗിക്കും. പ്ലഗിനുകളെ 'about:plugins'-ൽ പ്രാപ്തമാക്കിയതായി അടയാളപ്പെടുത്തിയിരിക്കുന്നതിനാൽ ഉപയോക്താക്കൾക്ക് അവയെ അപ്രാപ്തമാക്കാൻ കഴിയില്ല. - - ഈ നയം DisabledPlugins, DisabledPluginsExceptions എന്നിവയെ അസാധുവാക്കുമെന്ന കാര്യം ശ്രദ്ധിക്കുക. - - ഈ നയം സജ്ജീകരിക്കാത്ത നിലയിലാണെങ്കിൽ ഉപയോക്താവിന് സിസ്റ്റത്തിൽ ഇൻസ്റ്റാൾ ചെയ്തിരിക്കുന്ന ഏതൊരു പ്ലഗിനും അപ്രാപ്തമാക്കാൻ കഴിയുന്നതാണ്.</translation> <translation id="8672321184841719703">ടാർഗെറ്റ് യാന്ത്രിക അപ്ഡേറ്റ് പതിപ്പ്</translation> <translation id="868068801094828689">അജ്ഞാതമായി ഉപയോഗം റിപ്പോർട്ടുചെയ്യൽ പ്രവർത്തനക്ഷമമാക്കിക്കൊണ്ട് Google-ലേക്ക് <ph name="PRODUCT_NAME" /> എന്നതിനെക്കുറിച്ചുള്ള ക്രാഷ് അനുബന്ധ വിവരം അയയ്ക്കുന്നു ഒപ്പം ഈ ക്രമീകരണം മാറ്റുന്നതിൽ നിന്ന് ഉപയോക്താക്കളെ തടയുകയും ചെയ്യുന്നു. @@ -2569,13 +2532,6 @@ ഫയലുകൾ ലഭ്യമാണെങ്കിൽ അവ ഡൗൺലോഡുചെയ്ത്, ഉപകരണത്തിൽ സംഭരിക്കുകയും ചെയ്യും. ഉദാഹരണത്തിന് അത്തരം ഫയലുകൾ, അറ്റാച്ചുചെയ്തിരിക്കുന്ന മോണിറ്ററുകളുടെ ഡിസ്പ്ലേ നിലവാരം മെച്ചപ്പെടുത്താൻ ഉപയോഗിക്കാം.</translation> -<translation id="8905426178924715309">ഈ നയം ഒഴിവാക്കിയിരിക്കുന്നു, പകരം ForceGoogleSafeSearch, ForceYouTubeSafetyMode എന്നിവ ഉപയോഗിക്കുക. ForceGoogleSafeSearch അല്ലെങ്കിൽ ForceYouTubeSafetyMode നയങ്ങൾ സജ്ജമാക്കുകയാണെങ്കിൽ, ഈ നയം അവഗണിക്കപ്പെടും - - Google വെബ് തിരയലിലെ SafeSearch ഉപയോഗിച്ച് ചെയ്യേണ്ട തിരയൽ ചോദ്യങ്ങളെ നിർബന്ധമായി സജീവമാക്കുകയും ഉപയോക്താക്കൾ ഈ ക്രമീകരണം മാറ്റുന്നത് തടയുകയും ചെയ്യുന്നു. ഈ ക്രമീകരണം YouTube-ലെ സുരക്ഷാമോഡിനേയും ഫോഴ്സുചെയ്യുന്നു. - - ഈ ക്രമീകരണം പ്രവർത്തനക്ഷമമാക്കിയാൽ, Google തിരയലിലെയും YouTube-ലെയും SafeSearch എല്ലായ്പ്പോഴും സജീവമായിരിക്കും. - - ക്രമീകരണം പ്രവർത്തനരഹിതമാക്കുകയാണെങ്കിലോ ഒരു മൂല്യം സജ്ജമാക്കിയില്ലെങ്കിലോ, Google തിരയലിലെയും YouTube-ലെയും SafeSearch പ്രവർത്തിക്കുന്നതല്ല.</translation> <translation id="8906768759089290519">അതിഥി മോഡ് പ്രാപ്തമാക്കുക</translation> <translation id="8908294717014659003">മീഡിയ ക്യാപ്ചർ ഉപകരണങ്ങളിലേക്ക് വെബ്സൈറ്റുകൾക്ക് ആക്സസ്സ് അനുവദിക്കണമെന്നോയെന്നത് സജ്ജമാക്കാൻ നിങ്ങളെ അനുവദിക്കുന്നു. മീഡിയ ക്യാപ്ചർ ഉപകരണങ്ങളിലേക്കുള്ള ആക്സസ്സ് സ്ഥിരസ്ഥിതിയായി അനുവദിക്കാം അല്ലെങ്കിൽ ഒരു വെബ്സൈറ്റിന് മീഡിയ ക്യാപ്ചർ ഉപകരണങ്ങളിലേക്ക് ആക്സസ്സ് ആവശ്യമുള്ളപ്പോഴെല്ലാം ഉപയോക്താവിനോട് ആവശ്യപ്പെടാം.
diff --git a/components/policy/resources/policy_templates_mr.xtb b/components/policy/resources/policy_templates_mr.xtb index 0741ed62..0c463a07 100644 --- a/components/policy/resources/policy_templates_mr.xtb +++ b/components/policy/resources/policy_templates_mr.xtb
@@ -201,16 +201,6 @@ हे धोरण कॉन्फिगर न केल्यास किंवा ते "tls1.2" वर सेट केल्यास <ph name="PRODUCT_NAME" /> हे फॉलबॅक करणार नाही. लक्षात ठेवा हे जुन्या TLS आवृत्त्यांसाठी समर्थन अक्षम करीत नाही, हे केवळ <ph name="PRODUCT_NAME" /> आवृत्त्यांशी अचूकपणे निगोशिएट करू शकत नसलेल्या दोष असलेल्या सर्व्हरवर कार्य करेल. अन्यथा, दोष असलेल्या सर्व्हरसह सुसंगतता राखून ठेवल्यास, हे धोरण "tls1.1" वर सेट केले जाऊ शकते. ही तात्पुरती उपाययोजना आहे आणि सर्व्हरचे जलदगतीने निराकरण केले जावे.</translation> -<translation id="1861037019115362154"><ph name="PRODUCT_NAME" /> मध्ये अक्षम केलेल्या प्लगिनची सूची निर्दिष्ट करते आणि वापरकर्त्यांना हे सेटिंग बदलण्यास प्रतिबंधित करते. - - - वाइल्डकार्ड वर्ण '*' आणि '?' कोणत्याही प्रकारे येणार्या वर्णांचा क्रम जुळवण्यासाठी वापरता येऊ शकतील. '*' वर्णाची कोणत्याही प्रकारे येणारी संख्या जुळवते तर '?' एक पर्यायी एकल वर्ण निर्दिष्ट करते अर्थात शून्य किंवा एक वर्ण जुळवते. एस्केप वर्ण '\' आहे, त्यामुळे वास्तविक '*', '?' किंवा '\' वर्ण जुळवण्यासाठी, आपण त्यांच्यासमोर '\' लावू शकता. - - आपण ही सेटिंग सक्षम केल्यास, प्लगिनची निर्दिष्ट केलेली सूची <ph name="PRODUCT_NAME" /> मध्ये कधीही वापरली जात नाही. 'about:plugins' मध्ये प्लगिन अक्षम म्हणून चिन्हांकित करण्यात येतात आणि वापरकर्ते ते सक्षम करु शकत नाहीत. - - लक्षात ठेवा की हे धोरण सक्षम केलेल्या प्लगिन आणि अक्षम केलेले प्लगिन अपवाद यांनी अधिलिखित करता येऊ शकते. - - हे धोरण सेट केले नसल्यास, हार्ड-कोड असलेली विसंगत, कालबाह्य किंवा घातक प्लगइनसोडून वापरकर्ता सिस्टमवर स्थापित केलेली कोणतीही प्लगिन वापरु शकतो.</translation> <translation id="1864269674877167562">हे धोरण रिक्त स्ट्रिंगवर सेट केले असल्यास किंवा कॉन्फिगर केले नसल्यास, वापरकर्ता साइन-इन प्रवाह दरम्यान <ph name="PRODUCT_OS_NAME" /> स्वयंपूर्ण पर्याय दर्शविणार नाही. डोमेन नावाचे प्रतिनिधित्व करणार्या स्ट्रिंगवर हे धोरण सेट केले असल्यास, <ph name="PRODUCT_OS_NAME" /> वापरकर्त्यास केवळ त्याचे वापरकर्तानाव डोमेन नाव विस्ताराशिवाय टाइप करण्याची अनुमती देऊन वापरकर्ता साइन इन दरम्यान स्वयंपूर्ण पर्याय दर्शवेल. वापरकर्ता हा डोमेन नाव विस्तार अधिलिखित करण्यात सक्षम असेल.</translation> <translation id="1865417998205858223">की परवानग्या</translation> @@ -847,11 +837,6 @@ <translation id="3660562134618097814">लॉगिनच्या दरम्यान SAML IdP कुकीज हस्तांतरित करा</translation> <translation id="3709266154059827597">विस्तार स्थापना काळीसूची कॉन्फिगर करा</translation> <translation id="3711895659073496551">निलंबन</translation> -<translation id="3715448429089775791">YouTube सुरक्षा मोड सक्रिय करण्याची सक्ती करते आणि वापरकर्त्यांना या सेटिंग्ज बदलण्यापासून प्रतिबंधित करते. - - आपण ही सेटिंग सक्षम केल्यास, YouTube वरील सुरक्षा मोड नेहमी चालू असते. - - आपण ही सेटिंग अक्षम केल्यास किंवा एखादे मूल्य सेट न केल्यास, YouTube वर सुरक्षा मोड वर लागू केले जात नाही.</translation> <translation id="3750220015372671395">या साइटवर की निर्मिती अवरोधित करा</translation> <translation id="3756011779061588474">विकसक मोड अवरोधित करा</translation> <translation id="3758089716224084329"><ph name="PRODUCT_NAME" /> कडून वापरण्यात येणारे प्रॉक्सी सर्व्हर निर्दिष्ट करण्याची आपल्याला अनुमती देते आणि प्रॉक्सी सेटिंग्ज बदलण्यापासून वापरकर्त्यांना प्रतिबंधित करते. @@ -2087,9 +2072,6 @@ मान्य कनेक्शन प्रकार अभिज्ञापक "ethernet", "wifi", "wimax", "bluetooth" आणि "cellular" हे आहेत.</translation> <translation id="7763614521440615342">नवीन टॅब पृष्ठावर सामग्री सूचना दर्शवा</translation> -<translation id="7766336524667238790">अनुप्रयोग ID आणि आवृत्ती यासारख्या सक्रिय कियॉस्क सत्राविषयी माहितीचा अहवाल द्या. - -हे धोरण असत्य वर सेट केल्यास, सत्र माहितीचा अहवाल दिला जाणार नाही. सत्य वर सेट केल्यास किंवा अनसेट केलेला ठेवल्यास, सत्र माहितीचा अहवाल दिला जाईल.</translation> <translation id="7774768074957326919">सिस्टम प्रॉक्सी सेटिंग्ज वापरा</translation> <translation id="7775831859772431793">आपण येथे प्रॉक्सी सर्व्हरची URL निर्दिष्ट करु शकता. @@ -2317,6 +2299,10 @@ <translation id="8369602308428138533">AC उर्जेवर चालताना स्क्रीन बंद विलंब</translation> <translation id="8382184662529825177">डिव्हाइसच्या सामग्री संरक्षणासाठी दूरस्थ अनुप्रमाणनाचा वापर सक्षम करा</translation> <translation id="838870586332499308">डेटा रोमिंग सक्षम करा</translation> +<translation id="8390049129576938611"><ph name="PRODUCT_NAME" /> मध्ये अंतर्गत PDF दर्शक अक्षम करते. त्याऐवजी ते डाउनलोड म्हणून त्यास हाताळते आणि वापरकर्त्यास PDF फायली डीफॉल्ट अनुप्रयोगासह उघडण्याची अनुमती देते. + + हे धोरण सेट न केलेले ठेवल्यास किंवा अक्षम केल्यास वापरकर्ता PDF प्लगिन अक्षम करेपर्यंत PDF फायली उघडण्यासाठी ते वापरले जाईल.</translation> +<translation id="8402079500086185021">PDF फायली नेहमी बाह्यरित्या उघडा</translation> <translation id="8412312801707973447">ऑनलाइन OCSP/CRL तपासण्या पूर्ण केल्या आहेत किंवा नाहीत</translation> <translation id="8413348101535146315"><ph name="PRODUCT_NAME" /> च्या कार्य व्यवस्थापकामध्ये प्रक्रिया समाप्त करण्यात सक्षम करते. @@ -2337,19 +2323,6 @@ उदाहरणादाखल नमुन्यांसाठी हे पहा http://www.chromium.org/developers/how-tos/chrome-frame-getting-started.</translation> <translation id="8493645415242333585">ब्राउझर इतिहास जतन करणे अक्षम करा</translation> <translation id="8499172469244085141">डीफॉल्ट सेटिंग्ज (वापरकर्ते अधिलिखित करू शकतात)</translation> -<translation id="8501011084242226370"><ph name="PRODUCT_NAME" /> मध्ये वापरकर्ता सक्षम किंवा अक्षम करू शकतो अशा प्लगिनची सूची निर्दिष्ट करते. - - '*' आणि '?' हे वाइल्डकार्ड वर्ण यादृच्छिक वर्णांचे अनुक्रम जुळवण्यासाठी वापरले जाऊ शकत नाहीत. '*' वर्णांच्या यादृच्छिक संख्येशी जुळत असेल तर '?' पर्यायी एकल वर्ण निर्दिष्ट करतो, उदा. शून्य किंवा एक वर्ण जुळणे. escape वर्ण '\' आहे, म्हणून प्रत्यक्ष '*', '?', किंवा '\' वर्ण जुळवण्यासाठी, आपण त्यांच्यासमोर एक '\' ठेवू शकता. - - आपण हे सेटिंग अक्षम केल्यास, प्लगिनची निर्दिष्ट केलेली सूची <ph name="PRODUCT_NAME" /> मध्ये वापरली जाऊ शकते. जरी प्लगिन DisabledPlugins मधील नमुन्याशी देखील जुळत असले, तरीही वापरकर्ते ते 'about:plugins' मध्ये सक्षम किंवा अक्षम करू शकतात. वापरकर्ते -DisabledPlugins, DisabledPluginsExceptions आणि EnabledPlugins मधील कोणत्याही नमुन्यांशी न जुळणारे प्लगिन सक्षम आणि अक्षम देखील करू शकतात. - - या धोरणाचा अर्थ 'DisabledPlugins' सूचीमध्ये वाइल्डकार्ड केलेल्या सर्व प्लगिन '*' अक्षम करणे किंवा सर्व Java प्लगिन '*Java*' अक्षम करणे यासारख्या प्रविष्ट्या असतात तिथे कठोर प्लगिन काळ्यासूचीमध्ये टाकण्यास अनुमती देणे असा आहे परंतु प्रशासक 'IcedTea Java 2.3' सारख्या काही विशिष्ट आवृत्ती सक्षम करू इच्छितात. या विशिष्ट आवृत्त्या या धोरणात निर्दिष्ट केल्या जाऊ शकतात. - - प्लगिन नाव आणि प्लगिन च्या गटाचे नाव या दोघांना सूट दिली जावी हे लक्षात ठेवा. प्रत्येक प्लगिन गट about:plugins च्या एका स्वतंत्र विभागात दर्शविला जातो; प्रत्येकगटास एक किंवा अधिक प्लगिन असू शकतात. उदाहरणार्थ, "Shockwave Flash" प्लगिन -"Adobe Flash Player" च्या मालकीचे असतात आणि त्या प्लगिनला काळ्यासूचीमधून सूट द्यावयाची असल्यास दोन्ही नावांमध्ये अपवाद सूचीमधील जुळणी असणे आवश्यक आहे. - - हे धोरण 'DisabledPlugins' मधील नमुन्यांशी जुळणारे कोणतेही प्लगिन सेट न करता सोडल्यास ते लॉक करून अक्षम केले जाईल आणि ते सक्षम करण्यात वापरकर्ता सक्षम होणार नाही.</translation> <translation id="8519264904050090490">व्यवस्थापित केलेला वापरकर्ता व्यक्तिचलित अपवाद URL</translation> <translation id="8544375438507658205"><ph name="PRODUCT_FRAME_NAME" /> साठी डीफॉल्ट HTML प्रस्तुतकर्ता</translation> <translation id="8549772397068118889">सामग्री पॅक बाहेरील साइटना भेट देताना चेतावणी द्या</translation> @@ -2380,10 +2353,6 @@ स्वल्पविरामांसह एकाधिक सर्व्हर नावे विभक्त करा. वाइल्डकार्ड (*) अनुमत आहेत. आपण हे धोरण सेट न करता सोडल्यास सर्व्हर इंटरनेटवर असताना <ph name="PRODUCT_NAME" /> ते शोधण्याचा प्रयत्न करेल आणि त्यानंतर फक्त IWA विनंत्यांना ते प्रतिसाद देईल. सर्व्हर इंटरनेट म्हणून शोधले गेल्यास त्यानंतर त्यावरील IWA विनंत्यांकडे <ph name="PRODUCT_NAME" /> द्वारे दुर्लक्ष केले जाईल.</translation> -<translation id="8668394701842594241"><ph name="PRODUCT_NAME" /> मध्ये सक्षम केलेल्या प्लगिनची सूची निर्दिष्ट करते आणि हे सेटिंग बदलण्यास वापरकर्त्यांना प्रतिबंधित करते. -वाइल्डकार्ड वर्ण '*' आणि '?' कोणत्याही प्रकारे येणार्या वर्णांचा क्रम जुळवण्यासाठी वापरले जाऊ शकते. '*' हे वर्णाची कोणत्याही प्रकारे येणारी संख्या जुळवते तर '?' वैकल्पिक एकल वर्ण निर्दिष्ट करते म्हणजेच शून्य किंवा एक वर्ण जुळवते. एस्केप वर्ण '\' आहे, त्यामुळे वास्तविक '*', '?', किंवा '\' वर्ण जुळवण्यासाठी, आपण त्यांच्यापुढे '\' लावू शकता. -प्लगिन्सची निर्दिष्ट सूची ते जर स्थापित केले असेल तर नेहमीच <ph name="PRODUCT_NAME" /> मध्ये वापरण्यात येते. प्लगिन 'प्लगिन:बद्दल' मध्ये सक्षम केल्याप्रमाणे चिन्हांकित करण्यात येतात आणि वापरकर्ते त्यांना अक्षम करु शकत नाहीत. -लक्षात घ्या की हे धोरण अक्षम प्लगिन आणि अक्षम प्लगिन अपवाद दोन्ही अधिलिखित करते. हे धोरण सेट न करण्यासाठी सोडल्यास वापरकर्ता सिस्टमवर स्थापित केलेले कोणतेही प्लगिन अक्षम करू शकतो.</translation> <translation id="8672321184841719703">लक्ष्य स्वयं अद्यतन आवृत्ती</translation> <translation id="868068801094828689">वापराचा अनामित अहवाल देणे आणि <ph name="PRODUCT_NAME" /> विषयी क्रॅश-संबंधित डेटा Google कडे पाठविणे सक्षम करते आणि वापरकर्त्यांना हे सेटिंग बदलण्यापासून प्रतिबंधित करते. @@ -2488,13 +2457,6 @@ स्वयंचलितपणे Quirks सर्व्हरशी संपर्क साधेल आणि उपलब्ध असल्यास कॉन्फिगरेशन फायली डाउनलोड करेल आणि त्या डिव्हाइसवर संचयित करेल. अशा फायली उदाहरणार्थ संलग्न केलेल्या मॉनिटरची प्रदर्शन गुणवत्ता सुधारित करण्यासाठी वापरल्या जाऊ शकतात.</translation> -<translation id="8905426178924715309">हे धोरण बहिष्कृत केले आहे, कृपया त्याऐवजी ForceGoogleSafeSearch आणि ForceYouTubeSafetyMode चा वापर करा. ForceGoogleSafeSearch किंवा ForceYouTubeSafetyMode धोरण यापैकी एक सेट केले असल्यास, या धोरणाकडे दुर्लक्ष केले जाईल. - - सक्रिय वर सेट केलेल्या सुरक्षितशोधसह Google वेब शोध मधील क्वेरी पूर्ण करण्यासाठी सक्ती करते आणि हे सेटिंग बदलण्यापासून वापरकर्त्यांना प्रतिबंधित करते. हे सेटिंग YouTube वरील सुरक्षितता मोडला देखील सक्ती करते. - - आपण हे सेटिंग सक्षम केल्यास, Google शोध आणि YouTube मधील सुरक्षितशोध नेहमी सक्रिय असतो. - - आपण हे सेटिंग अक्षम केल्यास किंवा मूल्य सेट न केल्यास, Google शोध आणि YouTube मधील सुरक्षितशोधाची अंमलबजावणी केली जात नाही.</translation> <translation id="8906768759089290519">अतिथी मोड सक्षम करा</translation> <translation id="8908294717014659003">वेबसाइट्सना माध्यम कॅप्चर डिव्हाइसेससमध्ये प्रवेश करण्याच्या अनुमती देण्याबाबत आपल्याला सेट करण्याची अनुमती देते. माध्यम कॅप्चर डिव्हाइसेसमध्ये प्रवेश करणे डीफॉल्टनुसार अनुमती दिली जाऊ शकते किंवा दरवेळी वेबसाइट माध्यम कॅप्चर डिव्हाइसेसमध्ये प्रवेश करू इच्छित असताना वापरकर्त्यास दर वेळी विचाले जाऊ शकते.
diff --git a/components/policy/resources/policy_templates_ms.xtb b/components/policy/resources/policy_templates_ms.xtb index 1a80083..e75bf4b 100644 --- a/components/policy/resources/policy_templates_ms.xtb +++ b/components/policy/resources/policy_templates_ms.xtb
@@ -214,15 +214,6 @@ Jika dasar ini tidak dikonfigurasikan atau jika ditetapkan kepada "tls1.2" maka <ph name="PRODUCT_NAME" /> tidak lagi akan melaksanakan jatuh balik ini. Perhatian, langkah 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 hanyalah 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. - - Jika anda mendayakan tetapan ini, senarai pemalam yang ditentukan tidak akan digunakan dalam <ph name="PRODUCT_NAME" />. Pemalam ditandakan sebagai dilumpuhkan dalam 'about:plugins' dan pengguna tidak boleh mendayakannya. - - Ambil perhatian bahawa dasar ini boleh diatasi oleh EnabledPlugins dan DisabledPluginsExceptions. - - Jika dasar ini dibiarkan tanpa ditetapkan, pengguna boleh menggunakan mana-mana pemalam yang dipasang pada sistem kecuali pemalam tidak serasi yang berkod keras, sudah lapuk atau berbahaya.</translation> <translation id="1864269674877167562">Jika dasar ini ditetapkan kepada rentetan kosong atau tidak dikonfigurasikan, <ph name="PRODUCT_OS_NAME" /> tidak akan memaparkan pilihan autolengkap semasa aliran log masuk pengguna. Jika dasar ini ditetapkan kepada rentetan yang mewakili nama domain, <ph name="PRODUCT_OS_NAME" /> akan memaparkan pilihan autolengkap semasa log masuk pengguna yang membolehkan pengguna menaip nama pengguna mereka sahaja tanpa sambungan nama domain. Pengguna boleh menulis ganti sambungan nama domain ini.</translation> <translation id="1865417998205858223">Kebenaran Utama</translation> @@ -864,11 +855,6 @@ <translation id="3660562134618097814">Pindahkan kuki IdP SAML semasa log masuk</translation> <translation id="3709266154059827597">Konfigurasi senarai hitam pemasangan sambungan</translation> <translation id="3711895659073496551">Gantung</translation> -<translation id="3715448429089775791">Memaksa Mod Keselamatan YouTube diaktifkan dan menghalang pengguna daripada menukar tetapan ini. - - Jika anda mendayakan tetapan ini, Mod Keselamatan di YouTube sentiasa diaktifkan. - - Jika anda melumpuhkan tetapan ini atau tidak menetapkan nilai, Mod Keselamatan di YouTube tidak dikuatkuasakan.</translation> <translation id="3750220015372671395">Sekat penghasilan kunci pada tapak ini</translation> <translation id="3756011779061588474">Sekat mod pembangun</translation> <translation id="3758089716224084329">Membenarkan anda menetapkan pelayan proksi yang digunakan oleh <ph name="PRODUCT_NAME" /> dan menghalang pengguna daripada menukar tetapan proksi. @@ -2135,12 +2121,6 @@ Pengecam jenis sambungan yang diperakui ialah "ethernet", "wifi", "wimax", "bluetooth" dan "selular".</translation> <translation id="7763614521440615342">Tunjukkan cadangan kandungan pada halaman Tab Baharu</translation> -<translation id="7766336524667238790">Laporkan maklumat tentang sesi kios yang aktif, seperti ID - dan versi aplikasi. - - Jika dasar ini ditetapkan kepada palsu, maklumat sesi tidak - akan dilaporkan. Jika ditetapkan kepada benar atau dibiarkan - tanpa ditetapkan, maklumat sesi akan dilaporkan.</translation> <translation id="7774768074957326919">Gunakan tetapan sistem proksi</translation> <translation id="7775831859772431793">Anda boleh menetapkan URL pelayan proksi di sini. @@ -2379,6 +2359,10 @@ <translation id="8369602308428138533">Kelewatan pemadaman skrin apabila dijalankan dengan kuasa AC</translation> <translation id="8382184662529825177">Dayakan penggunaan pembuktian jauh untuk perlindungan kandungan bagi peranti</translation> <translation id="838870586332499308">Dayakan perayauan data</translation> +<translation id="8390049129576938611">Melumpuhkan pemapar PDF dalam <ph name="PRODUCT_NAME" />. Sebaliknya, dasar ini menganggapnya sebagai muat turun dan membenarkan pengguna untuk membuka fail PDF dengan aplikasi lalai. + + Jika dasar ini dibiarkan tanpa ditetapkan atau dilumpuhkan, pemalam PDF akan digunakan untuk membuka fail PDF melainkan pengguna melumpuhkannya.</translation> +<translation id="8402079500086185021">Sentiasa buka fail PDF dari luar</translation> <translation id="8412312801707973447">Sama ada semakan OCSP/CRL dalam talian dilaksanakan</translation> <translation id="8413348101535146315">Membolehkan penamatan proses dalam Pengurus Tugas <ph name="PRODUCT_NAME" />. @@ -2399,17 +2383,6 @@ Untuk melihat contoh pola, lihat http://www.chromium.org/developers/how-tos/chrome-frame-getting-started.</translation> <translation id="8493645415242333585">Lumpuhkan penyimpanan sejarah penyemakan imbas</translation> <translation id="8499172469244085141">Tetapan lalai (pengguna boleh mengatasi)</translation> -<translation id="8501011084242226370">Menyatakan senarai pemalam yang boleh didayakan atau dilumpuhkan oleh pengguna dalam <ph name="PRODUCT_NAME" />. - -Aksara kad bebas '*' dan '?' boleh digunakan untuk memadankan urutan aksara arbitrari. '*' memadankan aksara nombor arbitrari manakala '?' menyatakan aksara tunggal pilihan, cth. memadankan kosong atau satu aksara. Aksara lepasan ialah '\', jadi untuk memadankan aksara '*', '?' atau '\' sebenar, anda boleh meletakkan '\' di hadapan aksara itu. - -Jika anda mendayakan tetapan ini, senarai pemalam yang dinyatakan boleh digunakan dalam <ph name="PRODUCT_NAME" />. Pengguna boleh mendayakan atau melumpuhkan pemalam, dalam 'about:plugins', walaupun jika pemalam juga sepadan dengan corak dalam DisabledPlugins. Pengguna juga boleh mendayakan dan melumpuhkan pemalam yang tidak sepadan dengan sebarang corak dalam DisabledPlugins, DisabledPluginsExceptions dan EnabledPlugins. - -Dasar ini bertujuan untuk membenarkan penyenaraian hitam pemalam secara tegas dengan senarai 'DisabledPlugins' mengandungi entri kad bebas seperti lumpuhkan semua pemalam '*' atau lumpuhkan semua pemalam Java'*Java*' tetapi pentadbir ingin mendayakan beberapa versi tertentu seperti 'IcedTea Java 2.3'. Versi tertentu ini boleh dinyatakan dalam dasar ini. - -Sila maklum bahawa kedua-dua nama pemalam dam nama kumpulan pemalam perlu dikecualikan. Setiap kumpulan pemalam ditunjukkan dalam bahagian berasingan dalam about:plugins; setiap bahagian mungkin mempunyai satu atau lebih pemalam. Sebagai contoh, pemalam "Shockwave Flash" adalah dalam kumpulam "Adobe Flash Player" dan kedua-dua nama mesti mempunyai padanan dalam senarai pengecualian jika pemalam itu ingin dikecualikan dari senarai hitam. - -Jika dasar ini dibiarkan tidak ditetapkan mana-mana pemalam yang sepadan dengan corak dalam 'DisabledPlugins' akan dikunci dan dilumpuhkan serta pengguna tidak akan dapat mendayakan pemalam itu.</translation> <translation id="8519264904050090490">URL pengecualian manual pengguna terurus</translation> <translation id="8544375438507658205">Pemapar HTML lalai untuk <ph name="PRODUCT_FRAME_NAME" /></translation> <translation id="8549772397068118889">Beri amaran apabila melawat tapak web di luar pek kandungan</translation> @@ -2446,15 +2419,6 @@ Jika anda membiarkan dasar ini tanpa ditetapkan <ph name="PRODUCT_NAME" /> akan cuba mengesan jika pelayan berada di Intranet dan hanya selepas itu permintaan IWA akan dibalas. Jika pelayan dikesan sebagai Internet, maka permintaan IWA daripadanya akan diabaikan oleh <ph name="PRODUCT_NAME" />.</translation> -<translation id="8668394701842594241">Menentukan senarai pemalam yang didayakan dalam <ph name="PRODUCT_NAME" /> dan menghalang pengguna daripada menukar tetapan ini. - - Aksara kad bebas '*' dan '?' boleh digunakan untuk memadankan urutan aksara rambang. Aksara '*' sepadan dengan sebilangan aksara rambang manakala '?' menetapkan aksara tunggal pilihan, iaitu sepadan dengan sifar atau satu aksara. Aksara lepasan ialah '\', oleh itu untuk memadankan aksara '*', '?' atau '\' sebenar, anda boleh meletakkan '\' di hadapan aksara tersebut. - - Senarai pemalam yang ditetapkan sentiasa digunakan dalam <ph name="PRODUCT_NAME" /> jika ia dipasang. Pemalam ditandakan sebagai didayakan dalam 'about:plugins' dan pengguna tidak boleh melumpuhkannya. - - Ambil perhatian bahawa dasar ini mengatasi DisabledPlugins dan juga DisabledPluginsExceptions. - - Jika dasar ini dibiarkan tanpa ditetapkan, pengguna boleh melumpuhkan sebarang pemalam yang dipasang pada sistem.</translation> <translation id="8672321184841719703">Versi Kemas Kini Auto Sasaran</translation> <translation id="868068801094828689">Mendayakan laporan penggunaan dan data berkaitan ranap tanpa nama tentang <ph name="PRODUCT_NAME" /> kepada Google dan menghalang pengguna daripada menukar tetapan ini. @@ -2562,13 +2526,6 @@ menghubungi Pelayan Quirks secara automatik dan memuat turun fail konfigurasi, jika ada dan menyimpannya pada peranti. Fail sedemikian boleh digunakan untuk meningkatkan kualiti paparan monitor yang dipasang, sebagai contoh.</translation> -<translation id="8905426178924715309">Dasar ini ditamatkan, sebaliknya sila gunakan ForceGoogleSafeSearch dan ForceYouTubeSafetyMode. Dasar ini akan diabaikan jika dasar ForceGoogleSafeSearch atau ForceYouTubeSafetyMode ditetapkan. - - Memaksa pertanyaan dalam Carian Web Google dilakukan dengan SafeSearch ditetapkan kepada aktif dan menghalang pengguna daripada mengubah tetapan ini. Tetapan ini turut memaksa Mod Keselamatan di YouTube. - - Jika anda mendayakan tetapan ini, SafeSearch dalam Carian Google dan YouTube akan sentiasa diaktifkan. - - Jika anda melumpuhkan tetapan ini atau tidak menetapkan nilai, SafeSearch dalam Carian Google dan YouTube tidak dikuatkuasakan.</translation> <translation id="8906768759089290519">Dayakan mod tetamu</translation> <translation id="8908294717014659003">Membenarkan anda menetapkan sama ada laman web dibenarkan untuk mendapatkan akses kepada peranti tangkapan media. Akses kepada peranti tangkapan media boleh dibenarkan secara lalai atau pengguna boleh ditanya setiap kali laman web ingin mendapatkan akses kepada peranti tangkapan media.
diff --git a/components/policy/resources/policy_templates_nl.xtb b/components/policy/resources/policy_templates_nl.xtb index f2fca0f..c167aaa 100644 --- a/components/policy/resources/policy_templates_nl.xtb +++ b/components/policy/resources/policy_templates_nl.xtb
@@ -205,15 +205,6 @@ 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. - - Als je deze instelling inschakelt, wordt de lijst met opgegeven plug-ins nooit gebruikt in <ph name="PRODUCT_NAME" />. De plug-ins zijn gemarkeerd als 'uitgeschakeld' in 'about:plugins' en gebruikers kunnen deze niet inschakelen. - - Houd er rekening mee dat dit beleid kan worden overschreven door EnabledPlugins en DisabledPluginsExceptions. - - Als dit beleid niet is ingesteld, kan de gebruiker alle plug-ins gebruiken die op het systeem zijn geïnstalleerd, met uitzondering van plug-ins die hardcoded incompatibel, verouderd of gevaarlijk zijn.</translation> <translation id="1864269674877167562">Als dit beleid is ingesteld op een lege tekenreeks of niet is geconfigureerd, geeft <ph name="PRODUCT_OS_NAME" /> geen optie voor Automatisch aanvullen weer tijdens het inlogproces van de gebruiker. Als dit beleid is ingesteld op een tekenreeks die een domeinnaam vertegenwoordigt, geeft <ph name="PRODUCT_OS_NAME" /> een optie voor Automatisch aanvullen weer tijdens het inlogproces van de gebruiker, waarbij de gebruiker alleen zijn gebruikersnaam hoeft te typen zonder de domeinnaamextensie. De gebruiker kan deze domeinnaamextensie overschrijven.</translation> <translation id="1865417998205858223">Rechten voor sleutels</translation> @@ -857,11 +848,6 @@ <translation id="3660562134618097814">SAML IdP-cookies overdragen tijdens het inloggen</translation> <translation id="3709266154059827597">Zwarte lijst voor het installeren van extensies configureren</translation> <translation id="3711895659073496551">Onderbreken</translation> -<translation id="3715448429089775791">Hiermee wordt afgedwongen dat de beperkte modus van YouTube wordt ingesteld op 'actief' en wordt voorkomen dat gebruikers deze instelling kunnen wijzigen. - - Als je deze instelling inschakelt, is de beperkte modus op YouTube altijd actief. - - Als je deze instelling uitschakelt of geen waarde instelt, wordt de beperkte modus op YouTube niet afgedwongen.</translation> <translation id="3750220015372671395">Het genereren van sleutels op deze sites blokkeren</translation> <translation id="3756011779061588474">Ontwikkelaarsmodus blokkeren</translation> <translation id="3758089716224084329">Hiermee kun je de proxyserver specificeren die door <ph name="PRODUCT_NAME" /> wordt gebruikt en wordt voorkomen dat gebruikers proxyinstellingen kunnen aanpassen. @@ -2115,12 +2101,6 @@ De herkende verbindingstypen zijn 'ethernet', 'wifi', 'wimax', 'bluetooth' en 'mobiel'.</translation> <translation id="7763614521440615342">Contentsuggesties weergeven op de nieuwe tabbladpagina</translation> -<translation id="7766336524667238790">Informatie rapporteren over de actie kiosksessie, zoals - de ID en versie van de app. - - Als het beleid is ingesteld op 'onwaar', worden er geen sessiegegevens - gerapporteerd. Als het beleid is ingesteld op 'waar' of als er geen beleid is - ingesteld, worden de sessiegegevens gerapporteerd.</translation> <translation id="7774768074957326919">Proxyinstellingen van het systeem gebruiken</translation> <translation id="7775831859772431793">Je kunt de URL van de proxyserver hier opgeven. @@ -2358,6 +2338,10 @@ <translation id="8369602308428138533">Vertraging van scherm uitschakelen wanneer op netstroom wordt gewerkt</translation> <translation id="8382184662529825177">Het gebruik van externe verificatie inschakelen voor het beveiligen van content voor het apparaat</translation> <translation id="838870586332499308">Gegevensroaming inschakelen</translation> +<translation id="8390049129576938611">Hiermee wordt de interne pdf-viewer in <ph name="PRODUCT_NAME" /> uitgeschakeld. In plaats daarvan wordt dit beschouwd als download. De gebruiker kan pdf-bestanden openen met de standaard-app. + + Als dit beleid niet wordt ingesteld of wordt uitgeschakeld, wordt de pdf-plug-in gebruikt om pdf-bestanden te openen, tenzij de gebruiker deze uitschakelt.</translation> +<translation id="8402079500086185021">Pdf-bestanden altijd extern openen</translation> <translation id="8412312801707973447">Uitvoer van online OCSP/CRL-controles</translation> <translation id="8413348101535146315">Hiermee wordt het beëindigen van processen in Taakbeheer van <ph name="PRODUCT_NAME" /> mogelijk gemaakt. @@ -2378,17 +2362,6 @@ Ga voor voorbeeldpatronen naar https://www.chromium.org/developers/how-tos/chrome-frame-getting-started.</translation> <translation id="8493645415242333585">Opslaan van browsegeschiedenis uitschakelen</translation> <translation id="8499172469244085141">Standaardinstellingen (gebruikers kunnen overschrijven)</translation> -<translation id="8501011084242226370">Een lijst met plug-ins opgeven die de gebruiker kan in- of uitschakelen in <ph name="PRODUCT_NAME" />. - - De jokertekens '*' en '?' kunnen worden gebruikt om te zoeken op reeksen arbitraire tekens. '*' komt overeen met meerdere tekens, terwijl met '?' een optioneel enkel teken wordt gespecificeerd dat overeenkomt met nul tekens of één teken. Het escapeteken is '\'. Als je dus wilt zoeken naar de letterlijke tekens '*', '?' of '\', kun je er een '\' voor zetten. - - Als je deze instelling inschakelt, kan de opgegeven lijst met plug-ins in <ph name="PRODUCT_NAME" /> worden gebruikt. Gebruikers kunnen plug-ins in- of uitschakelen in 'about:plugins', zelfs als de plug-in ook overeenkomt met een patroon in DisabledPlugins. Gebruikers kunnen ook plug-ins in- en uitschakelen die niet overeenkomen met een patroon in DisabledPlugins, DisabledPluginsExceptions en EnabledPlugins. - - Dit beleid is bedoeld om een streng beleid voor een zwarte lijst met plug-ins mogelijk te maken, waarbij de lijst 'DisabledPlugins' items met jokertekens bevat. Bijvoorbeeld 'schakel alle plug-ins met '*' uit' of 'schakel alle Java-plug-ins met '*Java*' uit', terwijl de beheerder een bepaalde versie wil inschakelen, zoals 'IcedTea Java 2.3'. Deze specifieke versies kunnen worden gespecificeerd in dit beleid. - - Zowel de naam van de plug-in als de groepsnaam van de plug-in moeten worden uitgesloten. Elke groep plug-ins wordt in een afzonderlijk gedeelte in 'about:plugins' weergegeven. Elk gedeelte kan een of meer plug-ins bevatten. De plug-in 'Shockwave Flash' hoort bijvoorbeeld bij de groep 'Adobe Flash Player' en beide namen moeten een overeenkomst hebben in de lijst met uitzonderingen als die plug-in moet worden uitgesloten van de zwarte lijst. - - Als dit beleid niet is ingesteld, wordt elke plug-in uitgeschakeld die overeenkomt met de patronen in 'DisabledPlugins', en kan de gebruiker deze niet inschakelen.</translation> <translation id="8519264904050090490">URL's van handmatige uitzonderingen voor beheerde gebruikers</translation> <translation id="8544375438507658205">Standaard HTML-renderer voor <ph name="PRODUCT_FRAME_NAME" /></translation> <translation id="8549772397068118889">Waarschuwen als sites worden bezocht die zich niet in de inhoudspakketten bevinden</translation> @@ -2424,15 +2397,6 @@ Scheid meerdere servernamen van elkaar met komma's. Jokertekens (*) zijn toegestaan. Als je dit beleid niet instelt, probeert <ph name="PRODUCT_NAME" /> te detecteren of een server zich in het intranet bevindt en wordt daarna pas gereageerd op IWA-verzoeken. Als een server wordt gedetecteerd als intranet, worden IWA-verzoeken van de server genegeerd door <ph name="PRODUCT_NAME" />.</translation> -<translation id="8668394701842594241">Hiermee wordt een lijst met plug-ins gespecificeerd die zijn ingeschakeld in <ph name="PRODUCT_NAME" /> en wordt voorkomen 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 specificeert en dus kan overeenkomen met één of nul tekens. Het teken '\' kan worden gebruikt om deze tekens te escapen, dus als je overeenkomsten voor de letterlijke tekens '*', '?' of '\' wilt zoeken, moet je er een '\' vóór plaatsen. - - De gespecificeerde lijst met plug-ins wordt altijd gebruikt in <ph name="PRODUCT_NAME" /> als deze plug-ins zijn geïnstalleerd. De plug-ins zijn gemarkeerd als ingeschakeld in 'about:plugins' en gebruikers kunnen ze niet uitschakelen. - - Houd er rekening mee dat dit beleid voorrang heeft op zowel DisabledPlugins als DisabledPluginsExceptions. - - Als dit beleid niet wordt ingesteld, kan de gebruiker alle plug-ins verwijderen die op het systeem zijn geïnstalleerd.</translation> <translation id="8672321184841719703">Doelversie voor automatische updates</translation> <translation id="868068801094828689">Hiermee wordt anonieme rapportage van gebruiks- en crashgegevens voor <ph name="PRODUCT_NAME" /> aan Google ingeschakeld en wordt voorkomen dat gebruikers deze instelling kunnen wijzigen. @@ -2519,13 +2483,6 @@ Als dit beleid is ingesteld op 'false', maakt het apparaat geen verbinding met de Quirks Server om configuratiebestanden te downloaden. Als dit beleid is ingesteld op 'true' of niet is geconfigureerd, maakt <ph name="PRODUCT_OS_NAME" /> automatisch verbinding met de Quirks Server en worden configuratiebestanden (indien beschikbaar) gedownload en opslagen op het apparaat. Dergelijke bestanden kunnen bijvoorbeeld worden gebruikt om de weergavekwaliteit van aangesloten beeldschermen te verbeteren.</translation> -<translation id="8905426178924715309">Dit beleid is verouderd. Gebruik in plaats hiervan ForceGoogleSafeSearch en ForceYouTubeSafetyMode. Dit beleid wordt genegeerd als het beleid ForceGoogleSafeSearch of ForceYouTubeSafetyMode is ingesteld. - - Hiermee wordt afgedwongen dat zoekopdrachten in Google Zoeken worden uitgevoerd wanneer SafeSearch is ingesteld op 'actief', en wordt voorkomen dat gebruikers deze instelling kunnen wijzigen. Met deze instelling wordt ook de Beperkte modus op YouTube afgedwongen. - - Als je deze instelling inschakelt, is SafeSearch in Google Zoeken en YouTube altijd actief. - - Als je deze instelling uitschakelt of er geen waarde voor instelt, wordt SafeSearch niet afgedwongen in Google Zoeken en YouTube.</translation> <translation id="8906768759089290519">Gastmodus inschakelen</translation> <translation id="8908294717014659003">Hiermee kun je instellen of websites toegang mogen krijgen tot media-opnameapparaten. Toegang tot media-opnameapparaten kan standaard worden toegestaan of de gebruiker kan elke keer om toestemming worden gevraagd wanneer een website toegang wil hebben tot media-opnameapparaten.
diff --git a/components/policy/resources/policy_templates_no.xtb b/components/policy/resources/policy_templates_no.xtb index 08de8fe..e4fb5147 100644 --- a/components/policy/resources/policy_templates_no.xtb +++ b/components/policy/resources/policy_templates_no.xtb
@@ -209,15 +209,6 @@ 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. - - Hvis du aktiverer denne innstillingen, blir den angitte listen over programtillegg aldri brukt på <ph name="PRODUCT_NAME" />. Programtilleggene er angitt som deaktiverte i «about:plugins»-delen, og brukere kan ikke aktivere dem. - - Vær oppmerksom på at denne retningslinjen kan overstyres av EnabledPlugins og DisabledPluginsExceptions. - - Hvis denne innstillingen ikke angis med et valg, betyr dette at brukeren kan bruke et hvilket som helst programtillegg installert på systemet, bortsett fra hardkodede programtillegg som enten er ikke-kompatible, foreldede eller farlige.</translation> <translation id="1864269674877167562">Hvis denne regelen settes til en tom streng eller ikke konfigureres, ser ikke brukerne noe alternativ for autofullføring i <ph name="PRODUCT_OS_NAME" /> under påloggingsprosessen. Hvis denne regelen settes til en streng som representerer et domenenavn, ser brukeren alternativet for autofullføring i <ph name="PRODUCT_OS_NAME" /> under påloggingsprosessen, slik at vedkommende kan skrive inn bare brukernavnet sitt uten domenenavnutvidelsen. Brukeren kan overskrive denne domenenavnutvidelsen.</translation> <translation id="1865417998205858223">Nøkkeltillatelser</translation> @@ -839,11 +830,6 @@ <translation id="3660562134618097814">Overfør SAML IdP-informasjonskapsler ved pålogging</translation> <translation id="3709266154059827597">Konfigurer installasjonssperrelisten for utvidelser</translation> <translation id="3711895659073496551">Suspender</translation> -<translation id="3715448429089775791">Tvinger gjennom bruk av sikkerhetsmodusen for YouTube og hindrer brukerne i å endre denne innstillingen. - - Hvis du slår på denne innstillingen, er sikkerhetsmodusen for YouTube alltid på. - - Hvis du slår av denne innstillingen eller ikke spesifiserer noen verdi, blir ikke sikkerhetsmodusen for YouTube slått på ved tvang.</translation> <translation id="3750220015372671395">Blokkér nøkkelgenerering på disse nettstedene</translation> <translation id="3756011779061588474">Blokkering av utviklermodus</translation> <translation id="3758089716224084329">Lar deg spesifisere hvilken proxy-tjener som brukes av <ph name="PRODUCT_NAME" />, og hindrer brukerne i å endre proxy-innstillingene. @@ -2077,11 +2063,6 @@ Identifikatorene som gjenkjennes for tilkoblingstyper er "ethernet", "wifi", "wimax", "bluetooth" og "cellular".</translation> <translation id="7763614521440615342">Vis innholdsforslag på nye faner</translation> -<translation id="7766336524667238790">Rapportér informasjon om den aktive kioskøkten, for eksempel - app-ID og -versjon. - - Hvis regelen settes til false (usann), rapporteres ikke øktinformasjonen. - Hvis den settes til true (sann) eller ikke angis, rapporteres øktinformasjonen.</translation> <translation id="7774768074957326919">Bruk systeminnstillingene for mellomtjener</translation> <translation id="7775831859772431793">Du kan spesifisere nettadressen til proxy-tjeneren her. @@ -2315,6 +2296,9 @@ <translation id="8369602308428138533">Forsinkelse for avslått skjerm når du bruker strømadapteren</translation> <translation id="8382184662529825177">Slå på bruken av ekstern attestasjon for innholdsbeskyttelse på enheten</translation> <translation id="838870586332499308">Aktiver datastreifing</translation> +<translation id="8390049129576938611">Slår av den interne appen for visning av PDF-filer på <ph name="PRODUCT_NAME" />. PDF-filer blir i stedet lastet ned, og brukeren kan åpne dem med standardappen. + Hvis disse retningslinjene slås av eller ikke angis, åpnes PDF-filer i PDF-programtillegget frem til brukeren eventuelt slår det av.</translation> +<translation id="8402079500086185021">Åpne alltid PDF-filer eksternt</translation> <translation id="8412312801707973447">Angir om OCSP/CRL-kontroller utføres på nettet</translation> <translation id="8413348101535146315">Slår på muligheten for å avslutte prosesser i oppgavebehandlingen i <ph name="PRODUCT_NAME" />. @@ -2335,20 +2319,6 @@ Du finner eksempelmønstre på https://www.chromium.org/developers/how-tos/chrome-frame-getting-started.</translation> <translation id="8493645415242333585">Deaktiver lagring av nettleserlogg</translation> <translation id="8499172469244085141">Standardinnstillinger (kan overstyres av brukere)</translation> -<translation id="8501011084242226370">Angir en liste over programtillegg som brukeren kan aktivere eller deaktivere i <ph name="PRODUCT_NAME" />. - - Jokertegn som stjerne (*) og spørsmålstegn (?) kan brukes til å samsvare sekvenser av vilkårlige tegn. Stjerne (*) samsvarer med et vilkårlig antall tegn, mens spørsmålstegn angir et valgfritt enkelt tegn, f.eks. samsvarer den med ingen eller ett tegn. Skiftetegnet er en backslash (\), så hvis du vil samsvare faktiske tegn som *, ?, eller \, kan du sette inn en backslash (\) før dem. - - Hvis du aktiverer denne innstillingen, kan den angitte listen over programtillegg brukes i <ph name="PRODUCT_NAME" />. Brukere kan aktivere eller deaktivere dem i about:plugins, selv om programtillegget også samsvarer med et mønster i DisabledPlugins. Brukere kan også aktivere og deaktivere programtillegg som ikke samsvarer med noen mønstre i DisabledPlugins, DisabledPluginsExceptions og EnabledPlugins. - - Denne innstillingen er ment å tillate streng svartelisting av programtillegg når DisabledPlugins-listen inneholder jokertegnoppføringer som deaktiver alle programtillegg * eller -deaktiver alle Java-programtillegg *Java*, men administratoren ønsker å aktivere bestemte versjoner som IcedTea Java 2.3. Disse -bestemte versjonene kan angis i denne innstillingen. - - Merk at både programtilleggsnavnet og programtilleggets gruppenavn må fritas. Hver programtilleggsgruppe vises i et eget avsnitt i about:plugins. Hvert avsnitt kan ha én eller flere -programtillegg. Shockwave Flash-programtillegget tilhører for eksempel Adobe Flash Player-gruppen, og begge navnene må ha en match i unntakslisten hvis det programtillegget skal fritas fra svartelisten. - - Hvis denne innstillingen ikke angis, blir alle programtillegg som samsvarer med mønstrene i DisabledPlugins låst som deaktivert, og brukeren vil ikke være i stand til å aktivere dem.</translation> <translation id="8519264904050090490">Nettadresser med manuelle unntak for administrerte brukere</translation> <translation id="8544375438507658205">Standard gjengivelse av HTML for <ph name="PRODUCT_FRAME_NAME" /></translation> <translation id="8549772397068118889">Varsle ved besøk på nettsteder som ikke inngår i innholdspakker</translation> @@ -2386,11 +2356,6 @@ Adskill tjenernavn med komma. Jokertegn (*) er tillatt. Hvis du ikke spesifiserer denne regelen, forsøker <ph name="PRODUCT_NAME" /> å oppdage om en tjener er på intranett og bare svare på IWA-forespørsler hvis den er det. Hvis en tjener registreres som Internett, ignorerer <ph name="PRODUCT_NAME" /> IWA-forespørsler fra tjeneren.</translation> -<translation id="8668394701842594241">Angir en liste over programtillegg som er aktivert i <ph name="PRODUCT_NAME" />, og forhindrer brukerne i å endre denne innstillingen. - - Jokertegnene * og ? kan brukes til å samsvare sekvenser av vilkårlige tegn. Tegnet * samsvarer med et vilkårlig antall tegn, mens tegnet ? angir et valgfritt enkeltstående tegn, dvs. ingen tegn eller ett tegn. Nødutgangtegnet er \, så for å matche tegn som faktisk er et * eller et ?, setter du en \ foran dem. - - Den angitte listen over programtillegg brukes alltid i <ph name="PRODUCT_NAME" /> hvis programtilleggene har blitt installert. Programtilleggene er merket som aktivert i about:plugins, og brukerne kan ikke deaktivere dem. Vær oppmerksom på at denne retningslinjen overstyrer både DisabledPlugins og DisabledPluginsExceptions. Hvis denne retningslinjen ikke angis, kan brukeren deaktivere alle programtillegg som er installert i systemet.</translation> <translation id="8672321184841719703">Målversjon for automatiske oppdateringer</translation> <translation id="868068801094828689">Slår på anonym rapportering av bruks- og krasjrelaterte data om <ph name="PRODUCT_NAME" /> til Google og hindrer at brukerne kan endre denne innstillingen. @@ -2493,13 +2458,6 @@ Quirks Server automatisk, laster ned eventuelle tilgjengelige konfigurasjonsfiler og lagrer dem på enheten. Slike filer kan for eksempel brukes for å forbedre visningskvaliteten på tilkoblede skjermer.</translation> -<translation id="8905426178924715309">Denne regelen er avviklet. Bruk ForceGoogleSafeSearch og ForceYouTubeSafetyMode i stedet. Denne regelen ignoreres hvis ForceGoogleSafeSearch eller ForceYouTubeSafetyMode er spesifisert. - - Tvinger søkene i Google Nettsøk til å gjøres med Sikkert Søk slått på, og hindrer brukerne i å endre denne innstillingen. Denne regelen tvinger også frem bruk av sikkerhetsmodus i YouTube. - - Hvis du slår på denne regelen, er Sikkert Søk i Google Søk og YouTube alltid aktivt. - - Hvis du slår av denne regelen eller ikke angir noen verdi, er Sikkert Søk valgfritt i Google Søk og YouTube.</translation> <translation id="8906768759089290519">Aktiver gjestemodus</translation> <translation id="8908294717014659003">Lar deg angi om nettsteder skal gis tillatelse til å bruke digitaliseringsenhetene dine. Bruk av digitaliseringsenheter kan tillates som standard, eller angis slik at brukeren blir spurt om tillatelse hver gang et nettsted ønsker å bruke slike enheter.
diff --git a/components/policy/resources/policy_templates_pl.xtb b/components/policy/resources/policy_templates_pl.xtb index f9b548a..181dc35 100644 --- a/components/policy/resources/policy_templates_pl.xtb +++ b/components/policy/resources/policy_templates_pl.xtb
@@ -207,7 +207,6 @@ 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="1864269674877167562">Jeśli ta zasada jest pusta lub nieskonfigurowana, <ph name="PRODUCT_OS_NAME" /> nie będzie wyświetlać opcji autouzupełniania podczas logowania użytkownika. Jeśli zasada jest ustawiona na nazwę domeny, <ph name="PRODUCT_OS_NAME" /> będzie wyświetlać opcję autouzupełniania podczas logowania użytkownika, umożliwiając mu wpisanie tylko jego nazwy, bez konieczności podawania rozszerzenia nazwy domeny. Użytkownik będzie mógł zastąpić rozszerzenie nazwy domeny.</translation> <translation id="1865417998205858223">Uprawnienia klucza</translation> @@ -814,11 +813,6 @@ <translation id="3660562134618097814">Prześlij pliki cookie dostawcy tożsamości SAML podczas logowania</translation> <translation id="3709266154059827597">Konfiguruj czarną listę instalacji rozszerzeń</translation> <translation id="3711895659073496551">Wstrzymaj</translation> -<translation id="3715448429089775791">Wymusza włączenie trybu bezpiecznego w YouTube i uniemożliwia zmianę tego ustawienia przez użytkowników. - - Jeśli włączysz to ustawienie, tryb bezpieczny w YouTube będzie zawsze aktywny. - - Jeśli wyłączysz to ustawienie lub nie ustawisz wartości, tryb bezpieczny w YouTube nie będzie wymuszany.</translation> <translation id="3750220015372671395">Blokuj generowanie kluczy w tych witrynach</translation> <translation id="3756011779061588474">Zablokuj tryb programisty</translation> <translation id="3758089716224084329">Pozwala określić serwer proxy używany przez <ph name="PRODUCT_NAME" /> i uniemożliwia użytkownikom zmianę ustawień serwera proxy. @@ -1974,12 +1968,6 @@ Rozpoznawane identyfikatory typów połączeń to „ethernet”, „wifi”, „wimax”, „bluetooth” i „cellular”.</translation> <translation id="7763614521440615342">Pokazuj polecane treści na stronie Nowa karta</translation> -<translation id="7766336524667238790">Przesyłaj informacje o aktywnej sesji publicznej, np. - dotyczące identyfikatora i wersji aplikacji. - - Jeśli ta zasada jest wyłączona, informacje o sesji nie będą przesyłane. - Jeśli zasada jest włączona lub nieustawiona, informacje o sesji - będą przesyłane.</translation> <translation id="7774768074957326919">Używaj systemowych ustawień serwera proxy</translation> <translation id="7775831859772431793">W tym miejscu możesz podać URL serwera proxy. @@ -2205,6 +2193,10 @@ <translation id="8369602308428138533">Opóźnienie wyłączenia ekranu przy zasilaniu sieciowym</translation> <translation id="8382184662529825177">Włącz używanie zaświadczania zdalnego do ochrony treści na urządzeniu</translation> <translation id="838870586332499308">Włącz dane w roamingu</translation> +<translation id="8390049129576938611">Wyłącza wewnętrzną przeglądarkę plików PDF w <ph name="PRODUCT_NAME" />. Pliki PDF będą traktowane jako pobrane i użytkownik będzie mógł je otwierać w aplikacji domyślnej. + + Jeśli ta zasada nie zostanie ustawiona lub zostanie wyłączona, do otwierania plików PDF będzie używana wtyczka PDF, chyba że użytkownik ją wyłączy.</translation> +<translation id="8402079500086185021">Zawsze otwieraj pliki PDF zewnętrznie</translation> <translation id="8412312801707973447">Czy wykonywane jest sprawdzanie OCSP/CRL online</translation> <translation id="8413348101535146315">Umożliwia kończenie procesów w Menedżerze zadań <ph name="PRODUCT_NAME" />. @@ -2225,17 +2217,6 @@ Przykładowe wzorce znajdziesz na https://www.chromium.org/developers/how-tos/chrome-frame-getting-started</translation> <translation id="8493645415242333585">Wyłącz zapisywanie historii przeglądarki</translation> <translation id="8499172469244085141">Ustawienia domyślne (użytkownicy mogą zmienić)</translation> -<translation id="8501011084242226370">Określa listę wtyczek, które użytkownik może włączyć lub wyłączyć w <ph name="PRODUCT_NAME" />. - - W celu odwzorowania sekwencji dowolnych znaków można użyć symboli wieloznacznych „*” i „?”. Symbol „*” odpowiada dowolnej liczbie znaków, a „?” określa opcjonalny pojedynczy znak, czyli oznacza jeden znak lub brak znaku. Znak ucieczki – „\” – umieszczony przed znakami „*”, „?” lub „\” pozwala określić ich podstawowe znaczenie. - - Jeśli włączysz to ustawienie, w <ph name="PRODUCT_NAME" /> będzie możliwe użycie określonej listy wtyczek. Użytkownicy będą mogli je włączać i wyłączać w „about:plugins”, nawet jeśli dana wtyczka będzie też pasowała do wzorca określonego w DisabledPlugins. Użytkownicy będą mogli też włączać i wyłączać wtyczki, które nie pasują do żadnego wzorca w DisabledPlugins, DisabledPluginsExceptions ani EnabledPlugins. - - Celem tej zasady jest umożliwienie utworzenia ścisłej czarnej listy wtyczek, w przypadku gdy lista „DisabledPlugins” zawiera wpisy z symbolami wieloznacznymi, takie jak wyłączające wszystkie wtyczki „*” czy wyłączające wszystkie wtyczki Javy „*Java*”, ale administrator chce włączyć pewne określone wersje, na przykład „IcedTea Java 2.3”. Te konkretne wersje można określić w tej zasadzie. - - Pamiętaj, że musisz wykluczyć zarówno nazwę wtyczki, jak i nazwę grupy wtyczek. Każdą grupę wtyczek widać w oddzielnej sekcji w about:plugins, a do każdej sekcji może należeć co najmniej jedna wtyczka. Na przykład wtyczka „Shockwave Flash” należy do grupy „Adobe Flash Player” i jeśli ma być wykluczona z czarnej listy, obie te nazwy muszą mieć swoje odpowiedniki na liście wyjątków. - - Jeśli nie skonfigurujesz tej zasady, wszystkie wtyczki pasujące do wzorca w „DisabledPlugins” będą blokowane i użytkownik nie będzie mógł ich włączyć.</translation> <translation id="8519264904050090490">Zarządzane adresy URL dodane przez użytkownika na listę wyjątków</translation> <translation id="8544375438507658205">Domyślny mechanizm renderowania HTML wtyczki <ph name="PRODUCT_FRAME_NAME" /></translation> <translation id="8549772397068118889">Ostrzegaj przy odwiedzaniu witryn spoza pakietów treści</translation> @@ -2274,7 +2255,6 @@ Nazwy serwerów należy rozdzielić przecinkami. Można używać symboli wieloznacznych (*). Jeśli nie ustawisz tej zasady, <ph name="PRODUCT_NAME" /> próbuje wykryć, czy serwer jest w intranecie, i tylko wtedy odpowiada na żądania IWA. W przypadku serwera internetowego <ph name="PRODUCT_NAME" /> ignoruje żądania IWA.</translation> -<translation id="8668394701842594241">Określa listę wtyczek włączonych w <ph name="PRODUCT_NAME" /> i uniemożliwia użytkownikom zmianę tego ustawienia. Możesz użyć symboli wieloznacznych „*” i „?”, które zastąpią 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 aby wprowadzić faktyczny znak „*”, „?” lub „\”, musisz umieścić przed nim znak „\”. Wtyczki wymienione na liście są zawsze używane w <ph name="PRODUCT_NAME" />, jeśli zostały zainstalowane. Wtyczki są oznaczone jako włączone na stronie „about:plugins”, a użytkownicy nie mogą ich wyłączyć. Pamiętaj, że ta zasada zastępuje zasady DisabledPlugins i DisabledPluginsExceptions. Jeśli zasada nie zostanie skonfigurowana, użytkownik będzie mógł wyłączyć każdą wtyczkę zainstalowaną w systemie.</translation> <translation id="8672321184841719703">Wersja docelowa automatycznych aktualizacji</translation> <translation id="868068801094828689">Włącza anonimowe przesyłanie do Google raportów o użytkowaniu i danych o awariach <ph name="PRODUCT_NAME" /> oraz blokuje możliwość zmiany tego ustawienia przez użytkowników. @@ -2361,13 +2341,6 @@ automatycznie pobierać pliki konfiguracyjne z Quirks Server (jeśli będą dostępne) i zapisywać je na urządzeniu. Takie pliki mogą na przykład poprawiać jakość obrazu na podłączonych monitorach.</translation> -<translation id="8905426178924715309">Ta zasada została wycofana. Zamiast niej użyj ForceGoogleSafeSearch lub ForceYouTubeSafetyMode. Zasada zostanie zignorowana, jeśli ustawiona zostanie zasada ForceGoogleSafeSearch lub ForceYouTubeSafetyMode. - - Wymusza realizację zapytań w wyszukiwarce Google przy użyciu filtra SafeSearch i uniemożliwia użytkownikom zmianę tego ustawienia. To ustawienie wymusza też włączenie Trybu bezpiecznego w YouTube. - - Jeśli włączysz to ustawienie, filtr SafeSearch w wyszukiwarce Google i YouTube będzie zawsze aktywny. - - Jeśli je wyłączysz albo nie podasz wartości, stosowanie filtra SafeSearch w wyszukiwarce Google i YouTube nie będzie wymuszane.</translation> <translation id="8906768759089290519">Włącz tryb gościa</translation> <translation id="8908294717014659003">Pozwala określić, czy strony mogą korzystać z urządzeń do rejestrowania multimediów. Dostęp do tych urządzeń może być dozwolony domyślnie lub użytkownik może być pytany za każdym razem, gdy strona chce użyć urządzenia do rejestrowania multimediów.
diff --git a/components/policy/resources/policy_templates_pt-BR.xtb b/components/policy/resources/policy_templates_pt-BR.xtb index 73cec176..c6e199b 100644 --- a/components/policy/resources/policy_templates_pt-BR.xtb +++ b/components/policy/resources/policy_templates_pt-BR.xtb
@@ -203,15 +203,6 @@ 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. - - Se você ativar esta configuração, a lista especificada de plug-ins nunca será usada no <ph name="PRODUCT_NAME" />. Os plug-ins serão marcados como desativados em "about:plugins", e os usuários não poderão ativá-los. - - Esta política pode ser substituída por EnabledPlugins e DisabledPluginsExceptions. - - Se esta política não for definida, o usuário poderá usar qualquer plug-in instalado no sistema, com exceção de plug-ins codificados incompatíveis, desatualizados ou perigosos.</translation> <translation id="1864269674877167562">Se esta política for definida como uma string em branco ou não for configurada, o <ph name="PRODUCT_OS_NAME" /> não mostrará uma opção de preenchimento automático durante o fluxo de login. Se esta política for definida como uma string representando um nome de domínio, o <ph name="PRODUCT_OS_NAME" /> mostrará uma opção de preenchimento automático durante o login do usuário, permitindo que o mesmo digite apenas seu nome de usuário sem a extensão de nome de domínio. O usuário poderá substituir essa extensão de nome de domínio.</translation> <translation id="1865417998205858223">Principais permissões</translation> @@ -808,11 +799,6 @@ <translation id="3660562134618097814">Transferir cookies do IDP de SAML durante o login</translation> <translation id="3709266154059827597">Configurar a lista negra de instalação da extensão</translation> <translation id="3711895659073496551">Suspender</translation> -<translation id="3715448429089775791">Força o modo de segurança do YouTube a ser ativado e impede que os usuários mudem esta configuração. - - Se esta configuração é ativada, o modo de segurança do YouTube fica sempre ativo. - - Se esta configuração é desativada ou se nenhum valor é definido, o modo de segurança do YouTube não é aplicado.</translation> <translation id="3750220015372671395">Bloquear a geração de chaves nesses sites</translation> <translation id="3756011779061588474">Bloquear modo de desenvolvedor</translation> <translation id="3758089716224084329">Permite que você especifique o servidor proxy usado pelo <ph name="PRODUCT_NAME" /> e impede que os usuários alterem as configurações de proxy. @@ -1963,12 +1949,6 @@ Os identificadores de tipos de conexão reconhecidos são "ethernet", "wifi", "WiMAX", "bluetooth" e "celular".</translation> <translation id="7763614521440615342">Mostrar sugestões de conteúdo na página "Nova guia"</translation> -<translation id="7766336524667238790">Informar detalhes sobre a sessão de quiosque ativa, por exemplo, - versão e código do aplicativo. - - Se a política é definida como "false", as informações da sessão não são - comunicadas. Se definida como "true" ou não configurada, as informações da sessão são - comunicadas.</translation> <translation id="7774768074957326919">Usar configurações de proxy do sistema</translation> <translation id="7775831859772431793">É possível especificar o URL do servidor proxy aqui. @@ -2185,6 +2165,10 @@ <translation id="8369602308428138533">Intervalo de desligamento da tela no funcionamento com alimentação CA</translation> <translation id="8382184662529825177">Permitir o uso de declaração remota para proteção de conteúdo no dispositivo</translation> <translation id="838870586332499308">Ativa roaming de dados</translation> +<translation id="8390049129576938611">Desativa o visualizador de PDF interno no <ph name="PRODUCT_NAME" />. Em vez disso, ela o trata como um download e permite que o usuário abra os arquivos em PDF com o aplicativo padrão. + + Se esta política for deixada sem definição ou for desativada, o plug-in de PDF será usado para abrir arquivos em PDF, a menos que o usuário o desative.</translation> +<translation id="8402079500086185021">Sempre abrir arquivos em PDF externamente</translation> <translation id="8412312801707973447">Define se as verificações on-line de OCSP/CRL devem ser executadas</translation> <translation id="8413348101535146315">Permite o encerramento de processos no Gerenciador de tarefas do <ph name="PRODUCT_NAME" />. @@ -2205,17 +2189,6 @@ Para ver exemplos de padrões, acesse http://www.chromium.org/developers/how-tos/chrome-frame-getting-started (link em inglês).</translation> <translation id="8493645415242333585">Desativar o salvamento do histórico do navegador</translation> <translation id="8499172469244085141">Configurações padrão (podem ser substituídas pelos usuários)</translation> -<translation id="8501011084242226370">Especifica uma lista de plug-ins que o usuário pode ativar ou desativar no <ph name="PRODUCT_NAME" />. - - Os caracteres curinga "*" e "?" podem ser usados para corresponder a sequências de caracteres arbitrários. "*" corresponde a um número arbitrário de caracteres, enquanto "?" especifica um caractere único opcional, isto é, corresponde a zero ou um caractere. O caractere de escape é "\". Dessa forma, para corresponder aos caracteres "*", "?" ou "\" em si, é possível colocar um "\" na frente deles. - - Se você ativar essa configuração, a lista de plug-ins especificada poderá ser usada no <ph name="PRODUCT_NAME" />. Os usuários também podem ativá-los ou desativá-los em "about:plugins", mesmo que o plug-in também corresponda a um padrão em "DisabledPlugins". Além disso, é possível ativar e desativar plug-ins que não correspondam a nenhum padrão em "DisabledPlugins", "DisabledPluginsExceptions" e "EnabledPlugins". - - Essa política permite a criação de uma lista negra de plug-ins estrita, em que a lista "DisabledPlugins" contém entradas com caracteres curinga, como "Desativar todos os plug-ins "*"" ou 'Desativar todos os plug-ins Java "*Java*"", mas o administrador deseja ativar alguma versão específica, como "IcedTea Java 2.3". Essas versões específicas podem ser indicadas nessa política. - - Observe que tanto o nome do plug-in como o nome do grupo do plug-in devem ser isentados. Cada grupo de plug-ins é exibido em uma seção separada em "about:plugins". Cada seção pode ter um ou mais plug-ins. Por exemplo, o plug-in "Shockwave Flash" pertence ao grupo "Adobe Flash Player", e os dois nomes devem ter uma correspondência na lista de exceções, se esse plug-in tiver que ser isentado da lista negra. - - Se essa política não for definida, qualquer plug-in que corresponder aos padrões em "DisabledPlugins" será bloqueado, e o usuário não poderá ativá-lo.</translation> <translation id="8519264904050090490">URLs de exceção manual do usuário gerenciado</translation> <translation id="8544375438507658205">Renderizador padrão de HTML para o <ph name="PRODUCT_FRAME_NAME" /></translation> <translation id="8549772397068118889">Avisar ao visitar sites fora de pacotes de conteúdo</translation> @@ -2251,7 +2224,6 @@ Separe vários nomes de servidores com vírgulas. Caracteres curinga (*) são permitidos. Se esta política não é definida, o <ph name="PRODUCT_NAME" /> tenta detectar se um servidor está na Intranet e, só então, responde às solicitações IWA. Se um servidor é detectado como Internet, as solicitações IWA que partem dele são ignoradas pelo <ph name="PRODUCT_NAME" />.</translation> -<translation id="8668394701842594241">Especifica uma lista de plug-ins ativados em <ph name="PRODUCT_NAME" /> e impede que os usuários modifiquem esta configuração. Os caracteres curinga "*" e "?" podem ser utilizados para combinar seqüê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 é "\", ou seja, para fazer uma busca que inclua os caracteres "*", "?", ou "\", você pode adicionar um "\" à frente. A lista de plug-ins especificados será sempre utilizada em <ph name="PRODUCT_NAME" />, caso eles tenham sido instalados. Os plug-ins são marcados como ativados em "about: plugins" e os usuários não podem desativá-los. Esta política se sobrepõe tanto a DisabledPlugins como a DisabledPluginsExceptions. Se esta política for deixada sem definição, o usuário pode desativar qualquer plug-in instalado no sistema.</translation> <translation id="8672321184841719703">Versão de atualização automática de destino</translation> <translation id="868068801094828689">Ativa a denúncia anônima de uso e dados relacionados a falhas sobre <ph name="PRODUCT_NAME" /> para o Google e impede que os usuários mudem esta configuração. @@ -2343,13 +2315,6 @@ em contato com o Servidor Quirks automaticamente e faz o download dos arquivos de configuração, se eles estão disponíveis, e os armazena no dispositivo. Esses arquivos podem ser usados, por exemplo, para melhorar a qualidade de exibição dos monitores acoplados.</translation> -<translation id="8905426178924715309">O uso desta política está suspenso. Use ForceGoogleSafeSearch e ForceYouTubeSafetyMode em vez dela. Esta política é ignorada se a política ForceGoogleSafeSearch ou a ForceYouTubeSafetyMode estão configuradas. - - Força as consultas no Google Web Search a serem feitas com o SafeSearch ativado e impede que os usuários alterem essa configuração, a qual também força o Modo de segurança do YouTube. - - Se você ativa esta configuração, o SafeSearch fica sempre ativo na Pesquisa Google e no YouTube. - - Se você desativa esta configuração ou não define nenhum valor, o SafeSearch não é aplicado na Pesquisa Google e no YouTube.</translation> <translation id="8906768759089290519">Ativa o modo de visitante</translation> <translation id="8908294717014659003">Permite definir se os sites podem ter acesso a dispositivos de captura de mídia. O acesso a dispositivos de captura de mídia pode ser permitido por padrão, ou uma pergunta será feita ao usuário cada vez que um site quiser ter acesso a dispositivos de captura de mídia.
diff --git a/components/policy/resources/policy_templates_pt-PT.xtb b/components/policy/resources/policy_templates_pt-PT.xtb index 358a6e6..3e8f7e1 100644 --- a/components/policy/resources/policy_templates_pt-PT.xtb +++ b/components/policy/resources/policy_templates_pt-PT.xtb
@@ -207,15 +207,6 @@ 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. - - Se ativar esta definição, a lista de plug-ins especificada nunca será utilizada no <ph name="PRODUCT_NAME" />. Os plug-ins estão marcados como desativados em "about:plugins" e os utilizadores não poderão ativá-los. - - Tenha presente que esta política pode ser substituída por EnabledPlugins e DisabledPluginsExceptions. - - Se deixar esta política por definir, o utilizador poderá utilizar qualquer plug-in instalado no sistema, com exceção de plug-ins incompatíveis, desatualizados ou perigosos determinados pelo hardware.</translation> <translation id="1864269674877167562">Se esta política for definida para uma string em branco ou não for configurada, o <ph name="PRODUCT_OS_NAME" /> não apresenta uma opção de preenchimento automático durante o fluxo de início de sessão do utilizador. Se esta política for definida para uma string que represente um nome de domínio, o <ph name="PRODUCT_OS_NAME" /> apresenta uma opção de preenchimento automático durante o início de sessão do utilizador, o que permite ao utilizador escrever apenas o seu nome de utilizador sem a extensão do nome do domínio. O utilizador pode substituir esta extensão do nome do domínio.</translation> <translation id="1865417998205858223">Autorizações principais</translation> @@ -818,11 +809,6 @@ <translation id="3660562134618097814">Transferir cookies SAML IdP durante o início de sessão</translation> <translation id="3709266154059827597">Configurar lista negra de instalação de extensões</translation> <translation id="3711895659073496551">Suspenso</translation> -<translation id="3715448429089775791">Força a ativação do Modo de segurança do YouTube e impede os utilizadores de alterar esta definição. - - Se ativar esta definição, o Modo de segurança do YouTube está sempre ativo. - - Se desativar esta definição ou não definir um valor, o Modo de segurança do YouTube não é aplicado.</translation> <translation id="3750220015372671395">Bloquear a geração de chaves nestes sites</translation> <translation id="3756011779061588474">Bloquear modo de programador</translation> <translation id="3758089716224084329">Permite-lhe especificar o servidor proxy utilizado pelo <ph name="PRODUCT_NAME" /> e impede os utilizadores de alterarem as definições de proxy. @@ -1986,12 +1972,6 @@ Os identificadores dos tipos de ligação reconhecidos são "ethernet", "wifi", "wimax", "bluetooth" e "celular".</translation> <translation id="7763614521440615342">Mostrar sugestões de conteúdo na página Novo separador</translation> -<translation id="7766336524667238790">Comunica informações acerca da sessão ativa do quiosque, como - o ID e a versão da aplicação. - - Se a política for definida como falsa, as informações da sessão não são - comunicadas. Se for definida como verdadeira ou deixada por definir, as informações da sessão são - comunicadas.</translation> <translation id="7774768074957326919">Utilizar definições de proxy do sistema</translation> <translation id="7775831859772431793">Pode especificar o URL do servidor proxy aqui. @@ -2214,6 +2194,10 @@ <translation id="8369602308428138533">Atraso para desligar o ecrã quando o dispositivo está ligado à eletricidade</translation> <translation id="8382184662529825177">Ativar a utilização da comprovação remota para proteção de conteúdo no dispositivo</translation> <translation id="838870586332499308">Ativar roaming de dados</translation> +<translation id="8390049129576938611">Desativa o visualizador de PDF interno no <ph name="PRODUCT_NAME" />. Em vez disso, trata-o como uma transferência e permite ao utilizador abrir ficheiros PDF com a aplicação predefinida. + + Se esta política não for definida ou for desativada, é utilizado o plug-in de PDF para abrir ficheiros PDF, a menos que o utilizador o desative.</translation> +<translation id="8402079500086185021">Abrir sempre ficheiros PDF externamente</translation> <translation id="8412312801707973447">Se são ou não efetuadas verificações OCSP/CRL on-line</translation> <translation id="8413348101535146315">Ativa a conclusão de processos no Gestor de tarefas do <ph name="PRODUCT_NAME" />. @@ -2234,17 +2218,6 @@ Para obter exemplos de padrões, consulte https://www.chromium.org/developers/how-tos/chrome-frame-getting-started.</translation> <translation id="8493645415242333585">Desativar armazenamento do histórico de navegação</translation> <translation id="8499172469244085141">Predefinições (os utilizadores podem substituir)</translation> -<translation id="8501011084242226370">Especifica uma lista de plug-ins que o utilizador pode ativar ou desativar em <ph name="PRODUCT_NAME" />. - - É possível utilizar os carateres universais "*" e "?" para corresponder a sequências de carateres arbitrários. "*" corresponde a um número arbitrário de carateres, enquanto "?" especifica um caráter único opcional, por exemplo, corresponde aos carateres zero ou um. O caráter de escape é "\", por isso, para corresponder aos carateres "*", "?" ou "\" propriamente ditos, pode colocar "\" à frente dos mesmos. - - Se ativar esta definição, é possível utilizar a lista de plug-ins no <ph name="PRODUCT_NAME" />. Os utilizadores podem ativá-los ou desativá-los em "acerca de plug-ins", mesmo que o plug-in também corresponda a um padrão em DisabledPlugins. Os utilizadores também podem ativar e desativar plug-ins que não correspondem a quaisquer padrões em DisabledPlugins, DisabledPluginsExceptions e EnabledPlugins. - - Esta política tem como objetivo permitir uma lista negra de plug-ins rígida, em que a lista "DisabledPlugins" contém entradas de carateres universais como desativar todos os plug-ins "*" ou desativar todos os plug-ins Java "*Java*", mas o administrador pretende ativar alguma versão particular como "IcedTea Java 2.3". É possível especificar estas versões particulares nesta política. - - Tenha em atenção que tanto o nome do plug-in como o nome de grupo do plug-in têm de estar isentos. Cada grupo de plug-in é apresentado numa secção separada em acerca de: plug-ins; cada secção pode ter um ou mais plug-ins. Por exemplo, o plug-in "Shockwave Flash" pertence ao grupo "Adobe Flash Player" e ambos os nomes têm de ter uma correspondência na lista de exceções se esse plug-in for isento da lista negra. - - Se esta política não for definida, qualquer plug-in correspondente aos padrões em "DisabledPlugins" será bloqueado como desativado e o utilizador não o poderá ativar.</translation> <translation id="8519264904050090490">URLs de exceção no manual do utilizador gerido</translation> <translation id="8544375438507658205">Processador de HTML predefinido para <ph name="PRODUCT_FRAME_NAME" /></translation> <translation id="8549772397068118889">Avisar quando estiver a visitar sites fora dos pacotes de conteúdo</translation> @@ -2280,7 +2253,6 @@ Separe os vários nomes de servidor por vírgulas. Os carateres universais (*) são permitidos. Se esta política não estiver definida, o <ph name="PRODUCT_NAME" /> tentará detetar se um servidor está na Intranet e só nesse momento irá responder a pedidos IWA. Se um servidor for detetado como Internet, os pedidos IWA serão ignorados pelo <ph name="PRODUCT_NAME" />.</translation> -<translation id="8668394701842594241">Especifica uma lista de plug-ins ativados 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 corresponder aos caracteres reais "*", "?" ou "\", pode colocar um "\" à frente daqueles. A lista de plug-ins especificada é sempre utilizada no <ph name="PRODUCT_NAME" /> se os plug-ins estiverem instalados. Os plug-ins estão marcados como ativados em "about:plugins" e os utilizadores não podem desativá-los. Tenha presente que esta política substitui DisabledPlugins e DisabledPluginsExceptions. Se esta política não for definida, o utilizador pode desativar qualquer plug-in instalado no sistema.</translation> <translation id="8672321184841719703">Versão de Atualização Automática de Destino</translation> <translation id="868068801094828689">Ativa o envio de relatórios anónimos com dados relativos à utilização e às falhas de sistema do <ph name="PRODUCT_NAME" /> para a Google e impede que os utilizadores alterem esta definição. @@ -2373,13 +2345,6 @@ contacta automaticamente o Quirks Server, transfere os ficheiros de configuração, se estiverem disponíveis, e armazena-os no dispositivo. Estes ficheiros podem ser utilizados, por exemplo, para melhorar a qualidade de visualização dos monitores ligados.</translation> -<translation id="8905426178924715309">Esta política foi descontinuada. Utilize ForceGoogleSafeSearch e ForceYouTubeSafetyMode em alternativa. Esta política é ignorada se as políticas ForceGoogleSafeSearch ou ForceYouTubeSafetyMode forem definidas. - - Força a execução de consultas na Pesquisa Web do Google através da Pesquisa segura definida como ativa e impede os utilizadores de alterar esta definição. Esta definição também força o Modo de segurança no YouTube. - - Se ativar esta definição, a Pesquisa segura na Pesquisa Google está sempre ativa. - - Se desativar esta definição ou não definir um valor, a Pesquisa segura na Pesquisa Google e no YouTube não é aplicada.</translation> <translation id="8906768759089290519">Ativar o modo de convidado</translation> <translation id="8908294717014659003">Permite-lhe definir se os Websites podem aceder a dispositivos de captura de multimédia. O acesso a dispositivos de captura de multimédia pode ser autorizado por predefinição ou o utilizador pode ser consultado sempre que um Website pretenda obter acesso a dispositivos de captura de multimédia.
diff --git a/components/policy/resources/policy_templates_ro.xtb b/components/policy/resources/policy_templates_ro.xtb index 8476f3f..d7df8e7 100644 --- a/components/policy/resources/policy_templates_ro.xtb +++ b/components/policy/resources/policy_templates_ro.xtb
@@ -212,15 +212,6 @@ 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. - - Dacă activați această setare, lista specificată de pluginuri nu este niciodată utilizată în <ph name="PRODUCT_NAME" />. Pluginurile sunt marcate ca dezactivate în „about:plugins”, iar utilizatorii nu le pot activa. - - Rețineți că această politică poate fi înlocuită de EnabledPlugins și DisabledPluginsExceptions. - - Dacă această politică este lăsată nesetată, utilizatorul poate folosi orice plugin instalat în sistem, cu excepția pluginurilor codificate incompatibile, învechite sau periculoase.</translation> <translation id="1864269674877167562">Dacă această politică este configurată ca un șir necompletat sau nu este configurată, <ph name="PRODUCT_OS_NAME" /> nu va afișa opțiunea de completare automată în timpul procesului de conectare a utilizatorului. Dacă această politică este configurată ca un șir care reprezintă un nume de domeniu, <ph name="PRODUCT_OS_NAME" /> va afișa opțiunea de completare automată în timp ce utilizatorul se conectează. Astfel, utilizatorul poate introduce doar numele său de utilizator, fără extensia numelui de domeniu. Utilizatorul va putea să suprascrie extensia numelui de domeniu.</translation> <translation id="1865417998205858223">Permisiunile privind certificatele</translation> @@ -825,11 +816,6 @@ <translation id="3660562134618097814">Transferă cookie-urile unui furnizor de identitate SAML în timpul conectării</translation> <translation id="3709266154059827597">Configurează lista neagră pentru instalarea extensiilor</translation> <translation id="3711895659073496551">Suspendați</translation> -<translation id="3715448429089775791">Forțează activarea Modului sigur pe YouTube și împiedică utilizatorii să schimbe această setare. - - Dacă activezi această setare, Modul sigur pe YouTube este activ întotdeauna. - - Dacă această setare este dezactivată sau nu este configurată, nu se impune Modul sigur pe YouTube.</translation> <translation id="3750220015372671395">Blochează generarea cheilor pe aceste site-uri</translation> <translation id="3756011779061588474">Blocați modul pentru dezvoltatori</translation> <translation id="3758089716224084329">Îți permite să specifici serverul proxy folosit de <ph name="PRODUCT_NAME" /> și împiedică utilizatorii să modifice setările de proxy. @@ -2004,12 +1990,6 @@ Identificatorii recunoscuți pentru tipurile de conexiune sunt „ethernet”, „wifi”, „wimax”, „bluetooth” și „cellular”.</translation> <translation id="7763614521440615342">Afișează sugestii privind conținutul pe pagina Filă nouă</translation> -<translation id="7766336524667238790">Raportează informații privind sesiunea chioșc activă, cum ar fi - ID-ul și versiunea aplicației. - - Dacă politica este dezactivată, informațiile privind sesiunea nu vor fi - raportate. Dacă politica este activată sau nu este configurată, informațiile privind sesiunea vor fi - reportate.</translation> <translation id="7774768074957326919">Utilizează setările proxy-ului pentru sistem</translation> <translation id="7775831859772431793">Poți specifica adresa URL a serverului proxy aici. @@ -2232,6 +2212,10 @@ <translation id="8369602308428138533">Interval până la oprirea ecranului la funcționarea pe c.a.</translation> <translation id="8382184662529825177">Permiteți utilizarea atestării la distanță pentru protejarea conținutului pe dispozitiv</translation> <translation id="838870586332499308">Activează roamingul de date</translation> +<translation id="8390049129576938611">Dezactivează vizualizatorul PDF intern în <ph name="PRODUCT_NAME" />. Îl tratează ca pe o descărcare și permite utilizatorului să deschidă fișierele PDF folosind aplicația prestabilită. + + Dacă această politică nu este configurată sau este dezactivată, pluginul PDF va fi folosit pentru a deschide fișierele PDF, dacă utilizatorul nu îl dezactivează.</translation> +<translation id="8402079500086185021">Deschide întotdeauna fișierele PDF extern</translation> <translation id="8412312801707973447">Această politică stabilește dacă sunt efectuate verificări OCSP/CRL online</translation> <translation id="8413348101535146315">Activează oprirea proceselor în Managerul de activități din <ph name="PRODUCT_NAME" />. @@ -2252,17 +2236,6 @@ Pentru exemple de șabloane, accesează https://www.chromium.org/developers/how-tos/chrome-frame-getting-started.</translation> <translation id="8493645415242333585">Dezactivează salvarea istoricului browserului</translation> <translation id="8499172469244085141">Setări prestabilite (utilizatorii le pot ignora)</translation> -<translation id="8501011084242226370">Specifică o listă de pluginuri pe care utilizatorul le poate activa sau dezactiva în <ph name="PRODUCT_NAME" />. - - Metacaracterele „*” și „?” pot fi folosite pentru a corespunde unor secvențe de caractere arbitrare. „*” corespunde unui număr arbitrar de caractere, iar „?” corespunde unui singur caracter opțional, adică unui caracter sau niciunuia. Pentru a folosi chiar caracterele „*”, „?” sau „\”, puteți insera un caracter „\” în fața lor, numit și caracter escape. - - Dacă activați această setare, pluginurile din lista specificată pot fi folosite în <ph name="PRODUCT_NAME" />. Utilizatorii pot activa sau dezactiva pluginurile în „about:plugins”, chiar dacă pluginul corespunde și unui șablon din DisabledPlugins. Utilizatorii pot activa și dezactiva și pluginurile care nu corespund niciunui șablon din DisabledPlugins, DisabledPluginsExceptions și EnabledPlugins. - - Scopul acestei politici este să permită trecerea strictă a pluginurilor în lista neagră, în cazul în care lista „DisabledPlugins” conține intrări cu metacaractere, cum ar fi „*” pentru dezactivarea tuturor pluginurilor sau „*Java*” pentru dezactivarea tuturor pluginurilor Java, dar administratorul dorește să activeze anumite versiuni, cum ar fi „IcedTea Java 2.3”. Aceste versiuni pot fi specificate în această politică. - - Rețineți că atât numele pluginului, cât și numele grupului de pluginuri trebuie să fie excluse. Fiecare grup de pluginuri este afișat într-o secțiune separată în about:plugins; fiecare secțiune poate avea unul sau mai multe pluginuri. De exemplu, pluginul „Shockwave Flash” aparține grupului „Adobe Flash Player” și ambele nume trebuie să corespundă cu intrări din lista de excepții, dacă acel plugin trebuie exclus din lista neagră. - - Dacă politica nu este configurată, pluginurile care corespund șabloanelor din „DisabledPlugins” vor fi dezactivate și blocate, iar utilizatorul nu le va putea activa.</translation> <translation id="8519264904050090490">Adrese URL pentru excepții adăugate manual ale utilizatorilor gestionați</translation> <translation id="8544375438507658205">Motor de redare HTML prestabilit pentru <ph name="PRODUCT_FRAME_NAME" /></translation> <translation id="8549772397068118889">Avertisment la accesarea site-urilor din afara pachetelor de conținut</translation> @@ -2297,7 +2270,6 @@ Separă numele serverelor prin virgulă. Sunt permise metacaracterele (*). Dacă politica nu este configurată, <ph name="PRODUCT_NAME" /> va încerca să detecteze dacă un anumit server se află în intranet și numai după aceea va răspunde la solicitările IWA. Dacă un server este detectat ca fiind pe internet, <ph name="PRODUCT_NAME" /> va ignora solicitările IWA trimise de acesta.</translation> -<translation id="8668394701842594241">Specifică o listă de pluginuri care sunt activate în <ph name="PRODUCT_NAME" /> și împiedică modificarea acestei setări de către utilizatori. Pentru a crea corespondențe între 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 realiza corespondența cu caracterele „*”, „?” și „\” în sine, puteți plasa caracterul „\” în fața acestora. Lista specificată de pluginuri este întotdeauna utilizată în <ph name="PRODUCT_NAME" /> în cazul în care acestea sunt instalate. Pluginurile sunt marcate ca activate în „about:plugins”, iar utilizatorii nu le pot dezactiva. Rețineți că această politică are prioritate atât față de DisabledPlugins, cât și față de DisabledPluginsExceptions. Dacă această politică rămâne nesetată, utilizatorul poate dezactiva toate pluginurile instalate în sistem.</translation> <translation id="8672321184841719703">Versiune țintă pentru actualizări automate</translation> <translation id="868068801094828689">Activează raportarea anonimă la Google a datelor privind utilizarea și blocările produsului <ph name="PRODUCT_NAME" /> și împiedică utilizatorii să modifice această setare. @@ -2396,13 +2368,6 @@ contacta automat Quirks Server și va descărca fișierele de configurare, dacă sunt disponibile, apoi le va stoca pe dispozitiv. Astfel de fișiere pot, de exemplu, să fie folosite pentru a îmbunătăți calitatea afișării de pe monitoarele atașate.</translation> -<translation id="8905426178924715309">Această politică este învechită. Folosește ForceGoogleSafeSearch și ForceYouTubeSafetyMode. Această politică va fi ignorată dacă sunt configurate politicile ForceGoogleSafeSearch sau ForceYouTubeSafetyMode. - - Forțează activarea Căutării sigure pentru interogările de pe Căutarea Google pe web și nu permite utilizatorilor să modifice această setare. De asemenea, această setare impune Modul sigur pe YouTube. - - Dacă activezi această setare, Căutarea sigură va fi întotdeauna activă pentru Căutarea Google și YouTube. - - Dacă dezactivezi această setare sau nu configurezi nicio valoare, nu se va impune Căutarea sigură pentru Căutarea Google și YouTube.</translation> <translation id="8906768759089290519">Activați modul pentru invitați</translation> <translation id="8908294717014659003">Vă permite să stabiliți dacă site-urile web au acces la dispozitivele de captură media. Accesul la dispozitivele de captură media poate fi permis în mod prestabilit sau se poate solicita confirmarea utilizatorului de fiecare dată când un site web dorește acces la dispozitivele de captură media.
diff --git a/components/policy/resources/policy_templates_ru.xtb b/components/policy/resources/policy_templates_ru.xtb index 24c038f..285d7ca 100644 --- a/components/policy/resources/policy_templates_ru.xtb +++ b/components/policy/resources/policy_templates_ru.xtb
@@ -200,15 +200,6 @@ Если правило не настроено либо для него задано значение tls1.2, <ph name="PRODUCT_NAME" /> не выполняет откат. При этом поддержка предыдущих версий TLS не отключается. Правило лишь определяет, будет ли <ph name="PRODUCT_NAME" /> пытаться установить соединение с серверами, которые не могут выполнить согласование версий. Если поддерживать совместимость с неисправным сервером необходимо, установите значение tls1.1. Однако помните, что это временная мера и ошибки на сервере следует устранить как можно скорее.</translation> -<translation id="1861037019115362154">Задает список плагинов, которые должны быть отключены в <ph name="PRODUCT_NAME" />, и запрещает пользователям изменять его. - - Для замены отдельных символов или их последовательностей можно использовать подстановочные знаки: звездочку (*) и вопросительный знак (?). Звездочка заменяет любое количество символов, а вопросительный знак соответствует одному символу или его отсутствию. Чтобы ввести символ звездочки или вопросительный знак как таковой, добавьте перед ним обратную косую черту (\). - - Если этот параметр включен, указанные плагины заблокированы в <ph name="PRODUCT_NAME" /> и отмечены на странице about:plugins как отключенные. Пользователи не могут их включить. - - Обратите внимание на то, что правила DisabledPlugins и DisabledPluginsExceptions имеют приоритет перед этим правилом. - - Если это правило не настроено, пользователи могут использовать любые установленные плагины, кроме заведомо несовместимых, устаревших и вредоносных.</translation> <translation id="1864269674877167562">Если правило не настроено или его значение не задано, <ph name="PRODUCT_OS_NAME" /> не будет включать автозаполнение в процессе входа в аккаунт. Если вы укажете в качестве значения доменное имя, <ph name="PRODUCT_OS_NAME" /> включит автозаполнение. После этого при входе в аккаунт можно будет вводить только имя пользователя (без домена). При необходимости пользователь сможет указать другой домен вместо предложенного.</translation> <translation id="1865417998205858223">Позволяет разрешать или запрещать использование ключей</translation> @@ -807,11 +798,6 @@ <translation id="3660562134618097814">Позволяет передавать файлы cookie поставщика услуг аутентификации SAML при входе в аккаунт</translation> <translation id="3709266154059827597">Настройка черного списка расширений</translation> <translation id="3711895659073496551">Спящий режим</translation> -<translation id="3715448429089775791">Позволяет включить безопасный режим YouTube и запретить пользователям изменять эту настройку. - - Указав значение True, вы включите безопасный режим на YouTube. - - Если вы укажете значение False или не станете настраивать правило, безопасный режим принудительно включаться не будет.</translation> <translation id="3750220015372671395">Блокировать создание ключей на этих сайтах</translation> <translation id="3756011779061588474">Блокировать режим разработчика</translation> <translation id="3758089716224084329">Позволяет задать прокси-сервер для сервиса "<ph name="PRODUCT_NAME" />" и запретить пользователям менять его настройки. @@ -1972,9 +1958,6 @@ Поддерживаются следующие типы подключений: ethernet, wifi, wimax, bluetooth и cellular.</translation> <translation id="7763614521440615342">Показывать рекомендации на странице быстрого доступа</translation> -<translation id="7766336524667238790">Позволяет отправлять отчеты об активных сеансах киоска, включающие, например, идентификатор и версию приложения. - - Если вы укажете значение False, информация о сеансе передаваться не будет.</translation> <translation id="7774768074957326919">Использовать системные настройки прокси-сервера</translation> <translation id="7775831859772431793">Здесь указывается URL прокси-сервера. @@ -2194,6 +2177,10 @@ <translation id="8369602308428138533">Задержка отключения экрана при работе от сети</translation> <translation id="8382184662529825177">Включает удаленную проверку защиты контента для устройства</translation> <translation id="838870586332499308">Включить роуминг данных</translation> +<translation id="8390049129576938611">Отключить встроенное средство просмотра PDF-файлов в <ph name="PRODUCT_NAME" /> и разрешить пользователю открывать их в приложении, установленном по умолчанию. + + Если правило не задано или отключено, для просмотра PDF-файлов будет использоваться плагин PDF (если он не отключен пользователем).</translation> +<translation id="8402079500086185021">Всегда открывать PDF-файлы во внешнем приложении</translation> <translation id="8412312801707973447">Выполняются ли проверки OCSP/CRL в режиме онлайн</translation> <translation id="8413348101535146315">Разрешает завершение процессов в диспетчере задач <ph name="PRODUCT_NAME" />. @@ -2214,17 +2201,6 @@ Примеры шаблонов приведены здесь: http://www.chromium.org/developers/how-tos/chrome-frame-getting-started.</translation> <translation id="8493645415242333585">Отключить сохранение истории браузера</translation> <translation id="8499172469244085141">Настройки по умолчанию (пользователи могут менять)</translation> -<translation id="8501011084242226370">Создание списка плагинов, которые пользователи могут включать или отключать в <ph name="PRODUCT_NAME" /> - - Поддерживаются подстановочные знаки: звездочка (*) заменяет любую последовательность символов, вопросительный знак (?) указывает на один символ или его отсутствие. Чтобы использовать звездочку или вопросительный знак в роли обычных символов, добавьте перед ними обратную косую черту (\). - - Если этот параметр включен, плагины из указанного списка можно использовать в <ph name="PRODUCT_NAME" />. Пользователи могут включать и отключать их на странице about:plugins, даже если эти плагины есть в списке DisabledPlugins или их нет в списках DisabledPlugins, DisabledPluginsExceptions и EnabledPlugins. - - Это правило позволяет добавлять исключения при строгом запрете включения плагинов. Например, если в списке DisabledPlugins используются подстановочные знаки для запрета всех плагинов (*) или всех плагинов Java (*Java*), с помощью этого правила администратор может разрешить определенные версии плагинов, например IcedTea Java 2.3. - - В списке исключений необходимо указывать и название плагина, и группу. Например, на странице about:plugins плагин Shockwave Flash входит в группу Adobe Flash Player, и оба названия должны быть в числе исключений из черного списка. - - Если это правило не настроено, все плагины, перечисленные в списке DisabledPlugins, отключены и пользователи не смогут их включить.</translation> <translation id="8519264904050090490">Исключения для URL, устанавливаемые вручную управляемыми пользователями</translation> <translation id="8544375438507658205">Средство обработки HTML в <ph name="PRODUCT_FRAME_NAME" /> по умолчанию</translation> <translation id="8549772397068118889">Предупреждать о переходе на сайт, не включенный в пакет контента</translation> @@ -2260,7 +2236,6 @@ Допускается указание названий серверов через запятую и использование подстановочных знаков (*). Если правило не задано, <ph name="PRODUCT_NAME" /> попытается определить, находится ли сервер в сети интранет, и только после этого ответит на запросы авторизации Windows. Если <ph name="PRODUCT_NAME" /> обнаружит, что сервер находится в Интернете, эти запросы будут проигнорированы.</translation> -<translation id="8668394701842594241">Задает список активных плагинов в <ph name="PRODUCT_NAME" /> и запрещает пользователю изменять этот параметр. Для замены отдельных символов или их последовательностей можно использовать подстановочные знаки: звездочку (*) и вопросительный знак (?). Звездочка заменяет любое количество символов, а вопросительный знак соответствует одному символу или его отсутствию. Чтобы ввести символ звездочки или вопросительного знака как таковой, добавьте перед ним обратную косую черту (\). Указанные плагины будут использоваться в <ph name="PRODUCT_NAME" /> при условии, что они установлены. Плагины перечислены на странице about:plugins, и пользователи могут их отключать. Обратите внимание на то, что это правило имеет приоритет перед правилами DisabledPlugins и DisabledPluginsExceptions. Если оно не настроено, пользователь может отключить любой из установленных в системе плагинов.</translation> <translation id="8672321184841719703">Выбор версии автообновления</translation> <translation id="868068801094828689">Позволяет анонимно отправлять в Google отчеты по использованию и сбоям <ph name="PRODUCT_NAME" /> и запрещает пользователям изменять эту настройку. @@ -2354,11 +2329,6 @@ и сохранять их на устройстве. Такие файлы могут использоваться, например, для улучшения качества изображения на подключенных мониторах.</translation> -<translation id="8905426178924715309">Это правило устарело. Вместо него рекомендуется использовать ForceGoogleSafeSearch и ForceYouTubeSafetyMode. Когда одно из этих правил настроено, ForceSafeSearch игнорируется. - - Указав значение True, вы включите в Google Поиске Безопасный поиск, а на YouTube – Безопасный режим. Пользователи не смогут менять эту настройку. - - Если вы укажете значение False или не станете настраивать правило, Безопасный режим и Безопасный поиск принудительно включаться не будут.</translation> <translation id="8906768759089290519">Включить гостевой режим</translation> <translation id="8908294717014659003">Позволяет указать, разрешен ли сайтам доступ к записывающим устройствам. Вы можете разрешить доступ по умолчанию либо задать настройки, при которых каждый раз, когда сайт пытается использовать камеру или микрофон, будет отображаться запрос.
diff --git a/components/policy/resources/policy_templates_sk.xtb b/components/policy/resources/policy_templates_sk.xtb index 57562d4..50d5309 100644 --- a/components/policy/resources/policy_templates_sk.xtb +++ b/components/policy/resources/policy_templates_sk.xtb
@@ -200,15 +200,6 @@ 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 „\“. - - Ak toto nastavenie povolíte, doplnky uvedené v zozname nebudú v aplikácii <ph name="PRODUCT_NAME" /> nikdy použité. V príkaze „about:plugins“ sa doplnky zobrazia ako zakázané a používatelia ich nebudú môcť aktivovať. - - Toto pravidlo je možné nahradiť pravidlami EnabledPlugins a DisabledPluginsExceptions. - - Ak toto pravidlo ponecháte nenastavené, používateľ bude môcť použiť ľubovoľný doplnok nainštalovaný v systéme okrem doplnkov, ktoré sú nekompatibilne zakódované, zastarané alebo nebezpečné.</translation> <translation id="1864269674877167562">Ak nie je toto pravidlo nakonfigurované alebo ak je nastavené na prázdny textový reťazec, <ph name="PRODUCT_OS_NAME" /> nezobrazí počas procesu prihlásenia možnosť automatického dopĺňania. Ak je toto pravidlo nastavené na textový reťazec, ktorý zastupuje názov domény, <ph name="PRODUCT_OS_NAME" /> zobrazí počas procesu prihlásenia možnosť automatického dopĺňania. Takto bude môcť používateľ zadávať iba používateľské meno bez prípony s názvom domény. Používateľ bude môcť príponu s názvom domény prepísať.</translation> <translation id="1865417998205858223">Kľúčové povolenia</translation> @@ -855,11 +846,6 @@ <translation id="3660562134618097814">Preniesť súbory cookie poskytovateľa identity SAML počas prihlásenia</translation> <translation id="3709266154059827597">Konfigurovať zoznam rozšírení, ktorých inštalácia je zakázaná</translation> <translation id="3711895659073496551">Režim spánku</translation> -<translation id="3715448429089775791">Vynúti aktiváciu Bezpečnostného režimu v službe YouTube a zabráni používateľom meniť toto nastavenie. - - Ak toto nastavenie povolíte, Bezpečnostný režim v službe YouTube bude vždy aktívny. - - Ak toto nastavenie zakážete alebo nenastavíte žiadnu hodnotu, Bezpečnostný režim v službe YouTube nebude vynucovaný.</translation> <translation id="3750220015372671395">Blokovať generovanie kľúčov na týchto weboch</translation> <translation id="3756011779061588474">Blokovať režim pre vývojárov</translation> <translation id="3758089716224084329">Umožňuje špecifikovať proxy server, ktorý bude <ph name="PRODUCT_NAME" /> používať, a bráni používateľom zmeniť nastavenia proxy servera. @@ -2118,12 +2104,6 @@ Medzi uznávané identifikátory typov pripojení patria "ethernet", "wifi", "wimax", "bluetooth" a "cellular".</translation> <translation id="7763614521440615342">Zobrazovať návrhy obsahu na stránke na novej karte</translation> -<translation id="7766336524667238790">Nahlasuje informácie o aktívnej relácii režimu verejného terminálu, ako sú - identifikátor a verzia aplikácie. - - Ak je pravidlo nastavené na možnosť False, informácie o relácii sa nebudú - nahlasovať. Ak je pravidlo nastavené na možnosť True alebo nie je nastavené vôbec, informácie o relácii sa budú - nahlasovať.</translation> <translation id="7774768074957326919">Použiť systémové nastavenia servera proxy</translation> <translation id="7775831859772431793">Tu môžete zadať webovú adresu proxy servera. @@ -2360,6 +2340,10 @@ <translation id="8369602308428138533">Oneskorenie vypnutia obrazovky pri používaní napájacieho zdroja</translation> <translation id="8382184662529825177">Povoliť použitie vzdialeného overenia na ochranu obsahu pre zariadenie</translation> <translation id="838870586332499308">Povoliť roaming pre dátové prenosy</translation> +<translation id="8390049129576938611">Zakáže v prehliadači <ph name="PRODUCT_NAME" /> interný zobrazovač súborov PDF. Súbory PDF sa budú sťahovať a používateľ ich bude môcť otvoriť v predvolenej aplikácii. + + Ak toto pravidlo ponecháte nenastavené alebo deaktivované, súbory PDF sa budú otvárať pomocou doplnku PDF (ak ho používateľ nezakáže).</translation> +<translation id="8402079500086185021">Vždy otvárať súbory PDF externe</translation> <translation id="8412312801707973447">Či sa majú vykonávať kontroly OCSP/CRL online</translation> <translation id="8413348101535146315">Umožňuje ukončiť procesy v Správcovi úloh prehliadača <ph name="PRODUCT_NAME" />. @@ -2380,17 +2364,6 @@ Príklady vzorov nájdete na adrese http://www.chromium.org/developers/how-tos/chrome-frame-getting-started.</translation> <translation id="8493645415242333585">Zakázať ukladanie histórie prehliadača</translation> <translation id="8499172469244085141">Predvolené nastavenia (používatelia ich môžu nahradiť)</translation> -<translation id="8501011084242226370">Určuje zoznam doplnkov, ktoré používateľ v aplikácii <ph name="PRODUCT_NAME" /> môže povoliť alebo zakázať. - - Zástupnými znakmi „*“ a „?“ je možné nahradiť sekvenciu ľubovoľných znakov. Znak „*“ zodpovedá ľubovoľnému počtu znakov a znak „?“ určuje jeden voliteľný znak, t. j. zodpovedá žiadnemu alebo jednému znaku. Riadiaci znak je „\“. Ak chcete, aby znaky „*“ alebo „?“ zodpovedali skutočným znakom, môžete pred ne vložiť znak „\“. - - Ak toto nastavenie aktivujete, môže byť v aplikácii <ph name="PRODUCT_NAME" /> použitý špecifikovaný zoznam doplnkov. Používatelia môžu doplnok aktivovať alebo deaktivovať na stránke about:plugins aj v prípade, že doplnok zodpovedá vzoru v zozname DisabledPlugins. Používatelia môžu tiež aktivovať a deaktivovať doplnky, ktoré nezodpovedajú žiadnemu vzoru v zozname DisabledPlugins, DisabledPluginsExceptions alebo EnabledPlugins. - - Toto pravidlo má umožniť zakázanie doplnkov tam, kde zoznam DisabledPlugins obsahuje zástupné znaky, ako napríklad deaktivovať všetky doplnky „*“ alebo deaktivovať všetky doplnky Java „'*Java*“, avšak správca si želá zachovať určité verzie, napríklad „IcedTea Java 2.3“. Túto konkrétnu verziu je možné určiť v tomto pravidle. - - Upozorňujeme, že je potrebné vylúčiť názov doplnku aj názov skupiny doplnkov. Jednotlivé skupiny doplnkov sa zobrazujú v samostatných častiach na stránke about:plugins a každá časť môže obsahovať jeden alebo viacero doplnkov. Doplnok Shockwave Flash napríklad patrí do skupiny Adobe Flash Player. A ak má byť doplnok vylúčený zo zoznamu zakázaných položiek, musia byť v zozname výnimiek uvedené obidva názvy. - - Ak pravidlo nie je nastavené, bude akýkoľvek doplnok, ktorý zodpovedá vzoru v zozname DisabledPlugins, uzamknutý ako deaktivovaný a používatelia ho nebudú môcť aktivovať.</translation> <translation id="8519264904050090490">Spravované výnimky webových adries ručne nastavené používateľom</translation> <translation id="8544375438507658205">Predvolený vykresľovací modul HTML pre doplnok <ph name="PRODUCT_FRAME_NAME" /></translation> <translation id="8549772397068118889">Upozorniť na návštevu stránky, ktorá je mimo balíkov obsahu</translation> @@ -2418,15 +2391,6 @@ Ak chcete zadať niekoľko názvov serverov, oddeľte ich čiarkami. Zástupné znaky (*) sú povolené. Ak pravidlo zostane nenastavené, prehliadač <ph name="PRODUCT_NAME" /> sa najprv pokúsi zistiť, či sa server nachádza v sieti intranet, a až potom bude reagovať na žiadosti IWA. Ak sa zistí, že je server v sieti internet, prehliadač <ph name="PRODUCT_NAME" /> bude žiadosti IWA ignorovať.</translation> -<translation id="8668394701842594241">Určuje zoznam povolených doplnkov prehliadača <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 chýbajúci znak). Znak zrušenia významu je „\“, takže ak chcete zadať samotné znaky „*“, „?“ alebo „\“, stačí pred ne umiestniť znak „\“. - - Uvedený zoznam doplnkov je v prehliadači <ph name="PRODUCT_NAME" /> použitý vždy, keď sú doplnky nainštalované. Doplnky sú v príkaze „about:plugins“ označené ako povolené a používatelia ich nemôžu zakázať. - - Toto pravidlo nahrádza pravidlá DisabledPlugins a DisabledPluginsExceptions. - - Ak toto pravidlo ponecháte nenastavené, používateľ môže zakázať ľubovoľný doplnok nainštalovaný v systéme.</translation> <translation id="8672321184841719703">Cieľová verzia automatickej aktualizácie</translation> <translation id="868068801094828689">Povolí nahlasovanie údajov týkajúcich sa používania a zlyhaní prehliadača <ph name="PRODUCT_NAME" /> do spoločnosti Google a zabráni používateľom toto nastavenie zmeniť. @@ -2512,13 +2476,6 @@ automaticky kontaktuje server Quirks a stiahne konfiguračné súbory, ak budú k dispozícii, a uloží ich na zariadení. Tieto súbory je možné použiť napríklad na vylepšenie kvality zobrazenia na pripojených monitoroch.</translation> -<translation id="8905426178924715309">Podpora tohto pravidla je ukončená. Použite namiesto neho pravidlá ForceGoogleSafeSearch a ForceYouTubeSafetyMode. Ak nastavíte pravidlo ForceGoogleSafeSearch alebo ForceYouTubeSafetyMode, pôvodné pravidlo sa bude ignorovať. - - Vynucuje vyhľadávanie dopytov vo Vyhľadávaní Google na webe pomocou aktívneho Bezpečného vyhľadávania a zabraňuje používateľom toto nastavenie zmeniť. Toto nastavenie tiež vynucuje použitie Bezpečného režimu v službe YouTube. - - Ak toto nastavenie povolíte, Bezpečné vyhľadávanie bude vo Vyhľadávaní Google a službe YouTube vždy aktívne. - - Ak toto nastavenie zakážete alebo nenastavíte žiadnu hodnotu, Bezpečné vyhľadávanie vo Vyhľadávaní Google a službe YouTube vynucované nebude.</translation> <translation id="8906768759089290519">Povoliť režim hosťa</translation> <translation id="8908294717014659003">Umožňuje nastaviť, či webové stránky budú môcť používať zariadenia na zaznamenávanie médií. Prístup k zariadeniam na zaznamenávanie médií môže byť povolený v predvolenom nastavení alebo sa používateľovi môže zobraziť dopyt zakaždým, keď nejaké webové stránky budú chcieť použiť zariadenie na zaznamenávanie médií.
diff --git a/components/policy/resources/policy_templates_sl.xtb b/components/policy/resources/policy_templates_sl.xtb index 1e63751..742c49f5 100644 --- a/components/policy/resources/policy_templates_sl.xtb +++ b/components/policy/resources/policy_templates_sl.xtb
@@ -209,15 +209,6 @@ Č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 \. - - Če to nastavitev omogočite, določen seznam vtičnikov v brskalniku <ph name="PRODUCT_NAME" /> ni nikoli uporabljen. Vtičniki so v »about:plugins« označeni kot onemogočeni in uporabniki jih ne morejo omogočiti. - - Ta pravilnik lahko preglasita pravilnika »EnabledPlugins« in »DisabledPluginsExceptions«. - - Če ta pravilnik ni nastavljen, lahko uporabnik uporabi kateri koli vtičnik, nameščen v sistemu, razen vtičnikov, ki so vdelani neposredno v izvorno kodo, nezdružljivi, zastareli ali nevarni.</translation> <translation id="1864269674877167562">Če je ta pravilnik nastavljen na prazen niz ali ni nastavljen, sistem <ph name="PRODUCT_OS_NAME" /> med potekom prijave uporabnika ne bo prikazal možnosti samodokončanja. Če je ta pravilnik nastavljen na niz, ki predstavlja ime domene, bo <ph name="PRODUCT_OS_NAME" /> pri prijavi uporabnika prikazal možnost samodokončanja, s čimer bo uporabniku omogočeno, da vnese samo uporabniško ime brez končnice imena domene. Uporabnik bo lahko prepisal končnico tega imena domene.</translation> <translation id="1865417998205858223">Glavna dovoljenja</translation> @@ -862,11 +853,6 @@ <translation id="3660562134618097814">Prenesi piškotke SAML IdP pri prijavi</translation> <translation id="3709266154059827597">Nastavi seznam razširitev, katerih namestitev je prepovedana</translation> <translation id="3711895659073496551">Prekinitev</translation> -<translation id="3715448429089775791">Vsili izvajanje varnega načina v YouTubu in uporabnikom prepreči spreminjanje te nastavitve. - - Če to nastavitev omogočite, je varni način v YouTubu vedno aktiven. - - Če to nastavitev onemogočite ali ne nastavite vrednosti, varni način v YouTubu ni uveljavljen.</translation> <translation id="3750220015372671395">Blokiraj ustvarjanje ključev na teh spletnih mestih</translation> <translation id="3756011779061588474">Blokiranje načina za razvijalce</translation> <translation id="3758089716224084329">Omogoča nastavitev strežnika proxy, ki ga uporablja <ph name="PRODUCT_NAME" />, in preprečuje uporabnikom spreminjanje nastavitev strežnika proxy. @@ -2133,12 +2119,6 @@ Prepoznani identifikatorji vrste povezav so »ethernet«, »wifi«, »wimax«, »bluetooth« in »cellular«.</translation> <translation id="7763614521440615342">Prikaz predlogov vsebine na strani »Nov zavihek«</translation> -<translation id="7766336524667238790">Poročanje podatkov o aktivni seji kioska, na primer - ID-ja in različice aplikacije. - - Če je pravilnik onemogočen, se podatki o seji ne - poročajo. Če je omogočen ali ni nastavljen, se podatki o seji - poročajo.</translation> <translation id="7774768074957326919">Uporaba sistemskih nastavitev proxyja</translation> <translation id="7775831859772431793">Tu lahko določite URL strežnika proxy. @@ -2374,6 +2354,10 @@ <translation id="8369602308428138533">Časovni zamik izklopa zaslona, če se napaja iz električnega omrežja</translation> <translation id="8382184662529825177">Omogoči uporabo oddaljenega potrjevanja za zaščito vsebine za napravo</translation> <translation id="838870586332499308">Omogoči podatkovno gostovanje</translation> +<translation id="8390049129576938611">V brskalniku <ph name="PRODUCT_NAME" /> onemogoči notranji pregledovalnik PDF-jev. Namesto tega ga obravnava kot prenos in uporabniku omogoča odpiranje datotek PDF s privzeto aplikacijo. + + Če ta pravilnik ni nastavljen ali je onemogočen, se bo za odpiranje datotek PDF uporabljal vtičnik za PDF-je, razen če ga uporabnik onemogoči.</translation> +<translation id="8402079500086185021">Vedno odpri datoteke PDF na zunanjem mestu</translation> <translation id="8412312801707973447">Ali se izvaja spletni pregled OCSP/CRL</translation> <translation id="8413348101535146315">Omogoča procese prekinitve v upravitelju opravil izdelka <ph name="PRODUCT_NAME" />. @@ -2394,17 +2378,6 @@ Primere vzorcev si lahko ogledate na https://www.chromium.org/developers/how-tos/chrome-frame-getting-started.</translation> <translation id="8493645415242333585">Onemogoči shranjevanje zgodovine brskalnika</translation> <translation id="8499172469244085141">Privzete nastavitve (uporabniki jih lahko preglasijo)</translation> -<translation id="8501011084242226370">Določi seznam vtičnikov, ki jih lahko uporabnik omogoči ali onemogoči v brskalniku <ph name="PRODUCT_NAME" />. - - Nadomestna znaka »*« in »?« lahko uporabite za ujemanje z zaporedji poljubnih znakov. Znak »*« uporabite za ujemanje s poljubnim številom znakov, znak »?« pa za izbiren posamezni znak, tj. za ujemanja z nič ali enim znakom. Ubežni znak je »\«, zato morate za ujemanje z dejanskimi znaki »*«, »?« ali »\« pred njih dati »\«. - - Če omogočite to nastavitev, je mogoče navedeni seznam vtičnikov uporabiti v brskalniku <ph name="PRODUCT_NAME" />. Uporabniki jih lahko omogočijo ali onemogočijo v polju »about:plugins«, tudi če se vtičnik ujema tudi z vzorcem na seznamu »DisabledPlugins«. Uporabniki lahko prav tako omogočijo in onemogočijo vtičnike, ki se ne ujemajo z vzorci na seznamih »DisabledPlugins«, »DisabledPluginsExceptions« in »EnabledPlugins«. - - Ta pravilnik je namenjen omogočanju strogega seznama blokiranih vtičnikov, pri čemer so na seznamu »DisabledPlugins« vnosi z nadomestnimi znaki, na primer »onemogoči vse vtičnike« (*) ali »onemogoči vse vtičnike Java« (*Java*), vendar želi skrbnik omogočiti določeno različico, na primer »IcedTea Java 2.3«. Te različice je mogoče navesti v tem pravilniku. - - Ime vtičnika in skupinsko ime vtičnika morata biti izvzeta. Vsaka skupina vtičnikov je v polju »about:plugins« prikazana v ločenem razdelku; v vsakem razdelku je morda več vtičnikov. Vtičnik »Shockwave Flash« na primer spada v skupino »Adobe Flash Player« in obe imeni morata biti navedeni na seznamu izjem, če želite, da je ta vtičnik izvzet s seznama blokiranih vtičnikov. - - Če ta pravilnik ni nastavljen, bodo vsi vtičniki, ki se ujemajo z vzorci na seznamu »DisabledPlugins«, onemogočeni z zaklepanjem in uporabnik jih ne bo mogel omogočiti.</translation> <translation id="8519264904050090490">URL-ji ročnih izjem za upravljanega uporabnika</translation> <translation id="8544375438507658205">Privzeti upodabljalnik HTML-ja za <ph name="PRODUCT_FRAME_NAME" /></translation> <translation id="8549772397068118889">Opozori pri odpiranju spletnih mest zunaj paketov vsebine</translation> @@ -2440,15 +2413,6 @@ Imena strežnikov ločite z vejicami. Nadomestni znaki (*) so dovoljeni. Če tega pravilnika ne nastavite, <ph name="PRODUCT_NAME" /> poskuša zaznati, ali je strežnik v intranetu, in se šele potem odzove na zahteve IWA. Če je strežnik zaznan kot internet, <ph name="PRODUCT_NAME" /> prezre zahteve IWA, poslane iz tega strežnika.</translation> -<translation id="8668394701842594241">Določa 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 \. - - Določen seznam vtičnikov je v brskalniku <ph name="PRODUCT_NAME" /> vedno uporabljen, če so nameščeni. Vtičniki so v »about:plugins« označeni kot omogočeni in uporabniki jih ne morejo onemogočiti. - - Ta pravilnik preglasi pravilnika »DisabledPlugins« in »DisabledPluginsExceptions«. - - Če ta pravilnik ni nastavljen, lahko uporabnik onemogoči kateri koli vtičnik, nameščen v sistemu.</translation> <translation id="8672321184841719703">Ciljna različica za samodejne posodobitve</translation> <translation id="868068801094828689">Omogoča anonimno pošiljanje podatkov o uporabi in zrušitvah programa <ph name="PRODUCT_NAME" /> Googlu in uporabnikom preprečuje spreminjanje te nastavitve. @@ -2557,13 +2521,6 @@ samodejno vzpostavil stik s strežnikom Quirks Server in prenesel konfiguracijske datoteke, če so na voljo, ter jih shranil v napravi. Te datoteke je mogoče na primer uporabiti za izboljšanje kakovosti prikaza priključenih monitorjev.</translation> -<translation id="8905426178924715309">Ta pravilnik je zastarel, uporabite ForceGoogleSafeSearch in ForceYouTubeSafetyMode. Ta pravilnik bo prezrt, če je nastavljen pravilnik ForceGoogleSafeSearch ali ForceYouTubeSafetyMode. - - Uveljavi izvajanje poizvedb v Google Spletnem iskanju z aktiviranim Varnim iskanjem in uporabnikom prepreči spreminjanje te nastavitve. Ta nastavitev uveljavi tudi varni način v YouTubu. - - Če to nastavitev omogočite, je Google Varno iskanje v Iskanju Google in YouTubu vedno aktivno. - - Če to nastavitev onemogočite ali ne nastavite vrednosti, Varno iskanje v Iskanju Google in YouTubu ni uveljavljeno.</translation> <translation id="8906768759089290519">Omogoči način gosta</translation> <translation id="8908294717014659003">Omogoča nastavitev, ali je spletnim mestom dovoljen dostop do naprav za snemanje predstavnosti. Dostop do naprav za snemanje predstavnosti je lahko privzeto dovoljen ali pa uporabnik dobi poziv, kadar koli spletno mesto želi dostop do naprav za snemanje predstavnosti.
diff --git a/components/policy/resources/policy_templates_sr.xtb b/components/policy/resources/policy_templates_sr.xtb index 60622650..e16e85ae 100644 --- a/components/policy/resources/policy_templates_sr.xtb +++ b/components/policy/resources/policy_templates_sr.xtb
@@ -208,15 +208,6 @@ Ако не конфигуришете ове смернице или их подесите на „tls1.2“, <ph name="PRODUCT_NAME" /> више неће обављати ово враћање на старије верзије. Имајте на уму да овим не онемогућавате подршку за старије верзије TLS-а, већ само одређујете да ли ће <ph name="PRODUCT_NAME" /> функционисати са серверима који садрже пуно грешака и који не могу исправно да обављају прилагођавања верзија. У супротном, ако мора да се одржава компатибилност са сервером који садржи пуно грешака, можете да подесите ове смернице на „tls1.1“. То је привремена мера и треба брзо поправити сервер.</translation> -<translation id="1861037019115362154">Наводи листу додатних компоненти које су онемогућене у <ph name="PRODUCT_NAME" />-у и спречава кориснике да мењају ово подешавање. - - Џокерски знакови „*“ и „?“ могу да се користе за подударање низова произвољних знакова. Знак „*“ одговара произвољном броју знакова, а знак „?“ одређује опционални појединачни знак, тј. подудара се са нула или једним знаком. Искочни знак је „\“, па за подударање стварних знакова „*“, „?“ или „\“ можете да ставите „\“ испред њих. - - Ако омогућите ово подешавање, наведена листа додатних компоненти се никада не користи у <ph name="PRODUCT_NAME" />-у. Додатне компоненте су означене као онемогућене у смерницама „about:plugins“ и корисници не могу да их омогуће. - - Имајте у виду да EnabledPlugins и DisabledPluginsExceptions могу да занемаре ове смернице. - - Ако ове смернице нису подешене, корисник може да користи било коју додатну компоненту која је инсталирана на систему осим додатних компоненти које су некомпатибилне у изворном коду, застареле или опасне.</translation> <translation id="1864269674877167562">Ако подесите ове смернице на празан стринг или их не конфигуришете, <ph name="PRODUCT_OS_NAME" /> неће приказивати опцију за аутоматско довршавање у току пријављивања корисника. Ако подесите ове смернице на стринг који представља име домена, <ph name="PRODUCT_OS_NAME" /> ће приказивати опцију за аутоматско довршавање током пријављивања корисника, што кориснику омогућава да унесе само корисничко име без наставка са именом домена. Корисник ће моћи да замени овај наставак са именом домена.</translation> <translation id="1865417998205858223">Дозволе за шифре</translation> @@ -853,11 +844,6 @@ <translation id="3660562134618097814">Преноси SAML IdP колачиће током пријављивања</translation> <translation id="3709266154059827597">Конфигуриши црну листу за инсталацију додатака</translation> <translation id="3711895659073496551">Искључи</translation> -<translation id="3715448429089775791">Намећу активирање Безбедног режима на YouTube-у и спречавају кориснике да мењају ово подешавање. - - Ако омогућите ово подешавање, Безбедни режим на YouTube-у ће увек бити активан. - - Ако онемогућите ово подешавање или не подесите вредност, Безбедни режим на YouTube-у неће бити наметнут.</translation> <translation id="3750220015372671395">Блокирај генерисање шифара на овим сајтовима</translation> <translation id="3756011779061588474">Блокирање режима програмера</translation> <translation id="3758089716224084329">Омогућава вам да наведете прокси сервер који <ph name="PRODUCT_NAME" /> користи и спречава кориснике да мењају подешавања проксија. @@ -2110,12 +2096,6 @@ Идентификатори препознатих типова веза су „ethernet“, „wifi“, „wimax“, „bluetooth“ и „cellular“.</translation> <translation id="7763614521440615342">Приказују предлоге за садржај на страници нове картице</translation> -<translation id="7766336524667238790">Шаљу информације о активној сесији киоска, попут - ИД-а и верзије апликације. - - Ако подесите смернице на Нетачно, информације о сесији се не - шаљу. Ако подесите смернице на Тачно или их не подесите, информације о сесији се - шаљу.</translation> <translation id="7774768074957326919">Користи системска подешавања проксија</translation> <translation id="7775831859772431793">Овде можете да наведете URL прокси сервера. @@ -2352,6 +2332,10 @@ <translation id="8369602308428138533">Време до искључивања екрана када је уређај прикључен на струју</translation> <translation id="8382184662529825177">Омогућавање коришћења даљинске провере за заштиту садржаја за уређај</translation> <translation id="838870586332499308">Омогућавање роминга за податке</translation> +<translation id="8390049129576938611">Онемогућава интерни PDF приказивач у <ph name="PRODUCT_NAME" />-у. Уместо тога га посматра као преузимање и омогућава кориснику да отвара PDF датотеке помоћу подразумеване апликације. + + Ако ове смернице остану неподешене или се онемогуће, додатна компонента за PDF ће се користити за отварање PDF датотека ако је корисник не онемогући.</translation> +<translation id="8402079500086185021">Увек отварај PDF датотеке у екстерној апликацији</translation> <translation id="8412312801707973447">Да ли се обављају OCSP/CRL провере на мрежи</translation> <translation id="8413348101535146315">Омогућавају заустављање процеса у <ph name="PRODUCT_NAME" /> менаџеру задатака. @@ -2372,17 +2356,6 @@ Примере образаца потражите на https://www.chromium.org/developers/how-tos/chrome-frame-getting-started.</translation> <translation id="8493645415242333585">Онемогући чување историје прегледача</translation> <translation id="8499172469244085141">Подразумевана подешавања (корисници могу да их замене)</translation> -<translation id="8501011084242226370">Наводе листу додатних компонената које корисник може да омогући или онемогући у <ph name="PRODUCT_NAME" />-у. - - Џокерски знакови „*“ и „?“ могу да се користе уместо низова насумичних знакова. „*“ може да се користи уместо насумичног броја знакова, а „?“ замењује појединачни опционални знак, тј. може да се користи уместо нула знакова или једног знака. Излазни знак је „\“, па можете да ставите „\“ испред стварних знакова „*“, „?“ или „\“ да бисте их заменили. - - Ако омогућите ово подешавање, наведена листа додатних компонената може да се користи у <ph name="PRODUCT_NAME" />-у. Корисници могу да их омогућавају или онемогућавају у „about:plugins“ чак и ако се додатна компонента подудара и са шаблоном у DisabledPlugins. Корисници такође могу да омогућавају и да онемогућавају додатне компоненте које се не подударају ни са једним шаблоном у DisabledPlugins, DisabledPluginsExceptions и EnabledPlugins. - - Сврха ових смерница је да се узме у обзир строги метод стављања додатних компонената на црну листу када листа „DisabledPlugins“ садржи уносе са џокерским знаковима, попут уноса disable all plugins „*“ или disable all Java plugins „*Java*“, али администратор жели да омогући неку конкретну верзију, попут верзије „IcedTea Java 2.3“. Ту конкретну верзију можете да наведете у овим смерницама. - - Имајте на уму да морате да изузмете и назив додатне компоненте и назив групе те додатне компоненте. Свака група додатних компонената је приказана у засебном одељку у about:plugins; сваки одељак може да садржи једну или више додатних компонената. На пример, додатна компонента „Shockwave Flash“ припада групи „Adobe Flash Player“ и за оба назива мора да постоји подударање на листи изузетака ако та додатна компонента треба да буде изузета са црне листе. - - Ако не подесите ове смернице, свака додатна компонента која се подудара са шаблонима у „DisabledPlugins“ ће бити закључана и онемогућена и корисник неће моћи да је омогући.</translation> <translation id="8519264904050090490">URL-ови за ручне изузетке корисника којим се управља</translation> <translation id="8544375438507658205">Подразумевани HTML приказивач за <ph name="PRODUCT_FRAME_NAME" /></translation> <translation id="8549772397068118889">Упозори ме када посећујем сајтове изван пакета садржаја</translation> @@ -2418,15 +2391,6 @@ Раздвојите називе различитих сервера зарезима. Џокерски знакови (*) су дозвољени. Ако не подесите ове смернице, <ph name="PRODUCT_NAME" /> ће покушати да открије да ли је сервер на интранету и само тада ће одговорити на IWA захтеве. Ако се открије да је сервер на интернету, <ph name="PRODUCT_NAME" /> ће занемарити његове IWA захтеве.</translation> -<translation id="8668394701842594241">Одређује листу додатних компоненти које су омогућене у <ph name="PRODUCT_NAME" />-у и спречава кориснике да мењају ово подешавање. - - Џокерски знакови „*“ и „?“ могу да се користе за подударање низова произвољних знакова. Знак „*“ одговара произвољном броју знакова, а „?“ наводи опционални појединачни знак, тј. подудара се са нула знакова или једним знаком. Искочни знак је „\“, па за унос стварних знакова „*“, „?“ или „\“, можете да ставите „\“ испред њих. - - Наведена листа додатних компоненти увек се користи у <ph name="PRODUCT_NAME" />-у ако су оне инсталиране. Додатне компоненте су означене као омогућене у смерницама „about:plugins“ и корисници не могу да их онемогуће. - - Имајте у виду да ове смернице замењују DisabledPlugins и DisabledPluginsExceptions. - - Ако се ове смернице не подесе, корисник може да онемогући било коју додатну компоненту која је инсталирана на систему.</translation> <translation id="8672321184841719703">Циљана верзија Аутоматских ажурирања</translation> <translation id="868068801094828689">Омогућавају да се Google-у анонимно шаљу подаци у вези са коришћењем и отказивањем о производу <ph name="PRODUCT_NAME" /> и спречавају кориснике да промене ово подешавање. @@ -2526,13 +2490,6 @@ аутоматски да контактира Quirks сервер и преузеће конфигурационе датотеке ако су доступне и сачуваће их на уређају. На пример, такве датотеке могу да се користе за побољшање квалитета приказа на прикљученим мониторима.</translation> -<translation id="8905426178924715309">Ове смернице су застареле. Требало би да користите смернице ForceGoogleSafeSearch и ForceYouTubeSafetyMode. Ове смернице ће бити занемарене ако подесите смернице ForceGoogleSafeSearch или ForceYouTubeSafetyMode. - - Намећу претрагу упита у Google веб-претрази са активираном Сигурном претрагом и спречавају кориснике да мењају то подешавање. Ово подешавање намеће и Безбедни режим на YouTube-у. - - Ако омогућите ово подешавање, Сигурна претрага ће увек бити активирана у Google претрази и на YouTube-у. - - Ако онемогућите ово подешавање или не подесите вредност, Сигурна претрага се неће принудно примењивати у Google претрази и на YouTube-у.</translation> <translation id="8906768759089290519">Омогућавање режима госта</translation> <translation id="8908294717014659003">Дозвољава вам да подесите да ли веб-сајтови могу да приступају медијским уређајима за снимање. Приступ медијским уређајима за снимање може да буде подразумевано омогућен или можемо да поставимо питање кориснику сваки пут када веб сајт жели да приступи медијским уређајима за снимање.
diff --git a/components/policy/resources/policy_templates_sv.xtb b/components/policy/resources/policy_templates_sv.xtb index 3f887a77..2e4de56 100644 --- a/components/policy/resources/policy_templates_sv.xtb +++ b/components/policy/resources/policy_templates_sv.xtb
@@ -214,15 +214,6 @@ 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. - - Om du aktiverar inställningen används aldrig den angivna listan med plugin-program i <ph name="PRODUCT_NAME" />. Plugin-programmen markeras som inaktiverade i about:plugins och kan inte aktiveras av användare. - - Observera att den här policyn kan åsidosättas av EnabledPlugins och DisabledPluginsExceptions. - - Om den här policyn inte anges kan användaren använda alla plugin-program som är installerade på datorn förutom hårdkodade inkompatibla, föråldrade eller farliga plugin-program.</translation> <translation id="1864269674877167562">Om policyn anges som en tom sträng eller inte har konfigurerats visar inte <ph name="PRODUCT_OS_NAME" /> alternativet för autoslutförande under användarens inloggningsflöde. Om policyn är inställd på en sträng som motsvarar ett domännamn visar <ph name="PRODUCT_OS_NAME" /> ett alternativ för autoslutförande under användarens inloggning så att användaren bara kan skriva sitt användarnamn utan domännamnstillägget. Användaren kan skriva över detta domännamnstillägg.</translation> <translation id="1865417998205858223">Nyckelbehörigheter</translation> @@ -867,11 +858,6 @@ <translation id="3660562134618097814">Överför SAML-cookies från identitetsleverantörer vid inloggning</translation> <translation id="3709266154059827597">Konfigurera svartlista för tilläggsinstallation</translation> <translation id="3711895659073496551">Stäng av</translation> -<translation id="3715448429089775791">Tvingar fram aktivering av Säkert läge på YouTube och förhindrar att användare ändrar inställningen. - - Om du aktiverar den här inställningen är funktionen Säkert läge på YouTube alltid aktiv. - - Om du inaktiverar den här inställningen eller inte anger något värde tvingas inte användningen av Säkert läge på YouTube fram.</translation> <translation id="3750220015372671395">Blockera nyckelgenerering på dessa webbplatser</translation> <translation id="3756011779061588474">Blockera utvecklarläget</translation> <translation id="3758089716224084329">Med den här principen kan du ange vilken proxyserver som används av <ph name="PRODUCT_NAME" /> och förhindra att användare ändrar sina proxyinställningar. @@ -2139,11 +2125,6 @@ Identifierarna för giltiga anslutningstyper är ”ethernet”, ”wifi”, ”wimax”, ”bluetooth” och ”cellular”.</translation> <translation id="7763614521440615342">Visa förslag på innehåll på sidan Ny flik</translation> -<translation id="7766336524667238790">Rapporterar information om den aktiva kiosksessionen, bland annat - app-id och appversion. - - Om principen är inställd på falskt rapporteras inte den här sessionsinformationen. - Om principen är inställd på sant eller inte har angetts rapporteras sessionsinformation.</translation> <translation id="7774768074957326919">Använd systemets proxyinställningar</translation> <translation id="7775831859772431793">Här kan du ange proxyserverns webbadress. @@ -2382,6 +2363,10 @@ <translation id="8369602308428138533">Skärmavstängningstid när enheten är ansluten till elnätet</translation> <translation id="8382184662529825177">Aktivera användning av fjärrattestering för innehållsskydd för enheten</translation> <translation id="838870586332499308">Aktivera dataroaming</translation> +<translation id="8390049129576938611">Inaktiverar den interna PDF-läsaren i <ph name="PRODUCT_NAME" />. PDF-filer behandlas i stället som nedladdningar så att användaren kan öppna dem med standardappen. + + Om den här principen inte anges eller är inaktiverad öppnas PDF-filer med PDF-pluginprogrammet såvida användaren inte inaktiverar det.</translation> +<translation id="8402079500086185021">Öppna alltid PDF-filer med en extern app</translation> <translation id="8412312801707973447">Anger huruvida OCSP/CRL-onlinekontroller ska utföras</translation> <translation id="8413348101535146315">Gör det möjligt att avsluta aktiviteter i Aktivitetshanteraren i <ph name="PRODUCT_NAME" />. @@ -2402,17 +2387,6 @@ Exempel på mönster finns på https://www.chromium.org/developers/how-tos/chrome-frame-getting-started.</translation> <translation id="8493645415242333585">Spara inte webbhistorik</translation> <translation id="8499172469244085141">Standardinställningar (kan åsidosättas av användare)</translation> -<translation id="8501011084242226370">Anger en lista med plugin-program som användaren kan aktivera eller inaktivera i <ph name="PRODUCT_NAME" />. - - Jokertecknen * och ? kan användas för att matcha följder med vilka tecken som helst. * matchar hur många tecken som helst medan ? matchar vilket enstaka tecken som helst, det vill säga 0 eller 1 tecken. Avkodningstecknet är \, så om du vill matcha just tecknen *, ? eller \ kan du sätta ett \ framför dem. - - Om du aktiverar den här inställningen kan den angivna listan med plugin-program användas i <ph name="PRODUCT_NAME" />. Användare kan aktivera eller inaktivera dem i about:plugins även om plugin-programmet också matchar ett mönster i DisabledPlugins. Användare kan också aktivera och inaktivera plugin-program som inte matchar några fönster i DisabledPlugins, DisabledPluginsExceptions och EnabledPlugins. - - Syftet med den här policyn är att möjliggöra strikt svartlistning av plugin-program om listan DisabledPlugins innehåller jokerposter som disable all plugins '*' eller disable all Java plugins *Java* men administratören vill aktivera en viss version som IcedTea Java 2.3. Den specifika versionen kan anges i den här policyn. - - Observera att både plugin-programmets namn och grupp måste undantas. Varje plugin-grupp visas i en separat del i about:plugins. Varje del kan innehålla ett eller flera plugin-program. Plugin-programmet Shockwave Flash tillhör gruppen Adobe Flash Player och båda namnen måste matcha något i undantagslistan om det plugin-programmet ska undantas från svartlistan. - - Om den här policyn inte ställs in inaktiveras alla plugin-program som matchar mönstren i DisabledPlugins och de kan inte aktiveras av användaren.</translation> <translation id="8519264904050090490">Webbadresser för hanterade användares manuella undantag</translation> <translation id="8544375438507658205">HTML-standardrenderare för <ph name="PRODUCT_FRAME_NAME" /></translation> <translation id="8549772397068118889">Varna när du besöker webbplatser utanför innehållspaket</translation> @@ -2449,15 +2423,6 @@ Avgränsa flera servernamn med kommatecken. Jokertecken (*) tillåts. Om du inte ställer in den här principen kommer <ph name="PRODUCT_NAME" /> att försöka identifiera om en server finns i intranätet och endast då kommer den att svara på IWA-förfrågningar. Om en server identifieras som internet kommer IWA-förfrågningar därifrån att ignoreras av <ph name="PRODUCT_NAME" />.</translation> -<translation id="8668394701842594241">Policyn anger en lista med plugin-program som är aktiverade i <ph name="PRODUCT_NAME" /> och förhindrar att användarna ändrar inställningen. - - Jokertecknen * och ? kan användas för att matcha sekvenser av arbiträra tecken. * matchar ett arbiträrt antal tecken medan ? specificerar ett enda valfritt tecken, det vill säga matchar noll till ett tecken. Escape-tecknet är \, så om du vill matcha de faktiska tecknen *, ? eller \ anger du \ framför dem. - - Den angivna listan med plugin-program används alltid i <ph name="PRODUCT_NAME" /> om de finns installerade. plugin-programmen aktiveras i about:plugins och kan inte inaktiveras av användarna. - - Observera att den här policyn åsidosätter både DisabledPlugins och DisabledPluginsExceptions. - - Om den här policyn inte ställs in kan användaren inaktivera alla plugin-program som finns på datorn.</translation> <translation id="8672321184841719703">Målversion för automatisk uppdatering</translation> <translation id="868068801094828689">Aktiverar anonym rapportering av användning och kraschrelaterad data om <ph name="PRODUCT_NAME" /> till Google och förhindrar att användarna ändrar inställningen. @@ -2566,13 +2531,6 @@ automatiskt att kontakta Quirks-servern och ladda ned konfigurationsfiler (i mån av tillgång) och spara dem på enheten. Sådana filer kan till exempel användas för att förbättra visningskvaliteten på anslutna skärmar.</translation> -<translation id="8905426178924715309">Den här principen har fasats ut. Använd ForceGoogleSafeSearch och ForceYouTubeSafetyMode i stället. Principen ignoreras om antingen ForceGoogleSafeSearch eller ForceYouTubeSafetyMode har angetts. - - Sökfrågor i Googles webbsökning görs obligatoriskt med SafeSearch aktiverat och användarna förhindras att ändra inställningen. Med den här inställningen blir även Säkert läge obligatoriskt på YouTube. - - Om du aktiverar den här inställningen är funktionen SafeSearch i Sök på Google och YouTube alltid aktiv. - - Om du inaktiverar inställningen eller inte anger något värde blir det inte obligatoriskt att använda SafeSearch i Sök på Google eller på YouTube.</translation> <translation id="8906768759089290519">Aktivera gästläge</translation> <translation id="8908294717014659003">Gör att du kan ange om webbplatser ska kunna komma åt medieenheter. Åtkomst till medieenheter kan tillåtas som standard eller så kan användaren få en fråga varje gång en webbplats vill komma åt dem.
diff --git a/components/policy/resources/policy_templates_sw.xtb b/components/policy/resources/policy_templates_sw.xtb index 97de64cb..4e3c983c 100644 --- a/components/policy/resources/policy_templates_sw.xtb +++ b/components/policy/resources/policy_templates_sw.xtb
@@ -203,15 +203,6 @@ Ikiwa sera hii haitawekwa au ikiwekwa kuwa "tls1.2" basi <ph name="PRODUCT_NAME" /> haitatekeleza 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. - - Ukiwezesha mpangilio huu, orodha iliyobainishwa ya programu jalizi inatumiwa katika <ph name="PRODUCT_NAME" />. Programu jalizi zinatiwa alama kama zilizolemazwa katika 'kuhusu:programu jalizi' na watumiaji hawawezi kuziwezesha. - - Fahamu kuwa sera hii inaweza kufutwa kwa EnabledPlugins na DisabledPluginsExceptions. - - Ikiwa sera hii itaachwa bila kuwekwa mtumiaji anaweza kuitumia programu jalizi yoyote iliyosakinishwa kwenye mfumo isipokuwa kwa msimbo mgumu usiotangamana, programu jalizi hatari au zilizochina.</translation> <translation id="1864269674877167562">Sera hii ikiwekwa kuwa mfuatano mtupu au isipowekwa, <ph name="PRODUCT_OS_NAME" /> haitaonyesha chaguo la kukamilisha kiotomatiki wakati wa mtiririko wa mtumiaji kuingia katika akaunti. Sera hii ikiwekwa kuwa mfuatano unaowakilisha jina la kikoa, <ph name="PRODUCT_OS_NAME" /> itaonyesha chaguo la kukamilisha kiotomatiki wakati wa mtumiaji kuingia katika akaunti hivyo kumruhusu kuandika jina lake la mtumiaji pekee bila kiendelezi cha jina la kikoa. Mtumiaji ataweza kufuta jina la kiendelezi cha kikoa hiki.</translation> <translation id="1865417998205858223">Ruhusa za Funguo</translation> @@ -847,11 +838,6 @@ <translation id="3660562134618097814">Hamisha vidakuzi vya SAML IdP wakati wa kuingia katika akaunti</translation> <translation id="3709266154059827597">Sanidi orodha inayotiliwa shaka ya usakinishaji wa kiendelezi</translation> <translation id="3711895659073496551">Sitisha</translation> -<translation id="3715448429089775791">Hulazimisha Hali Salama ya YouTube kutumika na kuzuia watumiaji kubadilisha mipangilio hii. - - Ukiwasha mipangilio hii, Hali Salama kwenye YouTube itatumika kila wakati. - - Ukizima mipangilio hii au usiiweke kama thamani, Hali Salama kwenye YouTube haitatekelezwa.</translation> <translation id="3750220015372671395">Zuia uundaji ufunguo kwenye tovuti hizi</translation> <translation id="3756011779061588474">Zuia hali ya wasanidi programu</translation> <translation id="3758089716224084329">Hukuwezesha kubainisha seva mbadala iliyotumiwa na <ph name="PRODUCT_NAME" /> na huwazuia watumiaji kubadilisha mipangilio ya seva mbadala. @@ -2093,10 +2079,6 @@ Vitambulisho vinavyotambuliwa vya aina vya muunganisho ni "ethaneti", "wifi", "wimax", "bluetooth" na "simu ya mkononi".</translation> <translation id="7763614521440615342">Onyesha mapendekezo ya maudhui kwenye ukurasa wa Kichupo Kipya</translation> -<translation id="7766336524667238790">Ripoti maelezo kuhusu kipindi cha skrini nzima kinachoendelea, kama vile - Kitambulisho cha programu na toleo. - - Sera ikiwekwa kuwa sivyo, maelezo ya kipindi hayataripotiwa. Ikiwekwa kuwa ndivyo au ikiachwa bila kuwekwa, maelezo ya kipindi yataripotiwa.</translation> <translation id="7774768074957326919">Tumia mipangilio ya proksi ya mfumo</translation> <translation id="7775831859772431793">Unaweza kubainisha URL ya seva mbadala hapa. @@ -2324,6 +2306,10 @@ <translation id="8369602308428138533">Kuchelewa kwa kuzima skirini wakati nishati ya AC inapotumika</translation> <translation id="8382184662529825177">Washa matumizi ya usahihishaji wa mbali wa kulinda maudhui ya kifaa</translation> <translation id="838870586332499308">Wezesha utumiaji wa data nje ya mtandao wako wa kawaida</translation> +<translation id="8390049129576938611">Huzima programu ya mtazamaji wa ndani wa PDF katika <ph name="PRODUCT_NAME" />. Badala yake huichukulia kama kupakuliwa na huruhusu mtumiaji kufungua faili za PDF kwa kutumia programu chaguo-msingi. + + Sera hii ikiachwa bila kuwekwa au ikizimwa programu-jalizi ya PDF itatumiwa kufungua faili za PDF isipokuwa mtumiaji awe ameizima.</translation> +<translation id="8402079500086185021">Fungulia faili za PDF nje kila wakati</translation> <translation id="8412312801707973447">Ikiwa ukaguzi wa mtandaoni wa OCSP/CRL umeatekelezwa</translation> <translation id="8413348101535146315">Huwasha kipengele cha kutamatisha shughuli katika Kidhibiti cha Shughuli kwenye <ph name="PRODUCT_NAME" />. @@ -2344,17 +2330,6 @@ Kwa mifano ya ruwaza angalia https://www.chromium.org/developers/how-tos/chrome-frame-getting-started.</translation> <translation id="8493645415242333585">Lemaza kuhifadhi historia ya kivinjari</translation> <translation id="8499172469244085141">Mipangilio ya Chaguo-Msingi (watumiaji wanaweza kubadilisha)</translation> -<translation id="8501011084242226370">Hubainisha orodha ya programu-jalizi ambazo mtumiaji anaweza kuwasha au kuzima katika <ph name="PRODUCT_NAME" />. - - Herufi wakilishi za '*' na '?' zinaweza kutumika kulinganisha msururu wowote wa herufi zisizo na mpangilio maalum. '*' hulinganisha idadi ya herufi zisizokuwa na mpangilio maalum huku '?' ikibainisha herufi moja ya hiari, kama vile kulinganisha herufi za sufuri au moja. Herufi ya kuondoka ni '\', hivyo kulinganisha herufi halisi za '*', '?', au '\' , unaweza kuweka '\' mbele yake. - - Ukiwasha mpangilio huu, orodha iliyobainishwa ya programu-jalizi inaweza kutumika katika <ph name="PRODUCT_NAME" />. Watumiaji wanaweza kuziwasha au kuzizima katika 'kuhusu:programu-jalizi', hata kama programu-jalizi pia inalingana na mchoro katika DisabledPlugins. Watumiaji pia wanaweza kuwasha au kuzima programu-jalizi ambazo hazilingani na michoro yoyote katika DisabledPlugins, DisabledPluginsExceptions and EnabledPlugins. - - Sera hii imewekwa ili kuruhusu uwekaji kwenye orodha ya zilizoondolewa idhini ambapo orodha ya 'DisabledPlugins' ina maingizo ya herufi wakilishili kama kuzima programu-jalizi zote '*' au kuzima programu-jalizi zote za Java '*Java*' lakini msimamizi angependa kuwasha toleo fulani maalum la 'IcedTea Java 2.3'. Toleo hili maalum linaweza kubainishwa katika sera hii. - - Kumbuka kuwa jina la programu-jalizi na jina la kikundi cha programu-jalizi lazima lipewe ruhusa. Kila kikundi cha programu-jalizi huonyeshwa katika sehemu tofauti katika kuhusu:programu-jalizi; kila sehemu inaweza ikawa na programu-jalizi moja au zaidi. Kwa mfano, programu-jalizi ya "Shockwave Flash" iko kwenye kikundi cha "Kichezaji cha Adobe Flash", na majina yote lazima yalingane na orodha ya matarajio iwapo programu-jalizi hiyo itapewa ruhusa kwenye orodha ya zilizoondolewa idhini. - - Sera hii isipowekwa programu-jalizi yoyote ambayo inalingana na michoro katika 'DisabledPlugins' itafungwa izimwe na watumiaji hawataweza kuiwasha.</translation> <translation id="8519264904050090490">URL zisizofuata kanuni za mwongozo wa mtumiaji uliodhibitiwa</translation> <translation id="8544375438507658205">Kionyeshi chaguo-msngi cha HTML kwa<ph name="PRODUCT_FRAME_NAME" /></translation> <translation id="8549772397068118889">Tahadharisha ninapotembelea tovuti zilizo nje ya vifurushi vya maudhui</translation> @@ -2387,15 +2362,6 @@ Seva nyingi tofauti zenye koma. Kadi egemezi (*) zinaruhusiwa. Ukiacha sera hii bila kuiweka <ph name="PRODUCT_NAME" /> itajaribu kugundua ikiwa seva iko kwenye Intraneti na hapo ndipo itajibu maombi ya IWA pekee. Iwapo seva itagunduliwa kama Intraneti basi maombi ya IWA yatapuuzwa na <ph name="PRODUCT_NAME" />.</translation> -<translation id="8668394701842594241">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. - - Orodha ya programu jalizi iliyobainishwa inatumiwa mara kwa mara katika <ph name="PRODUCT_NAME" /> ikiwa zimesakinishwa. Programu jalizi zinatiwa alama kama zilizowezeshwa katika 'kuhusu:programu jalizi' na watumiaji hawawezi kuzilemaza. - - Fahamu kuwa sera hii inafuta DisabledPlugins na DisabledPluginsExceptions. - - Ikiwa sera hii itaachwa bila kuwekwa mtumiaji anaweza kuilemaza programu yoyote iliyosakinishwa kwenye mfumo huu.</translation> <translation id="8672321184841719703">Toleo Lengwa la Kusasisha Otomatiki</translation> <translation id="868068801094828689">Huwasha kuripoti bila kutambulika kwa matumizi na data iliyoacha kufanya kazi kuhusu <ph name="PRODUCT_NAME" /> kwenye Google na huzuia watumiaji kubadilisha mipangilio hii. @@ -2493,13 +2459,6 @@ <ph name="PRODUCT_OS_NAME" /> itawasiliana na Seva ya Quirks kiotomatiki na kupakua faili za kusanidi, kama zipo, na kuzihifadhi kwenye kifaa. Kwa mfano, faili kama hizo zinaweza kutumiwa kuimarisha ubora wa onyesho la viwambo vilivyoambatishwa.</translation> -<translation id="8905426178924715309">Sera hii imeacha kuendesha huduma, tafadhali tumia ForceGoogleSafeSearch na ForceYouTubeSafetyMode. Sera hii itapuuzwa ikiwa sera za ForceGoogleSafeSearch au ForceYouTubeSafetyMode zitawekwa. - - Hulazimisha hoja katika Utafutaji wa Wavuti wa Google kufanywa SafeSearch ikiwa imewashwa na huzuia watumiaji kubadilisha mipangilio hii. Mipangilio hii pia hulazimisha Hali Salama kwenye YouTube. - - Ukiwasha mipangilio hii, SafeSearch katika Tafuta na Google na YouTube huwa imewashwa. - - Ukizima mipangilio hii au usipoweka thamani, SafeSearch katika Tafuta na Google na YouTube haitekelezwi.</translation> <translation id="8906768759089290519">Wezesha modi ya wageni</translation> <translation id="8908294717014659003">Inakuruhusu kuweka ikiwa tovuti zinaruhusiwa kufikia vifaa vya media vya kunasa. Ufikivu wa vifaa vya media vya kunasa unaweza kuruhusiwa kwa chaguo-msingi, au mtumiaji anaweza kuulizwa kila wakati tovuti inapotaka kufikia vifaa vya media vya kunasa.
diff --git a/components/policy/resources/policy_templates_ta.xtb b/components/policy/resources/policy_templates_ta.xtb index 7cf1d7c..11f3892 100644 --- a/components/policy/resources/policy_templates_ta.xtb +++ b/components/policy/resources/policy_templates_ta.xtb
@@ -201,15 +201,6 @@ இந்தக் கொள்கை உள்ளமைக்கப்படாவிட்டால் அல்லது "tls1.2" என அமைக்கப்பட்டால், இனி <ph name="PRODUCT_NAME" /> இந்த மாற்றத்தை மேற்கொள்ளாது. ஆனால் பதிப்புகளுடன் சரியாக தகவல் பரிமாற்றம் செய்து கொள்ள முடியாத பிழையான சேவையகங்களுடன் <ph name="PRODUCT_NAME" /> இயங்க முடியுமா என்பது மட்டுமே மாறுமே தவிர, பழைய TLS பதிப்புகளுக்கான ஆதரவு முடக்கப்படாது என்பதை மனதில் கொள்ளவும். அல்லது, பிழையான சேவையகத்துடன் இணக்கத்தன்மையாக இருக்க வேண்டும் என்றால், இந்தக் கொள்கையை "tls1.1" என அமைக்கலாம். இது ஒரு இடைக்கால நடவடிக்கையாகும், சேவையகத்தை விரைவில் சரிசெய்ய வேண்டும்.</translation> -<translation id="1861037019115362154"><ph name="PRODUCT_NAME" /> இல் முடக்கப்பட்டுள்ள செருகுநிரல்களின் பட்டியலைக் குறிப்பிடுகிறது, மேலும் பயனர்கள் இந்த அமைப்பை மாற்றுவதைத் தடுக்கிறது. - - '*' மற்றும் '?' ஆகிய வைல்டுகார்டு எழுத்துக்குறிகள், தன்னிச்சையான எழுத்துக்குறிகளின் தொடர்ச்சியைப் பொருத்த பயன்படுத்தப்படும். '?' ஆனது ஒரே ஒரு எழுத்துக்குறியைப் பொருத்தும்போது '*' பல எழுத்துக்குறிகளைப் பொருத்தும், அதாவது பூஜ்ஜியம் அல்லது ஒரு எழுத்துக்குறியைப் பொருத்தும். '\' என்பது விலக்குதல் எழுத்துக்குறியாகும், இது நேரடியாக '*', '?', அல்லது '\' எழுத்துக்குறிகளைப் பொருத்த பயன்படுகிறது. நீங்கள் அவற்றின் முன்னதாக '\' ஐப் பயன்படுத்தலாம். - - நீங்கள் இந்த அமைப்பை இயக்கினால், குறிப்பிடப்பட்ட செருகுநிரல்களின் பட்டியல் எப்போதும் <ph name="PRODUCT_NAME" /> இல் பயன்படுத்தப்படாது. 'about:plugins' இல் செருகுநிரல்கள் முடக்கப்பட்டதாக குறிக்கப்படும், பயனர்கள் அவற்றை இயக்க முடியாது. - - EnabledPlugins மற்றும் DisabledPluginsExceptions ஆகியவை இந்தக் கொள்கையை மீறலாம் என்பதை நினைவில் கொள்க. - - இந்தக் கொள்கை அமைக்கப்படாமல் இருந்தால், இணக்கமற்ற வன்-குறியீடு, காலாவதியான அல்லது அபாயகரமான செருகுநிரல்கள் தவிர, கணினியில் நிறுவப்பட்டுள்ள செருகுநிரலைப் பயனர் பயன்படுத்தலாம்.</translation> <translation id="1864269674877167562">இந்தக் கொள்கையைக் காலியான எழுத்துச்சரமாக அமைத்தாலோ அல்லது உள்ளமைக்கப்படவில்லை என்றாலோ, பயனரின் உள்நுழைவுச் செயல்முறையின் போது தன்னிரப்பி விருப்பத்தை <ph name="PRODUCT_OS_NAME" /> காட்டாது. இந்தக் கொள்கையை, டொமைன் பெயரைக் குறிப்பிடும் எழுத்துச்சரத்திற்கு அமைத்தால், டொமைன் பெயர் நீட்டிப்பு இல்லாமல் பயனர் பெயரை மட்டும் உள்ளிட அனுமதிக்கும் வகையில், உள்நுழைவுச் செயல்முறையின் போது தன்னிரப்பி விருப்பத்தை <ph name="PRODUCT_OS_NAME" /> காட்டும். இந்த டொமைன் பெயர் நீட்டிப்பைப் பயனர் மேலெழுதலாம்.</translation> <translation id="1865417998205858223">விசை அனுமதிகள்</translation> @@ -805,11 +796,6 @@ <translation id="3660562134618097814">உள்நுழைவின் போது SAML IdP குக்கீகளைப் பரிமாற்றும்</translation> <translation id="3709266154059827597">நீட்டிப்பு நிறுவுதல் தடுப்புப்பட்டியலை உள்ளமை</translation> <translation id="3711895659073496551">இடைநிறுத்தப்பட்டது</translation> -<translation id="3715448429089775791">YouTube பாதுகாப்புப் பயன்முறையைச் செயல்பாட்டு நிலைக்கு அமைத்து இந்த அமைப்பைப் பயனர்கள் மாற்றுவதைத் தடுக்கும். - - இந்த அமைப்பை இயக்கினால், YouTube இல் பாதுகாப்புப் பயன்முறை எப்போதும் செயல்பாட்டு நிலையில் இருக்கும். - - இந்த அமைப்பை முடக்கினால் அல்லது மதிப்பை அமைக்காமல் இருந்தால், YouTube இல் பாதுகாப்புப் பயன்முறை செயல்படுத்தப்படாது.</translation> <translation id="3750220015372671395">இந்தத் தளங்களில் விசை உருவாக்கத்தைத் தடு</translation> <translation id="3756011779061588474">டெவலப்பர் பயன்முறையைத் தடு</translation> <translation id="3758089716224084329"><ph name="PRODUCT_NAME" /> பயன்படுத்தும் ப்ராக்ஸி சேவையகத்தைக் குறிப்பிட உங்களை அனுமதித்து, ப்ராக்ஸி அமைப்புகளை மாற்றுவதிலிருந்து பயனர்களைத் தடுக்கும். @@ -1968,9 +1954,6 @@ "ethernet", "wifi", "wimax", "bluetooth" மற்றும் "cellular" ஆகியவை அங்கீகரிக்கப்பட்ட இணைப்பு வகை அடையாளங்காட்டிகளாகும்.</translation> <translation id="7763614521440615342">புதிய தாவல் பக்கத்தில் உள்ளடக்கப் பரிந்துரைகளைக் காட்டு</translation> -<translation id="7766336524667238790">பயன்பாட்டு ஐடி, பதிப்பு போன்ற செயலில் உள்ள கியாஸ்க் அமர்வைப் பற்றிய தகவலை அறிவிக்கும். - -கொள்கை false என அமைக்கப்பட்டால், அமர்வுத் தகவல் அறிவிக்கப்படாது. true என அமைக்கப்பட்டாலோ அல்லது அமைக்காமல் விட்டாலோ, அமர்வுத் தகவல் அறிவிக்கப்படும்.</translation> <translation id="7774768074957326919">கணினியின் ப்ராக்ஸி அமைப்புகளைப் பயன்படுத்து</translation> <translation id="7775831859772431793">ப்ராக்ஸி சர்வரின் URLஐ இங்கே குறிப்பிடலாம். @@ -2182,6 +2165,10 @@ <translation id="8369602308428138533">AC சக்தியில் இயங்கும்போது திரை முடக்கம் தாமதமாகும்</translation> <translation id="8382184662529825177">சாதனத்தின் உள்ளடக்கப் பாதுகாப்பிற்கான தொலைநிலைச் சான்றொப்பப் பயன்பாட்டை இயக்கவும்</translation> <translation id="838870586332499308">தரவு ரோமிங்கை இயக்கு</translation> +<translation id="8390049129576938611"><ph name="PRODUCT_NAME" /> இல் அக PDF வியூவரை முடக்கும். அதற்குப் பதிலாக, அதைப் பதிவிறக்கமாகக் கருதி, இயல்புப் பயன்பாட்டில் PDF கோப்புகளைத் திறக்க பயனரை அனுமதிக்கும். + + இந்தக் கொள்கை அமைக்கப்படவில்லை என்றாலோ அல்லது முடக்கப்பட்டிருந்தாலோ, பயனர் முடக்கும் வரை PDF கோப்புகளைத் திறக்க PDF செருகுநிரல் பயன்படுத்தப்படும்.</translation> +<translation id="8402079500086185021">எப்போதும் PDF கோப்புகளை வெளிப்புறமாகத் திற</translation> <translation id="8412312801707973447">ஆன்லைன் OCSP/CRL சோதனைகள் செயல்படுகின்றனவா</translation> <translation id="8413348101535146315"><ph name="PRODUCT_NAME" /> இன் காரிய நிர்வாகியில் செயலாக்கங்களை முடிக்கும் அம்சத்தை இயக்கும். @@ -2202,17 +2189,6 @@ வடிவங்களின் எடுத்துக்காட்டுகளுக்கு https://www.chromium.org/developers/how-tos/chrome-frame-getting-started என்கிற முகவரியைப் பார்க்கவும்.</translation> <translation id="8493645415242333585">உலாவி வரலாற்றை சேமிப்பதை முடக்கு</translation> <translation id="8499172469244085141">இயல்புநிலை அமைப்புகள் (பயனர்களால் மேலெழுத முடியும்)</translation> -<translation id="8501011084242226370"><ph name="PRODUCT_NAME" /> இல் பயனர் இயக்கக்கூடிய அல்லது முடக்கக்கூடிய செருகுநிரல்களின் பட்டியலைக் குறிக்கிறது. - - சிறப்புக் குறி எழுத்துகுறிகளான '*' மற்றும் '?' ஆகியவற்றைத் தன்னிச்சையான எழுத்துக்குறிகளின் வரிசையுடன் பொருத்துவதற்குப் பயன்படுத்தலாம். '*' ஆனது தன்னிச்சையான எண்ணிக்கையிலான எழுத்துக்குறிகளுடன் பொருந்துகிறது, ஆயினும் '?', விருப்பமான ஒற்றை எழுத்துக்குறியுடன் பொருந்துகிறது, அதாவது பூஜ்ஜியம் அல்லது ஒன்று போன்ற எழுத்துக்குறிகளுடன் பொருந்துகிறது. முடிவு எழுத்துக்குறி '\' ஆகும், சரியான '*', '?', அல்லது '\' எழுத்துக்குறிகளுடன் பொருத்துவதற்கு, அவற்றின் முன்னால் '\' ஐ இடலாம். - - இந்த அமைப்பை நீங்கள் இயக்கினால், <ph name="PRODUCT_NAME" /> இல் செருகுநிரல்களின் குறிப்பிட்ட பட்டியலைப் பயன்படுத்தலாம். DisabledPlugins இல் உள்ள வடிவத்துடன் செருகுநிரல் பொருந்தினாலும், அவற்றைப் பயனர்கள் 'about:plugins' இல் இயக்கலாம் அல்லது முடக்கலாம். பயனர்கள் DisabledPlugins, DisabledPluginsExceptions மற்றும் EnabledPlugins ஆகியவையில் உள்ள எந்த வடிவத்துடனும் பொருந்தாத செருகுநிரல்களையும் இயக்கலாம் மற்றும் முடக்கலாம். - - இந்தக் கொள்கை கண்டிப்பான செருகுநிரல் தடுப்புப்பட்டியலை அனுமதிக்க உருவாக்கப்பட்டது, அதாவது இதில் 'DisabledPlugins' பட்டியலில் எல்லா செருகுநிரல்களையும் முடக்கு '*' அல்லது எல்லா Java செருகுநிரல்களையும் முடக்கு '*Java*' போன்ற சிறப்புக்குறி உள்ளீடுகள் இருக்கும் ஆனால் 'IcedTea Java 2.3' போன்ற சில குறிப்பிட்ட பதிப்பை மட்டும் இயக்க நிர்வாகி விரும்புகிறார் என்பது போன்ற நிலைகளில் பயன்படுத்த உருவாக்கப்பட்டது. இந்தக் கொள்கையில் இந்தக் குறிப்பிட்ட பதிப்புகளைக் குறிப்பிடலாம். - - செருகுநிரல் பெயர் மற்றும் செருகுநிரலின் குழுப்பெயர் ஆகிய இரண்டிற்கும் விதிவிலக்கு அளிக்கப்பட வேண்டும் என்பதை நினைவில்கொள்ளவும். about:plugins இல் ஒவ்வொரு செருகுநிரல் குழுவும் தனித்தனி பிரிவில் காண்பிக்கப்படுகின்றன; ஒவ்வொரு பிரிவிலும் ஒன்று அல்லது அதற்கு மேற்பட்ட செருகுநிரல்கள் இருக்கலாம். எடுத்துக்காட்டாக "Shockwave Flash" செருகுநிரலானது "Adobe Flash Player" குழுவிற்குச் சொந்தமானது, மேலும் அந்தச் செருகுநிரலுக்குத் தடுப்புப்பட்டியலில் இருந்து விதிவிலக்கு அளிக்கப்படவிருந்தால், விதிவிலக்குகள் பட்டியலில் அந்த இரண்டு பெயர்களுக்கும் ஒரு பொருத்தம் இருக்க வேண்டும். - - இந்தக் கொள்கையை அமைக்காமல் இருந்தால் 'DisabledPlugins' இல் உள்ள வடிவங்களுடன் பொருந்தும் எந்தச் செருகுநிரலும் பூட்டப்பட்டு முடக்கப்படும் மேலும் பயனரால் அவற்றை இயக்க முடியாது.</translation> <translation id="8519264904050090490">நிர்வகிக்கப்படும் பயனர் கைமுறை விதிவிலக்கு URLகள்</translation> <translation id="8544375438507658205"><ph name="PRODUCT_FRAME_NAME" /> க்கான, இயல்புநிலை HTML ரெண்டரர்</translation> <translation id="8549772397068118889">உள்ளடக்கத் தொகுப்புகளுக்கு வெளியே உள்ள தளங்களைப் பார்வையிடும்போது எச்சரிக்கை செய்</translation> @@ -2237,7 +2213,6 @@ பல சேவையகங்களின் பெயர்களைக் காற்புள்ளிகளால் பிரிக்கவும். சிறப்புக் குறிகள் (*) அனுமதிக்கப்படுகின்றன. இந்தக் கொள்கையை அமைக்கவில்லை எனில், சேவையகமானது அக இணையத்தில் உள்ளதா என்பதை <ph name="PRODUCT_NAME" /> கண்டறிய முயற்சிக்கும், அதன் பின்னரே IWA கோரிக்கைகளுக்கு பதிலளிக்கும். சேவையமானது இணையமாகக் கண்டறியப்பட்டால், அதிலிருந்து வரும் IWA கோரிக்கைகள், <ph name="PRODUCT_NAME" /> ஆல் தவிர்க்கப்படும்.</translation> -<translation id="8668394701842594241"><ph name="PRODUCT_NAME" /> இல் செயலாக்கப்பட்டுள்ள செருகுநிரல்களின் பட்டியலைக் குறிப்பிடுகிறது மேலும் இந்த அமைப்பை மாற்றுவதில் இருந்துப் பயனர்களைத் தடுக்கிறது. '*' மற்றும் '?' போன்ற வைல்டு கார்டு எழுத்துக்குறிகள், தன்னிச்சையான எழுத்துக்குறிகளின் வரிசைமுறையை பொருத்தப் பயன்படுகிறது. '?' என்பது விருப்பதேர்வுக்குரிய ஒற்றை எழுத்துக்குறியைக் (அதாவது பூஜ்யம் அல்லது ஒற்றை எழுத்துக்குறிகளைப் பொருந்துவது) குறிப்பிடுமானால், '*' என்பது தன்னிச்சையான எண்ணின் எழுத்துக்குறிகளுக்கு பொருந்தும். '\' என்ற விடுபடும் எழுத்துக்குறி, '*', '?', அல்லது '\' ஆகிய எழுத்துக்குறிகளுக்குப் பொருந்தும், நீங்கள் '\' என்பதை அவற்றின் முன்பு இடலாம். குறிப்பிட்ட செருகுநிரல்கள் நிறுவப்பட்டிருந்தால் அதன் பட்டியல் எப்போதும் <ph name="PRODUCT_NAME" /> இல் பயன்படுத்தப்படும். 'about:plugins' என்பதில் செருகுநிரல்கள் செயலாக்கத்தில் குறிக்கப்படும் மேலும் பயனர்கள் அதை முடக்க முடியாது. இந்தக் கொள்கை DisabledPlugins மற்றும் DisabledPluginsExceptions ஆகிய இரண்டையும் புறக்கணிக்கும். இந்தக் கொள்கை அமைக்கப்படாமல் இருந்தால், கணினியில் நிறுவப்பட்டிருக்கும் எந்த செருகுநிரலையும் பயனர் முடக்கலாம்.</translation> <translation id="8672321184841719703">இலக்கு தானியங்கு புதுப்பித்தல் பதிப்பு</translation> <translation id="868068801094828689"><ph name="PRODUCT_NAME" /> பற்றிய பயன்பாடு மற்றும் சிதைவு தொடர்பான தரவை Googleக்கு அநாமதேயமாக அறிவிப்பதை இயக்கி, இந்த அமைப்பைப் பயனர்கள் மாற்றுவதையும் தடுக்கும். @@ -2332,13 +2307,6 @@ க்விர்க்ஸ் சேவையகத்தைத் தொடர்புகொண்டு, உள்ளமைவுக் கோப்புகளை இறக்கும். முடிந்தால், சாதனத்தில் அவற்றைச் சேமிக்கும். எடுத்துக்காட்டாக, இணைக்கப்பட்ட மானிட்டர்களின் காட்சித் தரத்தை மேம்படுத்த அத்தகைய கோப்புகள் பயன்படுத்தப்படலாம்.</translation> -<translation id="8905426178924715309">இந்தக் கொள்கை தடுக்கப்பட்டுள்ளது, அதற்குப் பதிலாக ForceGoogleSafeSearch, ForceYouTubeSafetyMode ஆகியவற்றைப் பயன்படுத்தவும். ForceGoogleSafeSearch, ForceYouTubeSafetyMode ஆகிய கொள்கைகளில் ஏதேனும் ஒன்று அமைக்கப்பட்டிருந்தாலும் இந்தக் கொள்கை நிராகரிக்கப்படும். - - Google வலைத் தேடலில் பாதுகாப்பானத் தேடலைச் செயல்படுத்தியபடி, வினவல்கள் செயலாக்கப்படும், மேலும் இந்த அமைப்பைப் பயனர்கள் மாற்றுவதையும் தடுக்கும். இந்த அமைப்பு YouTube இலும் பாதுகாப்புப் பயன்முறையைச் செயல்படுத்தும். - - இந்த அமைப்பை இயக்கினால், Google தேடல், YouTube ஆகியவற்றில் பாதுகாப்பானத் தேடல் எப்போதும் செயல்பாட்டில் இருக்கும். - - இந்த அமைப்பை முடக்கினாலோ அல்லது மதிப்பு எதுவும் அமைக்கப்படாமல் இருந்தாலோ, Google தேடல், YouTube ஆகியவற்றில் பாதுகாப்பானத் தேடல் செயல்படுத்தப்படாது.</translation> <translation id="8906768759089290519">விருந்தினர் பயன்முறையை இயக்குதல்</translation> <translation id="8908294717014659003">இணையதளங்கள் மீடியா பிடிப்பு சாதனங்களை அணுக அனுமதி உள்ளதா என்பதை அமைக்க உங்களை அனுமதிக்கிறது. மீடியா பிடிப்பு சாதனங்களுக்கான அணுகல் இயல்பாக அனுமதிக்கப்படும் அல்லது இணையதளம் மீடியா பிடிப்பு சாதனங்களுக்கு அணுகலைப் பெற விரும்பும் ஒவ்வொரு முறையும் பயனர் கேட்கப்படுவார்.
diff --git a/components/policy/resources/policy_templates_te.xtb b/components/policy/resources/policy_templates_te.xtb index 58fb6d48..194fb74 100644 --- a/components/policy/resources/policy_templates_te.xtb +++ b/components/policy/resources/policy_templates_te.xtb
@@ -211,15 +211,6 @@ ఈ విధానాన్ని కాన్ఫిగర్ చేయకుంటే లేదా దీన్ని "tls1.2"కి సెట్ చేస్తే, అప్పుడు <ph name="PRODUCT_NAME" /> ఈ ఫాల్బ్యాక్ను నిర్వహించదు. ఇది పాత TLS సంస్కరణల కోసం మద్దతును నిలిపివేయదు, సంస్కరణలను సరిగ్గా బదలాయించలేని బగ్గీ సర్వర్ల్లో మాత్రమే <ph name="PRODUCT_NAME" /> పని చేయవచ్చని గుర్తుంచుకోండి. లేకుంటే, బగ్గీ సర్వర్కు అనుకూలత తప్పనిసరిగా ఉండేలా చూసుకోవాలంటే, ఈ విధానాన్ని "tls1.1"కి సెట్ చేయవచ్చు. ఇది విరామ సమయ ప్రమాణం మరియు వేగంగా సర్వర్ సమస్య పరిష్కరించబడుతుంది.</translation> -<translation id="1861037019115362154"><ph name="PRODUCT_NAME" />లో నిలిపివేయబడిన ప్లగిన్ల జాబితాను సూచిస్తుంది మరియు వినియోగదారుల ఈ సెట్టింగ్ను మార్చకుండా నిరోధిస్తుంది. - - వైల్డ్కార్డ్ అక్షరాలు '*' మరియు '?' నిర్హేతుక అక్షరాల వరుసను సరిపోల్చడానికి ఉపయోగించబడతాయి. '?' ఇచ్ఛాపూరిత ఏకైక అక్షరాన్ని పేర్కొంటే అంటే సున్నా లేదా ఒకటి అక్షరాలను సరిపోల్చితే '*' అక్షరాల యొక్క ఏకపక్ష సంఖ్యను సరిపోల్చుతుంది. '\' అనేది ఎస్కేప్ అక్షరం, కాబట్టి వాస్తవ '*', '?', లేదా '\'ను సరిపోల్చడానికి, మీరు వాటి ముందర '\'ను పెట్టవచ్చు. - - మీరు ఈ సెట్టింగ్ను ప్రారంభిస్తే, పేర్కొన్న ప్లగిన్ల జాబితా <ph name="PRODUCT_NAME" />లో ఎప్పటికీ ఉపయోగించబడదు. ప్లగిన్లు 'about:plugins'లో ఆపివేయబడినట్లుగా గుర్తు పెట్టబడతాయి మరియు వినియోగదారులు వాటిని ప్రారంభించలేరు. - - ఈ విధానం EnabledPlugins మరియు DisabledPluginsExceptions ద్వారా భర్తీ చేయబడుతుందని గుర్తుంచుకోండి. - - ఈ విధానం సెట్ చేయకుండా వదిలివేయబడితే వినియోగదారు సిస్టమ్లో ఇన్స్టాల్ చేయబడిన హార్డ్-కోడ్ చేయబడిన అనుకూలం కాని, గడువు ముగిసిన లేదా ప్రమాదకరమైన ప్లగిన్లు కాకుండా ఏ ప్లగిన్ను అయినా ఎంచుకోవచ్చు.</translation> <translation id="1864269674877167562">ఈ విధానాన్ని ఖాళీ వాక్యానికి సెట్ చేస్తే లేదా కాన్ఫిగర్ చేయకుంటే, <ph name="PRODUCT_OS_NAME" /> వినియోగదారు సైన్ ఇన్ విధాన సమయంలో స్వీయపూర్తి ఎంపికను చూపదు. ఈ విధానాన్ని డొమైన్ పేరును సూచించే వాక్యానికి సెట్ చేస్తే, <ph name="PRODUCT_OS_NAME" /> వినియోగదారు సైన్ ఇన్ చేసే సమయంలో డొమైన్ పేరు పొడిగింపు పేర్కొనాల్సిన శ్రమ లేకుండా కేవలం వారి వినియోగదారు పేరు మాత్రమే టైప్ చేసే వీలు కల్పిస్తూ స్వీయపూర్తి ఎంపికను చూపుతుంది. వినియోగదారు ఈ డొమైన్ పేరు పొడిగింపును భర్తీ చేయగలుగుతారు.</translation> <translation id="1865417998205858223">కీలక అనుమతులు</translation> @@ -829,11 +820,6 @@ <translation id="3660562134618097814">లాగిన్ సమయంలో SAML IdP కుక్కీలను బదిలీ చేస్తుంది</translation> <translation id="3709266154059827597">పొడిగింపు వ్యవస్థాపన ఆమోదంకానిజాబితాని కాన్ఫిగర్ చెయ్యి</translation> <translation id="3711895659073496551">తాత్కాలికంగా నిలిపివేయడం</translation> -<translation id="3715448429089775791">YouTube భద్రతా మోడ్ను సక్రియం చేసేలా నిర్బంధిస్తుంది మరియు వినియోగదారులు ఈ సెట్టింగ్ను మార్చకుండా నిరోధిస్తుంది. - - ఈ సెట్టింగ్ను ప్రారంభిస్తే, YouTubeలో భద్రతా మోడ్ ఎల్లప్పుడూ సక్రియంగా ఉంటుంది. - - మీరు ఈ సెట్టింగ్ను నిలిపివేస్తే లేదా విలువను సెట్ చేయకుంటే, YouTubeలో భద్రతా మోడ్ అమలు చేయబడదు.</translation> <translation id="3750220015372671395">ఈ సైట్ల్లో కీ ఉత్పాదనను బ్లాక్ చేయండి</translation> <translation id="3756011779061588474">డెవలపర్ మోడ్ను బ్లాక్ చేయండి</translation> <translation id="3758089716224084329"><ph name="PRODUCT_NAME" /> ద్వారా ఉపయోగించబడే ప్రాక్సీ సర్వర్ను పేర్కొనడానికి మిమ్మల్ని అనుమతిస్తుంది మరియు ప్రాక్సీ సెట్టింగ్లను మార్చనీయకుండా వినియోగదారులను నిరోధిస్తుంది. @@ -2007,12 +1993,6 @@ "ethernet", "wifi", "wimax", "bluetooth" మరియు "cellular" గుర్తింపు పొందిన కనెక్షన్ రకం ఐడెంటిఫైయర్లు.</translation> <translation id="7763614521440615342">కొత్త ట్యాబ్ పేజీలో కంటెంట్ సూచనలను చూపుతుంది</translation> -<translation id="7766336524667238790">సక్రియ కియోస్క్ సెషన్ గురించిన సమాచారాన్ని అనగా, - అనువర్తన ID మరియు సంస్కరణ వంటివి నివేదిస్తుంది. - - విధానాన్ని తప్పుకు సెట్ చేస్తే, సెషన్ సమాచారం నివేదించబడదు. - ఒప్పుకు సెట్ చేస్తే లేదా సెట్ చేయకుండా వదిలేస్తే, సెషన్ సమాచారం - నివేదించబడుతుంది.</translation> <translation id="7774768074957326919">సిస్టమ్ ప్రాక్సీ సెట్టింగ్లని ఉపయోగించు</translation> <translation id="7775831859772431793">మీరు ప్రాక్సీ సర్వర్ URLను ఇక్కడ పేర్కొనవచ్చు. @@ -2236,6 +2216,10 @@ <translation id="8369602308428138533">AC శక్తితో అమలవుతున్నప్పుడు స్క్రీన్ ఆపివేత ఆలస్యం</translation> <translation id="8382184662529825177">పరికరానికి కంటెంట్ రక్షణ కోసం రిమోట్ ధృవీకరణ యొక్క ఉపయోగాన్ని ప్రారంభించండి</translation> <translation id="838870586332499308">డేటా రోమింగ్ని ప్రారంభించు</translation> +<translation id="8390049129576938611"><ph name="PRODUCT_NAME" />లో అంతర్గత PDF వ్యూయర్ను నిలిపివేస్తుంది. బదులుగా ఇది దాన్ని డౌన్లోడ్ వలె పరిగణిస్తుంది మరియు డిఫాల్ట్ అనువర్తనంతో PDF ఫైల్లను తెరవడానికి వినియోగదారును అనుమతిస్తుంది. + + ఈ విధానాన్ని సెట్ చేయకుండా వదిలివేస్తే లేదా నిలిపివేస్తే, PDF ఫైల్లను తెరవడానికి PDF ప్లగిన్ ఉపయోగించబడుతుంది, వినియోగదారు దాన్ని నిలిపివేసి ఉంటే మాత్రమే ఉపయోగించబడదు.</translation> +<translation id="8402079500086185021">ఎల్లప్పుడూ PDF ఫైల్లను బహిరంగంగా తెరుస్తుంది</translation> <translation id="8412312801707973447">ఆన్లైన్లో OCSP/CRL తనిఖీలు అమలు చేయాలా లేదా</translation> <translation id="8413348101535146315"><ph name="PRODUCT_NAME" /> విధి నిర్వాహికిలో ప్రాసెస్లను ముగించే ఎంపికను ప్రారంభిస్తుంది. @@ -2256,17 +2240,6 @@ ఉదాహరణ నమూనాల కోసం https://www.chromium.org/developers/how-tos/chrome-frame-getting-started చూడండి.</translation> <translation id="8493645415242333585">బ్రౌజర్ చరిత్రని సేవ్ చెయ్యడాన్ని ఆపివేయి</translation> <translation id="8499172469244085141">డిఫాల్ట్ సెట్టింగ్లు (వినియోగదారులు భర్తీ చేయవచ్చు)</translation> -<translation id="8501011084242226370"><ph name="PRODUCT_NAME" />లో వినియోగదారు ప్రారంభించగల లేదా నిలిపివేయగల ప్లగిన్ల జాబితాను పేర్కొంటుంది. - - స్వతంత్ర అక్షరాల వరుసలను సరిపోల్చడానికి వైల్డ్కార్డ్ అక్షరాలు '*' మరియు '?' ఉపయోగించబడతాయి. '?' గుర్తు ఐచ్ఛిక ఏకైక అక్షరాన్ని అంటే సున్నా లేదా ఏక అక్షరాలను పేర్కొంటే '*' గుర్తు స్వతంత్ర అక్షరాల సంఖ్యను సరిపోల్చుతుంది. '\' అనేది ఎస్కేప్ అక్షరం, అందువలన వాస్తవ '*', '?', లేదా '\' అక్షరాలను సరిపోల్చడానికి, మీరు వాటి ముందర '\'ను ఉంచవచ్చు. - - మీరు ఈ సెట్టింగ్ను ప్రారంభిస్తే, పేర్కొన్న ప్లగిన్ల జాబితా <ph name="PRODUCT_NAME" />లో ఉపయోగించబడుతుంది. వినియోగదారులు వాటిని 'about:plugins'లో ప్రారంభించవచ్చు లేదా నిలిపివేయవచ్చు, ప్లగిన్ DisabledPluginsలోని నమూనాతో సరిపోలినప్పటికీ కూడా ఇలా చేయవచ్చు. వినియోగదారులు DisabledPlugins, DisabledPluginsExceptions మరియు EnabledPluginsలో ఏ నమూనాలకు సరిపోలని ప్లగిన్లను కూడా ప్రారంభించవచ్చు మరియు నిలిపివేయవచ్చు. - - 'DisabledPlugins' జాబితాలో అన్ని ప్లగిన్లను '*' నిలిపివేయండి లేదా అన్ని జావా ప్లగిన్లను '*జావా*' నిలిపివేయండి వంటి వైల్డ్ కార్డెడ్ నమోదులు ఉన్నప్పటికీ నిర్వాహకులు 'IcedTea Java 2.3' వంటి ఒక ప్రత్యేక సంస్కరణను ప్రారంభించాలని కోరుకునే సందర్భంలో ఖచ్చితమైన ప్లగిన్ను నిరోధిత జాబితాలో ఉంచే ప్రక్రియను అనుమతించడమే ఈ విధానం ముఖ్యోద్దేశం. ఈ నిర్దిష్ట సంస్కరణలు ఈ విధానంలో పేర్కొనబడతాయి. - - ప్లగిన్ పేరు మరియు ప్లగిన్ సమూహం పేరు రెండూ మినహాయించబడాలని గుర్తుంచుకోండి. ప్రతి ప్లగిన్ సమూహం about:pluginsలో ప్రత్యేక విభాగంలో చూపబడుతుంది; ప్రతి విభాగంలో ఒకటి లేదా అంతకంటే ఎక్కువ ప్లగిన్లు ఉండవచ్చు. ఉదాహరణకు, "Shockwave Flash" ప్లగిన్ "Adobe Flash Player" సమూహానికి చెందినది అయినప్పటికీ ఆ ప్లగిన్ నిరోధిత జాబితా నుండి మినహాయించబడాలంటే రెండు పేర్లకు మినహాయింపుల జాబితాలో సరిపోలిక ఉండాలి. - - ఈ విధానాన్ని సెట్ చేయకుండా వదిలేస్తే 'DisabledPlugins'లోని నమూనాలకు సరిపోలే ఏ ప్లగిన్ అయినా లాక్ చేయబడి నిలిపివేయబడుతుంది మరియు వినియోగదారు దాన్ని ప్రారంభించలేరు.</translation> <translation id="8519264904050090490">నిర్వహించబడే వినియోగదారు మాన్యువల్ మినహాయింపు URLలు</translation> <translation id="8544375438507658205"><ph name="PRODUCT_FRAME_NAME" /> కోసం డిఫాల్ట్ HTML అందింపుదారు</translation> <translation id="8549772397068118889">కంటెంట్ ప్యాక్లకు వెలుపల ఉన్న సైట్లను సందర్శించేటప్పుడు హెచ్చరించు</translation> @@ -2303,7 +2276,6 @@ బహుళ సర్వర్ పేర్లను కామాలతో వేరు చేయండి. వైల్డ్కార్డ్లు (*) అనుమతించబడతాయి. మీరు ఈ విధానాన్ని సెట్ చేయకుండా వదిలేస్తే <ph name="PRODUCT_NAME" /> సర్వర్ ఇంట్రానెట్లో ఉంటే గుర్తించడానికి ప్రయత్నించి ఆపై మాత్రమే IWA అభ్యర్థనలకు ప్రతిస్పందిస్తుంది. సర్వర్ ఇంటర్నెట్గా గుర్తించబడితే, అప్పుడు దాని నుండి IWA అభ్యర్థనలను <ph name="PRODUCT_NAME" /> విస్మరిస్తుంది.</translation> -<translation id="8668394701842594241"><ph name="PRODUCT_NAME" />లో ప్రారంభించబడిన ప్లగిన్ల జాబితాను సూచిస్తుంది మరియు వినియోగదారులు ఈ సెట్టింగ్ను మార్చకుండా నిరోధిస్తుంది. వైల్డ్కార్డ్ అక్షరాలు '*' మరియు '?' నిర్హేతుక అక్షరాల వరుసను సరిపోల్చడానికి ఉపయోగించబడతాయి. '*' ఒక నిర్హేతుక సంఖ్యా అక్షరాలకు సరిపోలగా, '?' సున్నా లేదా ఒక అక్షరం లాంటి ఒక ఏక ఐచ్చిక అక్షరాన్ని సూచిస్తుంది. '\' అనేది లభ్యతలోలేని అక్షరం, కాబట్టి నిజమైన '*', '?' లేదా '\'ను పోల్చడానికి, మీరు వాటి ముందు ఒక '\'ను పెట్టవచ్చు. పేర్కొనబడిన ప్లగిన్ల జాబితా ఇన్స్టాల్ చేయబడితే అవి ఎల్లప్పుడూ <ph name="PRODUCT_NAME" />లో ఉపయోగించబడతాయి. ప్లగిన్ల 'about:plugins'లో ప్రారంభించబడినట్లుగా గుర్తించబడతాయి మరియు వినియోగదారులు వాటిని ఆపివేయలేరు. ఈ విధానం ఆపివేయబడిన ప్లగిన్ల మరియు DisabledPluginsExceptionsను భర్తీ చేస్తుందని గమనించండి.</translation> <translation id="8672321184841719703">లక్ష్య స్వీయ నవీకరణ సంస్కరణ</translation> <translation id="868068801094828689"><ph name="PRODUCT_NAME" /> వినియోగం మరియు దాని గురించిన క్రాష్ సంబంధిత డేటాను Googleకు అనామకంగా నివేదించడం ప్రారంభిస్తుంది మరియు ఈ సెట్టింగ్ను మార్చకుండా వినియోగదారులను నిరోధిస్తుంది. @@ -2398,13 +2370,6 @@ Quirks Serverని సంప్రదించి, అందుబాటులో ఉన్న పక్షంలో కాన్ఫిగరేషన్ ఫైల్లను డౌన్లోడ్ చేసి, ఆపై వాటిని పరికరంలో నిల్వ చేస్తుంది. అటువంటి ఫైల్లు జోడించబడిన మానిటర్ల డిస్ప్లే నాణ్యతను మెరుగుపరచడం మొదలైన వాటి కోసం ఉపయోగించబడవచ్చు.</translation> -<translation id="8905426178924715309">ఈ విధానం నిలిపివేయబడుతోంది, దయచేసి బదులుగా ForceGoogleSafeSearch మరియు ForceYouTubeSafetyMode ఉపయోగించండి. ForceGoogleSafeSearch లేదా ForceYouTubeSafetyMode విధానాలను సెట్ చేస్తే ఈ విధానం విస్మరించబడుతుంది. - - Google వెబ్ శోధనలో సురక్షితశోధనను సక్రియంగా ఉంచి ప్రశ్నలు శోధించేలా నిర్బంధిస్తుంది మరియు వినియోగదారులు ఈ సెట్టింగ్ను మార్చకుండా నిరోధిస్తుంది. ఈ సెట్టింగ్ YouTubeలో సురక్షిత మోడ్ను కూడా నిర్బంధిస్తుంది. - - మీరు ఈ సెట్టింగ్ను ప్రారంభిస్తే, Google శోధన మరియు YouTubeలో సురక్షిత శోధన ఎల్లప్పుడూ సక్రియంగా ఉంటుంది. - - మీరు ఈ సెట్టింగ్ను నిలిపివేస్తే లేదా విలువను సెట్ చేయకుంటే, Google శోధన మరియు YouTubeలో సురక్షితశోధన అమలు చేయబడదు.</translation> <translation id="8906768759089290519">అతిథి మోడ్ని ప్రారంభించు</translation> <translation id="8908294717014659003">మీడియా సంగ్రహక పరికరాలకు ప్రాప్యతను పొందడానికి వెబ్సైట్లు అనుమతించబడ్డాయో లేదో సెట్ చేయడానికి మిమ్మల్ని అనుమతిస్తుంది. మీడియా సంగ్రహక పరికరాలకు ప్రాప్యత డిఫాల్ట్గా అనుమతించబడుతుంది లేదా వెబ్సైట్ మీడియా సంగ్రహక పరికరాలకు ప్రాప్యతను పొందాలనుకునే ప్రతిసారీ వినియోగదారుని అడుగుతుంది.
diff --git a/components/policy/resources/policy_templates_th.xtb b/components/policy/resources/policy_templates_th.xtb index ca1e5a0..a4c1522 100644 --- a/components/policy/resources/policy_templates_th.xtb +++ b/components/policy/resources/policy_templates_th.xtb
@@ -202,15 +202,6 @@ หากไม่มีการกำหนดค่านโยบายนี้หรือหากกำหนดเป็น "tls1.2" ผลก็คือ <ph name="PRODUCT_NAME" /> จะไม่ใช้ขั้นตอนสำรองอีกต่อไป โปรดทราบว่าการดำเนินการนี้ไม่ได้ปิดการสนับสนุน TLS เวอร์ชันเก่ากว่า เพียงแต่ <ph name="PRODUCT_NAME" /> จะแก้ปัญหาเซิร์ฟเวอร์ที่มีข้อบกพร่องชั่วคราวซึ่งต่อรองเวอร์ชันอย่างถูกต้องไม่ได้หรือไม่เท่านั้น หรือคุณอาจตั้งค่านโยบายเป็น "tls1.1" หากต้องรักษาความเข้ากันได้กับเซิร์ฟเวอร์ที่มีข้อบกพร่อง ซึ่งการดำเนินการนี้เป็นเพียงมาตรการชั่วคราวและควรมีการแก้ไขเซิร์ฟเวอร์อย่างรวดเร็ว</translation> -<translation id="1861037019115362154">ระบุรายการปลั๊กอินที่ปิดใช้งานใน <ph name="PRODUCT_NAME" /> และป้องกันไม่ให้ผู้่ใช้ทำการเปลี่ยนแปลง - - สัญลักษณ์แทน "*" และ "?" สามารถใช้เพื่อจับคู่กับอักขระต่างๆ ที่เรียงกันอย่างอิสระได้ "*" จะจับคู่กับอักขระจำนวนเท่าใดก็ได้ในขณะที่ "?" จะระบุถึงอักขระเดียวซึ่งจะมีหรือไม่ก็ได้ เช่น จับคู่กับอักขระศูนย์หรือหนึ่งตัว อักขระสำหรับเลี่ยงคือ "\" ซึ่งในกรณีที่คุณต้องการจับคู่กับอักขระ "*", "?" หรือ "\" จริงๆ คุณสามารถวาง "\" ไว้ข้างหน้าอักขระดังกล่าวได้ - - หากคุณเปิดใช้งานการตั้งค่านี้ รายการปลั๊กอินที่ระบุไว้จะไม่ถูกใช้เลยใน <ph name="PRODUCT_NAME" /> ปลั๊กอินจะถูกทำเครื่องหมายว่าปิดใช้งานใน "about:plugins" และผู้ใช้จะไม่สามารถเปิดใช้งานได้ - - โปรดทราบว่านโยบายนี้สามารถถูกลบล้างได้โดย EnabledPlugins และ DisabledPluginsExceptions - - หากไม่มีการตั้งค่านโยบายนี้ ผู้ใช้จะสามารถใช้ปลั๊กอินใดๆ ก็ตามที่ติดตั้่งไว้ในระบบได้ ยกเว้นปลั๊กอินที่ไม่สามารถทำงานร่วมกันซึ่งมีการฮาร์ดโค้ด ล้าสมัย หรือที่เป็นอันตราย</translation> <translation id="1864269674877167562">หากตั้งค่านโนบายนี้เป็นสตริงเปล่าหรือไม่กำหนดค่า <ph name="PRODUCT_OS_NAME" /> จะไม่แสดงตัวเลือกเติมข้อความอัตโนมัติในระหว่างขั้นตอนการลงชื่อเข้าใช้ของผู้ใช้ หากตั้งค่านโยบายนี้เป็นสตริงที่แสดงชื่อโดเมน <ph name="PRODUCT_OS_NAME" /> จะแสดงตัวเลือกเติมข้อความอัตโนมัติในขณะที่ผู้ใช้ลงชื่อเข้าใช้ ทำให้ผู้ใช้สามารถพิมพ์เฉพาะชื่อผู้ใช้โดยไม่ต้องมีส่วนขยายชื่อโดเมน ผู้ใช้สามารถเขียนทับส่วนขยายชื่อโดเมนนี้ได้</translation> <translation id="1865417998205858223">สิทธิ์ของคีย์</translation> @@ -811,11 +802,6 @@ <translation id="3660562134618097814">โอนคุกกี้ SAML IdP ขณะลงชื่อเข้าใช้</translation> <translation id="3709266154059827597">กำหนดค่ารายการที่ไม่อนุญาตสำหรับการติดตั้งส่วนขยาย</translation> <translation id="3711895659073496551">ระงับการใช้งาน</translation> -<translation id="3715448429089775791">บังคับให้ใช้งานโหมดปลอดภัยของ YouTube และป้องกันไม่ให้ผู้ใช้เปลี่ยนแปลงการตั้งค่านี้ - - หากคุณเปิดใช้การตั้งค่านี้ โหมดปลอดภัยของ YouTube จะทำงานตลอดเวลา - - หากคุณปิดใช้การตั้งค่านี้หรือไม่ได้ตั้งค่า จะไม่มีการใช้โหมดปลอดภัยของ YouTube</translation> <translation id="3750220015372671395">บล็อกการสร้างคีย์ในเว็บไซต์เหล่านี้</translation> <translation id="3756011779061588474">บล็อกโหมดนักพัฒนาซอฟต์แวร์</translation> <translation id="3758089716224084329">ช่วยให้คุณสามารถระบุพร็อกซีเซิร์ฟเวอร์ที่ <ph name="PRODUCT_NAME" /> ใช้ได้และป้องกันไม่ให้ผู้ใช้เปลี่ยนการตั้งค่าพร็อกซีเซิร์ฟเวอร์ @@ -1980,12 +1966,6 @@ ตัวระบุประเภทการเชื่อมต่อที่เป็นที่รู้จักกันได้แก่ "อีเทอร์เน็ต", "Wi-Fi", "WiMax", "บลูทูธ" และ "การเชื่อมต่อมือถือ"</translation> <translation id="7763614521440615342">แสดงคำแนะนำเนื้อหาบนหน้า "แท็บใหม่"</translation> -<translation id="7766336524667238790">รายงานข้อมูลเกี่ยวกับเซสชันคีออสก์ที่ใช้งาน เช่น - รหัสและเวอร์ชันของแอปพลิเคชัน - - หากตั้งค่านโยบายเป็น False จะไม่มีการรายงานข้อมูลเซสชัน - หากตั้งค่าเป็น True หรือไม่ได้ตั้งค่า จะมีการรายงานข้อมูล - เซสชัน</translation> <translation id="7774768074957326919">ใช้การตั้งค่าพร็อกซีของระบบ</translation> <translation id="7775831859772431793">คุณสามารถระบุ URL ของพร็อกซีเซิร์ฟเวอร์ได้ที่นี่ @@ -2206,6 +2186,10 @@ <translation id="8369602308428138533">ระยะหน่วงเวลาการปิดหน้าจอเมื่อทำงานโดยใช้ไฟ AC</translation> <translation id="8382184662529825177">เปิดใช้การใช้งานการรับรองระยะไกลสำหรับการปกป้องเนื้อหาสำหรับอุปกรณ์</translation> <translation id="838870586332499308">เปิดใช้งานการโรมมิ่งข้อมูล</translation> +<translation id="8390049129576938611">ปิดใช้โปรแกรมดู PDF ภายใน <ph name="PRODUCT_NAME" /> โดยจะปฏิบัติต่อไฟล์ PDF เป็นไฟล์ที่ดาวน์โหลดแทนและอนุญาตให้ผู้ใช้เปิดไฟล์ PDF ด้วยแอปพลิเคชันเริ่มต้น + + หากไม่ได้ตั้งค่านโยบายนี้หรือปิดใช้อยู่ ระบบจะใช้ปลั๊กอิน PDF เพื่อเปิดไฟล์ PDF เว้นแต่ผู้ใช้ปิดใช้ปลั๊กอินไว้</translation> +<translation id="8402079500086185021">เปิดไฟล์ PDF จากภายนอกทุกครั้ง</translation> <translation id="8412312801707973447">ดำเนินการตรวจสอบ OCSP/CRL แบบออนไลน์หรือไม่</translation> <translation id="8413348101535146315">เปิดใช้การหยุดกระบวนการในตัวจัดการงานของ <ph name="PRODUCT_NAME" /> @@ -2226,17 +2210,6 @@ สำหรับรูปแบบตัวอย่าง โปรดดูที่ https://www.chromium.org/developers/how-tos/chrome-frame-getting-started</translation> <translation id="8493645415242333585">ปิดใช้งานการบันทึกประวัติเบราว์เซอร์</translation> <translation id="8499172469244085141">การตั้งค่าเริ่มต้น (ผู้ใช้แทนที่ได้)</translation> -<translation id="8501011084242226370">ระบุรายชื่อปลั๊กอินที่ผู้ใช้สามารถเปิดหรือปิดใช้ใน <ph name="PRODUCT_NAME" /> ได้ - - อักขระสัญลักษณ์แทน "*" และ "?" สามารถใช้เพื่อจับคู่ลำดับของอักขระแบบกำหนดเอง "*" จับคู่จำนวนอักขระแบบกำหนดเอง ขณะที่ "?" ระบุอักขระเดี่ยวที่เลือกได้ เช่น จับคู่เลขศูนย์หรืออักขระใดๆ อักขระสำหรับ Escape คือ "\" ฉะนั้นการจับคู่อักขระ "*", "?" หรือ "\" คุณสามารถใส่ "\" ไว้ข้างหน้าได้ - - หากคุณเปิดใช้การตั้งค่านี้ รายชื่อปลั๊กอินที่ระบุสามารถใช้ใน <ph name="PRODUCT_NAME" /> ได้ ผู้ใช้สามารถเปิดหรือปิดใช้รายชื่อได้ใน "about:plugins" แม้ว่าปลั๊กอินจะตรงกับรูปแบบใน DisabledPlugins ผู้ใช้สามารถเปิดและปิดใช้ปลั๊กอินที่ไม่ตรงกับรูปแบบใดๆ ใน DisabledPlugins, DisabledPluginsExceptions และ EnabledPlugins ได้ - - นโยบายนี้ใช้สำหรับอนุญาตปลั๊กอินที่อยู่ในบัญชีดำที่เข้มงวดซึ่งรายชื่อ "DisabledPlugins" มีรายการที่เป็นสัญลักษณ์แทน เช่น ปิดใช้ปลั๊กอินทั้งหมด "*" หรือปิดใช้ปลั๊กอิน Java ทั้งหมด "*Java*" แต่ผู้ดูแลระบบที่ต้องการเปิดใช้ปลั๊กอินบางเวอร์ชัน เช่น "IcedTea Java 2.3" สามารถระบุเวอร์ชันนี้ในนโยบายนี้ได้ - - โปรดทราบว่าทั้งชื่อปลั๊กอินและชื่อกลุ่มของปลั๊กอินต้องได้รับการยกเว้นไว้ ปลั๊กอินแต่ละกลุ่มจะปรากฏในส่วนต่างๆ แยกกันใน about:plugins โดยในแต่ละส่วนอาจมีปลั๊กอินอย่างน้อยหนึ่งรายการ ตัวอย่างเช่น ปลั๊กอิน "Shockwave Flash" เป็นของกลุ่ม "Adobe Flash Player" และทั้งสองชื่อต้องตรงกับในรายการข้อยกเว้นหากปลั๊กอินดังกล่าวได้รับการยกเว้นจากบัญชีดำ - - หากไม่มีการตั้งค่านโยบายนี้ ปลั๊กอินที่ตรงกับรูปแบบใน "DisabledPlugins" จะถูกปิดไว้และผู้ใช้จะไม่สามารถเปิดใช้ได้</translation> <translation id="8519264904050090490">URL ข้อยกเว้นแบบกำหนดเองของผู้ใช้ที่ได้รับการจัดการ</translation> <translation id="8544375438507658205">โปรแกรมแสดง HTML เริ่มต้นสำหรับ <ph name="PRODUCT_FRAME_NAME" /></translation> <translation id="8549772397068118889">เตือนเมื่อไปที่เว็บไซต์ภายนอกชุดเนื้อหา</translation> @@ -2272,7 +2245,6 @@ คั่นชื่อเซิร์ฟเวอร์หลายชื่อด้วยเครื่องหมายจุลภาค อนุญาตให้ใช้อักขระตัวแทน (*) หากคุณปล่อยนโยบายนี้ไว้โดยไม่มีการตั้งค่า <ph name="PRODUCT_NAME" /> จะพยายามตรวจหาว่าเซิร์ฟเวอร์อยู่บนอินทราเน็ตไหม และจะตอบรับคำขอ IWA หลังจากนั้นเท่านั้น หากมีการตรวจพบว่าเซิร์ฟเวอร์เป็นอินเทอร์เน็ต <ph name="PRODUCT_NAME" /> จะเพิกเฉยต่อคำขอ IWA</translation> -<translation id="8668394701842594241">ระบุรายการปลั๊กอินที่เปิดใช้งานใน <ph name="PRODUCT_NAME" /> และป้องกันไม่ให้ผู้ใช้เปลี่ยนการตั้งค่านี้ คุณสามารถใช้อักขระของสัญลักษณ์แทน "*" และ "?" เพื่อจับคู่ลำดับอักขระที่กำหนดเอง "*" จะจับคู่กับจำนวนอักขระที่กำหนดเอง ส่วน "?" จะระบุอักขระเดี่ยวที่เป็นตัวเลือก เช่น การจับคู่กับเลข 0 หรืออักขระตัวหนึ่ง อักขระหลีก คือ "\" ดังนั้นหากต้องการจับคู่อักขระ "*", "?" หรือ "\" จริง คุณสามารถใส่ "\" ไว้หน้าอักขระเหล่านั้นได้ รายการปลั๊กอินที่ระบุจะถูกนำมาใช้ใน <ph name="PRODUCT_NAME" /> หากมีการติดตั้งไว้ ปลั๊กอินจะถูกทำเครื่องหมายเป็นเปิดใช้งานใน "about:plugins" และผู้ใช้ไม่สามารถปิดใช้งานปลั๊กอินเหล่านั้นได้ โปรดทราบว่านโยบายนี้จะแทนที่ทั้ง DisabledPlugins และ DisabledPluginsExceptions หากนโยบายนี้ไม่มีการตั้งค่าไว้ ผู้ใช้สามารถปิดใช้งานปลั๊กอินใดๆ ที่ติดตั้งไว้ในระบบได้</translation> <translation id="8672321184841719703">กำหนดเป้าหมายรุ่นที่อัปเดตอัตโนมัติ</translation> <translation id="868068801094828689">เปิดใช้การรายงานแบบไม่ระบุชื่อของข้อมูลที่เกี่ยวข้องกับการใช้งานและข้อขัดข้องเกี่ยวกับ <ph name="PRODUCT_NAME" /> ให้แก่ Google และป้องกันไม่ให้ผู้ใช้เปลี่ยนการตั้งค่านี้ @@ -2364,13 +2336,6 @@ ติดต่อเซิร์ฟเวอร์ Quirks โดยอัตโนมัติและดาวน์โหลดไฟล์การกำหนดค่าโดยอัตโนมัติ หากมี และเก็บไฟล์เหล่านั้นไว้ในอุปกรณ์ ซึ่งไฟล์เหล่านั้น อาจใช้เพื่อปรับปรุงคุณภาพของจอแสดงผลที่เชื่อมต่อกับจอภาพ</translation> -<translation id="8905426178924715309">นโยบายนี้เลิกใช้แล้ว โปรดใช้ ForceGoogleSafeSearch และ ForceYouTubeSafetyMode แทน ระบบจะไม่สนใจนโยบายนี้หากมีการตั้งค่านโยบาย ForceGoogleSafeSearch หรือ ForceYouTubeSafetyMode ไว้ - - บังคับให้เปิดใช้การค้นหาปลอดภัยเมื่อค้นหาใน Google ค้นเว็บ และป้องกันไม่ให้ผู้ใช้เปลี่ยนการตั้งค่านี้ การตั้งค่าดังกล่าวยังบังคับใช้โหมดปลอดภัยบน YouTube ด้วย - - หากคุณเปิดใช้การตั้งค่านี้ ค้นหาปลอดภัยใน Google Search และ YouTube จะทำงานเสมอ - - หากคุณปิดใช้การตั้งค่านี้หรือไม่ได้กำหนดค่า จะไม่มีการบังคับใช้ค้นหาปลอดภัยใน Google Search และ YouTube</translation> <translation id="8906768759089290519">เปิดใช้งานโหมดผู้มาเยือน</translation> <translation id="8908294717014659003">อนุญาตให้คุณตั้งค่าว่าจะอนุญาตให้เว็บไซต์เข้าถึงอุปกรณ์จับสื่อภาพ/เสียงหรือไม่ การเข้าถึงอุปกรณ์จับสื่อภาพ/เสียงอาจได้รับอนุญาตโดยค่าเริ่มต้น หรือผู้ใช้สามารถรับข้อความสอบถามทุกๆ ครั้งที่เว็บไซต์ต้องการเข้าถึงอุปกรณ์จับสื่อภาพ/เสียง
diff --git a/components/policy/resources/policy_templates_tr.xtb b/components/policy/resources/policy_templates_tr.xtb index 1fb99b0..613f38b 100644 --- a/components/policy/resources/policy_templates_tr.xtb +++ b/components/policy/resources/policy_templates_tr.xtb
@@ -216,15 +216,6 @@ 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. - - Bu ayarı etkinleştirirseniz, belirtilen eklentilerin listesi <ph name="PRODUCT_NAME" /> ürününde hiçbir zaman kullanılmaz. Eklentiler, 'about:plugins' içinde devre dışı olarak işaretlenir ve kullanıcılar bunları etkinleştiremez. - - Bu politikanın EnabledPlugins ve DisabledPluginsExceptions tarafından geçersiz kılınabileceğini unutmayın. - - Bu politika ayarlanmadan bırakılırsa, kullanıcı sabit kodlu uyumsuz, eski veya tehlikeli olan eklentiler dışında, sistemde yüklü olan tüm eklentileri kullanabilir.</translation> <translation id="1864269674877167562">Bu politika için boş bir dize ayarlanırsa veya politika hiç yapılandırılmazsa <ph name="PRODUCT_OS_NAME" />, kullanıcı oturum açma akışında bir otomatik tamamlama seçeneği görüntülemez. Bu politika için bir alan adına karşılık gelen dize ayarlanırsa <ph name="PRODUCT_OS_NAME" />, kullanıcı oturum açma akışı sırasında bir otomatik tamamlama seçeneği görüntüleyerek kullanıcının sadece kullanıcı adını (alan adı uzantısı olmadan) yazmasına olanak verir. Kullanıcı bu alan adı uzantısının üzerine yazabilir.</translation> <translation id="1865417998205858223">Temel İzinler</translation> @@ -867,11 +858,6 @@ <translation id="3660562134618097814">Giriş sırasında SAML IdP çerezlerini aktar</translation> <translation id="3709266154059827597">Uzantı kurulum kara listesini yapılandır</translation> <translation id="3711895659073496551">Askıya al</translation> -<translation id="3715448429089775791">YouTube Güvenlik Modu'nu etkin olmaya zorlar ve kullanıcıların bu ayarı değiştirmesini önler. - - Bu ayarı etkinleştirirseniz YouTube'da Güvenlik Modu her zaman etkin olur. - - Bu ayarı devre dışı bırakırsanız veya bir değer ayarlamazsanız YouTube'da Güvenlik Modu zorlanmaz.</translation> <translation id="3750220015372671395">Bu sitelerde anahtar oluşturmayı engelle</translation> <translation id="3756011779061588474">Geliştirici modunu engelle</translation> <translation id="3758089716224084329"><ph name="PRODUCT_NAME" /> tarafından kullanılan proxy sunucuyu belirtmenize olanak tanır ve kullanıcıların proxy ayarlarını değiştirmelerini önler. @@ -2131,11 +2117,6 @@ Tanınan bağlantı türü tanıtıcıları şunlardır: "ethernet", "wifi", "wimax", "bluetooth" ve "cellular".</translation> <translation id="7763614521440615342">Yeni Sekme sayfasında içerik önerileri göster</translation> -<translation id="7766336524667238790">Uygulama kimliği ve sürümü gibi aktif kiosk oturumuyla ilgili bilgileri rapor edin. - - Bu politika yanlış seçeneğine ayarlanırsa, oturum bilgileri rapor - edilmez. Doğru seçeneğine ayarlanırsa veya ayarlanmadan - bırakılırsa oturum bilgileri rapor edilir.</translation> <translation id="7774768074957326919">Sistem proxy ayarlarını kullan</translation> <translation id="7775831859772431793">Proxy sunucunun URL'sini burada belirtebilirsiniz. @@ -2373,6 +2354,10 @@ <translation id="8369602308428138533">AC güçle çalışırken ekran kapatma gecikmesi</translation> <translation id="8382184662529825177">Cihazda içerik koruma için uzak onay kullanımını etkinleştir</translation> <translation id="838870586332499308">Veri dolaşımını etkinleştir</translation> +<translation id="8390049129576938611"><ph name="PRODUCT_NAME" /> içindeki dahili PDF görüntüleyiciyi devre dışı bırakır. Bunun yerine, dosyayı indirilecek dosya olarak ele alır ve kullanıcının PDF dosyalarını varsayılan uygulamayla açmasına olanak tanır. + + Bu politika ayarlanmaz veya devre dışı bırakılırsa, kullanıcı devre dışı bırakmadıkça PDF dosyalarını açmak için PDF eklentisi kullanılır.</translation> +<translation id="8402079500086185021">PDF dosyalarını her zaman harici olarak aç</translation> <translation id="8412312801707973447">Çevrimiçi OCSP/CRL denetimlerinin yapılıp yapılmayacağı</translation> <translation id="8413348101535146315"><ph name="PRODUCT_NAME" /> Görev Yöneticisi'ndeki işlemlerin sona erdirilebilmesini sağlar. @@ -2393,17 +2378,6 @@ Örnek kalıplar için https://www.chromium.org/developers/how-tos/chrome-frame-getting-started sayfasına bakın.</translation> <translation id="8493645415242333585">Tarayıcı geçmişini kaydetmeyi devre dışı bırak</translation> <translation id="8499172469244085141">Varsayılan Ayarlar (kullanıcılar geçersiz kılabilir)</translation> -<translation id="8501011084242226370">Kullanıcının <ph name="PRODUCT_NAME" /> uygulamasında etkinleştirebileceği veya devre dışı bırakabileceği eklentilerin listesini belirtir. - - Rastgele karakter dizileriyle eşleştirmek için "*" ve "?" joker karakterleri kullanılabilir. "*" karakteri, rastgele sayıda karakterleri eşleştirir, "?" karakteri ise isteğe bağlı tek bir karakteri belirtir (yani, sıfır veya tek bir karakter). "\" çıkış karakteridir, dolayısıyla asıl "*", "?" veya "\" karakterlerini eşleştirmek için bunlardan önce bir "\" karakteri koyabilirsiniz. - - Bu ayarı etkinleştirirseniz belirtilen eklenti listesi <ph name="PRODUCT_NAME" /> uygulamasında kullanılabilir. Kullanıcılar bunları (eklenti DisabledPlugins'te bir kalıpla eşleşiyor olsa dahi) "about:plugins" bölümünden etkinleştirebilir veya devre dışı bırakabilirler. Kullanıcılar DisabledPlugins, DisabledPluginsExceptions ve EnabledPlugins'te herhangi bir kalıpla eşleşmeyen eklentileri de etkinleştirebilir veya devre dışı bırakabilirler. - - Bu politika, eklentilerin kesin şekilde kara listeye eklenmesine izin vermek içindir. Bu yöntemle "DisabledPlugins" listesinde tüm eklentileri devre dışı bırakmak için "*" veya tüm Java eklentilerini devre dışı bırakmak için "*Java*" gibi joker karakterli girişler kullanılabilir. Ancak yönetici, "IcedTea Java 2.3" gibi belirli sürümleri etkinleştirmek de isteyebilir. Bu tür belirli sürümler bu politikada belirtilebilir. - - Hem eklenti adının hem de eklenti grup adının muaf tutulması gerektiğini unutmayın. Her bir eklenti grubu, about:plugins sayfasında ayrı bir bölümde gösterilir. Her bölümde bir veya daha fazla eklenti bulunabilir. Örneğin, "Shockwave Flash" eklentisi "Adobe Flash Player" grubuna aittir ve söz konusu eklenti kara listeden muaf tutulacaksa her iki adın da istisnalar listesinde bir eşlemesi olması gerekir. - - Bu politika ayarlanmadan bırakılırsa "DisabledPlugins"teki kalıplarla eşleşen eklentiler kilitlenip devre dışı bırakılır ve kullanıcı bunları etkinleştiremez.</translation> <translation id="8519264904050090490">Yönetilen kullanıcı manuel istisna URL'leri</translation> <translation id="8544375438507658205"><ph name="PRODUCT_FRAME_NAME" /> için varsayılan HTML oluşturucusu</translation> <translation id="8549772397068118889">İçerik paketlerinin dışındaki siteleri ziyaret ederken uyar</translation> @@ -2442,15 +2416,6 @@ Birden fazla sunucu adını virgülle ayırın. Joker karakterlere (*) izin verilir. Bu politikayı ayarlanmamış olarak bırakırsanız, <ph name="PRODUCT_NAME" /> sunucunun İntranet'te olup olmadığını saptamaya çalışır ve buna göre IWA taleplerini yanıtlar. Sunucunun İnternet'te olduğu saptanırsa, sunucudan gelen IWA talepleri <ph name="PRODUCT_NAME" /> tarafından yoksayılır.</translation> -<translation id="8668394701842594241"><ph name="PRODUCT_NAME" /> içinde etkinleştirilmiş olan eklentilerin bir listesini belirtir ve kullanıcıların bu ayarı değiştirmelerini önler. - - '*' ve '?' joker karakterleri herhangi bir karakter dizesine uyacak şekilde kullanılabilir. '*' herhangi bir sayıda karakter ile eşleşirken '?' isteğe bağlı tek bir karakteri belirtir, yani sıfır veya bir karakterle eşleşir. Çıkış karakteri '\' olduğundan gerçek '*', '?' veya '\' joker karakterleri ile eşleştirmek için bu karakterlerin önüne '\' getirebilirsiniz. - - Eklentiler yüklendiyse, belirtilen eklentiler listesi <ph name="PRODUCT_NAME" /> içinde her zaman kullanılır. Eklentiler 'about:plugins' içinde etkinleştirilmiş olarak işaretlenir ve kullanıcılar bu eklentileri devre dışı bırakamaz. - - Bu politikanın DisabledPlugins ve DisabledPluginsExceptions politikalarını geçersiz kıldığını unutmayın. - - Bu politika ayarlanmadan bırakılırsa, kullanıcı sistemde yüklü herhangi bir eklentiyi devre dışı bırakabilir.</translation> <translation id="8672321184841719703">Hedef Otomatik Güncelleme Sürümü</translation> <translation id="868068801094828689"><ph name="PRODUCT_NAME" /> ile ilgili kullanım ve kilitlenme verilerinin anonim olarak Google'a raporlanmasını etkinleştirir ve kullanıcıların bu ayarı değiştirmelerini önler. @@ -2547,13 +2512,6 @@ <ph name="PRODUCT_OS_NAME" />, Quirks Server ile otomatik olarak iletişim kurar ve varsa yapılandırma dosyalarını indirip cihaza kaydeder. Bu tür dosyalar, örneğin bağlı monitörlerin görüntü kalitesini iyileştirmek için kullanılabilir.</translation> -<translation id="8905426178924715309">Bu politika kullanımdan kaldırılmıştır. Bunun yerine lütfen ForceGoogleSafeSearch'ü ve ForceYouTubeSafetyMode'u kullanın. ForceGoogleSafeSearch veya ForceYouTubeSafetyMode politikası ayarlanırsa bu politika yoksayılır. - - Google Web Araması'ndaki sorguların Güvenli Arama etkin olarak ayarlanmış halde yapılmasını sağlar ve kullanıcıların bu ayarı değiştirmesini önler. Bu ayar aynı zamanda YouTube'da da Güvenli Mod'un kullanılmasını sağlar. - - Bu ayarı etkinleştirirseniz, Google Arama'da ve YouTube'da Güvenli Arama her zaman etkin olur. - - Bu ayarı devre dışı bırakırsanız veya bir değer ayarlamazsanız, Google Arama'da ve YouTube'da Güvenli Arama uygulanmaz.</translation> <translation id="8906768759089290519">Misafir modunu etkinleştir</translation> <translation id="8908294717014659003">Web sitelerinin medya yakalama cihazlarına erişmelerine izin verilip verilmeyeceğini ayarlamanıza olanak sağlar. Medya yakalama cihazlarına erişime varsayılan olarak izin verilebilir veya bir web sitesinin medya yakalama cihazlarına erişmek istediği her defasında kullanıcıya sorulabilir.
diff --git a/components/policy/resources/policy_templates_uk.xtb b/components/policy/resources/policy_templates_uk.xtb index 09feb0f..0c6d9430 100644 --- a/components/policy/resources/policy_templates_uk.xtb +++ b/components/policy/resources/policy_templates_uk.xtb
@@ -208,15 +208,6 @@ Якщо це правило не налаштовано або має значення "tls1.2", <ph name="PRODUCT_NAME" /> більше не виконуватиме цей резервний процес. Зауважте: при цьому не вимикається підтримка старіших версій TLS у <ph name="PRODUCT_NAME" />, а лише скасовується перехід до них для обходу помилок на серверах, які не можуть правильно вибрати версію. Якщо все ж потрібно під’єднуватися до сервера з помилками, для правила потрібно вибрати значення "tls1.1". Це тимчасовий захід, і помилки на сервері буде незабаром виправлено.</translation> -<translation id="1861037019115362154">Визначає список плагінів, вимкнених у <ph name="PRODUCT_NAME" />, і не дозволяє користувачам змінювати це налаштування. - - Символи підстановки "*" і "?" можуть використовуватися для відповідності з послідовністю довільних символів. Символ "*" відповідає довільній кількості символів, а "?" визначає додатковий єдиний символ, тобто відповідає нулю або одному символу. Символом виходу є "\", тому для встановлення відповідності фактичним символам "*", "?" або "\" перед ними можна поставити "\". - - Якщо ввімкнути це налаштування, визначений список плагінів ніколи не буде використовуватись у <ph name="PRODUCT_NAME" />. Ці плагіни позначені як вимкнені в рядку "about:plugins", і користувачі не можуть увімкнути їх. - - Зауважте, що це правило може замінюватися правилами DisabledPlugins і DisabledPluginsExceptions. - - Якщо це правило не встановлено, користувач зможе використовувати будь-який установлений у системі плагін, окрім жорстко закодованих несумісних, застарілих або небезпечних плагінів.</translation> <translation id="1864269674877167562">Якщо для цього правила не вказано значення або його не налаштовано, <ph name="PRODUCT_OS_NAME" /> не показуватиме опції автозавершення під час входу. Якщо для цього правила вказано рядок з іменем домену, <ph name="PRODUCT_OS_NAME" /> показуватиме опцію автозавершення під час входу, і користувач зможе ввести лише власне ім’я користувача без розширення імені домену. Користувач також зможе змінити це розширення імені домену.</translation> <translation id="1865417998205858223">Основні дозволи</translation> @@ -820,11 +811,6 @@ <translation id="3660562134618097814">Передавати файли cookie SAML IdP під час входу</translation> <translation id="3709266154059827597">Налаштувати "чорний список" для встановлення розширень</translation> <translation id="3711895659073496551">Призупинити</translation> -<translation id="3715448429089775791">Примусово активує Безпечний режим YouTube і не дозволяє користувачам змінювати це налаштування. - - Якщо ввімкнути це правило, Безпечний режим YouTube завжди буде активним. - - Якщо вимкнути або не налаштувати це правило, Безпечний режим YouTube не активуватиметься примусово.</translation> <translation id="3750220015372671395">Заборонити цим сайтам генерувати ключі</translation> <translation id="3756011779061588474">Блокування режиму розробника</translation> <translation id="3758089716224084329">Дозволяє вказати проксі-сервер для <ph name="PRODUCT_NAME" /> і забороняє користувачам змінювати налаштування проксі-сервера. @@ -1986,12 +1972,6 @@ Визнані ідентифікатори типів з’єднань: "ethernet", "wifi", "wimax", "bluetooth" і "cellular".</translation> <translation id="7763614521440615342">Показувати пропозиції вмісту на сторінці "Нова вкладка"</translation> -<translation id="7766336524667238790">Надсилати інформацію про активний сеанс термінала, як-от - ідентифікатор і версію додатка. - - Якщо для цього правила встановлено значення "false", інформація про сеанс не - надсилатиметься. Якщо правило не налаштовано або має значення "true", інформація про сеанс - надсилатиметься.</translation> <translation id="7774768074957326919">Використовувати налаштування проксі-сервера системи</translation> <translation id="7775831859772431793">Тут можна вказати URL-адресу проксі-сервера. @@ -2215,6 +2195,10 @@ <translation id="8369602308428138533">Затримка вимкнення екрана, коли використовується живлення від мережі</translation> <translation id="8382184662529825177">Вмикає використання віддаленого підтвердження даних для захисту вмісту пристрою</translation> <translation id="838870586332499308">Увімкнути роумінг даних</translation> +<translation id="8390049129576938611">Вимикає вбудований переглядач PDF в <ph name="PRODUCT_NAME" />.Дозволяє користувачам відкривати файли PDF за допомогою додатка за умовчанням. + + Якщо правило не встановлено або вимкнено, файли PDF відкриватимуться за допомогою плагіна PDF, якщо його не вимкнено.</translation> +<translation id="8402079500086185021">Завжди відкривати файли PDF в окремому вікні</translation> <translation id="8412312801707973447">Чи виконуються онлайнові перевірки OCSP/CRL</translation> <translation id="8413348101535146315">Можна завершувати процеси в Диспетчері завдань <ph name="PRODUCT_NAME" />. @@ -2235,17 +2219,6 @@ Приклади шаблонів можна переглянути на сторінці https://www.chromium.org/developers/how-tos/chrome-frame-getting-started.</translation> <translation id="8493645415242333585">Вимкнути зберігання історії веб-переглядача</translation> <translation id="8499172469244085141">Налаштування за умовчанням (користувачі можуть замінювати)</translation> -<translation id="8501011084242226370">Створення списку плагінів, які користувач може ввімкнути або вимкнути в <ph name="PRODUCT_NAME" />. - - Символи підстановки "*" і "?" можуть використовуватися для відповідності з послідовністю довільних символів. Символ "*" відповідає довільній кількості символів, а "?" визначає додатковий єдиний символ, тобто відповідає нулю або одному символу. Символом виходу є "\", тому для встановлення відповідності фактичним символам "*", "?" або "\" перед ними можна поставити "\". - - Якщо ввімкнути це налаштування, визначений список плагінів можна буде використовувати в <ph name="PRODUCT_NAME" />. Користувачі зможуть вмикати чи вимикати їх у рядку "about:plugins", навіть якщо плагін відповідає шаблону в правилі DisabledPlugins. Користувачі також зможуть вмикати чи вимикати плагіни, які не відповідають жодним шаблонам у правилах DisabledPlugins, DisabledPluginsExceptions і EnabledPlugins. - - За допомогою цього правила можна дозволяти вносити плагіни в точний чорний список, де список "DisabledPlugins" містить записи підстановки, як-от про вимкнення всіх плагінів "*" або вимкнення всіх плагінів Java "*Java*", але адміністратор хоче ввімкнути певну версію, наприклад "IcedTea Java 2.3". У цьому правилі можна вказувати конкретні версії. - - Зауважте, що назва плагіна та назва групи плагінів мають бути сховані. Кожна група плагінів відображається в окремому розділі в about:plugins; у кожному розділі може бути один або декілька плагінів. Наприклад, плагін "Shockwave Flash" належить до групи "Adobe Flash Player", а обидві назви мають збігатися в списку винятків, якщо такий плагін потрібно вилучити з чорного списку. - - Якщо це правило не встановлено, усі плагіни, що відповідають шаблонам у правилі "DisabledPlugins", блокуються у вимкненому стані, і користувач не зможе ввімкнути їх.</translation> <translation id="8519264904050090490">Установлені вручну винятки URL-адрес керованого користувача</translation> <translation id="8544375438507658205">Відтворення у форматі HTML за умовчанням для <ph name="PRODUCT_FRAME_NAME" /></translation> <translation id="8549772397068118889">Попереджає про відвідування сайтів, які не входять у пакети вмісту</translation> @@ -2282,7 +2255,6 @@ Імена серверів потрібно розділяти комами. Дозволяються символи підстановки (*). Якщо це правило не встановлено, <ph name="PRODUCT_NAME" /> спробує визначити, чи сервер розміщено в інтранет-мережі, і лише тоді відповість на запити IWA. Якщо сервер виявлено в інтранет-мережі, <ph name="PRODUCT_NAME" /> ігноруватиме запити IWA, які надсилає сервер.</translation> -<translation id="8668394701842594241">Указує список плагінів, увімкнених у <ph name="PRODUCT_NAME" />, і не дозволяє користувачам змінювати це налаштування. Символи підстановки "*" і "?" можуть використовуватися як відповідники послідовностей довільних символів. Символ "*" відповідає довільній кількості символів, а "?" вказує на додатковий одинарний символ, тобто відповідає нулю або одному символу. Символом переходу є "\", тому для відповідності фактичним символам "*", "?" або "\" можна поставити перед ними "\". Указаний список плагінів завжди використовується в <ph name="PRODUCT_NAME" />, якщо їх установлено. Плагіни позначено як увімкнені в рядку "about:plugins", і користувачі не можуть їх вимкнути. Зауважте, що це правило замінює правила DisabledPlugins і DisabledPluginsExceptions. Якщо це правило не встановлено, користувач може вимкнути будь-який плагін, установлений у системі.</translation> <translation id="8672321184841719703">Цільова версія автоматичного оновлення</translation> <translation id="868068801094828689">Вмикає анонімне надсилання в Google даних про використання й аварійне завершення роботи <ph name="PRODUCT_NAME" /> і забороняє користувачам змінювати це налаштування. @@ -2377,13 +2349,6 @@ конфігурації (якщо вони доступні) і зберігає їх на пристрої. Ці файли допомагають, наприклад, покращити якість зображення приєднаних моніторів.</translation> -<translation id="8905426178924715309">Це правило більше не використовується. Натомість застосовуйте правила "ForceGoogleSafeSearch" і "ForceYouTubeSafetyMode". Це правило ігноруватиметься, якщо налаштувати "ForceGoogleSafeSearch" або "ForceYouTubeSafetyMode". - - Примусово активує Безпечний пошук для запитів у Веб-пошуку Google. Користувачі не можуть змінювати це налаштування. Це правило також примусово активує Безпечний режим на YouTube. - - Якщо ввімкнути це налаштування, Безпечний пошук у Пошуку Google і на YouTube буде завжди активним. - - Якщо це правило вимкнено або не налаштовано, Безпечний пошук не вмикатиметься в Пошуку Google і на YouTube примусово.</translation> <translation id="8906768759089290519">Увімкнути режим гостя</translation> <translation id="8908294717014659003">Дозволяє встановлювати, чи можуть веб-сайти отримувати доступ до пристроїв запису медіаданих. Доступ до пристроїв запису медіаданих може надаватися за умовчанням або користувач може бачити запит щоразу, коли веб-сайт хоче отримати доступ до пристроїв запису медіаданих.
diff --git a/components/policy/resources/policy_templates_vi.xtb b/components/policy/resources/policy_templates_vi.xtb index 4e2c8c4..fed82a1 100644 --- a/components/policy/resources/policy_templates_vi.xtb +++ b/components/policy/resources/policy_templates_vi.xtb
@@ -213,15 +213,6 @@ 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. - - Nếu bạn bật cài đặt này, danh sách plugin đã chỉ định sẽ không bao giờ được sử dụng trong <ph name="PRODUCT_NAME" />. Các plugin này được đánh dấu là bị tắt trong 'about:plugins' và người dùng không thể bật chúng. - - Xin lưu ý rằng chính sách này có thể bị EnabledPlugins và DisabledPluginsExceptions ghi đè. - - Nếu không đặt chính sách này, người dùng có thể sử dụng bất kỳ plugin nào được cài đặt trên hệ thống ngoại trừ các plugin không tương thích, lỗi thời hoặc nguy hiểm đã được mã hóa cứng.</translation> <translation id="1864269674877167562">Nếu chính sách này được đặt thành chuỗi trống hoặc không được định cấu hình, <ph name="PRODUCT_OS_NAME" /> sẽ không hiển thị tùy chọn tự động hoàn thành trong luồng đăng nhập của người dùng. Nếu chính sách này được đặt thành chuỗi đại diện cho tên miền, <ph name="PRODUCT_OS_NAME" /> sẽ hiển thị tùy chọn tự động hoàn thành trong lần đăng nhập của người dùng nhằm cho phép người dùng chỉ nhập tên người dùng của mình mà không có phần mở rộng tên miền. Người dùng có thể ghi đè phần mở rộng tên miền này.</translation> <translation id="1865417998205858223">Quyền khóa</translation> @@ -857,11 +848,6 @@ <translation id="3660562134618097814">Chuyển cookie SAML IdP trong khi đăng nhập</translation> <translation id="3709266154059827597">Định cấu hình danh sách đen cài đặt tiện ích</translation> <translation id="3711895659073496551">Tạm ngừng</translation> -<translation id="3715448429089775791">Bắt buộc bật Chế độ an toàn trên YouTube và ngăn người dùng thay đổi cài đặt này. - - Nếu bạn bật cài đặt này, Chế độ an toàn trên YouTube sẽ luôn bật. - - Nếu bạn tắt cài đặt này hoặc không đặt giá trị, Chế độ an toàn trên YouTube sẽ không được thực thi.</translation> <translation id="3750220015372671395">Chặn tạo khóa trên các trang web này</translation> <translation id="3756011779061588474">Chặn chế độ của nhà phát triển</translation> <translation id="3758089716224084329">Cho phép bạn chỉ định máy chủ proxy mà <ph name="PRODUCT_NAME" /> sử dụng và không cho người dùng thay đổi cài đặt proxy. @@ -2105,12 +2091,6 @@ Các mã định danh loại kết nối được nhận dạng là "ethernet", "wifi", "wimax", "bluetooth" và "cellular".</translation> <translation id="7763614521440615342">Hiển thị các đề xuất nội dung trên trang Tab mới</translation> -<translation id="7766336524667238790">Báo cáo thông tin về phiên kiosk hiện hoạt, chẳng hạn như - ID và phiên bản ứng dụng. - - Nếu chính sách này được đặt thành false, thông tin về phiên sẽ không - được báo cáo. Nếu chính sách này được đặt thành true hoặc không được - đặt, thông tin về phiên sẽ được báo cáo.</translation> <translation id="7774768074957326919">Sử dụng cài đặt proxy hệ thống</translation> <translation id="7775831859772431793">Bạn có thể chỉ định URL của máy chủ proxy ở đây. @@ -2347,6 +2327,10 @@ <translation id="8369602308428138533">Độ trễ tắt màn hình khi chạy trên nguồn AC</translation> <translation id="8382184662529825177">Cho phép sử dụng chứng thực từ xa để bảo vệ nội dung cho thiết bị</translation> <translation id="838870586332499308">Bật chuyển vùng dữ liệu</translation> +<translation id="8390049129576938611">Tắt trình xem PDF nội bộ trong <ph name="PRODUCT_NAME" />. Thay vào đó, thiết bị sẽ coi các tệp PDF là nội dung tải xuống và cho phép người dùng mở các tệp PDF này bằng ứng dụng mặc định. + + Nếu chính sách này không được đặt hoặc đã bị tắt, plugin PDF sẽ được sử dụng để mở các tệp PDF trừ khi người dùng tắt plugin này.</translation> +<translation id="8402079500086185021">Luôn mở các tệp PDF từ bên ngoài</translation> <translation id="8412312801707973447">Liệu các kiểm tra OCSP/CRL trực tuyến có được thực hiện hay không</translation> <translation id="8413348101535146315">Bật kết thúc quá trình trong Trình quản lý tác vụ của <ph name="PRODUCT_NAME" />. @@ -2367,17 +2351,6 @@ Để biết các mẫu ví dụ, hãy xem http://www.chromium.org/developers/how-tos/chrome-frame-getting-started.</translation> <translation id="8493645415242333585">Tắt lưu lịch sử trình duyệt</translation> <translation id="8499172469244085141">Cài đặt mặc định (người dùng có thể ghi đè)</translation> -<translation id="8501011084242226370">Chỉ định danh sách plugin mà người dùng có thể bật hoặc tắt trong <ph name="PRODUCT_NAME" />. - - Ký tự đại diện '*' và '?' có thể được sử dụng để khớp chuỗi ký tự bất kỳ. '*' khớp với số ký tự bất kỳ trong khi '?' chỉ định ký tự đơn tùy chọn tức là khớp các ký tự 0 hoặc 1. Ký tự thoát là '\', do vậy để khớp với ký tự '*', '?' hoặc '\' thực sự, bạn có thể đặt '\' ở trước các ký tự đó. - - Nếu bạn bật cài đặt này, danh sách plugin được chỉ định có thể được sử dụng trong <ph name="PRODUCT_NAME" />. Người dùng có thể bật hoặc tắt plugin trong 'about:plugins', ngay cả khi plugin cũng khớp một mẫu trong DisabledPlugins. Người dùng cũng có thể bật và tắt plugin không khớp với bất kỳ mẫu nào trong DisabledPlugins, DisabledPluginsExceptions và EnabledPlugins. - - Chính sách này nghĩa là cho phép danh sách cấm plugin nghiêm ngặt nếu danh sách 'DisabledPlugins' chứa mục nhập có ký tự đại diện như tắt tất cả plugin '*' hoặc tắt tất cả plugin Java '*Java*' nhưng quản trị viên muốn bật phiên bản cụ thể nào đó như 'IcedTea Java 2.3'. Các phiên bản cụ thể này có thể được chỉ định trong chính sách này. - - Lưu ý rằng cả tên plugin và tên nhóm của plugin đều phải được miễn. Mỗi nhóm plugin được hiển thị trong phần riêng trong about:plugins; mỗi phần có thể có một hoặc nhiều plugin. Ví dụ: plugin "Shockwave Flash" thuộc về nhóm "Adobe Flash Player" và cả hai tên phải có tên trùng khớp trong danh sách ngoại lệ nếu plugin đó được miễn khỏi danh sách cấm. - - Nếu chính sách này không được đặt, bất kỳ plugin nào khớp với mẫu trong 'DisabledPlugins' sẽ bị khóa ở trạng thái tắt và người dùng sẽ không thể bật chúng.</translation> <translation id="8519264904050090490">URL ngoại lệ hướng dẫn người dùng được quản lý</translation> <translation id="8544375438507658205">Trình hiển thị HTML mặc định dành cho <ph name="PRODUCT_FRAME_NAME" /></translation> <translation id="8549772397068118889">Cảnh báo khi truy cập vào các trang web nằm ngoài gói nội dung</translation> @@ -2413,15 +2386,6 @@ Phân tách tên của nhiều máy chủ bằng dấu phẩy. Cho phép ký tự đại diện (*). Nếu bạn không đặt chính sách này, <ph name="PRODUCT_NAME" /> sẽ cố gắng phát hiện xem máy chủ có ở trên mạng nội bộ hay không, sau đó mới phản hồi yêu cầu IWA. Nếu máy chủ được phát hiện là ở trên mạng Internet thì yêu cầu IWA từ máy chủ sẽ bị <ph name="PRODUCT_NAME" /> bỏ qua.</translation> -<translation id="8668394701842594241">Chỉ định danh sách các plugin được bậ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 0 hoặc 1 ký tự. 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. - - Danh sách plugin được chỉ định luôn được sử dụng trong <ph name="PRODUCT_NAME" /> nếu chúng được cài đặt. Các plugin này được đánh dấu là được bật trong 'about:plugins' và người dùng không thể tắt các plugin này. - - Xin lưu ý rằng chính sách này ghi đè cả DisabledPlugins và DisabledPluginsExceptions. - - Nếu không thiết lập chính sách này, người dùng có thể tắt bất kỳ plugin nào được cài đặt trên hệ thống.</translation> <translation id="8672321184841719703">Phiên bản cập nhật tự động đích</translation> <translation id="868068801094828689">Cho phép báo cáo ẩn danh về việc sử dụng và dữ liệu liên quan đến sự cố với <ph name="PRODUCT_NAME" /> tới Google và ngăn người dùng thay đổi cài đặt này. @@ -2520,13 +2484,6 @@ tự động liên hệ với Máy chủ Quirks và tải xuống các tệp cấu hình, nếu có, rồi lưu trữ các tệp này trên thiết bị. Các tệp này có thể được sử dụng để cải thiện chất lượng hiển thị của màn hình gắn vào chẳng hạn.</translation> -<translation id="8905426178924715309">Chính sách này không được dùng nữa, vui lòng sử dụng ForceGoogleSafeSearch và ForceYouTubeSafetyMode. Chính sách này sẽ bị bỏ qua nếu bạn đặt chính sách ForceGoogleSafeSearch hoặc ForceYouTubeSafetyMode. - - Buộc hoàn tất các truy vấn trong Google Web Search bằng cách đặt Tìm kiếm an toàn thành hiện hoạt và ngăn người dùng thay đổi cài đặt này. Cài đặt này cũng bắt buộc bật Chế độ an toàn trên YouTube. - - Nếu bạn bật cài đặt này, Tìm kiếm an toàn trong Google Tìm kiếm và YouTube luôn hoạt động. - - Nếu bạn tắt cài đặt này hoặc không đặt một giá trị, Tìm kiếm an toàn trong Google Tìm kiếm và YouTube sẽ không hoạt động.</translation> <translation id="8906768759089290519">Bật chế độ khách</translation> <translation id="8908294717014659003">Cho phép bạn đặt liệu trang web có được phép truy cập vào thiết bị thu dữ liệu truyền thông hay không. Quyền truy cập vào thiết bị thu dữ liệu truyền thông có thể được phép theo mặc định hoặc người dùng có thể được hỏi mỗi lần trang web muốn có quyền truy cập vào thiết bị thu dữ liệu truyền thông.
diff --git a/components/policy/resources/policy_templates_zh-CN.xtb b/components/policy/resources/policy_templates_zh-CN.xtb index e5849f6..8893425 100644 --- a/components/policy/resources/policy_templates_zh-CN.xtb +++ b/components/policy/resources/policy_templates_zh-CN.xtb
@@ -190,15 +190,6 @@ 如果此政策未配置或设为“tls1.2”,<ph name="PRODUCT_NAME" /> 将不再执行此回退。请注意,这并不会导致停止支持旧版 TLS,只是用于指定 <ph name="PRODUCT_NAME" /> 是否忽略存在错误且无法正确协商版本的服务器。 在其他情况下,如果必须与存在错误的服务器保持兼容,则可将此政策设为“tls1.1”。这是一种权宜之计,服务器中的错误应该很快会得到解决。</translation> -<translation id="1861037019115362154">指定在 <ph name="PRODUCT_NAME" />中停用的插件列表,并禁止用户更改此设置。 - - 可使用通配符“*”和“?”匹配任意字符序列。“*”可匹配任意数量的字符,而“?”可指定单个可选的字符,即匹配零个或一个字符。转义字符为“\”,因此要匹配实际的“*”、“?”或“\”字符,您可以在这些字符前加上“\”。 - - 如果您启用此设置,那么指定列表中的插件就从不会在 <ph name="PRODUCT_NAME" />中使用。这些插件在“about:plugins”中标记为“已停用”,而且用户无法启用它们。 - - 请注意,此策略可由 EnabledPlugins 和 DisabledPluginsExceptions 覆盖。 - - 如果未设置此策略,那么用户就可以使用系统中安装的任何插件(硬编码的不兼容、过期或危险插件除外)。</translation> <translation id="1864269674877167562">如果此政策设为空字符串或未设置,<ph name="PRODUCT_OS_NAME" />将不会在用户登录期间显示自动填充选项。 如果此政策设为表示域名的字符串,<ph name="PRODUCT_OS_NAME" />将在用户登录期间显示自动填充选项,以便用户只输入自己的用户名,而无需输入网域扩展名。用户可以覆盖此网域扩展名。</translation> <translation id="1865417998205858223">密钥使用权限</translation> @@ -791,11 +782,6 @@ <translation id="3660562134618097814">在用户登录期间转移 SAML IdP Cookie</translation> <translation id="3709266154059827597">配置扩展程序安装黑名单</translation> <translation id="3711895659073496551">暂停</translation> -<translation id="3715448429089775791">强制启用 YouTube 安全模式,并禁止用户更改此设置。 - - 如果您启用了此设置,YouTube 中将始终启用安全模式。 - - 如果您停用了此设置或未指定值,YouTube 中将不会强制启用安全模式。</translation> <translation id="3750220015372671395">禁止在这些网站上使用密钥生成功能</translation> <translation id="3756011779061588474">禁止开发者模式</translation> <translation id="3758089716224084329">可让您指定 <ph name="PRODUCT_NAME" /> 使用的代理服务器,并禁止用户更改代理设置。 @@ -1931,9 +1917,6 @@ 已识别的连接类型标识符包括“以太网”、“Wi-Fi”、“WiMax”、“蓝牙”和“移动”网络。</translation> <translation id="7763614521440615342">在“打开新的标签页”页面上显示内容建议</translation> -<translation id="7766336524667238790">报告当前自助服务终端的相关信息,例如应用 ID 和版本。 - - 如果此政策设为 false,系统将不会报告会话信息。如果此政策设为 true 或未设置,系统将报告会话信息。</translation> <translation id="7774768074957326919">使用系统代理设置</translation> <translation id="7775831859772431793">您可以在此指定代理服务器的网址。 @@ -2144,6 +2127,10 @@ <translation id="8369602308428138533">使用交流电源供电时的屏幕关闭延迟时间</translation> <translation id="8382184662529825177">允许为设备使用远程认证来保护内容</translation> <translation id="838870586332499308">启用数据漫游</translation> +<translation id="8390049129576938611">在 <ph name="PRODUCT_NAME" /> 中停用内部 PDF 查看器。否则,Google Chrome 会将其视为下载内容并允许用户使用默认应用打开 PDF 文件。 + + 如果此政策未设置或已停用,系统将使用 PDF 插件打开 PDF 文件,除非用户已停用此插件。</translation> +<translation id="8402079500086185021">始终使用外部应用打开 PDF 文件</translation> <translation id="8412312801707973447">是否执行在线 OCSP/CRL 检查</translation> <translation id="8413348101535146315">允许在 <ph name="PRODUCT_NAME" /> 的任务管理器中结束进程。 @@ -2164,17 +2151,6 @@ 要查看示例格式,请访问 https://www.chromium.org/developers/how-tos/chrome-frame-getting-started。</translation> <translation id="8493645415242333585">停用保存浏览器历史记录的功能</translation> <translation id="8499172469244085141">默认设置(用户可以覆盖)</translation> -<translation id="8501011084242226370">指定用户可在<ph name="PRODUCT_NAME" />中启用或停用的一系列插件。 - - 通配符“*”和“?”可用于匹配一串任意字符。“*”可匹配任意多个字符,而“?”可指定单个可选字符,即匹配0个或1个字符。转义字符为“\”,因此如果要匹配实际的“*”、“?”或“\”字符,您可以在这些字符前加上“\”。 - - 如果您启用了此设置,用户将可以在<ph name="PRODUCT_NAME" />中使用指定的一系列插件。即使相应插件还与“DisabledPlugins”中的格式匹配,用户也可以在“about:plugins”中将其启用或停用。用户还可以启用和停用与“DisabledPlugins”、“DisabledPluginsExceptions”和“EnabledPlugins”中的任何格式均不匹配的插件。 - - 此政策用于在以下情况下实现严格的插件黑名单设置:“DisabledPlugins”列表包含带通配符的条目,例如禁用所有插件(*)或禁用所有Java插件(*Java*),但管理员希望启用某些特定版本(例如“IcedTea Java 2.3”)。这些版本可在此政策中指定。 - - 请注意,相应插件的名称和组名称都需要予以排除。在“about:plugins”中,每个插件组都会显示在一个单独的部分内;每个部分可以包含一个或多个插件。例如:“Shockwave Flash”插件属于“Adobe Flash Player”组,如果要从黑名单中排除该插件,那么例外列表中必须有这两个名称的匹配项。 - - 如果此政策未设置,那么与“DisabledPlugins”中的格式匹配的所有插件都将被锁定为停用状态,并且用户无法启用这些插件。</translation> <translation id="8519264904050090490">托管用户手动管理的例外网址</translation> <translation id="8544375438507658205">默认 HTML 呈现器为“<ph name="PRODUCT_FRAME_NAME" />”</translation> <translation id="8549772397068118889">访问非内容包内的网站时发出警告</translation> @@ -2199,7 +2175,6 @@ 如果有多个服务器名称,要使用英文逗号分隔。允许使用通配符 (*)。 如果此政策未设置,<ph name="PRODUCT_NAME" /> 将会尝试检测某个服务器是否在内网上,只有当该服务器在内网上时,该浏览器才会回应 IWA 请求。如果检测到某个服务器在互联网上,<ph name="PRODUCT_NAME" /> 将忽略来自它的 IWA 请求。</translation> -<translation id="8668394701842594241">指定在 <ph name="PRODUCT_NAME" />中启用的插件的列表,并禁止用户更改此设置。可使用通配符“*”和“?”匹配任意字符序列。“*”可匹配任意数量的字符,而“?”可指定单个可选的字符,即匹配零个或一个字符。转义字符为“\”,因此要匹配实际的“*”、“?”或“\”字符,您可以在这些字符前加上“\”。列表中指定的插件如果已安装,就会始终在 <ph name="PRODUCT_NAME" />中使用。这些插件在“about:plugins”中标记为“已启用”,而且用户无法停用它们。请注意,此政策可替换 DisabledPlugins 和 DisabledPluginsExceptions 这两者。如果未设置此政策,用户就可以停用系统中安装的任何插件。</translation> <translation id="8672321184841719703">目标自动更新版本</translation> <translation id="868068801094828689">允许向 Google 匿名报告 <ph name="PRODUCT_NAME" /> 的使用情况和崩溃数据,并禁止用户更改此设置。 @@ -2265,13 +2240,6 @@ 如果此政策设为 false,设备将不会尝试联系 Quirks Server 来下载配置文件。 如果此政策设为 true 或未设置,<ph name="PRODUCT_OS_NAME" />将自动联系 Quirks Server 并下载配置文件(如果有),然后将这些文件存储在设备上。此类文件可能会用于多种目的,例如改善所连接的显示器的显示质量。</translation> -<translation id="8905426178924715309">此政策已弃用,请改用 ForceGoogleSafeSearch 和 ForceYouTubeSafetyMode。如果设置了 ForceGoogleSafeSearch 或 ForceYouTubeSafetyMode 政策,此政策将被忽略。 - - 强制启用安全搜索功能来处理 Google 网页搜索中的查询,并禁止用户更改此设置。此设置还会强制在 YouTube 中启用安全模式。 - - 如果您启用了此设置,Google 搜索和 YouTube 中的安全搜索功能将始终处于启用状态。 - - 如果您停用了此设置或未设置值,系统将不会在 Google 搜索和 YouTube 中强制启用安全搜索功能。</translation> <translation id="8906768759089290519">启用访客模式</translation> <translation id="8908294717014659003">允许您设置是否允许网站访问媒体捕获设备。系统默认为允许访问媒体捕获设备,否则,每次有网站要访问媒体捕获设备时都要征询用户同意。
diff --git a/components/policy/resources/policy_templates_zh-TW.xtb b/components/policy/resources/policy_templates_zh-TW.xtb index 3c29eee..db167bd 100644 --- a/components/policy/resources/policy_templates_zh-TW.xtb +++ b/components/policy/resources/policy_templates_zh-TW.xtb
@@ -207,15 +207,6 @@ 如果未設定這項政策,或是將這項政策的值設為「tls1.2」,<ph name="PRODUCT_NAME" /> 就不會再執行這項遞補程序。請注意,這只會影響 <ph name="PRODUCT_NAME" /> 是否略過發生錯誤的伺服器 (無法正確交涉版本),系統並不會因此停止支援較舊的 TLS 版本。 如果實際狀況與上述情形皆不相符,而必須與發生錯誤的伺服器維持相容,系統可能會將這項政策的值設為「tls1.1」。這種方法是權宜之計,伺服器錯誤應該很快就會解決。</translation> -<translation id="1861037019115362154">指定在 <ph name="PRODUCT_NAME" /> 中停用的外掛程式清單,並且防止使用者變更這項設定。 - - 萬用字元「*」和「?」可與任意字元序列比對。「*」可與任意數量的字元比對,但「?」只能指定選擇性的單一字元,例如與零或一個字元比對。逸出字元為「\」,因此如要與真正的「*」、「?」或「\」字元配對,請在這些字元前方插入「\」。 - - 如果您啟用這項設定,<ph name="PRODUCT_NAME" /> 就不會使用指定的外掛程式清單。系統會在「about:plugins」中將外掛程式標示為已停用,並且禁止使用者啟用這些外掛程式。 - - 注意,EnabledPlugins 和 DisabledPluginsExceptions 可能會覆寫這項政策。 - - 如果您未設定這項政策,使用者即可使用系統上安裝的任何外掛程式,但採用固定性程式、不相容、過舊或危險的外掛程式除外。</translation> <translation id="1864269674877167562">如果將這項政策設為空白字串或不予設定,<ph name="PRODUCT_OS_NAME" /> 將不會在使用者登入過程中顯示自動完成選項。 如果將這項政策設為代表網域名稱的字串,<ph name="PRODUCT_OS_NAME" /> 則會在使用者登入過程中顯示自動完成選項,讓使用者輸入自己的使用者名稱 (不含網域名稱)。不過,使用者可以覆寫您在這裡指定的網域名稱。</translation> <translation id="1865417998205858223">金鑰權限</translation> @@ -815,11 +806,6 @@ <translation id="3660562134618097814">登入時移轉 SAML IdP Cookie</translation> <translation id="3709266154059827597">設定擴充功能安裝黑名單</translation> <translation id="3711895659073496551">暫停</translation> -<translation id="3715448429089775791">強制啟用 YouTube 安全模式,並禁止使用者變更這項設定。 - - 如果啟用這項設定,系統一律會啟用 YouTube 安全模式。 - - 如果停用這項設定或未指定設定值,則不會強制啟用 YouTube 安全模式。</translation> <translation id="3750220015372671395">禁止在這些網站上使用金鑰產生功能</translation> <translation id="3756011779061588474">封鎖開發人員模式</translation> <translation id="3758089716224084329">允許你指定 <ph name="PRODUCT_NAME" /> 使用的 Proxy 伺服器,並禁止使用者變更 Proxy 設定。 @@ -1979,11 +1965,6 @@ 系統可識別的連線類型識別碼包括「ethernet」、「wifi」、「wimax」、「bluetooth」和「cellular」。</translation> <translation id="7763614521440615342">在新分頁顯示內容建議</translation> -<translation id="7766336524667238790">回報執行中資訊站工作階段的相關資訊,例如 - 應用程式 ID 和版本。 - - 如果將這項政策設為 False,系統不會回報工作階段資訊。 - 如果設為 True 或未設定,則會回報工作階段資訊。</translation> <translation id="7774768074957326919">使用系統 Proxy 設定</translation> <translation id="7775831859772431793">您可以在這裡指定 Proxy 伺服器的網址。 @@ -2194,6 +2175,10 @@ <translation id="8369602308428138533">在 AC 供電環境下執行時的螢幕關閉延遲時間</translation> <translation id="8382184662529825177">啟用可用於保護裝置內容的遠端認證機制</translation> <translation id="838870586332499308">啟用數據漫遊</translation> +<translation id="8390049129576938611">停用 <ph name="PRODUCT_NAME" /> 的內部 PDF 檢視器。改為將 PDF 檔案視為下載項目,允許使用者使用預設的應用程式開啟。 + + 如果未設定或停用這項政策,則會使用 PDF 外掛程式開啟 PDF 檔案 (除非遭到使用者停用)。</translation> +<translation id="8402079500086185021">一律使用外部應用程式開啟 PDF 檔案</translation> <translation id="8412312801707973447">不論線上 OCSP/CRL 檢查是否執行</translation> <translation id="8413348101535146315">允許在「<ph name="PRODUCT_NAME" />」的工作管理員中結束處理程序。 @@ -2214,17 +2199,6 @@ 如需模式範例,請參閱 https://www.chromium.org/developers/how-tos/chrome-frame-getting-started。</translation> <translation id="8493645415242333585">停用儲存瀏覽紀錄功能</translation> <translation id="8499172469244085141">預設設定 (使用者可覆寫)</translation> -<translation id="8501011084242226370">指定使用者可以在 <ph name="PRODUCT_NAME" /> 中啟用或停用的外掛程式清單。 - - 萬用字元「*」和「?」可與任意字元序列比對。「*」可與任意數量的字元相配,但「?」只能指定選擇性的單一字元,例如與零或一個字元相配。逸出字元為「\」,因此如要與真正的「*」、「?」或「\」字元配對,請在這些字元前方插入「\」。 - - 如果您啟用這項設定,就可以在 <ph name="PRODUCT_NAME" /> 中使用指定的外掛程式清單。使用者可在「about:plugins」中啟用或停用這些外掛程式,即使該外掛程式也與 DisabledPlugins 中的模式相符亦然。此外,使用者也可啟用或停用與 DisabledPlugins、DisabledPluginsExceptions 和 EnabledPlugins 中任何模式不相符的外掛程式。 - - 這項政策的目的是為了在以下情況中產生嚴格的外掛程式黑名單設定:如果「DisabledPlugins」清單中以萬用字元設定了某些黑名單項目 (例如以「*」停用所有外掛程式、以「*Java*」停用所有 Java 外掛程式) ,但管理員希望啟用某些特定的版本 (例如「IcedTea Java 2.3」),就能在這項政策中指定要允許的版本。 - - 請注意,外掛程式名稱與其群組名稱必需同時受到豁免。about:plugins 中會分部列出各個外掛程式群組,每部分包含一或多個外掛程式。例如,假設有一個「Shockwave Flash」外掛程式屬於「Adobe Flash Player」群組,若這個外掛程式已為黑名單豁免,例外清單即應包含這兩個名稱。 - - 如果這項政策未設定符合「DisabledPlugins」中模式的外掛程式,這項政策將鎖定為停用,且使用者無法再啟用。</translation> <translation id="8519264904050090490">管理化環境下使用者手動建立的例外網址</translation> <translation id="8544375438507658205">預設 <ph name="PRODUCT_FRAME_NAME" /> 的 HTML 轉譯器</translation> <translation id="8549772397068118889">瀏覽內容套件以外的網站時顯示警告</translation> @@ -2250,7 +2224,6 @@ 請以逗號分隔多個伺服器名稱。可允許萬用字元 (*)。 如果未設定這項政策,<ph name="PRODUCT_NAME" /> 會嘗試偵測伺服器是否位於內部網路,然後回應伺服器傳來的 IWA 要求。如果伺服器位於網際網路,<ph name="PRODUCT_NAME" /> 就會忽略伺服器傳來的 IWA 要求。</translation> -<translation id="8668394701842594241">指定在「<ph name="PRODUCT_NAME" />」中啟用的外掛程式清單並禁止使用者變更這項設定。萬用字元「*」和「?」可與任意字元序列相配。「*」可與任意數量的字元相配,但「?」只能指定選擇性的單一字元,例如與零或一個字元相配。逸出字元為「\」,因此如要與真正的「*」、「?」或「\」字元配對,請在這些字元前方插入「\」。如果已安裝指定清單上的外掛程式,這些指定清單的外掛程式會一律在「<ph name="PRODUCT_NAME" />」中使用。這些外掛程式會在「about:plugins」中標示為已啟用,且使用者無法停用這些外掛程式。請注意,本政策會同時覆寫 DisabledPlugins 和 DisabledPluginsExceptions。如果未設定這項政策,使用者可以停用系統上安裝的任何外掛程式。</translation> <translation id="8672321184841719703">指定目標的自動更新版本</translation> <translation id="868068801094828689">允許以匿名方式向 Google 回報 <ph name="PRODUCT_NAME" /> 使用情形和當機相關資料,並禁止使用者變更這項設定。 @@ -2329,13 +2302,6 @@ 自動連線至 Quirks Server,將可用的設定檔 下載並儲存到裝置上。這類檔案可能用於 改善連接螢幕的顯示品質。</translation> -<translation id="8905426178924715309">這項政策已不適用,請改用 ForceGoogleSafeSearch 和 ForceYouTubeSafetyMode。如果設定 ForceGoogleSafeSearch 或 ForceYouTubeSafetyMode 政策,系統將會忽略這項政策。 - - 強制啟用安全搜尋服務,處理 Google 網頁搜尋中的查詢,並且防止使用者變更這項設定。這項設定也會強制執行 YouTube 安全模式。 - - 如果您啟用這項設定,系統一律會啟用 Google 搜尋和 YouTube 中的安全搜尋服務。 - - 如果您停用這項設定或尚未設定值,就不會在 Google 搜尋和 YouTube 中強制執行安全搜尋服務。</translation> <translation id="8906768759089290519">啟用訪客模式</translation> <translation id="8908294717014659003">讓您設定網站是否允許網站存取媒體擷取裝置。根據預設,系統允許網站存取媒體擷取裝置,您也可設為每當網站要存取媒體擷取裝置時詢問使用者。
diff --git a/components/power/origin_power_map_unittest.cc b/components/power/origin_power_map_unittest.cc index 1589968..061f9bdd 100644 --- a/components/power/origin_power_map_unittest.cc +++ b/components/power/origin_power_map_unittest.cc
@@ -97,8 +97,8 @@ EXPECT_DOUBLE_EQ(10, origin_power_map.GetPowerForOrigin(url5)); // Delete |url1|. - origin_power_map.ClearOriginMap( - base::Bind(&GURL::operator==, base::Unretained(&url1))); + origin_power_map.ClearOriginMap(base::Bind( + static_cast<bool (*)(const GURL&, const GURL&)>(operator==), url1)); EXPECT_DOUBLE_EQ(0, origin_power_map.GetPowerForOrigin(url1)); EXPECT_DOUBLE_EQ(40, origin_power_map.GetPowerForOrigin(url2)); EXPECT_DOUBLE_EQ(30, origin_power_map.GetPowerForOrigin(url3));
diff --git a/components/prefs/BUILD.gn b/components/prefs/BUILD.gn index ff4e1f2..b2eb853 100644 --- a/components/prefs/BUILD.gn +++ b/components/prefs/BUILD.gn
@@ -4,6 +4,8 @@ component("prefs") { sources = [ + "command_line_pref_store.cc", + "command_line_pref_store.h", "default_pref_store.cc", "default_pref_store.h", "in_memory_pref_store.cc",
diff --git a/components/prefs/command_line_pref_store.cc b/components/prefs/command_line_pref_store.cc new file mode 100644 index 0000000..f8a503e5 --- /dev/null +++ b/components/prefs/command_line_pref_store.cc
@@ -0,0 +1,80 @@ +// 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/prefs/command_line_pref_store.h" + +#include <string> + +#include "base/files/file_path.h" +#include "base/memory/ptr_util.h" +#include "base/strings/string_number_conversions.h" + +CommandLinePrefStore::CommandLinePrefStore( + const base::CommandLine* command_line) + : command_line_(command_line) {} + +CommandLinePrefStore::~CommandLinePrefStore() {} + +void CommandLinePrefStore::ApplyStringSwitches( + const CommandLinePrefStore::SwitchToPreferenceMapEntry string_switch[], + size_t size) { + for (size_t i = 0; i < size; ++i) { + if (command_line_->HasSwitch(string_switch[i].switch_name)) { + SetValue(string_switch[i].preference_path, + base::MakeUnique<base::StringValue>( + command_line_->GetSwitchValueASCII( + string_switch[i].switch_name)), + WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS); + } + } +} + +void CommandLinePrefStore::ApplyPathSwitches( + const CommandLinePrefStore::SwitchToPreferenceMapEntry path_switch[], + size_t size) { + for (size_t i = 0; i < size; ++i) { + if (command_line_->HasSwitch(path_switch[i].switch_name)) { + SetValue( + path_switch[i].preference_path, + base::MakeUnique<base::StringValue>( + command_line_->GetSwitchValuePath(path_switch[i].switch_name) + .value()), + WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS); + } + } +} + +void CommandLinePrefStore::ApplyIntegerSwitches( + const CommandLinePrefStore::SwitchToPreferenceMapEntry integer_switch[], + size_t size) { + for (size_t i = 0; i < size; ++i) { + if (command_line_->HasSwitch(integer_switch[i].switch_name)) { + std::string str_value = command_line_->GetSwitchValueASCII( + integer_switch[i].switch_name); + int int_value = 0; + if (!base::StringToInt(str_value, &int_value)) { + LOG(ERROR) << "The value " << str_value << " of " + << integer_switch[i].switch_name + << " can not be converted to integer, ignoring!"; + continue; + } + SetValue(integer_switch[i].preference_path, + base::MakeUnique<base::FundamentalValue>(int_value), + WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS); + } + } +} + +void CommandLinePrefStore::ApplyBooleanSwitches( + const CommandLinePrefStore::BooleanSwitchToPreferenceMapEntry + boolean_switch_map[], size_t size) { + for (size_t i = 0; i < size; ++i) { + if (command_line_->HasSwitch(boolean_switch_map[i].switch_name)) { + SetValue(boolean_switch_map[i].preference_path, + base::MakeUnique<base::FundamentalValue>( + boolean_switch_map[i].set_value), + WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS); + } + } +}
diff --git a/components/prefs/command_line_pref_store.h b/components/prefs/command_line_pref_store.h new file mode 100644 index 0000000..03d5da9 --- /dev/null +++ b/components/prefs/command_line_pref_store.h
@@ -0,0 +1,66 @@ +// 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 COMPONENTS_PREFS_COMMAND_LINE_PREF_STORE_H_ +#define COMPONENTS_PREFS_COMMAND_LINE_PREF_STORE_H_ + +#include "base/command_line.h" +#include "base/macros.h" +#include "base/values.h" +#include "components/prefs/value_map_pref_store.h" + +// Base class for a PrefStore that maps command line switches to preferences. +// The Apply...Switches() methods can be called by subclasses with their own +// maps, or delegated to other code. +class COMPONENTS_PREFS_EXPORT CommandLinePrefStore : public ValueMapPrefStore { + public: + struct SwitchToPreferenceMapEntry { + const char* switch_name; + const char* preference_path; + }; + + // |set_value| indicates what the preference should be set to if the switch + // is present. + struct BooleanSwitchToPreferenceMapEntry { + const char* switch_name; + const char* preference_path; + bool set_value; + }; + + // Apply command-line switches to the corresponding preferences of the switch + // map, where the value associated with the switch is a string. + void ApplyStringSwitches( + const SwitchToPreferenceMapEntry string_switch_map[], size_t size); + + // Apply command-line switches to the corresponding preferences of the switch + // map, where the value associated with the switch is a path. + void ApplyPathSwitches(const SwitchToPreferenceMapEntry path_switch_map[], + size_t size); + + // Apply command-line switches to the corresponding preferences of the switch + // map, where the value associated with the switch is an integer. + void ApplyIntegerSwitches( + const SwitchToPreferenceMapEntry integer_switch_map[], size_t size); + + // Apply command-line switches to the corresponding preferences of the + // boolean switch map. + void ApplyBooleanSwitches( + const BooleanSwitchToPreferenceMapEntry boolean_switch_map[], + size_t size); + + + protected: + explicit CommandLinePrefStore(const base::CommandLine* command_line); + ~CommandLinePrefStore() override; + + const base::CommandLine* command_line() { return command_line_; } + + private: + // Weak reference. + const base::CommandLine* command_line_; + + DISALLOW_COPY_AND_ASSIGN(CommandLinePrefStore); +}; + +#endif // COMPONENTS_PREFS_COMMAND_LINE_PREF_STORE_H_
diff --git a/components/previews/core/previews_opt_out_store_sql.cc b/components/previews/core/previews_opt_out_store_sql.cc index 1673b78..d4e6a59 100644 --- a/components/previews/core/previews_opt_out_store_sql.cc +++ b/components/previews/core/previews_opt_out_store_sql.cc
@@ -8,6 +8,7 @@ #include "base/bind_helpers.h" #include "base/files/file_util.h" #include "base/location.h" +#include "base/logging.h" #include "base/memory/ptr_util.h" #include "base/sequenced_task_runner.h" #include "base/threading/thread_task_runner_handle.h" @@ -27,6 +28,14 @@ // statements below. #define PREVIEWS_TABLE_NAME "previews_v1" +// The maximum number of entries allowed per host. Entries are evicted based on +// entry time. +const int kMaxRowsPerHost = 32; + +// The maximum number of entries allowed in the data base. Entries are evicted +// based on entry time. +const int kMaxRowsInDB = 3200; + void CreateSchema(sql::Connection* db) { const char kSql[] = "CREATE TABLE IF NOT EXISTS " PREVIEWS_TABLE_NAME " (host_name VARCHAR NOT NULL," @@ -94,6 +103,48 @@ CreateSchema(db); } +// Adds the new entry to the data base. +void AddPreviewNavigationToDataBase(sql::Connection* db, + bool opt_out, + const std::string& host_name, + PreviewsType type, + base::Time now) { + // Adds the new entry. + const char kSqlInsert[] = "INSERT INTO " PREVIEWS_TABLE_NAME + " (host_name, time, opt_out, type)" + " VALUES " + " (?, ?, ?, ?)"; + + sql::Statement statement_insert( + db->GetCachedStatement(SQL_FROM_HERE, kSqlInsert)); + statement_insert.BindString(0, host_name); + statement_insert.BindInt64(1, now.ToInternalValue()); + statement_insert.BindBool(2, opt_out); + statement_insert.BindInt(3, static_cast<int>(type)); + statement_insert.Run(); +} + +// Removes entries for |host_name| if the per-host row limit is exceeded. +// Removes entries if per data base row limit is exceeded. +void MaybeEvictHostEntryFromDataBase(sql::Connection* db, + const std::string& host_name) { + // Delete the oldest entries if there are more than |kMaxRowsPerHost| for + // |host_name|. + // DELETE ... LIMIT -1 OFFSET x means delete all but the first x entries. + const char kSqlDeleteByHost[] = "DELETE FROM " PREVIEWS_TABLE_NAME + " WHERE ROWID IN" + " (SELECT ROWID from " PREVIEWS_TABLE_NAME + " WHERE host_name == ?" + " ORDER BY time DESC" + " LIMIT -1 OFFSET ?)"; + + sql::Statement statement_delete_by_host( + db->GetCachedStatement(SQL_FROM_HERE, kSqlDeleteByHost)); + statement_delete_by_host.BindString(0, host_name); + statement_delete_by_host.BindInt(1, kMaxRowsPerHost); + statement_delete_by_host.Run(); +} + void LoadBlackListFromDataBase( sql::Connection* db, scoped_refptr<base::SingleThreadTaskRunner> runner, @@ -107,9 +158,11 @@ sql::Statement statement(db->GetUniqueStatement(kSql)); std::unique_ptr<BlackListItemMap> black_list_item_map(new BlackListItemMap()); + int count = 0; // Add the host name, the visit time, and opt out history to // |black_list_item_map|. while (statement.Step()) { + ++count; std::string host_name = statement.ColumnString(0); PreviewsBlackListItem* black_list_item = PreviewsBlackList::GetOrCreateBlackListItem(black_list_item_map.get(), @@ -124,12 +177,28 @@ base::Time::FromInternalValue(statement.ColumnInt64(1))); } + // TODO(ryansturm): Add UMA to log |count|. crbug.com/656739 + if (count > kMaxRowsInDB) { + // Delete the oldest entries if there are more than |kMaxEntriesInDB|. + // DELETE ... LIMIT -1 OFFSET x means delete all but the first x entries. + const char kSqlDeleteByDBSize[] = "DELETE FROM " PREVIEWS_TABLE_NAME + " WHERE ROWID IN" + " (SELECT ROWID from " PREVIEWS_TABLE_NAME + " ORDER BY time DESC" + " LIMIT -1 OFFSET ?)"; + + sql::Statement statement_delete( + db->GetCachedStatement(SQL_FROM_HERE, kSqlDeleteByDBSize)); + statement_delete.BindInt(0, kMaxRowsInDB); + statement_delete.Run(); + } + runner->PostTask(FROM_HERE, base::Bind(callback, base::Passed(&black_list_item_map))); } -// Synchronous implementation, this is run on the background thread -// and actually does the work to access SQL. +// Synchronous implementations, these are run on the background thread +// and actually do the work to access the SQL data base. void LoadBlackListSync(sql::Connection* db, const base::FilePath& path, scoped_refptr<base::SingleThreadTaskRunner> runner, @@ -140,6 +209,33 @@ LoadBlackListFromDataBase(db, runner, callback); } +// Deletes every row in the table that has entry time between |begin_time| and +// |end_time|. +void ClearBlackListSync(sql::Connection* db, + base::Time begin_time, + base::Time end_time) { + const char kSql[] = + "DELETE FROM " PREVIEWS_TABLE_NAME " WHERE time >= ? and time <= ?"; + + sql::Statement statement(db->GetUniqueStatement(kSql)); + statement.BindInt64(0, begin_time.ToInternalValue()); + statement.BindInt64(1, end_time.ToInternalValue()); + statement.Run(); +} + +void AddPreviewNavigationSync(bool opt_out, + const std::string& host_name, + PreviewsType type, + base::Time now, + sql::Connection* db) { + sql::Transaction transaction(db); + if (!transaction.Begin()) + return; + AddPreviewNavigationToDataBase(db, opt_out, host_name, type, now); + MaybeEvictHostEntryFromDataBase(db, host_name); + transaction.Commit(); +} + } // namespace PreviewsOptOutStoreSQL::PreviewsOptOutStoreSQL( @@ -160,10 +256,22 @@ void PreviewsOptOutStoreSQL::AddPreviewNavigation(bool opt_out, const std::string& host_name, PreviewsType type, - base::Time now) {} + base::Time now) { + DCHECK(io_task_runner_->BelongsToCurrentThread()); + DCHECK(db_.get()); + background_task_runner_->PostTask( + FROM_HERE, base::Bind(&AddPreviewNavigationSync, opt_out, host_name, type, + now, db_.get())); +} void PreviewsOptOutStoreSQL::ClearBlackList(base::Time begin_time, - base::Time end_time) {} + base::Time end_time) { + DCHECK(io_task_runner_->BelongsToCurrentThread()); + DCHECK(db_.get()); + background_task_runner_->PostTask( + FROM_HERE, + base::Bind(&ClearBlackListSync, db_.get(), begin_time, end_time)); +} void PreviewsOptOutStoreSQL::LoadBlackList(LoadBlackListCallback callback) { DCHECK(io_task_runner_->BelongsToCurrentThread());
diff --git a/components/printing/renderer/print_web_view_helper.cc b/components/printing/renderer/print_web_view_helper.cc index 7e9df81..74b4d44f 100644 --- a/components/printing/renderer/print_web_view_helper.cc +++ b/components/printing/renderer/print_web_view_helper.cc
@@ -803,11 +803,11 @@ blink::WebView* web_view = frame->view(); if (is_printing_started_) { is_printing_started_ = false; - frame->printEnd(); if (!owns_web_view_) { web_view->settings()->setShouldPrintBackgrounds(false); RestoreSize(); } + frame->printEnd(); } if (owns_web_view_) { DCHECK(!frame->isLoading());
diff --git a/components/resources/components_scaled_resources.grd b/components/resources/components_scaled_resources.grd index ace356f..2403267 100644 --- a/components/resources/components_scaled_resources.grd +++ b/components/resources/components_scaled_resources.grd
@@ -16,7 +16,6 @@ <part file="crash_scaled_resources.grdp" /> <part file="flags_ui_scaled_resources.grdp" /> <part file="neterror_scaled_resources.grdp" /> - <part file="omnibox_scaled_resources.grdp" /> <part file="version_ui_scaled_resources.grdp" /> <!-- Generic resources -->
diff --git a/components/resources/default_100_percent/omnibox/omnibox_search_button_loupe.png b/components/resources/default_100_percent/neterror/search_glass.png similarity index 100% rename from components/resources/default_100_percent/omnibox/omnibox_search_button_loupe.png rename to components/resources/default_100_percent/neterror/search_glass.png Binary files differ
diff --git a/components/resources/default_100_percent/omnibox/controlled_setting_mandatory.png b/components/resources/default_100_percent/omnibox/controlled_setting_mandatory.png deleted file mode 100644 index 5735ead5..0000000 --- a/components/resources/default_100_percent/omnibox/controlled_setting_mandatory.png +++ /dev/null Binary files differ
diff --git a/components/resources/default_100_percent/omnibox/ios/omnibox_history.png b/components/resources/default_100_percent/omnibox/ios/omnibox_history.png deleted file mode 100644 index 9b63e262..0000000 --- a/components/resources/default_100_percent/omnibox/ios/omnibox_history.png +++ /dev/null Binary files differ
diff --git a/components/resources/default_100_percent/omnibox/ios/omnibox_history_incognito.png b/components/resources/default_100_percent/omnibox/ios/omnibox_history_incognito.png deleted file mode 100644 index 418d0b4..0000000 --- a/components/resources/default_100_percent/omnibox/ios/omnibox_history_incognito.png +++ /dev/null Binary files differ
diff --git a/components/resources/default_100_percent/omnibox/ios/omnibox_http.png b/components/resources/default_100_percent/omnibox/ios/omnibox_http.png deleted file mode 100644 index 8de583e..0000000 --- a/components/resources/default_100_percent/omnibox/ios/omnibox_http.png +++ /dev/null Binary files differ
diff --git a/components/resources/default_100_percent/omnibox/ios/omnibox_http_incognito.png b/components/resources/default_100_percent/omnibox/ios/omnibox_http_incognito.png deleted file mode 100644 index 2f5e5e8d..0000000 --- a/components/resources/default_100_percent/omnibox/ios/omnibox_http_incognito.png +++ /dev/null Binary files differ
diff --git a/components/resources/default_100_percent/omnibox/ios/omnibox_https_invalid.png b/components/resources/default_100_percent/omnibox/ios/omnibox_https_invalid.png deleted file mode 100644 index ba50e5e..0000000 --- a/components/resources/default_100_percent/omnibox/ios/omnibox_https_invalid.png +++ /dev/null Binary files differ
diff --git a/components/resources/default_100_percent/omnibox/ios/omnibox_https_valid.png b/components/resources/default_100_percent/omnibox/ios/omnibox_https_valid.png deleted file mode 100644 index 9337d655..0000000 --- a/components/resources/default_100_percent/omnibox/ios/omnibox_https_valid.png +++ /dev/null Binary files differ
diff --git a/components/resources/default_100_percent/omnibox/ios/omnibox_search.png b/components/resources/default_100_percent/omnibox/ios/omnibox_search.png deleted file mode 100644 index 2a8eb96..0000000 --- a/components/resources/default_100_percent/omnibox/ios/omnibox_search.png +++ /dev/null Binary files differ
diff --git a/components/resources/default_100_percent/omnibox/ios/omnibox_search_incognito.png b/components/resources/default_100_percent/omnibox/ios/omnibox_search_incognito.png deleted file mode 100644 index 4c84df0..0000000 --- a/components/resources/default_100_percent/omnibox/ios/omnibox_search_incognito.png +++ /dev/null Binary files differ
diff --git a/components/resources/default_100_percent/omnibox/location_bar_http.png b/components/resources/default_100_percent/omnibox/location_bar_http.png deleted file mode 100644 index dd2cf041..0000000 --- a/components/resources/default_100_percent/omnibox/location_bar_http.png +++ /dev/null Binary files differ
diff --git a/components/resources/default_100_percent/omnibox/omnibox_calculator.png b/components/resources/default_100_percent/omnibox/omnibox_calculator.png deleted file mode 100644 index de99d5a..0000000 --- a/components/resources/default_100_percent/omnibox/omnibox_calculator.png +++ /dev/null Binary files differ
diff --git a/components/resources/default_100_percent/omnibox/omnibox_extension_app.png b/components/resources/default_100_percent/omnibox/omnibox_extension_app.png deleted file mode 100644 index 73251fce..0000000 --- a/components/resources/default_100_percent/omnibox/omnibox_extension_app.png +++ /dev/null Binary files differ
diff --git a/components/resources/default_100_percent/omnibox/omnibox_http.png b/components/resources/default_100_percent/omnibox/omnibox_http.png deleted file mode 100644 index e7494a7f..0000000 --- a/components/resources/default_100_percent/omnibox/omnibox_http.png +++ /dev/null Binary files differ
diff --git a/components/resources/default_100_percent/omnibox/omnibox_https_invalid.png b/components/resources/default_100_percent/omnibox/omnibox_https_invalid.png deleted file mode 100644 index 0493dad..0000000 --- a/components/resources/default_100_percent/omnibox/omnibox_https_invalid.png +++ /dev/null Binary files differ
diff --git a/components/resources/default_100_percent/omnibox/omnibox_https_valid.png b/components/resources/default_100_percent/omnibox/omnibox_https_valid.png deleted file mode 100644 index dd176c5..0000000 --- a/components/resources/default_100_percent/omnibox/omnibox_https_valid.png +++ /dev/null Binary files differ
diff --git a/components/resources/default_100_percent/omnibox/omnibox_search.png b/components/resources/default_100_percent/omnibox/omnibox_search.png deleted file mode 100644 index e271f75..0000000 --- a/components/resources/default_100_percent/omnibox/omnibox_search.png +++ /dev/null Binary files differ
diff --git a/components/resources/default_200_percent/omnibox/omnibox_search_button_loupe.png b/components/resources/default_200_percent/neterror/search_glass.png similarity index 100% rename from components/resources/default_200_percent/omnibox/omnibox_search_button_loupe.png rename to components/resources/default_200_percent/neterror/search_glass.png Binary files differ
diff --git a/components/resources/default_200_percent/omnibox/controlled_setting_mandatory.png b/components/resources/default_200_percent/omnibox/controlled_setting_mandatory.png deleted file mode 100644 index ae0fee0f..0000000 --- a/components/resources/default_200_percent/omnibox/controlled_setting_mandatory.png +++ /dev/null Binary files differ
diff --git a/components/resources/default_200_percent/omnibox/ios/omnibox_history.png b/components/resources/default_200_percent/omnibox/ios/omnibox_history.png deleted file mode 100644 index a1ee7772..0000000 --- a/components/resources/default_200_percent/omnibox/ios/omnibox_history.png +++ /dev/null Binary files differ
diff --git a/components/resources/default_200_percent/omnibox/ios/omnibox_history_incognito.png b/components/resources/default_200_percent/omnibox/ios/omnibox_history_incognito.png deleted file mode 100644 index 6738098..0000000 --- a/components/resources/default_200_percent/omnibox/ios/omnibox_history_incognito.png +++ /dev/null Binary files differ
diff --git a/components/resources/default_200_percent/omnibox/ios/omnibox_http.png b/components/resources/default_200_percent/omnibox/ios/omnibox_http.png deleted file mode 100644 index cf21532..0000000 --- a/components/resources/default_200_percent/omnibox/ios/omnibox_http.png +++ /dev/null Binary files differ
diff --git a/components/resources/default_200_percent/omnibox/ios/omnibox_http_incognito.png b/components/resources/default_200_percent/omnibox/ios/omnibox_http_incognito.png deleted file mode 100644 index adb55f15..0000000 --- a/components/resources/default_200_percent/omnibox/ios/omnibox_http_incognito.png +++ /dev/null Binary files differ
diff --git a/components/resources/default_200_percent/omnibox/ios/omnibox_https_invalid.png b/components/resources/default_200_percent/omnibox/ios/omnibox_https_invalid.png deleted file mode 100644 index f797139..0000000 --- a/components/resources/default_200_percent/omnibox/ios/omnibox_https_invalid.png +++ /dev/null Binary files differ
diff --git a/components/resources/default_200_percent/omnibox/ios/omnibox_https_valid.png b/components/resources/default_200_percent/omnibox/ios/omnibox_https_valid.png deleted file mode 100644 index 092bf9b..0000000 --- a/components/resources/default_200_percent/omnibox/ios/omnibox_https_valid.png +++ /dev/null Binary files differ
diff --git a/components/resources/default_200_percent/omnibox/ios/omnibox_search.png b/components/resources/default_200_percent/omnibox/ios/omnibox_search.png deleted file mode 100644 index 72c30de..0000000 --- a/components/resources/default_200_percent/omnibox/ios/omnibox_search.png +++ /dev/null Binary files differ
diff --git a/components/resources/default_200_percent/omnibox/ios/omnibox_search_incognito.png b/components/resources/default_200_percent/omnibox/ios/omnibox_search_incognito.png deleted file mode 100644 index a1aaa55..0000000 --- a/components/resources/default_200_percent/omnibox/ios/omnibox_search_incognito.png +++ /dev/null Binary files differ
diff --git a/components/resources/default_200_percent/omnibox/location_bar_http.png b/components/resources/default_200_percent/omnibox/location_bar_http.png deleted file mode 100644 index 1293571..0000000 --- a/components/resources/default_200_percent/omnibox/location_bar_http.png +++ /dev/null Binary files differ
diff --git a/components/resources/default_200_percent/omnibox/omnibox_extension_app.png b/components/resources/default_200_percent/omnibox/omnibox_extension_app.png deleted file mode 100644 index 7474a39..0000000 --- a/components/resources/default_200_percent/omnibox/omnibox_extension_app.png +++ /dev/null Binary files differ
diff --git a/components/resources/default_200_percent/omnibox/omnibox_http.png b/components/resources/default_200_percent/omnibox/omnibox_http.png deleted file mode 100644 index ed146bdb..0000000 --- a/components/resources/default_200_percent/omnibox/omnibox_http.png +++ /dev/null Binary files differ
diff --git a/components/resources/default_200_percent/omnibox/omnibox_https_invalid.png b/components/resources/default_200_percent/omnibox/omnibox_https_invalid.png deleted file mode 100644 index e36f833..0000000 --- a/components/resources/default_200_percent/omnibox/omnibox_https_invalid.png +++ /dev/null Binary files differ
diff --git a/components/resources/default_200_percent/omnibox/omnibox_https_valid.png b/components/resources/default_200_percent/omnibox/omnibox_https_valid.png deleted file mode 100644 index 963354b..0000000 --- a/components/resources/default_200_percent/omnibox/omnibox_https_valid.png +++ /dev/null Binary files differ
diff --git a/components/resources/default_200_percent/omnibox/omnibox_search.png b/components/resources/default_200_percent/omnibox/omnibox_search.png deleted file mode 100644 index 46bc1049..0000000 --- a/components/resources/default_200_percent/omnibox/omnibox_search.png +++ /dev/null Binary files differ
diff --git a/components/resources/default_300_percent/omnibox/controlled_setting_mandatory.png b/components/resources/default_300_percent/omnibox/controlled_setting_mandatory.png deleted file mode 100644 index b83207e..0000000 --- a/components/resources/default_300_percent/omnibox/controlled_setting_mandatory.png +++ /dev/null Binary files differ
diff --git a/components/resources/default_300_percent/omnibox/ios/omnibox_history.png b/components/resources/default_300_percent/omnibox/ios/omnibox_history.png deleted file mode 100644 index cf654021..0000000 --- a/components/resources/default_300_percent/omnibox/ios/omnibox_history.png +++ /dev/null Binary files differ
diff --git a/components/resources/default_300_percent/omnibox/ios/omnibox_history_incognito.png b/components/resources/default_300_percent/omnibox/ios/omnibox_history_incognito.png deleted file mode 100644 index 44537f1..0000000 --- a/components/resources/default_300_percent/omnibox/ios/omnibox_history_incognito.png +++ /dev/null Binary files differ
diff --git a/components/resources/default_300_percent/omnibox/ios/omnibox_http.png b/components/resources/default_300_percent/omnibox/ios/omnibox_http.png deleted file mode 100644 index 2830184..0000000 --- a/components/resources/default_300_percent/omnibox/ios/omnibox_http.png +++ /dev/null Binary files differ
diff --git a/components/resources/default_300_percent/omnibox/ios/omnibox_http_incognito.png b/components/resources/default_300_percent/omnibox/ios/omnibox_http_incognito.png deleted file mode 100644 index 3cb92d6..0000000 --- a/components/resources/default_300_percent/omnibox/ios/omnibox_http_incognito.png +++ /dev/null Binary files differ
diff --git a/components/resources/default_300_percent/omnibox/ios/omnibox_https_invalid.png b/components/resources/default_300_percent/omnibox/ios/omnibox_https_invalid.png deleted file mode 100644 index 2b63261..0000000 --- a/components/resources/default_300_percent/omnibox/ios/omnibox_https_invalid.png +++ /dev/null Binary files differ
diff --git a/components/resources/default_300_percent/omnibox/ios/omnibox_https_valid.png b/components/resources/default_300_percent/omnibox/ios/omnibox_https_valid.png deleted file mode 100644 index c4511c6..0000000 --- a/components/resources/default_300_percent/omnibox/ios/omnibox_https_valid.png +++ /dev/null Binary files differ
diff --git a/components/resources/default_300_percent/omnibox/ios/omnibox_search.png b/components/resources/default_300_percent/omnibox/ios/omnibox_search.png deleted file mode 100644 index 79ed6e0c..0000000 --- a/components/resources/default_300_percent/omnibox/ios/omnibox_search.png +++ /dev/null Binary files differ
diff --git a/components/resources/default_300_percent/omnibox/ios/omnibox_search_incognito.png b/components/resources/default_300_percent/omnibox/ios/omnibox_search_incognito.png deleted file mode 100644 index 1892d6f..0000000 --- a/components/resources/default_300_percent/omnibox/ios/omnibox_search_incognito.png +++ /dev/null Binary files differ
diff --git a/components/resources/default_300_percent/omnibox/omnibox_extension_app.png b/components/resources/default_300_percent/omnibox/omnibox_extension_app.png deleted file mode 100644 index 590daaf..0000000 --- a/components/resources/default_300_percent/omnibox/omnibox_extension_app.png +++ /dev/null Binary files differ
diff --git a/components/resources/omnibox_scaled_resources.grdp b/components/resources/omnibox_scaled_resources.grdp deleted file mode 100644 index 1c69a1f6a..0000000 --- a/components/resources/omnibox_scaled_resources.grdp +++ /dev/null
@@ -1,25 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<grit-part> - <structure type="chrome_scaled_image" name="IDR_OMNIBOX_CALCULATOR" file="omnibox/omnibox_calculator.png" /> - <structure type="chrome_scaled_image" name="IDR_OMNIBOX_EXTENSION_APP" file="omnibox/omnibox_extension_app.png" /> - <structure type="chrome_scaled_image" name="IDR_OMNIBOX_HTTPS_POLICY_WARNING" file="omnibox/controlled_setting_mandatory.png" /> - <structure type="chrome_scaled_image" name="IDR_OMNIBOX_SEARCH_BUTTON_LOUPE" file="omnibox/omnibox_search_button_loupe.png" /> - <if expr="is_ios"> - <structure type="chrome_scaled_image" name="IDR_LOCATION_BAR_HTTP" file="omnibox/ios/omnibox_http.png" /> - <structure type="chrome_scaled_image" name="IDR_OMNIBOX_HISTORY" file="omnibox/ios/omnibox_history.png" /> - <structure type="chrome_scaled_image" name="IDR_OMNIBOX_HISTORY_INCOGNITO" file="omnibox/ios/omnibox_history_incognito.png" /> - <structure type="chrome_scaled_image" name="IDR_OMNIBOX_HTTP" file="omnibox/ios/omnibox_http.png" /> - <structure type="chrome_scaled_image" name="IDR_OMNIBOX_HTTPS_INVALID" file="omnibox/ios/omnibox_https_invalid.png" /> - <structure type="chrome_scaled_image" name="IDR_OMNIBOX_HTTPS_VALID" file="omnibox/ios/omnibox_https_valid.png" /> - <structure type="chrome_scaled_image" name="IDR_OMNIBOX_HTTP_INCOGNITO" file="omnibox/ios/omnibox_http_incognito.png" /> - <structure type="chrome_scaled_image" name="IDR_OMNIBOX_SEARCH" file="omnibox/ios/omnibox_search.png" /> - <structure type="chrome_scaled_image" name="IDR_OMNIBOX_SEARCH_INCOGNITO" file="omnibox/ios/omnibox_search_incognito.png" /> - </if> - <if expr="not is_ios"> - <structure type="chrome_scaled_image" name="IDR_LOCATION_BAR_HTTP" file="omnibox/location_bar_http.png" /> - <structure type="chrome_scaled_image" name="IDR_OMNIBOX_HTTP" file="omnibox/omnibox_http.png" /> - <structure type="chrome_scaled_image" name="IDR_OMNIBOX_HTTPS_INVALID" file="omnibox/omnibox_https_invalid.png" /> - <structure type="chrome_scaled_image" name="IDR_OMNIBOX_HTTPS_VALID" file="omnibox/omnibox_https_valid.png" /> - <structure type="chrome_scaled_image" name="IDR_OMNIBOX_SEARCH" file="omnibox/omnibox_search.png" /> - </if> -</grit-part>
diff --git a/components/safe_browsing_db/v4_store.cc b/components/safe_browsing_db/v4_store.cc index d16b76d..81f30ec7 100644 --- a/components/safe_browsing_db/v4_store.cc +++ b/components/safe_browsing_db/v4_store.cc
@@ -353,17 +353,20 @@ if (apply_update_result == APPLY_UPDATE_SUCCESS) { RecordApplyUpdateTime(metric, TimeTicks::Now() - before, store_path_); - // new_store is done updating, pass it to the callback. - callback_task_runner->PostTask( - FROM_HERE, base::Bind(callback, base::Passed(&new_store))); } else { + new_store.reset(); DVLOG(1) << "Failure: ApplyUpdate: reason: " << apply_update_result << "; store: " << *this; - // new_store failed updating. Pass a nullptr to the callback. - callback_task_runner->PostTask(FROM_HERE, base::Bind(callback, nullptr)); } RecordApplyUpdateResult(metric, apply_update_result, store_path_); + + // Posting the task should be the last thing to do in this function. + // Otherwise, the posted task can end up running in parallel. If that + // happens, the old store will get destoyed and can lead to use-after-free in + // this function. + callback_task_runner->PostTask( + FROM_HERE, base::Bind(callback, base::Passed(&new_store))); } ApplyUpdateResult V4Store::UpdateHashPrefixMapFromAdditions(
diff --git a/components/search_engines/BUILD.gn b/components/search_engines/BUILD.gn index e7551e5..c10c0d5f 100644 --- a/components/search_engines/BUILD.gn +++ b/components/search_engines/BUILD.gn
@@ -130,8 +130,8 @@ "//components/google/core/browser", "//components/pref_registry:test_support", "//components/prefs", - "//components/sync:test_support_sync_driver", - "//components/sync:test_support_sync_model", + "//components/sync:test_support_driver", + "//components/sync:test_support_model", "//components/syncable_prefs:test_support", "//components/webdata/common", "//sql",
diff --git a/components/session_manager/BUILD.gn b/components/session_manager/BUILD.gn new file mode 100644 index 0000000..26fc39be --- /dev/null +++ b/components/session_manager/BUILD.gn
@@ -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. + +source_set("base") { + sources = [ + "session_manager_export.h", + "session_manager_types.h", + ] +}
diff --git a/components/session_manager/core/BUILD.gn b/components/session_manager/core/BUILD.gn index 311f63b0..7137f6f 100644 --- a/components/session_manager/core/BUILD.gn +++ b/components/session_manager/core/BUILD.gn
@@ -4,12 +4,12 @@ component("core") { sources = [ - "../session_manager_export.h", "session_manager.cc", "session_manager.h", ] deps = [ "//base", + "//components/session_manager:base", ] defines = [ "SESSION_IMPLEMENTATION" ] }
diff --git a/components/session_manager/core/session_manager.cc b/components/session_manager/core/session_manager.cc index b9295a1..f1e4d5d 100644 --- a/components/session_manager/core/session_manager.cc +++ b/components/session_manager/core/session_manager.cc
@@ -12,7 +12,7 @@ // static SessionManager* SessionManager::instance = NULL; -SessionManager::SessionManager() : session_state_(SESSION_STATE_UNKNOWN) { +SessionManager::SessionManager() : session_state_(SessionState::UNKNOWN) { DCHECK(!SessionManager::Get()); SessionManager::SetInstance(this); } @@ -28,7 +28,7 @@ } void SessionManager::SetSessionState(SessionState state) { - VLOG(1) << "Changing session state to: " << state; + VLOG(1) << "Changing session state to: " << static_cast<int>(state); if (session_state_ != state) { // TODO(nkostylev): Notify observers about the state change.
diff --git a/components/session_manager/core/session_manager.h b/components/session_manager/core/session_manager.h index c1fdc864..d7c66757 100644 --- a/components/session_manager/core/session_manager.h +++ b/components/session_manager/core/session_manager.h
@@ -9,39 +9,12 @@ #include "base/macros.h" #include "components/session_manager/session_manager_export.h" +#include "components/session_manager/session_manager_types.h" namespace session_manager { class SessionManagerDelegate; -// TODO(nkostylev): Get rid/consolidate with: -// ash::SessionStateDelegate::SessionState and chromeos::LoggedInState. -enum SessionState { - // Default value, when session state hasn't been initialized yet. - SESSION_STATE_UNKNOWN = 0, - - // Running out of box UI. - SESSION_STATE_OOBE, - - // Running login UI (primary user) but user sign in hasn't completed yet. - SESSION_STATE_LOGIN_PRIMARY, - - // Running login UI (primary or secondary user), user sign in has been - // completed but login UI hasn't been hidden yet. This means that either - // some session initialization is happening or user has to go through some - // UI flow on the same login UI like select avatar, agree to terms of - // service etc. - SESSION_STATE_LOGGED_IN_NOT_ACTIVE, - - // A user(s) has logged in *and* login UI is hidden i.e. user session is - // not blocked. - SESSION_STATE_ACTIVE, - - // Same as SESSION_STATE_LOGIN_PRIMARY but for multi-profiles sign in i.e. - // when there's at least one user already active in the session. - SESSION_STATE_LOGIN_SECONDARY, -}; - class SESSION_EXPORT SessionManager { public: SessionManager();
diff --git a/components/session_manager/session_manager_types.h b/components/session_manager/session_manager_types.h new file mode 100644 index 0000000..5b30a837 --- /dev/null +++ b/components/session_manager/session_manager_types.h
@@ -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. + +#ifndef COMPONENTS_SESSION_MANAGER_SESSION_MANAGER_TYPES_H_ +#define COMPONENTS_SESSION_MANAGER_SESSION_MANAGER_TYPES_H_ + +namespace session_manager { + +// TODO(xiyuan): Get rid/consolidate with chromeos::LoggedInState. +enum class SessionState { + // Default value, when session state hasn't been initialized yet. + UNKNOWN = 0, + + // Running out of box UI. + OOBE, + + // Running login UI (primary user) but user sign in hasn't completed yet. + LOGIN_PRIMARY, + + // Running login UI (primary or secondary user), user sign in has been + // completed but login UI hasn't been hidden yet. This means that either + // some session initialization is happening or user has to go through some + // UI flow on the same login UI like select avatar, agree to terms of + // service etc. + LOGGED_IN_NOT_ACTIVE, + + // A user(s) has logged in *and* login UI is hidden i.e. user session is + // not blocked. + ACTIVE, + + // Same as SESSION_STATE_LOGIN_PRIMARY but for multi-profiles sign in i.e. + // when there's at least one user already active in the session. + LOGIN_SECONDARY, +}; + +} // namespace session_manager + +#endif // COMPONENTS_SESSION_MANAGER_SESSION_MANAGER_TYPES_H_
diff --git a/components/signin/core/browser/about_signin_internals.cc b/components/signin/core/browser/about_signin_internals.cc index b6b897b..d7c10777 100644 --- a/components/signin/core/browser/about_signin_internals.cc +++ b/components/signin/core/browser/about_signin_internals.cc
@@ -282,9 +282,8 @@ FROM_HERE_WITH_EXPLICIT_FUNCTION( "422460 AboutSigninInternals::NotifyObservers1")); - FOR_EACH_OBSERVER(AboutSigninInternals::Observer, - signin_observers_, - OnSigninStateChanged(signin_status_value.get())); + for (auto& observer : signin_observers_) + observer.OnSigninStateChanged(signin_status_value.get()); } std::unique_ptr<base::DictionaryValue> AboutSigninInternals::GetSigninStatus() { @@ -400,9 +399,8 @@ } // Update the observers that the cookie's accounts are updated. - FOR_EACH_OBSERVER(AboutSigninInternals::Observer, - signin_observers_, - OnCookieAccountsFetched(&cookie_status)); + for (auto& observer : signin_observers_) + observer.OnCookieAccountsFetched(&cookie_status); } AboutSigninInternals::TokenInfo::TokenInfo(
diff --git a/components/signin/core/browser/account_tracker_service.cc b/components/signin/core/browser/account_tracker_service.cc index 84f522a7..efe9e6e36 100644 --- a/components/signin/core/browser/account_tracker_service.cc +++ b/components/signin/core/browser/account_tracker_service.cc
@@ -168,20 +168,20 @@ void AccountTrackerService::NotifyAccountUpdated(const AccountState& state) { DCHECK(!state.info.gaia.empty()); - FOR_EACH_OBSERVER( - Observer, observer_list_, OnAccountUpdated(state.info)); + for (auto& observer : observer_list_) + observer.OnAccountUpdated(state.info); } void AccountTrackerService::NotifyAccountUpdateFailed( const std::string& account_id) { - FOR_EACH_OBSERVER( - Observer, observer_list_, OnAccountUpdateFailed(account_id)); + for (auto& observer : observer_list_) + observer.OnAccountUpdateFailed(account_id); } void AccountTrackerService::NotifyAccountRemoved(const AccountState& state) { DCHECK(!state.info.gaia.empty()); - FOR_EACH_OBSERVER( - Observer, observer_list_, OnAccountRemoved(state.info)); + for (auto& observer : observer_list_) + observer.OnAccountRemoved(state.info); } void AccountTrackerService::StartTrackingAccount(
diff --git a/components/signin/core/browser/fake_signin_manager.cc b/components/signin/core/browser/fake_signin_manager.cc index a4912d5f..32caba9 100644 --- a/components/signin/core/browser/fake_signin_manager.cc +++ b/components/signin/core/browser/fake_signin_manager.cc
@@ -56,9 +56,10 @@ void FakeSigninManager::CompletePendingSignin() { SetAuthenticatedAccountId(GetAccountIdForAuthInProgress()); set_auth_in_progress(std::string()); - FOR_EACH_OBSERVER( - SigninManagerBase::Observer, observer_list_, - GoogleSigninSucceeded(authenticated_account_id_, username_, password_)); + for (auto& observer : observer_list_) { + observer.GoogleSigninSucceeded(authenticated_account_id_, username_, + password_); + } } void FakeSigninManager::SignIn(const std::string& gaia_id, @@ -76,8 +77,8 @@ } void FakeSigninManager::FailSignin(const GoogleServiceAuthError& error) { - FOR_EACH_OBSERVER(SigninManagerBase::Observer, observer_list_, - GoogleSigninFailed(error)); + for (auto& observer : observer_list_) + observer.GoogleSigninFailed(error); } void FakeSigninManager::SignOut( @@ -91,8 +92,8 @@ const std::string username = GetAuthenticatedAccountInfo().email; authenticated_account_id_.clear(); - FOR_EACH_OBSERVER(SigninManagerBase::Observer, observer_list_, - GoogleSignedOut(account_id, username)); + for (auto& observer : observer_list_) + observer.GoogleSignedOut(account_id, username); } #endif // !defined (OS_CHROMEOS)
diff --git a/components/signin/core/browser/gaia_cookie_manager_service.cc b/components/signin/core/browser/gaia_cookie_manager_service.cc index de75979..9cfd9c9a 100644 --- a/components/signin/core/browser/gaia_cookie_manager_service.cc +++ b/components/signin/core/browser/gaia_cookie_manager_service.cc
@@ -519,8 +519,8 @@ // Its possible for the observer to delete |this| object. Don't access // access any members after this calling the observer. This method should // be the last call in any other method. - FOR_EACH_OBSERVER(Observer, observer_list_, - OnAddAccountToCookieCompleted(account_id, error)); + for (auto& observer : observer_list_) + observer.OnAddAccountToCookieCompleted(account_id, error); } void GaiaCookieManagerService::OnUbertokenSuccess( @@ -627,11 +627,11 @@ // services, in response to OnGaiaAccountsInCookieUpdated, may try in return // to call ListAccounts, which would immediately return false if the // ListAccounts request is still sitting in queue. - FOR_EACH_OBSERVER(Observer, observer_list_, - OnGaiaAccountsInCookieUpdated( - listed_accounts_, - signed_out_accounts_, - GoogleServiceAuthError(GoogleServiceAuthError::NONE))); + for (auto& observer : observer_list_) { + observer.OnGaiaAccountsInCookieUpdated( + listed_accounts_, signed_out_accounts_, + GoogleServiceAuthError(GoogleServiceAuthError::NONE)); + } } void GaiaCookieManagerService::OnListAccountsFailure( @@ -655,9 +655,10 @@ UMA_HISTOGRAM_ENUMERATION("Signin.ListAccountsFailure", error.state(), GoogleServiceAuthError::NUM_STATES); - FOR_EACH_OBSERVER(Observer, observer_list_, - OnGaiaAccountsInCookieUpdated( - listed_accounts_, signed_out_accounts_, error)); + for (auto& observer : observer_list_) { + observer.OnGaiaAccountsInCookieUpdated(listed_accounts_, + signed_out_accounts_, error); + } HandleNextRequest(); } @@ -667,9 +668,10 @@ list_accounts_stale_ = true; fetcher_backoff_.InformOfRequest(true); - FOR_EACH_OBSERVER(Observer, observer_list_, - OnLogOutAccountsFromCookieCompleted( - GoogleServiceAuthError(GoogleServiceAuthError::NONE))); + for (auto& observer : observer_list_) { + observer.OnLogOutAccountsFromCookieCompleted( + GoogleServiceAuthError(GoogleServiceAuthError::NONE)); + } HandleNextRequest(); } @@ -689,8 +691,8 @@ return; } - FOR_EACH_OBSERVER(Observer, observer_list_, - OnLogOutAccountsFromCookieCompleted(error)); + for (auto& observer : observer_list_) + observer.OnLogOutAccountsFromCookieCompleted(error); HandleNextRequest(); }
diff --git a/components/signin/core/browser/signin_error_controller.cc b/components/signin/core/browser/signin_error_controller.cc index 1fa6e9f..6dbaf23 100644 --- a/components/signin/core/browser/signin_error_controller.cc +++ b/components/signin/core/browser/signin_error_controller.cc
@@ -91,7 +91,8 @@ if (error_changed) { signin_metrics::LogAuthError(auth_error_.state()); - FOR_EACH_OBSERVER(Observer, observer_list_, OnErrorChanged()); + for (auto& observer : observer_list_) + observer.OnErrorChanged(); } }
diff --git a/components/signin/core/browser/signin_manager.cc b/components/signin/core/browser/signin_manager.cc index cb537ec..3880fc1 100644 --- a/components/signin/core/browser/signin_manager.cc +++ b/components/signin/core/browser/signin_manager.cc
@@ -141,9 +141,8 @@ void SigninManager::HandleAuthError(const GoogleServiceAuthError& error) { ClearTransientSigninData(); - FOR_EACH_OBSERVER(SigninManagerBase::Observer, - observer_list_, - GoogleSigninFailed(error)); + for (auto& observer : observer_list_) + observer.GoogleSigninFailed(error); } void SigninManager::SignOut( @@ -201,9 +200,8 @@ << "IsSigninAllowed: " << IsSigninAllowed(); token_service_->RevokeAllCredentials(); - FOR_EACH_OBSERVER(SigninManagerBase::Observer, - observer_list_, - GoogleSignedOut(account_id, username)); + for (auto& observer : observer_list_) + observer.GoogleSignedOut(account_id, username); } void SigninManager::Initialize(PrefService* local_state) { @@ -375,10 +373,11 @@ possibly_invalid_email_.clear(); signin_manager_signed_in_ = true; - FOR_EACH_OBSERVER( - SigninManagerBase::Observer, observer_list_, - GoogleSigninSucceeded(GetAuthenticatedAccountId(), - GetAuthenticatedAccountInfo().email, password_)); + for (auto& observer : observer_list_) { + observer.GoogleSigninSucceeded(GetAuthenticatedAccountId(), + GetAuthenticatedAccountInfo().email, + password_); + } client_->OnSignedIn(GetAuthenticatedAccountId(), gaia_id, GetAuthenticatedAccountInfo().email, password_);
diff --git a/components/signin/core/browser/signin_manager_base.cc b/components/signin/core/browser/signin_manager_base.cc index efbb7e4..68d68b4 100644 --- a/components/signin/core/browser/signin_manager_base.cc +++ b/components/signin/core/browser/signin_manager_base.cc
@@ -250,7 +250,6 @@ void SigninManagerBase::NotifyDiagnosticsObservers( const TimedSigninStatusField& field, const std::string& value) { - FOR_EACH_OBSERVER(SigninDiagnosticsObserver, - signin_diagnostics_observers_, - NotifySigninValueChanged(field, value)); + for (auto& observer : signin_diagnostics_observers_) + observer.NotifySigninValueChanged(field, value); }
diff --git a/components/strings/components_strings_am.xtb b/components/strings/components_strings_am.xtb index 5ee84fc..bf71ccf 100644 --- a/components/strings/components_strings_am.xtb +++ b/components/strings/components_strings_am.xtb
@@ -392,6 +392,7 @@ <translation id="5190835502935405962">የዕልባቶች አሞሌ</translation> <translation id="5199729219167945352">ሙከራዎች</translation> <translation id="5251803541071282808">ደመና</translation> +<translation id="5277279256032773186">በሥራ ላይ Chrome እየተጠቀሙ ነዎት? ንግድ ሥራዎች ለሠራተኞቻቸው የChrome ቅንብሮችን ማስተዳደር ይችላሉ። የበለጠ ይረዱ</translation> <translation id="5299298092464848405">መምሪያን መተንተን ላይ ስህተት</translation> <translation id="5300589172476337783">አሳይ</translation> <translation id="5308689395849655368">የብልሽት ሪፖርት ማድረግ ተሰናክሏል።</translation>
diff --git a/components/strings/components_strings_ar.xtb b/components/strings/components_strings_ar.xtb index d2786adc..b8b5d0e 100644 --- a/components/strings/components_strings_ar.xtb +++ b/components/strings/components_strings_ar.xtb
@@ -393,6 +393,7 @@ <translation id="5190835502935405962">شريط الإشارات</translation> <translation id="5199729219167945352">التجارب</translation> <translation id="5251803541071282808">السحاب</translation> +<translation id="5277279256032773186">هل تستخدم Chrome في العمل؟ يمكن للأنشطة التجارية إدارة إعدادات Chrome لموظفيها. تعرَّف على المزيد</translation> <translation id="5299298092464848405">خطأ في تحليل السياسة</translation> <translation id="5300589172476337783">عرض</translation> <translation id="5308689395849655368">ميزة الإبلاغ عن الأعطال معطلة.</translation>
diff --git a/components/strings/components_strings_bg.xtb b/components/strings/components_strings_bg.xtb index 312c43b..e377d48 100644 --- a/components/strings/components_strings_bg.xtb +++ b/components/strings/components_strings_bg.xtb
@@ -393,6 +393,7 @@ <translation id="5190835502935405962">Лента на отметките</translation> <translation id="5199729219167945352">Експерименти</translation> <translation id="5251803541071282808">Облак</translation> +<translation id="5277279256032773186">Използвате Chrome на работното си място? Бизнесите могат да управляват настройките на браузъра за служителите си. Научете повече</translation> <translation id="5299298092464848405">Грешка при синтактичния анализ на правилото</translation> <translation id="5300589172476337783">Показване</translation> <translation id="5308689395849655368">Изпращането на сигнали за сривове е деактивирано.</translation>
diff --git a/components/strings/components_strings_bn.xtb b/components/strings/components_strings_bn.xtb index 8502156..885efad 100644 --- a/components/strings/components_strings_bn.xtb +++ b/components/strings/components_strings_bn.xtb
@@ -394,6 +394,7 @@ <translation id="5190835502935405962">বুকমার্ক দণ্ড</translation> <translation id="5199729219167945352">পরীক্ষাদি</translation> <translation id="5251803541071282808">ক্লাউড</translation> +<translation id="5277279256032773186">কর্মক্ষেত্রে Chrome ব্যবহার করছেন? ব্যবসাগুলো তাদের কর্মচারীদের জন্য Chrome সেটিংস পরিচালনা করতে পারে। আরো জানুন</translation> <translation id="5299298092464848405">নীতি বিশ্লেষণ করার সময় ত্রুটি</translation> <translation id="5300589172476337783">দেখান</translation> <translation id="5308689395849655368">ক্র্যাশ প্রতিবেদন অক্ষম আছে৷</translation>
diff --git a/components/strings/components_strings_ca.xtb b/components/strings/components_strings_ca.xtb index a4464750..0a27a43 100644 --- a/components/strings/components_strings_ca.xtb +++ b/components/strings/components_strings_ca.xtb
@@ -393,6 +393,7 @@ <translation id="5190835502935405962">Barra d'adreces d'interès</translation> <translation id="5199729219167945352">Experiments</translation> <translation id="5251803541071282808">Núvol</translation> +<translation id="5277279256032773186">Fas servir Chrome a la feina? Les empreses poden gestionar la configuració de Chrome dels empleats. Més informació</translation> <translation id="5299298092464848405">S'ha produït un error en analitzar la política</translation> <translation id="5300589172476337783">Mostra</translation> <translation id="5308689395849655368">La creació d'informes de bloqueig està desactivada.</translation> @@ -528,7 +529,7 @@ <translation id="7000990526846637657">No s'ha trobat cap entrada a l'historial</translation> <translation id="7009986207543992532">Has provat d'accedir a <ph name="DOMAIN" />, però el servidor ha presentat un certificat amb un període de validesa massa llarg per poder confiar-hi. <ph name="BEGIN_LEARN_MORE_LINK" />Obtén més informació<ph name="END_LEARN_MORE_LINK" />.</translation> <translation id="7012363358306927923">China UnionPay</translation> -<translation id="7012372675181957985">És possible que el teu compte de Google tingui altres formes de l'historial de navegació a <ph name="BEGIN_LINK" />history.google.com<ph name="END_LINK" />.</translation> +<translation id="7012372675181957985">És possible que el teu compte de Google tingui altres formes de l'historial de navegació a <ph name="BEGIN_LINK" />history.google.com<ph name="END_LINK" /></translation> <translation id="7029809446516969842">Contrasenyes</translation> <translation id="7087282848513945231">Comptat</translation> <translation id="7088615885725309056">Més antic</translation>
diff --git a/components/strings/components_strings_cs.xtb b/components/strings/components_strings_cs.xtb index 90af397..c5b8e42 100644 --- a/components/strings/components_strings_cs.xtb +++ b/components/strings/components_strings_cs.xtb
@@ -389,6 +389,7 @@ <translation id="5190835502935405962">Lišta záložek</translation> <translation id="5199729219167945352">Experimenty</translation> <translation id="5251803541071282808">Cloud</translation> +<translation id="5277279256032773186">Používáte Chrome v práci? Firmy mohou spravovat nastavení prohlížeče Chrome pro své zaměstnance. Další informace</translation> <translation id="5299298092464848405">Při analýze zásady došlo k chybě</translation> <translation id="5300589172476337783">Zobrazit</translation> <translation id="5308689395849655368">Zprávy o selhání jsou zakázány.</translation>
diff --git a/components/strings/components_strings_da.xtb b/components/strings/components_strings_da.xtb index bff512bc..0ef0caa 100644 --- a/components/strings/components_strings_da.xtb +++ b/components/strings/components_strings_da.xtb
@@ -134,7 +134,7 @@ <translation id="2396249848217231973">&Fortryd sletning</translation> <translation id="2455981314101692989">Denne webside har deaktiveret automatisk udfyldning af denne formular.</translation> <translation id="2463739503403862330">Udfyld</translation> -<translation id="2467694685043708798"><ph name="BEGIN_LINK" />Kører Netværksdiagnosticering<ph name="END_LINK" /></translation> +<translation id="2467694685043708798"><ph name="BEGIN_LINK" />Køre Netværksdiagnosticering<ph name="END_LINK" /></translation> <translation id="2479410451996844060">Ugyldig søgewebadresse.</translation> <translation id="2491120439723279231">Serverens certifikat indeholder fejl.</translation> <translation id="2495083838625180221">Værktøj til parsing af JSON-filer</translation> @@ -164,7 +164,7 @@ <translation id="2712173769900027643">Spørg om tilladelse</translation> <translation id="2721148159707890343">Anmodning lykkedes</translation> <translation id="2728127805433021124">Serverens certifikat er signeret ved hjælp af en svag signaturalgoritme.</translation> -<translation id="2730326759066348565"><ph name="BEGIN_LINK" />Kører Diagnosticering af forbindelse<ph name="END_LINK" /></translation> +<translation id="2730326759066348565"><ph name="BEGIN_LINK" />Køre Diagnosticering af forbindelse<ph name="END_LINK" /></translation> <translation id="2742870351467570537">Fjern valgte elementer</translation> <translation id="277499241957683684">Manglende enhedsregistrering</translation> <translation id="2778107779445548489">Denne meddelelse vises, fordi en af dine forældre har blokeret dette website.</translation> @@ -347,7 +347,7 @@ <translation id="4670097147947922288">Du er i øjeblikket på en udvidelsesside.</translation> <translation id="4701488924964507374"><ph name="SENTENCE1" /> <ph name="SENTENCE2" /></translation> <translation id="4708268264240856090">Din forbindelse blev afbrudt</translation> -<translation id="4722547256916164131"><ph name="BEGIN_LINK" />Kører Windows Netværksdiagnosticering<ph name="END_LINK" /></translation> +<translation id="4722547256916164131"><ph name="BEGIN_LINK" />Køre Windows Netværksdiagnosticering<ph name="END_LINK" /></translation> <translation id="4726672564094551039">Opdater politikker</translation> <translation id="4728558894243024398">Platform</translation> <translation id="4744603770635761495">Eksekverbar sti</translation> @@ -393,6 +393,7 @@ <translation id="5190835502935405962">Bogmærkelinje</translation> <translation id="5199729219167945352">Eksperimenter</translation> <translation id="5251803541071282808">Skyen</translation> +<translation id="5277279256032773186">Bruger du Chrome på arbejdet? Virksomheder kan administrere Chrome-indstillinger for deres medarbejdere. Få flere oplysninger</translation> <translation id="5299298092464848405">Der opstod en fejl ved parsing af politik</translation> <translation id="5300589172476337783">Vis</translation> <translation id="5308689395849655368">Rapportering af nedbrud er deaktiveret.</translation> @@ -632,7 +633,7 @@ <translation id="8091372947890762290">Aktivering afventer serveren</translation> <translation id="8129262335948759431">ukendt mængde</translation> <translation id="8131740175452115882">Bekræft</translation> -<translation id="8134994873729925007"><ph name="BEGIN_ABBR" />DNS-adressen<ph name="END_ABBR" /> for <ph name="HOST_NAME" />'s server blev ikke fundet.</translation> +<translation id="8134994873729925007"><ph name="BEGIN_ABBR" />DNS-adressen<ph name="END_ABBR" /> for <ph name="HOST_NAME" />s server blev ikke fundet.</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>
diff --git a/components/strings/components_strings_de.xtb b/components/strings/components_strings_de.xtb index 7a635079..255273c 100644 --- a/components/strings/components_strings_de.xtb +++ b/components/strings/components_strings_de.xtb
@@ -392,6 +392,7 @@ <translation id="5190835502935405962">Lesezeichenleiste</translation> <translation id="5199729219167945352">Experimente</translation> <translation id="5251803541071282808">Cloud</translation> +<translation id="5277279256032773186">Nutzen Sie Chrome bei der Arbeit? Unternehmen können Chrome-Einstellungen für ihre Mitarbeiter verwalten. Weitere Informationen</translation> <translation id="5299298092464848405">Fehler beim Parsen der Richtlinie</translation> <translation id="5300589172476337783">Anzeigen</translation> <translation id="5308689395849655368">Die Absturzberichtsfunktion ist deaktiviert.</translation>
diff --git a/components/strings/components_strings_el.xtb b/components/strings/components_strings_el.xtb index 9e52080..7099849 100644 --- a/components/strings/components_strings_el.xtb +++ b/components/strings/components_strings_el.xtb
@@ -393,6 +393,7 @@ <translation id="5190835502935405962">Γραμμή σελιδοδεικτών</translation> <translation id="5199729219167945352">Πειράματα</translation> <translation id="5251803541071282808">Cloud</translation> +<translation id="5277279256032773186">Χρησιμοποιείτε το Chrome στη δουλειά σας; Οι επιχειρήσεις μπορούν να διαχειρίζονται τις ρυθμίσεις του Chrome για τους εργαζόμενούς τους. Μάθετε περισσότερα</translation> <translation id="5299298092464848405">Σφάλμα ανάλυσης πολιτικής</translation> <translation id="5300589172476337783">Εμφάνιση</translation> <translation id="5308689395849655368">Η αναφορά σφαλμάτων είναι απενεργοποιημένη.</translation>
diff --git a/components/strings/components_strings_en-GB.xtb b/components/strings/components_strings_en-GB.xtb index c4f112a..6df3cb67 100644 --- a/components/strings/components_strings_en-GB.xtb +++ b/components/strings/components_strings_en-GB.xtb
@@ -393,6 +393,7 @@ <translation id="5190835502935405962">Bookmarks Bar</translation> <translation id="5199729219167945352">Experiments</translation> <translation id="5251803541071282808">Cloud</translation> +<translation id="5277279256032773186">Using Chrome at work? Businesses can manage Chrome settings for their employees. Find out more</translation> <translation id="5299298092464848405">Error parsing policy</translation> <translation id="5300589172476337783">Show</translation> <translation id="5308689395849655368">Crash reporting is disabled.</translation>
diff --git a/components/strings/components_strings_es-419.xtb b/components/strings/components_strings_es-419.xtb index 433859f..950c5a0 100644 --- a/components/strings/components_strings_es-419.xtb +++ b/components/strings/components_strings_es-419.xtb
@@ -394,6 +394,7 @@ <translation id="5190835502935405962">Barra de marcadores</translation> <translation id="5199729219167945352">Experimentos</translation> <translation id="5251803541071282808">Nube</translation> +<translation id="5277279256032773186">¿Usas Chrome en el trabajo? Las empresas pueden administrar la configuración de Chrome para sus empleados. Más información</translation> <translation id="5299298092464848405">Error al analizar la política</translation> <translation id="5300589172476337783">Mostrar</translation> <translation id="5308689395849655368">Notificación de fallas desactivada.</translation>
diff --git a/components/strings/components_strings_es.xtb b/components/strings/components_strings_es.xtb index 12568f88..ac48bafd 100644 --- a/components/strings/components_strings_es.xtb +++ b/components/strings/components_strings_es.xtb
@@ -393,6 +393,7 @@ <translation id="5190835502935405962">Barra de marcadores</translation> <translation id="5199729219167945352">Experimentos</translation> <translation id="5251803541071282808">Nube</translation> +<translation id="5277279256032773186">¿Usas Chrome en el trabajo? Las empresas pueden administrar la configuración de Chrome de sus empleados. Más información</translation> <translation id="5299298092464848405">Error al analizar la política</translation> <translation id="5300589172476337783">Mostrar</translation> <translation id="5308689395849655368">Notificación de fallos inhabilitada</translation> @@ -525,10 +526,10 @@ <translation id="6970216967273061347">Distrito</translation> <translation id="6973656660372572881">Se especifican tanto servidores proxy fijos como una URL de secuencia de comandos .pac.</translation> <translation id="6989763994942163495">Mostrar configuración avanzada...</translation> -<translation id="7000990526846637657">No se han encontrado entradas de historial</translation> +<translation id="7000990526846637657">No se han encontrado entradas del historial</translation> <translation id="7009986207543992532">Has intentado acceder a <ph name="DOMAIN" />, pero el servidor ha presentado un certificado cuyo período de validez es demasiado largo para que se considere de confianza. <ph name="BEGIN_LEARN_MORE_LINK" />Más información<ph name="END_LEARN_MORE_LINK" /></translation> <translation id="7012363358306927923">China UnionPay</translation> -<translation id="7012372675181957985">Es posible que tu cuenta de Google tenga otras formas del historial de navegación en la página <ph name="BEGIN_LINK" />history.google.com<ph name="END_LINK" /></translation> +<translation id="7012372675181957985">Es posible que en tu cuenta de Google haya otros datos de navegación registrados, que puedes consultar en la página <ph name="BEGIN_LINK" />history.google.com<ph name="END_LINK" /></translation> <translation id="7029809446516969842">Contraseñas</translation> <translation id="7087282848513945231">Condado</translation> <translation id="7088615885725309056">Más antiguos</translation>
diff --git a/components/strings/components_strings_et.xtb b/components/strings/components_strings_et.xtb index 32d1363d..9c361d9 100644 --- a/components/strings/components_strings_et.xtb +++ b/components/strings/components_strings_et.xtb
@@ -393,6 +393,7 @@ <translation id="5190835502935405962">Järjehoidjariba</translation> <translation id="5199729219167945352">Katsed</translation> <translation id="5251803541071282808">Pilv</translation> +<translation id="5277279256032773186">Kas kasutate Chrome'i tööl? Ettevõtted võivad hallata töötajate Chrome'i seadeid. Lisateave</translation> <translation id="5299298092464848405">Reegli sõelumisel ilmnes viga</translation> <translation id="5300589172476337783">Kuva</translation> <translation id="5308689395849655368">Krahhide aruandlus on keelatud.</translation>
diff --git a/components/strings/components_strings_fa.xtb b/components/strings/components_strings_fa.xtb index 1e29ad7..9ab524f9 100644 --- a/components/strings/components_strings_fa.xtb +++ b/components/strings/components_strings_fa.xtb
@@ -393,6 +393,7 @@ <translation id="5190835502935405962">نوار نشانکها</translation> <translation id="5199729219167945352">آزمایشات</translation> <translation id="5251803541071282808">Cloud</translation> +<translation id="5277279256032773186">از Chrome در محل کار استفاده میکنید؟ کسب و کارها میتوانند تنظیمات Chrome را برای کارمندانشان مدیریت کنند. بیشتر بدانید</translation> <translation id="5299298092464848405">خطا در تجزیه خطمشی</translation> <translation id="5300589172476337783">نمایش</translation> <translation id="5308689395849655368">گزارش خرابی غیر فعال است.</translation>
diff --git a/components/strings/components_strings_fi.xtb b/components/strings/components_strings_fi.xtb index c779a09..08e08ca 100644 --- a/components/strings/components_strings_fi.xtb +++ b/components/strings/components_strings_fi.xtb
@@ -394,6 +394,7 @@ <translation id="5190835502935405962">Kirjanmerkkipalkki</translation> <translation id="5199729219167945352">Kokeilut</translation> <translation id="5251803541071282808">Pilvi</translation> +<translation id="5277279256032773186">Käytätkö Chromea töissä? Yritykset voivat hallita Chromen asetuksia työntekijöidensä puolesta. Lisätietoja</translation> <translation id="5299298092464848405">Virhe jäsennettäessä käytäntöä</translation> <translation id="5300589172476337783">Näytä</translation> <translation id="5308689395849655368">Kaatumisraportit on poistettu käytöstä.</translation>
diff --git a/components/strings/components_strings_fil.xtb b/components/strings/components_strings_fil.xtb index 04e005da..da243c3 100644 --- a/components/strings/components_strings_fil.xtb +++ b/components/strings/components_strings_fil.xtb
@@ -393,6 +393,7 @@ <translation id="5190835502935405962">Bar ng Mga Bookmark</translation> <translation id="5199729219167945352">Mga Eksperimento</translation> <translation id="5251803541071282808">Cloud</translation> +<translation id="5277279256032773186">Ginagamit mo ba ang Chrome sa trabaho? Maaaring pamahalaan ng mga negosyo ang mga setting ng Chrome para sa kanilang mga empleyado. Matuto pa</translation> <translation id="5299298092464848405">Error sa pag-parse ng patakaran</translation> <translation id="5300589172476337783">Ipakita</translation> <translation id="5308689395849655368">Hindi pinagana ang pag-uulat ng pag-crash.</translation>
diff --git a/components/strings/components_strings_fr.xtb b/components/strings/components_strings_fr.xtb index b62dda4a..4d1ee770 100644 --- a/components/strings/components_strings_fr.xtb +++ b/components/strings/components_strings_fr.xtb
@@ -393,6 +393,7 @@ <translation id="5190835502935405962">Barre de favoris</translation> <translation id="5199729219167945352">Prototypes</translation> <translation id="5251803541071282808">Cloud</translation> +<translation id="5277279256032773186">Vous utilisez Chrome au travail ? Les entreprises peuvent gérer les paramètres Chrome de leurs employés. En savoir plus</translation> <translation id="5299298092464848405">Erreur d'analyse de la règle.</translation> <translation id="5300589172476337783">Afficher</translation> <translation id="5308689395849655368">L'envoi de rapports d'erreur est désactivé.</translation>
diff --git a/components/strings/components_strings_gu.xtb b/components/strings/components_strings_gu.xtb index 1085111..e7f4753 100644 --- a/components/strings/components_strings_gu.xtb +++ b/components/strings/components_strings_gu.xtb
@@ -393,6 +393,7 @@ <translation id="5190835502935405962">બુકમાર્ક્સ બાર</translation> <translation id="5199729219167945352">પ્રયોગો</translation> <translation id="5251803541071282808">મેઘ</translation> +<translation id="5277279256032773186">કાર્ય પર Chrome નો ઉપયોગ કરી રહ્યાં છો? વ્યવસાયો તેમના કર્મચારીઓ માટે Chrome સેટિંગ્સને સંચાલિત કરી શકે છે. વધુ જાણો</translation> <translation id="5299298092464848405">ભૂલ વિશ્લેષણ નીતિ</translation> <translation id="5300589172476337783">બતાવો</translation> <translation id="5308689395849655368">ક્રેશની જાણ કરવાનું અક્ષમ કર્યું છે.</translation>
diff --git a/components/strings/components_strings_hi.xtb b/components/strings/components_strings_hi.xtb index 453d7de..26334cb 100644 --- a/components/strings/components_strings_hi.xtb +++ b/components/strings/components_strings_hi.xtb
@@ -393,6 +393,7 @@ <translation id="5190835502935405962">बुकमार्क बार</translation> <translation id="5199729219167945352">प्रयोग</translation> <translation id="5251803541071282808">क्लाउड</translation> +<translation id="5277279256032773186">कार्यस्थल पर Chrome का उपयोग कर रहे हैं? कंपनियां अपने कर्मचारियों के लिए Chrome सेटिंग प्रबंधित कर सकती हैं. और जानें</translation> <translation id="5299298092464848405">नीति पार्स करने में त्रुटि</translation> <translation id="5300589172476337783">दिखाएं</translation> <translation id="5308689395849655368">क्रैश की रिपोर्ट करना अक्षम कर दिया गया है.</translation>
diff --git a/components/strings/components_strings_hr.xtb b/components/strings/components_strings_hr.xtb index c811d61..f1b0276 100644 --- a/components/strings/components_strings_hr.xtb +++ b/components/strings/components_strings_hr.xtb
@@ -326,7 +326,7 @@ <translation id="4394049700291259645">Onemogući</translation> <translation id="4395129973926795186"><ph name="START_DATE" /> – <ph name="END_DATE" /></translation> <translation id="4406896451731180161">rezultati pretraživanja</translation> -<translation id="4432688616882109544">Host <ph name="HOST_NAME" /> nije prihvatio vaš certifikat za prijavu ili certifikat nije pružen.</translation> +<translation id="4432688616882109544">Host <ph name="HOST_NAME" /> nije prihvatio vaš certifikat za prijavu ili certifikat nije poslan.</translation> <translation id="443673843213245140">Upotreba proxy poslužitelja onemogućena je, ali određena je izričita konfiguracija proxy poslužitelja.</translation> <translation id="4458874409874303848">SafeSites</translation> <translation id="4461847750548395463">Ova ti se poruka prikazuje zato što je omogućen Google SafeSites.</translation> @@ -392,6 +392,7 @@ <translation id="5190835502935405962">Traka oznaka</translation> <translation id="5199729219167945352">Eksperimenti</translation> <translation id="5251803541071282808">Oblak</translation> +<translation id="5277279256032773186">Upotrebljavate li Chrome na poslu? Tvrtke mogu upravljati Chromeovim postavkama za svoje zaposlenike. Saznajte više</translation> <translation id="5299298092464848405">Pogreška u pravilu analize</translation> <translation id="5300589172476337783">Prikaži</translation> <translation id="5308689395849655368">Onemogućeno je izvješćivanje o padu.</translation>
diff --git a/components/strings/components_strings_hu.xtb b/components/strings/components_strings_hu.xtb index 2fa052d..ee1cda82 100644 --- a/components/strings/components_strings_hu.xtb +++ b/components/strings/components_strings_hu.xtb
@@ -391,6 +391,7 @@ <translation id="5190835502935405962">Könyvjelzősáv</translation> <translation id="5199729219167945352">Kísérletek</translation> <translation id="5251803541071282808">Felhő</translation> +<translation id="5277279256032773186">A munkahelyén használja a Chrome-ot? A cégek kezelhetik a Chrome-beállításokat alkalmazottaik számára. További információ.</translation> <translation id="5299298092464848405">Irányelv-előfeldolgozási hiba</translation> <translation id="5300589172476337783">Megjelenítés</translation> <translation id="5308689395849655368">A hibabejelentés ki van kapcsolva.</translation>
diff --git a/components/strings/components_strings_id.xtb b/components/strings/components_strings_id.xtb index c2b74be..7ab9c53 100644 --- a/components/strings/components_strings_id.xtb +++ b/components/strings/components_strings_id.xtb
@@ -393,6 +393,7 @@ <translation id="5190835502935405962">Bilah Bookmark</translation> <translation id="5199729219167945352">Eksperimen</translation> <translation id="5251803541071282808">Awan</translation> +<translation id="5277279256032773186">Menggunakan Chrome di kantor? Perusahaan dapat mengelola setelan Chrome untuk karyawan mereka. Pelajari lebih lanjut</translation> <translation id="5299298092464848405">Kebijakan kesalahan penguraian</translation> <translation id="5300589172476337783">Tampilkan</translation> <translation id="5308689395849655368">Pelaporan kondisi ngadat dinonaktifkan.</translation>
diff --git a/components/strings/components_strings_it.xtb b/components/strings/components_strings_it.xtb index c33b8fd..b2ea37d 100644 --- a/components/strings/components_strings_it.xtb +++ b/components/strings/components_strings_it.xtb
@@ -390,6 +390,7 @@ <translation id="5190835502935405962">Barra dei Preferiti</translation> <translation id="5199729219167945352">Esperimenti</translation> <translation id="5251803541071282808">Cloud</translation> +<translation id="5277279256032773186">Utilizzi Chrome al lavoro? Le aziende possono gestire le impostazioni di Chrome per conto dei propri dipendenti. Ulteriori informazioni</translation> <translation id="5299298092464848405">Errore durante l'analisi del criterio</translation> <translation id="5300589172476337783">Mostra</translation> <translation id="5308689395849655368">La segnalazione degli arresti anomali è disattivata.</translation>
diff --git a/components/strings/components_strings_iw.xtb b/components/strings/components_strings_iw.xtb index da64234..6fe5c9c 100644 --- a/components/strings/components_strings_iw.xtb +++ b/components/strings/components_strings_iw.xtb
@@ -397,6 +397,7 @@ <translation id="5190835502935405962">סרגל הסימניות</translation> <translation id="5199729219167945352">ניסויים</translation> <translation id="5251803541071282808">ענן</translation> +<translation id="5277279256032773186">משתמש ב-Chrome בעבודה? עסקים יכולים לנהל את ההגדרות של Chrome עבור העובדים. למידע נוסף</translation> <translation id="5299298092464848405">שגיאה בניתוח המדיניות</translation> <translation id="5300589172476337783">הצג</translation> <translation id="5308689395849655368">דיווח קריסות מושבת.</translation>
diff --git a/components/strings/components_strings_ja.xtb b/components/strings/components_strings_ja.xtb index a9dc8e5..b4aa53bc 100644 --- a/components/strings/components_strings_ja.xtb +++ b/components/strings/components_strings_ja.xtb
@@ -393,6 +393,7 @@ <translation id="5190835502935405962">ブックマーク バー</translation> <translation id="5199729219167945352">試験運用機能</translation> <translation id="5251803541071282808">クラウド</translation> +<translation id="5277279256032773186">会社で Chrome を使用する場合は、従業員用に Chrome の設定を管理できます。詳細</translation> <translation id="5299298092464848405">ポリシーの解析中にエラーが発生しました</translation> <translation id="5300589172476337783">表示</translation> <translation id="5308689395849655368">障害レポートが無効になっています。</translation>
diff --git a/components/strings/components_strings_kn.xtb b/components/strings/components_strings_kn.xtb index df0cd865..92d52f4d 100644 --- a/components/strings/components_strings_kn.xtb +++ b/components/strings/components_strings_kn.xtb
@@ -178,7 +178,7 @@ <translation id="2909946352844186028">ನೆಟ್ವರ್ಕ್ ಬದಲಾವಣೆಯನ್ನು ಪತ್ತೆ ಮಾಡಲಾಗಿದೆ.</translation> <translation id="2922350208395188000">ಸರ್ವರ್ನ ಪ್ರಮಾಣಪತ್ರವನ್ನು ಪರಿಶೀಲಿಸಲಾಗುವುದಿಲ್ಲ.</translation> <translation id="2948083400971632585">ಸಂಪರ್ಕಕ್ಕಾಗಿ ಕಾನ್ಫಿಗರ್ ಮಾಡಲಾಗಿರುವ ಯಾವುದೇ ಪ್ರಾಕ್ಸಿಗಳನ್ನು ನೀವು ಸೆಟ್ಟಿಂಗ್ಗಳ ಪುಟದಿಂದ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಬಹುದು.</translation> -<translation id="2955913368246107853">ಹುಡುಕು ಬಾರ್ ಅನ್ನು ಮುಚ್ಚಿ</translation> +<translation id="2955913368246107853">ಹುಡುಕಿ ಬಾರ್ ಅನ್ನು ಮುಚ್ಚಿ</translation> <translation id="2958431318199492670">ONC ಪ್ರಮಾಣಿತಕ್ಕೆ ನೆಟ್ವರ್ಕ್ ಕಾನ್ಫಿಗರೇಶನ್ ಅನುಸರಣೆಯಾಗುವುದಿಲ್ಲ. ಕಾನ್ಫಿಗರೇಶನ್ನ ಭಾಗಗಳನ್ನು ಆಮದು ಮಾಡಲಾಗದಿರಬಹುದು.</translation> <translation id="2969319727213777354">ಸುರಕ್ಷಿತ ಸಂಪರ್ಕವನ್ನು ಸ್ಥಾಪಿಸಲು, ನಿಮ್ಮ ಗಡಿಯಾರವನ್ನು ಸರಿಯಾಗಿ ಹೊಂದಿಸಬೇಕಾದ ಅಗತ್ಯವಿದೆ. ವೆಬ್ಸೈಟ್ಗಳು ತಮ್ಮನ್ನು ಗುರುತಿಸಲು ಬಳಸುವ ಪ್ರಮಾಣಪತ್ರಗಳು ನಿರ್ದಿಷ್ಟ ಅವಧಿಗಳಲ್ಲಿ ಮಾತ್ರ ಮಾನ್ಯವಾಗಿರುವ ಕಾರಣ ಹೀಗಾಗುತ್ತದೆ. ನಿಮ್ಮ ಸಾಧನದ ಗಡಿಯಾರವು ತಪ್ಪಾಗಿರುವ ಕಾರಣ, Google Chrome ಗೆ ಈ ಪ್ರಮಾಣಪತ್ರಗಳನ್ನು ಪರಿಶೀಲಿಸಲು ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ.</translation> <translation id="2972581237482394796">&ಮತ್ತೆಮಾಡು</translation> @@ -390,6 +390,7 @@ <translation id="5190835502935405962">ಬುಕ್ಮಾರ್ಕ್ಗಳ ಬಾರ್</translation> <translation id="5199729219167945352">ಪ್ರಯೋಗಗಳು</translation> <translation id="5251803541071282808">ಮೇಘ</translation> +<translation id="5277279256032773186">ಕೆಲಸದಲ್ಲಿ Chrome ಬಳಸುತ್ತಿರುವಿರಾ? ತಮ್ಮ ಉದ್ಯೋಗಿಗಳಿಗಾಗಿ ವ್ಯವಹಾರಗಳಲ್ಲಿ Chrome ಸೆಟ್ಟಿಂಗ್ಗಳು ನಿರ್ವಹಿಸಬಹುದು. ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ</translation> <translation id="5299298092464848405">ನೀತಿಯ ಪಾರ್ಸಿಂಗ್ನಲ್ಲಿ ದೋಷ</translation> <translation id="5300589172476337783">ಪ್ರದರ್ಶಿಸಿ</translation> <translation id="5308689395849655368">ಕ್ರ್ಯಾಶ್ ವರದಿಯನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ.</translation>
diff --git a/components/strings/components_strings_ko.xtb b/components/strings/components_strings_ko.xtb index 081827a..89a8ef2 100644 --- a/components/strings/components_strings_ko.xtb +++ b/components/strings/components_strings_ko.xtb
@@ -212,7 +212,7 @@ <translation id="3226128629678568754">페이지 로드에 필요한 데이터를 다시 제출하려면 새로고침 버튼을 누릅니다.</translation> <translation id="3228969707346345236">페이지가 <ph name="LANGUAGE" />(으)로 되어 있으므로 번역하지 못했습니다.</translation> <translation id="323107829343500871"><ph name="CREDIT_CARD" /> 카드의 CVC를 입력하세요.</translation> -<translation id="3254409185687681395">페이지 북마크</translation> +<translation id="3254409185687681395">현재 페이지를 북마크에 추가</translation> <translation id="3270847123878663523">재정렬 실행 취소(&U)</translation> <translation id="3286538390144397061">지금 다시 시작</translation> <translation id="3303855915957856445">검색결과 없음</translation> @@ -393,6 +393,7 @@ <translation id="5190835502935405962">북마크바</translation> <translation id="5199729219167945352">실험실 기능</translation> <translation id="5251803541071282808">클라우드</translation> +<translation id="5277279256032773186">직장에서 Chrome을 사용하시나요? 기업은 직원의 Chrome 설정을 관리할 수 있습니다. 자세히 알아보기</translation> <translation id="5299298092464848405">정책을 파싱하는 중 오류 발생</translation> <translation id="5300589172476337783">표시</translation> <translation id="5308689395849655368">비정상 종료 보고가 사용 중지되었습니다.</translation> @@ -525,10 +526,10 @@ <translation id="6970216967273061347">구</translation> <translation id="6973656660372572881">고정 프록시 서버와 .pac 스크립트 URL이 모두 지정되어 있습니다.</translation> <translation id="6989763994942163495">고급 설정 표시</translation> -<translation id="7000990526846637657">기록 항목이 없습니다.</translation> +<translation id="7000990526846637657">기록이 없습니다.</translation> <translation id="7009986207543992532"><ph name="DOMAIN" />에 접속하려 했으나 서버에서 인증 기간이 너무 길어서 신뢰할 수 없는 인증서를 제시했습니다. <ph name="BEGIN_LEARN_MORE_LINK" />자세히 알아보기<ph name="END_LEARN_MORE_LINK" /></translation> <translation id="7012363358306927923">China UnionPay</translation> -<translation id="7012372675181957985"><ph name="BEGIN_LINK" />history.google.com<ph name="END_LINK" />에서 내 Google 계정에 있는 다른 형식의 탐색 기록을 확인할 수 있습니다.</translation> +<translation id="7012372675181957985">Google 계정에 다른 형식의 탐색 기록이 <ph name="BEGIN_LINK" />history.google.com<ph name="END_LINK" />에 남아있을 수 있습니다.</translation> <translation id="7029809446516969842">비밀번호</translation> <translation id="7087282848513945231">카운티</translation> <translation id="7088615885725309056">다음</translation> @@ -611,7 +612,7 @@ <translation id="780301667611848630">아니요, 괜찮습니다.</translation> <translation id="7805768142964895445">상태</translation> <translation id="7813600968533626083">Chrome에서 추천검색어를 삭제하시겠습니까?</translation> -<translation id="7815407501681723534">'<ph name="SEARCH_STRING" />'에 대해 <ph name="SEARCH_RESULTS" /> <ph name="NUMBER_OF_RESULTS" />개를 찾았습니다.</translation> +<translation id="7815407501681723534">'<ph name="SEARCH_STRING" />'에 대해 <ph name="SEARCH_RESULTS" /> <ph name="NUMBER_OF_RESULTS" />개의 검색 결과를 찾았습니다.</translation> <translation id="785549533363645510">하지만 흔적이 아예 남지 않는 것은 아닙니다. 시크릿 모드로 탐색해도 회사, 인터넷 서비스 제공업체 또는 방문한 웹사이트에 저장된 흔적까지 없앨 수는 없습니다.</translation> <translation id="7887683347370398519">CVC를 확인한 후 다시 시도하세요.</translation> <translation id="7894616681410591072">이 페이지에 액세스하려면 <ph name="NAME" />님의 승인이 필요합니다.</translation>
diff --git a/components/strings/components_strings_lt.xtb b/components/strings/components_strings_lt.xtb index 3bc64ef..0c6cd0f4 100644 --- a/components/strings/components_strings_lt.xtb +++ b/components/strings/components_strings_lt.xtb
@@ -394,6 +394,7 @@ <translation id="5190835502935405962">Žymių juosta</translation> <translation id="5199729219167945352">Bandymai</translation> <translation id="5251803541071282808">Debesis</translation> +<translation id="5277279256032773186">Naudojate „Chrome“ darbe? Įmonės gali tvarkyti darbuotojų „Chrome“ nustatymus. Sužinokite daugiau</translation> <translation id="5299298092464848405">Analizuojant politiką įvyko klaida</translation> <translation id="5300589172476337783">Rodyti</translation> <translation id="5308689395849655368">Strigčių ataskaitų teikimas neleidžiamas.</translation>
diff --git a/components/strings/components_strings_lv.xtb b/components/strings/components_strings_lv.xtb index ee46746..5c90eee 100644 --- a/components/strings/components_strings_lv.xtb +++ b/components/strings/components_strings_lv.xtb
@@ -392,6 +392,7 @@ <translation id="5190835502935405962">Grāmatzīmju josla</translation> <translation id="5199729219167945352">Eksperimenti</translation> <translation id="5251803541071282808">Mākonis</translation> +<translation id="5277279256032773186">Vai izmantojat Chrome darbā? Uzņēmumi var pārvaldīt darbinieku Chrome iestatījumus. Uzziniet vairāk.</translation> <translation id="5299298092464848405">Parsējot politiku, radās kļūda.</translation> <translation id="5300589172476337783">Rādīt</translation> <translation id="5308689395849655368">Avāriju pārskatu izveide ir atspējota.</translation>
diff --git a/components/strings/components_strings_ml.xtb b/components/strings/components_strings_ml.xtb index 03d97ff..8bdf491 100644 --- a/components/strings/components_strings_ml.xtb +++ b/components/strings/components_strings_ml.xtb
@@ -392,6 +392,7 @@ <translation id="5190835502935405962">ബുക്ക്മാര്ക്കുകള് ബാര്</translation> <translation id="5199729219167945352">പരീക്ഷണങ്ങള്</translation> <translation id="5251803541071282808">ക്ലൗഡ്</translation> +<translation id="5277279256032773186">ജോലിസ്ഥലത്തുള്ള Chrome ഉപയോഗിക്കുകയാണോ? ബിസിനസ് സ്ഥാപനങ്ങൾക്ക് അവരുടെ ജീവനക്കാർക്ക് വേണ്ടി Chrome ക്രമീകരണം മാനേജുചെയ്യാനാകും. കൂടുതലറിയുക</translation> <translation id="5299298092464848405">നയം പാഴ്സുചെയ്യുന്നതിൽ പിശക്</translation> <translation id="5300589172476337783">കാണിക്കുക</translation> <translation id="5308689395849655368">ക്രാഷ് റിപ്പോര്ട്ടുചെയ്യല് അപ്രാപ്തമാക്കി.</translation>
diff --git a/components/strings/components_strings_mr.xtb b/components/strings/components_strings_mr.xtb index a03a192..710b8f9 100644 --- a/components/strings/components_strings_mr.xtb +++ b/components/strings/components_strings_mr.xtb
@@ -393,6 +393,7 @@ <translation id="5190835502935405962">बुकमार्क बार</translation> <translation id="5199729219167945352">प्रयोग</translation> <translation id="5251803541071282808">मेघ</translation> +<translation id="5277279256032773186">कार्यस्थानी Chrome वापरत आहात? व्यवसाय त्यांच्या कर्मचार्यांंसाठी Chrome सेटिंग्ज व्यवस्थापित करू शकतात. अधिक जाणनू घ्या</translation> <translation id="5299298092464848405">धोरण विश्लेषित करताना त्रुटी</translation> <translation id="5300589172476337783">दर्शवा</translation> <translation id="5308689395849655368">क्रॅश अहवाल अक्षम केला गेला आहे.</translation>
diff --git a/components/strings/components_strings_ms.xtb b/components/strings/components_strings_ms.xtb index 3b294a73..7ba2819 100644 --- a/components/strings/components_strings_ms.xtb +++ b/components/strings/components_strings_ms.xtb
@@ -243,7 +243,7 @@ <translation id="3528171143076753409">Sijil pelayan tidak dipercayai.</translation> <translation id="3539171420378717834">Simpan salinan kad ini pada peranti ini</translation> <translation id="3542684924769048008">Gunakan kata laluan untuk:</translation> -<translation id="3549644494707163724">Sulitkan semua data yang disegerakkan dengan frasa laluan segerak anda sendiri</translation> +<translation id="3549644494707163724">Sulitkan semua data yang disegerakkan dengan ungkapan laluan segerak anda sendiri</translation> <translation id="3549761410225185768"><ph name="NUM_TABS_MORE" /> lagi...</translation> <translation id="3555561725129903880">Pelayan ini tidak dapat membuktikan bahawa iitu <ph name="DOMAIN" />; sijil keselamatannya berasal daripada <ph name="DOMAIN2" />. Ini mungkin disebabkan oleh kesilapan konfigurasi atau penyerang yang memintas sambungan anda. <ph name="BEGIN_LEARN_MORE_LINK" />Ketahui lebih lanjut<ph name="END_LEARN_MORE_LINK" />.</translation> <translation id="3566021033012934673">Sambungan anda tidak diperibadikan</translation> @@ -394,6 +394,7 @@ <translation id="5190835502935405962">Bar Penanda Halaman</translation> <translation id="5199729219167945352">Eksperimen</translation> <translation id="5251803541071282808">Awan</translation> +<translation id="5277279256032773186">Menggunakan Chrome di tempat kerja? Perniagaan boleh mengurus tetapan Chrome untuk pekerja mereka. Ketahui lebih lanjut</translation> <translation id="5299298092464848405">Ralat semasa menghuraikan dasar</translation> <translation id="5300589172476337783">Paparkan</translation> <translation id="5308689395849655368">Pelaporan nahas dilumpuhkan.</translation>
diff --git a/components/strings/components_strings_nl.xtb b/components/strings/components_strings_nl.xtb index 3fe3b37c..d98ccd01 100644 --- a/components/strings/components_strings_nl.xtb +++ b/components/strings/components_strings_nl.xtb
@@ -389,6 +389,7 @@ <translation id="5190835502935405962">Bladwijzerbalk</translation> <translation id="5199729219167945352">Experimenten</translation> <translation id="5251803541071282808">Cloud</translation> +<translation id="5277279256032773186">Gebruik je Chrome op het werk? Bedrijven kunnen Chrome-instellingen beheren voor hun werknemers. Meer informatie</translation> <translation id="5299298092464848405">Fout bij het parseren van het beleid</translation> <translation id="5300589172476337783">Weergeven</translation> <translation id="5308689395849655368">Crashrapportage is uitgeschakeld.</translation>
diff --git a/components/strings/components_strings_no.xtb b/components/strings/components_strings_no.xtb index 82ac320..b16904e 100644 --- a/components/strings/components_strings_no.xtb +++ b/components/strings/components_strings_no.xtb
@@ -393,6 +393,7 @@ <translation id="5190835502935405962">Bokmerkerad</translation> <translation id="5199729219167945352">Eksperimenter</translation> <translation id="5251803541071282808">Nettsky</translation> +<translation id="5277279256032773186">Bruker du Chrome på jobben? Bedrifter kan administrere Chrome-innstillingene for de ansatte. Finn ut mer</translation> <translation id="5299298092464848405">Feil under analysen av enhetsinnstillingene</translation> <translation id="5300589172476337783">Vis</translation> <translation id="5308689395849655368">Rapportering av programstopp er deaktivert.</translation>
diff --git a/components/strings/components_strings_pl.xtb b/components/strings/components_strings_pl.xtb index 8d59cf8a..eb12351 100644 --- a/components/strings/components_strings_pl.xtb +++ b/components/strings/components_strings_pl.xtb
@@ -393,6 +393,7 @@ <translation id="5190835502935405962">Pasek zakładek</translation> <translation id="5199729219167945352">Eksperymenty</translation> <translation id="5251803541071282808">Chmura</translation> +<translation id="5277279256032773186">Korzystasz z Chrome w pracy? Firmy mogą zarządzać ustawieniami Chrome swoich pracowników. Więcej informacji</translation> <translation id="5299298092464848405">Podczas przetwarzania zasady wystąpił błąd</translation> <translation id="5300589172476337783">Pokaż</translation> <translation id="5308689395849655368">Funkcja zgłaszania awarii jest wyłączona.</translation>
diff --git a/components/strings/components_strings_pt-BR.xtb b/components/strings/components_strings_pt-BR.xtb index dda9993f..9ce1d6f39 100644 --- a/components/strings/components_strings_pt-BR.xtb +++ b/components/strings/components_strings_pt-BR.xtb
@@ -393,6 +393,7 @@ <translation id="5190835502935405962">Barra de favoritos</translation> <translation id="5199729219167945352">Experimentos</translation> <translation id="5251803541071282808">Nuvem</translation> +<translation id="5277279256032773186">Você usa o Chrome no trabalho? As empresas podem gerenciar as configurações do Chrome para seus funcionários. Saiba mais</translation> <translation id="5299298092464848405">Política de análise de erros</translation> <translation id="5300589172476337783">Mostrar</translation> <translation id="5308689395849655368">O relatório de erros está desativado.</translation>
diff --git a/components/strings/components_strings_pt-PT.xtb b/components/strings/components_strings_pt-PT.xtb index f458e29..3b00337 100644 --- a/components/strings/components_strings_pt-PT.xtb +++ b/components/strings/components_strings_pt-PT.xtb
@@ -393,6 +393,7 @@ <translation id="5190835502935405962">Barra de marcadores</translation> <translation id="5199729219167945352">Experiências</translation> <translation id="5251803541071282808">Nuvem</translation> +<translation id="5277279256032773186">Utiliza o Chrome no trabalho? As empresas podem gerir as definições do Chrome para os seus funcionários. Saiba mais</translation> <translation id="5299298092464848405">Erro ao analisar a política</translation> <translation id="5300589172476337783">Mostrar</translation> <translation id="5308689395849655368">O relatório de falha está desativado.</translation>
diff --git a/components/strings/components_strings_ro.xtb b/components/strings/components_strings_ro.xtb index d779983..c7577e3 100644 --- a/components/strings/components_strings_ro.xtb +++ b/components/strings/components_strings_ro.xtb
@@ -193,7 +193,7 @@ <translation id="3040955737384246924">{COUNT,plural, =0{cel puțin un element pe dispozitivele sincronizate}=1{un element (și mai multe pe dispozitivele sincronizate)}few{# elemente (și mai multe pe dispozitivele sincronizate)}other{# de elemente (și mai multe pe dispozitivele sincronizate)}}</translation> <translation id="3041612393474885105">Informații despre certificat</translation> <translation id="3063697135517575841">Momentan, Chrome nu a putut confirma cardul. Încearcă din nou mai târziu.</translation> -<translation id="3093245981617870298">Sunteți offline.</translation> +<translation id="3093245981617870298">Ești offline.</translation> <translation id="3105172416063519923">ID articol:</translation> <translation id="3109728660330352905">Nu ești autorizat(ă) să vezi această pagină.</translation> <translation id="31207688938192855"><ph name="BEGIN_LINK" />Rulează Diagnostice conectivitate<ph name="END_LINK" />.</translation> @@ -393,6 +393,7 @@ <translation id="5190835502935405962">Bară de marcaje</translation> <translation id="5199729219167945352">Experimente</translation> <translation id="5251803541071282808">Cloud</translation> +<translation id="5277279256032773186">Folosești Chrome la serviciu? Companiile pot gestiona setările Chrome pentru angajații lor. Află mai multe</translation> <translation id="5299298092464848405">Eroare la analizarea politicii</translation> <translation id="5300589172476337783">Afișează</translation> <translation id="5308689395849655368">Raportarea blocărilor este dezactivată.</translation>
diff --git a/components/strings/components_strings_ru.xtb b/components/strings/components_strings_ru.xtb index f3e5492..46d475c9 100644 --- a/components/strings/components_strings_ru.xtb +++ b/components/strings/components_strings_ru.xtb
@@ -392,6 +392,7 @@ <translation id="5190835502935405962">Панель закладок</translation> <translation id="5199729219167945352">Экспериментальные функции</translation> <translation id="5251803541071282808">Облако</translation> +<translation id="5277279256032773186">Используете Chrome на работе? Узнайте, как компании могут управлять настройками Chrome на корпоративных устройствах.</translation> <translation id="5299298092464848405">Не удалось выполнить анализ политики</translation> <translation id="5300589172476337783">Показать</translation> <translation id="5308689395849655368">Отчеты о сбоях отключены.</translation>
diff --git a/components/strings/components_strings_sk.xtb b/components/strings/components_strings_sk.xtb index a6c6a0f..ff8f3fb3 100644 --- a/components/strings/components_strings_sk.xtb +++ b/components/strings/components_strings_sk.xtb
@@ -389,6 +389,7 @@ <translation id="5190835502935405962">Panel so záložkami</translation> <translation id="5199729219167945352">Experimenty</translation> <translation id="5251803541071282808">Cloud</translation> +<translation id="5277279256032773186">Používate Chrome v práci? Firmy môžu spravovať nastavenia prehliadača Chrome pre svojich zamestnancov. Ďalšie informácie</translation> <translation id="5299298092464848405">Pri analýze pravidla sa vyskytla chyba</translation> <translation id="5300589172476337783">Zobraziť</translation> <translation id="5308689395849655368">Hlásenie zlyhaní je zakázané.</translation>
diff --git a/components/strings/components_strings_sl.xtb b/components/strings/components_strings_sl.xtb index d058759..b55ada33 100644 --- a/components/strings/components_strings_sl.xtb +++ b/components/strings/components_strings_sl.xtb
@@ -393,6 +393,7 @@ <translation id="5190835502935405962">Vrstica z zaznamki</translation> <translation id="5199729219167945352">Poskusi</translation> <translation id="5251803541071282808">Oblak</translation> +<translation id="5277279256032773186">Uporabljate Chrome v službi? Podjetja lahko upravljajo nastavitve Chroma za zaposlene. Preberite več o tem.</translation> <translation id="5299298092464848405">Napaka pri razčlenjevanju pravilnika</translation> <translation id="5300589172476337783">Pokaži</translation> <translation id="5308689395849655368">Poročanje o zrušitvah je onemogočeno.</translation>
diff --git a/components/strings/components_strings_sr.xtb b/components/strings/components_strings_sr.xtb index 3dc5e873..04c22628 100644 --- a/components/strings/components_strings_sr.xtb +++ b/components/strings/components_strings_sr.xtb
@@ -157,7 +157,7 @@ <translation id="2677748264148917807">Напусти</translation> <translation id="269990154133806163">Сервер је послао сертификат који није јавно откривен помоћу смерница за транспарентност сертификата. То је обавезно за неке сертификате да бисмо се уверили да су поуздани и да штите од нападача. <ph name="BEGIN_LEARN_MORE_LINK" />Сазнајте више<ph name="END_LEARN_MORE_LINK" />.</translation> <translation id="2704283930420550640">Вредност се не подудара са форматом.</translation> -<translation id="2704951214193499422">Chromium није успео да потврди картицу. Покушајте поново касније.</translation> +<translation id="2704951214193499422">Chromium није успео да потврди картицу. Пробајте поново касније.</translation> <translation id="2705137772291741111">Сачувана (кеширана) копија овог сајта није могла да се чита.</translation> <translation id="2709516037105925701">Аутоматско попуњавање</translation> <translation id="2712118517637785082">Покушали сте да посетите <ph name="DOMAIN" />, али је издавач опозвао сертификат који је сервер послао. То значи да никако не треба да имате поверења у безбедносне акредитиве које је сервер послао. Могуће је да комуницирате са нападачем. <ph name="BEGIN_LEARN_MORE_LINK" />Сазнајте више<ph name="END_LEARN_MORE_LINK" />.</translation> @@ -192,7 +192,7 @@ <translation id="3037605927509011580">О, не!</translation> <translation id="3040955737384246924">{COUNT,plural, =0{најмање 1 ставка на синхронизованим уређајима}=1{1 ставка (и још ставки на синхронизованим уређајима)}one{# ставка (и још ставки на синхронизованим уређајима)}few{# ставке (и још ставки на синхронизованим уређајима)}other{# ставки (и још ставки на синхронизованим уређајима)}}</translation> <translation id="3041612393474885105">Информације о сертификату</translation> -<translation id="3063697135517575841">Chrome није успео да потврди картицу. Покушајте поново касније.</translation> +<translation id="3063697135517575841">Chrome није успео да потврди картицу. Пробајте поново касније.</translation> <translation id="3093245981617870298">Офлајн сте.</translation> <translation id="3105172416063519923">ИД елемента:</translation> <translation id="3109728660330352905">Немате овлашћење да прегледате ову страницу.</translation> @@ -220,7 +220,7 @@ <translation id="333371639341676808">Спречите ову страницу да прави додатне дијалоге.</translation> <translation id="3338095232262050444">Безбедан</translation> <translation id="3340978935015468852">подешавања</translation> -<translation id="3345135638360864351">Слање захтева за приступ овом сајту кориснику <ph name="NAME" /> није успело. Покушајте поново.</translation> +<translation id="3345135638360864351">Слање захтева за приступ овом сајту кориснику <ph name="NAME" /> није успело. Пробајте поново.</translation> <translation id="3355823806454867987">Промени подешавања проксија...</translation> <translation id="3369192424181595722">Грешка на сату</translation> <translation id="337363190475750230">Онемогућен је</translation> @@ -238,7 +238,7 @@ <translation id="3479539252931486093">Да ли је ово било неочекивано? <ph name="BEGIN_LINK" />Обавестите нас<ph name="END_LINK" /></translation> <translation id="3479552764303398839">Не сада</translation> <translation id="348000606199325318">ИД отказивања <ph name="CRASH_LOCAL_ID" /> (ИД сервера: <ph name="CRASH_ID" />)</translation> -<translation id="3498215018399854026">Тренутно не можемо да контактирамо родитеља. Покушај поново.</translation> +<translation id="3498215018399854026">Тренутно не можемо да контактирамо родитеља. Пробај поново.</translation> <translation id="3527085408025491307">Директоријум</translation> <translation id="3528171143076753409">Сертификат сервера није поуздан.</translation> <translation id="3539171420378717834">Задржи копију ове картице на овом уређају</translation> @@ -393,6 +393,7 @@ <translation id="5190835502935405962">Трака са обележивачима</translation> <translation id="5199729219167945352">Експерименти</translation> <translation id="5251803541071282808">Клауд</translation> +<translation id="5277279256032773186">Да ли користите Chrome на послу? Предузеће може да управља подешавањима Chrome-а за запослене. Сазнајте више</translation> <translation id="5299298092464848405">Грешка при рашчлањивању смерница</translation> <translation id="5300589172476337783">Прикажи</translation> <translation id="5308689395849655368">Извештавање о отказивању је онемогућено.</translation> @@ -624,7 +625,7 @@ <translation id="7962083544045318153">ИД отказивања <ph name="CRASH_LOCAL_ID" /></translation> <translation id="7983301409776629893">Увек преводи са језика: <ph name="ORIGINAL_LANGUAGE" /> на <ph name="TARGET_LANGUAGE" /></translation> <translation id="7995512525968007366">Није наведено</translation> -<translation id="8012647001091218357">Тренутно не можемо да контактирамо родитеље. Покушај поново.</translation> +<translation id="8012647001091218357">Тренутно не можемо да контактирамо родитеље. Пробај поново.</translation> <translation id="8034522405403831421">Језик ове странице је <ph name="SOURCE_LANGUAGE" />. Желите ли да је преведете на <ph name="TARGET_LANGUAGE" />?</translation> <translation id="8088680233425245692">Прегледање чланка није успело.</translation> <translation id="8089520772729574115">мање од 1 MB</translation> @@ -673,7 +674,7 @@ <translation id="8647750283161643317">Врати све на подразумевано</translation> <translation id="8680787084697685621">Детаљи за пријављивање на налог су застарели.</translation> <translation id="8703575177326907206">Ваша веза са доменом <ph name="DOMAIN" /> није шифрована.</translation> -<translation id="8725066075913043281">Покушајте поново</translation> +<translation id="8725066075913043281">Пробајте поново</translation> <translation id="8728672262656704056">Прешли сте у режим Без архивирања</translation> <translation id="8730621377337864115">Готово</translation> <translation id="8738058698779197622">Да бисте успоставили безбедну везу, сат на уређају мора да буде тачан. То је зато што сертификати које веб-сајтови користе за идентификацију важе само одређени временски период. Пошто сат на вашем уређају није тачан, Chromium не може да верификује ове сертификате.</translation>
diff --git a/components/strings/components_strings_sv.xtb b/components/strings/components_strings_sv.xtb index 40b4897..3072fd5 100644 --- a/components/strings/components_strings_sv.xtb +++ b/components/strings/components_strings_sv.xtb
@@ -393,6 +393,7 @@ <translation id="5190835502935405962">Bokmärkesfältet</translation> <translation id="5199729219167945352">Experiment</translation> <translation id="5251803541071282808">Moln</translation> +<translation id="5277279256032773186">Använder du Chrome på jobbet? Företag kan hantera de anställdas inställningar i Chrome. Läs mer</translation> <translation id="5299298092464848405">Det uppstod ett fel när policyn analyserades</translation> <translation id="5300589172476337783">Visa</translation> <translation id="5308689395849655368">Krashrapportering har inaktiverats.</translation>
diff --git a/components/strings/components_strings_sw.xtb b/components/strings/components_strings_sw.xtb index e7181ff..e0110dbc 100644 --- a/components/strings/components_strings_sw.xtb +++ b/components/strings/components_strings_sw.xtb
@@ -393,6 +393,7 @@ <translation id="5190835502935405962">Sehemu ya Alamisho</translation> <translation id="5199729219167945352">Majaribio</translation> <translation id="5251803541071282808">Wingu</translation> +<translation id="5277279256032773186">Je, unatumia Chrome kazini? Kampuni zinaweza kudhibiti mipangilio ya Chrome ya wafanyikazi wao. Pata maelezo zaidi</translation> <translation id="5299298092464848405">Hitilafu wakati wa kuchanganua sera</translation> <translation id="5300589172476337783">Onyesha</translation> <translation id="5308689395849655368">Kuripoti uharibifu kumelemazwa.</translation>
diff --git a/components/strings/components_strings_ta.xtb b/components/strings/components_strings_ta.xtb index 2c21642..459eacb9 100644 --- a/components/strings/components_strings_ta.xtb +++ b/components/strings/components_strings_ta.xtb
@@ -390,6 +390,7 @@ <translation id="5190835502935405962">புக்மார்க்குகள் பட்டி</translation> <translation id="5199729219167945352">சோதனைகள்</translation> <translation id="5251803541071282808">மேகக்கணி</translation> +<translation id="5277279256032773186">பணியில் Chromeஐப் பயன்படுத்துகிறீர்களா? வணிகங்கள் தங்களின் பணியாளர்களுக்கான Chrome அமைப்புகளை நிர்வகிக்கலாம். மேலும் அறிக</translation> <translation id="5299298092464848405">கொள்கையை அலசுவதில் பிழை</translation> <translation id="5300589172476337783">காண்பி</translation> <translation id="5308689395849655368">செயலிழப்பு புகாரளித்தல் முடக்கப்பட்டுள்ளது.</translation>
diff --git a/components/strings/components_strings_te.xtb b/components/strings/components_strings_te.xtb index 6c89eb5..3d0ad4e 100644 --- a/components/strings/components_strings_te.xtb +++ b/components/strings/components_strings_te.xtb
@@ -393,6 +393,7 @@ <translation id="5190835502935405962">బుక్మార్క్ల బార్</translation> <translation id="5199729219167945352">ప్రయోగాలు</translation> <translation id="5251803541071282808">క్లౌడ్</translation> +<translation id="5277279256032773186">కార్యాలయంలో Chrome ఉపయోగిస్తున్నారా? వ్యాపార సంస్థలు తమ ఉద్యోగుల కోసం Chrome సెట్టింగ్లను నిర్వహించగలవు. మరింత తెలుసుకోండి</translation> <translation id="5299298092464848405">విధానాన్ని అన్వయించడంలో లోపం</translation> <translation id="5300589172476337783">చూపించు</translation> <translation id="5308689395849655368">క్రాష్ నివేదిక నిలిపివెయ్యబడింది.</translation>
diff --git a/components/strings/components_strings_th.xtb b/components/strings/components_strings_th.xtb index 175117b1..0f07ff7 100644 --- a/components/strings/components_strings_th.xtb +++ b/components/strings/components_strings_th.xtb
@@ -393,6 +393,7 @@ <translation id="5190835502935405962">แถบบุ๊กมาร์ก</translation> <translation id="5199729219167945352">การทดลอง</translation> <translation id="5251803541071282808">ระบบคลาวด์</translation> +<translation id="5277279256032773186">หากใช้ Chrome ที่ทำงาน ธุรกิจสามารถจัดการการตั้งค่า Chrome ให้พนักงานของตนได้ เรียนรู้เพิ่มเติม</translation> <translation id="5299298092464848405">ข้อผิดพลาดในการแยกวิเคราะห์นโยบาย</translation> <translation id="5300589172476337783">แสดง</translation> <translation id="5308689395849655368">การรายงานข้อขัดข้องถูกปิดใช้งาน</translation>
diff --git a/components/strings/components_strings_tr.xtb b/components/strings/components_strings_tr.xtb index d71168e..4a27fa7d 100644 --- a/components/strings/components_strings_tr.xtb +++ b/components/strings/components_strings_tr.xtb
@@ -393,6 +393,7 @@ <translation id="5190835502935405962">Yer İşareti Çubuğu</translation> <translation id="5199729219167945352">Deneyler</translation> <translation id="5251803541071282808">Bulut</translation> +<translation id="5277279256032773186">Chrome'u işte mi kullanıyorsunuz? İşletmeler, çalışanları için Chrome ayarlarını yönetebilir. Daha fazla bilgi edinin</translation> <translation id="5299298092464848405">Politika ayrıştırma hatası</translation> <translation id="5300589172476337783">Göster</translation> <translation id="5308689395849655368">Kilitlenme bildirme devre dışı.</translation>
diff --git a/components/strings/components_strings_uk.xtb b/components/strings/components_strings_uk.xtb index 7169d56..52b09ce 100644 --- a/components/strings/components_strings_uk.xtb +++ b/components/strings/components_strings_uk.xtb
@@ -393,6 +393,7 @@ <translation id="5190835502935405962">Панель закладок</translation> <translation id="5199729219167945352">Експерименти</translation> <translation id="5251803541071282808">Хмара</translation> +<translation id="5277279256032773186">Користуєтеся Chrome на роботі? Компанії можуть налаштовувати Chrome для своїх працівників. Докладніше</translation> <translation id="5299298092464848405">Помилка аналізу правила</translation> <translation id="5300589172476337783">Показати</translation> <translation id="5308689395849655368">Повідомлення про аварійне завершення роботи вимкнено.</translation> @@ -528,7 +529,7 @@ <translation id="7000990526846637657">Немає записів в історії</translation> <translation id="7009986207543992532">Ви намагалися зв’язатися з доменом <ph name="DOMAIN" />, але сервер надав сертифікат із задовгим терміном дії. <ph name="BEGIN_LEARN_MORE_LINK" />Докладніше<ph name="END_LEARN_MORE_LINK" />.</translation> <translation id="7012363358306927923">China UnionPay</translation> -<translation id="7012372675181957985">У вашому обліковому записі Google на сторінці <ph name="BEGIN_LINK" />history.google.com<ph name="END_LINK" /> можуть бути інші форми історії веб-перегляду</translation> +<translation id="7012372675181957985">Історія веб-перегляду також може зберігатися у вашому обліковому записі Google на сторінці <ph name="BEGIN_LINK" />history.google.com<ph name="END_LINK" /></translation> <translation id="7029809446516969842">Паролі</translation> <translation id="7087282848513945231">Округ або графство</translation> <translation id="7088615885725309056">Давніше</translation>
diff --git a/components/strings/components_strings_vi.xtb b/components/strings/components_strings_vi.xtb index 5c9c9908..d9224fc1 100644 --- a/components/strings/components_strings_vi.xtb +++ b/components/strings/components_strings_vi.xtb
@@ -393,6 +393,7 @@ <translation id="5190835502935405962">Thanh Dấu trang</translation> <translation id="5199729219167945352">Thử nghiệm</translation> <translation id="5251803541071282808">Đám mây</translation> +<translation id="5277279256032773186">Sử dụng Chrome ở cơ quan? Các doanh nghiệp có thể quản lý cài đặt Chrome cho nhân viên của họ. Tìm hiểu thêm</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="5308689395849655368">Báo cáo sự cố bị tắt.</translation>
diff --git a/components/strings/components_strings_zh-CN.xtb b/components/strings/components_strings_zh-CN.xtb index e05a005b..682ae4a 100644 --- a/components/strings/components_strings_zh-CN.xtb +++ b/components/strings/components_strings_zh-CN.xtb
@@ -390,6 +390,7 @@ <translation id="5190835502935405962">书签栏</translation> <translation id="5199729219167945352">实验</translation> <translation id="5251803541071282808">云端</translation> +<translation id="5277279256032773186">使用 Chrome 办公?企业可以为其员工管理 Chrome 设置。了解详情</translation> <translation id="5299298092464848405">解析策略时出错</translation> <translation id="5300589172476337783">显示</translation> <translation id="5308689395849655368">已停用崩溃报告。</translation>
diff --git a/components/strings/components_strings_zh-TW.xtb b/components/strings/components_strings_zh-TW.xtb index 5226327..f45bffff 100644 --- a/components/strings/components_strings_zh-TW.xtb +++ b/components/strings/components_strings_zh-TW.xtb
@@ -393,6 +393,7 @@ <translation id="5190835502935405962">書籤列</translation> <translation id="5199729219167945352">實驗性功能</translation> <translation id="5251803541071282808">雲端</translation> +<translation id="5277279256032773186">在工作環境使用 Chrome 嗎?企業可以管理員工的 Chrome 設定。瞭解詳情</translation> <translation id="5299298092464848405">解析政策時發生錯誤</translation> <translation id="5300589172476337783">顯示</translation> <translation id="5308689395849655368">當機報告功能已停用。</translation>
diff --git a/components/subresource_filter/content/renderer/document_subresource_filter.cc b/components/subresource_filter/content/renderer/document_subresource_filter.cc index f62bab9..ad1f90c8 100644 --- a/components/subresource_filter/content/renderer/document_subresource_filter.cc +++ b/components/subresource_filter/content/renderer/document_subresource_filter.cc
@@ -10,6 +10,7 @@ #include "base/strings/string_piece.h" #include "base/strings/string_util.h" #include "base/trace_event/trace_event.h" +#include "components/subresource_filter/core/common/first_party_origin.h" #include "components/subresource_filter/core/common/memory_mapped_ruleset.h" #include "third_party/WebKit/public/platform/WebURL.h" @@ -84,11 +85,6 @@ DCHECK_NE(activation_state_, ActivationState::DISABLED); DCHECK(ruleset); - if (ancestor_document_urls.empty()) - return; - - document_origin_ = url::Origin(ancestor_document_urls.front()); - url::Origin parent_document_origin; for (auto iter = ancestor_document_urls.rbegin(), rend = ancestor_document_urls.rend(); @@ -100,9 +96,13 @@ filtering_disabled_for_document_ = true; return; } + // TODO(pkalinnikov): Think about avoiding this conversion. parent_document_origin = url::Origin(document_url); } + url::Origin document_origin = std::move(parent_document_origin); + document_origin_.reset(new FirstPartyOrigin(std::move(document_origin))); + // TODO(pkalinnikov): Implement GENERICBLOCK activation type as well. // TODO(pkalinnikov): Match several activation types in a batch. } @@ -124,8 +124,9 @@ return true; ++num_loads_evaluated_; + DCHECK(document_origin_); if (ruleset_matcher_.ShouldDisallowResourceLoad( - GURL(resourceUrl), document_origin_, + GURL(resourceUrl), *document_origin_, ToElementType(request_context))) { ++num_loads_matching_rules_; if (activation_state_ == ActivationState::ENABLED) {
diff --git a/components/subresource_filter/content/renderer/document_subresource_filter.h b/components/subresource_filter/content/renderer/document_subresource_filter.h index dd05ab64..1c3a1dd3 100644 --- a/components/subresource_filter/content/renderer/document_subresource_filter.h +++ b/components/subresource_filter/content/renderer/document_subresource_filter.h
@@ -21,6 +21,7 @@ namespace subresource_filter { +class FirstPartyOrigin; class MemoryMappedRuleset; // Performs filtering of subresource loads in the scope of a given document. @@ -62,7 +63,9 @@ ActivationState activation_state_; scoped_refptr<const MemoryMappedRuleset> ruleset_; IndexedRulesetMatcher ruleset_matcher_; - url::Origin document_origin_; + + // Note: Equals nullptr iff |filtering_disabled_for_document_|. + std::unique_ptr<FirstPartyOrigin> document_origin_; base::Closure first_disallowed_load_callback_;
diff --git a/components/subresource_filter/core/common/BUILD.gn b/components/subresource_filter/core/common/BUILD.gn index 4e12cc3..b48b555 100644 --- a/components/subresource_filter/core/common/BUILD.gn +++ b/components/subresource_filter/core/common/BUILD.gn
@@ -11,6 +11,8 @@ "closed_hash_map.h", "copying_file_stream.cc", "copying_file_stream.h", + "first_party_origin.cc", + "first_party_origin.h", "fuzzy_pattern_matching.cc", "fuzzy_pattern_matching.h", "indexed_ruleset.cc", @@ -60,6 +62,7 @@ testonly = true sources = [ "closed_hash_map_unittest.cc", + "first_party_origin_unittest.cc", "fuzzy_pattern_matching_unittest.cc", "indexed_ruleset_unittest.cc", "knuth_morris_pratt_unittest.cc",
diff --git a/components/subresource_filter/core/common/first_party_origin.cc b/components/subresource_filter/core/common/first_party_origin.cc new file mode 100644 index 0000000..a622c698 --- /dev/null +++ b/components/subresource_filter/core/common/first_party_origin.cc
@@ -0,0 +1,45 @@ +// 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/subresource_filter/core/common/first_party_origin.h" + +#include "net/base/registry_controlled_domains/registry_controlled_domain.h" + +namespace subresource_filter { + +namespace { + +bool IsThirdPartyImpl(const GURL& url, const GURL& first_party_url) { + return !net::registry_controlled_domains::SameDomainOrHost( + url, first_party_url, + net::registry_controlled_domains::INCLUDE_PRIVATE_REGISTRIES); +} + +} // namespace + +FirstPartyOrigin::FirstPartyOrigin(url::Origin document_origin) + : document_origin_(std::move(document_origin)) { + document_origin_as_gurl_ = GURL(document_origin_.Serialize()); +} + +bool FirstPartyOrigin::IsThirdParty(const GURL& url) const { + if (document_origin_.unique()) + return true; + if (!last_checked_host_.empty() && url.host_piece() == last_checked_host_) + return last_checked_host_was_third_party_; + + url.host_piece().CopyToString(&last_checked_host_); + last_checked_host_was_third_party_ = + IsThirdPartyImpl(url, document_origin_as_gurl_); + return last_checked_host_was_third_party_; +} + +bool FirstPartyOrigin::IsThirdParty(const GURL& url, + const url::Origin& first_party_origin) { + // TODO(pkalinnikov): Avoid converting Origin to GURL. + return first_party_origin.unique() || + IsThirdPartyImpl(url, GURL(first_party_origin.Serialize())); +} + +} // namespace subresouce_filter
diff --git a/components/subresource_filter/core/common/first_party_origin.h b/components/subresource_filter/core/common/first_party_origin.h new file mode 100644 index 0000000..b05dcf11 --- /dev/null +++ b/components/subresource_filter/core/common/first_party_origin.h
@@ -0,0 +1,55 @@ +// 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_SUBRESOURCE_FILTER_CORE_COMMON_FIRST_PARTY_ORIGIN_H_ +#define COMPONENTS_SUBRESOURCE_FILTER_CORE_COMMON_FIRST_PARTY_ORIGIN_H_ + +#include <string> + +#include "url/gurl.h" +#include "url/origin.h" + +namespace subresource_filter { + +// Encapsulates the first-party origin of a document, and provides fast (cached) +// third-partiness checks against that origin, i.e. whether a given URL is +// third-party in relation to the document's origin. +// +// It uses a simple one-entry cache to optimize for the case when a significant +// number of consecutive URLs have the same domain. +class FirstPartyOrigin { + public: + explicit FirstPartyOrigin(url::Origin document_origin); + + const url::Origin& origin() const { return document_origin_; } + + // Returns whether |url| is a third-party in relation to |this| origin. May + // return a cached value. May update the cache. + bool IsThirdParty(const GURL& url) const; + + // Returns whether |url| is a third party in respect to |first_party_origin|. + static bool IsThirdParty(const GURL& url, + const url::Origin& first_party_origin); + + private: + url::Origin document_origin_; + + // NOTE: GURL is needed to work around the slightly inefficient interfaces of + // net::registry_controlled_domains. + GURL document_origin_as_gurl_; + + // One-entry cache that stores input/output of the last IsThirdParty + // call. + // + // NOTE: registry_controlled_domains::SameDomainOrHost takes GURLs as inputs, + // but the cache entry stores only the host part of a GURL. It is assumed that + // SameDomainOrHost will return the same result for a GURL which has the same + // non-empty host part as the cached one. + mutable std::string last_checked_host_; + mutable bool last_checked_host_was_third_party_ = false; +}; + +} // namespace subresource_filter + +#endif // COMPONENTS_SUBRESOURCE_FILTER_CORE_COMMON_FIRST_PARTY_ORIGIN_H_
diff --git a/components/subresource_filter/core/common/first_party_origin_unittest.cc b/components/subresource_filter/core/common/first_party_origin_unittest.cc new file mode 100644 index 0000000..02ba302 --- /dev/null +++ b/components/subresource_filter/core/common/first_party_origin_unittest.cc
@@ -0,0 +1,82 @@ +// 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/subresource_filter/core/common/first_party_origin.h" + +#include "base/strings/string_number_conversions.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace subresource_filter { + +TEST(FirstPartyOriginTest, AllSameDomain) { + const std::string kDomain = "sub.example.co.uk"; + + FirstPartyOrigin first_party(url::Origin(GURL("https://" + kDomain))); + for (int index = 0; index < 5; ++index) { + GURL url("https://" + kDomain + "/path?q=" + base::IntToString(index)); + EXPECT_FALSE(FirstPartyOrigin::IsThirdParty(url, first_party.origin())); + EXPECT_FALSE(first_party.IsThirdParty(url)); + } +} + +TEST(FirstPartyOriginTest, AllFirstParty) { + const std::string kDomain = "example.co.uk"; + + FirstPartyOrigin first_party(url::Origin(GURL("https://" + kDomain))); + for (int index = 0; index < 5; ++index) { + GURL url("https://sub" + base::IntToString(index) + "." + kDomain + "/suf"); + EXPECT_FALSE(FirstPartyOrigin::IsThirdParty(url, first_party.origin())); + EXPECT_FALSE(first_party.IsThirdParty(url)); + } +} + +TEST(FirstPartyOriginTest, AllThirdParty) { + const std::string kDomain = "example.co.uk"; + + FirstPartyOrigin first_party(url::Origin(GURL("https://" + kDomain))); + for (int index = 0; index < 5; ++index) { + GURL url("https://example" + base::IntToString(index) + ".co.uk/path?k=v"); + EXPECT_TRUE(FirstPartyOrigin::IsThirdParty(url, first_party.origin())); + EXPECT_TRUE(first_party.IsThirdParty(url)); + } +} + +TEST(FirstPartyOriginTest, MixedFirstAndThirdParties) { + const struct { + const char* url; + bool is_third_party; + } kTestCases[] = { + {"https://sub.example.com", false}, + {"https://subexample.com", true}, + {"https://sub.subexample.com", true}, + {"https://sub.sub.example.com", false}, + {"https://xample.com", true}, + {"https://sub.xample.com", true}, + {"data:text/plain,example.com", true}, + }; + + FirstPartyOrigin first_party(url::Origin(GURL("https://example.com"))); + for (const auto& test_case : kTestCases) { + GURL url(test_case.url); + EXPECT_EQ(test_case.is_third_party, + FirstPartyOrigin::IsThirdParty(url, first_party.origin())); + EXPECT_EQ(test_case.is_third_party, first_party.IsThirdParty(url)); + } +} + +TEST(FirstPartyOriginTest, EmptyHostUrls) { + const char* const kUrls[] = { + "data:text/plain,example.com", "data:text/plain,another.example.com", + "data:text/plain;base64,ABACABA", + }; + + FirstPartyOrigin first_party(url::Origin(GURL("https://example.com"))); + for (const auto& url_string : kUrls) { + GURL url(url_string); + EXPECT_TRUE(FirstPartyOrigin::IsThirdParty(url, first_party.origin())); + EXPECT_TRUE(first_party.IsThirdParty(url)); + } +} + +} // namespace subresource_filter
diff --git a/components/subresource_filter/core/common/indexed_ruleset.cc b/components/subresource_filter/core/common/indexed_ruleset.cc index 307720e..f9b4600 100644 --- a/components/subresource_filter/core/common/indexed_ruleset.cc +++ b/components/subresource_filter/core/common/indexed_ruleset.cc
@@ -10,10 +10,10 @@ #include "base/logging.h" #include "base/numerics/safe_conversions.h" +#include "components/subresource_filter/core/common/first_party_origin.h" #include "components/subresource_filter/core/common/ngram_extractor.h" #include "components/subresource_filter/core/common/url_pattern.h" #include "components/subresource_filter/core/common/url_pattern_matching.h" -#include "net/base/registry_controlled_domains/registry_controlled_domain.h" #include "third_party/flatbuffers/src/include/flatbuffers/flatbuffers.h" namespace subresource_filter { @@ -357,15 +357,6 @@ return max_domain_length ? is_positive : negatives_only; } -// Returns whether |url| is a third party in respect to |first_party_origin|. -bool IsThirdPartyUrl(const GURL& url, const url::Origin& first_party_origin) { - // TODO(pkalinnikov): Avoid converting Origin to GURL. - return first_party_origin.unique() || - !net::registry_controlled_domains::SameDomainOrHost( - url, first_party_origin.GetURL(), - net::registry_controlled_domains::INCLUDE_PRIVATE_REGISTRIES); -} - // Returns true iff the request to |url| of type |element_type| requested by // |initiator| matches the |rule|'s metadata: resource type, first/third party, // domain list. @@ -450,22 +441,25 @@ activation_type == proto::ACTIVATION_TYPE_UNSPECIFIED) { return false; } - return IsMatch(root_->whitelist_index(), document_url, parent_document_origin, - proto::ELEMENT_TYPE_UNSPECIFIED, activation_type, - IsThirdPartyUrl(document_url, parent_document_origin)); + return IsMatch( + root_->whitelist_index(), document_url, parent_document_origin, + proto::ELEMENT_TYPE_UNSPECIFIED, activation_type, + FirstPartyOrigin::IsThirdParty(document_url, parent_document_origin)); } bool IndexedRulesetMatcher::ShouldDisallowResourceLoad( const GURL& url, - const url::Origin& document_origin, + const FirstPartyOrigin& first_party, proto::ElementType element_type) const { if (!url.is_valid() || element_type == proto::ELEMENT_TYPE_UNSPECIFIED) return false; - const bool is_third_party = IsThirdPartyUrl(url, document_origin); - return IsMatch(root_->blacklist_index(), url, document_origin, element_type, - proto::ACTIVATION_TYPE_UNSPECIFIED, is_third_party) && - !IsMatch(root_->whitelist_index(), url, document_origin, element_type, - proto::ACTIVATION_TYPE_UNSPECIFIED, is_third_party); + const bool is_third_party = first_party.IsThirdParty(url); + return IsMatch(root_->blacklist_index(), url, first_party.origin(), + element_type, proto::ACTIVATION_TYPE_UNSPECIFIED, + is_third_party) && + !IsMatch(root_->whitelist_index(), url, first_party.origin(), + element_type, proto::ACTIVATION_TYPE_UNSPECIFIED, + is_third_party); } bool IndexedRulesetMatcher::IsMatch(const flat::UrlPatternIndex* index,
diff --git a/components/subresource_filter/core/common/indexed_ruleset.h b/components/subresource_filter/core/common/indexed_ruleset.h index fd65b5c..947cb33 100644 --- a/components/subresource_filter/core/common/indexed_ruleset.h +++ b/components/subresource_filter/core/common/indexed_ruleset.h
@@ -21,6 +21,8 @@ namespace subresource_filter { +class FirstPartyOrigin; + // The integer type used to represent N-grams. using NGram = uint64_t; // The hasher used for hashing N-grams. @@ -127,7 +129,7 @@ // |document_origin| is not allowed to proceed. Always returns false if the // |url| is not valid or |element_type| == ELEMENT_TYPE_UNSPECIFIED. bool ShouldDisallowResourceLoad(const GURL& url, - const url::Origin& document_origin, + const FirstPartyOrigin& first_party, proto::ElementType element_type) const; private:
diff --git a/components/subresource_filter/core/common/indexed_ruleset_unittest.cc b/components/subresource_filter/core/common/indexed_ruleset_unittest.cc index 1cd4a6c..b0e183e 100644 --- a/components/subresource_filter/core/common/indexed_ruleset_unittest.cc +++ b/components/subresource_filter/core/common/indexed_ruleset_unittest.cc
@@ -9,6 +9,7 @@ #include <vector> #include "base/logging.h" +#include "components/subresource_filter/core/common/first_party_origin.h" #include "components/subresource_filter/core/common/proto/rules.pb.h" #include "components/subresource_filter/core/common/url_pattern.h" #include "testing/gtest/include/gtest/gtest.h" @@ -44,7 +45,8 @@ proto::ElementType element_type = proto::ELEMENT_TYPE_OTHER) const { DCHECK_NE(matcher_.get(), nullptr); url::Origin origin = GetOrigin(initiator); - return !matcher_->ShouldDisallowResourceLoad(GURL(url), origin, + FirstPartyOrigin first_party(origin); + return !matcher_->ShouldDisallowResourceLoad(GURL(url), first_party, element_type); }
diff --git a/components/suggestions/BUILD.gn b/components/suggestions/BUILD.gn index 174726a..ed539db 100644 --- a/components/suggestions/BUILD.gn +++ b/components/suggestions/BUILD.gn
@@ -61,7 +61,8 @@ "//components/leveldb_proto:test_support", "//components/pref_registry:test_support", "//components/signin/core/browser:test_support", - "//components/sync:test_support_sync_driver", + "//components/sync", + "//components/sync:test_support_driver", "//net:test_support", "//testing/gmock", "//testing/gtest",
diff --git a/components/sync/BUILD.gn b/components/sync/BUILD.gn index fbcf494..0535e22 100644 --- a/components/sync/BUILD.gn +++ b/components/sync/BUILD.gn
@@ -600,8 +600,7 @@ configs += [ "//build/config/compiler:wexit_time_destructors" ] } -# TODO(maxbogue): Refactor the test support targets to remove core references. -static_library("test_support_sync_core") { +static_library("test_support_base") { testonly = true sources = [ "base/fake_encryptor.cc", @@ -612,13 +611,54 @@ "base/model_type_test_util.h", "base/test_unrecoverable_error_handler.cc", "base/test_unrecoverable_error_handler.h", + "js/js_test_util.cc", + "js/js_test_util.h", + "test/callback_counter.h", + "test/mock_invalidation.cc", + "test/mock_invalidation.h", + "test/mock_invalidation_tracker.cc", + "test/mock_invalidation_tracker.h", + "test/trackable_mock_invalidation.cc", + "test/trackable_mock_invalidation.h", + ] + + public_deps = [ + "//base", + "//testing/gmock", + "//testing/gtest", + ] + + deps = [ + ":sync", + ] + + defines = [ "SYNC_TEST" ] + configs += [ "//build/config/compiler:wexit_time_destructors" ] +} + +static_library("test_support_engine") { + testonly = true + sources = [ + "engine/fake_model_type_connector.cc", + "engine/fake_model_type_connector.h", + "engine/fake_model_type_processor.cc", + "engine/fake_model_type_processor.h", + "engine/fake_sync_manager.cc", + "engine/fake_sync_manager.h", + "engine/sync_manager_factory_for_profile_sync_test.cc", + "engine/sync_manager_factory_for_profile_sync_test.h", + "engine/test_engine_components_factory.cc", + "engine/test_engine_components_factory.h", "engine_impl/cycle/mock_debug_info_getter.cc", "engine_impl/cycle/mock_debug_info_getter.h", "engine_impl/cycle/test_util.cc", "engine_impl/cycle/test_util.h", - "js/js_test_util.cc", - "js/js_test_util.h", - "test/callback_counter.h", + "engine_impl/sync_manager_for_profile_sync_test.cc", + "engine_impl/sync_manager_for_profile_sync_test.h", + "engine_impl/test_entry_factory.cc", + "engine_impl/test_entry_factory.h", + "syncable/test_user_share.cc", + "syncable/test_user_share.h", "test/directory_backing_store_corruption_testing.cc", "test/directory_backing_store_corruption_testing.h", "test/engine/fake_model_worker.cc", @@ -644,10 +684,6 @@ "test/engine/test_syncable_utils.h", "test/fake_sync_encryption_handler.cc", "test/fake_sync_encryption_handler.h", - "test/mock_invalidation.cc", - "test/mock_invalidation.h", - "test/mock_invalidation_tracker.cc", - "test/mock_invalidation_tracker.h", "test/null_directory_change_delegate.cc", "test/null_directory_change_delegate.h", "test/null_transaction_observer.cc", @@ -656,61 +692,25 @@ "test/test_directory_backing_store.h", "test/test_transaction_observer.cc", "test/test_transaction_observer.h", - "test/trackable_mock_invalidation.cc", - "test/trackable_mock_invalidation.h", ] public_deps = [ - "//base", - "//components/sync", - "//testing/gmock", - "//testing/gtest", + ":test_support_base", + ] + + deps = [ + ":sync", ] defines = [ "SYNC_TEST" ] configs += [ "//build/config/compiler:wexit_time_destructors" ] } -# TODO(maxbogue): Refactor the test support targets to remove core references. -static_library("test_support_sync_core_impl") { +static_library("test_support_model") { testonly = true sources = [ - "engine/fake_model_type_connector.cc", - "engine/fake_model_type_connector.h", - "engine/fake_model_type_processor.cc", - "engine/fake_model_type_processor.h", - "engine/fake_sync_manager.cc", - "engine/fake_sync_manager.h", - "engine/sync_manager_factory_for_profile_sync_test.cc", - "engine/sync_manager_factory_for_profile_sync_test.h", - "engine/test_engine_components_factory.cc", - "engine/test_engine_components_factory.h", - "engine_impl/sync_manager_for_profile_sync_test.cc", - "engine_impl/sync_manager_for_profile_sync_test.h", - "engine_impl/test_entry_factory.cc", - "engine_impl/test_entry_factory.h", "model/data_type_error_handler_mock.cc", "model/data_type_error_handler_mock.h", - "model/model_type_store_test_util.cc", - "model/model_type_store_test_util.h", - "syncable/test_user_share.cc", - "syncable/test_user_share.h", - ] - - public_deps = [ - ":test_support_sync_core", - "//base", - "//components/sync", - "//testing/gtest", - ] - - defines = [ "SYNC_TEST" ] - configs += [ "//build/config/compiler:wexit_time_destructors" ] -} - -static_library("test_support_sync_model") { - testonly = true - sources = [ "model/fake_model_type_change_processor.cc", "model/fake_model_type_change_processor.h", "model/fake_model_type_service.cc", @@ -721,6 +721,8 @@ "model/fake_syncable_service.h", "model/mock_model_type_store.cc", "model/mock_model_type_store.h", + "model/model_type_store_test_util.cc", + "model/model_type_store_test_util.h", "model/stub_model_type_service.cc", "model/stub_model_type_service.h", "model/sync_change_processor_wrapper_for_test.cc", @@ -732,14 +734,15 @@ defines = [ "SYNC_TEST" ] public_deps = [ - "//base", - "//components/sync", - "//testing/gmock", - "//testing/gtest", + ":test_support_base", + ] + + deps = [ + ":sync", ] } -static_library("test_support_sync_driver") { +static_library("test_support_driver") { testonly = true sources = [ "device_info/local_device_info_provider_mock.cc", @@ -771,17 +774,15 @@ ] public_deps = [ - "//components/sync", + ":test_support_base", ] deps = [ - ":test_support_sync_core_impl", - "//base", + ":sync", + ":test_support_engine", "//components/syncable_prefs:test_support", "//components/version_info", "//google_apis", - "//testing/gmock", - "//testing/gtest", ] } @@ -909,10 +910,11 @@ ] deps = [ - ":test_support_sync_core", - ":test_support_sync_core_impl", - ":test_support_sync_driver", - ":test_support_sync_model", + ":sync", + ":test_support_base", + ":test_support_driver", + ":test_support_engine", + ":test_support_model", "//base", "//base/test:test_support", "//components/invalidation/impl", @@ -920,7 +922,6 @@ "//components/pref_registry:test_support", "//components/prefs:test_support", "//components/signin/core/browser:test_support", - "//components/sync", "//components/sync/engine_impl/attachments/proto", "//components/syncable_prefs", "//components/syncable_prefs:test_support", @@ -958,7 +959,7 @@ defines = [ "SYNC_TEST" ] } -static_library("test_support_sync_fake_server") { +static_library("test_support_fake_server") { testonly = true sources = [ "test/fake_server/bookmark_entity.cc", @@ -988,8 +989,8 @@ ] deps = [ + ":sync", "//base", - "//components/sync", "//net", "//testing/gtest", "//url", @@ -1002,7 +1003,7 @@ configs += [ "//build/config/compiler:wexit_time_destructors" ] } -static_library("test_support_sync_testserver") { +static_library("test_support_testserver") { testonly = true sources = [ "test/local_sync_test_server.cc", @@ -1031,7 +1032,7 @@ ] deps = [ - ":test_support_sync_testserver", + ":test_support_testserver", "//base", "//base/test:test_support", "//build/config/sanitizers:deps", @@ -1053,26 +1054,26 @@ ] } - _test_support_sync_prepared_protos_dir = - "$root_gen_dir/test_support_sync_proto_java_prepare/" - action("test_support_sync_proto_java_prepare") { + _test_support_prepared_protos_dir = + "$root_gen_dir/test_support_proto_java_prepare/" + action("test_support_proto_java_prepare") { script = "//components/sync/protocol/prepare_protos_for_java_tests.py" inputs = sync_protocol_sources outputs = process_file_template( sync_protocol_sources, - [ "$_test_support_sync_prepared_protos_dir/{{source_file_part}}" ]) + [ "$_test_support_prepared_protos_dir/{{source_file_part}}" ]) args = [ "--output_dir", - rebase_path(_test_support_sync_prepared_protos_dir, root_build_dir), + rebase_path(_test_support_prepared_protos_dir, root_build_dir), ] args += rebase_path(sync_protocol_sources, root_build_dir) } - proto_java_library("test_support_sync_proto_java") { - proto_path = _test_support_sync_prepared_protos_dir - sources = get_target_outputs(":test_support_sync_proto_java_prepare") + proto_java_library("test_support_proto_java") { + proto_path = _test_support_prepared_protos_dir + sources = get_target_outputs(":test_support_proto_java_prepare") deps = [ - ":test_support_sync_proto_java_prepare", + ":test_support_proto_java_prepare", ] } @@ -1085,7 +1086,7 @@ java_files = [ "test/android/javatests/src/org/chromium/components/sync/test/util/MockSyncContentResolverDelegate.java" ] } - static_library("test_support_sync_fake_server_android") { + static_library("test_support_fake_server_android") { testonly = true sources = [ "test/fake_server/android/fake_server_helper_android.cc", @@ -1094,7 +1095,7 @@ deps = [ ":fake_server_jni", ":sync", - ":test_support_sync_fake_server", + ":test_support_fake_server", "//base", "//testing/gtest", "//url:url",
diff --git a/components/sync/base/cancelation_signal.cc b/components/sync/base/cancelation_signal.cc index a0c9942..e68a244 100644 --- a/components/sync/base/cancelation_signal.cc +++ b/components/sync/base/cancelation_signal.cc
@@ -9,7 +9,7 @@ namespace syncer { -CancelationSignal::CancelationSignal() : signalled_(false), handler_(NULL) {} +CancelationSignal::CancelationSignal() : signalled_(false), handler_(nullptr) {} CancelationSignal::~CancelationSignal() { DCHECK(!handler_); @@ -29,7 +29,7 @@ void CancelationSignal::UnregisterHandler(CancelationObserver* handler) { base::AutoLock lock(signal_lock_); DCHECK_EQ(handler_, handler); - handler_ = NULL; + handler_ = nullptr; } bool CancelationSignal::IsSignalled() {
diff --git a/components/sync/base/cancelation_signal.h b/components/sync/base/cancelation_signal.h index 6740743..0bf72e7f 100644 --- a/components/sync/base/cancelation_signal.h +++ b/components/sync/base/cancelation_signal.h
@@ -62,7 +62,7 @@ // True if Signal() has been invoked. bool signalled_; - // The registered abort handler. May be NULL. + // The registered abort handler. May be null. CancelationObserver* handler_; };
diff --git a/components/sync/base/cryptographer.cc b/components/sync/base/cryptographer.cc index b6c130a..c585965 100644 --- a/components/sync/base/cryptographer.cc +++ b/components/sync/base/cryptographer.cc
@@ -11,6 +11,7 @@ #include "base/base64.h" #include "base/logging.h" +#include "base/memory/ptr_util.h" #include "components/sync/base/encryptor.h" #include "components/sync/protocol/nigori_specifics.pb.h" @@ -41,7 +42,8 @@ } if (other.pending_keys_) { - pending_keys_.reset(new sync_pb::EncryptedData(*(other.pending_keys_))); + pending_keys_ = + base::MakeUnique<sync_pb::EncryptedData>(*(other.pending_keys_)); } } @@ -230,7 +232,7 @@ void Cryptographer::SetPendingKeys(const sync_pb::EncryptedData& encrypted) { DCHECK(!CanDecrypt(encrypted)); DCHECK(!encrypted.blob().empty()); - pending_keys_.reset(new sync_pb::EncryptedData(encrypted)); + pending_keys_ = base::MakeUnique<sync_pb::EncryptedData>(encrypted); } const sync_pb::EncryptedData& Cryptographer::GetPendingKeys() const {
diff --git a/components/sync/base/cryptographer.h b/components/sync/base/cryptographer.h index 1ef81d3..2ac9d55 100644 --- a/components/sync/base/cryptographer.h +++ b/components/sync/base/cryptographer.h
@@ -161,7 +161,7 @@ bool is_ready() const { return is_initialized() && !has_pending_keys(); } // Returns whether there is a pending set of keys that needs to be decrypted. - bool has_pending_keys() const { return NULL != pending_keys_.get(); } + bool has_pending_keys() const { return nullptr != pending_keys_.get(); } // Obtain a token that can be provided on construction to a future // Cryptographer instance to bootstrap itself. Returns false if such a token
diff --git a/components/sync/base/enum_set.h b/components/sync/base/enum_set.h index 0a28827..2b5c8d9 100644 --- a/components/sync/base/enum_set.h +++ b/components/sync/base/enum_set.h
@@ -77,7 +77,7 @@ // A default-constructed iterator can't do anything except check // Good(). You need to call First() on an EnumSet to get a usable // iterator. - Iterator() : enums_(NULL), i_(kValueCount) {} + Iterator() : enums_(nullptr), i_(kValueCount) {} ~Iterator() {} // Copy constructor and assignment welcome.
diff --git a/components/sync/base/immutable.h b/components/sync/base/immutable.h index 7b2ed105..9d435ad 100644 --- a/components/sync/base/immutable.h +++ b/components/sync/base/immutable.h
@@ -2,6 +2,14 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#ifndef COMPONENTS_SYNC_BASE_IMMUTABLE_H_ +#define COMPONENTS_SYNC_BASE_IMMUTABLE_H_ + +#include <utility> + +#include "base/macros.h" +#include "base/memory/ref_counted.h" + // Immutable<T> provides an easy, cheap, and thread-safe way to pass // large immutable data around. // @@ -61,14 +69,6 @@ // with forward-declared types. See comments on traits below for // details. -#ifndef COMPONENTS_SYNC_BASE_IMMUTABLE_H_ -#define COMPONENTS_SYNC_BASE_IMMUTABLE_H_ - -#include <utility> - -#include "base/macros.h" -#include "base/memory/ref_counted.h" - namespace syncer { namespace internal {
diff --git a/components/sync/base/model_type.h b/components/sync/base/model_type.h index e3edb4928..5cca1a08 100644 --- a/components/sync/base/model_type.h +++ b/components/sync/base/model_type.h
@@ -2,10 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// Enumerate the various item subtypes that are supported by sync. -// Each sync object is expected to have an immutable object type. -// An object's type is inferred from the type of data it holds. - #ifndef COMPONENTS_SYNC_BASE_MODEL_TYPE_H_ #define COMPONENTS_SYNC_BASE_MODEL_TYPE_H_ @@ -31,12 +27,13 @@ namespace syncer { -// TODO(akalin): Move the non-exported functions in this file to a -// private header. - +// Enumerate the various item subtypes that are supported by sync. +// Each sync object is expected to have an immutable object type. +// An object's type is inferred from the type of data it holds. +// // A Java counterpart will be generated for this enum. // GENERATED_JAVA_ENUM_PACKAGE: org.chromium.components.sync - +// // |kModelTypeInfoMap| struct entries are in the same order as their definition // in ModelType enum. Don't forget to update the |kModelTypeInfoMap| struct in // model_type.cc when you make changes in ModelType enum.
diff --git a/components/sync/base/pref_names.h b/components/sync/base/pref_names.h index ae776ff..183c9c6 100644 --- a/components/sync/base/pref_names.h +++ b/components/sync/base/pref_names.h
@@ -2,8 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// Constants for the names of various sync preferences, for easier changing. - #ifndef COMPONENTS_SYNC_BASE_PREF_NAMES_H_ #define COMPONENTS_SYNC_BASE_PREF_NAMES_H_
diff --git a/components/sync/base/progress_marker_map.h b/components/sync/base/progress_marker_map.h index 4b4a732f..68b93dd 100644 --- a/components/sync/base/progress_marker_map.h +++ b/components/sync/base/progress_marker_map.h
@@ -1,8 +1,6 @@ // Copyright 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. -// -// Definition of ProgressMarkerMap and various utility functions. #ifndef COMPONENTS_SYNC_BASE_PROGRESS_MARKER_MAP_H_ #define COMPONENTS_SYNC_BASE_PROGRESS_MARKER_MAP_H_ @@ -13,9 +11,6 @@ #include "components/sync/base/model_type.h" -// TODO(akalin,mmontgomery): Move the non-exported functions in this file to a -// private header. - namespace base { class DictionaryValue; }
diff --git a/components/sync/base/proto_value_ptr.h b/components/sync/base/proto_value_ptr.h index dbf046d..35c86b3 100644 --- a/components/sync/base/proto_value_ptr.h +++ b/components/sync/base/proto_value_ptr.h
@@ -9,11 +9,9 @@ #include "base/memory/ref_counted.h" namespace syncer { -struct EntityData; -class ProcessorEntityTracker; -} // namespace syncer -namespace syncer { +class ProcessorEntityTracker; +struct EntityData; namespace syncable { struct EntryKernel;
diff --git a/components/sync/base/proto_value_ptr_unittest.cc b/components/sync/base/proto_value_ptr_unittest.cc index 7531ce1..5775591 100644 --- a/components/sync/base/proto_value_ptr_unittest.cc +++ b/components/sync/base/proto_value_ptr_unittest.cc
@@ -8,6 +8,7 @@ #include <utility> #include "base/macros.h" +#include "base/memory/ptr_util.h" #include "testing/gtest/include/gtest/gtest.h" namespace syncer { @@ -59,7 +60,7 @@ ASSERT_FALSE(is_default()); ASSERT_TRUE(from.is_initialized()); ASSERT_FALSE(from.is_default()); - value_.reset(new IntValue(from.value())); + value_ = base::MakeUnique<IntValue>(from.value()); g_copy_count++; } @@ -82,7 +83,7 @@ ASSERT_FALSE(is_default()); // The blob is an address of an integer ASSERT_EQ(static_cast<int>(sizeof(int)), length); - value_.reset(new IntValue(*static_cast<const int*>(blob))); + value_ = base::MakeUnique<IntValue>(*static_cast<const int*>(blob)); g_parse_count++; }
diff --git a/components/sync/base/sync_prefs.cc b/components/sync/base/sync_prefs.cc index 6f5d5c0..63eab91 100644 --- a/components/sync/base/sync_prefs.cc +++ b/components/sync/base/sync_prefs.cc
@@ -26,7 +26,7 @@ base::Bind(&SyncPrefs::OnSyncManagedPrefChanged, base::Unretained(this))); } -SyncPrefs::SyncPrefs() : pref_service_(NULL) {} +SyncPrefs::SyncPrefs() : pref_service_(nullptr) {} SyncPrefs::~SyncPrefs() { DCHECK(CalledOnValidThread()); @@ -324,7 +324,7 @@ break; } NOTREACHED() << "Type is " << data_type; - return NULL; + return nullptr; } #if defined(OS_CHROMEOS) @@ -341,8 +341,8 @@ void SyncPrefs::OnSyncManagedPrefChanged() { DCHECK(CalledOnValidThread()); - FOR_EACH_OBSERVER(SyncPrefObserver, sync_pref_observers_, - OnSyncManagedPrefChange(*pref_sync_managed_)); + for (auto& observer : sync_pref_observers_) + observer.OnSyncManagedPrefChange(*pref_sync_managed_); } void SyncPrefs::SetManagedForTest(bool is_managed) { @@ -406,7 +406,7 @@ return true; if (type == PROXY_TABS && - pref_service_->GetUserPrefValue(pref_name) == NULL && + pref_service_->GetUserPrefValue(pref_name) == nullptr && pref_service_->IsUserModifiablePreference(pref_name)) { // If there is no tab sync preference yet (i.e. newly enabled type), // default to the session sync preference value.
diff --git a/components/sync/base/sync_prefs.h b/components/sync/base/sync_prefs.h index a6572c2..0343c7af 100644 --- a/components/sync/base/sync_prefs.h +++ b/components/sync/base/sync_prefs.h
@@ -57,7 +57,7 @@ class SyncPrefs : NON_EXPORTED_BASE(public base::NonThreadSafe), public base::SupportsWeakPtr<SyncPrefs> { public: - // |pref_service| may not be NULL. + // |pref_service| may not be null. // Does not take ownership of |pref_service|. explicit SyncPrefs(PrefService* pref_service); @@ -198,7 +198,7 @@ void OnSyncManagedPrefChanged(); - // May be NULL. + // May be null. PrefService* const pref_service_; base::ObserverList<SyncPrefObserver> sync_pref_observers_;
diff --git a/components/sync/base/time.h b/components/sync/base/time.h index 6e182ab..4c631a15 100644 --- a/components/sync/base/time.h +++ b/components/sync/base/time.h
@@ -1,8 +1,6 @@ // Copyright 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. -// -// Time-related sync functions. #ifndef COMPONENTS_SYNC_BASE_TIME_H_ #define COMPONENTS_SYNC_BASE_TIME_H_
diff --git a/components/sync/base/weak_handle.h b/components/sync/base/weak_handle.h index 54fa9d74..5db9810 100644 --- a/components/sync/base/weak_handle.h +++ b/components/sync/base/weak_handle.h
@@ -2,6 +2,22 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#ifndef COMPONENTS_SYNC_BASE_WEAK_HANDLE_H_ +#define COMPONENTS_SYNC_BASE_WEAK_HANDLE_H_ + +#include <cstddef> +#include <utility> + +#include "base/bind.h" +#include "base/compiler_specific.h" +#include "base/gtest_prod_util.h" +#include "base/location.h" +#include "base/logging.h" +#include "base/macros.h" +#include "base/memory/ref_counted.h" +#include "base/memory/weak_ptr.h" +#include "base/single_thread_task_runner.h" + // Weak handles provides a way to refer to weak pointers from another // thread. This is useful because it is not safe to reference a weak // pointer from a thread other than the thread on which it was @@ -44,22 +60,6 @@ // void OnIOError(IOError err) { DCHECK(CalledOnValidThread(); ... } // }; -#ifndef COMPONENTS_SYNC_BASE_WEAK_HANDLE_H_ -#define COMPONENTS_SYNC_BASE_WEAK_HANDLE_H_ - -#include <cstddef> -#include <utility> - -#include "base/bind.h" -#include "base/compiler_specific.h" -#include "base/gtest_prod_util.h" -#include "base/location.h" -#include "base/logging.h" -#include "base/macros.h" -#include "base/memory/ref_counted.h" -#include "base/memory/weak_ptr.h" -#include "base/single_thread_task_runner.h" - namespace tracked_objects { class Location; } // namespace tracked_objects @@ -158,15 +158,15 @@ WeakHandle(const WeakHandle<U>& other) // NOLINT : core_(other.IsInitialized() ? new internal::WeakHandleCore<T>(other.Get()) - : NULL) {} + : nullptr) {} // Returns true iff this WeakHandle is initialized. Note that being // initialized isn't a guarantee that the underlying object is still // alive. - bool IsInitialized() const { return core_.get() != NULL; } + bool IsInitialized() const { return core_.get() != nullptr; } // Resets to an uninitialized WeakHandle. - void Reset() { core_ = NULL; } + void Reset() { core_ = nullptr; } // Must be called only on the underlying object's owner thread. base::WeakPtr<T> Get() const {
diff --git a/components/sync/device_info/device_info_data_type_controller_unittest.cc b/components/sync/device_info/device_info_data_type_controller_unittest.cc index 5ffd541..27c572f 100644 --- a/components/sync/device_info/device_info_data_type_controller_unittest.cc +++ b/components/sync/device_info/device_info_data_type_controller_unittest.cc
@@ -6,6 +6,7 @@ #include "base/bind.h" #include "base/callback.h" +#include "base/memory/ptr_util.h" #include "base/memory/weak_ptr.h" #include "base/run_loop.h" #include "base/threading/thread_task_runner_handle.h" @@ -28,12 +29,12 @@ ~DeviceInfoDataTypeControllerTest() override {} void SetUp() override { - local_device_.reset(new LocalDeviceInfoProviderMock( + local_device_ = base::MakeUnique<LocalDeviceInfoProviderMock>( "cache_guid", "Wayne Gretzky's Hacking Box", "Chromium 10k", - "Chrome 10k", sync_pb::SyncEnums_DeviceType_TYPE_LINUX, "device_id")); + "Chrome 10k", sync_pb::SyncEnums_DeviceType_TYPE_LINUX, "device_id"); - controller_.reset(new DeviceInfoDataTypeController( - base::Closure(), &sync_client_, local_device_.get())); + controller_ = base::MakeUnique<DeviceInfoDataTypeController>( + base::Closure(), &sync_client_, local_device_.get()); load_finished_ = false; last_type_ = UNSPECIFIED; @@ -41,7 +42,7 @@ } void TearDown() override { - controller_ = NULL; + controller_ = nullptr; local_device_.reset(); } @@ -117,7 +118,7 @@ // Destroy |local_device_| and |controller_| out of order // to verify that the controller doesn't crash in the destructor. local_device_.reset(); - controller_ = NULL; + controller_ = nullptr; } } // namespace
diff --git a/components/sync/device_info/device_info_service.cc b/components/sync/device_info/device_info_service.cc index 7f0853e..b13f1d4 100644 --- a/components/sync/device_info/device_info_service.cc +++ b/components/sync/device_info/device_info_service.cc
@@ -216,7 +216,8 @@ } void DeviceInfoService::NotifyObservers() { - FOR_EACH_OBSERVER(Observer, observers_, OnDeviceInfoChange()); + for (auto& observer : observers_) + observer.OnDeviceInfoChange(); } // Static.
diff --git a/components/sync/device_info/device_info_service.h b/components/sync/device_info/device_info_service.h index 14eb24d2..700ed1f 100644 --- a/components/sync/device_info/device_info_service.h +++ b/components/sync/device_info/device_info_service.h
@@ -23,20 +23,15 @@ #include "components/sync/model/model_type_store.h" #include "components/sync/model/simple_metadata_change_list.h" -namespace syncer { -class SyncError; -} // namespace syncer - -namespace syncer { -class ModelTypeChangeProcessor; -} // namespace syncer - namespace sync_pb { class DeviceInfoSpecifics; } // namespace sync_pb namespace syncer { +class ModelTypeChangeProcessor; +class SyncError; + // USS service implementation for DEVICE_INFO model type. Handles storage of // device info and associated sync metadata, applying/merging foreign changes, // and allows public read access.
diff --git a/components/sync/device_info/device_info_service_unittest.cc b/components/sync/device_info/device_info_service_unittest.cc index 3afcb5b4..83a9c8d 100644 --- a/components/sync/device_info/device_info_service_unittest.cc +++ b/components/sync/device_info/device_info_service_unittest.cc
@@ -188,12 +188,12 @@ // only be called once per run, as it passes |store_|. void InitializeService() { ASSERT_TRUE(store_); - service_.reset(new DeviceInfoService( + service_ = base::MakeUnique<DeviceInfoService>( local_device_.get(), base::Bind(&ModelTypeStoreTestUtil::MoveStoreToCallback, base::Passed(&store_)), base::Bind(&DeviceInfoServiceTest::CreateModelTypeChangeProcessor, - base::Unretained(this)))); + base::Unretained(this))); service_->AddObserver(this); }
diff --git a/components/sync/device_info/device_info_sync_service.cc b/components/sync/device_info/device_info_sync_service.cc index c9fe8c4c..3bad31fd 100644 --- a/components/sync/device_info/device_info_sync_service.cc +++ b/components/sync/device_info/device_info_sync_service.cc
@@ -46,7 +46,7 @@ // and local device info must be available. const DeviceInfo* local_device_info = local_device_info_provider_->GetLocalDeviceInfo(); - DCHECK(local_device_info != NULL); + DCHECK(local_device_info != nullptr); // Indicates whether a local device has been added or updated. // |change_type| defaults to ADD and might be changed to @@ -224,7 +224,8 @@ } void DeviceInfoSyncService::NotifyObservers() { - FOR_EACH_OBSERVER(Observer, observers_, OnDeviceInfoChange()); + for (auto& observer : observers_) + observer.OnDeviceInfoChange(); } SyncData DeviceInfoSyncService::CreateLocalData(const DeviceInfo* info) {
diff --git a/components/sync/device_info/device_info_sync_service_unittest.cc b/components/sync/device_info/device_info_sync_service_unittest.cc index 6194e38e..72792ab 100644 --- a/components/sync/device_info/device_info_sync_service_unittest.cc +++ b/components/sync/device_info/device_info_sync_service_unittest.cc
@@ -6,6 +6,7 @@ #include <stddef.h> +#include "base/memory/ptr_util.h" #include "base/message_loop/message_loop.h" #include "components/sync/base/time.h" #include "components/sync/device_info/device_info_util.h" @@ -74,12 +75,12 @@ ~DeviceInfoSyncServiceTest() override {} void SetUp() override { - local_device_.reset(new LocalDeviceInfoProviderMock( + local_device_ = base::MakeUnique<LocalDeviceInfoProviderMock>( "guid_1", "client_1", "Chromium 10k", "Chrome 10k", - sync_pb::SyncEnums_DeviceType_TYPE_LINUX, "device_id")); - sync_service_.reset(new DeviceInfoSyncService(local_device_.get())); - sync_processor_.reset(new TestChangeProcessor()); - // Register observer + sync_pb::SyncEnums_DeviceType_TYPE_LINUX, "device_id"); + sync_service_ = + base::MakeUnique<DeviceInfoSyncService>(local_device_.get()); + sync_processor_ = base::MakeUnique<TestChangeProcessor>(); sync_service_->AddObserver(this); }
diff --git a/components/sync/device_info/local_device_info_provider_impl.cc b/components/sync/device_info/local_device_info_provider_impl.cc index 836bcba..9da066f 100644 --- a/components/sync/device_info/local_device_info_provider_impl.cc +++ b/components/sync/device_info/local_device_info_provider_impl.cc
@@ -5,6 +5,7 @@ #include "components/sync/device_info/local_device_info_provider_impl.h" #include "base/bind.h" +#include "base/memory/ptr_util.h" #include "base/task_runner.h" #include "build/build_config.h" #include "components/sync/base/get_session_name.h" @@ -94,9 +95,9 @@ return; } - local_device_info_.reset( - new DeviceInfo(guid, session_name, version_, GetSyncUserAgent(), - GetLocalDeviceType(is_tablet_), signin_scoped_device_id)); + local_device_info_ = base::MakeUnique<DeviceInfo>( + guid, session_name, version_, GetSyncUserAgent(), + GetLocalDeviceType(is_tablet_), signin_scoped_device_id); // Notify observers. callback_list_.Notify();
diff --git a/components/sync/device_info/local_device_info_provider_impl_unittest.cc b/components/sync/device_info/local_device_info_provider_impl_unittest.cc index 39a86425..e3fbf77 100644 --- a/components/sync/device_info/local_device_info_provider_impl_unittest.cc +++ b/components/sync/device_info/local_device_info_provider_impl_unittest.cc
@@ -5,6 +5,7 @@ #include "components/sync/device_info/local_device_info_provider_impl.h" #include "base/bind.h" +#include "base/memory/ptr_util.h" #include "base/message_loop/message_loop.h" #include "base/run_loop.h" #include "components/sync/base/get_session_name.h" @@ -21,9 +22,9 @@ ~LocalDeviceInfoProviderImplTest() override {} void SetUp() override { - provider_.reset(new LocalDeviceInfoProviderImpl( + provider_ = base::MakeUnique<LocalDeviceInfoProviderImpl>( version_info::Channel::UNKNOWN, - version_info::GetVersionStringWithModifier("UNKNOWN"), false)); + version_info::GetVersionStringWithModifier("UNKNOWN"), false); } void TearDown() override {
diff --git a/components/sync/device_info/local_device_info_provider_mock.cc b/components/sync/device_info/local_device_info_provider_mock.cc index 544c6e5..b147335 100644 --- a/components/sync/device_info/local_device_info_provider_mock.cc +++ b/components/sync/device_info/local_device_info_provider_mock.cc
@@ -4,6 +4,8 @@ #include "components/sync/device_info/local_device_info_provider_mock.h" +#include "base/memory/ptr_util.h" + namespace syncer { LocalDeviceInfoProviderMock::LocalDeviceInfoProviderMock() @@ -17,9 +19,9 @@ const sync_pb::SyncEnums::DeviceType device_type, const std::string& signin_scoped_device_id) : is_initialized_(true) { - local_device_info_.reset(new DeviceInfo(guid, client_name, chrome_version, - sync_user_agent, device_type, - signin_scoped_device_id)); + local_device_info_ = base::MakeUnique<DeviceInfo>( + guid, client_name, chrome_version, sync_user_agent, device_type, + signin_scoped_device_id); } LocalDeviceInfoProviderMock::~LocalDeviceInfoProviderMock() {} @@ -40,9 +42,9 @@ const std::string& cache_guid, const std::string& signin_scoped_device_id, const scoped_refptr<base::TaskRunner>& blocking_task_runner) { - local_device_info_.reset(new DeviceInfo( + local_device_info_ = base::MakeUnique<DeviceInfo>( cache_guid, "client_name", "chrome_version", GetSyncUserAgent(), - sync_pb::SyncEnums_DeviceType_TYPE_LINUX, signin_scoped_device_id)); + sync_pb::SyncEnums_DeviceType_TYPE_LINUX, signin_scoped_device_id); SetInitialized(true); }
diff --git a/components/sync/driver/about_sync_util.h b/components/sync/driver/about_sync_util.h index f81a927..df016d8 100644 --- a/components/sync/driver/about_sync_util.h +++ b/components/sync/driver/about_sync_util.h
@@ -65,7 +65,7 @@ // This function returns a DictionaryValue which contains all the information // required to populate the 'About' tab of about:sync. -// Note that |service| may be NULL. +// Note that |service| may be null. std::unique_ptr<base::DictionaryValue> ConstructAboutInformation( SyncService* service, SigninManagerBase* signin,
diff --git a/components/sync/driver/about_sync_util_unittest.cc b/components/sync/driver/about_sync_util_unittest.cc index e55fee5..7a6effb 100644 --- a/components/sync/driver/about_sync_util_unittest.cc +++ b/components/sync/driver/about_sync_util_unittest.cc
@@ -39,7 +39,7 @@ SyncServiceMock service; std::unique_ptr<base::DictionaryValue> strings(ConstructAboutInformation( - &service, NULL, version_info::Channel::UNKNOWN)); + &service, nullptr, version_info::Channel::UNKNOWN)); EXPECT_TRUE(strings->HasKey("unrecoverable_error_detected")); }
diff --git a/components/sync/driver/backend_migrator.cc b/components/sync/driver/backend_migrator.cc index 4a2d019..7edbbaf 100644 --- a/components/sync/driver/backend_migrator.cc +++ b/components/sync/driver/backend_migrator.cc
@@ -81,8 +81,8 @@ void BackendMigrator::ChangeState(State new_state) { state_ = new_state; - FOR_EACH_OBSERVER(MigrationObserver, migration_observers_, - OnMigrationStateChange()); + for (auto& observer : migration_observers_) + observer.OnMigrationStateChange(); } bool BackendMigrator::TryStart() {
diff --git a/components/sync/driver/backend_migrator_unittest.cc b/components/sync/driver/backend_migrator_unittest.cc index 9ac09ae1..f78d0dc 100644 --- a/components/sync/driver/backend_migrator_unittest.cc +++ b/components/sync/driver/backend_migrator_unittest.cc
@@ -6,6 +6,7 @@ #include <memory> +#include "base/memory/ptr_util.h" #include "base/message_loop/message_loop.h" #include "base/run_loop.h" #include "base/tracked_objects.h" @@ -39,9 +40,9 @@ preferred_types_.Put(PREFERENCES); preferred_types_.Put(AUTOFILL); - migrator_.reset(new BackendMigrator("Profile0", - test_user_share_.user_share(), - service(), manager(), base::Closure())); + migrator_ = base::MakeUnique<BackendMigrator>( + "Profile0", test_user_share_.user_share(), service(), manager(), + base::Closure()); SetUnsyncedTypes(ModelTypeSet()); }
diff --git a/components/sync/driver/change_processor.cc b/components/sync/driver/change_processor.cc index 12849474..9d81f145 100644 --- a/components/sync/driver/change_processor.cc +++ b/components/sync/driver/change_processor.cc
@@ -10,7 +10,7 @@ ChangeProcessor::ChangeProcessor( std::unique_ptr<DataTypeErrorHandler> error_handler) - : error_handler_(std::move(error_handler)), share_handle_(NULL) {} + : error_handler_(std::move(error_handler)), share_handle_(nullptr) {} ChangeProcessor::~ChangeProcessor() {}
diff --git a/components/sync/driver/data_type_manager_impl_unittest.cc b/components/sync/driver/data_type_manager_impl_unittest.cc index b76ff19e..b2e0c12 100644 --- a/components/sync/driver/data_type_manager_impl_unittest.cc +++ b/components/sync/driver/data_type_manager_impl_unittest.cc
@@ -262,9 +262,9 @@ protected: void SetUp() override { - dtm_.reset(new TestDataTypeManager(WeakHandle<DataTypeDebugInfoListener>(), - &configurer_, &controllers_, - &encryption_handler_, &observer_)); + dtm_ = base::MakeUnique<TestDataTypeManager>( + WeakHandle<DataTypeDebugInfoListener>(), &configurer_, &controllers_, + &encryption_handler_, &observer_); } void SetConfigureStartExpectation() { observer_.ExpectStart(); } @@ -319,7 +319,7 @@ DataTypeController::TypeMap::const_iterator it = controllers_.find(model_type); if (it == controllers_.end()) { - return NULL; + return nullptr; } return static_cast<FakeDataTypeController*>(it->second.get()); }
diff --git a/components/sync/driver/directory_data_type_controller.h b/components/sync/driver/directory_data_type_controller.h index bbe165f..fb5a560 100644 --- a/components/sync/driver/directory_data_type_controller.h +++ b/components/sync/driver/directory_data_type_controller.h
@@ -63,7 +63,7 @@ virtual ModelSafeGroup model_safe_group() const = 0; // Access to the ChangeProcessor for the type being controlled by |this|. - // Returns NULL if the ChangeProcessor isn't created or connected. + // Returns null if the ChangeProcessor isn't created or connected. virtual ChangeProcessor* GetChangeProcessor() const = 0; SyncClient* const sync_client_;
diff --git a/components/sync/driver/fake_data_type_controller.cc b/components/sync/driver/fake_data_type_controller.cc index d057481..7286833 100644 --- a/components/sync/driver/fake_data_type_controller.cc +++ b/components/sync/driver/fake_data_type_controller.cc
@@ -117,7 +117,7 @@ } ChangeProcessor* FakeDataTypeController::GetChangeProcessor() const { - return NULL; + return nullptr; } DataTypeController::State FakeDataTypeController::state() const {
diff --git a/components/sync/driver/fake_generic_change_processor.cc b/components/sync/driver/fake_generic_change_processor.cc index 496fc517..358b141 100644 --- a/components/sync/driver/fake_generic_change_processor.cc +++ b/components/sync/driver/fake_generic_change_processor.cc
@@ -15,10 +15,10 @@ FakeGenericChangeProcessor::FakeGenericChangeProcessor(ModelType type, SyncClient* sync_client) : GenericChangeProcessor(type, - NULL, + nullptr, base::WeakPtr<SyncableService>(), base::WeakPtr<SyncMergeResult>(), - NULL, + nullptr, sync_client, nullptr), sync_model_has_user_created_nodes_(true),
diff --git a/components/sync/driver/frontend_data_type_controller.cc b/components/sync/driver/frontend_data_type_controller.cc index 8b24a6f5..56da910 100644 --- a/components/sync/driver/frontend_data_type_controller.cc +++ b/components/sync/driver/frontend_data_type_controller.cc
@@ -100,7 +100,7 @@ error = model_associator()->DisassociateModels(); } - set_model_associator(NULL); + set_model_associator(nullptr); change_processor_.reset(); state_ = NOT_RUNNING; @@ -185,7 +185,7 @@ void FrontendDataTypeController::CleanUp() { CleanUpState(); - set_model_associator(NULL); + set_model_associator(nullptr); change_processor_.reset(); }
diff --git a/components/sync/driver/frontend_data_type_controller_unittest.cc b/components/sync/driver/frontend_data_type_controller_unittest.cc index 53f238fc..5edde72 100644 --- a/components/sync/driver/frontend_data_type_controller_unittest.cc +++ b/components/sync/driver/frontend_data_type_controller_unittest.cc
@@ -8,6 +8,7 @@ #include "base/bind_helpers.h" #include "base/callback.h" #include "base/location.h" +#include "base/memory/ptr_util.h" #include "base/message_loop/message_loop.h" #include "base/run_loop.h" #include "base/single_thread_task_runner.h" @@ -73,9 +74,9 @@ sync_client_(&components_factory_) {} void SetUp() override { - dtc_mock_.reset(new StrictMock<FrontendDataTypeControllerMock>()); - frontend_dtc_.reset( - new FrontendDataTypeControllerFake(&sync_client_, dtc_mock_.get())); + dtc_mock_ = base::MakeUnique<StrictMock<FrontendDataTypeControllerMock>>(); + frontend_dtc_ = base::MakeUnique<FrontendDataTypeControllerFake>( + &sync_client_, dtc_mock_.get()); } protected:
diff --git a/components/sync/driver/generic_change_processor.cc b/components/sync/driver/generic_change_processor.cc index bb2d4bd..47f6217 100644 --- a/components/sync/driver/generic_change_processor.cc +++ b/components/sync/driver/generic_change_processor.cc
@@ -10,6 +10,7 @@ #include <utility> #include "base/location.h" +#include "base/memory/ptr_util.h" #include "base/strings/string_number_conversions.h" #include "base/strings/utf_string_conversions.h" #include "base/threading/thread_task_runner_handle.h" @@ -130,8 +131,9 @@ sync_client->GetSyncApiComponentFactory()->CreateAttachmentService( std::move(attachment_store), *user_share, store_birthday, type, this); - attachment_service_weak_ptr_factory_.reset( - new base::WeakPtrFactory<AttachmentService>(attachment_service_.get())); + attachment_service_weak_ptr_factory_ = + base::MakeUnique<base::WeakPtrFactory<AttachmentService>>( + attachment_service_.get()); attachment_service_proxy_ = AttachmentServiceProxy( base::ThreadTaskRunnerHandle::Get(), attachment_service_weak_ptr_factory_->GetWeakPtr()); @@ -159,7 +161,7 @@ std::unique_ptr<sync_pb::EntitySpecifics> specifics; if (it->specifics.has_password()) { DCHECK(it->extra.get()); - specifics.reset(new sync_pb::EntitySpecifics(it->specifics)); + specifics = base::MakeUnique<sync_pb::EntitySpecifics>(it->specifics); specifics->mutable_password() ->mutable_client_only_encrypted_data() ->CopyFrom(it->extra->unencrypted()); @@ -693,8 +695,8 @@ void GenericChangeProcessor::NotifyLocalChangeObservers( const syncable::Entry* current_entry, const SyncChange& change) { - FOR_EACH_OBSERVER(LocalChangeObserver, local_change_observers_, - OnLocalChange(current_entry, change)); + for (auto& observer : local_change_observers_) + observer.OnLocalChange(current_entry, change); } std::unique_ptr<AttachmentService>
diff --git a/components/sync/driver/generic_change_processor.h b/components/sync/driver/generic_change_processor.h index 33007af6..0819a87a 100644 --- a/components/sync/driver/generic_change_processor.h +++ b/components/sync/driver/generic_change_processor.h
@@ -52,7 +52,7 @@ public base::NonThreadSafe { public: // Create a change processor for |type| and connect it to the syncer. - // |attachment_store| can be NULL which means that datatype will not use sync + // |attachment_store| can be null which means that datatype will not use sync // attachments. GenericChangeProcessor( ModelType type, @@ -172,7 +172,7 @@ // and have to keep a local pointer to the user_share. UserShare* const share_handle_; - // AttachmentService for datatype. Can be NULL if datatype doesn't use + // AttachmentService for datatype. Can be null if datatype doesn't use // attachments. std::unique_ptr<AttachmentService> attachment_service_; @@ -181,7 +181,7 @@ // Must be destroyed before attachment_service_ to ensure WeakPtrs are // invalidated before attachment_service_ is destroyed. - // Can be NULL if attachment_service_ is NULL; + // Can be null if attachment_service_ is null; std::unique_ptr<base::WeakPtrFactory<AttachmentService>> attachment_service_weak_ptr_factory_; AttachmentServiceProxy attachment_service_proxy_;
diff --git a/components/sync/driver/generic_change_processor_unittest.cc b/components/sync/driver/generic_change_processor_unittest.cc index 9cc9c20..96ddee1 100644 --- a/components/sync/driver/generic_change_processor_unittest.cc +++ b/components/sync/driver/generic_change_processor_unittest.cc
@@ -8,6 +8,7 @@ #include <utility> +#include "base/memory/ptr_util.h" #include "base/message_loop/message_loop.h" #include "base/run_loop.h" #include "base/strings/stringprintf.h" @@ -124,7 +125,7 @@ SyncGenericChangeProcessorTest() : syncable_service_ptr_factory_(&fake_syncable_service_), - mock_attachment_service_(NULL), + mock_attachment_service_(nullptr), sync_client_(&sync_factory_) {} void SetUp() override { @@ -135,7 +136,7 @@ } void TearDown() override { - mock_attachment_service_ = NULL; + mock_attachment_service_ = nullptr; if (test_user_share_) { test_user_share_->TearDown(); } @@ -145,11 +146,12 @@ // model type |type|. void InitializeForType(ModelType type) { TearDown(); - test_user_share_.reset(new TestUserShare); + test_user_share_ = base::MakeUnique<TestUserShare>(); test_user_share_->SetUp(); - sync_merge_result_.reset(new SyncMergeResult(type)); - merge_result_ptr_factory_.reset( - new base::WeakPtrFactory<SyncMergeResult>(sync_merge_result_.get())); + sync_merge_result_ = base::MakeUnique<SyncMergeResult>(type); + merge_result_ptr_factory_ = + base::MakeUnique<base::WeakPtrFactory<SyncMergeResult>>( + sync_merge_result_.get()); ModelTypeSet types = ProtocolTypes(); for (ModelTypeSet::Iterator iter = types.First(); iter.Good(); iter.Inc()) { @@ -162,11 +164,11 @@ void ConstructGenericChangeProcessor(ModelType type) { std::unique_ptr<AttachmentStore> attachment_store = AttachmentStore::CreateInMemoryStore(); - change_processor_.reset(new GenericChangeProcessor( + change_processor_ = base::MakeUnique<GenericChangeProcessor>( type, base::MakeUnique<DataTypeErrorHandlerMock>(), syncable_service_ptr_factory_.GetWeakPtr(), merge_result_ptr_factory_->GetWeakPtr(), test_user_share_->user_share(), - &sync_client_, attachment_store->CreateAttachmentStoreForSync())); + &sync_client_, attachment_store->CreateAttachmentStoreForSync()); mock_attachment_service_ = sync_factory_.GetMockAttachmentService(); }
diff --git a/components/sync/driver/glue/browser_thread_model_worker_unittest.cc b/components/sync/driver/glue/browser_thread_model_worker_unittest.cc index 7d4f02e1..6ed62bb6 100644 --- a/components/sync/driver/glue/browser_thread_model_worker_unittest.cc +++ b/components/sync/driver/glue/browser_thread_model_worker_unittest.cc
@@ -68,12 +68,12 @@ protected: void SetUp() override { db_thread_.Start(); - worker_ = - new BrowserThreadModelWorker(db_thread_.task_runner(), GROUP_DB, NULL); + worker_ = new BrowserThreadModelWorker(db_thread_.task_runner(), GROUP_DB, + nullptr); } virtual void Teardown() { - worker_ = NULL; + worker_ = nullptr; db_thread_.Stop(); }
diff --git a/components/sync/driver/glue/sync_backend_host_core.cc b/components/sync/driver/glue/sync_backend_host_core.cc index 8c3e250a..e853d29d 100644 --- a/components/sync/driver/glue/sync_backend_host_core.cc +++ b/components/sync/driver/glue/sync_backend_host_core.cc
@@ -111,8 +111,8 @@ : name_(name), sync_data_folder_path_(sync_data_folder_path), host_(backend), - sync_loop_(NULL), - registrar_(NULL), + sync_loop_(nullptr), + registrar_(nullptr), has_sync_setup_completed_(has_sync_setup_completed), forward_protocol_events_(false), forward_type_info_(false), @@ -466,7 +466,7 @@ // which is called at the end of every sync cycle. // TODO(zea): eventually add an experiment handler and initialize it here. - if (!sync_manager_->GetUserShare()) { // NULL in some tests. + if (!sync_manager_->GetUserShare()) { // Null in some tests. DVLOG(1) << "Skipping initialization of DeviceInfo"; host_.Call(FROM_HERE, &SyncBackendHostImpl::HandleInitializationFailureOnFrontendLoop); @@ -527,7 +527,7 @@ DoDestroySyncManager(reason); - registrar_ = NULL; + registrar_ = nullptr; if (reason == DISABLE_SYNC) DeleteSyncDataFolder(); @@ -655,7 +655,7 @@ return; DCHECK(sync_loop_->task_runner()->BelongsToCurrentThread()); DCHECK(!save_changes_timer_.get()); - save_changes_timer_.reset(new base::RepeatingTimer()); + save_changes_timer_ = base::MakeUnique<base::RepeatingTimer>(); save_changes_timer_->Start( FROM_HERE, base::TimeDelta::FromSeconds(kSaveChangesIntervalSeconds), this, &SyncBackendHostCore::SaveChanges);
diff --git a/components/sync/driver/glue/sync_backend_host_core.h b/components/sync/driver/glue/sync_backend_host_core.h index 714059f0..1af32252 100644 --- a/components/sync/driver/glue/sync_backend_host_core.h +++ b/components/sync/driver/glue/sync_backend_host_core.h
@@ -268,10 +268,10 @@ WeakHandle<SyncBackendHostImpl> host_; // The loop where all the sync backend operations happen. - // Non-NULL only between calls to DoInitialize() and ~Core(). + // Non-null only between calls to DoInitialize() and ~Core(). base::MessageLoop* sync_loop_; - // Our parent's registrar (not owned). Non-NULL only between + // Our parent's registrar (not owned). Non-null only between // calls to DoInitialize() and DoShutdown(). SyncBackendRegistrar* registrar_;
diff --git a/components/sync/driver/glue/sync_backend_host_impl.cc b/components/sync/driver/glue/sync_backend_host_impl.cc index 072c5f61..1132f50 100644 --- a/components/sync/driver/glue/sync_backend_host_impl.cc +++ b/components/sync/driver/glue/sync_backend_host_impl.cc
@@ -10,6 +10,7 @@ #include "base/feature_list.h" #include "base/location.h" #include "base/logging.h" +#include "base/memory/ptr_util.h" #include "base/threading/thread_task_runner_handle.h" #include "components/invalidation/public/invalidation_service.h" #include "components/invalidation/public/object_id_invalidation_map.h" @@ -53,7 +54,7 @@ name_(name), initialized_(false), sync_prefs_(sync_prefs), - frontend_(NULL), + frontend_(nullptr), cached_passphrase_type_(PassphraseType::IMPLICIT_PASSPHRASE), invalidator_(invalidator), invalidation_handler_registered_(false), @@ -83,9 +84,9 @@ const base::Closure& report_unrecoverable_error_function, const HttpPostProviderFactoryGetter& http_post_provider_factory_getter, std::unique_ptr<SyncEncryptionHandler::NigoriState> saved_nigori_state) { - registrar_.reset(new SyncBackendRegistrar(name_, sync_client_, - std::move(sync_thread), ui_thread_, - db_thread, file_thread)); + registrar_ = base::MakeUnique<SyncBackendRegistrar>( + name_, sync_client_, std::move(sync_thread), ui_thread_, db_thread, + file_thread); CHECK(registrar_->sync_thread()); frontend_ = frontend; @@ -224,7 +225,7 @@ DCHECK(frontend_task_runner_->BelongsToCurrentThread()); // Immediately stop sending messages to the frontend. - frontend_ = NULL; + frontend_ = nullptr; DCHECK(registrar_->sync_thread()->IsRunning()); @@ -247,7 +248,7 @@ UnregisterInvalidationIds(); } invalidator_->UnregisterInvalidationHandler(this); - invalidator_ = NULL; + invalidator_ = nullptr; } invalidation_handler_registered_ = false; @@ -257,7 +258,7 @@ registrar_->sync_thread()->task_runner()->PostTask( FROM_HERE, base::Bind(&SyncBackendHostCore::DoShutdown, core_, reason)); - core_ = NULL; + core_ = nullptr; // Worker cleanup. SyncBackendRegistrar* detached_registrar = registrar_.release();
diff --git a/components/sync/driver/glue/sync_backend_host_impl_unittest.cc b/components/sync/driver/glue/sync_backend_host_impl_unittest.cc index ffeb1e92..1cbebb7c 100644 --- a/components/sync/driver/glue/sync_backend_host_impl_unittest.cc +++ b/components/sync/driver/glue/sync_backend_host_impl_unittest.cc
@@ -10,6 +10,7 @@ #include "base/files/file_util.h" #include "base/files/scoped_temp_dir.h" #include "base/location.h" +#include "base/memory/ptr_util.h" #include "base/message_loop/message_loop.h" #include "base/run_loop.h" #include "base/synchronization/waitable_event.h" @@ -106,7 +107,7 @@ public: explicit FakeSyncManagerFactory(FakeSyncManager** fake_manager) : fake_manager_(fake_manager) { - *fake_manager_ = NULL; + *fake_manager_ = nullptr; } ~FakeSyncManagerFactory() override {} @@ -154,7 +155,7 @@ class SyncBackendHostTest : public testing::Test { protected: - SyncBackendHostTest() : fake_manager_(NULL) {} + SyncBackendHostTest() : fake_manager_(nullptr) {} ~SyncBackendHostTest() override {} @@ -163,17 +164,18 @@ SyncPrefs::RegisterProfilePrefs(pref_service_.registry()); - sync_prefs_.reset(new SyncPrefs(&pref_service_)); - backend_.reset(new SyncBackendHostImpl( + sync_prefs_ = base::MakeUnique<SyncPrefs>(&pref_service_); + backend_ = base::MakeUnique<SyncBackendHostImpl>( "dummyDebugName", &sync_client_, base::ThreadTaskRunnerHandle::Get(), nullptr, sync_prefs_->AsWeakPtr(), - temp_dir_.GetPath().Append(base::FilePath(kTestSyncDir)))); + temp_dir_.GetPath().Append(base::FilePath(kTestSyncDir))); credentials_.account_id = "user@example.com"; credentials_.email = "user@example.com"; credentials_.sync_token = "sync_token"; credentials_.scope_set.insert(GaiaConstants::kChromeSyncOAuth2Scope); - fake_manager_factory_.reset(new FakeSyncManagerFactory(&fake_manager_)); + fake_manager_factory_ = + base::MakeUnique<FakeSyncManagerFactory>(&fake_manager_); // These types are always implicitly enabled. enabled_types_.PutAll(ControlTypes()); @@ -186,7 +188,7 @@ enabled_types_.Put(SEARCH_ENGINES); enabled_types_.Put(AUTOFILL); - network_resources_.reset(new HttpBridgeNetworkResources()); + network_resources_ = base::MakeUnique<HttpBridgeNetworkResources>(); } void TearDown() override {
diff --git a/components/sync/driver/glue/sync_backend_host_mock.cc b/components/sync/driver/glue/sync_backend_host_mock.cc index f02c4a5..bfe2afc 100644 --- a/components/sync/driver/glue/sync_backend_host_mock.cc +++ b/components/sync/driver/glue/sync_backend_host_mock.cc
@@ -81,7 +81,7 @@ void SyncBackendHostMock::DeactivateNonBlockingDataType(ModelType type) {} UserShare* SyncBackendHostMock::GetUserShare() const { - return NULL; + return nullptr; } SyncBackendHost::Status SyncBackendHostMock::GetDetailedStatus() { @@ -119,7 +119,7 @@ void SyncBackendHostMock::FlushDirectory() const {} base::MessageLoop* SyncBackendHostMock::GetSyncLoopForTesting() { - return NULL; + return nullptr; } void SyncBackendHostMock::RefreshTypesForTest(ModelTypeSet types) {}
diff --git a/components/sync/driver/glue/sync_backend_host_mock.h b/components/sync/driver/glue/sync_backend_host_mock.h index 4eb8b84e..4211c21 100644 --- a/components/sync/driver/glue/sync_backend_host_mock.h +++ b/components/sync/driver/glue/sync_backend_host_mock.h
@@ -18,7 +18,7 @@ // A mock of the SyncBackendHost. // // This class implements the bare minimum required for the ProfileSyncService to -// get through initialization. It often returns NULL pointers or nonesense +// get through initialization. It often returns null pointers or nonesense // values; it is not intended to be used in tests that depend on SyncBackendHost // behavior. class SyncBackendHostMock : public SyncBackendHost {
diff --git a/components/sync/driver/glue/sync_backend_registrar.cc b/components/sync/driver/glue/sync_backend_registrar.cc index 7a9fdeb..fd0ebc3 100644 --- a/components/sync/driver/glue/sync_backend_registrar.cc +++ b/components/sync/driver/glue/sync_backend_registrar.cc
@@ -9,6 +9,7 @@ #include <utility> #include "base/logging.h" +#include "base/memory/ptr_util.h" #include "base/message_loop/message_loop.h" #include "components/sync/driver/change_processor.h" #include "components/sync/driver/sync_client.h" @@ -33,7 +34,7 @@ sync_thread_ = std::move(sync_thread); if (!sync_thread_) { - sync_thread_.reset(new base::Thread("Chrome_SyncThread")); + sync_thread_ = base::MakeUnique<base::Thread>("Chrome_SyncThread"); base::Thread::Options options; options.timer_slack = base::TIMER_SLACK_MAXIMUM; CHECK(sync_thread_->StartWithOptions(options)); @@ -206,7 +207,7 @@ } bool SyncBackendRegistrar::IsTypeActivatedForTest(ModelType type) const { - return GetProcessor(type) != NULL; + return GetProcessor(type) != nullptr; } void SyncBackendRegistrar::OnChangesApplied( @@ -252,7 +253,7 @@ base::AutoLock lock(lock_); ChangeProcessor* processor = GetProcessorUnsafe(type); if (!processor) - return NULL; + return nullptr; // We can only check if |processor| exists, as otherwise the type is // mapped to GROUP_PASSIVE. @@ -273,7 +274,7 @@ // association takes place then the change processor is added to the // |processors_| list. if (it == processors_.end()) - return NULL; + return nullptr; return it->second; }
diff --git a/components/sync/driver/glue/sync_backend_registrar.h b/components/sync/driver/glue/sync_backend_registrar.h index 8ed73b0..f1c09512 100644 --- a/components/sync/driver/glue/sync_backend_registrar.h +++ b/components/sync/driver/glue/sync_backend_registrar.h
@@ -151,7 +151,7 @@ void RemoveWorker(ModelSafeGroup group); - // Returns the change processor for the given model, or NULL if none + // Returns the change processor for the given model, or null if none // exists. Must be called from |group|'s native thread. ChangeProcessor* GetProcessor(ModelType type) const;
diff --git a/components/sync/driver/glue/sync_backend_registrar_unittest.cc b/components/sync/driver/glue/sync_backend_registrar_unittest.cc index 07ab13eb..8ae4fe5 100644 --- a/components/sync/driver/glue/sync_backend_registrar_unittest.cc +++ b/components/sync/driver/glue/sync_backend_registrar_unittest.cc
@@ -5,6 +5,7 @@ #include "components/sync/driver/glue/sync_backend_registrar.h" #include "base/location.h" +#include "base/memory/ptr_util.h" #include "base/run_loop.h" #include "base/single_thread_task_runner.h" #include "components/sync/driver/change_processor_mock.h" @@ -26,7 +27,7 @@ using ::testing::StrictMock; void TriggerChanges(SyncBackendRegistrar* registrar, ModelType type) { - registrar->OnChangesApplied(type, 0, NULL, ImmutableChangeRecordList()); + registrar->OnChangesApplied(type, 0, nullptr, ImmutableChangeRecordList()); registrar->OnChangesComplete(type); } @@ -80,7 +81,7 @@ SyncBackendRegistrarTest() : db_thread_("DBThreadForTest"), file_thread_("FileThreadForTest"), - sync_thread_(NULL) {} + sync_thread_(nullptr) {} ~SyncBackendRegistrarTest() override {} @@ -88,11 +89,11 @@ db_thread_.StartAndWaitForTesting(); file_thread_.StartAndWaitForTesting(); test_user_share_.SetUp(); - sync_client_.reset(new RegistrarSyncClient( - ui_task_runner(), db_task_runner(), file_task_runner())); - registrar_.reset(new SyncBackendRegistrar( + sync_client_ = base::MakeUnique<RegistrarSyncClient>( + ui_task_runner(), db_task_runner(), file_task_runner()); + registrar_ = base::MakeUnique<SyncBackendRegistrar>( "test", sync_client_.get(), std::unique_ptr<base::Thread>(), - ui_task_runner(), db_task_runner(), file_task_runner())); + ui_task_runner(), db_task_runner(), file_task_runner()); sync_thread_ = registrar_->sync_thread(); } @@ -223,7 +224,7 @@ StrictMock<ChangeProcessorMock> change_processor_mock; EXPECT_CALL(change_processor_mock, StartImpl()); EXPECT_CALL(change_processor_mock, IsRunning()).WillRepeatedly(Return(true)); - EXPECT_CALL(change_processor_mock, ApplyChangesFromSyncModel(NULL, _, _)); + EXPECT_CALL(change_processor_mock, ApplyChangesFromSyncModel(nullptr, _, _)); EXPECT_CALL(change_processor_mock, IsRunning()).WillRepeatedly(Return(true)); EXPECT_CALL(change_processor_mock, CommitChangesFromSyncModel()); EXPECT_CALL(change_processor_mock, IsRunning()).WillRepeatedly(Return(false)); @@ -255,7 +256,7 @@ StrictMock<ChangeProcessorMock> change_processor_mock; EXPECT_CALL(change_processor_mock, StartImpl()); EXPECT_CALL(change_processor_mock, IsRunning()).WillRepeatedly(Return(true)); - EXPECT_CALL(change_processor_mock, ApplyChangesFromSyncModel(NULL, _, _)); + EXPECT_CALL(change_processor_mock, ApplyChangesFromSyncModel(nullptr, _, _)); EXPECT_CALL(change_processor_mock, IsRunning()).WillRepeatedly(Return(true)); EXPECT_CALL(change_processor_mock, CommitChangesFromSyncModel()); EXPECT_CALL(change_processor_mock, IsRunning()).WillRepeatedly(Return(false)); @@ -328,8 +329,8 @@ void SetUp() override { db_thread_.StartAndWaitForTesting(); file_thread_.StartAndWaitForTesting(); - sync_client_.reset(new RegistrarSyncClient( - ui_task_runner(), db_task_runner(), file_task_runner())); + sync_client_ = base::MakeUnique<RegistrarSyncClient>( + ui_task_runner(), db_task_runner(), file_task_runner()); } void PostQuitOnUIMessageLoop() {
diff --git a/components/sync/driver/model_association_manager_unittest.cc b/components/sync/driver/model_association_manager_unittest.cc index 023a633..ebb576b5 100644 --- a/components/sync/driver/model_association_manager_unittest.cc +++ b/components/sync/driver/model_association_manager_unittest.cc
@@ -36,7 +36,7 @@ ModelType model_type) { DataTypeController::TypeMap::const_iterator it = controllers.find(model_type); if (it == controllers.end()) { - return NULL; + return nullptr; } return static_cast<FakeDataTypeController*>(it->second.get()); }
diff --git a/components/sync/driver/model_associator.h b/components/sync/driver/model_associator.h index 67bf85e3..173789ff 100644 --- a/components/sync/driver/model_associator.h +++ b/components/sync/driver/model_associator.h
@@ -71,7 +71,7 @@ virtual int64_t GetSyncIdFromChromeId(const IDType& id) = 0; // Returns the chrome node for the given sync id. - // Returns NULL if no node is found for the given sync id. + // Returns null if no node is found for the given sync id. virtual const Node* GetChromeNodeFromSyncId(int64_t sync_id) = 0; // Initializes the given sync node from the given chrome node id.
diff --git a/components/sync/driver/model_type_controller_unittest.cc b/components/sync/driver/model_type_controller_unittest.cc index 603344dc..4705bd0 100644 --- a/components/sync/driver/model_type_controller_unittest.cc +++ b/components/sync/driver/model_type_controller_unittest.cc
@@ -125,8 +125,8 @@ void SetUp() override { model_thread_.Start(); InitializeModelTypeService(); - controller_.reset(new ModelTypeController( - kTestModelType, base::Closure(), this, model_thread_.task_runner())); + controller_ = base::MakeUnique<ModelTypeController>( + kTestModelType, base::Closure(), this, model_thread_.task_runner()); } void TearDown() override { @@ -220,8 +220,8 @@ void InitializeModelTypeService() { if (model_thread_.task_runner()->BelongsToCurrentThread()) { - service_.reset(new StubModelTypeService(base::Bind( - &ModelTypeControllerTest::CreateProcessor, base::Unretained(this)))); + service_ = base::MakeUnique<StubModelTypeService>(base::Bind( + &ModelTypeControllerTest::CreateProcessor, base::Unretained(this))); } else { model_thread_.task_runner()->PostTask( FROM_HERE,
diff --git a/components/sync/driver/non_ui_data_type_controller.cc b/components/sync/driver/non_ui_data_type_controller.cc index 4f0be0fb..ede71559 100644 --- a/components/sync/driver/non_ui_data_type_controller.cc +++ b/components/sync/driver/non_ui_data_type_controller.cc
@@ -44,7 +44,7 @@ state_ = MODEL_STARTING; // Since we can't be called multiple times before Stop() is called, - // |shared_change_processor_| must be NULL here. + // |shared_change_processor_| must be null here. DCHECK(!shared_change_processor_.get()); shared_change_processor_ = CreateSharedChangeProcessor(); DCHECK(shared_change_processor_.get()); @@ -215,7 +215,7 @@ void NonUIDataTypeController::DisconnectSharedChangeProcessor() { DCHECK(CalledOnValidThread()); - // |shared_change_processor_| can already be NULL if Stop() is + // |shared_change_processor_| can already be null if Stop() is // called after StartDone(_, DISABLED, _). if (shared_change_processor_.get()) { shared_change_processor_->Disconnect();
diff --git a/components/sync/driver/non_ui_data_type_controller.h b/components/sync/driver/non_ui_data_type_controller.h index 79947d4..3b01e15e 100644 --- a/components/sync/driver/non_ui_data_type_controller.h +++ b/components/sync/driver/non_ui_data_type_controller.h
@@ -90,9 +90,9 @@ const scoped_refptr<SharedChangeProcessor>& shared_change_processor); // Calls Disconnect() on |shared_change_processor_|, then sets it to - // NULL. Must be called only by StartDoneImpl() or Stop() (on the + // null. Must be called only by StartDoneImpl() or Stop() (on the // UI thread) and only after a call to Start() (i.e., - // |shared_change_processor_| must be non-NULL). + // |shared_change_processor_| must be non-null). void DisconnectSharedChangeProcessor(); // Posts StopLocalService() to the processor on the model type thread.
diff --git a/components/sync/driver/shared_change_processor.cc b/components/sync/driver/shared_change_processor.cc index 3f02814..514609ee 100644 --- a/components/sync/driver/shared_change_processor.cc +++ b/components/sync/driver/shared_change_processor.cc
@@ -18,23 +18,21 @@ using base::AutoLock; namespace syncer { -class AttachmentService; -} // namespace syncer -namespace syncer { +class AttachmentService; SharedChangeProcessor::SharedChangeProcessor(ModelType type) : disconnected_(false), type_(type), frontend_task_runner_(base::ThreadTaskRunnerHandle::Get()), - generic_change_processor_(NULL) { + generic_change_processor_(nullptr) { DCHECK_NE(type_, UNSPECIFIED); } SharedChangeProcessor::~SharedChangeProcessor() { // We can either be deleted when the DTC is destroyed (on UI // thread), or when the SyncableService stops syncing (datatype - // thread). |generic_change_processor_|, if non-NULL, must be + // thread). |generic_change_processor_|, if non-null, must be // deleted on |backend_loop_|. if (backend_task_runner_.get()) { if (backend_task_runner_->BelongsToCurrentThread()) {
diff --git a/components/sync/driver/shared_change_processor_unittest.cc b/components/sync/driver/shared_change_processor_unittest.cc index 2432e1a5..08db038 100644 --- a/components/sync/driver/shared_change_processor_unittest.cc +++ b/components/sync/driver/shared_change_processor_unittest.cc
@@ -9,6 +9,7 @@ #include "base/bind.h" #include "base/bind_helpers.h" #include "base/compiler_specific.h" +#include "base/memory/ptr_util.h" #include "base/synchronization/waitable_event.h" #include "base/threading/thread.h" #include "components/sync/base/model_type.h" @@ -117,7 +118,7 @@ // // TODO(akalin): Write deterministic tests for the destruction of // |shared_change_processor_| on the UI and DB threads. - shared_change_processor_ = NULL; + shared_change_processor_ = nullptr; backend_thread_.Stop(); // Note: Stop() joins the threads, and that barrier prevents this read @@ -160,7 +161,7 @@ void SetUpDBSyncableService() { DCHECK(backend_thread_.task_runner()->BelongsToCurrentThread()); DCHECK(!db_syncable_service_.get()); - db_syncable_service_.reset(new FakeSyncableService()); + db_syncable_service_ = base::MakeUnique<FakeSyncableService>(); } // Used by TearDown().
diff --git a/components/sync/driver/startup_controller_unittest.cc b/components/sync/driver/startup_controller_unittest.cc index 7be62c7..4ecc67e0 100644 --- a/components/sync/driver/startup_controller_unittest.cc +++ b/components/sync/driver/startup_controller_unittest.cc
@@ -7,6 +7,7 @@ #include <memory> #include "base/command_line.h" +#include "base/memory/ptr_util.h" #include "base/message_loop/message_loop.h" #include "base/run_loop.h" #include "components/sync/base/sync_prefs.h" @@ -30,12 +31,12 @@ void SetUp() override { SyncPrefs::RegisterProfilePrefs(pref_service_.registry()); - sync_prefs_.reset(new SyncPrefs(&pref_service_)); - controller_.reset(new StartupController( + sync_prefs_ = base::MakeUnique<SyncPrefs>(&pref_service_); + controller_ = base::MakeUnique<StartupController>( sync_prefs_.get(), base::Bind(&StartupControllerTest::CanStart, base::Unretained(this)), base::Bind(&StartupControllerTest::FakeStartBackend, - base::Unretained(this)))); + base::Unretained(this))); controller_->Reset(UserTypes()); controller_->OverrideFallbackTimeoutForTest( base::TimeDelta::FromSeconds(0));
diff --git a/components/sync/driver/sync_api_component_factory.h b/components/sync/driver/sync_api_component_factory.h index f55e5597..d6ee815 100644 --- a/components/sync/driver/sync_api_component_factory.h +++ b/components/sync/driver/sync_api_component_factory.h
@@ -118,7 +118,7 @@ // |model_type| is the model type this AttachmentService will be used with. // // |delegate| is optional delegate for AttachmentService to notify about - // asynchronous events (AttachmentUploaded). Pass NULL if delegate is not + // asynchronous events (AttachmentUploaded). Pass null if delegate is not // provided. AttachmentService doesn't take ownership of delegate, the pointer // must be valid throughout AttachmentService lifetime. virtual std::unique_ptr<AttachmentService> CreateAttachmentService(
diff --git a/components/sync/driver/sync_driver_switches.h b/components/sync/driver/sync_driver_switches.h index f0721a4f..525504c 100644 --- a/components/sync/driver/sync_driver_switches.h +++ b/components/sync/driver/sync_driver_switches.h
@@ -2,8 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// Defines all the command-line switches used by sync driver. - #ifndef COMPONENTS_SYNC_DRIVER_SYNC_DRIVER_SWITCHES_H_ #define COMPONENTS_SYNC_DRIVER_SYNC_DRIVER_SWITCHES_H_ @@ -11,8 +9,9 @@ namespace switches { -// All switches in alphabetical order. The switches should be documented -// alongside the definition of their values in the .cc file. +// Defines all the command-line switches used by sync driver. All switches in +// alphabetical order. The switches should be documented alongside the +// definition of their values in the .cc file. extern const char kSyncDeferredStartupTimeoutSeconds[]; extern const char kSyncDisableDeferredStartup[]; extern const char kSyncEnableGetUpdateAvoidance[];
diff --git a/components/sync/driver/sync_error_controller.cc b/components/sync/driver/sync_error_controller.cc index f3a94ec..6bb93c2 100644 --- a/components/sync/driver/sync_error_controller.cc +++ b/components/sync/driver/sync_error_controller.cc
@@ -29,7 +29,8 @@ } void SyncErrorController::OnStateChanged() { - FOR_EACH_OBSERVER(Observer, observer_list_, OnErrorChanged()); + for (auto& observer : observer_list_) + observer.OnErrorChanged(); } } // namespace syncer
diff --git a/components/sync/driver/sync_policy_handler_unittest.cc b/components/sync/driver/sync_policy_handler_unittest.cc index ac4417b..92538b94 100644 --- a/components/sync/driver/sync_policy_handler_unittest.cc +++ b/components/sync/driver/sync_policy_handler_unittest.cc
@@ -23,7 +23,7 @@ SyncPolicyHandler handler; PrefValueMap prefs; handler.ApplyPolicySettings(policy, &prefs); - EXPECT_FALSE(prefs.GetValue(prefs::kSyncManaged, NULL)); + EXPECT_FALSE(prefs.GetValue(prefs::kSyncManaged, nullptr)); } TEST_F(SyncPolicyHandlerTest, Enabled) { @@ -36,7 +36,7 @@ handler.ApplyPolicySettings(policy, &prefs); // Enabling Sync should not set the pref. - EXPECT_FALSE(prefs.GetValue(prefs::kSyncManaged, NULL)); + EXPECT_FALSE(prefs.GetValue(prefs::kSyncManaged, nullptr)); } TEST_F(SyncPolicyHandlerTest, Disabled) { @@ -49,7 +49,7 @@ handler.ApplyPolicySettings(policy, &prefs); // Sync should be flagged as managed. - const base::Value* value = NULL; + const base::Value* value = nullptr; EXPECT_TRUE(prefs.GetValue(prefs::kSyncManaged, &value)); ASSERT_TRUE(value); bool sync_managed = false;
diff --git a/components/sync/driver/ui_data_type_controller.cc b/components/sync/driver/ui_data_type_controller.cc index e5065ecbba..1290a052 100644 --- a/components/sync/driver/ui_data_type_controller.cc +++ b/components/sync/driver/ui_data_type_controller.cc
@@ -57,7 +57,7 @@ return; } // Since we can't be called multiple times before Stop() is called, - // |shared_change_processor_| must be NULL here. + // |shared_change_processor_| must be null here. DCHECK(!shared_change_processor_.get()); shared_change_processor_ = new SharedChangeProcessor(type()); @@ -236,7 +236,7 @@ state_ = NOT_RUNNING; if (shared_change_processor_.get()) { - shared_change_processor_ = NULL; + shared_change_processor_ = nullptr; } // We don't want to continue loading models (e.g OnModelLoaded should never be @@ -267,7 +267,7 @@ if (shared_change_processor_.get()) { shared_change_processor_->Disconnect(); - shared_change_processor_ = NULL; + shared_change_processor_ = nullptr; } } @@ -286,7 +286,7 @@ if (shared_change_processor_.get()) { shared_change_processor_->Disconnect(); - shared_change_processor_ = NULL; + shared_change_processor_ = nullptr; } // If Stop() is called while Start() is waiting for the datatype model to
diff --git a/components/sync/driver/ui_data_type_controller_unittest.cc b/components/sync/driver/ui_data_type_controller_unittest.cc index b8234b0a..39b3a2f 100644 --- a/components/sync/driver/ui_data_type_controller_unittest.cc +++ b/components/sync/driver/ui_data_type_controller_unittest.cc
@@ -48,7 +48,7 @@ public FakeSyncClient { public: SyncUIDataTypeControllerTest() - : type_(PREFERENCES), change_processor_(NULL) {} + : type_(PREFERENCES), change_processor_(nullptr) {} // FakeSyncClient overrides. base::WeakPtr<SyncableService> GetSyncableServiceForType( @@ -65,7 +65,7 @@ void TearDown() override { // Must be done before we pump the loop. syncable_service_.StopSyncing(type_); - preference_dtc_ = NULL; + preference_dtc_ = nullptr; PumpLoop(); }
diff --git a/components/sync/engine/attachments/attachment_downloader.h b/components/sync/engine/attachments/attachment_downloader.h index 24d5318..80e82a4 100644 --- a/components/sync/engine/attachments/attachment_downloader.h +++ b/components/sync/engine/attachments/attachment_downloader.h
@@ -40,7 +40,7 @@ // done. // // |callback| will receive a DownloadResult code and an Attachment object. If - // DownloadResult is not DOWNLOAD_SUCCESS then attachment pointer is NULL. + // DownloadResult is not DOWNLOAD_SUCCESS then attachment pointer is null. virtual void DownloadAttachment(const AttachmentId& attachment_id, const DownloadCallback& callback) = 0;
diff --git a/components/sync/engine/attachments/attachment_store_frontend_unittest.cc b/components/sync/engine/attachments/attachment_store_frontend_unittest.cc index d218203..99b25fc 100644 --- a/components/sync/engine/attachments/attachment_store_frontend_unittest.cc +++ b/components/sync/engine/attachments/attachment_store_frontend_unittest.cc
@@ -228,7 +228,7 @@ // Releasing referehce to AttachmentStoreFrontend should result in // MockAttachmentStore being deleted on backend loop. - attachment_store_frontend_ = NULL; + attachment_store_frontend_ = nullptr; EXPECT_EQ(dtor_call_count_, 0); RunMessageLoop(); EXPECT_EQ(dtor_call_count_, 1);
diff --git a/components/sync/engine/attachments/fake_attachment_downloader.cc b/components/sync/engine/attachments/fake_attachment_downloader.cc index a043c67..66f85fb 100644 --- a/components/sync/engine/attachments/fake_attachment_downloader.cc +++ b/components/sync/engine/attachments/fake_attachment_downloader.cc
@@ -4,8 +4,11 @@ #include "components/sync/engine/attachments/fake_attachment_downloader.h" +#include <memory> + #include "base/bind.h" #include "base/location.h" +#include "base/memory/ptr_util.h" #include "base/single_thread_task_runner.h" #include "base/threading/thread_task_runner_handle.h" #include "components/sync/engine/attachments/attachment_util.h" @@ -25,9 +28,8 @@ // This is happy fake downloader, it always successfully downloads empty // attachment. scoped_refptr<base::RefCountedMemory> data(new base::RefCountedBytes()); - std::unique_ptr<Attachment> attachment; - attachment.reset( - new Attachment(Attachment::CreateFromParts(attachment_id, data))); + std::unique_ptr<Attachment> attachment = base::MakeUnique<Attachment>( + Attachment::CreateFromParts(attachment_id, data)); base::ThreadTaskRunnerHandle::Get()->PostTask( FROM_HERE, base::Bind(callback, DOWNLOAD_SUCCESS, base::Passed(&attachment)));
diff --git a/components/sync/engine/attachments/on_disk_attachment_store.cc b/components/sync/engine/attachments/on_disk_attachment_store.cc index e9aa3c00..4afc78b5a 100644 --- a/components/sync/engine/attachments/on_disk_attachment_store.cc +++ b/components/sync/engine/attachments/on_disk_attachment_store.cc
@@ -12,6 +12,7 @@ #include "base/bind.h" #include "base/callback.h" #include "base/location.h" +#include "base/memory/ptr_util.h" #include "base/metrics/histogram_macros.h" #include "base/sequenced_task_runner.h" #include "components/sync/engine/attachments/attachment_util.h" @@ -435,8 +436,8 @@ return attachment; } } - attachment.reset( - new Attachment(Attachment::CreateFromParts(attachment_id, data))); + attachment = base::MakeUnique<Attachment>( + Attachment::CreateFromParts(attachment_id, data)); return attachment; }
diff --git a/components/sync/engine/engine_components_factory_impl.h b/components/sync/engine/engine_components_factory_impl.h index 476bdf1..6bf4ef9 100644 --- a/components/sync/engine/engine_components_factory_impl.h +++ b/components/sync/engine/engine_components_factory_impl.h
@@ -1,9 +1,6 @@ // Copyright 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. -// -// An EngineComponentsFactory implementation designed for real production / -// normal use. #ifndef COMPONENTS_SYNC_ENGINE_ENGINE_COMPONENTS_FACTORY_IMPL_H_ #define COMPONENTS_SYNC_ENGINE_ENGINE_COMPONENTS_FACTORY_IMPL_H_ @@ -17,6 +14,8 @@ namespace syncer { +// An EngineComponentsFactory implementation designed for real production / +// normal use. class EngineComponentsFactoryImpl : public EngineComponentsFactory { public: explicit EngineComponentsFactoryImpl(const Switches& switches);
diff --git a/components/sync/engine/engine_util.cc b/components/sync/engine/engine_util.cc index e66bf13..6852be1 100644 --- a/components/sync/engine/engine_util.cc +++ b/components/sync/engine/engine_util.cc
@@ -27,17 +27,17 @@ const sync_pb::EntitySpecifics& specifics, Cryptographer* crypto) { if (!specifics.has_password()) - return NULL; + return nullptr; const sync_pb::PasswordSpecifics& password_specifics = specifics.password(); if (!password_specifics.has_encrypted()) - return NULL; + return nullptr; const sync_pb::EncryptedData& encrypted = password_specifics.encrypted(); std::unique_ptr<sync_pb::PasswordSpecificsData> data( new sync_pb::PasswordSpecificsData); if (!crypto->CanDecrypt(encrypted)) - return NULL; + return nullptr; if (!crypto->Decrypt(encrypted, data.get())) - return NULL; + return nullptr; return data.release(); }
diff --git a/components/sync/engine/fake_sync_manager.cc b/components/sync/engine/fake_sync_manager.cc index 9dc6753..b087371b 100644 --- a/components/sync/engine/fake_sync_manager.cc +++ b/components/sync/engine/fake_sync_manager.cc
@@ -34,7 +34,7 @@ configure_fail_types_(configure_fail_types), last_configure_reason_(CONFIGURE_REASON_UNKNOWN), num_invalidations_received_(0) { - fake_encryption_handler_.reset(new FakeSyncEncryptionHandler()); + fake_encryption_handler_ = base::MakeUnique<FakeSyncEncryptionHandler>(); } FakeSyncManager::~FakeSyncManager() {}
diff --git a/components/sync/engine/model_safe_worker.cc b/components/sync/engine/model_safe_worker.cc index fd0cb3e..c9d2d38f 100644 --- a/components/sync/engine/model_safe_worker.cc +++ b/components/sync/engine/model_safe_worker.cc
@@ -124,7 +124,7 @@ { base::AutoLock l(working_task_runner_lock_); - working_task_runner_ = NULL; + working_task_runner_ = nullptr; } if (observer_)
diff --git a/components/sync/engine/model_safe_worker.h b/components/sync/engine/model_safe_worker.h index 42eb29c..fb34661f 100644 --- a/components/sync/engine/model_safe_worker.h +++ b/components/sync/engine/model_safe_worker.h
@@ -25,9 +25,6 @@ namespace syncer { -// TODO(akalin): Move the non-exported functions in this file to a -// private header. - typedef base::Callback<enum SyncerError(void)> WorkCallback; enum ModelSafeGroup {
diff --git a/components/sync/engine/net/http_bridge.cc b/components/sync/engine/net/http_bridge.cc index fccf140..3a8ee59 100644 --- a/components/sync/engine/net/http_bridge.cc +++ b/components/sync/engine/net/http_bridge.cc
@@ -10,6 +10,7 @@ #include "base/bit_cast.h" #include "base/location.h" +#include "base/memory/ptr_util.h" #include "base/metrics/histogram_macros.h" #include "base/metrics/sparse_histogram.h" #include "base/single_thread_task_runner.h" @@ -110,11 +111,11 @@ base::AutoLock lock(request_context_getter_lock_); // Release |request_context_getter_| as soon as possible so that it // is destroyed in the right order on its network task runner. - request_context_getter_ = NULL; + request_context_getter_ = nullptr; } HttpBridge::URLFetchState::URLFetchState() - : url_poster(NULL), + : url_poster(nullptr), aborted(false), request_completed(false), request_succeeded(false), @@ -223,7 +224,8 @@ // Start the timer on the network thread (the same thread progress is made // on, and on which the url fetcher lives). DCHECK(!fetch_state_.http_request_timeout_timer.get()); - fetch_state_.http_request_timeout_timer.reset(new base::Timer(false, false)); + fetch_state_.http_request_timeout_timer = + base::MakeUnique<base::Timer>(false, false); fetch_state_.http_request_timeout_timer->Start( FROM_HERE, base::TimeDelta::FromSeconds(kMaxHttpRequestTimeSeconds), base::Bind(&HttpBridge::OnURLFetchTimedOut, this)); @@ -272,7 +274,7 @@ DCHECK(fetch_state_.request_completed); std::string value; - fetch_state_.response_headers->EnumerateHeader(NULL, name, &value); + fetch_state_.response_headers->EnumerateHeader(nullptr, name, &value); return value; } @@ -281,7 +283,7 @@ // Release |request_context_getter_| as soon as possible so that it is // destroyed in the right order on its network task runner. - request_context_getter_ = NULL; + request_context_getter_ = nullptr; DCHECK(!fetch_state_.aborted); if (fetch_state_.aborted || fetch_state_.request_completed) @@ -297,7 +299,7 @@ NOTREACHED() << "Could not post task to delete URLFetcher"; } - fetch_state_.url_poster = NULL; + fetch_state_.url_poster = nullptr; fetch_state_.error_code = net::ERR_ABORTED; http_post_completed_.Signal(); } @@ -359,7 +361,7 @@ // URLFetcher, so it seems most natural / "polite" to let the stack unwind. base::ThreadTaskRunnerHandle::Get()->DeleteSoon(FROM_HERE, fetch_state_.url_poster); - fetch_state_.url_poster = NULL; + fetch_state_.url_poster = nullptr; // Wake the blocked syncer thread in MakeSynchronousPost. // WARNING: DONT DO ANYTHING AFTER THIS CALL! |this| may be deleted! @@ -406,7 +408,7 @@ // This method is called by the timer, not the url fetcher implementation, // so it's safe to delete the fetcher here. delete fetch_state_.url_poster; - fetch_state_.url_poster = NULL; + fetch_state_.url_poster = nullptr; // Timer is smart enough to handle being deleted as part of the invoked task. fetch_state_.http_request_timeout_timer.reset(); @@ -427,8 +429,8 @@ if (!fetch_state_.request_succeeded || fetch_state_.start_time.is_null() || fetch_state_.end_time < fetch_state_.start_time || !fetch_state_.response_headers || - !fetch_state_.response_headers->EnumerateHeader(NULL, "Sane-Time-Millis", - &sane_time_str)) { + !fetch_state_.response_headers->EnumerateHeader( + nullptr, "Sane-Time-Millis", &sane_time_str)) { return; }
diff --git a/components/sync/engine/net/http_bridge_unittest.cc b/components/sync/engine/net/http_bridge_unittest.cc index c828b76f..1e67de9 100644 --- a/components/sync/engine/net/http_bridge_unittest.cc +++ b/components/sync/engine/net/http_bridge_unittest.cc
@@ -39,8 +39,8 @@ class MAYBE_SyncHttpBridgeTest : public testing::Test { public: MAYBE_SyncHttpBridgeTest() - : fake_default_request_context_getter_(NULL), - bridge_for_race_test_(NULL), + : fake_default_request_context_getter_(nullptr), + bridge_for_race_test_(nullptr), io_thread_("IO thread") { test_server_.AddDefaultHandlers(base::FilePath(kDocRoot)); } @@ -55,7 +55,7 @@ if (fake_default_request_context_getter_) { GetIOThreadLoop()->task_runner()->ReleaseSoon( FROM_HERE, fake_default_request_context_getter_); - fake_default_request_context_getter_ = NULL; + fake_default_request_context_getter_ = nullptr; } io_thread_.Stop(); } @@ -160,7 +160,7 @@ test_->GetIOThreadLoop()->task_runner()->BelongsToCurrentThread()); // We return a dummy content response. std::string response_content = "success!"; - net::TestURLFetcher fetcher(0, GURL("http://www.google.com"), NULL); + net::TestURLFetcher fetcher(0, GURL("http://www.google.com"), nullptr); scoped_refptr<net::HttpResponseHeaders> response_headers( new net::HttpResponseHeaders("")); fetcher.set_response_code(200); @@ -188,7 +188,7 @@ int os_error = 0; int response_code = 0; bridge->MakeSynchronousPost(&os_error, &response_code); - bridge_for_race_test_ = NULL; + bridge_for_race_test_ = nullptr; } signal_when_released->Signal(); } @@ -434,7 +434,7 @@ net::URLFetcherDelegate* delegate = static_cast<net::URLFetcherDelegate*>(bridge_for_race_test()); std::string response_content = "success!"; - net::TestURLFetcher fetcher(0, GURL("http://www.google.com"), NULL); + net::TestURLFetcher fetcher(0, GURL("http://www.google.com"), nullptr); fetcher.set_response_code(200); fetcher.SetResponseString(response_content); ASSERT_TRUE(io_thread()->task_runner()->PostTask( @@ -493,8 +493,8 @@ base::Thread sync_thread("SyncThread"); sync_thread.Start(); - HttpPostProviderFactory* factory = NULL; - HttpPostProviderInterface* bridge = NULL; + HttpPostProviderFactory* factory = nullptr; + HttpPostProviderInterface* bridge = nullptr; scoped_refptr<net::URLRequestContextGetter> baseline_context_getter( new net::TestURLRequestContextGetter(io_thread()->task_runner())); @@ -536,7 +536,7 @@ // |baseline_context_getter| should have only one reference from local // variable. EXPECT_TRUE(baseline_context_getter->HasOneRef()); - baseline_context_getter = NULL; + baseline_context_getter = nullptr; // Unblock and stop IO thread before sync thread. wait_done.Signal();
diff --git a/components/sync/engine/polling_constants.h b/components/sync/engine/polling_constants.h index 1d72848e..2f2c4224 100644 --- a/components/sync/engine/polling_constants.h +++ b/components/sync/engine/polling_constants.h
@@ -1,8 +1,6 @@ // Copyright 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. -// -// Constants used by SyncScheduler when polling servers for updates. #ifndef COMPONENTS_SYNC_ENGINE_POLLING_CONSTANTS_H_ #define COMPONENTS_SYNC_ENGINE_POLLING_CONSTANTS_H_ @@ -11,6 +9,7 @@ namespace syncer { +// Constants used by SyncScheduler when polling servers for updates. extern const int64_t kDefaultShortPollIntervalSeconds; extern const int64_t kDefaultLongPollIntervalSeconds; extern const int64_t kMaxBackoffSeconds;
diff --git a/components/sync/engine/sync_manager.cc b/components/sync/engine/sync_manager.cc index 34cba62..90fa6b73 100644 --- a/components/sync/engine/sync_manager.cc +++ b/components/sync/engine/sync_manager.cc
@@ -19,10 +19,10 @@ SyncManager::Observer::~Observer() {} SyncManager::InitArgs::InitArgs() - : extensions_activity(NULL), - change_delegate(NULL), - encryptor(NULL), - cancelation_signal(NULL) {} + : extensions_activity(nullptr), + change_delegate(nullptr), + encryptor(nullptr), + cancelation_signal(nullptr) {} SyncManager::InitArgs::~InitArgs() {}
diff --git a/components/sync/engine_impl/all_status.h b/components/sync/engine_impl/all_status.h index fa4564d..3596cb0 100644 --- a/components/sync/engine_impl/all_status.h +++ b/components/sync/engine_impl/all_status.h
@@ -1,9 +1,6 @@ // 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. -// -// The AllStatus object watches various sync engine components and aggregates -// the status of all of them into one place. #ifndef COMPONENTS_SYNC_ENGINE_IMPL_ALL_STATUS_H_ #define COMPONENTS_SYNC_ENGINE_IMPL_ALL_STATUS_H_ @@ -26,8 +23,9 @@ struct ServerConnectionEvent; struct SyncCycleEvent; -// This class collects data and uses it to update its internal state. It can -// return a snapshot of this state as a SyncerStatus object. +// This class watches various sync engine components, updating its internal +// state upon change. It can return a snapshot of this state as a SyncerStatus +// object, aggregating all this data into one place. // // Most of this data ends up on the about:sync page. But the page is only // 'pinged' to update itself at the end of a sync cycle. A user could refresh
diff --git a/components/sync/engine_impl/apply_control_data_updates_unittest.cc b/components/sync/engine_impl/apply_control_data_updates_unittest.cc index 17ce931..b72507f 100644 --- a/components/sync/engine_impl/apply_control_data_updates_unittest.cc +++ b/components/sync/engine_impl/apply_control_data_updates_unittest.cc
@@ -13,6 +13,7 @@ #include "base/format_macros.h" #include "base/location.h" #include "base/macros.h" +#include "base/memory/ptr_util.h" #include "base/message_loop/message_loop.h" #include "base/strings/stringprintf.h" #include "components/sync/base/cryptographer.h" @@ -46,7 +47,7 @@ void SetUp() override { dir_maker_.SetUp(); - entry_factory_.reset(new TestEntryFactory(directory())); + entry_factory_ = base::MakeUnique<TestEntryFactory>(directory()); } void TearDown() override { dir_maker_.TearDown(); } @@ -132,20 +133,20 @@ // First item is a folder Id folder_id = id_factory_.NewLocalId(); entry_factory_->CreateUnsyncedItem(folder_id, id_factory_.root(), "folder", - true, BOOKMARKS, NULL); + true, BOOKMARKS, nullptr); // Next five items are children of the folder size_t i; size_t batch_s = 5; for (i = 0; i < batch_s; ++i) { entry_factory_->CreateUnsyncedItem(id_factory_.NewLocalId(), folder_id, base::StringPrintf("Item %" PRIuS "", i), - false, BOOKMARKS, NULL); + false, BOOKMARKS, nullptr); } // Next five items are children of the root. for (; i < 2 * batch_s; ++i) { entry_factory_->CreateUnsyncedItem( id_factory_.NewLocalId(), id_factory_.root(), - base::StringPrintf("Item %" PRIuS "", i), false, BOOKMARKS, NULL); + base::StringPrintf("Item %" PRIuS "", i), false, BOOKMARKS, nullptr); } KeyParams params = {"localhost", "dummy", "foobar"}; @@ -243,20 +244,20 @@ // First item is a folder Id folder_id = id_factory_.NewLocalId(); entry_factory_->CreateUnsyncedItem(folder_id, id_factory_.root(), "folder", - true, BOOKMARKS, NULL); + true, BOOKMARKS, nullptr); // Next five items are children of the folder size_t i; size_t batch_s = 5; for (i = 0; i < batch_s; ++i) { entry_factory_->CreateUnsyncedItem(id_factory_.NewLocalId(), folder_id, base::StringPrintf("Item %" PRIuS "", i), - false, BOOKMARKS, NULL); + false, BOOKMARKS, nullptr); } // Next five items are children of the root. for (; i < 2 * batch_s; ++i) { entry_factory_->CreateUnsyncedItem( id_factory_.NewLocalId(), id_factory_.root(), - base::StringPrintf("Item %" PRIuS "", i), false, BOOKMARKS, NULL); + base::StringPrintf("Item %" PRIuS "", i), false, BOOKMARKS, nullptr); } // We encrypt with new keys, triggering the local cryptographer to be unready
diff --git a/components/sync/engine_impl/attachments/attachment_downloader_impl.cc b/components/sync/engine_impl/attachments/attachment_downloader_impl.cc index 2135d6b..13a69b2 100644 --- a/components/sync/engine_impl/attachments/attachment_downloader_impl.cc +++ b/components/sync/engine_impl/attachments/attachment_downloader_impl.cc
@@ -9,6 +9,7 @@ #include "base/base64.h" #include "base/bind.h" #include "base/location.h" +#include "base/memory/ptr_util.h" #include "base/metrics/histogram.h" #include "base/metrics/histogram_macros.h" #include "base/metrics/sparse_histogram.h" @@ -224,7 +225,7 @@ DownloadState* download_state) { requests_waiting_for_access_token_.push_back(download_state); // Start access token request if there is no active one. - if (access_token_request_ == NULL) { + if (access_token_request_ == nullptr) { access_token_request_ = OAuth2TokenServiceRequest::CreateAndStart( token_service_provider_.get(), account_id_, oauth2_scopes_, this); } @@ -239,8 +240,8 @@ iter != download_state.user_callbacks.end(); ++iter) { std::unique_ptr<Attachment> attachment; if (result == DOWNLOAD_SUCCESS) { - attachment.reset(new Attachment(Attachment::CreateFromParts( - download_state.attachment_id, attachment_data))); + attachment = base::MakeUnique<Attachment>(Attachment::CreateFromParts( + download_state.attachment_id, attachment_data)); } base::ThreadTaskRunnerHandle::Get()->PostTask(
diff --git a/components/sync/engine_impl/attachments/attachment_downloader_impl_unittest.cc b/components/sync/engine_impl/attachments/attachment_downloader_impl_unittest.cc index 87793951..321ed40 100644 --- a/components/sync/engine_impl/attachments/attachment_downloader_impl_unittest.cc +++ b/components/sync/engine_impl/attachments/attachment_downloader_impl_unittest.cc
@@ -9,6 +9,7 @@ #include "base/bind.h" #include "base/location.h" +#include "base/memory/ptr_util.h" #include "base/memory/weak_ptr.h" #include "base/message_loop/message_loop.h" #include "base/run_loop.h" @@ -206,7 +207,7 @@ url_request_context_getter_ = new net::TestURLRequestContextGetter(message_loop_.task_runner()); url_fetcher_factory_.set_remove_fetcher_on_delete(true); - token_service_.reset(new MockOAuth2TokenService()); + token_service_ = base::MakeUnique<MockOAuth2TokenService>(); token_service_->AddAccount(kAccountId); scoped_refptr<OAuth2TokenServiceRequest::TokenServiceProvider> token_service_provider(new TokenServiceProvider(token_service_.get()));
diff --git a/components/sync/engine_impl/attachments/attachment_uploader_impl_unittest.cc b/components/sync/engine_impl/attachments/attachment_uploader_impl_unittest.cc index 5284b5f1..a2dcfd8 100644 --- a/components/sync/engine_impl/attachments/attachment_uploader_impl_unittest.cc +++ b/components/sync/engine_impl/attachments/attachment_uploader_impl_unittest.cc
@@ -10,6 +10,7 @@ #include "base/bind.h" #include "base/callback.h" #include "base/location.h" +#include "base/memory/ptr_util.h" #include "base/memory/ref_counted.h" #include "base/memory/ref_counted_memory.h" #include "base/message_loop/message_loop.h" @@ -271,8 +272,8 @@ void AttachmentUploaderImplTest::SetUp() { DCHECK(CalledOnValidThread()); - request_handler_.reset(new RequestHandler(message_loop_.task_runner(), - weak_ptr_factory_.GetWeakPtr())); + request_handler_ = base::MakeUnique<RequestHandler>( + message_loop_.task_runner(), weak_ptr_factory_.GetWeakPtr()); url_request_context_getter_ = new net::TestURLRequestContextGetter(message_loop_.task_runner()); @@ -283,15 +284,15 @@ GURL url(base::StringPrintf("http://localhost:%u/", server_.port())); - token_service_.reset(new MockOAuth2TokenService); + token_service_ = base::MakeUnique<MockOAuth2TokenService>(); scoped_refptr<OAuth2TokenServiceRequest::TokenServiceProvider> token_service_provider(new TokenServiceProvider(token_service_.get())); OAuth2TokenService::ScopeSet scopes; scopes.insert(GaiaConstants::kChromeSyncOAuth2Scope); - uploader().reset(new AttachmentUploaderImpl( + uploader() = base::MakeUnique<AttachmentUploaderImpl>( url, url_request_context_getter_, kAccountId, scopes, - token_service_provider, std::string(kStoreBirthday), kModelType)); + token_service_provider, std::string(kStoreBirthday), kModelType); upload_callback_ = base::Bind(&AttachmentUploaderImplTest::UploadDone, base::Unretained(this));
diff --git a/components/sync/engine_impl/commit.cc b/components/sync/engine_impl/commit.cc index abb8fc1b..80311bb 100644 --- a/components/sync/engine_impl/commit.cc +++ b/components/sync/engine_impl/commit.cc
@@ -48,7 +48,7 @@ // Give up if no one had anything to commit. if (contributions.empty()) - return NULL; + return nullptr; sync_pb::ClientToServerMessage message; message.set_message_contents(sync_pb::ClientToServerMessage::COMMIT); @@ -115,7 +115,7 @@ TRACE_EVENT_BEGIN0("sync", "PostCommit"); const SyncerError post_result = SyncerProtoUtil::PostClientToServerMessage( - &message_, &response_, cycle, NULL); + &message_, &response_, cycle, nullptr); TRACE_EVENT_END0("sync", "PostCommit"); // TODO(rlarocque): Use result that includes errors captured later?
diff --git a/components/sync/engine_impl/commit_contributor.h b/components/sync/engine_impl/commit_contributor.h index 503acfe..86ab917 100644 --- a/components/sync/engine_impl/commit_contributor.h +++ b/components/sync/engine_impl/commit_contributor.h
@@ -27,7 +27,7 @@ virtual ~CommitContributor() = 0; // Gathers up to |max_entries| unsynced items from this contributor into a - // CommitContribution. Returns NULL when the contributor has nothing to + // CommitContribution. Returns null when the contributor has nothing to // contribute. virtual std::unique_ptr<CommitContribution> GetContribution( size_t max_entries) = 0;
diff --git a/components/sync/engine_impl/conflict_resolver.h b/components/sync/engine_impl/conflict_resolver.h index a0b0f6e..3d8e81e 100644 --- a/components/sync/engine_impl/conflict_resolver.h +++ b/components/sync/engine_impl/conflict_resolver.h
@@ -1,9 +1,6 @@ // 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 class that watches the syncer and attempts to resolve any conflicts that -// occur. #ifndef COMPONENTS_SYNC_ENGINE_IMPL_CONFLICT_RESOLVER_H_ #define COMPONENTS_SYNC_ENGINE_IMPL_CONFLICT_RESOLVER_H_ @@ -25,6 +22,8 @@ class StatusController; struct UpdateCounters; +// A class that watches the syncer and attempts to resolve any conflicts that +// occur. class ConflictResolver { public: // Enumeration of different conflict resolutions. Used for histogramming.
diff --git a/components/sync/engine_impl/conflict_util.h b/components/sync/engine_impl/conflict_util.h index 50cb1619..403a36e 100644 --- a/components/sync/engine_impl/conflict_util.h +++ b/components/sync/engine_impl/conflict_util.h
@@ -1,12 +1,12 @@ // 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. -// -// Utility functions that act on syncable::MutableEntry to resolve conflicts. #ifndef COMPONENTS_SYNC_ENGINE_IMPL_CONFLICT_UTIL_H_ #define COMPONENTS_SYNC_ENGINE_IMPL_CONFLICT_UTIL_H_ +// Utility functions that act on syncable::MutableEntry to resolve conflicts. + namespace syncer { namespace syncable {
diff --git a/components/sync/engine_impl/cycle/directory_type_debug_info_emitter.cc b/components/sync/engine_impl/cycle/directory_type_debug_info_emitter.cc index 975fd46..4b797d44 100644 --- a/components/sync/engine_impl/cycle/directory_type_debug_info_emitter.cc +++ b/components/sync/engine_impl/cycle/directory_type_debug_info_emitter.cc
@@ -26,7 +26,7 @@ DirectoryTypeDebugInfoEmitter::DirectoryTypeDebugInfoEmitter( ModelType type, base::ObserverList<TypeDebugInfoObserver>* observers) - : directory_(NULL), type_(type), type_debug_info_observers_(observers) {} + : directory_(nullptr), type_(type), type_debug_info_observers_(observers) {} DirectoryTypeDebugInfoEmitter::~DirectoryTypeDebugInfoEmitter() {} @@ -46,8 +46,8 @@ } void DirectoryTypeDebugInfoEmitter::EmitCommitCountersUpdate() { - FOR_EACH_OBSERVER(TypeDebugInfoObserver, (*type_debug_info_observers_), - OnCommitCountersUpdated(type_, commit_counters_)); + for (auto& observer : *type_debug_info_observers_) + observer.OnCommitCountersUpdated(type_, commit_counters_); } const UpdateCounters& DirectoryTypeDebugInfoEmitter::GetUpdateCounters() const { @@ -59,8 +59,8 @@ } void DirectoryTypeDebugInfoEmitter::EmitUpdateCountersUpdate() { - FOR_EACH_OBSERVER(TypeDebugInfoObserver, (*type_debug_info_observers_), - OnUpdateCountersUpdated(type_, update_counters_)); + for (auto& observer : *type_debug_info_observers_) + observer.OnUpdateCountersUpdated(type_, update_counters_); } void DirectoryTypeDebugInfoEmitter::EmitStatusCountersUpdate() { @@ -83,8 +83,8 @@ } } - FOR_EACH_OBSERVER(TypeDebugInfoObserver, (*type_debug_info_observers_), - OnStatusCountersUpdated(type_, counters)); + for (auto& observer : *type_debug_info_observers_) + observer.OnStatusCountersUpdated(type_, counters); } } // namespace syncer
diff --git a/components/sync/engine_impl/cycle/nudge_tracker.h b/components/sync/engine_impl/cycle/nudge_tracker.h index 7d9ccc4..5bd69c9 100644 --- a/components/sync/engine_impl/cycle/nudge_tracker.h +++ b/components/sync/engine_impl/cycle/nudge_tracker.h
@@ -1,9 +1,7 @@ // 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 class to track the outstanding work required to bring the client back into -// sync with the server. + #ifndef COMPONENTS_SYNC_ENGINE_IMPL_CYCLE_NUDGE_TRACKER_H_ #define COMPONENTS_SYNC_ENGINE_IMPL_CYCLE_NUDGE_TRACKER_H_ @@ -25,6 +23,8 @@ class ObjectIdInvalidationMap; +// A class to track the outstanding work required to bring the client back into +// sync with the server. class NudgeTracker { public: static size_t kDefaultMaxPayloadsPerType;
diff --git a/components/sync/engine_impl/cycle/status_controller.h b/components/sync/engine_impl/cycle/status_controller.h index 24e7182..7fc554a 100644 --- a/components/sync/engine_impl/cycle/status_controller.h +++ b/components/sync/engine_impl/cycle/status_controller.h
@@ -2,18 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// StatusController handles all counter and status related number crunching and -// state tracking on behalf of a SyncCycle. -// -// This object may be accessed from many different threads. It will be accessed -// most often from the syncer thread. However, when update application is in -// progress it may also be accessed from the worker threads. This is safe -// because only one of them will run at a time, and the syncer thread will be -// blocked until update application completes. -// -// This object contains only global state. None of its members are per model -// type counters. - #ifndef COMPONENTS_SYNC_ENGINE_IMPL_CYCLE_STATUS_CONTROLLER_H_ #define COMPONENTS_SYNC_ENGINE_IMPL_CYCLE_STATUS_CONTROLLER_H_ @@ -28,6 +16,17 @@ namespace syncer { +// StatusController handles all counter and status related number crunching and +// state tracking on behalf of a SyncCycle. +// +// This object may be accessed from many different threads. It will be accessed +// most often from the syncer thread. However, when update application is in +// progress it may also be accessed from the worker threads. This is safe +// because only one of them will run at a time, and the syncer thread will be +// blocked until update application completes. +// +// This object contains only global state. None of its members are per model +// type counters. class StatusController { public: StatusController();
diff --git a/components/sync/engine_impl/cycle/sync_cycle.cc b/components/sync/engine_impl/cycle/sync_cycle.cc index d56f9dba..c51eb0f 100644 --- a/components/sync/engine_impl/cycle/sync_cycle.cc +++ b/components/sync/engine_impl/cycle/sync_cycle.cc
@@ -8,6 +8,7 @@ #include <iterator> #include "base/logging.h" +#include "base/memory/ptr_util.h" #include "components/sync/syncable/directory.h" namespace syncer { @@ -19,7 +20,7 @@ SyncCycle::SyncCycle(SyncCycleContext* context, Delegate* delegate) : context_(context), delegate_(delegate) { - status_controller_.reset(new StatusController()); + status_controller_ = base::MakeUnique<StatusController>(); } SyncCycle::~SyncCycle() {} @@ -65,8 +66,8 @@ DVLOG(1) << "Sending cycle end event with snapshot: " << event.snapshot.ToString(); - FOR_EACH_OBSERVER(SyncEngineEventListener, *(context_->listeners()), - OnSyncCycleEvent(event)); + for (auto& observer : *context_->listeners()) + observer.OnSyncCycleEvent(event); } void SyncCycle::SendEventNotification(SyncCycleEvent::EventCause cause) { @@ -74,13 +75,13 @@ event.snapshot = TakeSnapshot(); DVLOG(1) << "Sending event with snapshot: " << event.snapshot.ToString(); - FOR_EACH_OBSERVER(SyncEngineEventListener, *(context_->listeners()), - OnSyncCycleEvent(event)); + for (auto& observer : *context_->listeners()) + observer.OnSyncCycleEvent(event); } void SyncCycle::SendProtocolEvent(const ProtocolEvent& event) { - FOR_EACH_OBSERVER(SyncEngineEventListener, *(context_->listeners()), - OnProtocolEvent(event)); + for (auto& observer : *context_->listeners()) + observer.OnProtocolEvent(event); } } // namespace syncer
diff --git a/components/sync/engine_impl/cycle/sync_cycle.h b/components/sync/engine_impl/cycle/sync_cycle.h index 2e08606..2c43e181 100644 --- a/components/sync/engine_impl/cycle/sync_cycle.h +++ b/components/sync/engine_impl/cycle/sync_cycle.h
@@ -2,11 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// A class representing an attempt to synchronize the local syncable data -// store with a sync server. A SyncCycle instance is passed as a stateful -// bundle throughout the sync cycle. The SyncCycle is not reused across -// sync cycles; each cycle starts with a new one. - #ifndef COMPONENTS_SYNC_ENGINE_IMPL_CYCLE_SYNC_CYCLE_H_ #define COMPONENTS_SYNC_ENGINE_IMPL_CYCLE_SYNC_CYCLE_H_ @@ -33,6 +28,10 @@ class NudgeTracker; class ProtocolEvent; +// A class representing an attempt to synchronize the local syncable data +// store with a sync server. A SyncCycle instance is passed as a stateful +// bundle throughout the sync cycle. The SyncCycle is not reused across +// sync cycles; each cycle starts with a new one. class SyncCycle { public: // The Delegate services events that occur during the cycle requiring an @@ -123,7 +122,7 @@ // The context for this cycle, guaranteed to outlive |this|. SyncCycleContext* const context_; - // The delegate for this cycle, must never be NULL. + // The delegate for this cycle, must never be null. Delegate* const delegate_; // Our controller for various status and error counters.
diff --git a/components/sync/engine_impl/cycle/sync_cycle_context.h b/components/sync/engine_impl/cycle/sync_cycle_context.h index cedd99e1..b7d50de 100644 --- a/components/sync/engine_impl/cycle/sync_cycle_context.h +++ b/components/sync/engine_impl/cycle/sync_cycle_context.h
@@ -2,16 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// SyncCycleContext encapsulates the contextual information and engine -// components specific to a SyncCycle. Unlike the SyncCycle, the context -// can be reused across several sync cycles. -// -// The context does not take ownership of its pointer members. It's up to -// the surrounding classes to ensure those members remain valid while the -// context is in use. -// -// It can only be used from the SyncerThread. - #ifndef COMPONENTS_SYNC_ENGINE_IMPL_CYCLE_SYNC_CYCLE_CONTEXT_H_ #define COMPONENTS_SYNC_ENGINE_IMPL_CYCLE_SYNC_CYCLE_CONTEXT_H_ @@ -38,6 +28,15 @@ // Default number of items a client can commit in a single message. static const int kDefaultMaxCommitBatchSize = 25; +// SyncCycleContext encapsulates the contextual information and engine +// components specific to a SyncCycle. Unlike the SyncCycle, the context +// can be reused across several sync cycles. +// +// The context does not take ownership of its pointer members. It's up to +// the surrounding classes to ensure those members remain valid while the +// context is in use. +// +// It can only be used from the SyncerThread. class SyncCycleContext { public: SyncCycleContext(ServerConnectionManager* connection_manager,
diff --git a/components/sync/engine_impl/cycle/test_util.h b/components/sync/engine_impl/cycle/test_util.h index 4a558d3..cd49a66 100644 --- a/components/sync/engine_impl/cycle/test_util.h +++ b/components/sync/engine_impl/cycle/test_util.h
@@ -1,8 +1,7 @@ // 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. -// -// Utils to simulate various outcomes of a sync cycle. + #ifndef COMPONENTS_SYNC_ENGINE_IMPL_CYCLE_TEST_UTIL_H_ #define COMPONENTS_SYNC_ENGINE_IMPL_CYCLE_TEST_UTIL_H_ @@ -14,6 +13,8 @@ namespace syncer { namespace test_util { +// Utils to simulate various outcomes of a sync cycle. + // Configure sync cycle successes and failures. void SimulateGetEncryptionKeyFailed( ModelTypeSet requested_types,
diff --git a/components/sync/engine_impl/directory_commit_contribution.h b/components/sync/engine_impl/directory_commit_contribution.h index 9d9a177..c8eb309 100644 --- a/components/sync/engine_impl/directory_commit_contribution.h +++ b/components/sync/engine_impl/directory_commit_contribution.h
@@ -42,7 +42,7 @@ // Build a CommitContribution from the IS_UNSYNCED items in |dir| with the // given |type|. The contribution will include at most |max_items| entries. // - // This function may return NULL if this type has no items ready for and + // This function may return null if this type has no items ready for and // requiring commit. This function may make model neutral changes to the // directory. static std::unique_ptr<DirectoryCommitContribution> Build(
diff --git a/components/sync/engine_impl/directory_update_handler.cc b/components/sync/engine_impl/directory_update_handler.cc index bfea376..259d83e 100644 --- a/components/sync/engine_impl/directory_update_handler.cc +++ b/components/sync/engine_impl/directory_update_handler.cc
@@ -8,6 +8,7 @@ #include <vector> +#include "base/memory/ptr_util.h" #include "components/sync/base/data_type_histogram.h" #include "components/sync/engine_impl/conflict_resolver.h" #include "components/sync/engine_impl/cycle/directory_type_debug_info_emitter.h" @@ -285,8 +286,9 @@ sync_pb::DataTypeProgressMarker current_marker; GetDownloadProgress(¤t_marker); if (current_marker.has_gc_directive()) { - cached_gc_directive_.reset(new sync_pb::GarbageCollectionDirective( - current_marker.gc_directive())); + cached_gc_directive_ = + base::MakeUnique<sync_pb::GarbageCollectionDirective>( + current_marker.gc_directive()); } } @@ -304,8 +306,8 @@ new_gc_directive.version_watermark()); } - cached_gc_directive_.reset( - new sync_pb::GarbageCollectionDirective(new_gc_directive)); + cached_gc_directive_ = + base::MakeUnique<sync_pb::GarbageCollectionDirective>(new_gc_directive); } } // namespace syncer
diff --git a/components/sync/engine_impl/directory_update_handler_unittest.cc b/components/sync/engine_impl/directory_update_handler_unittest.cc index 4dde95ac..64a4e20 100644 --- a/components/sync/engine_impl/directory_update_handler_unittest.cc +++ b/components/sync/engine_impl/directory_update_handler_unittest.cc
@@ -477,7 +477,7 @@ void SetUp() override { dir_maker_.SetUp(); - entry_factory_.reset(new TestEntryFactory(directory())); + entry_factory_ = base::MakeUnique<TestEntryFactory>(directory()); update_handler_map_.insert(std::make_pair( BOOKMARKS, @@ -736,7 +736,7 @@ // Item 'Y' is child of 'X'. entry_factory()->CreateUnsyncedItem(TestIdFactory::MakeServer("Y"), TestIdFactory::MakeServer("X"), "Y", true, - BOOKMARKS, NULL); + BOOKMARKS, nullptr); // If the server's update were applied, we would have X be a child of Y, and Y // as a child of X. That's a directory loop. The UpdateApplicator should @@ -819,7 +819,7 @@ // Create a local child of the server-deleted directory. entry_factory()->CreateUnsyncedItem(TestIdFactory::MakeServer("child"), TestIdFactory::MakeServer("parent"), - "child", false, BOOKMARKS, NULL); + "child", false, BOOKMARKS, nullptr); // The server's request to delete the directory must be ignored, otherwise our // unsynced new child would be orphaned. This is a hierarchy conflict.
diff --git a/components/sync/engine_impl/js_mutation_event_observer.cc b/components/sync/engine_impl/js_mutation_event_observer.cc index 976c26b9..a4af4da 100644 --- a/components/sync/engine_impl/js_mutation_event_observer.cc +++ b/components/sync/engine_impl/js_mutation_event_observer.cc
@@ -53,7 +53,7 @@ details.SetString("modelType", ModelTypeToString(model_type)); details.SetString("writeTransactionId", base::Int64ToString(write_transaction_id)); - base::Value* changes_value = NULL; + base::Value* changes_value = nullptr; const size_t changes_size = changes.Get().size(); if (changes_size <= kChangeLimit) { base::ListValue* changes_list = new base::ListValue();
diff --git a/components/sync/engine_impl/model_type_registry.cc b/components/sync/engine_impl/model_type_registry.cc index 9854d5b..9cabe00 100644 --- a/components/sync/engine_impl/model_type_registry.cc +++ b/components/sync/engine_impl/model_type_registry.cc
@@ -100,7 +100,7 @@ scoped_refptr<ModelSafeWorker> worker = worker_it->second; // DebugInfoEmitters are never deleted. Use existing one if we have it. - DirectoryTypeDebugInfoEmitter* emitter = NULL; + DirectoryTypeDebugInfoEmitter* emitter = nullptr; DirectoryTypeDebugInfoEmitterMap::iterator it = directory_type_debug_info_emitter_map_.find(type); if (it != directory_type_debug_info_emitter_map_.end()) { @@ -146,7 +146,7 @@ std::unique_ptr<Cryptographer> cryptographer_copy; if (encrypted_types_.Has(type)) - cryptographer_copy.reset(new Cryptographer(*cryptographer_)); + cryptographer_copy = base::MakeUnique<Cryptographer>(*cryptographer_); std::unique_ptr<ModelTypeWorker> worker(new ModelTypeWorker( type, activation_context->model_type_state, std::move(cryptographer_copy), @@ -276,7 +276,7 @@ void ModelTypeRegistry::OnCryptographerStateChanged( Cryptographer* cryptographer) { - cryptographer_.reset(new Cryptographer(*cryptographer)); + cryptographer_ = base::MakeUnique<Cryptographer>(*cryptographer); OnEncryptionStateChanged(); }
diff --git a/components/sync/engine_impl/model_type_registry.h b/components/sync/engine_impl/model_type_registry.h index 2e217747..9e4ce33e 100644 --- a/components/sync/engine_impl/model_type_registry.h +++ b/components/sync/engine_impl/model_type_registry.h
@@ -22,23 +22,20 @@ #include "components/sync/engine_impl/nudge_handler.h" namespace syncer { + +class CommitContributor; +class DirectoryCommitContributor; +class DirectoryTypeDebugInfoEmitter; +class DirectoryUpdateHandler; class ModelTypeProcessor; class ModelTypeWorker; +class UpdateHandler; struct ModelTypeState; -} - -namespace syncer { namespace syncable { class Directory; } // namespace syncable -class CommitContributor; -class DirectoryCommitContributor; -class DirectoryUpdateHandler; -class DirectoryTypeDebugInfoEmitter; -class UpdateHandler; - typedef std::map<ModelType, UpdateHandler*> UpdateHandlerMap; typedef std::map<ModelType, CommitContributor*> CommitContributorMap; typedef std::map<ModelType, DirectoryTypeDebugInfoEmitter*>
diff --git a/components/sync/engine_impl/model_type_registry_unittest.cc b/components/sync/engine_impl/model_type_registry_unittest.cc index e0a73a2..948b1f5a 100644 --- a/components/sync/engine_impl/model_type_registry_unittest.cc +++ b/components/sync/engine_impl/model_type_registry_unittest.cc
@@ -81,8 +81,8 @@ workers_.push_back(ui_worker); workers_.push_back(db_worker); - registry_.reset( - new ModelTypeRegistry(workers_, directory(), &mock_nudge_handler_)); + registry_ = base::MakeUnique<ModelTypeRegistry>(workers_, directory(), + &mock_nudge_handler_); } void ModelTypeRegistryTest::TearDown() {
diff --git a/components/sync/engine_impl/model_type_worker.h b/components/sync/engine_impl/model_type_worker.h index c5fb715..4d48041 100644 --- a/components/sync/engine_impl/model_type_worker.h +++ b/components/sync/engine_impl/model_type_worker.h
@@ -152,7 +152,7 @@ // A private copy of the most recent cryptographer known to sync. // Initialized at construction time and updated with UpdateCryptographer(). - // NULL if encryption is not enabled for this type. + // null if encryption is not enabled for this type. std::unique_ptr<Cryptographer> cryptographer_; // Interface used to access and send nudges to the sync scheduler. Not owned.
diff --git a/components/sync/engine_impl/model_type_worker_unittest.cc b/components/sync/engine_impl/model_type_worker_unittest.cc index 47b5385f..ca1cc97 100644 --- a/components/sync/engine_impl/model_type_worker_unittest.cc +++ b/components/sync/engine_impl/model_type_worker_unittest.cc
@@ -185,19 +185,19 @@ std::unique_ptr<Cryptographer> cryptographer_copy; if (cryptographer_) { - cryptographer_copy.reset(new Cryptographer(*cryptographer_)); + cryptographer_copy = base::MakeUnique<Cryptographer>(*cryptographer_); } // TODO(maxbogue): crbug.com/529498: Inject pending updates somehow. - worker_.reset( - new ModelTypeWorker(kModelType, state, std::move(cryptographer_copy), - &mock_nudge_handler_, std::move(processor))); + worker_ = base::MakeUnique<ModelTypeWorker>( + kModelType, state, std::move(cryptographer_copy), &mock_nudge_handler_, + std::move(processor)); } // Introduce a new key that the local cryptographer can't decrypt. void NewForeignEncryptionKey() { if (!cryptographer_) { - cryptographer_.reset(new Cryptographer(&fake_encryptor_)); + cryptographer_ = base::MakeUnique<Cryptographer>(&fake_encryptor_); } foreign_encryption_key_index_++; @@ -244,7 +244,7 @@ // Update the local cryptographer with all relevant keys. void UpdateLocalCryptographer() { if (!cryptographer_) { - cryptographer_.reset(new Cryptographer(&fake_encryptor_)); + cryptographer_ = base::MakeUnique<Cryptographer>(&fake_encryptor_); } KeyParams params = GetNthKeyParams(foreign_encryption_key_index_);
diff --git a/components/sync/engine_impl/net/server_connection_manager.cc b/components/sync/engine_impl/net/server_connection_manager.cc index 21da65b..9aa63e8 100644 --- a/components/sync/engine_impl/net/server_connection_manager.cc +++ b/components/sync/engine_impl/net/server_connection_manager.cc
@@ -158,7 +158,7 @@ proto_sync_path_(kSyncServerSyncPath), server_status_(HttpResponse::NONE), terminated_(false), - active_connection_(NULL), + active_connection_(nullptr), cancelation_signal_(cancelation_signal), signal_handler_registered_(false) { signal_handler_registered_ = cancelation_signal_->TryRegisterHandler(this); @@ -181,7 +181,7 @@ base::AutoLock lock(terminate_connection_lock_); DCHECK(!active_connection_); if (terminated_) - return NULL; + return nullptr; active_connection_ = MakeConnection(); return active_connection_; @@ -190,13 +190,13 @@ void ServerConnectionManager::OnConnectionDestroyed(Connection* connection) { DCHECK(connection); base::AutoLock lock(terminate_connection_lock_); - // |active_connection_| can be NULL already if it was aborted. Also, + // |active_connection_| can be null already if it was aborted. Also, // it can legitimately be a different Connection object if a new Connection // was created after a previous one was Aborted and destroyed. if (active_connection_ != connection) return; - active_connection_ = NULL; + active_connection_ = nullptr; } bool ServerConnectionManager::SetAuthToken(const std::string& auth_token) { @@ -240,9 +240,8 @@ void ServerConnectionManager::NotifyStatusChanged() { DCHECK(thread_checker_.CalledOnValidThread()); - FOR_EACH_OBSERVER( - ServerConnectionEventListener, listeners_, - OnServerConnectionEvent(ServerConnectionEvent(server_status_))); + for (auto& observer : listeners_) + observer.OnServerConnectionEvent(ServerConnectionEvent(server_status_)); } bool ServerConnectionManager::PostBufferWithCachedAuth( @@ -312,7 +311,7 @@ } ServerConnectionManager::Connection* ServerConnectionManager::MakeConnection() { - return NULL; // For testing. + return nullptr; // For testing. } void ServerConnectionManager::OnSignalReceived() { @@ -323,7 +322,7 @@ // Sever our ties to this connection object. Note that it still may exist, // since we don't own it, but it has been neutered. - active_connection_ = NULL; + active_connection_ = nullptr; } std::ostream& operator<<(std::ostream& s, const struct HttpResponse& hr) {
diff --git a/components/sync/engine_impl/net/server_connection_manager.h b/components/sync/engine_impl/net/server_connection_manager.h index 53ad716a..b3aee3b 100644 --- a/components/sync/engine_impl/net/server_connection_manager.h +++ b/components/sync/engine_impl/net/server_connection_manager.h
@@ -230,7 +230,7 @@ // Helper to check terminated flags and build a Connection object, installing // it as the |active_connection_|. If this ServerConnectionManager has been - // terminated, this will return NULL. + // terminated, this will return null. Connection* MakeActiveConnection(); // Called by Connection objects as they are destroyed to allow the
diff --git a/components/sync/engine_impl/net/sync_server_connection_manager.cc b/components/sync/engine_impl/net/sync_server_connection_manager.cc index 6e96550bb..55b5803 100644 --- a/components/sync/engine_impl/net/sync_server_connection_manager.cc +++ b/components/sync/engine_impl/net/sync_server_connection_manager.cc
@@ -22,7 +22,7 @@ SyncBridgedConnection::~SyncBridgedConnection() { DCHECK(post_provider_); factory_->Destroy(post_provider_); - post_provider_ = NULL; + post_provider_ = nullptr; } bool SyncBridgedConnection::Init(const char* path,
diff --git a/components/sync/engine_impl/net/url_translator.cc b/components/sync/engine_impl/net/url_translator.cc index a258fc10..478aa91a 100644 --- a/components/sync/engine_impl/net/url_translator.cc +++ b/components/sync/engine_impl/net/url_translator.cc
@@ -1,9 +1,6 @@ // 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. -// -// Contains the definition of a few helper functions used for generating sync -// URLs. #include "components/sync/engine_impl/net/url_translator.h"
diff --git a/components/sync/engine_impl/net/url_translator.h b/components/sync/engine_impl/net/url_translator.h index 0ba8074..bec8384 100644 --- a/components/sync/engine_impl/net/url_translator.h +++ b/components/sync/engine_impl/net/url_translator.h
@@ -1,9 +1,6 @@ // 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. -// -// Contains the declaration of a few helper functions used for generating sync -// URLs. #ifndef COMPONENTS_SYNC_ENGINE_IMPL_NET_URL_TRANSLATOR_H_ #define COMPONENTS_SYNC_ENGINE_IMPL_NET_URL_TRANSLATOR_H_ @@ -12,6 +9,9 @@ namespace syncer { +// Contains the declaration of a few helper functions used for generating sync +// URLs. + // Convenience wrappers around CgiEscapePath(), used by gaia_auth. std::string CgiEscapeString(const char* src); std::string CgiEscapeString(const std::string& src);
diff --git a/components/sync/engine_impl/sync_encryption_handler_impl.cc b/components/sync/engine_impl/sync_encryption_handler_impl.cc index f552d57..c047c75 100644 --- a/components/sync/engine_impl/sync_encryption_handler_impl.cc +++ b/components/sync/engine_impl/sync_encryption_handler_impl.cc
@@ -172,10 +172,10 @@ JSONStringValueDeserializer json(decrypted_keystore_bootstrap); std::unique_ptr<base::Value> deserialized_keystore_keys( - json.Deserialize(NULL, NULL)); + json.Deserialize(nullptr, nullptr)); if (!deserialized_keystore_keys) return false; - base::ListValue* internal_list_value = NULL; + base::ListValue* internal_list_value = nullptr; if (!deserialized_keystore_keys->GetAsList(&internal_list_value)) return false; int number_of_keystore_keys = internal_list_value->GetSize();
diff --git a/components/sync/engine_impl/sync_encryption_handler_impl_unittest.cc b/components/sync/engine_impl/sync_encryption_handler_impl_unittest.cc index 0b6cc1a9..3abb3e1b 100644 --- a/components/sync/engine_impl/sync_encryption_handler_impl_unittest.cc +++ b/components/sync/engine_impl/sync_encryption_handler_impl_unittest.cc
@@ -10,6 +10,7 @@ #include "base/base64.h" #include "base/json/json_string_value_serializer.h" +#include "base/memory/ptr_util.h" #include "base/run_loop.h" #include "base/tracked_objects.h" #include "components/sync/base/fake_encryptor.h" @@ -95,9 +96,9 @@ void SetUpEncryptionWithKeyForBootstrapping( const std::string& key_for_bootstrapping) { - encryption_handler_.reset(new SyncEncryptionHandlerImpl( + encryption_handler_ = base::MakeUnique<SyncEncryptionHandlerImpl>( user_share(), &encryptor_, key_for_bootstrapping, - std::string() /* keystore key for bootstrapping */)); + std::string() /* keystore key for bootstrapping */); encryption_handler_->AddObserver(&observer_); } @@ -654,9 +655,9 @@ decoded_bootstrap, &decrypted_bootstrap)); JSONStringValueDeserializer json(decrypted_bootstrap); std::unique_ptr<base::Value> deserialized_keystore_keys( - json.Deserialize(NULL, NULL)); + json.Deserialize(nullptr, nullptr)); ASSERT_TRUE(deserialized_keystore_keys.get()); - base::ListValue* keystore_list = NULL; + base::ListValue* keystore_list = nullptr; deserialized_keystore_keys->GetAsList(&keystore_list); ASSERT_TRUE(keystore_list); ASSERT_EQ(2U, keystore_list->GetSize());
diff --git a/components/sync/engine_impl/sync_manager_impl.cc b/components/sync/engine_impl/sync_manager_impl.cc index c0d18be..6a6b6be 100644 --- a/components/sync/engine_impl/sync_manager_impl.cc +++ b/components/sync/engine_impl/sync_manager_impl.cc
@@ -84,7 +84,7 @@ SyncManagerImpl::SyncManagerImpl(const std::string& name) : name_(name), - change_delegate_(NULL), + change_delegate_(nullptr), initialized_(false), observing_network_connectivity_changes_(false), weak_ptr_factory_(this) { @@ -240,9 +240,9 @@ allstatus_.SetHasKeystoreKey( !args->restored_keystore_key_for_bootstrapping.empty()); - sync_encryption_handler_.reset(new SyncEncryptionHandlerImpl( + sync_encryption_handler_ = base::MakeUnique<SyncEncryptionHandlerImpl>( &share_, args->encryptor, args->restored_key_for_bootstrapping, - args->restored_keystore_key_for_bootstrapping)); + args->restored_keystore_key_for_bootstrapping); sync_encryption_handler_->AddObserver(this); sync_encryption_handler_->AddObserver(&debug_info_event_listener_); sync_encryption_handler_->AddObserver(&js_sync_encryption_handler_observer_); @@ -256,10 +256,10 @@ args->credentials.account_id, absolute_db_path); DCHECK(backing_store.get()); - share_.directory.reset(new syncable::Directory( + share_.directory = base::MakeUnique<syncable::Directory>( backing_store.release(), args->unrecoverable_error_handler, report_unrecoverable_error_function_, sync_encryption_handler_.get(), - sync_encryption_handler_->GetCryptographerUnsafe())); + sync_encryption_handler_->GetCryptographerUnsafe()); share_.sync_credentials = args->credentials; // UserShare is accessible to a lot of code that doesn't need access to the @@ -281,11 +281,11 @@ args->saved_nigori_state.reset(); } - connection_manager_.reset(new SyncServerConnectionManager( + connection_manager_ = base::MakeUnique<SyncServerConnectionManager>( args->service_url.host() + args->service_url.path(), args->service_url.EffectiveIntPort(), args->service_url.SchemeIsCryptographic(), args->post_factory.release(), - args->cancelation_signal)); + args->cancelation_signal); connection_manager_->set_client_id(directory()->cache_guid()); connection_manager_->AddListener(this); @@ -296,8 +296,8 @@ DVLOG(1) << "Setting invalidator client ID: " << args->invalidator_client_id; allstatus_.SetInvalidatorClientId(args->invalidator_client_id); - model_type_registry_.reset( - new ModelTypeRegistry(args->workers, directory(), this)); + model_type_registry_ = + base::MakeUnique<ModelTypeRegistry>(args->workers, directory(), this); sync_encryption_handler_->AddObserver(model_type_registry_.get()); // Build a SyncCycleContext and store the worker in it. @@ -525,7 +525,7 @@ RemoveObserver(&debug_info_event_listener_); - // |connection_manager_| may end up being NULL here in tests (in synchronous + // |connection_manager_| may end up being null here in tests (in synchronous // initialization mode). // // TODO(akalin): Fix this behavior. @@ -543,7 +543,7 @@ share_.directory.reset(); - change_delegate_ = NULL; + change_delegate_ = nullptr; initialized_ = false;
diff --git a/components/sync/engine_impl/sync_manager_impl_unittest.cc b/components/sync/engine_impl/sync_manager_impl_unittest.cc index d158f128..132bab6 100644 --- a/components/sync/engine_impl/sync_manager_impl_unittest.cc +++ b/components/sync/engine_impl/sync_manager_impl_unittest.cc
@@ -2,10 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// Unit tests for the SyncApi. Note that a lot of the underlying -// functionality is provided by the Syncable layer, which has its own -// unit tests. We'll test SyncApi specific things in this harness. - #include "components/sync/engine_impl/sync_manager_impl.h" #include <cstddef> @@ -220,6 +216,9 @@ } // namespace +// Unit tests for the SyncApi. Note that a lot of the underlying +// functionality is provided by the Syncable layer, which has its own +// unit tests. We'll test SyncApi specific things in this harness. class SyncApiTest : public testing::Test { public: void SetUp() override { test_user_share_.SetUp(); } @@ -436,7 +435,7 @@ // we'll use this spare folder later WriteNode folder_node(&trans); - EXPECT_TRUE(folder_node.InitBookmarkByCreation(root_node, NULL)); + EXPECT_TRUE(folder_node.InitBookmarkByCreation(root_node, nullptr)); folder_id = folder_node.GetId(); WriteNode wnode(&trans); @@ -550,7 +549,7 @@ root_node.InitByRootLookup(); WriteNode bookmark_node(&trans); - ASSERT_TRUE(bookmark_node.InitBookmarkByCreation(root_node, NULL)); + ASSERT_TRUE(bookmark_node.InitBookmarkByCreation(root_node, nullptr)); bookmark_id = bookmark_node.GetId(); bookmark_node.SetTitle("foo"); @@ -587,7 +586,7 @@ root_node.InitByRootLookup(); WriteNode bookmark_node(&trans); - ASSERT_TRUE(bookmark_node.InitBookmarkByCreation(root_node, NULL)); + ASSERT_TRUE(bookmark_node.InitBookmarkByCreation(root_node, nullptr)); bookmark_id = bookmark_node.GetId(); bookmark_node.SetTitle(""); } @@ -671,7 +670,7 @@ TEST_F(SyncApiTest, GetTotalNodeCountOneChild) { int64_t type_root = MakeTypeRoot(user_share(), BOOKMARKS); int64_t parent = - MakeFolderWithParent(user_share(), BOOKMARKS, type_root, NULL); + MakeFolderWithParent(user_share(), BOOKMARKS, type_root, nullptr); EXPECT_EQ(2, GetTotalNodeCount(user_share(), type_root)); EXPECT_EQ(1, GetTotalNodeCount(user_share(), parent)); } @@ -681,11 +680,13 @@ TEST_F(SyncApiTest, GetTotalNodeCountMultipleChildren) { int64_t type_root = MakeTypeRoot(user_share(), BOOKMARKS); int64_t parent = - MakeFolderWithParent(user_share(), BOOKMARKS, type_root, NULL); - ignore_result(MakeFolderWithParent(user_share(), BOOKMARKS, type_root, NULL)); - int64_t child1 = MakeFolderWithParent(user_share(), BOOKMARKS, parent, NULL); - ignore_result(MakeBookmarkWithParent(user_share(), parent, NULL)); - ignore_result(MakeBookmarkWithParent(user_share(), child1, NULL)); + MakeFolderWithParent(user_share(), BOOKMARKS, type_root, nullptr); + ignore_result( + MakeFolderWithParent(user_share(), BOOKMARKS, type_root, nullptr)); + int64_t child1 = + MakeFolderWithParent(user_share(), BOOKMARKS, parent, nullptr); + ignore_result(MakeBookmarkWithParent(user_share(), parent, nullptr)); + ignore_result(MakeBookmarkWithParent(user_share(), child1, nullptr)); EXPECT_EQ(6, GetTotalNodeCount(user_share(), type_root)); EXPECT_EQ(4, GetTotalNodeCount(user_share(), parent)); } @@ -1291,11 +1292,11 @@ // Create some unencrypted unsynced data. int64_t folder = MakeFolderWithParent(sync_manager_.GetUserShare(), BOOKMARKS, - GetIdForDataType(BOOKMARKS), NULL); + GetIdForDataType(BOOKMARKS), nullptr); // First batch_size nodes are children of folder. size_t i; for (i = 0; i < batch_size; ++i) { - MakeBookmarkWithParent(sync_manager_.GetUserShare(), folder, NULL); + MakeBookmarkWithParent(sync_manager_.GetUserShare(), folder, nullptr); } // Next batch_size nodes are a different type and on their own. for (; i < 2 * batch_size; ++i) { @@ -1807,7 +1808,7 @@ ReadNode bookmark_root(&trans); ASSERT_EQ(BaseNode::INIT_OK, bookmark_root.InitTypeRoot(BOOKMARKS)); WriteNode node(&trans); - ASSERT_TRUE(node.InitBookmarkByCreation(bookmark_root, NULL)); + ASSERT_TRUE(node.InitBookmarkByCreation(bookmark_root, nullptr)); node.SetIsFolder(false); node.SetTitle(title); @@ -2569,7 +2570,7 @@ class SyncManagerTestWithMockScheduler : public SyncManagerTest { public: - SyncManagerTestWithMockScheduler() : scheduler_(NULL) {} + SyncManagerTestWithMockScheduler() : scheduler_(nullptr) {} EngineComponentsFactory* GetFactory() override { scheduler_ = new MockSyncScheduler(); return new ComponentsFactory(GetSwitches(), scheduler_, &cycle_context_,
diff --git a/components/sync/engine_impl/sync_scheduler.h b/components/sync/engine_impl/sync_scheduler.h index 1133f07..ba60af8 100644 --- a/components/sync/engine_impl/sync_scheduler.h +++ b/components/sync/engine_impl/sync_scheduler.h
@@ -1,8 +1,7 @@ // Copyright 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 class to schedule syncer tasks intelligently. + #ifndef COMPONENTS_SYNC_ENGINE_IMPL_SYNC_SCHEDULER_H_ #define COMPONENTS_SYNC_ENGINE_IMPL_SYNC_SCHEDULER_H_ @@ -56,6 +55,7 @@ base::Closure report_success_task; }; +// A class to schedule syncer tasks intelligently. class SyncScheduler : public SyncCycle::Delegate { public: enum Mode {
diff --git a/components/sync/engine_impl/sync_scheduler_impl.cc b/components/sync/engine_impl/sync_scheduler_impl.cc index 204f8907..9f8f3fd 100644 --- a/components/sync/engine_impl/sync_scheduler_impl.cc +++ b/components/sync/engine_impl/sync_scheduler_impl.cc
@@ -12,6 +12,7 @@ #include "base/bind_helpers.h" #include "base/location.h" #include "base/logging.h" +#include "base/memory/ptr_util.h" #include "base/single_thread_task_runner.h" #include "base/threading/platform_thread.h" #include "base/threading/thread_task_runner_handle.h" @@ -281,8 +282,8 @@ std::unique_ptr<SyncCycle> dummy(SyncCycle::Build(cycle_context_, this)); SyncCycleEvent event(SyncCycleEvent::STATUS_CHANGED); event.snapshot = dummy->TakeSnapshot(); - FOR_EACH_OBSERVER(SyncEngineEventListener, *cycle_context_->listeners(), - OnSyncCycleEvent(event)); + for (auto& observer : *cycle_context_->listeners()) + observer.OnSyncCycleEvent(event); } namespace { @@ -324,7 +325,7 @@ // Only reconfigure if we have types to download. if (!params.types_to_download.Empty()) { - pending_configure_params_.reset(new ConfigurationParams(params)); + pending_configure_params_ = base::MakeUnique<ConfigurationParams>(params); TrySyncCycleJob(); } else { SDVLOG(2) << "No change in routing info, calling ready task directly."; @@ -338,7 +339,7 @@ DCHECK(!pending_configure_params_); DCHECK(!params.report_success_task.is_null()); CHECK(started_) << "Scheduler must be running to clear."; - pending_clear_params_.reset(new ClearParams(params)); + pending_clear_params_ = base::MakeUnique<ClearParams>(params); TrySyncCycleJob(); } @@ -517,7 +518,7 @@ void SyncSchedulerImpl::DoConfigurationSyncCycleJob(JobPriority priority) { DCHECK(CalledOnValidThread()); DCHECK_EQ(mode_, CONFIGURATION_MODE); - DCHECK(pending_configure_params_ != NULL); + DCHECK(pending_configure_params_ != nullptr); if (!CanRunJobNow(priority)) { SDVLOG(2) << "Unable to run configure job right now."; @@ -583,15 +584,15 @@ // Setup our backoff if this is our first such failure. TimeDelta length = delay_provider_->GetDelay( delay_provider_->GetInitialDelay(model_neutral_state)); - wait_interval_.reset( - new WaitInterval(WaitInterval::EXPONENTIAL_BACKOFF, length)); + wait_interval_ = base::MakeUnique<WaitInterval>( + WaitInterval::EXPONENTIAL_BACKOFF, length); SDVLOG(2) << "Sync cycle failed. Will back off for " << wait_interval_->length.InMilliseconds() << "ms."; } else { // Increase our backoff interval and schedule another retry. TimeDelta length = delay_provider_->GetDelay(wait_interval_->length); - wait_interval_.reset( - new WaitInterval(WaitInterval::EXPONENTIAL_BACKOFF, length)); + wait_interval_ = base::MakeUnique<WaitInterval>( + WaitInterval::EXPONENTIAL_BACKOFF, length); SDVLOG(2) << "Sync cycle failed. Will back off for " << wait_interval_->length.InMilliseconds() << "ms."; } @@ -769,8 +770,8 @@ // been cleared, then we should increase our backoff interval and schedule // another retry. TimeDelta length = delay_provider_->GetDelay(wait_interval_->length); - wait_interval_.reset( - new WaitInterval(WaitInterval::EXPONENTIAL_BACKOFF, length)); + wait_interval_ = base::MakeUnique<WaitInterval>( + WaitInterval::EXPONENTIAL_BACKOFF, length); SDVLOG(2) << "Sync cycle failed. Will back off for " << wait_interval_->length.InMilliseconds() << "ms."; RestartWaiting(); @@ -843,13 +844,13 @@ } void SyncSchedulerImpl::NotifyRetryTime(base::Time retry_time) { - FOR_EACH_OBSERVER(SyncEngineEventListener, *cycle_context_->listeners(), - OnRetryTimeChanged(retry_time)); + for (auto& observer : *cycle_context_->listeners()) + observer.OnRetryTimeChanged(retry_time); } void SyncSchedulerImpl::NotifyThrottledTypesChanged(ModelTypeSet types) { - FOR_EACH_OBSERVER(SyncEngineEventListener, *cycle_context_->listeners(), - OnThrottledTypesChanged(types)); + for (auto& observer : *cycle_context_->listeners()) + observer.OnThrottledTypesChanged(types); } bool SyncSchedulerImpl::IsBackingOff() const { @@ -860,8 +861,8 @@ void SyncSchedulerImpl::OnThrottled(const base::TimeDelta& throttle_duration) { DCHECK(CalledOnValidThread()); - wait_interval_.reset( - new WaitInterval(WaitInterval::THROTTLED, throttle_duration)); + wait_interval_ = base::MakeUnique<WaitInterval>(WaitInterval::THROTTLED, + throttle_duration); NotifyRetryTime(base::Time::Now() + wait_interval_->length); NotifyThrottledTypesChanged(ModelTypeSet::All()); } @@ -934,8 +935,8 @@ } if (IsActionableError(sync_protocol_error)) { SDVLOG(2) << "OnActionableError"; - FOR_EACH_OBSERVER(SyncEngineEventListener, *cycle_context_->listeners(), - OnActionableError(sync_protocol_error)); + for (auto& observer : *cycle_context_->listeners()) + observer.OnActionableError(sync_protocol_error); } } @@ -946,8 +947,8 @@ } void SyncSchedulerImpl::OnReceivedMigrationRequest(ModelTypeSet types) { - FOR_EACH_OBSERVER(SyncEngineEventListener, *cycle_context_->listeners(), - OnMigrationRequested(types)); + for (auto& observer : *cycle_context_->listeners()) + observer.OnMigrationRequested(types); } void SyncSchedulerImpl::SetNotificationsEnabled(bool notifications_enabled) {
diff --git a/components/sync/engine_impl/sync_scheduler_impl_unittest.cc b/components/sync/engine_impl/sync_scheduler_impl_unittest.cc index 732f90e..1d121a9 100644 --- a/components/sync/engine_impl/sync_scheduler_impl_unittest.cc +++ b/components/sync/engine_impl/sync_scheduler_impl_unittest.cc
@@ -11,6 +11,7 @@ #include "base/bind.h" #include "base/location.h" +#include "base/memory/ptr_util.h" #include "base/run_loop.h" #include "base/single_thread_task_runner.h" #include "base/test/test_timeouts.h" @@ -56,7 +57,7 @@ MOCK_METHOD2(PollSyncShare, bool(ModelTypeSet, SyncCycle*)); }; -MockSyncer::MockSyncer() : Syncer(NULL) {} +MockSyncer::MockSyncer() : Syncer(nullptr) {} typedef std::vector<TimeTicks> SyncShareTimes; @@ -110,7 +111,7 @@ class SyncSchedulerImplTest : public testing::Test { public: SyncSchedulerImplTest() - : syncer_(NULL), delay_(NULL), weak_ptr_factory_(this) {} + : syncer_(nullptr), delay_(nullptr), weak_ptr_factory_(this) {} class MockDelayProvider : public BackoffDelayProvider { public: @@ -125,7 +126,7 @@ void SetUp() override { dir_maker_.SetUp(); syncer_ = new testing::StrictMock<MockSyncer>(); - delay_ = NULL; + delay_ = nullptr; extensions_activity_ = new ExtensionsActivity(); routing_info_[THEMES] = GROUP_UI; @@ -138,26 +139,26 @@ workers_.push_back(make_scoped_refptr(new FakeModelWorker(GROUP_DB))); workers_.push_back(make_scoped_refptr(new FakeModelWorker(GROUP_PASSIVE))); - connection_.reset( - new MockConnectionManager(directory(), &cancelation_signal_)); + connection_ = base::MakeUnique<MockConnectionManager>(directory(), + &cancelation_signal_); connection_->SetServerReachable(); - model_type_registry_.reset( - new ModelTypeRegistry(workers_, directory(), &mock_nudge_handler_)); + model_type_registry_ = base::MakeUnique<ModelTypeRegistry>( + workers_, directory(), &mock_nudge_handler_); - context_.reset(new SyncCycleContext( + context_ = base::MakeUnique<SyncCycleContext>( connection_.get(), directory(), extensions_activity_.get(), - std::vector<SyncEngineEventListener*>(), NULL, + std::vector<SyncEngineEventListener*>(), nullptr, model_type_registry_.get(), true, // enable keystore encryption false, // force enable pre-commit GU avoidance - "fake_invalidator_client_id")); + "fake_invalidator_client_id"); context_->SetRoutingInfo(routing_info_); context_->set_notifications_enabled(true); context_->set_account_name("Test"); - scheduler_.reset(new SyncSchedulerImpl("TestSyncScheduler", - BackoffDelayProvider::FromDefaults(), - context(), syncer_)); + scheduler_ = base::MakeUnique<SyncSchedulerImpl>( + "TestSyncScheduler", BackoffDelayProvider::FromDefaults(), context(), + syncer_); scheduler_->SetDefaultNudgeDelay(default_delay()); }
diff --git a/components/sync/engine_impl/syncer_proto_util.cc b/components/sync/engine_impl/syncer_proto_util.cc index aaf338dbf..9efd9291 100644 --- a/components/sync/engine_impl/syncer_proto_util.cc +++ b/components/sync/engine_impl/syncer_proto_util.cc
@@ -498,7 +498,7 @@ cycle->delegate()->OnTypesThrottled( sync_protocol_error.error_data_types, GetThrottleDelay(*response)); } - if (partial_failure_data_types != NULL) { + if (partial_failure_data_types != nullptr) { *partial_failure_data_types = sync_protocol_error.error_data_types; } return SERVER_RETURN_PARTIAL_FAILURE;
diff --git a/components/sync/engine_impl/syncer_proto_util_unittest.cc b/components/sync/engine_impl/syncer_proto_util_unittest.cc index 6e39cd7b..4efb8ed 100644 --- a/components/sync/engine_impl/syncer_proto_util_unittest.cc +++ b/components/sync/engine_impl/syncer_proto_util_unittest.cc
@@ -248,11 +248,11 @@ dcm.set_send_error(true); EXPECT_FALSE( - SyncerProtoUtil::PostAndProcessHeaders(&dcm, NULL, msg, &response)); + SyncerProtoUtil::PostAndProcessHeaders(&dcm, nullptr, msg, &response)); dcm.set_send_error(false); EXPECT_TRUE( - SyncerProtoUtil::PostAndProcessHeaders(&dcm, NULL, msg, &response)); + SyncerProtoUtil::PostAndProcessHeaders(&dcm, nullptr, msg, &response)); } } // namespace syncer
diff --git a/components/sync/engine_impl/syncer_unittest.cc b/components/sync/engine_impl/syncer_unittest.cc index 2acd8e0c..d2a761be6 100644 --- a/components/sync/engine_impl/syncer_unittest.cc +++ b/components/sync/engine_impl/syncer_unittest.cc
@@ -1,9 +1,6 @@ // Copyright 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. -// -// Syncer unit tests. Unfortunately a lot of these tests -// are outdated and need to be reworked and updated. #include "components/sync/engine_impl/syncer.h" @@ -21,6 +18,7 @@ #include "base/bind_helpers.h" #include "base/compiler_specific.h" #include "base/location.h" +#include "base/memory/ptr_util.h" #include "base/message_loop/message_loop.h" #include "base/strings/string_number_conversions.h" #include "base/test/histogram_tester.h" @@ -174,13 +172,15 @@ } // namespace +// Syncer unit tests. Unfortunately a lot of these tests +// are outdated and need to be reworked and updated. class SyncerTest : public testing::Test, public SyncCycle::Delegate, public SyncEngineEventListener { protected: SyncerTest() : extensions_activity_(new ExtensionsActivity), - syncer_(NULL), + syncer_(nullptr), last_client_invalidation_hint_buffer_size_(10) {} // SyncCycle::Delegate implementation. @@ -266,9 +266,9 @@ void SetUp() override { dir_maker_.SetUp(); - mock_server_.reset( - new MockConnectionManager(directory(), &cancelation_signal_)); - debug_info_getter_.reset(new MockDebugInfoGetter); + mock_server_ = base::MakeUnique<MockConnectionManager>( + directory(), &cancelation_signal_); + debug_info_getter_ = base::MakeUnique<MockDebugInfoGetter>(); EnableDatatype(BOOKMARKS); EnableDatatype(EXTENSIONS); EnableDatatype(NIGORI); @@ -282,24 +282,24 @@ ModelSafeRoutingInfo routing_info; GetModelSafeRoutingInfo(&routing_info); - model_type_registry_.reset( - new ModelTypeRegistry(workers_, directory(), &mock_nudge_handler_)); + model_type_registry_ = base::MakeUnique<ModelTypeRegistry>( + workers_, directory(), &mock_nudge_handler_); model_type_registry_->RegisterDirectoryTypeDebugInfoObserver( &debug_info_cache_); - context_.reset(new SyncCycleContext( + context_ = base::MakeUnique<SyncCycleContext>( mock_server_.get(), directory(), extensions_activity_.get(), listeners, debug_info_getter_.get(), model_type_registry_.get(), true, // enable keystore encryption false, // force enable pre-commit GU avoidance experiment - "fake_invalidator_client_id")); + "fake_invalidator_client_id"); context_->SetRoutingInfo(routing_info); syncer_ = new Syncer(&cancelation_signal_); - scheduler_.reset(new SyncSchedulerImpl( + scheduler_ = base::MakeUnique<SyncSchedulerImpl>( "TestSyncScheduler", BackoffDelayProvider::FromDefaults(), context_.get(), // scheduler_ owned syncer_ now and will manage the memory of syncer_ - syncer_)); + syncer_); syncable::ReadTransaction trans(FROM_HERE, directory()); Directory::Metahandles children;
diff --git a/components/sync/engine_impl/syncer_util.h b/components/sync/engine_impl/syncer_util.h index 42abcb1b..264fae1 100644 --- a/components/sync/engine_impl/syncer_util.h +++ b/components/sync/engine_impl/syncer_util.h
@@ -1,9 +1,6 @@ // 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. -// -// Utility functions manipulating syncable::Entries, intended for use by the -// syncer. #ifndef COMPONENTS_SYNC_ENGINE_IMPL_SYNCER_UTIL_H_ #define COMPONENTS_SYNC_ENGINE_IMPL_SYNCER_UTIL_H_ @@ -34,6 +31,9 @@ class Cryptographer; +// Utility functions manipulating syncable::Entries, intended for use by the +// syncer. + // If the server sent down a client-tagged entry, or an entry whose // commit response was lost, it is necessary to update a local entry // with an ID that doesn't match the ID of the update. Here, we
diff --git a/components/sync/engine_impl/syncer_util_unittest.cc b/components/sync/engine_impl/syncer_util_unittest.cc index 5c64a61..5ccd270 100644 --- a/components/sync/engine_impl/syncer_util_unittest.cc +++ b/components/sync/engine_impl/syncer_util_unittest.cc
@@ -6,6 +6,7 @@ #include <memory> +#include "base/memory/ptr_util.h" #include "base/message_loop/message_loop.h" #include "base/rand_util.h" #include "components/sync/base/unique_position.h" @@ -21,7 +22,7 @@ public: void SetUp() override { dir_maker_.SetUp(); - entry_factory_.reset(new TestEntryFactory(directory())); + entry_factory_ = base::MakeUnique<TestEntryFactory>(directory()); } void TearDown() override { dir_maker_.TearDown(); }
diff --git a/components/sync/engine_impl/test_entry_factory.h b/components/sync/engine_impl/test_entry_factory.h index fc8b124a..a5d160cf 100644 --- a/components/sync/engine_impl/test_entry_factory.h +++ b/components/sync/engine_impl/test_entry_factory.h
@@ -45,7 +45,7 @@ // local ID, it will be treated as a create-new. Otherwise, if it's a server // ID, we'll fake the server data so that it looks like it exists on the // server. Returns the methandle of the created item in |metahandle_out| if - // not NULL. + // not null. void CreateUnsyncedItem(const syncable::Id& item_id, const syncable::Id& parent_id, const std::string& name,
diff --git a/components/sync/engine_impl/traffic_logger.h b/components/sync/engine_impl/traffic_logger.h index 1ea29c0..b0aa253 100644 --- a/components/sync/engine_impl/traffic_logger.h +++ b/components/sync/engine_impl/traffic_logger.h
@@ -2,10 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// This file has the functions to log all the sync related HTTP communication. -// To get the log run a debug build of chrome with the flag -// --vmodule=traffic_logger=1. - #ifndef COMPONENTS_SYNC_ENGINE_IMPL_TRAFFIC_LOGGER_H_ #define COMPONENTS_SYNC_ENGINE_IMPL_TRAFFIC_LOGGER_H_ @@ -16,6 +12,10 @@ namespace syncer { +// This file has the functions to log all the sync related HTTP communication. +// To get the log run a debug build of chrome with the flag +// --vmodule=traffic_logger=1. + void LogClientToServerMessage(const sync_pb::ClientToServerMessage& msg); void LogClientToServerResponse(const sync_pb::ClientToServerResponse& response);
diff --git a/components/sync/engine_impl/update_applicator.h b/components/sync/engine_impl/update_applicator.h index 6fc19e4..86629a9 100644 --- a/components/sync/engine_impl/update_applicator.h +++ b/components/sync/engine_impl/update_applicator.h
@@ -1,12 +1,6 @@ // 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. -// -// An UpdateApplicator is used to iterate over a number of unapplied updates, -// applying them to the client using the given syncer cycle. -// -// UpdateApplicator might resemble an iterator, but it actually keeps retrying -// failed updates until no remaining updates can be successfully applied. #ifndef COMPONENTS_SYNC_ENGINE_IMPL_UPDATE_APPLICATOR_H_ #define COMPONENTS_SYNC_ENGINE_IMPL_UPDATE_APPLICATOR_H_ @@ -29,6 +23,11 @@ class Entry; } +// An UpdateApplicator is used to iterate over a number of unapplied updates, +// applying them to the client using the given syncer cycle. +// +// UpdateApplicator might resemble an iterator, but it actually keeps retrying +// failed updates until no remaining updates can be successfully applied. class UpdateApplicator { public: explicit UpdateApplicator(Cryptographer* cryptographer);
diff --git a/components/sync/engine_impl/worker_entity_tracker.cc b/components/sync/engine_impl/worker_entity_tracker.cc index 2e0ca7b..f8cf9e3 100644 --- a/components/sync/engine_impl/worker_entity_tracker.cc +++ b/components/sync/engine_impl/worker_entity_tracker.cc
@@ -7,6 +7,7 @@ #include <algorithm> #include "base/logging.h" +#include "base/memory/ptr_util.h" #include "components/sync/base/model_type.h" #include "components/sync/base/time.h" #include "components/sync/syncable/syncable_util.h" @@ -82,7 +83,7 @@ DCHECK_EQ(client_tag_hash_, data.entity->client_tag_hash); // TODO(stanisc): consider simply copying CommitRequestData instead of // allocating one dynamically. - pending_commit_.reset(new CommitRequestData(data)); + pending_commit_ = base::MakeUnique<CommitRequestData>(data); // Do our counter values indicate a conflict? If so, don't commit. // @@ -150,7 +151,7 @@ return false; highest_gu_response_version_ = data.response_version; - encrypted_update_.reset(new UpdateResponseData(data)); + encrypted_update_ = base::MakeUnique<UpdateResponseData>(data); ClearPendingCommit(); return true; }
diff --git a/components/sync/js/sync_js_controller.cc b/components/sync/js/sync_js_controller.cc index 087d20ea..1d598f6 100644 --- a/components/sync/js/sync_js_controller.cc +++ b/components/sync/js/sync_js_controller.cc
@@ -34,8 +34,8 @@ void SyncJsController::HandleJsEvent(const std::string& name, const JsEventDetails& details) { - FOR_EACH_OBSERVER(JsEventHandler, js_event_handlers_, - HandleJsEvent(name, details)); + for (auto& observer : js_event_handlers_) + observer.HandleJsEvent(name, details); } void SyncJsController::UpdateBackendEventHandler() {
diff --git a/components/sync/model/attachments/attachment_service_proxy_unittest.cc b/components/sync/model/attachments/attachment_service_proxy_unittest.cc index 61bcdf7..ae6d5ec 100644 --- a/components/sync/model/attachments/attachment_service_proxy_unittest.cc +++ b/components/sync/model/attachments/attachment_service_proxy_unittest.cc
@@ -8,6 +8,7 @@ #include "base/bind.h" #include "base/location.h" +#include "base/memory/ptr_util.h" #include "base/memory/ref_counted_memory.h" #include "base/run_loop.h" #include "base/single_thread_task_runner.h" @@ -83,98 +84,102 @@ void SetUp() override { CalledOnValidThread(); - stub_thread.reset(new base::Thread("attachment service stub thread")); - stub_thread->Start(); - stub.reset(new StubAttachmentService); - proxy.reset(new AttachmentServiceProxy(stub_thread->task_runner(), - stub->AsWeakPtr())); + stub_thread_ = + base::MakeUnique<base::Thread>("attachment service stub thread"); + stub_thread_->Start(); + stub_ = base::MakeUnique<StubAttachmentService>(); + proxy_ = base::MakeUnique<AttachmentServiceProxy>( + stub_thread_->task_runner(), stub_->AsWeakPtr()); - callback_get_or_download = + callback_get_or_download_ = base::Bind(&AttachmentServiceProxyTest::IncrementGetOrDownload, base::Unretained(this)); - count_callback_get_or_download = 0; + count_callback_get_or_download_ = 0; } void TearDown() override { - // We must take care to call the stub's destructor on the stub_thread + // We must take care to call the stub's destructor on the stub_thread_ // because that's the thread to which its WeakPtrs are bound. - if (stub) { - stub_thread->task_runner()->DeleteSoon(FROM_HERE, stub.release()); + if (stub_) { + stub_thread_->task_runner()->DeleteSoon(FROM_HERE, stub_.release()); WaitForStubThread(); } - stub_thread->Stop(); + stub_thread_->Stop(); } // a GetOrDownloadCallback void IncrementGetOrDownload(const AttachmentService::GetOrDownloadResult&, std::unique_ptr<AttachmentMap>) { CalledOnValidThread(); - ++count_callback_get_or_download; + ++count_callback_get_or_download_; } void WaitForStubThread() { base::WaitableEvent done(base::WaitableEvent::ResetPolicy::AUTOMATIC, base::WaitableEvent::InitialState::NOT_SIGNALED); - stub_thread->task_runner()->PostTask( + stub_thread_->task_runner()->PostTask( FROM_HERE, base::Bind(&base::WaitableEvent::Signal, base::Unretained(&done))); done.Wait(); } - base::MessageLoop loop; - std::unique_ptr<base::Thread> stub_thread; - std::unique_ptr<StubAttachmentService> stub; - std::unique_ptr<AttachmentServiceProxy> proxy; + base::MessageLoop loop_; + std::unique_ptr<base::Thread> stub_thread_; + std::unique_ptr<StubAttachmentService> stub_; + std::unique_ptr<AttachmentServiceProxy> proxy_; - AttachmentService::GetOrDownloadCallback callback_get_or_download; + AttachmentService::GetOrDownloadCallback callback_get_or_download_; - // number of times callback_get_or_download was invoked - int count_callback_get_or_download; + // number of times callback_get_or_download_ was invoked + int count_callback_get_or_download_; }; // Verify that each of AttachmentServiceProxy's methods are invoked on the stub. // Verify that the methods that take callbacks invoke passed callbacks on this // thread. TEST_F(AttachmentServiceProxyTest, MethodsAreProxied) { - proxy->GetOrDownloadAttachments(AttachmentIdList(), callback_get_or_download); - proxy->UploadAttachments(AttachmentIdList()); + proxy_->GetOrDownloadAttachments(AttachmentIdList(), + callback_get_or_download_); + proxy_->UploadAttachments(AttachmentIdList()); // Wait for the posted calls to execute in the stub thread. WaitForStubThread(); - EXPECT_EQ(2, stub->GetCallCount()); + EXPECT_EQ(2, stub_->GetCallCount()); // At this point the stub thread has finished executed the calls. However, the // result callbacks it has posted may not have executed yet. Wait a second // time to ensure the stub thread has executed the posted result callbacks. WaitForStubThread(); base::RunLoop().RunUntilIdle(); - EXPECT_EQ(1, count_callback_get_or_download); + EXPECT_EQ(1, count_callback_get_or_download_); } // Verify that it's safe to use an AttachmentServiceProxy even after its wrapped // AttachmentService has been destroyed. TEST_F(AttachmentServiceProxyTest, WrappedIsDestroyed) { - proxy->GetOrDownloadAttachments(AttachmentIdList(), callback_get_or_download); + proxy_->GetOrDownloadAttachments(AttachmentIdList(), + callback_get_or_download_); // Wait for the posted calls to execute in the stub thread. WaitForStubThread(); - EXPECT_EQ(1, stub->GetCallCount()); + EXPECT_EQ(1, stub_->GetCallCount()); // Wait a second time ensure the stub thread has executed the posted result // callbacks. WaitForStubThread(); base::RunLoop().RunUntilIdle(); - EXPECT_EQ(1, count_callback_get_or_download); + EXPECT_EQ(1, count_callback_get_or_download_); // Destroy the stub and call GetOrDownloadAttachments again. - stub_thread->task_runner()->DeleteSoon(FROM_HERE, stub.release()); + stub_thread_->task_runner()->DeleteSoon(FROM_HERE, stub_.release()); WaitForStubThread(); // Now that the wrapped object has been destroyed, call again and see that we // don't crash and the count remains the same. - proxy->GetOrDownloadAttachments(AttachmentIdList(), callback_get_or_download); + proxy_->GetOrDownloadAttachments(AttachmentIdList(), + callback_get_or_download_); WaitForStubThread(); WaitForStubThread(); base::RunLoop().RunUntilIdle(); - EXPECT_EQ(1, count_callback_get_or_download); + EXPECT_EQ(1, count_callback_get_or_download_); } } // namespace syncer
diff --git a/components/sync/model/data_type_error_handler_mock.h b/components/sync/model/data_type_error_handler_mock.h index f3c0d316..7488809c 100644 --- a/components/sync/model/data_type_error_handler_mock.h +++ b/components/sync/model/data_type_error_handler_mock.h
@@ -1,7 +1,7 @@ // 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 COMPONENTS_SYNC_MODEL_DATA_TYPE_ERROR_HANDLER_MOCK_H__ #define COMPONENTS_SYNC_MODEL_DATA_TYPE_ERROR_HANDLER_MOCK_H__
diff --git a/components/sync/model/fake_model_type_service.cc b/components/sync/model/fake_model_type_service.cc index 6eb0b56..78d6026 100644 --- a/components/sync/model/fake_model_type_service.cc +++ b/components/sync/model/fake_model_type_service.cc
@@ -307,7 +307,8 @@ void FakeModelTypeService::SetConflictResolution( ConflictResolution resolution) { - conflict_resolution_.reset(new ConflictResolution(std::move(resolution))); + conflict_resolution_ = + base::MakeUnique<ConflictResolution>(std::move(resolution)); } void FakeModelTypeService::SetServiceError(SyncError::ErrorType error_type) {
diff --git a/components/sync/model/fake_syncable_service.h b/components/sync/model/fake_syncable_service.h index 8eab389..eff2f4b6 100644 --- a/components/sync/model/fake_syncable_service.h +++ b/components/sync/model/fake_syncable_service.h
@@ -28,7 +28,7 @@ void set_attachment_store(std::unique_ptr<AttachmentStore> attachment_store); // AttachmentService should be set when this syncable service is connected, - // just before MergeDataAndStartSyncing. NULL is returned by default. + // just before MergeDataAndStartSyncing. Null is returned by default. const AttachmentService* attachment_service() const; // Whether we're syncing or not. Set on a successful MergeDataAndStartSyncing,
diff --git a/components/sync/model/sync_error.cc b/components/sync/model/sync_error.cc index b2010af2..ef3de5f5 100644 --- a/components/sync/model/sync_error.cc +++ b/components/sync/model/sync_error.cc
@@ -8,6 +8,7 @@ #include "base/location.h" #include "base/logging.h" +#include "base/memory/ptr_util.h" namespace syncer { @@ -65,7 +66,7 @@ const std::string& message, ModelType model_type, ErrorType error_type) { - location_.reset(new tracked_objects::Location(location)); + location_ = base::MakeUnique<tracked_objects::Location>(location); message_ = message; model_type_ = model_type; error_type_ = error_type;
diff --git a/components/sync/model/syncable_service.h b/components/sync/model/syncable_service.h index ddde733..dcd637c 100644 --- a/components/sync/model/syncable_service.h +++ b/components/sync/model/syncable_service.h
@@ -67,9 +67,9 @@ // Returns AttachmentStore for use by sync when uploading or downloading // attachments. // GetAttachmentStoreForSync is called right before MergeDataAndStartSyncing. - // If at that time GetAttachmentStoreForSync returns NULL then datatype is + // If at that time GetAttachmentStoreForSync returns null then datatype is // considered not using attachments and all attempts to upload/download - // attachments will fail. Default implementation returns NULL. Datatype that + // attachments will fail. Default implementation returns null. Datatype that // uses sync attachments should create attachment store, implement // GetAttachmentStoreForSync to return result of // AttachmentStore::CreateAttachmentStoreForSync() from attachment store @@ -80,7 +80,7 @@ // attachments. // SetAttachmentService is called after GetAttachmentStore and right before // MergeDataAndStartSyncing and only if GetAttachmentStore has returned a - // non-NULL store instance. Default implementation does nothing. + // non-null store instance. Default implementation does nothing. // Datatype that uses attachments must take ownerhip of the provided // AttachmentService instance. virtual void SetAttachmentService(
diff --git a/components/sync/model/time.h b/components/sync/model/time.h index 167573f..e77ce916 100644 --- a/components/sync/model/time.h +++ b/components/sync/model/time.h
@@ -1,13 +1,13 @@ // 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. -// -// Publicly accessible header for time-related sync functions. -// See sync/util/time.h for implemenation. #ifndef COMPONENTS_SYNC_MODEL_TIME_H_ #define COMPONENTS_SYNC_MODEL_TIME_H_ #include "components/sync/base/time.h" +// Publicly accessible header for time-related sync functions. +// See components/sync/base/time.h for implementation. + #endif // COMPONENTS_SYNC_MODEL_TIME_H_
diff --git a/components/sync/model_impl/attachments/attachment_service_impl.cc b/components/sync/model_impl/attachments/attachment_service_impl.cc index 2ca4804..695e8e4 100644 --- a/components/sync/model_impl/attachments/attachment_service_impl.cc +++ b/components/sync/model_impl/attachments/attachment_service_impl.cc
@@ -9,6 +9,7 @@ #include "base/bind.h" #include "base/location.h" +#include "base/memory/ptr_util.h" #include "base/single_thread_task_runner.h" #include "base/threading/thread_task_runner_handle.h" #include "base/time/time.h" @@ -129,10 +130,10 @@ // network becomes disconnected, consider suspending queue dispatch. When // connectivity is restored, consider clearing any dispatch backoff (bug // 411981). - upload_task_queue_.reset(new TaskQueue<AttachmentId>( + upload_task_queue_ = base::MakeUnique<TaskQueue<AttachmentId>>( base::Bind(&AttachmentServiceImpl::BeginUpload, weak_ptr_factory_.GetWeakPtr()), - initial_backoff_delay, max_backoff_delay)); + initial_backoff_delay, max_backoff_delay); net::NetworkChangeNotifier::AddNetworkChangeObserver(this); }
diff --git a/components/sync/model_impl/attachments/attachment_service_impl.h b/components/sync/model_impl/attachments/attachment_service_impl.h index bacc355..1db20e9 100644 --- a/components/sync/model_impl/attachments/attachment_service_impl.h +++ b/components/sync/model_impl/attachments/attachment_service_impl.h
@@ -40,7 +40,7 @@ // GetOrDownloadAttachments. // // |delegate| is optional delegate for AttachmentService to notify about - // asynchronous events (AttachmentUploaded). Pass NULL if delegate is not + // asynchronous events (AttachmentUploaded). Pass null if delegate is not // provided. AttachmentService doesn't take ownership of delegate, the pointer // must be valid throughout AttachmentService lifetime. //
diff --git a/components/sync/model_impl/attachments/attachment_service_impl_unittest.cc b/components/sync/model_impl/attachments/attachment_service_impl_unittest.cc index c4cc471..e9cc8a9 100644 --- a/components/sync/model_impl/attachments/attachment_service_impl_unittest.cc +++ b/components/sync/model_impl/attachments/attachment_service_impl_unittest.cc
@@ -149,7 +149,8 @@ std::unique_ptr<Attachment> attachment; if (result == DOWNLOAD_SUCCESS) { scoped_refptr<base::RefCountedString> data = new base::RefCountedString(); - attachment.reset(new Attachment(Attachment::CreateFromParts(id, data))); + attachment = + base::MakeUnique<Attachment>(Attachment::CreateFromParts(id, data)); } base::ThreadTaskRunnerHandle::Get()->PostTask( FROM_HERE, @@ -238,10 +239,10 @@ if (downloader.get()) { attachment_downloader_ = downloader->AsWeakPtr(); } - attachment_service_.reset(new AttachmentServiceImpl( + attachment_service_ = base::MakeUnique<AttachmentServiceImpl>( attachment_store->CreateAttachmentStoreForSync(), std::move(uploader), std::move(downloader), delegate, base::TimeDelta::FromMinutes(1), - base::TimeDelta::FromMinutes(8))); + base::TimeDelta::FromMinutes(8)); std::unique_ptr<base::MockTimer> timer_to_pass( new base::MockTimer(false, false)); @@ -426,7 +427,7 @@ // No downloader. InitializeAttachmentService( base::WrapUnique<MockAttachmentUploader>(new MockAttachmentUploader()), - base::WrapUnique<MockAttachmentDownloader>(NULL), this); + base::WrapUnique<MockAttachmentDownloader>(nullptr), this); AttachmentIdList attachment_ids; attachment_ids.push_back(AttachmentId::Create(0, 0)); @@ -480,7 +481,7 @@ TEST_F(AttachmentServiceImplTest, UploadAttachments_Success_NoDelegate) { InitializeAttachmentService(base::MakeUnique<MockAttachmentUploader>(), base::MakeUnique<MockAttachmentDownloader>(), - NULL); // No delegate. + nullptr); // No delegate. AttachmentIdList attachment_ids; attachment_ids.push_back(AttachmentId::Create(0, 0)); @@ -548,7 +549,7 @@ } TEST_F(AttachmentServiceImplTest, UploadAttachments_NoUploader) { - InitializeAttachmentService(base::WrapUnique<MockAttachmentUploader>(NULL), + InitializeAttachmentService(base::WrapUnique<MockAttachmentUploader>(nullptr), base::MakeUnique<MockAttachmentDownloader>(), this);
diff --git a/components/sync/model_impl/attachments/task_queue.h b/components/sync/model_impl/attachments/task_queue.h index d2966fa..2a686608 100644 --- a/components/sync/model_impl/attachments/task_queue.h +++ b/components/sync/model_impl/attachments/task_queue.h
@@ -15,6 +15,7 @@ #include "base/bind.h" #include "base/callback.h" #include "base/macros.h" +#include "base/memory/ptr_util.h" #include "base/memory/weak_ptr.h" #include "base/threading/non_thread_safe.h" #include "base/threading/thread_task_runner_handle.h" @@ -183,10 +184,10 @@ backoff_policy_.maximum_backoff_ms = max_backoff_delay.InMilliseconds(); backoff_policy_.entry_lifetime_ms = -1; backoff_policy_.always_use_initial_delay = false; - backoff_entry_.reset(new net::BackoffEntry(&backoff_policy_)); + backoff_entry_ = base::MakeUnique<net::BackoffEntry>(&backoff_policy_); dispatch_closure_ = base::Bind(&TaskQueue::Dispatch, weak_ptr_factory_.GetWeakPtr()); - backoff_timer_.reset(new base::Timer(false, false)); + backoff_timer_ = base::MakeUnique<base::Timer>(false, false); } template <typename T>
diff --git a/components/sync/model_impl/attachments/task_queue_unittest.cc b/components/sync/model_impl/attachments/task_queue_unittest.cc index 3780dd83..634a5de 100644 --- a/components/sync/model_impl/attachments/task_queue_unittest.cc +++ b/components/sync/model_impl/attachments/task_queue_unittest.cc
@@ -24,9 +24,9 @@ class TaskQueueTest : public testing::Test { protected: TaskQueueTest() : weak_ptr_factory_(this) { - queue_.reset(new TaskQueue<int>( + queue_ = base::MakeUnique<TaskQueue<int>>( base::Bind(&TaskQueueTest::Process, weak_ptr_factory_.GetWeakPtr()), - TimeDelta::FromMinutes(1), TimeDelta::FromMinutes(8))); + TimeDelta::FromMinutes(1), TimeDelta::FromMinutes(8)); } void RunLoop() {
diff --git a/components/sync/model_impl/model_type_store_backend_unittest.cc b/components/sync/model_impl/model_type_store_backend_unittest.cc index bbc8e121..34f7e73 100644 --- a/components/sync/model_impl/model_type_store_backend_unittest.cc +++ b/components/sync/model_impl/model_type_store_backend_unittest.cc
@@ -6,6 +6,7 @@ #include <utility> +#include "base/memory/ptr_util.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/leveldatabase/src/include/leveldb/env.h" #include "third_party/leveldatabase/src/include/leveldb/write_batch.h" @@ -124,7 +125,7 @@ ASSERT_TRUE(missing_id_list.empty()); // Delete one record. - write_batch.reset(new leveldb::WriteBatch()); + write_batch = base::MakeUnique<leveldb::WriteBatch>(); write_batch->Delete("prefix:id2"); result = backend->WriteModifications(std::move(write_batch)); ASSERT_EQ(ModelTypeStore::Result::SUCCESS, result);
diff --git a/components/sync/model_impl/model_type_store_impl.cc b/components/sync/model_impl/model_type_store_impl.cc index 49b075c..532fe65 100644 --- a/components/sync/model_impl/model_type_store_impl.cc +++ b/components/sync/model_impl/model_type_store_impl.cc
@@ -335,7 +335,7 @@ } ModelTypeStoreImpl::WriteBatchImpl::WriteBatchImpl() { - leveldb_write_batch_.reset(new leveldb::WriteBatch()); + leveldb_write_batch_ = base::MakeUnique<leveldb::WriteBatch>(); } ModelTypeStoreImpl::WriteBatchImpl::~WriteBatchImpl() {}
diff --git a/components/sync/model_impl/shared_model_type_processor_unittest.cc b/components/sync/model_impl/shared_model_type_processor_unittest.cc index a42ddf1b..5373b43a 100644 --- a/components/sync/model_impl/shared_model_type_processor_unittest.cc +++ b/components/sync/model_impl/shared_model_type_processor_unittest.cc
@@ -674,7 +674,7 @@ EXPECT_EQ(kId1, metadata_v1.server_id()); EXPECT_EQ(metadata_v1.client_tag_hash(), out_entity1.client_tag_hash); - entity_data.reset(new EntityData()); + entity_data = base::MakeUnique<EntityData>(); // This is a sketchy move here, changing the name will change the generated // storage key and client tag values. entity_data->specifics.mutable_preference()->set_name(kKey2);
diff --git a/components/sync/protocol/proto_enum_conversions.cc b/components/sync/protocol/proto_enum_conversions.cc index ef90a1a0..8f6bf9d7 100644 --- a/components/sync/protocol/proto_enum_conversions.cc +++ b/components/sync/protocol/proto_enum_conversions.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. -// Keep this file in sync with the .proto files in this directory. - #include "components/sync/protocol/proto_enum_conversions.h" #include "base/logging.h"
diff --git a/components/sync/protocol/proto_enum_conversions.h b/components/sync/protocol/proto_enum_conversions.h index ebf6f3c..03dad96a 100644 --- a/components/sync/protocol/proto_enum_conversions.h +++ b/components/sync/protocol/proto_enum_conversions.h
@@ -5,8 +5,6 @@ #ifndef COMPONENTS_SYNC_PROTOCOL_PROTO_ENUM_CONVERSIONS_H_ #define COMPONENTS_SYNC_PROTOCOL_PROTO_ENUM_CONVERSIONS_H_ -// Keep this file in sync with the .proto files in this directory. - #include "components/sync/protocol/app_list_specifics.pb.h" #include "components/sync/protocol/app_specifics.pb.h" #include "components/sync/protocol/client_debug_info.pb.h" @@ -14,6 +12,8 @@ #include "components/sync/protocol/session_specifics.pb.h" #include "components/sync/protocol/sync.pb.h" +// Keep this file in sync with the .proto files in this directory. +// // Utility functions to get the string equivalent for some sync proto // enums.
diff --git a/components/sync/protocol/proto_enum_conversions_unittest.cc b/components/sync/protocol/proto_enum_conversions_unittest.cc index 351ec53..67e7448 100644 --- a/components/sync/protocol/proto_enum_conversions_unittest.cc +++ b/components/sync/protocol/proto_enum_conversions_unittest.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. -// Keep this file in sync with the .proto files in this directory. - #include "components/sync/protocol/proto_enum_conversions.h" #include <string> @@ -13,6 +11,7 @@ namespace syncer { namespace { +// Keep this file in sync with the .proto files in this directory. class ProtoEnumConversionsTest : public testing::Test {}; template <class T>
diff --git a/components/sync/protocol/proto_value_conversions.cc b/components/sync/protocol/proto_value_conversions.cc index dce4b478..33cea696 100644 --- a/components/sync/protocol/proto_value_conversions.cc +++ b/components/sync/protocol/proto_value_conversions.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. -// Keep this file in sync with the .proto files in this directory. - #include "components/sync/protocol/proto_value_conversions.h" #include <stdint.h>
diff --git a/components/sync/protocol/proto_value_conversions.h b/components/sync/protocol/proto_value_conversions.h index 8147d1a8..69be46c 100644 --- a/components/sync/protocol/proto_value_conversions.h +++ b/components/sync/protocol/proto_value_conversions.h
@@ -2,8 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// Keep this file in sync with the .proto files in this directory. - #ifndef COMPONENTS_SYNC_PROTOCOL_PROTO_VALUE_CONVERSIONS_H_ #define COMPONENTS_SYNC_PROTOCOL_PROTO_VALUE_CONVERSIONS_H_ @@ -84,6 +82,8 @@ class WifiCredentialSpecifics; } // namespace sync_pb +// Keep this file in sync with the .proto files in this directory. +// // Utility functions to convert sync protocol buffers to dictionaries. // Each protocol field is mapped to a key of the same name. Repeated // fields are mapped to array values and sub-messages are mapped to
diff --git a/components/sync/protocol/proto_value_conversions_unittest.cc b/components/sync/protocol/proto_value_conversions_unittest.cc index 24bf6b1..5ebf4408 100644 --- a/components/sync/protocol/proto_value_conversions_unittest.cc +++ b/components/sync/protocol/proto_value_conversions_unittest.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. -// Keep this file in sync with the .proto files in this directory. - #include "components/sync/protocol/proto_value_conversions.h" #include <string> @@ -43,6 +41,7 @@ namespace syncer { namespace { +// Keep this file in sync with the .proto files in this directory. class ProtoValueConversionsTest : public testing::Test { protected: template <class T> @@ -360,9 +359,9 @@ // path. bool ValueHasSpecifics(const base::DictionaryValue& value, const std::string& path) { - const base::ListValue* entities_list = NULL; - const base::DictionaryValue* entry_dictionary = NULL; - const base::DictionaryValue* specifics_dictionary = NULL; + const base::ListValue* entities_list = nullptr; + const base::DictionaryValue* entry_dictionary = nullptr; + const base::DictionaryValue* specifics_dictionary = nullptr; if (!value.GetList(path, &entities_list)) return false;
diff --git a/components/sync/syncable/base_transaction.h b/components/sync/syncable/base_transaction.h index 2aafe45..a85787c 100644 --- a/components/sync/syncable/base_transaction.h +++ b/components/sync/syncable/base_transaction.h
@@ -36,7 +36,7 @@ syncable::Directory* GetDirectory() const { if (!user_share_) { - return NULL; + return nullptr; } else { return user_share_->directory.get(); } @@ -48,7 +48,7 @@ explicit BaseTransaction(UserShare* share); virtual ~BaseTransaction(); - BaseTransaction() : user_share_(NULL) {} + BaseTransaction() : user_share_(nullptr) {} private: UserShare* user_share_;
diff --git a/components/sync/syncable/change_record_unittest.cc b/components/sync/syncable/change_record_unittest.cc index 7a2a711..cc186ea 100644 --- a/components/sync/syncable/change_record_unittest.cc +++ b/components/sync/syncable/change_record_unittest.cc
@@ -57,8 +57,8 @@ if (record.extra.get()) { expected_extra_value = record.extra->ToValue(); } - const base::Value* extra_value = NULL; - EXPECT_EQ(record.extra.get() != NULL, value.Get("extra", &extra_value)); + const base::Value* extra_value = nullptr; + EXPECT_EQ(record.extra.get() != nullptr, value.Get("extra", &extra_value)); EXPECT_TRUE(base::Value::Equals(extra_value, expected_extra_value.get())); std::unique_ptr<base::DictionaryValue> expected_specifics_value(
diff --git a/components/sync/syncable/change_reorder_buffer.h b/components/sync/syncable/change_reorder_buffer.h index 55ac731..e1873c6 100644 --- a/components/sync/syncable/change_reorder_buffer.h +++ b/components/sync/syncable/change_reorder_buffer.h
@@ -1,10 +1,6 @@ // 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. -// -// Defines ChangeReorderBuffer, which can be used to sort a list of item -// actions to achieve the ordering constraint required by the SyncObserver -// interface of the SyncAPI. #ifndef COMPONENTS_SYNC_SYNCABLE_CHANGE_REORDER_BUFFER_H_ #define COMPONENTS_SYNC_SYNCABLE_CHANGE_REORDER_BUFFER_H_
diff --git a/components/sync/syncable/directory.cc b/components/sync/syncable/directory.cc index 75a233c..0671977 100644 --- a/components/sync/syncable/directory.cc +++ b/components/sync/syncable/directory.cc
@@ -101,7 +101,7 @@ const base::Closure& report_unrecoverable_error_function, NigoriHandler* nigori_handler, Cryptographer* cryptographer) - : kernel_(NULL), + : kernel_(nullptr), store_(store), unrecoverable_error_handler_(unrecoverable_error_handler), report_unrecoverable_error_function_(report_unrecoverable_error_function), @@ -210,14 +210,14 @@ store_.reset(); if (kernel_) { delete kernel_; - kernel_ = NULL; + kernel_ = nullptr; } } void Directory::OnUnrecoverableError(const BaseTransaction* trans, const tracked_objects::Location& location, const std::string& message) { - DCHECK(trans != NULL); + DCHECK(trans != nullptr); unrecoverable_error_set_ = true; unrecoverable_error_handler_.Call( FROM_HERE, &UnrecoverableErrorHandler::OnUnrecoverableError, location, @@ -237,7 +237,7 @@ if (id_found != kernel_->ids_map.end()) { return id_found->second; } - return NULL; + return nullptr; } EntryKernel* Directory::GetEntryByClientTag(const string& tag) { @@ -248,7 +248,7 @@ if (it != kernel_->client_tags_map.end()) { return it->second; } - return NULL; + return nullptr; } EntryKernel* Directory::GetEntryByServerTag(const string& tag) { @@ -258,7 +258,7 @@ if (it != kernel_->server_tags_map.end()) { return it->second; } - return NULL; + return nullptr; } EntryKernel* Directory::GetEntryByHandle(int64_t metahandle) { @@ -274,7 +274,7 @@ // Found it in memory. Easy. return found->second.get(); } - return NULL; + return nullptr; } bool Directory::GetChildHandlesById(BaseTransaction* trans, @@ -346,7 +346,7 @@ bool Directory::InsertEntry(const ScopedKernelLock& lock, BaseWriteTransaction* trans, EntryKernel* entry) { - if (!SyncAssert(NULL != entry, FROM_HERE, "Entry is null", trans)) + if (!SyncAssert(nullptr != entry, FROM_HERE, "Entry is null", trans)) return false; static const char error[] = "Entry already in memory index."; @@ -389,7 +389,7 @@ EntryKernel* const entry, const Id& new_id) { ScopedKernelLock lock(this); - if (NULL != GetEntryById(lock, new_id)) + if (nullptr != GetEntryById(lock, new_id)) return false; { @@ -480,7 +480,7 @@ } bool Directory::unrecoverable_error_set(const BaseTransaction* trans) const { - DCHECK(trans != NULL); + DCHECK(trans != nullptr); return unrecoverable_error_set_; } @@ -536,7 +536,7 @@ DCHECK_EQ(1U, kernel_->dirty_metahandles.count(*i)); // We don't bother removing from the index here as we blow the entire thing // in a moment, and it unnecessarily complicates iteration. - entry->clear_dirty(NULL); + entry->clear_dirty(nullptr); } ClearDirtyMetahandles(lock); @@ -585,7 +585,8 @@ MetahandlesMap::iterator found = kernel_->metahandles_map.find((*i)->ref(META_HANDLE)); EntryKernel* entry = - (found == kernel_->metahandles_map.end() ? NULL : found->second.get()); + (found == kernel_->metahandles_map.end() ? nullptr + : found->second.get()); if (entry && SafeToPurgeFromMemory(&trans, entry)) { // We now drop deleted metahandles that are up to date on both the client // and the server. @@ -1311,7 +1312,7 @@ bool Directory::HasChildren(BaseTransaction* trans, const Id& id) { ScopedKernelLock lock(this); - return kernel_->parent_child_index.GetChildren(id) != NULL; + return kernel_->parent_child_index.GetChildren(id) != nullptr; } Id Directory::GetFirstChildId(BaseTransaction* trans, @@ -1385,13 +1386,13 @@ if (!siblings) { // This parent currently has no other children. - DCHECK(predecessor == NULL); + DCHECK(predecessor == nullptr); UniquePosition pos = UniquePosition::InitialPosition(suffix); e->put(UNIQUE_POSITION, pos); return; } - if (predecessor == NULL) { + if (predecessor == nullptr) { // We have at least one sibling, and we're inserting to the left of them. UniquePosition successor_pos = (*siblings->begin())->ref(UNIQUE_POSITION);
diff --git a/components/sync/syncable/directory.h b/components/sync/syncable/directory.h index 1e9e2fe..4fb0240 100644 --- a/components/sync/syncable/directory.h +++ b/components/sync/syncable/directory.h
@@ -109,7 +109,7 @@ std::string store_birthday; // The serialized bag of chips we were given by the server. Contents are // opaque to the client. This is the serialization of a message of type - // ChipBag defined in sync.proto. It can contains NULL characters. + // ChipBag defined in sync.proto. It can contains null characters. std::string bag_of_chips; // The per-datatype context. sync_pb::DataTypeContext datatype_context[MODEL_TYPE_COUNT]; @@ -143,7 +143,7 @@ }; struct Kernel { - // |delegate| must not be NULL. |transaction_observer| must be + // |delegate| must not be null. |transaction_observer| must be // initialized. Kernel(const std::string& name, const KernelLoadInfo& info, @@ -235,7 +235,7 @@ // The next metahandle is protected by kernel mutex. int64_t next_metahandle; - // The delegate for directory change events. Must not be NULL. + // The delegate for directory change events. Must not be null. DirectoryChangeDelegate* const delegate; // The transaction observer. @@ -243,7 +243,7 @@ }; // Does not take ownership of |encryptor|. - // |report_unrecoverable_error_function| may be NULL. + // |report_unrecoverable_error_function| may be null. // Takes ownership of |store|. Directory( DirectoryBackingStore* store, @@ -253,7 +253,7 @@ Cryptographer* cryptographer); virtual ~Directory(); - // Does not take ownership of |delegate|, which must not be NULL. + // Does not take ownership of |delegate|, which must not be null. // Starts sending events to |delegate| if the returned result is // OPENED. Note that events to |delegate| may be sent from *any* // thread. |transaction_observer| must be initialized. @@ -266,7 +266,7 @@ // Generates next client ID based on a randomly generated GUID. syncable::Id NextId(); - bool good() const { return NULL != kernel_; } + bool good() const { return nullptr != kernel_; } // The download progress is an opaque token provided by the sync server // to indicate the continuation state of the next GetUpdates operation. @@ -370,7 +370,7 @@ syncable::Id GetPredecessorId(EntryKernel* e); syncable::Id GetSuccessorId(EntryKernel* e); - // Places |e| as a successor to |predecessor|. If |predecessor| is NULL, + // Places |e| as a successor to |predecessor|. If |predecessor| is null, // |e| will be placed as the left-most item in its folder. // // Both |e| and |predecessor| must be valid entries under the same parent.
diff --git a/components/sync/syncable/directory_backing_store.cc b/components/sync/syncable/directory_backing_store.cc index dab08717..94b3243 100644 --- a/components/sync/syncable/directory_backing_store.cc +++ b/components/sync/syncable/directory_backing_store.cc
@@ -13,6 +13,7 @@ #include "base/base64.h" #include "base/location.h" #include "base/logging.h" +#include "base/memory/ptr_util.h" #include "base/metrics/histogram_macros.h" #include "base/rand_util.h" #include "base/single_thread_task_runner.h" @@ -123,7 +124,7 @@ } // The caller owns the returned EntryKernel*. Assumes the statement currently -// points to a valid row in the metas table. Returns NULL to indicate that +// points to a valid row in the metas table. Returns null to indicate that // it detected a corruption in the data on unpacking. std::unique_ptr<EntryKernel> UnpackEntry(sql::Statement* statement, int* total_specifics_copies) { @@ -1212,7 +1213,7 @@ sql::Statement update(db_->GetUniqueStatement( "UPDATE share_info SET bag_of_chips = ?")); // An empty message is serialized to an empty string. - update.BindBlob(0, NULL, 0); + update.BindBlob(0, nullptr, 0); if (!update.Run()) return false; SetVersion(80); @@ -1509,7 +1510,7 @@ s.BindString(1, dir_name_); // name s.BindString(2, std::string()); // store_birthday s.BindString(3, GenerateCacheGUID()); // cache_guid - s.BindBlob(4, NULL, 0); // bag_of_chips + s.BindBlob(4, nullptr, 0); // bag_of_chips if (!s.Run()) return false; } @@ -1743,7 +1744,7 @@ } void DirectoryBackingStore::ResetAndCreateConnection() { - db_.reset(new sql::Connection()); + db_ = base::MakeUnique<sql::Connection>(); db_->set_histogram_tag("SyncDirectory"); db_->set_exclusive_locking(); db_->set_cache_size(32);
diff --git a/components/sync/syncable/directory_backing_store_unittest.cc b/components/sync/syncable/directory_backing_store_unittest.cc index a08ceedb..2d78653 100644 --- a/components/sync/syncable/directory_backing_store_unittest.cc +++ b/components/sync/syncable/directory_backing_store_unittest.cc
@@ -41,7 +41,7 @@ std::string id_string = base::Int64ToString(id) + id_suffix; entry->put(ID, Id::CreateFromClientString(id_string)); entry->put(META_HANDLE, id); - entry->mark_dirty(NULL); + entry->mark_dirty(nullptr); return entry; }
diff --git a/components/sync/syncable/directory_unittest.cc b/components/sync/syncable/directory_unittest.cc index 5c619878..161f1c1 100644 --- a/components/sync/syncable/directory_unittest.cc +++ b/components/sync/syncable/directory_unittest.cc
@@ -78,9 +78,9 @@ // Use a TestDirectoryBackingStore and sql::Connection so we can have test // data persist across Directory object lifetimes while getting the // performance benefits of not writing to disk. - dir_.reset(new Directory( + dir_ = base::MakeUnique<Directory>( new TestDirectoryBackingStore(kDirectoryName, &connection_), - MakeWeakHandle(handler_.GetWeakPtr()), base::Closure(), NULL, NULL)); + MakeWeakHandle(handler_.GetWeakPtr()), base::Closure(), nullptr, nullptr); DirOpenResult open_result = dir_->Open(kDirectoryName, &delegate_, NullTransactionObserver()); @@ -1346,8 +1346,8 @@ const char null_cstr[] = "\0null\0test"; std::string null_str(null_cstr, arraysize(null_cstr) - 1); // Pad up to the minimum length with 0x7f characters, then add a string that - // contains a few NULLs to the end. This is slightly wrong, since the suffix - // part of a UniquePosition shouldn't contain NULLs, but it's good enough for + // contains a few nulls to the end. This is slightly wrong, since the suffix + // part of a UniquePosition shouldn't contain nulls, but it's good enough for // this test. std::string suffix = std::string(UniquePosition::kSuffixLength - null_str.length(), '\x7f') + @@ -1621,7 +1621,7 @@ Entry e(&rtrans, GET_BY_ID, id); EXPECT_FALSE(e.good()); // Hasn't been written yet. - std::unique_ptr<base::DictionaryValue> value(e.ToValue(NULL)); + std::unique_ptr<base::DictionaryValue> value(e.ToValue(nullptr)); ExpectDictBooleanValue(false, *value, "good"); EXPECT_EQ(1u, value->size()); } @@ -1634,7 +1634,7 @@ me.PutId(id); me.PutBaseVersion(1); - std::unique_ptr<base::DictionaryValue> value(me.ToValue(NULL)); + std::unique_ptr<base::DictionaryValue> value(me.ToValue(nullptr)); ExpectDictBooleanValue(true, *value, "good"); EXPECT_TRUE(value->HasKey("kernel")); ExpectDictStringValue("Bookmarks", *value, "modelType"); @@ -1695,7 +1695,8 @@ std::unique_ptr<StressTransactionsDelegate> thread_delegates[kThreadCount]; for (int i = 0; i < kThreadCount; ++i) { - thread_delegates[i].reset(new StressTransactionsDelegate(dir().get(), i)); + thread_delegates[i] = + base::MakeUnique<StressTransactionsDelegate>(dir().get(), i); ASSERT_TRUE(base::PlatformThread::Create(0, thread_delegates[i].get(), &threads[i])); }
diff --git a/components/sync/syncable/entry.h b/components/sync/syncable/entry.h index 9124867..77a80c8 100644 --- a/components/sync/syncable/entry.h +++ b/components/sync/syncable/entry.h
@@ -263,7 +263,7 @@ void* operator new(size_t size) { return (::operator new)(size); } inline explicit Entry(BaseTransaction* trans) - : basetrans_(trans), kernel_(NULL) {} + : basetrans_(trans), kernel_(nullptr) {} protected: BaseTransaction* const basetrans_;
diff --git a/components/sync/syncable/entry_kernel.cc b/components/sync/syncable/entry_kernel.cc index 1e74ef7..2aaf8d1d 100644 --- a/components/sync/syncable/entry_kernel.cc +++ b/components/sync/syncable/entry_kernel.cc
@@ -224,8 +224,8 @@ std::unique_ptr<base::DictionaryValue> EntryKernelMutationToValue( const EntryKernelMutation& mutation) { std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); - dict->Set("original", mutation.original.ToValue(NULL)); - dict->Set("mutated", mutation.mutated.ToValue(NULL)); + dict->Set("original", mutation.original.ToValue(nullptr)); + dict->Set("mutated", mutation.mutated.ToValue(nullptr)); return dict; }
diff --git a/components/sync/syncable/entry_kernel.h b/components/sync/syncable/entry_kernel.h index d231c30..77495e1 100644 --- a/components/sync/syncable/entry_kernel.h +++ b/components/sync/syncable/entry_kernel.h
@@ -140,7 +140,7 @@ }; // From looking at the sqlite3 docs, it's not directly stated, but it -// seems the overhead for storing a NULL blob is very small. +// seems the overhead for storing a null blob is very small. enum ProtoField { SPECIFICS = PROTO_FIELDS_BEGIN, SERVER_SPECIFICS, @@ -373,7 +373,7 @@ // Dumps all kernel info into a DictionaryValue and returns it. // Transfers ownership of the DictionaryValue to the caller. // Note: |cryptographer| is an optional parameter for use in decrypting - // encrypted specifics. If it is NULL or the specifics are not decryptsble, + // encrypted specifics. If it is null or the specifics are not decryptsble, // they will be serialized as empty proto's. base::DictionaryValue* ToValue(Cryptographer* cryptographer) const;
diff --git a/components/sync/syncable/entry_kernel_unittest.cc b/components/sync/syncable/entry_kernel_unittest.cc index 35a8029..fa2aacb7 100644 --- a/components/sync/syncable/entry_kernel_unittest.cc +++ b/components/sync/syncable/entry_kernel_unittest.cc
@@ -14,7 +14,7 @@ TEST_F(EntryKernelTest, ToValue) { EntryKernel kernel; - std::unique_ptr<base::DictionaryValue> value(kernel.ToValue(NULL)); + std::unique_ptr<base::DictionaryValue> value(kernel.ToValue(nullptr)); if (value) { // Not much to check without repeating the ToValue() code. EXPECT_TRUE(value->HasKey("isDirty"));
diff --git a/components/sync/syncable/model_neutral_mutable_entry.cc b/components/sync/syncable/model_neutral_mutable_entry.cc index 2a3e56cc..900f243 100644 --- a/components/sync/syncable/model_neutral_mutable_entry.cc +++ b/components/sync/syncable/model_neutral_mutable_entry.cc
@@ -24,7 +24,7 @@ const Id& id) : Entry(trans), base_write_transaction_(trans) { Entry same_id(trans, GET_BY_ID, id); - kernel_ = NULL; + kernel_ = nullptr; if (same_id.good()) { return; // already have an item with this ID. } @@ -53,7 +53,7 @@ if (type != NIGORI) DCHECK(IsTypeWithClientGeneratedRoot(type)); Entry same_type_root(trans, GET_TYPE_ROOT, type); - kernel_ = NULL; + kernel_ = nullptr; if (same_type_root.good()) { return; // already have a type root for the given type }
diff --git a/components/sync/syncable/mutable_entry.cc b/components/sync/syncable/mutable_entry.cc index d003b53..cd39653 100644 --- a/components/sync/syncable/mutable_entry.cc +++ b/components/sync/syncable/mutable_entry.cc
@@ -24,7 +24,7 @@ const Id& parent_id, const string& name) { std::unique_ptr<EntryKernel> kernel(new EntryKernel); - kernel_ = NULL; + kernel_ = nullptr; kernel->put(ID, trans->directory_->NextId()); kernel->put(META_HANDLE, trans->directory_->NextMetahandle()); @@ -250,7 +250,7 @@ bool MutableEntry::PutPredecessor(const Id& predecessor_id) { if (predecessor_id.IsNull()) { - dir()->PutPredecessor(kernel_, NULL); + dir()->PutPredecessor(kernel_, nullptr); } else { MutableEntry predecessor(write_transaction(), GET_BY_ID, predecessor_id); if (!predecessor.good()) @@ -305,7 +305,7 @@ // This function sets only the flags needed to get this entry to sync. bool MarkForSyncing(MutableEntry* e) { - DCHECK_NE(static_cast<MutableEntry*>(NULL), e); + DCHECK_NE(static_cast<MutableEntry*>(nullptr), e); DCHECK(!e->IsRoot()) << "We shouldn't mark a permanent object for syncing."; if (!(e->PutIsUnsynced(true))) return false;
diff --git a/components/sync/syncable/nigori_util.cc b/components/sync/syncable/nigori_util.cc index 7acaba8..80538a66 100644 --- a/components/sync/syncable/nigori_util.cc +++ b/components/sync/syncable/nigori_util.cc
@@ -173,7 +173,7 @@ } else { // Encrypt new_specifics into generated_specifics. if (VLOG_IS_ON(2)) { - std::unique_ptr<base::DictionaryValue> value(entry->ToValue(NULL)); + std::unique_ptr<base::DictionaryValue> value(entry->ToValue(nullptr)); std::string info; base::JSONWriter::WriteWithOptions( *value, base::JSONWriter::OPTIONS_PRETTY_PRINT, &info);
diff --git a/components/sync/syncable/nigori_util.h b/components/sync/syncable/nigori_util.h index 6eab1f88a..40879ea 100644 --- a/components/sync/syncable/nigori_util.h +++ b/components/sync/syncable/nigori_util.h
@@ -2,8 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// Various utility methods for nigori-based multi-type encryption. - #ifndef COMPONENTS_SYNC_SYNCABLE_NIGORI_UTIL_H_ #define COMPONENTS_SYNC_SYNCABLE_NIGORI_UTIL_H_ @@ -28,6 +26,8 @@ class MutableEntry; class WriteTransaction; +// Various utility methods for nigori-based multi-type encryption. + // Check if our unsyced changes are encrypted if they need to be based on // |encrypted_types|. // Returns: true if all unsynced data that should be encrypted is.
diff --git a/components/sync/syncable/parent_child_index.h b/components/sync/syncable/parent_child_index.h index 47a1ee5..c354c3b 100644 --- a/components/sync/syncable/parent_child_index.h +++ b/components/sync/syncable/parent_child_index.h
@@ -49,11 +49,11 @@ // Returns true if this item is in the index as a child. bool Contains(EntryKernel* e) const; - // Returns all children of the entry with the given Id. Returns NULL if the + // Returns all children of the entry with the given Id. Returns null if the // node has no children or the Id does not identify a valid directory node. const OrderedChildSet* GetChildren(const Id& id) const; - // Returns all children of the entry. Returns NULL if the node has no + // Returns all children of the entry. Returns null if the node has no // children. const OrderedChildSet* GetChildren(EntryKernel* e) const;
diff --git a/components/sync/syncable/read_node.cc b/components/sync/syncable/read_node.cc index 2cc1c86..436ed7ee 100644 --- a/components/sync/syncable/read_node.cc +++ b/components/sync/syncable/read_node.cc
@@ -15,13 +15,13 @@ ////////////////////////////////////////////////////////////////////////// // ReadNode member definitions ReadNode::ReadNode(const BaseTransaction* transaction) - : entry_(NULL), transaction_(transaction) { + : entry_(nullptr), transaction_(transaction) { DCHECK(transaction); } ReadNode::ReadNode() { - entry_ = NULL; - transaction_ = NULL; + entry_ = nullptr; + transaction_ = nullptr; } ReadNode::~ReadNode() {
diff --git a/components/sync/syncable/read_transaction.cc b/components/sync/syncable/read_transaction.cc index 896c432..1055e45 100644 --- a/components/sync/syncable/read_transaction.cc +++ b/components/sync/syncable/read_transaction.cc
@@ -13,7 +13,7 @@ // ReadTransaction member definitions ReadTransaction::ReadTransaction(const tracked_objects::Location& from_here, UserShare* share) - : BaseTransaction(share), transaction_(NULL), close_transaction_(true) { + : BaseTransaction(share), transaction_(nullptr), close_transaction_(true) { transaction_ = new syncable::ReadTransaction(from_here, share->directory.get()); }
diff --git a/components/sync/syncable/sync_db_util.h b/components/sync/syncable/sync_db_util.h index dde5c11..ab0a770f 100644 --- a/components/sync/syncable/sync_db_util.h +++ b/components/sync/syncable/sync_db_util.h
@@ -17,7 +17,7 @@ namespace syncer { // Check integrity of sync DB under |sync_dir|. Invoke |callback| with last -// modified time if integrity check passes, with NULL time otherwise. This +// modified time if integrity check passes, with null time otherwise. This // is called on either sync thread or IO thread. void CheckSyncDbLastModifiedTime( const base::FilePath& sync_dir,
diff --git a/components/sync/syncable/syncable_enum_conversions.cc b/components/sync/syncable/syncable_enum_conversions.cc index cd3f663..db64a81 100644 --- a/components/sync/syncable/syncable_enum_conversions.cc +++ b/components/sync/syncable/syncable_enum_conversions.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. -// Keep this file in sync with entry_kernel.h. - #include "components/sync/syncable/syncable_enum_conversions.h" #include "base/logging.h"
diff --git a/components/sync/syncable/syncable_enum_conversions.h b/components/sync/syncable/syncable_enum_conversions.h index c883580..49e288c1 100644 --- a/components/sync/syncable/syncable_enum_conversions.h +++ b/components/sync/syncable/syncable_enum_conversions.h
@@ -5,10 +5,10 @@ #ifndef COMPONENTS_SYNC_SYNCABLE_SYNCABLE_ENUM_CONVERSIONS_H_ #define COMPONENTS_SYNC_SYNCABLE_SYNCABLE_ENUM_CONVERSIONS_H_ -// Keep this file in sync with entry_kernel.h. - #include "components/sync/syncable/entry_kernel.h" +// Keep this file in sync with entry_kernel.h. +// // Utility functions to get the string equivalent for some syncable // enums.
diff --git a/components/sync/syncable/syncable_enum_conversions_unittest.cc b/components/sync/syncable/syncable_enum_conversions_unittest.cc index 1689628..3711a13 100644 --- a/components/sync/syncable/syncable_enum_conversions_unittest.cc +++ b/components/sync/syncable/syncable_enum_conversions_unittest.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. -// Keep this file in sync with entry_kernel.h. - #include "components/sync/syncable/syncable_enum_conversions.h" #include <string> @@ -14,6 +12,7 @@ namespace syncable { namespace { +// Keep this file in sync with entry_kernel.h. class SyncableEnumConversionsTest : public testing::Test {}; template <class T>
diff --git a/components/sync/syncable/syncable_unittest.cc b/components/sync/syncable/syncable_unittest.cc index c2df524..370dee0 100644 --- a/components/sync/syncable/syncable_unittest.cc +++ b/components/sync/syncable/syncable_unittest.cc
@@ -13,6 +13,7 @@ #include "base/files/scoped_temp_dir.h" #include "base/location.h" #include "base/logging.h" +#include "base/memory/ptr_util.h" #include "base/message_loop/message_loop.h" #include "base/stl_util.h" #include "base/synchronization/condition_variable.h" @@ -114,7 +115,7 @@ Encryptor* encryptor, const WeakHandle<UnrecoverableErrorHandler>& handler, TestBackingStore* backing_store) - : Directory(backing_store, handler, base::Closure(), NULL, NULL), + : Directory(backing_store, handler, base::Closure(), nullptr, nullptr), backing_store_(backing_store) {} TestDirectory::~TestDirectory() {} @@ -342,10 +343,10 @@ } dir()->SaveChanges(); - dir().reset( - new Directory(new OnDiskDirectoryBackingStore(kDirectoryName, file_path_), - MakeWeakHandle(unrecoverable_error_handler()->GetWeakPtr()), - base::Closure(), NULL, NULL)); + dir() = base::MakeUnique<Directory>( + new OnDiskDirectoryBackingStore(kDirectoryName, file_path_), + MakeWeakHandle(unrecoverable_error_handler()->GetWeakPtr()), + base::Closure(), nullptr, nullptr); ASSERT_TRUE(dir().get()); ASSERT_EQ(OPENED, dir()->Open(kDirectoryName, directory_change_delegate(), @@ -555,8 +556,8 @@ { Directory dir(new OnDiskDirectoryBackingStore("ScopeTest", path), - MakeWeakHandle(handler_.GetWeakPtr()), base::Closure(), NULL, - NULL); + MakeWeakHandle(handler_.GetWeakPtr()), base::Closure(), + nullptr, nullptr); DirOpenResult result = dir.Open("ScopeTest", &delegate_, NullTransactionObserver()); ASSERT_EQ(result, OPENED);
diff --git a/components/sync/syncable/syncable_write_transaction.cc b/components/sync/syncable/syncable_write_transaction.cc index 38e7d22..a06c145e 100644 --- a/components/sync/syncable/syncable_write_transaction.cc +++ b/components/sync/syncable/syncable_write_transaction.cc
@@ -21,7 +21,7 @@ WriterTag writer, Directory* directory) : BaseWriteTransaction(location, "WriteTransaction", writer, directory), - transaction_version_(NULL) { + transaction_version_(nullptr) { Lock(); }
diff --git a/components/sync/syncable/test_user_share.cc b/components/sync/syncable/test_user_share.cc index f50cfbf2..6dbdd47 100644 --- a/components/sync/syncable/test_user_share.cc +++ b/components/sync/syncable/test_user_share.cc
@@ -5,6 +5,7 @@ #include "components/sync/syncable/test_user_share.h" #include "base/compiler_specific.h" +#include "base/memory/ptr_util.h" #include "components/sync/syncable/directory.h" #include "components/sync/syncable/mutable_entry.h" #include "components/sync/syncable/syncable_read_transaction.h" @@ -24,7 +25,7 @@ } void TestUserShare::SetUp() { - user_share_.reset(new UserShare()); + user_share_ = base::MakeUnique<UserShare>(); dir_maker_->SetUp(); // The pointer is owned by dir_maker_, we should not be storing it in a @@ -49,7 +50,7 @@ // Ensure the unique_ptr doesn't delete the memory we don't own. ignore_result(user_share_->directory.release()); - user_share_.reset(new UserShare()); + user_share_ = base::MakeUnique<UserShare>(); dir_maker_->SetUpWith(saved_store); user_share_->directory.reset(dir_maker_->directory()); return true;
diff --git a/components/sync/syncable/test_user_share.h b/components/sync/syncable/test_user_share.h index 37d1a72..78b1405 100644 --- a/components/sync/syncable/test_user_share.h +++ b/components/sync/syncable/test_user_share.h
@@ -1,7 +1,27 @@ // 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 COMPONENTS_SYNC_SYNCABLE_TEST_USER_SHARE_H_ +#define COMPONENTS_SYNC_SYNCABLE_TEST_USER_SHARE_H_ + +#include <stddef.h> + +#include <memory> + +#include "base/macros.h" +#include "components/sync/base/model_type.h" +#include "components/sync/syncable/user_share.h" + +namespace syncer { + +class SyncEncryptionHandler; +class TestDirectorySetterUpper; + +namespace syncable { +class TestTransactionObserver; +} + // A handy class that takes care of setting up and destroying a // UserShare instance for unit tests that require one. // @@ -26,27 +46,6 @@ // ... // } // - -#ifndef COMPONENTS_SYNC_SYNCABLE_TEST_USER_SHARE_H_ -#define COMPONENTS_SYNC_SYNCABLE_TEST_USER_SHARE_H_ - -#include <stddef.h> - -#include <memory> - -#include "base/macros.h" -#include "components/sync/base/model_type.h" -#include "components/sync/syncable/user_share.h" - -namespace syncer { - -class SyncEncryptionHandler; -class TestDirectorySetterUpper; - -namespace syncable { -class TestTransactionObserver; -} - class TestUserShare { public: TestUserShare(); @@ -65,7 +64,7 @@ // Save and reload Directory to clear out temporary data in memory. bool Reload(); - // Non-NULL iff called between a call to SetUp() and TearDown(). + // Non-null iff called between a call to SetUp() and TearDown(). UserShare* user_share(); // Sync's encryption handler. Used by tests to invoke the sync encryption
diff --git a/components/sync/syncable/write_node.cc b/components/sync/syncable/write_node.cc index ede4038..ea5fb77 100644 --- a/components/sync/syncable/write_node.cc +++ b/components/sync/syncable/write_node.cc
@@ -195,7 +195,7 @@ } WriteNode::WriteNode(WriteTransaction* transaction) - : entry_(NULL), transaction_(transaction) { + : entry_(nullptr), transaction_(transaction) { DCHECK(transaction); } @@ -258,7 +258,7 @@ bool WriteNode::InitBookmarkByCreation(const BaseNode& parent, const BaseNode* predecessor) { DCHECK(!entry_) << "Init called twice"; - // |predecessor| must be a child of |parent| or NULL. + // |predecessor| must be a child of |parent| or null. if (predecessor && predecessor->GetParentId() != parent.GetId()) { DCHECK(false); return false; @@ -404,7 +404,7 @@ bool WriteNode::SetPosition(const BaseNode& new_parent, const BaseNode* predecessor) { - // |predecessor| must be a child of |new_parent| or NULL. + // |predecessor| must be a child of |new_parent| or null. if (predecessor && predecessor->GetParentId() != new_parent.GetId()) { DCHECK(false); return false;
diff --git a/components/sync/syncable/write_node.h b/components/sync/syncable/write_node.h index 6251efa1..53390bc 100644 --- a/components/sync/syncable/write_node.h +++ b/components/sync/syncable/write_node.h
@@ -65,8 +65,8 @@ const std::string& tag) override; // Create a new bookmark node with the specified parent and predecessor. Use - // a NULL |predecessor| to indicate that this is to be the first child. - // |predecessor| must be a child of |new_parent| or NULL. Returns false on + // a null |predecessor| to indicate that this is to be the first child. + // |predecessor| must be a child of |new_parent| or null. Returns false on // failure. bool InitBookmarkByCreation(const BaseNode& parent, const BaseNode* predecessor); @@ -110,8 +110,8 @@ void Drop(); // Set a new parent and position. Position is specified by |predecessor|; if - // it is NULL, the node is moved to the first position. |predecessor| must - // be a child of |new_parent| or NULL. Returns false on failure.. + // it is null, the node is moved to the first position. |predecessor| must + // be a child of |new_parent| or null. Returns false on failure.. bool SetPosition(const BaseNode& new_parent, const BaseNode* predecessor); // Set the bookmark specifics (url and favicon).
diff --git a/components/sync/syncable/write_transaction.cc b/components/sync/syncable/write_transaction.cc index fd01ce8..7eb0b5a 100644 --- a/components/sync/syncable/write_transaction.cc +++ b/components/sync/syncable/write_transaction.cc
@@ -14,7 +14,7 @@ // WriteTransaction member definitions WriteTransaction::WriteTransaction(const tracked_objects::Location& from_here, UserShare* share) - : BaseTransaction(share), transaction_(NULL) { + : BaseTransaction(share), transaction_(nullptr) { transaction_ = new syncable::WriteTransaction(from_here, syncable::SYNCAPI, share->directory.get()); } @@ -22,7 +22,7 @@ WriteTransaction::WriteTransaction(const tracked_objects::Location& from_here, UserShare* share, int64_t* new_model_version) - : BaseTransaction(share), transaction_(NULL) { + : BaseTransaction(share), transaction_(nullptr) { transaction_ = new syncable::WriteTransaction( from_here, share->directory.get(), new_model_version); }
diff --git a/components/sync/test/engine/fake_model_worker.cc b/components/sync/test/engine/fake_model_worker.cc index 0b2f7748..e752d0e 100644 --- a/components/sync/test/engine/fake_model_worker.cc +++ b/components/sync/test/engine/fake_model_worker.cc
@@ -7,7 +7,7 @@ namespace syncer { FakeModelWorker::FakeModelWorker(ModelSafeGroup group) - : ModelSafeWorker(NULL), group_(group) {} + : ModelSafeWorker(nullptr), group_(group) {} FakeModelWorker::~FakeModelWorker() { // We may need to relax this is FakeModelWorker is used in a
diff --git a/components/sync/test/engine/fake_sync_scheduler.h b/components/sync/test/engine/fake_sync_scheduler.h index 23f59bfa..950415d 100644 --- a/components/sync/test/engine/fake_sync_scheduler.h +++ b/components/sync/test/engine/fake_sync_scheduler.h
@@ -1,10 +1,6 @@ // 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 fake implementation of the SyncScheduler. If needed, we should add default -// logic needed for tests (invoking callbacks, etc) here rather than in higher -// level test classes. #ifndef COMPONENTS_SYNC_TEST_ENGINE_FAKE_SYNC_SCHEDULER_H_ #define COMPONENTS_SYNC_TEST_ENGINE_FAKE_SYNC_SCHEDULER_H_ @@ -17,6 +13,9 @@ namespace syncer { +// A fake implementation of the SyncScheduler. If needed, we should add default +// logic needed for tests (invoking callbacks, etc) here rather than in higher +// level test classes. class FakeSyncScheduler : public SyncScheduler { public: FakeSyncScheduler();
diff --git a/components/sync/test/engine/mock_connection_manager.cc b/components/sync/test/engine/mock_connection_manager.cc index c9cb074..8742e34 100644 --- a/components/sync/test/engine/mock_connection_manager.cc +++ b/components/sync/test/engine/mock_connection_manager.cc
@@ -1,8 +1,6 @@ // Copyright 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. -// -// Mock ServerConnectionManager class for use in client regression tests. #include "components/sync/test/engine/mock_connection_manager.h" @@ -45,7 +43,7 @@ client_stuck_(false), countdown_to_postbuffer_fail_(0), directory_(directory), - mid_commit_observer_(NULL), + mid_commit_observer_(nullptr), throttling_(false), partialThrottling_(false), fail_non_periodic_get_updates_(false), @@ -739,7 +737,7 @@ return &(filter.Get(i)); } } - return NULL; + return nullptr; } void MockConnectionManager::SetServerReachable() {
diff --git a/components/sync/test/engine/mock_connection_manager.h b/components/sync/test/engine/mock_connection_manager.h index b1a6bcc..af7e4a7b 100644 --- a/components/sync/test/engine/mock_connection_manager.h +++ b/components/sync/test/engine/mock_connection_manager.h
@@ -1,8 +1,6 @@ // 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. -// -// Mock ServerConnectionManager class for use in client unit tests. #ifndef COMPONENTS_SYNC_TEST_ENGINE_MOCK_CONNECTION_MANAGER_H_ #define COMPONENTS_SYNC_TEST_ENGINE_MOCK_CONNECTION_MANAGER_H_ @@ -27,6 +25,7 @@ namespace syncer { +// Mock ServerConnectionManager class for use in client unit tests. class MockConnectionManager : public ServerConnectionManager { public: class MidCommitObserver { @@ -355,7 +354,7 @@ int countdown_to_postbuffer_fail_; // Our directory. Used only to ensure that we are not holding the transaction - // lock when performing network I/O. Can be NULL if the test author is + // lock when performing network I/O. Can be null if the test author is // confident this can't happen. syncable::Directory* directory_;
diff --git a/components/sync/test/engine/test_directory_setter_upper.cc b/components/sync/test/engine/test_directory_setter_upper.cc index 29ff0b7..baae978 100644 --- a/components/sync/test/engine/test_directory_setter_upper.cc +++ b/components/sync/test/engine/test_directory_setter_upper.cc
@@ -6,6 +6,7 @@ #include "base/files/file_util.h" #include "base/location.h" +#include "base/memory/ptr_util.h" #include "base/strings/string_util.h" #include "components/sync/syncable/directory.h" #include "components/sync/syncable/in_memory_directory_backing_store.h" @@ -22,14 +23,15 @@ TestDirectorySetterUpper::~TestDirectorySetterUpper() {} void TestDirectorySetterUpper::SetUp() { - test_transaction_observer_.reset(new syncable::TestTransactionObserver()); + test_transaction_observer_ = + base::MakeUnique<syncable::TestTransactionObserver>(); WeakHandle<syncable::TransactionObserver> transaction_observer = MakeWeakHandle(test_transaction_observer_->AsWeakPtr()); - directory_.reset(new syncable::Directory( + directory_ = base::MakeUnique<syncable::Directory>( new syncable::InMemoryDirectoryBackingStore(name_), MakeWeakHandle(handler_.GetWeakPtr()), base::Closure(), - &encryption_handler_, encryption_handler_.cryptographer())); + &encryption_handler_, encryption_handler_.cryptographer()); ASSERT_EQ(syncable::OPENED, directory_->Open(name_, &delegate_, transaction_observer)); } @@ -37,13 +39,14 @@ void TestDirectorySetterUpper::SetUpWith( syncable::DirectoryBackingStore* directory_store) { CHECK(directory_store); - test_transaction_observer_.reset(new syncable::TestTransactionObserver()); + test_transaction_observer_ = + base::MakeUnique<syncable::TestTransactionObserver>(); WeakHandle<syncable::TransactionObserver> transaction_observer = MakeWeakHandle(test_transaction_observer_->AsWeakPtr()); - directory_.reset(new syncable::Directory( + directory_ = base::MakeUnique<syncable::Directory>( directory_store, MakeWeakHandle(handler_.GetWeakPtr()), base::Closure(), - &encryption_handler_, encryption_handler_.cryptographer())); + &encryption_handler_, encryption_handler_.cryptographer()); ASSERT_EQ(syncable::OPENED, directory_->Open(name_, &delegate_, transaction_observer)); }
diff --git a/components/sync/test/engine/test_directory_setter_upper.h b/components/sync/test/engine/test_directory_setter_upper.h index 1a38476..7dd00e0d 100644 --- a/components/sync/test/engine/test_directory_setter_upper.h +++ b/components/sync/test/engine/test_directory_setter_upper.h
@@ -1,7 +1,28 @@ // 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 COMPONENTS_SYNC_TEST_ENGINE_TEST_DIRECTORY_SETTER_UPPER_H_ +#define COMPONENTS_SYNC_TEST_ENGINE_TEST_DIRECTORY_SETTER_UPPER_H_ + +#include <memory> +#include <string> + +#include "base/compiler_specific.h" +#include "base/macros.h" +#include "components/sync/base/test_unrecoverable_error_handler.h" +#include "components/sync/test/fake_sync_encryption_handler.h" +#include "components/sync/test/null_directory_change_delegate.h" +#include "testing/gmock/include/gmock/gmock.h" + +namespace syncer { + +namespace syncable { +class Directory; +class DirectoryBackingStore; +class TestTransactionObserver; +} + // A handy class that takes care of setting up and destroying a // syncable::Directory instance for unit tests that require one. // @@ -25,28 +46,6 @@ // ... now use metadb_.directory() to get at syncable::Entry objects ... // } // - -#ifndef COMPONENTS_SYNC_TEST_ENGINE_TEST_DIRECTORY_SETTER_UPPER_H_ -#define COMPONENTS_SYNC_TEST_ENGINE_TEST_DIRECTORY_SETTER_UPPER_H_ - -#include <memory> -#include <string> - -#include "base/compiler_specific.h" -#include "base/macros.h" -#include "components/sync/base/test_unrecoverable_error_handler.h" -#include "components/sync/test/fake_sync_encryption_handler.h" -#include "components/sync/test/null_directory_change_delegate.h" -#include "testing/gmock/include/gmock/gmock.h" - -namespace syncer { - -namespace syncable { -class Directory; -class DirectoryBackingStore; -class TestTransactionObserver; -} - class TestDirectorySetterUpper { public: TestDirectorySetterUpper();
diff --git a/components/sync/test/engine/test_id_factory.h b/components/sync/test/engine/test_id_factory.h index 6dcaa61..ce0f1e7 100644 --- a/components/sync/test/engine/test_id_factory.h +++ b/components/sync/test/engine/test_id_factory.h
@@ -1,8 +1,6 @@ // 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 tool making it easier to create IDs for unit testing. #ifndef COMPONENTS_SYNC_TEST_ENGINE_TEST_ID_FACTORY_H_ #define COMPONENTS_SYNC_TEST_ENGINE_TEST_ID_FACTORY_H_ @@ -16,6 +14,7 @@ namespace syncer { +// A tool making it easier to create IDs for unit testing. class TestIdFactory { public: TestIdFactory() : next_value_(1337000) {}
diff --git a/components/sync/test/engine/test_syncable_utils.cc b/components/sync/test/engine/test_syncable_utils.cc index 75d21687..f3c6007e 100644 --- a/components/sync/test/engine/test_syncable_utils.cc +++ b/components/sync/test/engine/test_syncable_utils.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. -// Utilities to verify the state of items in unit tests. - #include "components/sync/test/engine/test_syncable_utils.h" #include "components/sync/syncable/directory.h"
diff --git a/components/sync/test/engine/test_syncable_utils.h b/components/sync/test/engine/test_syncable_utils.h index 497c485..ed782b7 100644 --- a/components/sync/test/engine/test_syncable_utils.h +++ b/components/sync/test/engine/test_syncable_utils.h
@@ -1,9 +1,6 @@ // 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. -// -// Utilities that are useful in verifying the state of items in a -// syncable database. #ifndef COMPONENTS_SYNC_TEST_ENGINE_TEST_SYNCABLE_UTILS_H_ #define COMPONENTS_SYNC_TEST_ENGINE_TEST_SYNCABLE_UTILS_H_ @@ -21,6 +18,9 @@ class Id; class WriteTransaction; +// Utilities that are useful in verifying the state of items in a +// syncable database. + // Count the number of entries with a given name inside of a parent. // Useful to check folder structure and for porting older tests that // rely on uniqueness inside of folders.
diff --git a/components/sync/test/fake_server/android/fake_server_helper_android.cc b/components/sync/test/fake_server/android/fake_server_helper_android.cc index 00fdf48..6ce249c 100644 --- a/components/sync/test/fake_server/android/fake_server_helper_android.cc +++ b/components/sync/test/fake_server/android/fake_server_helper_android.cc
@@ -173,7 +173,7 @@ sync_pb::EntitySpecifics* entity_specifics) { int specifics_bytes_length = env->GetArrayLength(serialized_entity_specifics); jbyte* specifics_bytes = - env->GetByteArrayElements(serialized_entity_specifics, NULL); + env->GetByteArrayElements(serialized_entity_specifics, nullptr); std::string specifics_string(reinterpret_cast<char*>(specifics_bytes), specifics_bytes_length);
diff --git a/components/sync/test/fake_server/bookmark_entity_builder.cc b/components/sync/test/fake_server/bookmark_entity_builder.cc index f4ea23de..806d1dfe 100644 --- a/components/sync/test/fake_server/bookmark_entity_builder.cc +++ b/components/sync/test/fake_server/bookmark_entity_builder.cc
@@ -47,7 +47,7 @@ std::unique_ptr<FakeServerEntity> BookmarkEntityBuilder::BuildBookmark( const GURL& url) { if (!url.is_valid()) { - return base::WrapUnique<FakeServerEntity>(NULL); + return base::WrapUnique<FakeServerEntity>(nullptr); } sync_pb::EntitySpecifics entity_specifics = CreateBaseEntitySpecifics();
diff --git a/components/sync/test/fake_server/fake_server.cc b/components/sync/test/fake_server/fake_server.cc index a24a220..66b720a 100644 --- a/components/sync/test/fake_server/fake_server.cc +++ b/components/sync/test/fake_server/fake_server.cc
@@ -509,8 +509,9 @@ committed_model_types.Put(iter->second->model_type()); } - FOR_EACH_OBSERVER(Observer, observers_, - OnCommit(invalidator_client_id, committed_model_types)); + for (auto& observer : observers_) + observer.OnCommit(invalidator_client_id, committed_model_types); + return true; }
diff --git a/components/sync/test/fake_server/fake_server.h b/components/sync/test/fake_server/fake_server.h index 66bb7da4..b37a00c 100644 --- a/components/sync/test/fake_server/fake_server.h +++ b/components/sync/test/fake_server/fake_server.h
@@ -230,7 +230,7 @@ sync_pb::SyncEnums::ErrorType error_type_; // Used as the error field of ClientToServerResponse when its pointer is not - // NULL. + // null. std::unique_ptr<sync_pb::ClientToServerResponse_Error> triggered_actionable_error_;
diff --git a/components/sync/test/fake_server/fake_server_verifier.cc b/components/sync/test/fake_server/fake_server_verifier.cc index 1136569..b2497ea 100644 --- a/components/sync/test/fake_server/fake_server_verifier.cc +++ b/components/sync/test/fake_server/fake_server_verifier.cc
@@ -77,7 +77,7 @@ } string model_type_string = ModelTypeToString(model_type); - base::ListValue* entity_list = NULL; + base::ListValue* entity_list = nullptr; if (!entities->GetList(model_type_string, &entity_list)) { return UnknownTypeAssertionFailure(model_type_string); } else if (expected_count != entity_list->GetSize()) { @@ -101,7 +101,7 @@ } string model_type_string = ModelTypeToString(model_type); - base::ListValue* entity_list = NULL; + base::ListValue* entity_list = nullptr; size_t actual_count = 0; if (entities->GetList(model_type_string, &entity_list)) { base::StringValue name_value(name);
diff --git a/components/sync/test/fake_sync_encryption_handler.cc b/components/sync/test/fake_sync_encryption_handler.cc index c88014c..1378c67 100644 --- a/components/sync/test/fake_sync_encryption_handler.cc +++ b/components/sync/test/fake_sync_encryption_handler.cc
@@ -40,14 +40,15 @@ if (cryptographer_.has_pending_keys()) { DVLOG(1) << "OnPassPhraseRequired Sent"; sync_pb::EncryptedData pending_keys = cryptographer_.GetPendingKeys(); - FOR_EACH_OBSERVER(SyncEncryptionHandler::Observer, observers_, - OnPassphraseRequired(REASON_DECRYPTION, pending_keys)); + for (auto& observer : observers_) + observer.OnPassphraseRequired(REASON_DECRYPTION, pending_keys); } else if (!cryptographer_.is_ready()) { DVLOG(1) << "OnPassphraseRequired sent because cryptographer is not " << "ready"; - FOR_EACH_OBSERVER( - SyncEncryptionHandler::Observer, observers_, - OnPassphraseRequired(REASON_ENCRYPTION, sync_pb::EncryptedData())); + for (auto& observer : observers_) { + observer.OnPassphraseRequired(REASON_ENCRYPTION, + sync_pb::EncryptedData()); + } } } @@ -74,9 +75,9 @@ keystore_key_ = new_key; DVLOG(1) << "Keystore bootstrap token updated."; - FOR_EACH_OBSERVER( - SyncEncryptionHandler::Observer, observers_, - OnBootstrapTokenUpdated(keystore_key_, KEYSTORE_BOOTSTRAP_TOKEN)); + for (auto& observer : observers_) + observer.OnBootstrapTokenUpdated(keystore_key_, KEYSTORE_BOOTSTRAP_TOKEN); + return true; } @@ -110,9 +111,8 @@ return; encrypt_everything_ = true; encrypted_types_ = ModelTypeSet::All(); - FOR_EACH_OBSERVER( - Observer, observers_, - OnEncryptedTypesChanged(encrypted_types_, encrypt_everything_)); + for (auto& observer : observers_) + observer.OnEncryptedTypesChanged(encrypted_types_, encrypt_everything_); } bool FakeSyncEncryptionHandler::IsEncryptEverythingEnabled() const {
diff --git a/components/sync/tools/BUILD.gn b/components/sync/tools/BUILD.gn index 8951abfb..cf84e6b 100644 --- a/components/sync/tools/BUILD.gn +++ b/components/sync/tools/BUILD.gn
@@ -30,7 +30,8 @@ ":common", "//base", "//components/invalidation/impl", - "//components/sync:test_support_sync_core", + "//components/sync", + "//components/sync:test_support_engine", "//jingle:notifier", "//net:test_support", ] @@ -47,7 +48,8 @@ ":common", "//base", "//components/invalidation/impl", - "//components/sync:test_support_sync_core", + "//components/sync", + "//components/sync:test_support_engine", "//jingle:notifier", "//net:test_support", ]
diff --git a/components/sync/tools/sync_client.cc b/components/sync/tools/sync_client.cc index c6a2e578..87356b9 100644 --- a/components/sync/tools/sync_client.cc +++ b/components/sync/tools/sync_client.cc
@@ -79,7 +79,7 @@ public: MyTestURLRequestContext() : TestURLRequestContext(true) { context_storage_.set_host_resolver( - net::HostResolver::CreateDefaultResolver(NULL)); + net::HostResolver::CreateDefaultResolver(nullptr)); context_storage_.set_transport_security_state( base::MakeUnique<net::TransportSecurityState>()); Init(); @@ -98,7 +98,7 @@ // Construct |context_| lazily so it gets constructed on the right // thread (the IO thread). if (!context_) - context_.reset(new MyTestURLRequestContext()); + context_ = base::MakeUnique<MyTestURLRequestContext>(); return context_.get(); } @@ -392,8 +392,8 @@ std::unique_ptr<SyncManager> sync_manager = sync_manager_factory.CreateSyncManager("sync_client manager"); LoggingJsEventHandler js_event_handler; - // Used only by InitialProcessMetadata(), so it's okay to leave this as NULL. - const scoped_refptr<base::TaskRunner> blocking_task_runner = NULL; + // Used only by InitialProcessMetadata(), so it's okay to leave this as null. + const scoped_refptr<base::TaskRunner> blocking_task_runner = nullptr; const char kUserAgent[] = "sync_client"; // TODO(akalin): Replace this with just the context getter once // HttpPostProviderFactory is removed. @@ -402,9 +402,8 @@ context_getter.get(), base::Bind(&StubNetworkTimeUpdateCallback), &factory_cancelation_signal)); post_factory->Init(kUserAgent, BindToTrackerCallback()); - // Used only when committing bookmarks, so it's okay to leave this - // as NULL. - ExtensionsActivity* extensions_activity = NULL; + // Used only when committing bookmarks, so it's okay to leave this as null. + ExtensionsActivity* extensions_activity = nullptr; LoggingChangeDelegate change_delegate; const char kRestoredKeyForBootstrapping[] = ""; const char kRestoredKeystoreKeyForBootstrapping[] = ""; @@ -427,8 +426,8 @@ args.restored_key_for_bootstrapping = kRestoredKeyForBootstrapping; args.restored_keystore_key_for_bootstrapping = kRestoredKeystoreKeyForBootstrapping; - args.engine_components_factory.reset( - new EngineComponentsFactoryImpl(factory_switches)); + args.engine_components_factory = + base::MakeUnique<EngineComponentsFactoryImpl>(factory_switches); args.encryptor = &null_encryptor; args.unrecoverable_error_handler = WeakHandle<UnrecoverableErrorHandler>(); args.report_unrecoverable_error_function =
diff --git a/components/sync/tools/sync_listen_notifications.cc b/components/sync/tools/sync_listen_notifications.cc index 7cbad69..93d00b1 100644 --- a/components/sync/tools/sync_listen_notifications.cc +++ b/components/sync/tools/sync_listen_notifications.cc
@@ -82,7 +82,7 @@ public: MyTestURLRequestContext() : TestURLRequestContext(true) { context_storage_.set_host_resolver( - net::HostResolver::CreateDefaultResolver(NULL)); + net::HostResolver::CreateDefaultResolver(nullptr)); context_storage_.set_transport_security_state( base::MakeUnique<net::TransportSecurityState>()); Init(); @@ -101,7 +101,7 @@ // Construct |context_| lazily so it gets constructed on the right // thread (the IO thread). if (!context_) - context_.reset(new MyTestURLRequestContext()); + context_ = base::MakeUnique<MyTestURLRequestContext>(); return context_.get(); }
diff --git a/components/sync/tools/testserver/run_sync_testserver.cc b/components/sync/tools/testserver/run_sync_testserver.cc index b7df94c..464de83 100644 --- a/components/sync/tools/testserver/run_sync_testserver.cc +++ b/components/sync/tools/testserver/run_sync_testserver.cc
@@ -57,7 +57,7 @@ // Gets a port value from the switch with name |switch_name| and writes it to // |port|. Returns true if a port was provided and false otherwise. static bool GetPortFromSwitch(const std::string& switch_name, uint16_t* port) { - DCHECK(port != NULL) << "|port| is NULL"; + DCHECK(port != nullptr) << "|port| is null"; base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); int port_int = 0; if (command_line->HasSwitch(switch_name)) {
diff --git a/components/sync_bookmarks/BUILD.gn b/components/sync_bookmarks/BUILD.gn index 12b3607..e283f687 100644 --- a/components/sync_bookmarks/BUILD.gn +++ b/components/sync_bookmarks/BUILD.gn
@@ -40,7 +40,8 @@ "//components/history/core/browser", "//components/prefs:test_support", "//components/sync", - "//components/sync:test_support_sync_driver", + "//components/sync:test_support_driver", + "//components/sync:test_support_model", "//testing/gmock", "//testing/gtest", ]
diff --git a/components/sync_bookmarks/bookmark_data_type_controller_unittest.cc b/components/sync_bookmarks/bookmark_data_type_controller_unittest.cc index 699a1ffc..137671c 100644 --- a/components/sync_bookmarks/bookmark_data_type_controller_unittest.cc +++ b/components/sync_bookmarks/bookmark_data_type_controller_unittest.cc
@@ -71,11 +71,12 @@ void SetUp() override { model_associator_ = new ModelAssociatorMock(); change_processor_ = new ChangeProcessorMock(); - history_service_.reset(new HistoryMock()); - profile_sync_factory_.reset(new syncer::SyncApiComponentFactoryMock( - model_associator_, change_processor_)); - bookmark_dtc_.reset( - new BookmarkDataTypeController(base::Bind(&base::DoNothing), this)); + history_service_ = base::MakeUnique<HistoryMock>(); + profile_sync_factory_ = + base::MakeUnique<syncer::SyncApiComponentFactoryMock>( + model_associator_, change_processor_); + bookmark_dtc_ = base::MakeUnique<BookmarkDataTypeController>( + base::Bind(&base::DoNothing), this); } protected: @@ -85,8 +86,8 @@ }; void CreateBookmarkModel(BookmarkLoadPolicy bookmark_load_policy) { - bookmark_model_.reset( - new BookmarkModel(base::MakeUnique<bookmarks::TestBookmarkClient>())); + bookmark_model_ = base::MakeUnique<BookmarkModel>( + base::MakeUnique<bookmarks::TestBookmarkClient>()); if (bookmark_load_policy == LOAD_MODEL) { TestingPrefServiceSimple prefs; bookmark_model_->Load(&prefs, base::FilePath(),
diff --git a/components/sync_sessions/BUILD.gn b/components/sync_sessions/BUILD.gn index f1d99a9..20b6578 100644 --- a/components/sync_sessions/BUILD.gn +++ b/components/sync_sessions/BUILD.gn
@@ -114,9 +114,9 @@ "//components/prefs:test_support", "//components/sessions:test_support", "//components/sync", - "//components/sync:test_support_sync_core", - "//components/sync:test_support_sync_driver", - "//components/sync:test_support_sync_model", + "//components/sync:test_support_driver", + "//components/sync:test_support_engine", + "//components/sync:test_support_model", "//testing/gmock", "//testing/gtest", "//ui/base:base",
diff --git a/components/sync_sessions/session_data_type_controller_unittest.cc b/components/sync_sessions/session_data_type_controller_unittest.cc index 5dc16c41..d69704d 100644 --- a/components/sync_sessions/session_data_type_controller_unittest.cc +++ b/components/sync_sessions/session_data_type_controller_unittest.cc
@@ -9,6 +9,7 @@ #include "base/bind.h" #include "base/callback.h" #include "base/files/file_path.h" +#include "base/memory/ptr_util.h" #include "base/memory/weak_ptr.h" #include "base/message_loop/message_loop.h" #include "base/run_loop.h" @@ -114,20 +115,20 @@ prefs_.registry()->RegisterBooleanPref(kSavingBrowserHistoryDisabled, false); - synced_window_delegate_.reset(new MockSyncedWindowDelegate()); - synced_window_getter_.reset(new MockSyncedWindowDelegatesGetter()); - sync_sessions_client_.reset(new TestSyncSessionsClient()); + synced_window_delegate_ = base::MakeUnique<MockSyncedWindowDelegate>(); + synced_window_getter_ = base::MakeUnique<MockSyncedWindowDelegatesGetter>(); + sync_sessions_client_ = base::MakeUnique<TestSyncSessionsClient>(); synced_window_getter_->Add(synced_window_delegate_.get()); sync_sessions_client_->SetSyncedWindowDelegatesGetter( synced_window_getter_.get()); - local_device_.reset(new LocalDeviceInfoProviderMock( + local_device_ = base::MakeUnique<LocalDeviceInfoProviderMock>( "cache_guid", "Wayne Gretzky's Hacking Box", "Chromium 10k", - "Chrome 10k", sync_pb::SyncEnums_DeviceType_TYPE_LINUX, "device_id")); + "Chrome 10k", sync_pb::SyncEnums_DeviceType_TYPE_LINUX, "device_id"); - controller_.reset(new SessionDataTypeController( + controller_ = base::MakeUnique<SessionDataTypeController>( base::Bind(&base::DoNothing), this, local_device_.get(), - kSavingBrowserHistoryDisabled)); + kSavingBrowserHistoryDisabled); load_finished_ = false; last_type_ = syncer::UNSPECIFIED;
diff --git a/components/syncable_prefs/BUILD.gn b/components/syncable_prefs/BUILD.gn index 19ed90b..372ce57 100644 --- a/components/syncable_prefs/BUILD.gn +++ b/components/syncable_prefs/BUILD.gn
@@ -64,7 +64,8 @@ ":test_support", "//components/pref_registry", "//components/prefs", - "//components/sync:test_support_sync_model", + "//components/sync", + "//components/sync:test_support_model", "//testing/gtest", ] }
diff --git a/components/test/data/cast_certificate/testsuite/testsuite1.pb b/components/test/data/cast_certificate/testsuite/testsuite1.pb index 3f3b90de..a7fc744 100644 --- a/components/test/data/cast_certificate/testsuite/testsuite1.pb +++ b/components/test/data/cast_certificate/testsuite/testsuite1.pb Binary files differ
diff --git a/components/test/data/cast_certificate/testsuite/testsuite1.pb_text b/components/test/data/cast_certificate/testsuite/testsuite1.pb_text index 3a4fb31..d7c8e52 100644 --- a/components/test/data/cast_certificate/testsuite/testsuite1.pb_text +++ b/components/test/data/cast_certificate/testsuite/testsuite1.pb_text
@@ -213,7 +213,7 @@ der_cert_path: "0\202\003\3570\202\002\327\240\003\002\001\002\002\001\0360\r\006\t*\206H\206\367\r\001\001\v\005\0000\201\2001\v0\t\006\003U\004\006\023\002US1\0230\021\006\003U\004\b\f\nCalifornia1\0260\024\006\003U\004\a\f\rMountain View1\0230\021\006\003U\004\n\f\nGoogle Inc1\r0\v\006\003U\004\v\f\004Cast1 0\036\006\003U\004\003\f\027Cast Test Untrusted ICA0\036\027\r150122000235Z\027\r350117000235Z0\201\2031\v0\t\006\003U\004\006\023\002US1\0230\021\006\003U\004\b\f\nCalifornia1\0260\024\006\003U\004\a\f\rMountain View1\0230\021\006\003U\004\n\f\nGoogle Inc1\r0\v\006\003U\004\v\f\004Cast1#0!\006\003U\004\003\f\032Cast Test Untrusted Device0\202\001\"0\r\006\t*\206H\206\367\r\001\001\001\005\000\003\202\001\017\0000\202\001\n\002\202\001\001\000\273h\313\224\232\312\213A@\212\267Pm\344\311\321\325\307\201\366\306D~\314\263\336\274wh\227\210\365\316@\314\365\217\322\321D;\245\213T\323\005\002\263\334\004\356\261\0271,m\277\274#\246\362U}\301\363\224~e\362\265_\374\303\221\373\221\362\320O\2103\032V\371\336\362\323\217\251X\036\037\342\016\231\254;l2\223\2117h\303z\346(\022\216\317:\242\020d\325\370k1\231=\210V\004\034\223~^\343\234\355\246\343<\023V\274\f92\377M>*n\271nMa5-\350\254\355\275~\350f!|\214)\027\261\267\3226\v\273\241\250\221s2vu\314\207m\250\271Sx\v\232\b\001\f\t\2634\254B\034\354\322\273P\t\234\267cA\252e\251G\f\210\275\367\344\224\306>Gi\255\210\231\233\216o\324$\031Y\n\"\251}\276\371&\321uh\a\340\177\212\346r\371\324\\\263f!\250^,Q\027v\206\253\002\003\001\000\001\243o0m0\t\006\003U\035\023\004\0020\0000\035\006\003U\035\016\004\026\004\024tK\b\223^\236\300\031{\271\016\027\203\207\020\270\227\264E\3530\037\006\003U\035#\004\0300\026\200\024k~\345\312\262\315\345\361q\024\206\342\345-f\250Y\250T\2100\v\006\003U\035\017\004\004\003\002\a\2000\023\006\003U\035%\004\f0\n\006\b+\006\001\005\005\a\003\0020\r\006\t*\206H\206\367\r\001\001\v\005\000\003\202\001\001\000lz\202\370\032\354\350\355E?\022\324\325\217,\204\033\231*\323\345l\342\262\365\313>\215\021\202\320?\b\365\373\250!J\004\311\275^\353;\212Ma?>\206\377\312\023.I\261\037\327\voX\236\314\002\226\225\001\201\254\021\031\372\245\016\350\217\026\375`o\262\3054\372\247OO0dc\232\332\357\201s\374\320\373@\211^\260\230\313\r\262\347\254V[\357w\"\333P\371\325\223\335\251\026~\301N$ \376|\325\243.c\206\030\361\342a\226\330\275\351\257\357\250\232\217<\211\206~`\316\242|\304\344\031\223\220nd\222G\275\264gZ\212\264\247\310\353i\346:\313\254~\207\247W\027\314\002\305\240\205\274Bn&\270\355\225\357A\361u\225\362\0209\200y\213.EuY-6?\004\334\021\r\260\332\240\n\" M\276\265\240\252\031}{x\021\232\236\340\002\\ \v\207\332\221K\346\262\247\270\320\243\a\026=\277\2671\340" der_cert_path: "0\202\003\3410\202\002\311\240\003\002\001\002\002\001\0350\r\006\t*\206H\206\367\r\001\001\v\005\0000\201\2041\v0\t\006\003U\004\006\023\002US1\0230\021\006\003U\004\b\f\nCalifornia1\0260\024\006\003U\004\a\f\rMountain View1\0230\021\006\003U\004\n\f\nGoogle Inc1\r0\v\006\003U\004\v\f\004Cast1$0\"\006\003U\004\003\f\033Cast Test Untrusted Root CA0\036\027\r150122000232Z\027\r350117000232Z0\201\2001\v0\t\006\003U\004\006\023\002US1\0230\021\006\003U\004\b\f\nCalifornia1\0260\024\006\003U\004\a\f\rMountain View1\0230\021\006\003U\004\n\f\nGoogle Inc1\r0\v\006\003U\004\v\f\004Cast1 0\036\006\003U\004\003\f\027Cast Test Untrusted ICA0\202\001\"0\r\006\t*\206H\206\367\r\001\001\001\005\000\003\202\001\017\0000\202\001\n\002\202\001\001\000\231\375334\366\b\375\304\035w\352\320\223\345.\026[\366\364o\217\257\312\230\231\fR\234\267K\002\234\232c\326\261j\212\005\245\303\236\"\235\323\307\036_F\0344\237\bSM\024\3213\214p\032\230?tJ\263t\345\310\232\316\216\r\2631\320\000!\033z\003\267TE\205\203\227\300\275\266\267p|\356\334hu\265P\215\351d0\0362\256w\340\347\213Xc\323`B\207~\305$\341\207\037\177\305\341\r\204%\317h\214e\331p+\325\a]C\341\244\027e\341\241\025a{\365.\360\211\330\347\031bk&\020\262\250e\235[R\246\377\001C\206uz\024\037\202\224\020*-\242H.\361~\372\236\323<y\001\3610\360\276\330\304\033[\3332\343\371\373\354p\217\206\rgq\247J\364d}\002I\332a\235\261\375\317\326$x\312\355 X\210\367?\006\036t\t|\\\227\022\330\222xE\022\366\001\210jp\370|\034-\002\003\001\000\001\243`0^0\017\006\003U\035\023\004\b0\006\001\001\377\002\001\0000\035\006\003U\035\016\004\026\004\024k~\345\312\262\315\345\361q\024\206\342\345-f\250Y\250T\2100\037\006\003U\035#\004\0300\026\200\024\314\304\316\216\324s\"M\017\274\214\373\365U\361a\2458\220\3110\v\006\003U\035\017\004\004\003\002\001\0060\r\006\t*\206H\206\367\r\001\001\v\005\000\003\202\001\001\000\200\231\322\252\222\361o@\224\034\361\324~Qoa\341\360\247g\344\253vL\020\211A\373(\030J\327,M;\346\216q\301\210\336\212\373\305}Z\370\224\321D\326\325J>\004\320k\003\364~V\364\v\201]\347ZV\373$Tw\020\246\266~{\237\226\362i\254\300\370\356C\225\207\270\3344@\2713%\320\207\255\215\327\270\327\310\374\032\375\0024C\200 \372\213\2172\334\376\206 \2367z\020\240}{<\323bz\031\003\211\'\365<\371\016\246\022\000\\U&\353D\322(2\3747n\312\337\321\265y1\213\t\021+\f\022M\235+=Q~<\v\362\247`\333dY\244\364\377\233Vw\247\227\332U\313\227\273\330L\231\215d\302\210\b\336W\246\203\210[^U\205\251-\3300\200j\200\350/\207\346\346\260\331\373#oJ\357\3315\360\270\241\367\316\261\364\366\251\223\357U\021A\231\241e\313}\v\303\343\351F!\330\370" crl_bundle: "\n\212\n\n\f\020\262\340\254\273\005\030\266\340\254\273\005\022\366\a0\202\003\3620\202\002\332\240\003\002\001\002\002\002\000\2270\r\006\t*\206H\206\367\r\001\001\v\005\0000\201\2101\v0\t\006\003U\004\006\023\002US1\0230\021\006\003U\004\b\f\nCalifornia1\0260\024\006\003U\004\a\f\rMountain View1\0230\021\006\003U\004\n\f\nGoogle Inc1\r0\v\006\003U\004\v\f\004Cast1(0&\006\003U\004\003\f\037Cast CRL Test Untrusted Root CA0\036\027\r160622004124Z\027\r160623004124Z0\201\2221\v0\t\006\003U\004\006\023\002US1\0230\021\006\003U\004\b\f\nCalifornia1\0260\024\006\003U\004\a\f\rMountain View1\0230\021\006\003U\004\n\f\nGoogle Inc1\r0\v\006\003U\004\v\f\004Cast1200\006\003U\004\003\f)Short Term Cast CRL Test Untrusted Signer0\202\001\"0\r\006\t*\206H\206\367\r\001\001\001\005\000\003\202\001\017\0000\202\001\n\002\202\001\001\000\250wB!d\3772~yr\367\f\207\217\005\336\266\250\020\214\370\241\240V &\317b\341%I=\344\341\363v{\237\300\362\200xj\352Q\005\366\337e\023Z\276\372ldm\205]XV\354\252RR\301p%\023\271\201\335\000\372\262\372}\372\331,/\017\314\212\177g\336\035\302\021\323\201c!\372\242\3273\344\370\206\3340\275\234\201_\005>\245\303S.\311\300\326\370\355\232#\037s;\353[\216\'\324\304\257y\325^\343\027}a\322_O\035|\177\363\303a;G\336\364wGRV_\r\361\334M\001\270\036)d\032Qo5\217\bp;=\375\327\370\327\aR\371(\373\021Jic\327\361\327z\275\362#\376\271]\304\225Z\372\247\277\374nq:7\2225_\006oR\343HK\354\253\026<\002\251\254@\374K\330\036h\217\242,;\325\337;\v\361\315\313D\351/\365\016\005\303U\247\"\035\265?M\351\267\217\002\003\001\000\001\243Z0X0\t\006\003U\035\023\004\0020\0000\035\006\003U\035\016\004\026\004\024\222\016\315\233\347\204\306\020\217{<\221\234Ttty\367.70\037\006\003U\035#\004\0300\026\200\024VG\243\022\246\333\267\363\361\344hb\313\001E\375+\002sh0\v\006\003U\035\017\004\004\003\002\a\2000\r\006\t*\206H\206\367\r\001\001\v\005\000\003\202\001\001\000h\335\370w\213\037>\aZ\246\354U:.09\223Z\202>F\367z\320+\272\257_I\302\325\022\260m 7\353\003p\247w\360\364\265eB\t\321\312T\351\324\216\215,w\356n6\'l=S\250\022ri\344N\247\353\353\a\354\314\342i\217\244\245\1770\202\025\026\n5W\237P\372\346-\331\375\372\321\373\037\216\372\226\272\004\326cx\253k\353\247H|4S\343\v\ra\247\247`\356\304\324\337U\374\342INVH\251A.\234\231\016\212\006D\177\b\321\312E\260\006\346O\304\236\3106\026Yk@.\2279\vWA\v\242\025\365\031\234\233\355\301\350\334\352\360V\032\035\233\024s\030g\204v\342}\"\220\311\256\320\257\226\362Q\251I>\360bJA\223\362\034\324\313\256\270\r\303\273PR\265\271\365\234\336\300Z\373\250\267\345\276\b\rU}[u\216\243j\236fU\375[\333\032\243\214\022K\t\360\033\243\365\235\032\200\0023\275_\342t\0371}\332\a\206-\255\2535\242D\313\004\352?2\177\276d}\365\207|\241c#bq\230\354]\315\300 \356u\266\376k\320\236\370\v-\257\236\370^\3423\305\316 \342\361\336`1\201\241\362\270!s\304)U\272\206\367\304\216A8X\030*C\212\n\312\265i\325\362\367\221\272\036!*\t\255,Y\272C\202k\331\211\022\2760\306\355\020\332\215Q\271\217\231\303\303\006\236\354\244\035*\341\274{\036\357B+\330r\221\315\312\252\027\376\272\373`\221#U\232j\033\253\331Iz\252\315\254\\A\240\376\'\221g\t\001\301\243\211;\313\21227\0254Q7O\031v}\242\037h\201 O\246\272\t\226\356;c\322\035\327_\020\250\247\325j[\315\177\vK\365K/bqA\017\341\363\313\204-r\nq\342\230\314\"\022C\332\313\217\324\030S3\222\267\224\341\3631I\023\200\265\365\363O\323\227dw\375" - expected_result: REVOCATION_CHECK_FAILED + expected_result: CRL_EXPIRED_AFTER_INITIAL_VERIFICATION cert_verification_time_seconds: 1466642485 crl_verification_time_seconds: 1466642483 }
diff --git a/components/toolbar/test_toolbar_model.cc b/components/toolbar/test_toolbar_model.cc index 31d0f5d0..4188361c 100644 --- a/components/toolbar/test_toolbar_model.cc +++ b/components/toolbar/test_toolbar_model.cc
@@ -4,7 +4,6 @@ #include "components/toolbar/test_toolbar_model.h" -#include "components/grit/components_scaled_resources.h" #include "ui/gfx/vector_icons_public.h" TestToolbarModel::TestToolbarModel() @@ -32,11 +31,6 @@ return security_level_; } -int TestToolbarModel::GetIcon() const { - // This placeholder implementation should be removed when MD is default. - return IDR_LOCATION_BAR_HTTP; -} - gfx::VectorIconId TestToolbarModel::GetVectorIcon() const { return icon_; }
diff --git a/components/toolbar/test_toolbar_model.h b/components/toolbar/test_toolbar_model.h index 108ef0b..a1e2c98 100644 --- a/components/toolbar/test_toolbar_model.h +++ b/components/toolbar/test_toolbar_model.h
@@ -27,7 +27,6 @@ GURL GetURL() const override; security_state::SecurityStateModel::SecurityLevel GetSecurityLevel( bool ignore_editing) const override; - int GetIcon() const override; gfx::VectorIconId GetVectorIcon() const override; base::string16 GetSecureVerboseText() const override; base::string16 GetEVCertName() const override;
diff --git a/components/toolbar/toolbar_model.h b/components/toolbar/toolbar_model.h index 19c60d1..48a1a8b 100644 --- a/components/toolbar/toolbar_model.h +++ b/components/toolbar/toolbar_model.h
@@ -43,13 +43,10 @@ virtual security_state::SecurityStateModel::SecurityLevel GetSecurityLevel( bool ignore_editing) const = 0; - // Returns the resource_id of the icon to show to the left of the address, - // based on the current URL. When search term replacement is active, this - // returns a search icon. This doesn't cover specialized icons while the - // user is editing; see OmniboxView::GetIcon(). - virtual int GetIcon() const = 0; - - // Like GetIcon(), but gets the vector asset ID. + // Returns the id of the icon to show to the left of the address, based on the + // current URL. When search term replacement is active, this returns a search + // icon. This doesn't cover specialized icons while the user is editing; see + // OmniboxView::GetVectorIcon(). virtual gfx::VectorIconId GetVectorIcon() const = 0; // Returns text for the omnibox secure verbose chip.
diff --git a/components/toolbar/toolbar_model_impl.cc b/components/toolbar/toolbar_model_impl.cc index 9329852..5e795f8 100644 --- a/components/toolbar/toolbar_model_impl.cc +++ b/components/toolbar/toolbar_model_impl.cc
@@ -8,7 +8,6 @@ #include "base/strings/utf_string_conversions.h" #include "base/time/time.h" #include "build/build_config.h" -#include "components/grit/components_scaled_resources.h" #include "components/prefs/pref_service.h" #include "components/security_state/security_state_model.h" #include "components/strings/grit/components_strings.h" @@ -70,27 +69,6 @@ : delegate_->GetSecurityLevel(); } -int ToolbarModelImpl::GetIcon() const { - switch (GetSecurityLevel(false)) { - case SecurityStateModel::NONE: - case SecurityStateModel::HTTP_SHOW_WARNING: - return IDR_LOCATION_BAR_HTTP; - case SecurityStateModel::EV_SECURE: - case SecurityStateModel::SECURE: - return IDR_OMNIBOX_HTTPS_VALID; - case SecurityStateModel::SECURITY_WARNING: - // Surface Dubious as Neutral. - return IDR_LOCATION_BAR_HTTP; - case SecurityStateModel::SECURE_WITH_POLICY_INSTALLED_CERT: - return IDR_OMNIBOX_HTTPS_POLICY_WARNING; - case SecurityStateModel::DANGEROUS: - return IDR_OMNIBOX_HTTPS_INVALID; - } - - NOTREACHED(); - return IDR_LOCATION_BAR_HTTP; -} - gfx::VectorIconId ToolbarModelImpl::GetVectorIcon() const { #if !defined(OS_ANDROID) && !defined(OS_IOS) switch (GetSecurityLevel(false)) { @@ -109,7 +87,6 @@ return gfx::VectorIconId::LOCATION_BAR_HTTPS_INVALID; } #endif - NOTREACHED(); return gfx::VectorIconId::VECTOR_ICON_NONE; }
diff --git a/components/toolbar/toolbar_model_impl.h b/components/toolbar/toolbar_model_impl.h index c60177e..cb6b4ba 100644 --- a/components/toolbar/toolbar_model_impl.h +++ b/components/toolbar/toolbar_model_impl.h
@@ -32,7 +32,6 @@ GURL GetURL() const override; security_state::SecurityStateModel::SecurityLevel GetSecurityLevel( bool ignore_editing) const override; - int GetIcon() const override; gfx::VectorIconId GetVectorIcon() const override; base::string16 GetSecureVerboseText() const override; base::string16 GetEVCertName() const override;
diff --git a/components/tracing/child/child_trace_message_filter_browsertest.cc b/components/tracing/child/child_trace_message_filter_browsertest.cc index d6befb39..74bec32 100644 --- a/components/tracing/child/child_trace_message_filter_browsertest.cc +++ b/components/tracing/child/child_trace_message_filter_browsertest.cc
@@ -198,7 +198,14 @@ // Covers the case of one simple child-initiated memory dump without callback, // simulating a global memory dump request to the browser (+ response). -TEST_F(ChildTracingTest, SingleChildInitiatedMemoryDump) { +#if defined(OS_ANDROID) +// Flaky on Android. http://crbug.com/656729. +#define MAYBE_SingleChildInitiatedMemoryDump \ + DISABLED_SingleChildInitiatedMemoryDump +#else +#define MAYBE_SingleChildInitiatedMemoryDump SingleChildInitiatedMemoryDump +#endif +TEST_F(ChildTracingTest, MAYBE_SingleChildInitiatedMemoryDump) { EnableTracingWithMemoryDumps(); // Expect that our mock dump provider is called when the emulated memory dump @@ -230,7 +237,15 @@ // Covers the case of a global memory dump being requested while another one is // in progress and has not been acknowledged by the browser. The second request // is expected to fail immediately, while the first one is expected to suceed. -TEST_F(ChildTracingTest, OverlappingChildInitiatedMemoryDumps) { +#if defined(OS_ANDROID) +// Flaky on Android. http://crbug.com/656729. +#define MAYBE_OverlappingChildInitiatedMemoryDumps \ + DISABLED_OverlappingChildInitiatedMemoryDumps +#else +#define MAYBE_OverlappingChildInitiatedMemoryDumps \ + OverlappingChildInitiatedMemoryDumps +#endif +TEST_F(ChildTracingTest, MAYBE_OverlappingChildInitiatedMemoryDumps) { EnableTracingWithMemoryDumps(); // Expect that our mock dump provider is called only once. @@ -285,7 +300,15 @@ // Covers the case of five child-initiated global memory dumps. Each global dump // request has a callback, which is expected to fail for 3 out of 5 cases. -TEST_F(ChildTracingTest, MultipleChildInitiatedMemoryDumpWithFailures) { +#if defined(OS_ANDROID) +// Flaky on Android. http://crbug.com/656729. +#define MAYBE_MultipleChildInitiatedMemoryDumpWithFailures \ + DISABLED_MultipleChildInitiatedMemoryDumpWithFailures +#else +#define MAYBE_MultipleChildInitiatedMemoryDumpWithFailures \ + MultipleChildInitiatedMemoryDumpWithFailures +#endif +TEST_F(ChildTracingTest, MAYBE_MultipleChildInitiatedMemoryDumpWithFailures) { const uint32_t kNumRequests = 5; MemoryDumpType kDumpType = MemoryDumpType::EXPLICITLY_TRIGGERED;
diff --git a/components/translate/core/browser/language_model.cc b/components/translate/core/browser/language_model.cc index 6c2dd6c5..6050cea 100644 --- a/components/translate/core/browser/language_model.cc +++ b/components/translate/core/browser/language_model.cc
@@ -19,7 +19,7 @@ const char kLanguageModelCounters[] = "language_model_counters"; const int kMaxCountersSum = 1000; -const int kMinCountersSum = 100; +const int kMinCountersSum = 10; const float kCutoffRatio = 0.005f; const float kDiscountFactor = 0.75f;
diff --git a/components/user_manager/user_manager_base.cc b/components/user_manager/user_manager_base.cc index 5c960408..562589ce 100644 --- a/components/user_manager/user_manager_base.cc +++ b/components/user_manager/user_manager_base.cc
@@ -256,7 +256,7 @@ CallUpdateLoginState(); session_manager::SessionManager::Get()->SetSessionState( - session_manager::SESSION_STATE_ACTIVE); + session_manager::SessionState::ACTIVE); GetLocalState()->CommitPendingWrite(); }
diff --git a/components/web_contents_delegate_android/web_contents_delegate_android.cc b/components/web_contents_delegate_android/web_contents_delegate_android.cc index d1df8dda..19ed20a 100644 --- a/components/web_contents_delegate_android/web_contents_delegate_android.cc +++ b/components/web_contents_delegate_android/web_contents_delegate_android.cc
@@ -34,6 +34,7 @@ using content::RenderWidgetHostView; using content::WebContents; using content::WebContentsDelegate; +using content::WebContentsUnresponsiveState; namespace web_contents_delegate_android { @@ -130,8 +131,7 @@ changed_flags); } -void WebContentsDelegateAndroid::VisibleSSLStateChanged( - const WebContents* source) { +void WebContentsDelegateAndroid::VisibleSSLStateChanged(WebContents* source) { JNIEnv* env = AttachCurrentThread(); ScopedJavaLocalRef<jobject> obj = GetJavaDelegate(env); if (obj.is_null()) @@ -164,7 +164,9 @@ Java_WebContentsDelegateAndroid_notifyLoadProgressChanged(env, obj, progress); } -void WebContentsDelegateAndroid::RendererUnresponsive(WebContents* source) { +void WebContentsDelegateAndroid::RendererUnresponsive( + WebContents* source, + const WebContentsUnresponsiveState& unresponsive_state) { JNIEnv* env = AttachCurrentThread(); ScopedJavaLocalRef<jobject> obj = GetJavaDelegate(env); if (obj.is_null())
diff --git a/components/web_contents_delegate_android/web_contents_delegate_android.h b/components/web_contents_delegate_android/web_contents_delegate_android.h index 7edcdd6..fa4c98ec 100644 --- a/components/web_contents_delegate_android/web_contents_delegate_android.h +++ b/components/web_contents_delegate_android/web_contents_delegate_android.h
@@ -63,13 +63,15 @@ const std::vector<content::ColorSuggestion>& suggestions) override; void NavigationStateChanged(content::WebContents* source, content::InvalidateTypes changed_flags) override; - void VisibleSSLStateChanged(const content::WebContents* source) override; + void VisibleSSLStateChanged(content::WebContents* source) override; void ActivateContents(content::WebContents* contents) override; void LoadingStateChanged(content::WebContents* source, bool to_different_document) override; void LoadProgressChanged(content::WebContents* source, double load_progress) override; - void RendererUnresponsive(content::WebContents* source) override; + void RendererUnresponsive( + content::WebContents* source, + const content::WebContentsUnresponsiveState& unresponsive_state) override; void RendererResponsive(content::WebContents* source) override; void WebContentsCreated(content::WebContents* source_contents, int opener_render_process_id,
diff --git a/components/webdata/common/web_data_request_manager.cc b/components/webdata/common/web_data_request_manager.cc index d03d841b..9f818639 100644 --- a/components/webdata/common/web_data_request_manager.cc +++ b/components/webdata/common/web_data_request_manager.cc
@@ -104,10 +104,7 @@ void WebDataRequestManager::CancelRequest(WebDataServiceBase::Handle h) { base::AutoLock l(pending_lock_); RequestMap::iterator i = pending_requests_.find(h); - if (i == pending_requests_.end()) { - NOTREACHED() << "Canceling a nonexistent web data service request"; - return; - } + DCHECK(i != pending_requests_.end()); i->second->Cancel(); pending_requests_.erase(i); } @@ -134,10 +131,7 @@ { base::AutoLock l(pending_lock_); RequestMap::iterator i = pending_requests_.find(request->GetHandle()); - if (i == pending_requests_.end()) { - NOTREACHED() << "Request completed called for an unknown request"; - return; - } + DCHECK(i != pending_requests_.end()); // Take ownership of the request object and remove it from the map. pending_requests_.erase(i);
diff --git a/components/wifi_sync/BUILD.gn b/components/wifi_sync/BUILD.gn index fedca4c..42816fb 100644 --- a/components/wifi_sync/BUILD.gn +++ b/components/wifi_sync/BUILD.gn
@@ -51,7 +51,8 @@ "//base", "//chromeos", "//components/onc", - "//components/sync:test_support_sync_model", + "//components/sync", + "//components/sync:test_support_model", "//testing/gmock", "//testing/gtest", ]
diff --git a/content/app/strings/translations/content_strings_am.xtb b/content/app/strings/translations/content_strings_am.xtb index cfd3f60..77aa234 100644 --- a/content/app/strings/translations/content_strings_am.xtb +++ b/content/app/strings/translations/content_strings_am.xtb
@@ -158,7 +158,6 @@ <translation id="7514365320538308">አውርድ</translation> <translation id="7673697353781729403">ሰዓቶች</translation> <translation id="7720026100085573005">ቀሪ ጊዜ</translation> -<translation id="772727223731580981">ትርፍ ምናሌ</translation> <translation id="7740016676195725605">የተዘጉ የስዕል መግለጫዎችን ማሳየት አቁም</translation> <translation id="7740050170769002709">የኤች ቲ ኤም ኤል ይዘት</translation> <translation id="7789962463072032349">ላፍታ አቁም</translation>
diff --git a/content/app/strings/translations/content_strings_ar.xtb b/content/app/strings/translations/content_strings_ar.xtb index 30c9170..8be9a1f 100644 --- a/content/app/strings/translations/content_strings_ar.xtb +++ b/content/app/strings/translations/content_strings_ar.xtb
@@ -158,7 +158,6 @@ <translation id="7514365320538308">تنزيل</translation> <translation id="7673697353781729403">ساعات</translation> <translation id="7720026100085573005">المدة المتبقية</translation> -<translation id="772727223731580981">القائمة الكاملة</translation> <translation id="7740016676195725605">إيقاف عرض التسميات التوضيحية المغلقة</translation> <translation id="7740050170769002709">محتوى HTML</translation> <translation id="7789962463072032349">إيقاف مؤقت</translation>
diff --git a/content/app/strings/translations/content_strings_bg.xtb b/content/app/strings/translations/content_strings_bg.xtb index cd28df3..0cabb2a 100644 --- a/content/app/strings/translations/content_strings_bg.xtb +++ b/content/app/strings/translations/content_strings_bg.xtb
@@ -158,7 +158,6 @@ <translation id="7514365320538308">Изтегляне</translation> <translation id="7673697353781729403">Часове</translation> <translation id="7720026100085573005">оставащо време</translation> -<translation id="772727223731580981">Меню при препълване</translation> <translation id="7740016676195725605">спиране на показването на надписите</translation> <translation id="7740050170769002709">HTML съдържание</translation> <translation id="7789962463072032349">поставяне на пауза</translation>
diff --git a/content/app/strings/translations/content_strings_bn.xtb b/content/app/strings/translations/content_strings_bn.xtb index 885f74f..3d086e1 100644 --- a/content/app/strings/translations/content_strings_bn.xtb +++ b/content/app/strings/translations/content_strings_bn.xtb
@@ -158,7 +158,6 @@ <translation id="7514365320538308">ডাউনলোড করুন</translation> <translation id="7673697353781729403">ঘণ্টা</translation> <translation id="7720026100085573005">অবশিষ্ট সময়</translation> -<translation id="772727223731580981">ওভারফ্লো মেনু</translation> <translation id="7740016676195725605">বদ্ধ পরিচয়লিপিগুলির প্রদর্শন থামান</translation> <translation id="7740050170769002709">HTML সামগ্রী</translation> <translation id="7789962463072032349">বিরাম</translation>
diff --git a/content/app/strings/translations/content_strings_ca.xtb b/content/app/strings/translations/content_strings_ca.xtb index 0aee472..7b52ae8 100644 --- a/content/app/strings/translations/content_strings_ca.xtb +++ b/content/app/strings/translations/content_strings_ca.xtb
@@ -158,7 +158,6 @@ <translation id="7514365320538308">Baixa</translation> <translation id="7673697353781729403">Hores</translation> <translation id="7720026100085573005">temps restant</translation> -<translation id="772727223731580981">Menú addicional</translation> <translation id="7740016676195725605">deixa de mostrar subtítols ocults</translation> <translation id="7740050170769002709">Contingut HTML</translation> <translation id="7789962463072032349">pausa</translation>
diff --git a/content/app/strings/translations/content_strings_cs.xtb b/content/app/strings/translations/content_strings_cs.xtb index 695e49e..0a909cf 100644 --- a/content/app/strings/translations/content_strings_cs.xtb +++ b/content/app/strings/translations/content_strings_cs.xtb
@@ -158,7 +158,6 @@ <translation id="7514365320538308">Stáhnout</translation> <translation id="7673697353781729403">Hodiny</translation> <translation id="7720026100085573005">zbývající čas</translation> -<translation id="772727223731580981">Rozbalovací nabídka</translation> <translation id="7740016676195725605">ukončit zobrazování titulků</translation> <translation id="7740050170769002709">Obsah ve formátu HTML</translation> <translation id="7789962463072032349">pozastavit</translation>
diff --git a/content/app/strings/translations/content_strings_da.xtb b/content/app/strings/translations/content_strings_da.xtb index ca52355d..0e214fe 100644 --- a/content/app/strings/translations/content_strings_da.xtb +++ b/content/app/strings/translations/content_strings_da.xtb
@@ -158,7 +158,6 @@ <translation id="7514365320538308">Download</translation> <translation id="7673697353781729403">Timer</translation> <translation id="7720026100085573005">resterende tid</translation> -<translation id="772727223731580981">Overløbsmenu</translation> <translation id="7740016676195725605">stop visning af undertekster</translation> <translation id="7740050170769002709">HTML-indhold</translation> <translation id="7789962463072032349">pause</translation>
diff --git a/content/app/strings/translations/content_strings_de.xtb b/content/app/strings/translations/content_strings_de.xtb index 44d2eac..ba4d395 100644 --- a/content/app/strings/translations/content_strings_de.xtb +++ b/content/app/strings/translations/content_strings_de.xtb
@@ -158,7 +158,6 @@ <translation id="7514365320538308">Herunterladen</translation> <translation id="7673697353781729403">Stunden</translation> <translation id="7720026100085573005">Verbleibende Zeit</translation> -<translation id="772727223731580981">Überlaufmenü</translation> <translation id="7740016676195725605">Keine Untertitel mehr anzeigen</translation> <translation id="7740050170769002709">HTML-Inhalte</translation> <translation id="7789962463072032349">Pausieren</translation>
diff --git a/content/app/strings/translations/content_strings_el.xtb b/content/app/strings/translations/content_strings_el.xtb index cdd547b0..d32904b 100644 --- a/content/app/strings/translations/content_strings_el.xtb +++ b/content/app/strings/translations/content_strings_el.xtb
@@ -158,7 +158,6 @@ <translation id="7514365320538308">Λήψη</translation> <translation id="7673697353781729403">Ώρες</translation> <translation id="7720026100085573005">χρόνος που απομένει</translation> -<translation id="772727223731580981">Μενού υπερχείλισης</translation> <translation id="7740016676195725605">διακοπή προβολής υπότιτλων</translation> <translation id="7740050170769002709">Περιεχόμενο HTML</translation> <translation id="7789962463072032349">παύση</translation>
diff --git a/content/app/strings/translations/content_strings_en-GB.xtb b/content/app/strings/translations/content_strings_en-GB.xtb index 3909519..1517691 100644 --- a/content/app/strings/translations/content_strings_en-GB.xtb +++ b/content/app/strings/translations/content_strings_en-GB.xtb
@@ -158,7 +158,6 @@ <translation id="7514365320538308">Download</translation> <translation id="7673697353781729403">Hours</translation> <translation id="7720026100085573005">remaining time</translation> -<translation id="772727223731580981">Overflow menu</translation> <translation id="7740016676195725605">stop displaying closed captions</translation> <translation id="7740050170769002709">HTML content</translation> <translation id="7789962463072032349">pause</translation>
diff --git a/content/app/strings/translations/content_strings_es-419.xtb b/content/app/strings/translations/content_strings_es-419.xtb index 6e4056f..f722bd5 100644 --- a/content/app/strings/translations/content_strings_es-419.xtb +++ b/content/app/strings/translations/content_strings_es-419.xtb
@@ -158,7 +158,6 @@ <translation id="7514365320538308">Descargar</translation> <translation id="7673697353781729403">Horas</translation> <translation id="7720026100085573005">tiempo restante</translation> -<translation id="772727223731580981">Menú ampliado</translation> <translation id="7740016676195725605">dejar de mostrar subtítulos</translation> <translation id="7740050170769002709">Contenido HTML</translation> <translation id="7789962463072032349">pausa</translation>
diff --git a/content/app/strings/translations/content_strings_es.xtb b/content/app/strings/translations/content_strings_es.xtb index 415884b..fcb26334 100644 --- a/content/app/strings/translations/content_strings_es.xtb +++ b/content/app/strings/translations/content_strings_es.xtb
@@ -158,7 +158,6 @@ <translation id="7514365320538308">Descargar</translation> <translation id="7673697353781729403">Horas</translation> <translation id="7720026100085573005">tiempo restante</translation> -<translation id="772727223731580981">Menú adicional</translation> <translation id="7740016676195725605">dejar de mostrar subtítulos opcionales</translation> <translation id="7740050170769002709">Contenido HTML</translation> <translation id="7789962463072032349">pausar</translation>
diff --git a/content/app/strings/translations/content_strings_et.xtb b/content/app/strings/translations/content_strings_et.xtb index ec9def4..980b8eb 100644 --- a/content/app/strings/translations/content_strings_et.xtb +++ b/content/app/strings/translations/content_strings_et.xtb
@@ -158,7 +158,6 @@ <translation id="7514365320538308">Laadi alla</translation> <translation id="7673697353781729403">Tunnid</translation> <translation id="7720026100085573005">järelejäänud aeg</translation> -<translation id="772727223731580981">Ületäitemenüü</translation> <translation id="7740016676195725605">subtiitrite kuvamise peatamine</translation> <translation id="7740050170769002709">HTML-sisu</translation> <translation id="7789962463072032349">peata</translation>
diff --git a/content/app/strings/translations/content_strings_fa.xtb b/content/app/strings/translations/content_strings_fa.xtb index e62ed2a..3d76681 100644 --- a/content/app/strings/translations/content_strings_fa.xtb +++ b/content/app/strings/translations/content_strings_fa.xtb
@@ -158,7 +158,6 @@ <translation id="7514365320538308">بارگیری</translation> <translation id="7673697353781729403">ساعت</translation> <translation id="7720026100085573005">زمان باقیمانده</translation> -<translation id="772727223731580981">منوی لبریزشده</translation> <translation id="7740016676195725605">توقف نمایش زیرنویس ناشنوایان</translation> <translation id="7740050170769002709">محتوای HTML</translation> <translation id="7789962463072032349">مکث</translation>
diff --git a/content/app/strings/translations/content_strings_fi.xtb b/content/app/strings/translations/content_strings_fi.xtb index bca6814c..d4ff11d 100644 --- a/content/app/strings/translations/content_strings_fi.xtb +++ b/content/app/strings/translations/content_strings_fi.xtb
@@ -158,7 +158,6 @@ <translation id="7514365320538308">Lataa</translation> <translation id="7673697353781729403">Tuntia</translation> <translation id="7720026100085573005">jäljellä oleva aika</translation> -<translation id="772727223731580981">Ylivuotovalikko</translation> <translation id="7740016676195725605">älä näytä tekstityksiä</translation> <translation id="7740050170769002709">HTML-sisältö</translation> <translation id="7789962463072032349">tauko</translation>
diff --git a/content/app/strings/translations/content_strings_fil.xtb b/content/app/strings/translations/content_strings_fil.xtb index 347c82b..a9320a1 100644 --- a/content/app/strings/translations/content_strings_fil.xtb +++ b/content/app/strings/translations/content_strings_fil.xtb
@@ -158,7 +158,6 @@ <translation id="7514365320538308">I-download</translation> <translation id="7673697353781729403">Oras</translation> <translation id="7720026100085573005">natitirang oras</translation> -<translation id="772727223731580981">Overflow menu</translation> <translation id="7740016676195725605">ihinto ang pagpapakita ng mga nakasarang caption</translation> <translation id="7740050170769002709">HTML na nilalaman</translation> <translation id="7789962463072032349">i-pause</translation>
diff --git a/content/app/strings/translations/content_strings_fr.xtb b/content/app/strings/translations/content_strings_fr.xtb index 07e9697..47526bc 100644 --- a/content/app/strings/translations/content_strings_fr.xtb +++ b/content/app/strings/translations/content_strings_fr.xtb
@@ -158,7 +158,6 @@ <translation id="7514365320538308">Télécharger</translation> <translation id="7673697353781729403">Heures</translation> <translation id="7720026100085573005">temps restant</translation> -<translation id="772727223731580981">Menu à développer</translation> <translation id="7740016676195725605">ne plus afficher les sous-titres</translation> <translation id="7740050170769002709">Contenu HTML</translation> <translation id="7789962463072032349">pause</translation>
diff --git a/content/app/strings/translations/content_strings_gu.xtb b/content/app/strings/translations/content_strings_gu.xtb index 3177640..c875593 100644 --- a/content/app/strings/translations/content_strings_gu.xtb +++ b/content/app/strings/translations/content_strings_gu.xtb
@@ -158,7 +158,6 @@ <translation id="7514365320538308">ડાઉનલોડ કરો</translation> <translation id="7673697353781729403">કલાક</translation> <translation id="7720026100085573005">બાકીનો સમય</translation> -<translation id="772727223731580981">ઓવરફ્લો મેનૂ</translation> <translation id="7740016676195725605">વિગતવાર ઉપશીર્ષકનું પ્રદર્શન અટકાવો</translation> <translation id="7740050170769002709">HTML સામગ્રી</translation> <translation id="7789962463072032349">થોભો</translation>
diff --git a/content/app/strings/translations/content_strings_hi.xtb b/content/app/strings/translations/content_strings_hi.xtb index da506d2..40fdd697 100644 --- a/content/app/strings/translations/content_strings_hi.xtb +++ b/content/app/strings/translations/content_strings_hi.xtb
@@ -158,7 +158,6 @@ <translation id="7514365320538308">डाउनलोड करें</translation> <translation id="7673697353781729403">घंटे</translation> <translation id="7720026100085573005">शेष समय</translation> -<translation id="772727223731580981">ओवरफ़्लो मेनू</translation> <translation id="7740016676195725605">बंद कैप्शन दिखाना रोकें</translation> <translation id="7740050170769002709">HTML सामग्री</translation> <translation id="7789962463072032349">पॉज़ करें</translation>
diff --git a/content/app/strings/translations/content_strings_hr.xtb b/content/app/strings/translations/content_strings_hr.xtb index 3fbde41..3fd447f 100644 --- a/content/app/strings/translations/content_strings_hr.xtb +++ b/content/app/strings/translations/content_strings_hr.xtb
@@ -158,7 +158,6 @@ <translation id="7514365320538308">Preuzmi</translation> <translation id="7673697353781729403">Sati</translation> <translation id="7720026100085573005">preostalo vrijeme</translation> -<translation id="772727223731580981">Dodatni izbornik</translation> <translation id="7740016676195725605">zaustavljanje prikazivanja titlova</translation> <translation id="7740050170769002709">HTML sadržaj</translation> <translation id="7789962463072032349">pauziraj</translation>
diff --git a/content/app/strings/translations/content_strings_hu.xtb b/content/app/strings/translations/content_strings_hu.xtb index 1966631..d50e0df1 100644 --- a/content/app/strings/translations/content_strings_hu.xtb +++ b/content/app/strings/translations/content_strings_hu.xtb
@@ -158,7 +158,6 @@ <translation id="7514365320538308">Letöltés</translation> <translation id="7673697353781729403">Óra</translation> <translation id="7720026100085573005">hátralévő idő</translation> -<translation id="772727223731580981">További elemeket tartalmazó menü</translation> <translation id="7740016676195725605">feliratok elrejtése</translation> <translation id="7740050170769002709">HTML-tartalom</translation> <translation id="7789962463072032349">szüneteltetés</translation>
diff --git a/content/app/strings/translations/content_strings_id.xtb b/content/app/strings/translations/content_strings_id.xtb index 1a04986..b3062185 100644 --- a/content/app/strings/translations/content_strings_id.xtb +++ b/content/app/strings/translations/content_strings_id.xtb
@@ -158,7 +158,6 @@ <translation id="7514365320538308">Unduh</translation> <translation id="7673697353781729403">Jam</translation> <translation id="7720026100085573005">sisa waktu</translation> -<translation id="772727223731580981">Menu luapan</translation> <translation id="7740016676195725605">berhenti menampilkan teks</translation> <translation id="7740050170769002709">Konten HTML</translation> <translation id="7789962463072032349">jeda</translation>
diff --git a/content/app/strings/translations/content_strings_it.xtb b/content/app/strings/translations/content_strings_it.xtb index 6a47441..e6ebac96 100644 --- a/content/app/strings/translations/content_strings_it.xtb +++ b/content/app/strings/translations/content_strings_it.xtb
@@ -158,7 +158,6 @@ <translation id="7514365320538308">Scarica</translation> <translation id="7673697353781729403">Orario</translation> <translation id="7720026100085573005">tempo rimanente</translation> -<translation id="772727223731580981">Menu di overflow</translation> <translation id="7740016676195725605">interrompi la visualizzazione dei sottotitoli</translation> <translation id="7740050170769002709">Contenuti HTML</translation> <translation id="7789962463072032349">pausa</translation>
diff --git a/content/app/strings/translations/content_strings_iw.xtb b/content/app/strings/translations/content_strings_iw.xtb index 042327dc..080631a5 100644 --- a/content/app/strings/translations/content_strings_iw.xtb +++ b/content/app/strings/translations/content_strings_iw.xtb
@@ -158,7 +158,6 @@ <translation id="7514365320538308">הורד</translation> <translation id="7673697353781729403">שעות</translation> <translation id="7720026100085573005">זמן שנותר</translation> -<translation id="772727223731580981">אפשרויות נוספות</translation> <translation id="7740016676195725605">הפסק להציג כתוביות סגורות</translation> <translation id="7740050170769002709">תוכן HTML</translation> <translation id="7789962463072032349">השהה</translation>
diff --git a/content/app/strings/translations/content_strings_ja.xtb b/content/app/strings/translations/content_strings_ja.xtb index 36af9da..44ec496 100644 --- a/content/app/strings/translations/content_strings_ja.xtb +++ b/content/app/strings/translations/content_strings_ja.xtb
@@ -158,7 +158,6 @@ <translation id="7514365320538308">ダウンロード</translation> <translation id="7673697353781729403">時間</translation> <translation id="7720026100085573005">残り時間</translation> -<translation id="772727223731580981">オーバーフロー メニュー</translation> <translation id="7740016676195725605">クローズド キャプションの表示を終了</translation> <translation id="7740050170769002709">HTML コンテンツ</translation> <translation id="7789962463072032349">一時停止</translation>
diff --git a/content/app/strings/translations/content_strings_kn.xtb b/content/app/strings/translations/content_strings_kn.xtb index 86d9695..4bb1e8fc 100644 --- a/content/app/strings/translations/content_strings_kn.xtb +++ b/content/app/strings/translations/content_strings_kn.xtb
@@ -2,7 +2,7 @@ <!DOCTYPE translationbundle> <translationbundle lang="kn"> <translation id="1018939186200882850">ಮೆನು ಐಟಂ</translation> -<translation id="1020833440720551630">ಆಡಿಯೋ ಟ್ರ್ಯಾಕ್ ಮ್ಯೂಟ್ ಮಾಡು</translation> +<translation id="1020833440720551630">ಆಡಿಯೋ ಟ್ರ್ಯಾಕ್ ಮ್ಯೂಟ್ ಮಾಡಿ</translation> <translation id="10623998915015855">ಟಾಗಲ್ ಬಟನ್</translation> <translation id="1088086359088493902">ಸೆಕೆಂಡುಗಳು</translation> <translation id="1171774979989969504">ದಯವಿಟ್ಟು ಇಮೇಲ್ ವಿಳಾಸವನ್ನು ನಮೂದಿಸಿ.</translation> @@ -158,7 +158,6 @@ <translation id="7514365320538308">ಡೌನ್ಲೋಡ್</translation> <translation id="7673697353781729403">ಗಂಟೆಗಳು</translation> <translation id="7720026100085573005">ಉಳಿದಿರುವ ಸಮಯ</translation> -<translation id="772727223731580981">ಓವರ್ಫ್ಲೋ ಮೆನು</translation> <translation id="7740016676195725605">ಮುಚ್ಚಲಾಗಿರುವ ಶೀರ್ಷಿಕೆಗಳ ಪ್ರದರ್ಶಿಸುವಿಕೆಯನ್ನು ನಿಲ್ಲಿಸಿ</translation> <translation id="7740050170769002709">HTML ವಿಷಯ</translation> <translation id="7789962463072032349">ವಿರಾಮ</translation>
diff --git a/content/app/strings/translations/content_strings_ko.xtb b/content/app/strings/translations/content_strings_ko.xtb index a9f5403f..833a3d1 100644 --- a/content/app/strings/translations/content_strings_ko.xtb +++ b/content/app/strings/translations/content_strings_ko.xtb
@@ -158,7 +158,6 @@ <translation id="7514365320538308">다운로드</translation> <translation id="7673697353781729403">시간</translation> <translation id="7720026100085573005">남은 시간</translation> -<translation id="772727223731580981">더보기 메뉴</translation> <translation id="7740016676195725605">캡션 표시 중지</translation> <translation id="7740050170769002709">HTML 콘텐츠</translation> <translation id="7789962463072032349">일시중지</translation>
diff --git a/content/app/strings/translations/content_strings_lt.xtb b/content/app/strings/translations/content_strings_lt.xtb index 9f53c1e0..2edb380 100644 --- a/content/app/strings/translations/content_strings_lt.xtb +++ b/content/app/strings/translations/content_strings_lt.xtb
@@ -158,7 +158,6 @@ <translation id="7514365320538308">Atsisiųsti</translation> <translation id="7673697353781729403">Valandos</translation> <translation id="7720026100085573005">likęs laikas</translation> -<translation id="772727223731580981">Perpildymo meniu</translation> <translation id="7740016676195725605">nebepateikti subtitrų</translation> <translation id="7740050170769002709">HTML turinys</translation> <translation id="7789962463072032349">pristabdyti</translation>
diff --git a/content/app/strings/translations/content_strings_lv.xtb b/content/app/strings/translations/content_strings_lv.xtb index 29462ff..79c5bf0d 100644 --- a/content/app/strings/translations/content_strings_lv.xtb +++ b/content/app/strings/translations/content_strings_lv.xtb
@@ -158,7 +158,6 @@ <translation id="7514365320538308">Lejupielādēt</translation> <translation id="7673697353781729403">Stundas</translation> <translation id="7720026100085573005">atlikušais laiks</translation> -<translation id="772727223731580981">Pārpildes izvēlne</translation> <translation id="7740016676195725605">apturēt slēgto parakstu rādīšanu</translation> <translation id="7740050170769002709">HTML saturs</translation> <translation id="7789962463072032349">pauzēt</translation>
diff --git a/content/app/strings/translations/content_strings_ml.xtb b/content/app/strings/translations/content_strings_ml.xtb index 7537e64..80f9ee6 100644 --- a/content/app/strings/translations/content_strings_ml.xtb +++ b/content/app/strings/translations/content_strings_ml.xtb
@@ -158,7 +158,6 @@ <translation id="7514365320538308">ഡൗൺലോഡുചെയ്യുക</translation> <translation id="7673697353781729403">മണിക്കൂര്</translation> <translation id="7720026100085573005">അവശേഷിക്കുന്ന സമയം</translation> -<translation id="772727223731580981">ഓവർഫ്ലോ മെനു</translation> <translation id="7740016676195725605">അടച്ച അടിക്കുറിപ്പുകൾ പ്രദർശിപ്പിക്കുന്നത് നിർത്തുക</translation> <translation id="7740050170769002709">HTML ഉള്ളടക്കം</translation> <translation id="7789962463072032349">താല്ക്കാലികമായി നിര്ത്തുക</translation>
diff --git a/content/app/strings/translations/content_strings_mr.xtb b/content/app/strings/translations/content_strings_mr.xtb index 8af8228..c198db6 100644 --- a/content/app/strings/translations/content_strings_mr.xtb +++ b/content/app/strings/translations/content_strings_mr.xtb
@@ -158,7 +158,6 @@ <translation id="7514365320538308">डाउनलोड करा</translation> <translation id="7673697353781729403">तास</translation> <translation id="7720026100085573005">शिल्लक वेळ</translation> -<translation id="772727223731580981">ओव्हरफ्लो मेनू</translation> <translation id="7740016676195725605">बंद मथळा प्रदर्शित करणे थांबवा</translation> <translation id="7740050170769002709">HTML सामुग्री</translation> <translation id="7789962463072032349">विराम द्या</translation>
diff --git a/content/app/strings/translations/content_strings_ms.xtb b/content/app/strings/translations/content_strings_ms.xtb index 247d40c..82fce945 100644 --- a/content/app/strings/translations/content_strings_ms.xtb +++ b/content/app/strings/translations/content_strings_ms.xtb
@@ -158,7 +158,6 @@ <translation id="7514365320538308">Muat Turun</translation> <translation id="7673697353781729403">Jam</translation> <translation id="7720026100085573005">masa yang tinggal</translation> -<translation id="772727223731580981">Menu limpahan</translation> <translation id="7740016676195725605">berhenti memaparkan kapsyen tertutup</translation> <translation id="7740050170769002709">Kandungan HTML</translation> <translation id="7789962463072032349">jeda</translation>
diff --git a/content/app/strings/translations/content_strings_nl.xtb b/content/app/strings/translations/content_strings_nl.xtb index aedcd74..d14a463a 100644 --- a/content/app/strings/translations/content_strings_nl.xtb +++ b/content/app/strings/translations/content_strings_nl.xtb
@@ -68,13 +68,13 @@ <translation id="3632707345189162177">aantal seconden van resterende film</translation> <translation id="3706100364254443312">schakelaar</translation> <translation id="3732799496749320381">mm</translation> -<translation id="3785482301506746191">schuifbalk met tijd van de film</translation> +<translation id="3785482301506746191">scrollbar met tijd van de film</translation> <translation id="3808586225841795776">term</translation> <translation id="3822383571486410024">Breid deze tekst uit tot <ph name="MIN_CHARACTERS" /> tekens of meer (je gebruikt momenteel <ph name="CURRENT_LENGTH" /> tekens).</translation> <translation id="383465348367842624">Het naamgedeelte vóór '<ph name="ATSIGN" />' mag niet het teken '<ph name="INVALIDCHARACTER" />' bevatten.</translation> <translation id="3846214748874656680">Volledig scherm sluiten</translation> <translation id="3924558731517983934">app</translation> -<translation id="3960700977367013758">schuifbalk</translation> +<translation id="3960700977367013758">scrollbar</translation> <translation id="4103419683916926126">Milliseconden</translation> <translation id="4151657705144244502">afbeelding</translation> <translation id="4201051445878709314">Vorige maand weergeven</translation> @@ -128,9 +128,9 @@ <translation id="6119846243427417423">Activeren</translation> <translation id="6164829606128959761">meter</translation> <translation id="6270583010843788609">miniatuur van tijdlijn van film</translation> -<translation id="6359256949422175976">miniatuur van schuifbalk met tijd van de film</translation> +<translation id="6359256949422175976">miniatuur van scrollbar met tijd van de film</translation> <translation id="6398862346408813489">Deelvenster voor maandselectie weergeven</translation> -<translation id="6404546809543547843">schuifbalk met audiotijd</translation> +<translation id="6404546809543547843">scrollbar met audiotijd</translation> <translation id="648732519525291180">tijdkiezer</translation> <translation id="658823671542763450">volledig scherm openen</translation> <translation id="6637586476836377253">logboek</translation> @@ -158,7 +158,6 @@ <translation id="7514365320538308">Downloaden</translation> <translation id="7673697353781729403">Uur</translation> <translation id="7720026100085573005">resterende tijd</translation> -<translation id="772727223731580981">Overloopmenu</translation> <translation id="7740016676195725605">het weergeven van ondertiteling stoppen</translation> <translation id="7740050170769002709">HTML-content</translation> <translation id="7789962463072032349">onderbreken</translation>
diff --git a/content/app/strings/translations/content_strings_no.xtb b/content/app/strings/translations/content_strings_no.xtb index 1d0132c..a9a67ae8d 100644 --- a/content/app/strings/translations/content_strings_no.xtb +++ b/content/app/strings/translations/content_strings_no.xtb
@@ -158,7 +158,6 @@ <translation id="7514365320538308">Last ned</translation> <translation id="7673697353781729403">Timer</translation> <translation id="7720026100085573005">tid som gjenstår</translation> -<translation id="772727223731580981">Overflytsmeny</translation> <translation id="7740016676195725605">slå av tekstingen</translation> <translation id="7740050170769002709">HTML-innhold</translation> <translation id="7789962463072032349">stans midlertidig</translation>
diff --git a/content/app/strings/translations/content_strings_pl.xtb b/content/app/strings/translations/content_strings_pl.xtb index c2644f9..5b83dfa 100644 --- a/content/app/strings/translations/content_strings_pl.xtb +++ b/content/app/strings/translations/content_strings_pl.xtb
@@ -158,7 +158,6 @@ <translation id="7514365320538308">Pobierz</translation> <translation id="7673697353781729403">Godziny</translation> <translation id="7720026100085573005">pozostały czas</translation> -<translation id="772727223731580981">Rozszerzone menu</translation> <translation id="7740016676195725605">przestań pokazywać napisy</translation> <translation id="7740050170769002709">Treść HTML</translation> <translation id="7789962463072032349">wstrzymaj</translation>
diff --git a/content/app/strings/translations/content_strings_pt-BR.xtb b/content/app/strings/translations/content_strings_pt-BR.xtb index 7b3834c..207fcdd7 100644 --- a/content/app/strings/translations/content_strings_pt-BR.xtb +++ b/content/app/strings/translations/content_strings_pt-BR.xtb
@@ -158,7 +158,6 @@ <translation id="7514365320538308">Fazer o download</translation> <translation id="7673697353781729403">Horas</translation> <translation id="7720026100085573005">tempo restante</translation> -<translation id="772727223731580981">Menu flutuante</translation> <translation id="7740016676195725605">parar de exibir legendas ocultas</translation> <translation id="7740050170769002709">Conteúdo HTML</translation> <translation id="7789962463072032349">pausar</translation>
diff --git a/content/app/strings/translations/content_strings_pt-PT.xtb b/content/app/strings/translations/content_strings_pt-PT.xtb index 8988ae2..cb2d8b8 100644 --- a/content/app/strings/translations/content_strings_pt-PT.xtb +++ b/content/app/strings/translations/content_strings_pt-PT.xtb
@@ -158,7 +158,6 @@ <translation id="7514365320538308">Transferir</translation> <translation id="7673697353781729403">Horas</translation> <translation id="7720026100085573005">tempo restante</translation> -<translation id="772727223731580981">Menu adicional</translation> <translation id="7740016676195725605">parar de apresentar legendas ocultas</translation> <translation id="7740050170769002709">Conteúdo HTML</translation> <translation id="7789962463072032349">pausa</translation>
diff --git a/content/app/strings/translations/content_strings_ro.xtb b/content/app/strings/translations/content_strings_ro.xtb index bb0b67c..61a81c8 100644 --- a/content/app/strings/translations/content_strings_ro.xtb +++ b/content/app/strings/translations/content_strings_ro.xtb
@@ -158,7 +158,6 @@ <translation id="7514365320538308">Descarcă</translation> <translation id="7673697353781729403">Ore</translation> <translation id="7720026100085573005">timp rămas</translation> -<translation id="772727223731580981">Meniu suplimentar</translation> <translation id="7740016676195725605">nu mai afișați subtitrările</translation> <translation id="7740050170769002709">Conținut HTML</translation> <translation id="7789962463072032349">întrerupe</translation>
diff --git a/content/app/strings/translations/content_strings_ru.xtb b/content/app/strings/translations/content_strings_ru.xtb index 68984d1..2769d559 100644 --- a/content/app/strings/translations/content_strings_ru.xtb +++ b/content/app/strings/translations/content_strings_ru.xtb
@@ -158,7 +158,6 @@ <translation id="7514365320538308">Скачать</translation> <translation id="7673697353781729403">Часы</translation> <translation id="7720026100085573005">оставшееся время</translation> -<translation id="772727223731580981">Дополнительное меню</translation> <translation id="7740016676195725605">скрыть субтитры</translation> <translation id="7740050170769002709">HTML-содержание</translation> <translation id="7789962463072032349">Пауза</translation>
diff --git a/content/app/strings/translations/content_strings_sk.xtb b/content/app/strings/translations/content_strings_sk.xtb index e476ea5a..80a6ebe 100644 --- a/content/app/strings/translations/content_strings_sk.xtb +++ b/content/app/strings/translations/content_strings_sk.xtb
@@ -158,7 +158,6 @@ <translation id="7514365320538308">Stiahnuť</translation> <translation id="7673697353781729403">Hodiny</translation> <translation id="7720026100085573005">zostávajúci čas</translation> -<translation id="772727223731580981">Rozšírená ponuka</translation> <translation id="7740016676195725605">ukončiť zobrazovanie skrytých titulkov</translation> <translation id="7740050170769002709">Obsah HTML</translation> <translation id="7789962463072032349">pozastaviť</translation>
diff --git a/content/app/strings/translations/content_strings_sl.xtb b/content/app/strings/translations/content_strings_sl.xtb index e1d2d00..b30429ff 100644 --- a/content/app/strings/translations/content_strings_sl.xtb +++ b/content/app/strings/translations/content_strings_sl.xtb
@@ -158,7 +158,6 @@ <translation id="7514365320538308">Prenos</translation> <translation id="7673697353781729403">Ure</translation> <translation id="7720026100085573005">preostali čas</translation> -<translation id="772727223731580981">Meni z dodatnimi elementi</translation> <translation id="7740016676195725605">ustavitev prikazovanja podnapisov</translation> <translation id="7740050170769002709">Vsebina HTML</translation> <translation id="7789962463072032349">premor</translation>
diff --git a/content/app/strings/translations/content_strings_sr.xtb b/content/app/strings/translations/content_strings_sr.xtb index 562d1dc..890c95f 100644 --- a/content/app/strings/translations/content_strings_sr.xtb +++ b/content/app/strings/translations/content_strings_sr.xtb
@@ -158,7 +158,6 @@ <translation id="7514365320538308">Преузми</translation> <translation id="7673697353781729403">Сати</translation> <translation id="7720026100085573005">преостало време</translation> -<translation id="772727223731580981">Преклопни мени</translation> <translation id="7740016676195725605">зауставите приказивање опционалног титла</translation> <translation id="7740050170769002709">HTML садржај</translation> <translation id="7789962463072032349">паузирај</translation>
diff --git a/content/app/strings/translations/content_strings_sv.xtb b/content/app/strings/translations/content_strings_sv.xtb index 3701110..62245bd6 100644 --- a/content/app/strings/translations/content_strings_sv.xtb +++ b/content/app/strings/translations/content_strings_sv.xtb
@@ -158,7 +158,6 @@ <translation id="7514365320538308">Ladda ned</translation> <translation id="7673697353781729403">Timmar</translation> <translation id="7720026100085573005">återstående tid</translation> -<translation id="772727223731580981">Fler menyalternativ</translation> <translation id="7740016676195725605">sluta visa textning</translation> <translation id="7740050170769002709">HTML-innehåll</translation> <translation id="7789962463072032349">paus</translation>
diff --git a/content/app/strings/translations/content_strings_sw.xtb b/content/app/strings/translations/content_strings_sw.xtb index edba611..b78cf88 100644 --- a/content/app/strings/translations/content_strings_sw.xtb +++ b/content/app/strings/translations/content_strings_sw.xtb
@@ -158,7 +158,6 @@ <translation id="7514365320538308">Pakua</translation> <translation id="7673697353781729403">Saa</translation> <translation id="7720026100085573005">muda unaosalia</translation> -<translation id="772727223731580981">Menyu ya vipengee vya ziada</translation> <translation id="7740016676195725605">koma kuonyesha manukuu yanaweza kufichwa</translation> <translation id="7740050170769002709">Maudhui ya HTML</translation> <translation id="7789962463072032349">Sitisha</translation>
diff --git a/content/app/strings/translations/content_strings_ta.xtb b/content/app/strings/translations/content_strings_ta.xtb index 9f9f3299..4159321d 100644 --- a/content/app/strings/translations/content_strings_ta.xtb +++ b/content/app/strings/translations/content_strings_ta.xtb
@@ -158,7 +158,6 @@ <translation id="7514365320538308">பதிவிறக்கு</translation> <translation id="7673697353781729403">மணிநேரம்</translation> <translation id="7720026100085573005">மீதமுள்ள நேரம்</translation> -<translation id="772727223731580981">கூடுதல் விருப்பங்கள்</translation> <translation id="7740016676195725605">மூடப்பட்ட தலைப்புகளைக் காட்டுவதை நிறுத்து</translation> <translation id="7740050170769002709">HTML உள்ளடக்கம்</translation> <translation id="7789962463072032349">இடைநிறுத்து</translation>
diff --git a/content/app/strings/translations/content_strings_te.xtb b/content/app/strings/translations/content_strings_te.xtb index a3d6a54d..efccd93 100644 --- a/content/app/strings/translations/content_strings_te.xtb +++ b/content/app/strings/translations/content_strings_te.xtb
@@ -158,7 +158,6 @@ <translation id="7514365320538308">డౌన్లోడ్ చేయి</translation> <translation id="7673697353781729403">గంటలు</translation> <translation id="7720026100085573005">మిగిలి ఉన్న సమయం</translation> -<translation id="772727223731580981">నిండిపోయిన మెను</translation> <translation id="7740016676195725605">సంవృత శీర్షికలను ప్రదర్శించడం ఆపివేయి</translation> <translation id="7740050170769002709">HTML కంటెంట్</translation> <translation id="7789962463072032349">నిలిపివేయి</translation>
diff --git a/content/app/strings/translations/content_strings_th.xtb b/content/app/strings/translations/content_strings_th.xtb index 13ada8ff..f90fae2 100644 --- a/content/app/strings/translations/content_strings_th.xtb +++ b/content/app/strings/translations/content_strings_th.xtb
@@ -158,7 +158,6 @@ <translation id="7514365320538308">ดาวน์โหลด</translation> <translation id="7673697353781729403">ชั่วโมง</translation> <translation id="7720026100085573005">เวลาที่เหลือ</translation> -<translation id="772727223731580981">เมนูรายการเพิ่มเติม</translation> <translation id="7740016676195725605">หยุดแสดงคำอธิบายภาพ</translation> <translation id="7740050170769002709">เนื้อหา HTML</translation> <translation id="7789962463072032349">หยุดชั่วคราว</translation>
diff --git a/content/app/strings/translations/content_strings_tr.xtb b/content/app/strings/translations/content_strings_tr.xtb index 7c57816..a730a76e 100644 --- a/content/app/strings/translations/content_strings_tr.xtb +++ b/content/app/strings/translations/content_strings_tr.xtb
@@ -158,7 +158,6 @@ <translation id="7514365320538308">İndir</translation> <translation id="7673697353781729403">Saat</translation> <translation id="7720026100085573005">kalan süre</translation> -<translation id="772727223731580981">Taşma menüsü</translation> <translation id="7740016676195725605">altyazıların görüntülenmesini durdur</translation> <translation id="7740050170769002709">HTML içeriği</translation> <translation id="7789962463072032349">duraklat</translation>
diff --git a/content/app/strings/translations/content_strings_uk.xtb b/content/app/strings/translations/content_strings_uk.xtb index c3874e3..999c0af 100644 --- a/content/app/strings/translations/content_strings_uk.xtb +++ b/content/app/strings/translations/content_strings_uk.xtb
@@ -158,7 +158,6 @@ <translation id="7514365320538308">Завантажити</translation> <translation id="7673697353781729403">Години</translation> <translation id="7720026100085573005">залишилось часу</translation> -<translation id="772727223731580981">Додаткове меню</translation> <translation id="7740016676195725605">сховати приховані субтитри</translation> <translation id="7740050170769002709">Вміст HTML</translation> <translation id="7789962463072032349">призупинити</translation>
diff --git a/content/app/strings/translations/content_strings_vi.xtb b/content/app/strings/translations/content_strings_vi.xtb index 9482891a3d..7a2934b 100644 --- a/content/app/strings/translations/content_strings_vi.xtb +++ b/content/app/strings/translations/content_strings_vi.xtb
@@ -158,7 +158,6 @@ <translation id="7514365320538308">Tải xuống</translation> <translation id="7673697353781729403">Giờ</translation> <translation id="7720026100085573005">thời gian còn lại</translation> -<translation id="772727223731580981">Menu mục bổ sung</translation> <translation id="7740016676195725605">ngừng hiển thị phụ đề chi tiết</translation> <translation id="7740050170769002709">Nội dung HTML</translation> <translation id="7789962463072032349">tạm dừng</translation>
diff --git a/content/app/strings/translations/content_strings_zh-CN.xtb b/content/app/strings/translations/content_strings_zh-CN.xtb index 3c5058c..98ac2c9 100644 --- a/content/app/strings/translations/content_strings_zh-CN.xtb +++ b/content/app/strings/translations/content_strings_zh-CN.xtb
@@ -158,7 +158,6 @@ <translation id="7514365320538308">下载</translation> <translation id="7673697353781729403">小时</translation> <translation id="7720026100085573005">剩余时间</translation> -<translation id="772727223731580981">溢出菜单</translation> <translation id="7740016676195725605">停止显示可选字幕</translation> <translation id="7740050170769002709">HTML 内容</translation> <translation id="7789962463072032349">暂停</translation>
diff --git a/content/app/strings/translations/content_strings_zh-TW.xtb b/content/app/strings/translations/content_strings_zh-TW.xtb index 15b879f0..387eb624 100644 --- a/content/app/strings/translations/content_strings_zh-TW.xtb +++ b/content/app/strings/translations/content_strings_zh-TW.xtb
@@ -158,7 +158,6 @@ <translation id="7514365320538308">下載</translation> <translation id="7673697353781729403">小時</translation> <translation id="7720026100085573005">剩餘時間</translation> -<translation id="772727223731580981">溢位選單</translation> <translation id="7740016676195725605">停止顯示字幕</translation> <translation id="7740050170769002709">HTML 內容</translation> <translation id="7789962463072032349">暫停</translation>
diff --git a/content/browser/BUILD.gn b/content/browser/BUILD.gn index 3154b27..534bf7f3 100644 --- a/content/browser/BUILD.gn +++ b/content/browser/BUILD.gn
@@ -132,7 +132,6 @@ "//ui/resources", "//ui/shell_dialogs", "//ui/snapshot", - "//ui/surface", "//ui/touch_selection", ] @@ -628,8 +627,6 @@ "gpu/gpu_process_host.h", "gpu/gpu_process_host_ui_shim.cc", "gpu/gpu_process_host_ui_shim.h", - "gpu/gpu_surface_tracker.cc", - "gpu/gpu_surface_tracker.h", "gpu/shader_disk_cache.cc", "gpu/shader_disk_cache.h", "histogram_controller.cc", @@ -872,6 +869,8 @@ "media/session/media_session_uma_helper.h", "memory/memory_coordinator.cc", "memory/memory_coordinator.h", + "memory/memory_coordinator_impl.cc", + "memory/memory_coordinator_impl.h", "memory/memory_message_filter.cc", "memory/memory_message_filter.h", "memory/memory_monitor.cc", @@ -1893,6 +1892,10 @@ deps += [ "//ui/compositor" ] } + if (is_android || is_mac) { + deps += [ "//gpu/ipc/common:gpu_surface_tracker" ] + } + if (enable_web_speech) { deps += [ "//third_party/flac" ] } @@ -1913,13 +1916,6 @@ deps += [ "//ui/ozone" ] } - if (!is_mac && !is_android) { - sources -= [ - "gpu/gpu_surface_tracker.cc", - "gpu/gpu_surface_tracker.h", - ] - } - if (enable_webvr) { deps += [ "//device/vr" ] }
diff --git a/content/browser/accessibility/browser_accessibility_manager_android.cc b/content/browser/accessibility/browser_accessibility_manager_android.cc index ad8e0dd2..4a772dd 100644 --- a/content/browser/accessibility/browser_accessibility_manager_android.cc +++ b/content/browser/accessibility/browser_accessibility_manager_android.cc
@@ -694,6 +694,15 @@ return false; } +void BrowserAccessibilityManagerAndroid::ShowContextMenu( + JNIEnv* env, + const JavaParamRef<jobject>& obj, + jint id) { + BrowserAccessibilityAndroid* node = GetFromUniqueID(id); + if (node && node->manager()->delegate()) + node->manager()->delegate()->AccessibilityShowContextMenu(node->GetId()); +} + void BrowserAccessibilityManagerAndroid::HandleHoverEvent( BrowserAccessibility* node) { JNIEnv* env = AttachCurrentThread();
diff --git a/content/browser/accessibility/browser_accessibility_manager_android.h b/content/browser/accessibility/browser_accessibility_manager_android.h index d17a675..3e6d072d 100644 --- a/content/browser/accessibility/browser_accessibility_manager_android.h +++ b/content/browser/accessibility/browser_accessibility_manager_android.h
@@ -154,6 +154,9 @@ const base::android::JavaParamRef<jobject>& obj, jint id, jboolean increment); + void ShowContextMenu(JNIEnv* env, + const base::android::JavaParamRef<jobject>& obj, + jint id); // Return the id of the next node in tree order in the direction given by // |forwards|, starting with |start_id|, that matches |element_type|,
diff --git a/content/browser/android/child_process_launcher_android.cc b/content/browser/android/child_process_launcher_android.cc index d2733833..94a377c 100644 --- a/content/browser/android/child_process_launcher_android.cc +++ b/content/browser/android/child_process_launcher_android.cc
@@ -22,6 +22,7 @@ #include "content/public/browser/browser_thread.h" #include "content/public/browser/render_process_host.h" #include "content/public/common/content_switches.h" +#include "gpu/ipc/common/gpu_surface_tracker.h" #include "jni/ChildProcessLauncher_jni.h" #include "media/base/android/media_player_android.h" #include "ui/gl/android/surface_texture.h" @@ -213,25 +214,6 @@ gl::ScopedJavaSurface(jsurface)); } -void RegisterViewSurface(int surface_id, const JavaRef<jobject>& j_surface) { - JNIEnv* env = AttachCurrentThread(); - DCHECK(env); - Java_ChildProcessLauncher_registerViewSurface(env, surface_id, j_surface); -} - -void UnregisterViewSurface(int surface_id) { - JNIEnv* env = AttachCurrentThread(); - DCHECK(env); - Java_ChildProcessLauncher_unregisterViewSurface(env, surface_id); -} - -gl::ScopedJavaSurface GetViewSurface(int surface_id) { - JNIEnv* env = AttachCurrentThread(); - DCHECK(env); - return gl::ScopedJavaSurface::AcquireExternalSurface( - Java_ChildProcessLauncher_getViewSurface(env, surface_id).obj()); -} - void CreateSurfaceTextureSurface(int surface_texture_id, int client_id, gl::SurfaceTexture* surface_texture) { @@ -263,6 +245,14 @@ switches::kSingleProcess); } +base::android::ScopedJavaLocalRef<jobject> GetViewSurface(JNIEnv* env, + const base::android::JavaParamRef<jclass>& jcaller, + jint surface_id) { + gl::ScopedJavaSurface surface_view = + gpu::GpuSurfaceTracker::GetInstance()->AcquireJavaSurface(surface_id); + return base::android::ScopedJavaLocalRef<jobject>(surface_view.j_surface()); +} + bool RegisterChildProcessLauncher(JNIEnv* env) { return RegisterNativesImpl(env); }
diff --git a/content/browser/android/child_process_launcher_android.h b/content/browser/android/child_process_launcher_android.h index f97e5a9..0dbebc2 100644 --- a/content/browser/android/child_process_launcher_android.h +++ b/content/browser/android/child_process_launcher_android.h
@@ -41,13 +41,6 @@ void SetChildProcessInForeground(base::ProcessHandle handle, bool in_foreground); -void RegisterViewSurface(int surface_id, - const base::android::JavaRef<jobject>& j_surface); - -void UnregisterViewSurface(int surface_id); - -gl::ScopedJavaSurface GetViewSurface(int surface_id); - void CreateSurfaceTextureSurface(int surface_texture_id, int client_id, gl::SurfaceTexture* surface_texture);
diff --git a/content/browser/android/content_view_core_impl.cc b/content/browser/android/content_view_core_impl.cc index ee26b1b3..498c94f2 100644 --- a/content/browser/android/content_view_core_impl.cc +++ b/content/browser/android/content_view_core_impl.cc
@@ -258,9 +258,8 @@ ContentViewCoreImpl::~ContentViewCoreImpl() { view_.GetLayer()->RemoveFromParent(); - FOR_EACH_OBSERVER(ContentViewCoreImplObserver, - observer_list_, - OnContentViewCoreDestroyed()); + for (auto& observer : observer_list_) + observer.OnContentViewCoreDestroyed(); observer_list_.Clear(); JNIEnv* env = base::android::AttachCurrentThread(); @@ -281,13 +280,11 @@ ui::WindowAndroid* window = reinterpret_cast<ui::WindowAndroid*>(window_android); window->AddChild(&view_); - FOR_EACH_OBSERVER(ContentViewCoreImplObserver, - observer_list_, - OnAttachedToWindow()); + for (auto& observer : observer_list_) + observer.OnAttachedToWindow(); } else { - FOR_EACH_OBSERVER(ContentViewCoreImplObserver, - observer_list_, - OnDetachedFromWindow()); + for (auto& observer : observer_list_) + observer.OnDetachedFromWindow(); view_.RemoveFromParent(); } }
diff --git a/content/browser/android/content_view_statics.cc b/content/browser/android/content_view_statics.cc index 81c3e35..b0f43af 100644 --- a/content/browser/android/content_view_statics.cc +++ b/content/browser/android/content_view_statics.cc
@@ -11,6 +11,7 @@ #include "base/lazy_instance.h" #include "base/logging.h" #include "content/browser/android/content_view_statics.h" +#include "content/browser/renderer_host/render_process_host_impl.h" #include "content/common/android/address_parser.h" #include "content/common/view_messages.h" #include "content/public/browser/render_process_host.h" @@ -60,7 +61,7 @@ !i.IsAtEnd(); i.Advance()) { content::RenderProcessHost* host = i.GetCurrentValue(); host->AddObserver(this); - host->Send(new ViewMsg_SetWebKitSharedTimersSuspended(true)); + host->GetRendererInterface()->SetWebKitSharedTimersSuspended(true); suspended_processes_.push_back(host->GetID()); } } @@ -73,7 +74,7 @@ content::RenderProcessHost::FromID(*it); DCHECK(host); host->RemoveObserver(this); - host->Send(new ViewMsg_SetWebKitSharedTimersSuspended(false)); + host->GetRendererInterface()->SetWebKitSharedTimersSuspended(false); } suspended_processes_.clear(); }
diff --git a/content/browser/appcache/appcache_group.cc b/content/browser/appcache/appcache_group.cc index 0e8f3c4..573983eb 100644 --- a/content/browser/appcache/appcache_group.cc +++ b/content/browser/appcache/appcache_group.cc
@@ -260,7 +260,8 @@ // deletion by adding an extra ref in this scope (but only if we're not // in our destructor). scoped_refptr<AppCacheGroup> protect(is_in_dtor_ ? NULL : this); - FOR_EACH_OBSERVER(UpdateObserver, observers_, OnUpdateComplete(this)); + for (auto& observer : observers_) + observer.OnUpdateComplete(this); if (!queued_updates_.empty()) ScheduleUpdateRestart(kUpdateRestartDelayMs); }
diff --git a/content/browser/appcache/appcache_host.cc b/content/browser/appcache/appcache_host.cc index 697b2bd..adcefe08 100644 --- a/content/browser/appcache/appcache_host.cc +++ b/content/browser/appcache/appcache_host.cc
@@ -62,7 +62,8 @@ AppCacheHost::~AppCacheHost() { service_->RemoveObserver(this); - FOR_EACH_OBSERVER(Observer, observers_, OnDestructionImminent(this)); + for (auto& observer : observers_) + observer.OnDestructionImminent(this); if (associated_cache_.get()) associated_cache_->UnassociateHost(this); if (group_being_updated_.get()) @@ -453,7 +454,8 @@ else if (!pending_swap_cache_callback_.is_null()) DoPendingSwapCache(); - FOR_EACH_OBSERVER(Observer, observers_, OnCacheSelectionComplete(this)); + for (auto& observer : observers_) + observer.OnCacheSelectionComplete(this); } void AppCacheHost::OnServiceReinitialized(
diff --git a/content/browser/appcache/appcache_service_impl.cc b/content/browser/appcache/appcache_service_impl.cc index fbc0027..847061a 100644 --- a/content/browser/appcache/appcache_service_impl.cc +++ b/content/browser/appcache/appcache_service_impl.cc
@@ -412,7 +412,8 @@ AppCacheServiceImpl::~AppCacheServiceImpl() { DCHECK(backends_.empty()); - FOR_EACH_OBSERVER(Observer, observers_, OnServiceDestructionImminent(this)); + for (auto& observer : observers_) + observer.OnServiceDestructionImminent(this); for (auto* helper : pending_helpers_) helper->Cancel(); base::STLDeleteElements(&pending_helpers_); @@ -472,8 +473,8 @@ // defer deletion of the old storage object. scoped_refptr<AppCacheStorageReference> old_storage_ref( new AppCacheStorageReference(std::move(storage_))); - FOR_EACH_OBSERVER(Observer, observers_, - OnServiceReinitialized(old_storage_ref.get())); + for (auto& observer : observers_) + observer.OnServiceReinitialized(old_storage_ref.get()); Initialize(cache_directory_, db_thread_, cache_thread_); }
diff --git a/content/browser/bad_message.h b/content/browser/bad_message.h index 0e91801..8d2e243 100644 --- a/content/browser/bad_message.h +++ b/content/browser/bad_message.h
@@ -164,6 +164,7 @@ ARH_CREATED_STREAM_WITHOUT_AUTHORIZATION = 140, MDDH_INVALID_DEVICE_TYPE_REQUEST = 141, MDDH_UNAUTHORIZED_ORIGIN = 142, + NMF_INVALID_ID_CLOSE = 143, // Please add new elements here. The naming convention is abbreviated class // name (e.g. RenderFrameHost becomes RFH) plus a unique description of the
diff --git a/content/browser/browser_child_process_host_impl.cc b/content/browser/browser_child_process_host_impl.cc index a4d64a8..60adf7b 100644 --- a/content/browser/browser_child_process_host_impl.cc +++ b/content/browser/browser_child_process_host_impl.cc
@@ -61,28 +61,28 @@ g_observers = LAZY_INSTANCE_INITIALIZER; void NotifyProcessLaunchedAndConnected(const ChildProcessData& data) { - FOR_EACH_OBSERVER(BrowserChildProcessObserver, g_observers.Get(), - BrowserChildProcessLaunchedAndConnected(data)); + for (auto& observer : g_observers.Get()) + observer.BrowserChildProcessLaunchedAndConnected(data); } void NotifyProcessHostConnected(const ChildProcessData& data) { - FOR_EACH_OBSERVER(BrowserChildProcessObserver, g_observers.Get(), - BrowserChildProcessHostConnected(data)); + for (auto& observer : g_observers.Get()) + observer.BrowserChildProcessHostConnected(data); } void NotifyProcessHostDisconnected(const ChildProcessData& data) { - FOR_EACH_OBSERVER(BrowserChildProcessObserver, g_observers.Get(), - BrowserChildProcessHostDisconnected(data)); + for (auto& observer : g_observers.Get()) + observer.BrowserChildProcessHostDisconnected(data); } void NotifyProcessCrashed(const ChildProcessData& data, int exit_code) { - FOR_EACH_OBSERVER(BrowserChildProcessObserver, g_observers.Get(), - BrowserChildProcessCrashed(data, exit_code)); + for (auto& observer : g_observers.Get()) + observer.BrowserChildProcessCrashed(data, exit_code); } void NotifyProcessKilled(const ChildProcessData& data, int exit_code) { - FOR_EACH_OBSERVER(BrowserChildProcessObserver, g_observers.Get(), - BrowserChildProcessKilled(data, exit_code)); + for (auto& observer : g_observers.Get()) + observer.BrowserChildProcessKilled(data, exit_code); } } // namespace
diff --git a/content/browser/browser_main_loop.cc b/content/browser/browser_main_loop.cc index 732423e1..d769c396 100644 --- a/content/browser/browser_main_loop.cc +++ b/content/browser/browser_main_loop.cc
@@ -56,6 +56,7 @@ #include "content/browser/loader/resource_dispatcher_host_impl.h" #include "content/browser/loader_delegate_impl.h" #include "content/browser/media/media_internals.h" +#include "content/browser/memory/memory_coordinator.h" #include "content/browser/net/browser_online_state_observer.h" #include "content/browser/renderer_host/media/media_stream_manager.h" #include "content/browser/renderer_host/render_process_host_impl.h" @@ -749,6 +750,9 @@ InitializeMemoryManagementComponent(); + if (base::FeatureList::IsEnabled(features::kMemoryCoordinator)) + MemoryCoordinator::GetInstance()->Start(); + #if defined(ENABLE_PLUGINS) // Prior to any processing happening on the IO thread, we create the // plugin service as it is predominantly used from the IO thread,
diff --git a/content/browser/cache_storage/cache_storage.cc b/content/browser/cache_storage/cache_storage.cc index 8145a6e9..f7db68a 100644 --- a/content/browser/cache_storage/cache_storage.cc +++ b/content/browser/cache_storage/cache_storage.cc
@@ -570,7 +570,7 @@ cache_name, scheduler_->WrapCallbackToRunNext(callback))); } -void CacheStorage::EnumerateCaches(const StringsAndErrorCallback& callback) { +void CacheStorage::EnumerateCaches(const StringsCallback& callback) { DCHECK_CURRENTLY_ON(BrowserThread::IO); if (!initialized_) @@ -835,9 +835,8 @@ cache_loader_->CleanUpDeletedCache(cache.get()); } -void CacheStorage::EnumerateCachesImpl( - const StringsAndErrorCallback& callback) { - callback.Run(ordered_cache_names_, CACHE_STORAGE_OK); +void CacheStorage::EnumerateCachesImpl(const StringsCallback& callback) { + callback.Run(ordered_cache_names_); } void CacheStorage::MatchCacheImpl(
diff --git a/content/browser/cache_storage/cache_storage.h b/content/browser/cache_storage/cache_storage.h index e60f3466..e0569f1 100644 --- a/content/browser/cache_storage/cache_storage.h +++ b/content/browser/cache_storage/cache_storage.h
@@ -47,8 +47,7 @@ typedef base::Callback<void(std::unique_ptr<CacheStorageCacheHandle>, CacheStorageError)> CacheAndErrorCallback; - typedef base::Callback<void(const StringVector&, CacheStorageError)> - StringsAndErrorCallback; + using StringsCallback = base::Callback<void(const StringVector&)>; using SizeCallback = base::Callback<void(int64_t)>; static const char kIndexFileName[]; @@ -88,7 +87,7 @@ const BoolAndErrorCallback& callback); // Calls the callback with a vector of cache names (keys) available. - void EnumerateCaches(const StringsAndErrorCallback& callback); + void EnumerateCaches(const StringsCallback& callback); // Calls match on the cache with the given |cache_name|. void MatchCache(const std::string& cache_name, @@ -173,7 +172,7 @@ void DeleteCacheDidCleanUp(bool success); // The EnumerateCache callbacks are below. - void EnumerateCachesImpl(const StringsAndErrorCallback& callback); + void EnumerateCachesImpl(const StringsCallback& callback); // The MatchCache callbacks are below. void MatchCacheImpl(const std::string& cache_name,
diff --git a/content/browser/cache_storage/cache_storage_dispatcher_host.cc b/content/browser/cache_storage/cache_storage_dispatcher_host.cc index 5bf6153..ba584c7 100644 --- a/content/browser/cache_storage/cache_storage_dispatcher_host.cc +++ b/content/browser/cache_storage/cache_storage_dispatcher_host.cc
@@ -389,14 +389,7 @@ void CacheStorageDispatcherHost::OnCacheStorageKeysCallback( int thread_id, int request_id, - const std::vector<std::string>& strings, - CacheStorageError error) { - if (error != CACHE_STORAGE_OK) { - Send(new CacheStorageMsg_CacheStorageKeysError( - thread_id, request_id, ToWebServiceWorkerCacheError(error))); - return; - } - + const std::vector<std::string>& strings) { std::vector<base::string16> string16s; for (size_t i = 0, max = strings.size(); i < max; ++i) string16s.push_back(base::UTF8ToUTF16(strings[i]));
diff --git a/content/browser/cache_storage/cache_storage_dispatcher_host.h b/content/browser/cache_storage/cache_storage_dispatcher_host.h index 8e943ee..e82018a 100644 --- a/content/browser/cache_storage/cache_storage_dispatcher_host.h +++ b/content/browser/cache_storage/cache_storage_dispatcher_host.h
@@ -111,8 +111,7 @@ CacheStorageError error); void OnCacheStorageKeysCallback(int thread_id, int request_id, - const std::vector<std::string>& strings, - CacheStorageError error); + const std::vector<std::string>& strings); void OnCacheStorageMatchCallback( int thread_id, int request_id,
diff --git a/content/browser/cache_storage/cache_storage_manager.cc b/content/browser/cache_storage/cache_storage_manager.cc index 5acaffd..a258bdc 100644 --- a/content/browser/cache_storage/cache_storage_manager.cc +++ b/content/browser/cache_storage/cache_storage_manager.cc
@@ -186,7 +186,7 @@ void CacheStorageManager::EnumerateCaches( const GURL& origin, - const CacheStorage::StringsAndErrorCallback& callback) { + const CacheStorage::StringsCallback& callback) { DCHECK_CURRENTLY_ON(BrowserThread::IO); CacheStorage* cache_storage = FindOrCreateCacheStorage(origin);
diff --git a/content/browser/cache_storage/cache_storage_manager.h b/content/browser/cache_storage/cache_storage_manager.h index bb157be6..f9f95b0 100644 --- a/content/browser/cache_storage/cache_storage_manager.h +++ b/content/browser/cache_storage/cache_storage_manager.h
@@ -66,7 +66,7 @@ const std::string& cache_name, const CacheStorage::BoolAndErrorCallback& callback); void EnumerateCaches(const GURL& origin, - const CacheStorage::StringsAndErrorCallback& callback); + const CacheStorage::StringsCallback& callback); void MatchCache(const GURL& origin, const std::string& cache_name, std::unique_ptr<ServiceWorkerFetchRequest> request,
diff --git a/content/browser/cache_storage/cache_storage_manager_unittest.cc b/content/browser/cache_storage/cache_storage_manager_unittest.cc index 66c895a18..90601a6 100644 --- a/content/browser/cache_storage/cache_storage_manager_unittest.cc +++ b/content/browser/cache_storage/cache_storage_manager_unittest.cc
@@ -135,11 +135,9 @@ run_loop->Quit(); } - void StringsAndErrorCallback(base::RunLoop* run_loop, - const std::vector<std::string>& strings, - CacheStorageError error) { + void StringsCallback(base::RunLoop* run_loop, + const std::vector<std::string>& strings) { callback_strings_ = strings; - callback_error_ = error; run_loop->Quit(); } @@ -197,14 +195,13 @@ return callback_bool_; } - bool Keys(const GURL& origin) { + size_t Keys(const GURL& origin) { base::RunLoop loop; cache_manager_->EnumerateCaches( - origin, base::Bind(&CacheStorageManagerTest::StringsAndErrorCallback, + origin, base::Bind(&CacheStorageManagerTest::StringsCallback, base::Unretained(this), base::Unretained(&loop))); loop.Run(); - - return callback_error_ == CACHE_STORAGE_OK; + return callback_strings_.size(); } bool StorageMatch(const GURL& origin, @@ -498,22 +495,19 @@ } TEST_P(CacheStorageManagerTestP, EmptyKeys) { - EXPECT_TRUE(Keys(origin1_)); - EXPECT_TRUE(callback_strings_.empty()); + EXPECT_EQ(0u, Keys(origin1_)); } TEST_P(CacheStorageManagerTestP, SomeKeys) { EXPECT_TRUE(Open(origin1_, "foo")); EXPECT_TRUE(Open(origin1_, "bar")); EXPECT_TRUE(Open(origin2_, "baz")); - EXPECT_TRUE(Keys(origin1_)); - EXPECT_EQ(2u, callback_strings_.size()); + EXPECT_EQ(2u, Keys(origin1_)); std::vector<std::string> expected_keys; expected_keys.push_back("foo"); expected_keys.push_back("bar"); EXPECT_EQ(expected_keys, callback_strings_); - EXPECT_TRUE(Keys(origin2_)); - EXPECT_EQ(1u, callback_strings_.size()); + EXPECT_EQ(1u, Keys(origin2_)); EXPECT_STREQ("baz", callback_strings_[0].c_str()); } @@ -522,8 +516,7 @@ EXPECT_TRUE(Open(origin1_, "bar")); EXPECT_TRUE(Open(origin2_, "baz")); EXPECT_TRUE(Delete(origin1_, "bar")); - EXPECT_TRUE(Keys(origin1_)); - EXPECT_EQ(1u, callback_strings_.size()); + EXPECT_EQ(1u, Keys(origin1_)); EXPECT_STREQ("foo", callback_strings_[0].c_str()); } @@ -669,8 +662,7 @@ std::move(callback_cache_handle_); EXPECT_TRUE(Open(origin1_, "你好")); EXPECT_EQ(callback_cache_handle_->value(), cache_handle->value()); - EXPECT_TRUE(Keys(origin1_)); - EXPECT_EQ(1u, callback_strings_.size()); + EXPECT_EQ(1u, Keys(origin1_)); EXPECT_STREQ("你好", callback_strings_[0].c_str()); } @@ -680,13 +672,11 @@ std::move(callback_cache_handle_); EXPECT_TRUE(Open(origin1_, "")); EXPECT_EQ(cache_handle->value(), callback_cache_handle_->value()); - EXPECT_TRUE(Keys(origin1_)); - EXPECT_EQ(1u, callback_strings_.size()); + EXPECT_EQ(1u, Keys(origin1_)); EXPECT_STREQ("", callback_strings_[0].c_str()); EXPECT_TRUE(Has(origin1_, "")); EXPECT_TRUE(Delete(origin1_, "")); - EXPECT_TRUE(Keys(origin1_)); - EXPECT_EQ(0u, callback_strings_.size()); + EXPECT_EQ(0u, Keys(origin1_)); } TEST_F(CacheStorageManagerTest, DataPersists) { @@ -697,8 +687,7 @@ EXPECT_TRUE(Delete(origin1_, "bar")); quota_manager_proxy_->SimulateQuotaManagerDestroyed(); cache_manager_ = CacheStorageManager::Create(cache_manager_.get()); - EXPECT_TRUE(Keys(origin1_)); - EXPECT_EQ(2u, callback_strings_.size()); + EXPECT_EQ(2u, Keys(origin1_)); std::vector<std::string> expected_keys; expected_keys.push_back("foo"); expected_keys.push_back("baz"); @@ -710,8 +699,7 @@ EXPECT_TRUE(Open(origin2_, "baz")); quota_manager_proxy_->SimulateQuotaManagerDestroyed(); cache_manager_ = CacheStorageManager::Create(cache_manager_.get()); - EXPECT_TRUE(Keys(origin1_)); - EXPECT_EQ(0u, callback_strings_.size()); + EXPECT_EQ(0u, Keys(origin1_)); } TEST_F(CacheStorageManagerTest, BadCacheName) { @@ -719,8 +707,7 @@ // escape the directory. const std::string bad_name = "../../../../../../../../../../../../../../foo"; EXPECT_TRUE(Open(origin1_, bad_name)); - EXPECT_TRUE(Keys(origin1_)); - EXPECT_EQ(1u, callback_strings_.size()); + EXPECT_EQ(1u, Keys(origin1_)); EXPECT_STREQ(bad_name.c_str(), callback_strings_[0].c_str()); } @@ -729,8 +716,7 @@ // escape the directory. GURL bad_origin("http://../../../../../../../../../../../../../../foo"); EXPECT_TRUE(Open(bad_origin, "foo")); - EXPECT_TRUE(Keys(bad_origin)); - EXPECT_EQ(1u, callback_strings_.size()); + EXPECT_EQ(1u, Keys(bad_origin)); EXPECT_STREQ("foo", callback_strings_[0].c_str()); } @@ -767,8 +753,7 @@ EXPECT_TRUE(CacheMatch(original_handle->value(), kBarURL)); // The cache shouldn't be visible to subsequent storage operations. - EXPECT_TRUE(Keys(origin1_)); - EXPECT_TRUE(callback_strings_.empty()); + EXPECT_EQ(0u, Keys(origin1_)); // Open a new cache with the same name, it should create a new cache, but not // interfere with the original cache. @@ -940,7 +925,7 @@ TEST_P(CacheStorageManagerTestP, KeysStorageAccessed) { EXPECT_EQ(0, quota_manager_proxy_->notify_storage_accessed_count()); - EXPECT_TRUE(Keys(origin1_)); + EXPECT_EQ(0u, Keys(origin1_)); EXPECT_EQ(1, quota_manager_proxy_->notify_storage_accessed_count()); }
diff --git a/content/browser/compositor/gpu_output_surface_mac.mm b/content/browser/compositor/gpu_output_surface_mac.mm index 854af5b8..fda2444 100644 --- a/content/browser/compositor/gpu_output_surface_mac.mm +++ b/content/browser/compositor/gpu_output_surface_mac.mm
@@ -7,7 +7,6 @@ #include "cc/output/output_surface_client.h" #include "cc/output/output_surface_frame.h" #include "components/display_compositor/compositor_overlay_candidate_validator.h" -#include "content/browser/gpu/gpu_surface_tracker.h" #include "content/common/gpu/client/context_provider_command_buffer.h" #include "gpu/GLES2/gl2extchromium.h" #include "gpu/ipc/client/gpu_process_hosted_ca_layer_tree_params.h"
diff --git a/content/browser/compositor/gpu_process_transport_factory.cc b/content/browser/compositor/gpu_process_transport_factory.cc index fdb0fc4..71a1dcc 100644 --- a/content/browser/compositor/gpu_process_transport_factory.cc +++ b/content/browser/compositor/gpu_process_transport_factory.cc
@@ -85,7 +85,7 @@ #include "components/display_compositor/compositor_overlay_candidate_validator_android.h" #endif #if !defined(GPU_SURFACE_HANDLE_IS_ACCELERATED_WINDOW) -#include "content/browser/gpu/gpu_surface_tracker.h" +#include "gpu/ipc/common/gpu_surface_tracker.h" #endif #if defined(ENABLE_VULKAN) @@ -184,8 +184,7 @@ } GpuProcessTransportFactory::~GpuProcessTransportFactory() { - // If this fails, then we are leaking compositors. - CHECK(per_compositor_data_.empty()); + DCHECK(per_compositor_data_.empty()); // Make sure the lost context callback doesn't try to run during destruction. callback_factory_.InvalidateWeakPtrs(); @@ -599,7 +598,7 @@ DCHECK(data); #if !defined(GPU_SURFACE_HANDLE_IS_ACCELERATED_WINDOW) if (data->surface_handle) - GpuSurfaceTracker::Get()->RemoveSurface(data->surface_handle); + gpu::GpuSurfaceTracker::Get()->RemoveSurface(data->surface_handle); #endif per_compositor_data_.erase(it); if (per_compositor_data_.empty()) { @@ -613,8 +612,8 @@ // If there are any observer left at this point, make sure they clean up // before we destroy the GLHelper. - FOR_EACH_OBSERVER(ui::ContextFactoryObserver, observer_list_, - OnLostResources()); + for (auto& observer : observer_list_) + observer.OnLostResources(); helper.reset(); DCHECK(!gl_helper_) << "Destroying the GLHelper should not cause a new " @@ -825,7 +824,7 @@ #if defined(GPU_SURFACE_HANDLE_IS_ACCELERATED_WINDOW) data->surface_handle = widget; #else - GpuSurfaceTracker* tracker = GpuSurfaceTracker::Get(); + gpu::GpuSurfaceTracker* tracker = gpu::GpuSurfaceTracker::Get(); data->surface_handle = tracker->AddSurfaceForNativeWidget(widget); #endif } @@ -856,8 +855,8 @@ std::unique_ptr<display_compositor::GLHelper> lost_gl_helper = std::move(gl_helper_); - FOR_EACH_OBSERVER(ui::ContextFactoryObserver, observer_list_, - OnLostResources()); + for (auto& observer : observer_list_) + observer.OnLostResources(); // Kill things that use the shared context before killing the shared context. lost_gl_helper.reset();
diff --git a/content/browser/devtools/devtools_agent_host_impl.cc b/content/browser/devtools/devtools_agent_host_impl.cc index 96a24ea..80239843 100644 --- a/content/browser/devtools/devtools_agent_host_impl.cc +++ b/content/browser/devtools/devtools_agent_host_impl.cc
@@ -7,8 +7,11 @@ #include <map> #include <vector> +#include "base/bind.h" #include "base/json/json_writer.h" #include "base/lazy_instance.h" +#include "base/message_loop/message_loop.h" +#include "base/observer_list.h" #include "content/browser/devtools/devtools_manager.h" #include "content/browser/devtools/forwarding_agent_host.h" #include "content/browser/devtools/protocol/devtools_protocol_dispatcher.h" @@ -17,7 +20,9 @@ #include "content/browser/devtools/service_worker_devtools_manager.h" #include "content/browser/devtools/shared_worker_devtools_agent_host.h" #include "content/browser/devtools/shared_worker_devtools_manager.h" +#include "content/browser/loader/netlog_observer.h" #include "content/public/browser/browser_thread.h" +#include "content/public/browser/content_browser_client.h" namespace content { @@ -25,12 +30,8 @@ typedef std::map<std::string, DevToolsAgentHostImpl*> Instances; base::LazyInstance<Instances>::Leaky g_instances = LAZY_INSTANCE_INITIALIZER; -using AgentStateCallbacks = - std::vector<const DevToolsAgentHost::AgentStateCallback*>; -base::LazyInstance<AgentStateCallbacks>::Leaky g_callbacks = - LAZY_INSTANCE_INITIALIZER; -using DiscoveryCallbacks = - std::vector<DevToolsAgentHost::DiscoveryCallback>; +base::LazyInstance<base::ObserverList<DevToolsAgentHostObserver>>::Leaky + g_observers = LAZY_INSTANCE_INITIALIZER; } // namespace char DevToolsAgentHost::kTypePage[] = "page"; @@ -40,6 +41,7 @@ char DevToolsAgentHost::kTypeExternal[] = "external"; char DevToolsAgentHost::kTypeBrowser[] = "browser"; char DevToolsAgentHost::kTypeOther[] = "other"; +int DevToolsAgentHostImpl::s_attached_count_ = 0; // static std::string DevToolsAgentHost::GetProtocolVersion() { @@ -138,6 +140,7 @@ } client_ = client; Attach(); + NotifyAttached(); return true; } @@ -170,6 +173,7 @@ void DevToolsAgentHostImpl::InnerDetach() { Detach(); io_context_.DiscardAllStreams(); + NotifyDetached(); } bool DevToolsAgentHostImpl::IsAttached() { @@ -251,6 +255,7 @@ DevToolsAgentHostClient* client = client_; client_ = NULL; client->AgentHostClosed(this, false); + NotifyDetached(); } void DevToolsAgentHostImpl::InspectElement(int x, int y) { @@ -288,34 +293,40 @@ } // static -void DevToolsAgentHost::AddAgentStateCallback( - const AgentStateCallback& callback) { - g_callbacks.Get().push_back(&callback); +void DevToolsAgentHost::AddObserver(DevToolsAgentHostObserver* observer) { + g_observers.Get().AddObserver(observer); } // static -void DevToolsAgentHost::RemoveAgentStateCallback( - const AgentStateCallback& callback) { - if (g_callbacks == NULL) - return; - - AgentStateCallbacks* callbacks_ = g_callbacks.Pointer(); - AgentStateCallbacks::iterator it = - std::find(callbacks_->begin(), callbacks_->end(), &callback); - DCHECK(it != callbacks_->end()); - callbacks_->erase(it); +void DevToolsAgentHost::RemoveObserver(DevToolsAgentHostObserver* observer) { + g_observers.Get().RemoveObserver(observer); } -// static -void DevToolsAgentHostImpl::NotifyCallbacks( - DevToolsAgentHostImpl* agent_host, bool attached) { - AgentStateCallbacks copy(g_callbacks.Get()); - DevToolsManager* manager = DevToolsManager::GetInstance(); - manager->AgentHostStateChanged(agent_host, attached); - if (manager->delegate()) - manager->delegate()->DevToolsAgentStateChanged(agent_host, attached); - for (AgentStateCallbacks::iterator it = copy.begin(); it != copy.end(); ++it) - (*it)->Run(agent_host, attached); +void DevToolsAgentHostImpl::NotifyAttached() { + if (!s_attached_count_) { + BrowserThread::PostTask( + BrowserThread::IO, + FROM_HERE, + base::Bind(&NetLogObserver::Attach, + GetContentClient()->browser()->GetNetLog())); + } + ++s_attached_count_; + + for (auto& observer : g_observers.Get()) + observer.DevToolsAgentHostAttached(this); +} + +void DevToolsAgentHostImpl::NotifyDetached() { + --s_attached_count_; + if (!s_attached_count_) { + BrowserThread::PostTask( + BrowserThread::IO, + FROM_HERE, + base::Bind(&NetLogObserver::Detach)); + } + + for (auto& observer : g_observers.Get()) + observer.DevToolsAgentHostDetached(this); } // DevToolsMessageChunkProcessor -----------------------------------------------
diff --git a/content/browser/devtools/devtools_agent_host_impl.h b/content/browser/devtools/devtools_agent_host_impl.h index 435f34e..e5d3094 100644 --- a/content/browser/devtools/devtools_agent_host_impl.h +++ b/content/browser/devtools/devtools_agent_host_impl.h
@@ -73,17 +73,18 @@ int session_id() { DCHECK(client_); return session_id_; } - static void NotifyCallbacks(DevToolsAgentHostImpl* agent_host, bool attached); - private: friend class DevToolsAgentHost; // for static methods bool InnerAttach(DevToolsAgentHostClient* client, bool force); void InnerDetach(); + void NotifyAttached(); + void NotifyDetached(); const std::string id_; int session_id_; DevToolsAgentHostClient* client_; devtools::DevToolsIOContext io_context_; + static int s_attached_count_; }; class DevToolsMessageChunkProcessor {
diff --git a/content/browser/devtools/devtools_manager.cc b/content/browser/devtools/devtools_manager.cc index 70059c6f..efd7bd7 100644 --- a/content/browser/devtools/devtools_manager.cc +++ b/content/browser/devtools/devtools_manager.cc
@@ -45,34 +45,10 @@ } DevToolsManager::DevToolsManager() - : delegate_(GetContentClient()->browser()->GetDevToolsManagerDelegate()), - attached_hosts_count_(0) { + : delegate_(GetContentClient()->browser()->GetDevToolsManagerDelegate()) { } DevToolsManager::~DevToolsManager() { - DCHECK(!attached_hosts_count_); -} - -void DevToolsManager::AgentHostStateChanged( - DevToolsAgentHostImpl* agent_host, bool attached) { - if (attached) { - if (!attached_hosts_count_) { - BrowserThread::PostTask( - BrowserThread::IO, - FROM_HERE, - base::Bind(&NetLogObserver::Attach, - GetContentClient()->browser()->GetNetLog())); - } - ++attached_hosts_count_; - } else { - --attached_hosts_count_; - if (!attached_hosts_count_) { - BrowserThread::PostTask( - BrowserThread::IO, - FROM_HERE, - base::Bind(&NetLogObserver::Detach)); - } - } } void DevToolsManager::SetHttpHandler(
diff --git a/content/browser/devtools/devtools_manager.h b/content/browser/devtools/devtools_manager.h index 2ae7049e..422bb138f 100644 --- a/content/browser/devtools/devtools_manager.h +++ b/content/browser/devtools/devtools_manager.h
@@ -32,8 +32,6 @@ DevToolsManagerDelegate* delegate() const { return delegate_.get(); } - void AgentHostStateChanged(DevToolsAgentHostImpl* agent_host, bool attached); - void SetHttpHandler(std::unique_ptr<DevToolsHttpHandler> http_handler); private: @@ -41,7 +39,6 @@ std::unique_ptr<DevToolsManagerDelegate> delegate_; std::unique_ptr<DevToolsHttpHandler> http_handler_; - int attached_hosts_count_; DISALLOW_COPY_AND_ASSIGN(DevToolsManager); };
diff --git a/content/browser/devtools/devtools_manager_unittest.cc b/content/browser/devtools/devtools_manager_unittest.cc index 2c4d1fa..4f97266 100644 --- a/content/browser/devtools/devtools_manager_unittest.cc +++ b/content/browser/devtools/devtools_manager_unittest.cc
@@ -89,7 +89,9 @@ TestWebContentsDelegate() : renderer_unresponsive_received_(false) {} // Notification that the contents is hung. - void RendererUnresponsive(WebContents* source) override { + void RendererUnresponsive( + WebContents* source, + const WebContentsUnresponsiveState& unresponsive_state) override { renderer_unresponsive_received_ = true; } @@ -146,8 +148,8 @@ // Start with a short timeout. inspected_rvh->GetWidget()->StartHangMonitorTimeout( - TimeDelta::FromMilliseconds(10), - RenderWidgetHostDelegate::RENDERER_UNRESPONSIVE_UNKNOWN); + TimeDelta::FromMilliseconds(10), blink::WebInputEvent::Undefined, + RendererUnresponsiveType::RENDERER_UNRESPONSIVE_UNKNOWN); // Wait long enough for first timeout and see if it fired. base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( FROM_HERE, base::MessageLoop::QuitWhenIdleClosure(), @@ -159,8 +161,8 @@ client_host.Close(); // Start with a short timeout. inspected_rvh->GetWidget()->StartHangMonitorTimeout( - TimeDelta::FromMilliseconds(10), - RenderWidgetHostDelegate::RENDERER_UNRESPONSIVE_UNKNOWN); + TimeDelta::FromMilliseconds(10), blink::WebInputEvent::Undefined, + RendererUnresponsiveType::RENDERER_UNRESPONSIVE_UNKNOWN); // Wait long enough for first timeout and see if it fired. base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( FROM_HERE, base::MessageLoop::QuitWhenIdleClosure(),
diff --git a/content/browser/devtools/render_frame_devtools_agent_host.cc b/content/browser/devtools/render_frame_devtools_agent_host.cc index ebf71113..df0b440b 100644 --- a/content/browser/devtools/render_frame_devtools_agent_host.cc +++ b/content/browser/devtools/render_frame_devtools_agent_host.cc
@@ -533,10 +533,6 @@ frame_trace_recorder_.reset(new DevToolsFrameTraceRecorder()); CreatePowerSaveBlocker(); - - // TODO(kaznacheev): Move this call back to DevToolsManager when - // extensions::ProcessManager no longer relies on this notification. - DevToolsAgentHostImpl::NotifyCallbacks(this, true); } void RenderFrameDevToolsAgentHost::OnClientDetached() { @@ -553,10 +549,6 @@ tracing_handler_->Detached(); frame_trace_recorder_.reset(); in_navigation_protocol_message_buffer_.clear(); - - // TODO(kaznacheev): Move this call back to DevToolsManager when - // extensions::ProcessManager no longer relies on this notification. - DevToolsAgentHostImpl::NotifyCallbacks(this, false); } RenderFrameDevToolsAgentHost::~RenderFrameDevToolsAgentHost() {
diff --git a/content/browser/devtools/service_worker_devtools_manager.cc b/content/browser/devtools/service_worker_devtools_manager.cc index e7c76d8e9..5febfff0 100644 --- a/content/browser/devtools/service_worker_devtools_manager.cc +++ b/content/browser/devtools/service_worker_devtools_manager.cc
@@ -89,7 +89,8 @@ new ServiceWorkerDevToolsAgentHost(id, service_worker_id, is_installed_version); workers_[id] = host.get(); - FOR_EACH_OBSERVER(Observer, observer_list_, WorkerCreated(host.get())); + for (auto& observer : observer_list_) + observer.WorkerCreated(host.get()); if (debug_service_worker_on_start_) host->PauseForDebugOnStart(); return host->IsPausedForDebugOnStart(); @@ -114,8 +115,8 @@ return; scoped_refptr<ServiceWorkerDevToolsAgentHost> host = it->second; host->WorkerReadyForInspection(); - FOR_EACH_OBSERVER(Observer, observer_list_, - WorkerReadyForInspection(host.get())); + for (auto& observer : observer_list_) + observer.WorkerReadyForInspection(host.get()); // Then bring up UI for the ones not picked by other clients. if (host->IsPausedForDebugOnStart() && !host->IsAttached()) @@ -131,8 +132,8 @@ return; scoped_refptr<ServiceWorkerDevToolsAgentHost> host = it->second; host->WorkerVersionInstalled(); - FOR_EACH_OBSERVER(Observer, observer_list_, - WorkerVersionInstalled(host.get())); + for (auto& observer : observer_list_) + observer.WorkerVersionInstalled(host.get()); } void ServiceWorkerDevToolsManager::WorkerVersionDoomed(int worker_process_id, @@ -144,7 +145,8 @@ return; scoped_refptr<ServiceWorkerDevToolsAgentHost> host = it->second; host->WorkerVersionDoomed(); - FOR_EACH_OBSERVER(Observer, observer_list_, WorkerVersionDoomed(host.get())); + for (auto& observer : observer_list_) + observer.WorkerVersionDoomed(host.get()); } void ServiceWorkerDevToolsManager::WorkerDestroyed(int worker_process_id, @@ -156,7 +158,8 @@ return; scoped_refptr<WorkerDevToolsAgentHost> agent_host(it->second); agent_host->WorkerDestroyed(); - FOR_EACH_OBSERVER(Observer, observer_list_, WorkerDestroyed(it->second)); + for (auto& observer : observer_list_) + observer.WorkerDestroyed(it->second); } void ServiceWorkerDevToolsManager::RemoveInspectedWorkerData(WorkerId id) {
diff --git a/content/browser/devtools/worker_devtools_agent_host.cc b/content/browser/devtools/worker_devtools_agent_host.cc index a7515ad..ec77e2f 100644 --- a/content/browser/devtools/worker_devtools_agent_host.cc +++ b/content/browser/devtools/worker_devtools_agent_host.cc
@@ -26,7 +26,6 @@ host->Send( new DevToolsAgentMsg_Attach(worker_id_.second, GetId(), session_id())); OnAttachedStateChanged(true); - DevToolsAgentHostImpl::NotifyCallbacks(this, true); } void WorkerDevToolsAgentHost::Detach() { @@ -39,7 +38,6 @@ } else if (state_ == WORKER_PAUSED_FOR_REATTACH) { state_ = WORKER_UNINSPECTED; } - DevToolsAgentHostImpl::NotifyCallbacks(this, false); } bool WorkerDevToolsAgentHost::DispatchProtocolMessage(
diff --git a/content/browser/dom_storage/dom_storage_area.cc b/content/browser/dom_storage/dom_storage_area.cc index 7aff8e17..884082f 100644 --- a/content/browser/dom_storage/dom_storage_area.cc +++ b/content/browser/dom_storage/dom_storage_area.cc
@@ -326,7 +326,8 @@ } void DOMStorageArea::Shutdown() { - DCHECK(!is_shutdown_); + if (is_shutdown_) + return; is_shutdown_ = true; if (commit_batch_) {
diff --git a/content/browser/dom_storage/dom_storage_area_unittest.cc b/content/browser/dom_storage/dom_storage_area_unittest.cc index b7d8040..8ec3f31 100644 --- a/content/browser/dom_storage/dom_storage_area_unittest.cc +++ b/content/browser/dom_storage/dom_storage_area_unittest.cc
@@ -325,6 +325,9 @@ EXPECT_FALSE(area->backing_.get()); // The VerifyChangesCommittedDatabase destructor verifies values // were committed. + + // A second Shutdown call should be safe. + area->Shutdown(); } TEST_F(DOMStorageAreaTest, DeleteOrigin) { @@ -385,6 +388,9 @@ area->Shutdown(); base::RunLoop().RunUntilIdle(); EXPECT_FALSE(base::PathExists(db_file_path)); + + // A second Shutdown call should be safe. + area->Shutdown(); } TEST_F(DOMStorageAreaTest, PurgeMemory) {
diff --git a/content/browser/dom_storage/dom_storage_context_impl.cc b/content/browser/dom_storage/dom_storage_context_impl.cc index cd2cdbd..2479f8f8 100644 --- a/content/browser/dom_storage/dom_storage_context_impl.cc +++ b/content/browser/dom_storage/dom_storage_context_impl.cc
@@ -301,9 +301,8 @@ const base::string16& new_value, const base::NullableString16& old_value, const GURL& page_url) { - FOR_EACH_OBSERVER( - EventObserver, event_observers_, - OnDOMStorageItemSet(area, key, new_value, old_value, page_url)); + for (auto& observer : event_observers_) + observer.OnDOMStorageItemSet(area, key, new_value, old_value, page_url); } void DOMStorageContextImpl::NotifyItemRemoved( @@ -311,17 +310,15 @@ const base::string16& key, const base::string16& old_value, const GURL& page_url) { - FOR_EACH_OBSERVER( - EventObserver, event_observers_, - OnDOMStorageItemRemoved(area, key, old_value, page_url)); + for (auto& observer : event_observers_) + observer.OnDOMStorageItemRemoved(area, key, old_value, page_url); } void DOMStorageContextImpl::NotifyAreaCleared( const DOMStorageArea* area, const GURL& page_url) { - FOR_EACH_OBSERVER( - EventObserver, event_observers_, - OnDOMStorageAreaCleared(area, page_url)); + for (auto& observer : event_observers_) + observer.OnDOMStorageAreaCleared(area, page_url); } int64_t DOMStorageContextImpl::AllocateSessionId() {
diff --git a/content/browser/download/download_item_impl.cc b/content/browser/download/download_item_impl.cc index 99baf7e..f2494eb3 100644 --- a/content/browser/download/download_item_impl.cc +++ b/content/browser/download/download_item_impl.cc
@@ -246,7 +246,8 @@ // DownloadManager shutdown. DCHECK(!download_file_.get()); - FOR_EACH_OBSERVER(Observer, observers_, OnDownloadDestroyed(this)); + for (auto& observer : observers_) + observer.OnDownloadDestroyed(this); delegate_->AssertStateConsistent(this); delegate_->Detach(); } @@ -267,7 +268,8 @@ DCHECK_CURRENTLY_ON(BrowserThread::UI); DVLOG(20) << __func__ << "()"; - FOR_EACH_OBSERVER(Observer, observers_, OnDownloadUpdated(this)); + for (auto& observer : observers_) + observer.OnDownloadUpdated(this); } void DownloadItemImpl::ValidateDangerousDownload() { @@ -428,7 +430,8 @@ delegate_->CheckForFileRemoval(this); RecordOpen(GetEndTime(), !GetOpened()); opened_ = true; - FOR_EACH_OBSERVER(Observer, observers_, OnDownloadOpened(this)); + for (auto& observer : observers_) + observer.OnDownloadOpened(this); delegate_->OpenDownload(this); } @@ -974,7 +977,8 @@ } void DownloadItemImpl::NotifyRemoved() { - FOR_EACH_OBSERVER(Observer, observers_, OnDownloadRemoved(this)); + for (auto& observer : observers_) + observer.OnDownloadRemoved(this); } void DownloadItemImpl::OnDownloadedFileRemoved() {
diff --git a/content/browser/download/download_manager_impl.cc b/content/browser/download/download_manager_impl.cc index 176ec38..990ab55 100644 --- a/content/browser/download/download_manager_impl.cc +++ b/content/browser/download/download_manager_impl.cc
@@ -274,7 +274,8 @@ return; shutdown_needed_ = false; - FOR_EACH_OBSERVER(Observer, observers_, ManagerGoingDown(this)); + for (auto& observer : observers_) + observer.ManagerGoingDown(this); // TODO(benjhayden): Consider clearing observers_. // If there are in-progress downloads, cancel them. This also goes for @@ -383,8 +384,10 @@ // For new downloads, we notify here, rather than earlier, so that // the download_file is bound to download and all the usual // setters (e.g. Cancel) work. - if (new_download) - FOR_EACH_OBSERVER(Observer, observers_, OnDownloadCreated(this, download)); + if (new_download) { + for (auto& observer : observers_) + observer.OnDownloadCreated(this, download); + } if (!on_started.is_null()) on_started.Run(download, DOWNLOAD_INTERRUPT_REASON_NONE); @@ -460,16 +463,16 @@ downloads_[download_item->GetId()] = download_item; DCHECK(!base::ContainsKey(downloads_by_guid_, download_item->GetGuid())); downloads_by_guid_[download_item->GetGuid()] = download_item; - FOR_EACH_OBSERVER(Observer, observers_, OnDownloadCreated( - this, download_item)); + for (auto& observer : observers_) + observer.OnDownloadCreated(this, download_item); if (!item_created.is_null()) item_created.Run(download_item); } void DownloadManagerImpl::OnSavePackageSuccessfullyFinished( DownloadItem* download_item) { - FOR_EACH_OBSERVER(Observer, observers_, - OnSavePackageSuccessfullyFinished(this, download_item)); + for (auto& observer : observers_) + observer.OnSavePackageSuccessfullyFinished(this, download_item); } // Resume a download of a specific URL. We send the request to the @@ -705,7 +708,8 @@ net::NetLogWithSource::Make(net_log_, net::NetLogSourceType::DOWNLOAD)); downloads_[id] = item; downloads_by_guid_[guid] = item; - FOR_EACH_OBSERVER(Observer, observers_, OnDownloadCreated(this, item)); + for (auto& observer : observers_) + observer.OnDownloadCreated(this, item); DVLOG(20) << __func__ << "() download = " << item->DebugString(true); return item; }
diff --git a/content/browser/download/download_manager_impl_unittest.cc b/content/browser/download/download_manager_impl_unittest.cc index 1c56e0c..0bca25c 100644 --- a/content/browser/download/download_manager_impl_unittest.cc +++ b/content/browser/download/download_manager_impl_unittest.cc
@@ -767,7 +767,8 @@ namespace { base::Callback<bool(const GURL&)> GetSingleURLFilter(const GURL& url) { - return base::Bind(&GURL::operator==, base::Owned(new GURL(url))); + return base::Bind(static_cast<bool (*)(const GURL&, const GURL&)>(operator==), + GURL(url)); } } // namespace
diff --git a/content/browser/frame_host/frame_tree_node.cc b/content/browser/frame_host/frame_tree_node.cc index 9d6eac5..3f789ef 100644 --- a/content/browser/frame_host/frame_tree_node.cc +++ b/content/browser/frame_host/frame_tree_node.cc
@@ -121,7 +121,8 @@ FrameTreeNode::~FrameTreeNode() { std::vector<std::unique_ptr<FrameTreeNode>>().swap(children_); frame_tree_->FrameRemoved(this); - FOR_EACH_OBSERVER(Observer, observers_, OnFrameTreeNodeDestroyed(this)); + for (auto& observer : observers_) + observer.OnFrameTreeNodeDestroyed(this); if (opener_) opener_->RemoveObserver(opener_observer_.get()); @@ -465,7 +466,8 @@ void FrameTreeNode::DidFocus() { last_focus_time_ = base::TimeTicks::Now(); - FOR_EACH_OBSERVER(Observer, observers_, OnFrameTreeNodeFocused(this)); + for (auto& observer : observers_) + observer.OnFrameTreeNodeFocused(this); } void FrameTreeNode::BeforeUnloadCanceled() {
diff --git a/content/browser/frame_host/navigation_controller_impl_browsertest.cc b/content/browser/frame_host/navigation_controller_impl_browsertest.cc index aea50a5..ebada61b 100644 --- a/content/browser/frame_host/navigation_controller_impl_browsertest.cc +++ b/content/browser/frame_host/navigation_controller_impl_browsertest.cc
@@ -5,14 +5,20 @@ #include "content/browser/frame_host/navigation_controller_impl.h" #include <stdint.h> +#include <algorithm> #include <utility> +#include <vector> #include "base/bind.h" #include "base/command_line.h" #include "base/macros.h" +#include "base/memory/ref_counted.h" +#include "base/memory/weak_ptr.h" +#include "base/sequenced_task_runner.h" #include "base/strings/stringprintf.h" #include "base/strings/utf_string_conversions.h" #include "base/test/histogram_tester.h" +#include "base/threading/sequenced_task_runner_handle.h" #include "content/browser/frame_host/frame_navigation_entry.h" #include "content/browser/frame_host/frame_tree.h" #include "content/browser/frame_host/navigation_entry_impl.h" @@ -21,6 +27,7 @@ #include "content/common/frame_messages.h" #include "content/common/page_state_serialization.h" #include "content/common/site_isolation_policy.h" +#include "content/public/browser/navigation_controller.h" #include "content/public/browser/navigation_handle.h" #include "content/public/browser/render_view_host.h" #include "content/public/browser/resource_controller.h" @@ -45,6 +52,7 @@ #include "content/test/test_frame_navigation_observer.h" #include "net/dns/mock_host_resolver.h" #include "net/test/embedded_test_server/embedded_test_server.h" +#include "net/test/embedded_test_server/http_request.h" #include "net/test/url_request/url_request_failed_job.h" #include "testing/gmock/include/gmock/gmock-matchers.h" @@ -6511,4 +6519,125 @@ histogram.ExpectTotalCount(kReloadMainResourceToReloadMetricName, 3); } +namespace { + +class RequestMonitoringNavigationBrowserTest : public ContentBrowserTest { + public: + RequestMonitoringNavigationBrowserTest() : weak_factory_(this) {} + + const net::test_server::HttpRequest* FindAccumulatedRequest( + const GURL& url_to_find) { + // net::test_server::HttpRequest::GetURL hardcodes "http://localhost/" part. + GURL::Replacements replacements; + replacements.SetHostStr("localhost"); + replacements.ClearPort(); + replacements.SetSchemeStr("http"); + DCHECK(url_to_find.SchemeIsHTTPOrHTTPS()); + GURL canonical_url_to_find = url_to_find.ReplaceComponents(replacements); + + auto it = std::find_if( + accumulated_requests_.begin(), accumulated_requests_.end(), + [&canonical_url_to_find](const net::test_server::HttpRequest& request) { + return request.GetURL() == canonical_url_to_find; + }); + if (it == accumulated_requests_.end()) + return nullptr; + return &*it; + } + + protected: + void SetUpOnMainThread() override { + // Accumulate all http requests made to |embedded_test_server| into + // |accumulated_requests_| container. + embedded_test_server()->RegisterRequestMonitor(base::Bind( + &RequestMonitoringNavigationBrowserTest::MonitorRequestOnIoThread, + weak_factory_.GetWeakPtr(), base::SequencedTaskRunnerHandle::Get())); + + ASSERT_TRUE(embedded_test_server()->Start()); + } + + void TearDown() override { + EXPECT_TRUE(embedded_test_server()->ShutdownAndWaitUntilComplete()); + } + + private: + static void MonitorRequestOnIoThread( + const base::WeakPtr<RequestMonitoringNavigationBrowserTest>& weak_this, + const scoped_refptr<base::SequencedTaskRunner>& postback_task_runner, + const net::test_server::HttpRequest& request) { + postback_task_runner->PostTask( + FROM_HERE, + base::Bind( + &RequestMonitoringNavigationBrowserTest::MonitorRequestOnMainThread, + weak_this, request)); + } + + void MonitorRequestOnMainThread( + const net::test_server::HttpRequest& request) { + accumulated_requests_.push_back(request); + } + + std::vector<net::test_server::HttpRequest> accumulated_requests_; + base::WeakPtrFactory<RequestMonitoringNavigationBrowserTest> weak_factory_; +}; + +// Helper for waiting until the main frame of |web_contents| has loaded +// |expected_url| (and all subresources have finished loading). +class WebContentsLoadFinishedWaiter : public WebContentsObserver { + public: + WebContentsLoadFinishedWaiter(WebContents* web_contents, + const GURL& expected_url) + : WebContentsObserver(web_contents), + expected_url_(expected_url), + message_loop_runner_(new MessageLoopRunner) { + EXPECT_TRUE(web_contents != NULL); + } + + void Wait() { message_loop_runner_->Run(); } + + private: + void DidFinishLoad(RenderFrameHost* render_frame_host, + const GURL& url) override { + bool is_main_frame = !render_frame_host->GetParent(); + if (url == expected_url_ && is_main_frame) + message_loop_runner_->Quit(); + } + + GURL expected_url_; + scoped_refptr<MessageLoopRunner> message_loop_runner_; +}; + +} // namespace { + +// Check that NavigationController::LoadURLParams::extra_headers are not copied +// to subresource requests. +IN_PROC_BROWSER_TEST_F(RequestMonitoringNavigationBrowserTest, + ExtraHeadersVsSubresources) { + GURL page_url = embedded_test_server()->GetURL("/page_with_image.html"); + GURL image_url = embedded_test_server()->GetURL("/blank.jpg"); + + // Navigate via LoadURLWithParams (setting |extra_headers| field). + WebContentsLoadFinishedWaiter waiter(shell()->web_contents(), page_url); + NavigationController::LoadURLParams load_url_params(page_url); + load_url_params.extra_headers = "X-ExtraHeadersVsSubresources: 1"; + shell()->web_contents()->GetController().LoadURLWithParams(load_url_params); + waiter.Wait(); + EXPECT_EQ(page_url, shell()->web_contents()->GetLastCommittedURL()); + + // Verify that the extra header was present for the page. + const net::test_server::HttpRequest* page_request = + FindAccumulatedRequest(page_url); + ASSERT_TRUE(page_request); + EXPECT_THAT(page_request->headers, + testing::Contains(testing::Key("X-ExtraHeadersVsSubresources"))); + + // Verify that the extra header was NOT present for the subresource. + const net::test_server::HttpRequest* image_request = + FindAccumulatedRequest(image_url); + ASSERT_TRUE(image_request); + EXPECT_THAT(image_request->headers, + testing::Not(testing::Contains( + testing::Key("X-ExtraHeadersVsSubresources")))); +} + } // namespace content
diff --git a/content/browser/frame_host/render_frame_host_impl.cc b/content/browser/frame_host/render_frame_host_impl.cc index da7dfa1..e134892 100644 --- a/content/browser/frame_host/render_frame_host_impl.cc +++ b/content/browser/frame_host/render_frame_host_impl.cc
@@ -116,7 +116,7 @@ #include "content/browser/media/android/media_player_renderer.h" #include "media/base/audio_renderer_sink.h" #include "media/base/video_renderer_sink.h" -#include "media/mojo/services/mojo_renderer_service.h" //nogncheck +#include "media/mojo/services/mojo_renderer_service.h" // nogncheck #endif #if defined(OS_MACOSX) @@ -124,9 +124,7 @@ #endif #if defined(ENABLE_WEBVR) -#include "base/command_line.h" -#include "content/public/common/content_switches.h" -#include "device/vr/vr_service_impl.h" // nogncheck +#include "device/vr/vr_service_impl.h" // nogncheck #endif using base::TimeDelta; @@ -384,9 +382,8 @@ // the dtor has run. (It may also be null in tests.) swapout_event_monitor_timeout_.reset(); - for (const auto& iter: visual_state_callbacks_) { + for (const auto& iter : visual_state_callbacks_) iter.second.Run(false); - } if (render_widget_host_ && render_widget_host_->owned_by_render_frame_host()) { @@ -709,6 +706,7 @@ OnDidChangeLoadProgress) IPC_MESSAGE_HANDLER(FrameHostMsg_SerializeAsMHTMLResponse, OnSerializeAsMHTMLResponse) + IPC_MESSAGE_HANDLER(FrameHostMsg_SelectionChanged, OnSelectionChanged) #if defined(USE_EXTERNAL_POPUP_MENU) IPC_MESSAGE_HANDLER(FrameHostMsg_ShowPopup, OnShowPopup) IPC_MESSAGE_HANDLER(FrameHostMsg_HidePopup, OnHidePopup) @@ -2130,6 +2128,12 @@ renderer_main_thread_time); } +void RenderFrameHostImpl::OnSelectionChanged(const base::string16& text, + uint32_t offset, + const gfx::Range& range) { + GetRenderWidgetHost()->SelectionChanged(text, offset, range); +} + #if defined(USE_EXTERNAL_POPUP_MENU) void RenderFrameHostImpl::OnShowPopup( const FrameHostMsg_ShowPopup_Params& params) { @@ -2457,7 +2461,8 @@ render_view_host_->GetWidget()->increment_in_flight_event_count(); render_view_host_->GetWidget()->StartHangMonitorTimeout( TimeDelta::FromMilliseconds(RenderViewHostImpl::kUnloadTimeoutMS), - RenderWidgetHostDelegate::RENDERER_UNRESPONSIVE_BEFORE_UNLOAD); + blink::WebInputEvent::Undefined, + RendererUnresponsiveType::RENDERER_UNRESPONSIVE_BEFORE_UNLOAD); send_before_unload_start_time_ = base::TimeTicks::Now(); Send(new FrameMsg_BeforeUnload(routing_id_, is_reload)); } @@ -2519,18 +2524,18 @@ // leave the current page. In this case, use the regular timeout value used // during the (before)unload handling. if (is_waiting) { - RenderWidgetHostDelegate::RendererUnresponsiveType type = - RenderWidgetHostDelegate::RENDERER_UNRESPONSIVE_DIALOG_CLOSED; + RendererUnresponsiveType type = + RendererUnresponsiveType::RENDERER_UNRESPONSIVE_DIALOG_CLOSED; if (success) { type = is_waiting_for_beforeunload_ack_ - ? RenderWidgetHostDelegate::RENDERER_UNRESPONSIVE_BEFORE_UNLOAD - : RenderWidgetHostDelegate::RENDERER_UNRESPONSIVE_UNLOAD; + ? RendererUnresponsiveType::RENDERER_UNRESPONSIVE_BEFORE_UNLOAD + : RendererUnresponsiveType::RENDERER_UNRESPONSIVE_UNLOAD; } render_view_host_->GetWidget()->StartHangMonitorTimeout( success ? TimeDelta::FromMilliseconds(RenderViewHostImpl::kUnloadTimeoutMS) : render_view_host_->GetWidget()->hung_renderer_delay(), - type); + blink::WebInputEvent::Undefined, type); } FrameHostMsg_RunJavaScriptMessage::WriteReplyParams(reply_msg, @@ -2546,7 +2551,7 @@ if (is_waiting && dialog_was_suppressed) { render_view_host_->GetWidget()->delegate()->RendererUnresponsive( render_view_host_->GetWidget(), - RenderWidgetHostDelegate::RENDERER_UNRESPONSIVE_DIALOG_SUPPRESSED); + RendererUnresponsiveType::RENDERER_UNRESPONSIVE_DIALOG_SUPPRESSED); } }
diff --git a/content/browser/frame_host/render_frame_host_impl.h b/content/browser/frame_host/render_frame_host_impl.h index fe2738d..6df8c87 100644 --- a/content/browser/frame_host/render_frame_host_impl.h +++ b/content/browser/frame_host/render_frame_host_impl.h
@@ -68,6 +68,10 @@ } } +namespace gfx { +class Range; +} + namespace content { class AppWebMessagePortMessageFilter; class AssociatedInterfaceProviderImpl; @@ -719,6 +723,9 @@ bool success, const std::set<std::string>& digests_of_uris_of_serialized_resources, base::TimeDelta renderer_main_thread_time); + void OnSelectionChanged(const base::string16& text, + uint32_t offset, + const gfx::Range& range); #if defined(USE_EXTERNAL_POPUP_MENU) void OnShowPopup(const FrameHostMsg_ShowPopup_Params& params); @@ -801,10 +808,9 @@ // Sends a navigate message to the RenderFrame and notifies DevTools about // navigation happening. Should be used instead of sending the message // directly. - void SendNavigateMessage( - const content::CommonNavigationParams& common_params, - const content::StartNavigationParams& start_params, - const content::RequestNavigationParams& request_params); + void SendNavigateMessage(const CommonNavigationParams& common_params, + const StartNavigationParams& start_params, + const RequestNavigationParams& request_params); // Returns the child FrameTreeNode if |child_frame_routing_id| is an // immediate child of this FrameTreeNode. |child_frame_routing_id| is
diff --git a/content/browser/frame_host/render_frame_host_manager_unittest.cc b/content/browser/frame_host/render_frame_host_manager_unittest.cc index e17db95..f33bea5 100644 --- a/content/browser/frame_host/render_frame_host_manager_unittest.cc +++ b/content/browser/frame_host/render_frame_host_manager_unittest.cc
@@ -1729,7 +1729,7 @@ // Simulate the unresponsiveness timer. The tab should close. contents()->RendererUnresponsive( rfh1->render_view_host()->GetWidget(), - RenderWidgetHostDelegate::RENDERER_UNRESPONSIVE_CLOSE_PAGE); + RendererUnresponsiveType::RENDERER_UNRESPONSIVE_CLOSE_PAGE); EXPECT_TRUE(close_delegate.is_closed()); }
diff --git a/content/browser/gpu/gpu_process_host.cc b/content/browser/gpu/gpu_process_host.cc index d6d52f2..7829414 100644 --- a/content/browser/gpu/gpu_process_host.cc +++ b/content/browser/gpu/gpu_process_host.cc
@@ -90,7 +90,7 @@ #endif #if defined(OS_MACOSX) || defined(OS_ANDROID) -#include "content/browser/gpu/gpu_surface_tracker.h" +#include "gpu/ipc/common/gpu_surface_tracker.h" #endif namespace content { @@ -485,7 +485,7 @@ #if defined(OS_MACOSX) || defined(OS_ANDROID) UMA_HISTOGRAM_COUNTS_100("GPU.AtExitSurfaceCount", - GpuSurfaceTracker::Get()->GetSurfaceCount()); + gpu::GpuSurfaceTracker::Get()->GetSurfaceCount()); #endif std::string message;
diff --git a/content/browser/gpu/gpu_surface_tracker.cc b/content/browser/gpu/gpu_surface_tracker.cc deleted file mode 100644 index 3c6754c..0000000 --- a/content/browser/gpu/gpu_surface_tracker.cc +++ /dev/null
@@ -1,76 +0,0 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "content/browser/gpu/gpu_surface_tracker.h" - -#include "base/logging.h" -#include "build/build_config.h" - -#if defined(OS_ANDROID) -#include <android/native_window_jni.h> -#include "content/browser/android/child_process_launcher_android.h" -#include "ui/gl/android/scoped_java_surface.h" -#endif // defined(OS_ANDROID) - -namespace content { - -GpuSurfaceTracker::GpuSurfaceTracker() - : next_surface_handle_(1) { - gpu::GpuSurfaceLookup::InitInstance(this); -} - -GpuSurfaceTracker::~GpuSurfaceTracker() { - gpu::GpuSurfaceLookup::InitInstance(NULL); -} - -GpuSurfaceTracker* GpuSurfaceTracker::GetInstance() { - return base::Singleton<GpuSurfaceTracker>::get(); -} - -int GpuSurfaceTracker::AddSurfaceForNativeWidget( - gfx::AcceleratedWidget widget) { - base::AutoLock lock(lock_); - gpu::SurfaceHandle surface_handle = next_surface_handle_++; - surface_map_[surface_handle] = widget; - return surface_handle; -} - -bool GpuSurfaceTracker::IsValidSurfaceHandle( - gpu::SurfaceHandle surface_handle) const { - return surface_map_.find(surface_handle) != surface_map_.end(); -} - -void GpuSurfaceTracker::RemoveSurface(gpu::SurfaceHandle surface_handle) { - base::AutoLock lock(lock_); - DCHECK(surface_map_.find(surface_handle) != surface_map_.end()); - surface_map_.erase(surface_handle); -} - -gfx::AcceleratedWidget GpuSurfaceTracker::AcquireNativeWidget( - gpu::SurfaceHandle surface_handle) { - base::AutoLock lock(lock_); - SurfaceMap::iterator it = surface_map_.find(surface_handle); - if (it == surface_map_.end()) - return gfx::kNullAcceleratedWidget; - -#if defined(OS_ANDROID) - if (it->second != gfx::kNullAcceleratedWidget) - ANativeWindow_acquire(it->second); -#endif // defined(OS_ANDROID) - - return it->second; -} - -#if defined(OS_ANDROID) -gl::ScopedJavaSurface GpuSurfaceTracker::AcquireJavaSurface(int surface_id) { - return GetViewSurface(surface_id); -} -#endif - -std::size_t GpuSurfaceTracker::GetSurfaceCount() { - base::AutoLock lock(lock_); - return surface_map_.size(); -} - -} // namespace content
diff --git a/content/browser/media/android/browser_surface_view_manager.cc b/content/browser/media/android/browser_surface_view_manager.cc index 405f2281..00c51fe 100644 --- a/content/browser/media/android/browser_surface_view_manager.cc +++ b/content/browser/media/android/browser_surface_view_manager.cc
@@ -6,14 +6,13 @@ #include "base/android/build_info.h" #include "base/trace_event/trace_event.h" -#include "content/browser/android/child_process_launcher_android.h" #include "content/browser/android/content_view_core_impl.h" #include "content/browser/gpu/gpu_process_host.h" -#include "content/browser/gpu/gpu_surface_tracker.h" #include "content/browser/web_contents/web_contents_impl.h" #include "content/common/media/surface_view_manager_messages_android.h" #include "content/public/browser/render_frame_host.h" #include "content/public/browser/web_contents_delegate.h" +#include "gpu/ipc/common/gpu_surface_tracker.h" #include "media/base/surface_manager.h" #include "ui/gfx/geometry/size.h" @@ -41,17 +40,18 @@ TRACE_EVENT0("media", "BrowserSurfaceViewManager::SetVideoSurface"); if (surface.IsEmpty()) { DCHECK_NE(surface_id_, media::SurfaceManager::kNoSurfaceID); - GpuSurfaceTracker::Get()->RemoveSurface(surface_id_); - UnregisterViewSurface(surface_id_); + gpu::GpuSurfaceTracker::Get()->RemoveSurface(surface_id_); + gpu::GpuSurfaceTracker::Get()->UnregisterViewSurface(surface_id_); SendDestroyingVideoSurfaceIfRequired(surface_id_); surface_id_ = media::SurfaceManager::kNoSurfaceID; } else { // We mainly use the surface tracker to allocate a surface id for us. The // lookup will go through the Android specific path and get the java // surface directly, so there's no need to add a valid native widget here. - surface_id_ = GpuSurfaceTracker::Get()->AddSurfaceForNativeWidget( + surface_id_ = gpu::GpuSurfaceTracker::Get()->AddSurfaceForNativeWidget( gfx::kNullAcceleratedWidget); - RegisterViewSurface(surface_id_, surface.j_surface()); + gpu::GpuSurfaceTracker::GetInstance()->RegisterViewSurface( + surface_id_, surface.j_surface()); SendSurfaceID(surface_id_); } }
diff --git a/content/browser/media/capture/desktop_capture_device.cc b/content/browser/media/capture/desktop_capture_device.cc index 877cfdd..4de6181c 100644 --- a/content/browser/media/capture/desktop_capture_device.cc +++ b/content/browser/media/capture/desktop_capture_device.cc
@@ -349,7 +349,7 @@ DCHECK(!capture_in_progress_); capture_in_progress_ = true; - desktop_capturer_->Capture(webrtc::DesktopRegion()); + desktop_capturer_->CaptureFrame(); // Currently only synchronous implementations of DesktopCapturer are // supported.
diff --git a/content/browser/media/capture/desktop_capture_device_unittest.cc b/content/browser/media/capture/desktop_capture_device_unittest.cc index 63f655f4..4547ab64 100644 --- a/content/browser/media/capture/desktop_capture_device_unittest.cc +++ b/content/browser/media/capture/desktop_capture_device_unittest.cc
@@ -192,7 +192,7 @@ // VideoFrameCapturer interface. void Start(Callback* callback) override { callback_ = callback; } - void Capture(const webrtc::DesktopRegion& region) override { + void CaptureFrame() override { webrtc::DesktopSize size; if (frame_index_ % 2 == 0) { size = webrtc::DesktopSize(kTestFrameWidth1, kTestFrameHeight1);
diff --git a/content/browser/memory/memory_coordinator.cc b/content/browser/memory/memory_coordinator.cc index 622d8b9..ed6dde0 100644 --- a/content/browser/memory/memory_coordinator.cc +++ b/content/browser/memory/memory_coordinator.cc
@@ -16,32 +16,43 @@ // for the role of this class. class MemoryCoordinatorHandleImpl : public mojom::MemoryCoordinatorHandle { public: - MemoryCoordinatorHandleImpl(mojom::MemoryCoordinatorHandleRequest request) - : binding_(this, std::move(request)) { - } + MemoryCoordinatorHandleImpl(mojom::MemoryCoordinatorHandleRequest request, + MemoryCoordinator* coordinator, + int render_process_id); + ~MemoryCoordinatorHandleImpl() override; // mojom::MemoryCoordinatorHandle: - void AddChild(mojom::ChildMemoryCoordinatorPtr child) override { - DCHECK(!child_.is_bound()); - child_ = std::move(child); - } + void AddChild(mojom::ChildMemoryCoordinatorPtr child) override; mojom::ChildMemoryCoordinatorPtr& child() { return child_; } mojo::Binding<mojom::MemoryCoordinatorHandle>& binding() { return binding_; } private: + MemoryCoordinator* coordinator_; + int render_process_id_; mojom::ChildMemoryCoordinatorPtr child_; mojo::Binding<mojom::MemoryCoordinatorHandle> binding_; DISALLOW_COPY_AND_ASSIGN(MemoryCoordinatorHandleImpl); }; -// static -MemoryCoordinator* MemoryCoordinator::GetInstance() { - if (!base::FeatureList::IsEnabled(features::kMemoryCoordinator)) - return nullptr; - return base::Singleton<MemoryCoordinator, - base::LeakySingletonTraits<MemoryCoordinator>>::get(); +MemoryCoordinatorHandleImpl::MemoryCoordinatorHandleImpl( + mojom::MemoryCoordinatorHandleRequest request, + MemoryCoordinator* coordinator, + int render_process_id) + : coordinator_(coordinator), + render_process_id_(render_process_id), + binding_(this, std::move(request)) { + DCHECK(coordinator_); +} + +MemoryCoordinatorHandleImpl::~MemoryCoordinatorHandleImpl() {} + +void MemoryCoordinatorHandleImpl::AddChild( + mojom::ChildMemoryCoordinatorPtr child) { + DCHECK(!child_.is_bound()); + child_ = std::move(child); + coordinator_->OnChildAdded(render_process_id_); } MemoryCoordinator::MemoryCoordinator() @@ -54,7 +65,8 @@ int render_process_id, mojom::MemoryCoordinatorHandleRequest request) { std::unique_ptr<MemoryCoordinatorHandleImpl> handle( - new MemoryCoordinatorHandleImpl(std::move(request))); + new MemoryCoordinatorHandleImpl(std::move(request), this, + render_process_id)); handle->binding().set_connection_error_handler( base::Bind(&MemoryCoordinator::OnConnectionError, base::Unretained(this), render_process_id)); @@ -76,10 +88,19 @@ if (iter == children_.end()) return false; + // Can't send a message to a child that isn't bound. + if (!iter->second.handle->child().is_bound()) + return false; + // A nop doesn't need to be sent, but is considered successful. if (iter->second.memory_state == memory_state) return true; + // Can't throttle the given renderer. + if (memory_state == mojom::MemoryState::THROTTLED && + !CanThrottleRenderer(render_process_id)) + return false; + // Can't suspend the given renderer. if (memory_state == mojom::MemoryState::SUSPENDED && !CanSuspendRenderer(render_process_id)) @@ -99,12 +120,17 @@ return iter->second.memory_state; } +base::MemoryState MemoryCoordinator::GetCurrentMemoryState() const { + return base::MemoryState::UNKNOWN; +} + void MemoryCoordinator::AddChildForTesting( int dummy_render_process_id, mojom::ChildMemoryCoordinatorPtr child) { mojom::MemoryCoordinatorHandlePtr mch; auto request = mojo::GetProxy(&mch); std::unique_ptr<MemoryCoordinatorHandleImpl> handle( - new MemoryCoordinatorHandleImpl(std::move(request))); + new MemoryCoordinatorHandleImpl(std::move(request), this, + dummy_render_process_id)); handle->AddChild(std::move(child)); CreateChildInfoMapEntry(dummy_render_process_id, std::move(handle)); } @@ -113,6 +139,16 @@ children_.erase(render_process_id); } +bool MemoryCoordinator::CanThrottleRenderer(int render_process_id) { + // If there is no delegate (i.e. tests), renderers are always throttleable. + // TODO(bashi): We check |delegate_| to avoid calling FromID() on a + // wrong thread in tests. Figure out a better way to handle tests. + if (!delegate_) + return true; + auto* render_process_host = RenderProcessHost::FromID(render_process_id); + return render_process_host->IsProcessBackgrounded(); +} + bool MemoryCoordinator::CanSuspendRenderer(int render_process_id) { // If there is no delegate (i.e. tests), renderers are always suspendable. if (!delegate_)
diff --git a/content/browser/memory/memory_coordinator.h b/content/browser/memory/memory_coordinator.h index 65f4478..d9628fd1 100644 --- a/content/browser/memory/memory_coordinator.h +++ b/content/browser/memory/memory_coordinator.h
@@ -6,7 +6,6 @@ #define CONTENT_BROWSER_MEMORY_MEMORY_COORDINATOR_H_ #include "base/memory/memory_coordinator_client_registry.h" -#include "base/memory/singleton.h" #include "base/process/process_handle.h" #include "content/common/content_export.h" #include "content/common/memory_coordinator.mojom.h" @@ -25,11 +24,15 @@ // child processes based on its best knowledge of the memory usage. class CONTENT_EXPORT MemoryCoordinator { public: - ~MemoryCoordinator(); + virtual ~MemoryCoordinator(); // Singleton factory/accessor. static MemoryCoordinator* GetInstance(); + // Starts monitoring memory usage. After calling this method, memory + // coordinator will start dispatching state changes. + virtual void Start() {} + // Creates a handle to the provided child process. void CreateHandle(int render_process_id, mojom::MemoryCoordinatorHandleRequest request); @@ -47,6 +50,11 @@ // if the process is not tracked by this coordinator. mojom::MemoryState GetMemoryState(int render_process_id) const; + // Called when ChildMemoryCoordinator calls AddChild(). + virtual void OnChildAdded(int render_process_id) {} + + virtual base::MemoryState GetCurrentMemoryState() const; + protected: // Constructor. Protected as this is a singleton, but accessible for // unittests. @@ -60,17 +68,12 @@ // for testing. void OnConnectionError(int render_process_id); + // Returns true when a given renderer can be throttled. + bool CanThrottleRenderer(int render_process_id); + // Returns true when a given renderer can be suspended. bool CanSuspendRenderer(int render_process_id); - private: - friend struct base::DefaultSingletonTraits<MemoryCoordinator>; - - // Helper function of CreateHandle and AddChildForTesting. - void CreateChildInfoMapEntry( - int render_process_id, - std::unique_ptr<MemoryCoordinatorHandleImpl> handle); - // Stores information about any known child processes. struct ChildInfo { // This object must be compatible with STL containers. @@ -85,6 +88,14 @@ // A map from process ID (RenderProcessHost::GetID()) to child process info. using ChildInfoMap = std::map<int, ChildInfo>; + ChildInfoMap& children() { return children_; } + +private: + // Helper function of CreateHandle and AddChildForTesting. + void CreateChildInfoMapEntry( + int render_process_id, + std::unique_ptr<MemoryCoordinatorHandleImpl> handle); + // Tracks child processes. An entry is added when a renderer connects to // MemoryCoordinator and removed automatically when an underlying binding is // disconnected.
diff --git a/content/browser/memory/memory_coordinator_browsertest.cc b/content/browser/memory/memory_coordinator_browsertest.cc index 03c3f4a..4a6b4cc0 100644 --- a/content/browser/memory/memory_coordinator_browsertest.cc +++ b/content/browser/memory/memory_coordinator_browsertest.cc
@@ -35,7 +35,13 @@ DISALLOW_COPY_AND_ASSIGN(MemoryCoordinatorTest); }; -IN_PROC_BROWSER_TEST_F(MemoryCoordinatorTest, HandleAdded) { +// TODO(bashi): Enable this test on macos when MemoryMonitorMac is implemented. +#if defined(OS_MACOSX) +#define MAYBE_HandleAdded DISABLED_HandleAdded +#else +#define MAYBE_HandleAdded HandleAdded +#endif +IN_PROC_BROWSER_TEST_F(MemoryCoordinatorTest, MAYBE_HandleAdded) { GURL url = GetTestUrl("", "simple_page.html"); NavigateToURL(shell(), url); EXPECT_EQ(1u, MemoryCoordinator::GetInstance()->NumChildrenForTesting());
diff --git a/content/browser/memory/memory_coordinator_impl.cc b/content/browser/memory/memory_coordinator_impl.cc new file mode 100644 index 0000000..53d215a --- /dev/null +++ b/content/browser/memory/memory_coordinator_impl.cc
@@ -0,0 +1,195 @@ +// 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 "content/browser/memory/memory_coordinator_impl.h" + +#include "base/threading/thread_task_runner_handle.h" +#include "content/browser/memory/memory_monitor.h" +#include "content/public/common/content_features.h" + +namespace content { + +namespace { + +// A expected renderer size. These values come from the median of appropriate +// UMA stats. +#if defined(OS_ANDROID) || defined(OS_IOS) +const int kDefaultExpectedRendererSizeMB = 40; +#elif defined(OS_WIN) +const int kDefaultExpectedRendererSizeMB = 70; +#else // Mac, Linux, and ChromeOS +const int kDefaultExpectedRendererSizeMB = 120; +#endif + +// Default values for parameters to determine the global state. +const int kDefaultNewRenderersUntilThrottled = 4; +const int kDefaultNewRenderersUntilSuspended = 2; +const int kDefaultNewRenderersBackToNormal = 5; +const int kDefaultNewRenderersBackToThrottled = 3; +const int kDefaultMinimumTransitionPeriodSeconds = 30; +const int kDefaultMonitoringIntervalSeconds = 5; + +mojom::MemoryState ToMojomMemoryState(base::MemoryState state) { + switch (state) { + case base::MemoryState::UNKNOWN: + return mojom::MemoryState::UNKNOWN; + case base::MemoryState::NORMAL: + return mojom::MemoryState::NORMAL; + case base::MemoryState::THROTTLED: + return mojom::MemoryState::THROTTLED; + case base::MemoryState::SUSPENDED: + return mojom::MemoryState::SUSPENDED; + default: + NOTREACHED(); + return mojom::MemoryState::UNKNOWN; + } +} + +} // namespace + +// SingletonTraits for MemoryCoordinator. Returns MemoryCoordinatorImpl +// as an actual instance. +struct MemoryCoordinatorSingletonTraits + : public base::LeakySingletonTraits<MemoryCoordinator> { + static MemoryCoordinator* New() { + return new MemoryCoordinatorImpl(base::ThreadTaskRunnerHandle::Get(), + CreateMemoryMonitor()); + } +}; + +// static +MemoryCoordinator* MemoryCoordinator::GetInstance() { + if (!base::FeatureList::IsEnabled(features::kMemoryCoordinator)) + return nullptr; + return base::Singleton<MemoryCoordinator, + MemoryCoordinatorSingletonTraits>::get(); +} + +MemoryCoordinatorImpl::MemoryCoordinatorImpl( + scoped_refptr<base::SingleThreadTaskRunner> task_runner, + std::unique_ptr<MemoryMonitor> memory_monitor) + : task_runner_(task_runner), + memory_monitor_(std::move(memory_monitor)), + weak_ptr_factory_(this) { + DCHECK(memory_monitor_.get()); + update_state_callback_ = base::Bind(&MemoryCoordinatorImpl::UpdateState, + weak_ptr_factory_.GetWeakPtr()); + + // Set initial parameters for calculating the global state. + expected_renderer_size_ = kDefaultExpectedRendererSizeMB; + new_renderers_until_throttled_ = kDefaultNewRenderersUntilThrottled; + new_renderers_until_suspended_ = kDefaultNewRenderersUntilSuspended; + new_renderers_back_to_normal_ = kDefaultNewRenderersBackToNormal; + new_renderers_back_to_throttled_ = kDefaultNewRenderersBackToThrottled; + minimum_transition_period_ = + base::TimeDelta::FromSeconds(kDefaultMinimumTransitionPeriodSeconds); + monitoring_interval_ = + base::TimeDelta::FromSeconds(kDefaultMonitoringIntervalSeconds); +} + +MemoryCoordinatorImpl::~MemoryCoordinatorImpl() {} + +void MemoryCoordinatorImpl::Start() { + DCHECK(CalledOnValidThread()); + DCHECK(last_state_change_.is_null()); + DCHECK(ValidateParameters()); + ScheduleUpdateState(base::TimeDelta()); +} + +void MemoryCoordinatorImpl::OnChildAdded(int render_process_id) { + // Populate the global state as an initial state of a newly created process. + SetMemoryState(render_process_id, ToMojomMemoryState(current_state_)); +} + +base::MemoryState MemoryCoordinatorImpl::GetCurrentMemoryState() const { + return current_state_; +} + +base::MemoryState MemoryCoordinatorImpl::CalculateNextState() { + using MemoryState = base::MemoryState; + + int available = memory_monitor_->GetFreeMemoryUntilCriticalMB(); + if (available <= 0) + return MemoryState::SUSPENDED; + + int expected_renderer_count = available / expected_renderer_size_; + + switch (current_state_) { + case MemoryState::NORMAL: + if (expected_renderer_count <= new_renderers_until_suspended_) + return MemoryState::SUSPENDED; + if (expected_renderer_count <= new_renderers_until_throttled_) + return MemoryState::THROTTLED; + return MemoryState::NORMAL; + case MemoryState::THROTTLED: + if (expected_renderer_count <= new_renderers_until_suspended_) + return MemoryState::SUSPENDED; + if (expected_renderer_count >= new_renderers_back_to_normal_) + return MemoryState::NORMAL; + return MemoryState::THROTTLED; + case MemoryState::SUSPENDED: + if (expected_renderer_count >= new_renderers_back_to_normal_) + return MemoryState::NORMAL; + if (expected_renderer_count >= new_renderers_back_to_throttled_) + return MemoryState::THROTTLED; + return MemoryState::SUSPENDED; + case MemoryState::UNKNOWN: + // Fall through + default: + NOTREACHED(); + return MemoryState::UNKNOWN; + } +} + +void MemoryCoordinatorImpl::UpdateState() { + base::TimeTicks now = base::TimeTicks::Now(); + MemoryState prev_state = current_state_; + MemoryState next_state = CalculateNextState(); + + if (last_state_change_.is_null() || current_state_ != next_state) { + current_state_ = next_state; + last_state_change_ = now; + } + + if (next_state != prev_state) { + NotifyStateToClients(); + NotifyStateToChildren(); + ScheduleUpdateState(minimum_transition_period_); + } else { + ScheduleUpdateState(monitoring_interval_); + } +} + +void MemoryCoordinatorImpl::NotifyStateToClients() { + // SUSPENDED state may not make sense to the browser process. Use THROTTLED + // instead when the global state is SUSPENDED. + // TODO(bashi): Maybe worth considering another state for the browser. + auto state = current_state_ == MemoryState::SUSPENDED ? MemoryState::THROTTLED + : current_state_; + base::MemoryCoordinatorClientRegistry::GetInstance()->Notify(state); +} + +void MemoryCoordinatorImpl::NotifyStateToChildren() { + auto mojo_state = ToMojomMemoryState(current_state_); + // It's OK to call SetMemoryState() unconditionally because it checks whether + // this state transition is valid. + // TODO(bashi): In SUSPENDED state, we should update children's state + // accordingly when the foreground tab is changed (e.g. resume a renderer + // which becomes foreground and suspend a renderer which goes to background). + for (auto& iter : children()) + SetMemoryState(iter.first, mojo_state); +} + +void MemoryCoordinatorImpl::ScheduleUpdateState(base::TimeDelta delta) { + task_runner_->PostDelayedTask(FROM_HERE, update_state_callback_, delta); +} + +bool MemoryCoordinatorImpl::ValidateParameters() { + return (new_renderers_until_throttled_ > new_renderers_until_suspended_) && + (new_renderers_back_to_normal_ > new_renderers_back_to_throttled_) && + (new_renderers_back_to_normal_ > new_renderers_until_throttled_) && + (new_renderers_back_to_throttled_ > new_renderers_until_suspended_); +} + +} // namespace content
diff --git a/content/browser/memory/memory_coordinator_impl.h b/content/browser/memory/memory_coordinator_impl.h new file mode 100644 index 0000000..6d975b38 --- /dev/null +++ b/content/browser/memory/memory_coordinator_impl.h
@@ -0,0 +1,121 @@ +// 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_BROWSER_MEMORY_MEMORY_COORDINATOR_IMPL_H_ +#define CONTENT_BROWSER_MEMORY_MEMORY_COORDINATOR_IMPL_H_ + +#include "base/callback.h" +#include "base/memory/singleton.h" +#include "base/memory/weak_ptr.h" +#include "base/single_thread_task_runner.h" +#include "base/threading/non_thread_safe.h" +#include "base/time/time.h" +#include "content/browser/memory/memory_coordinator.h" + +namespace content { + +class MemoryMonitor; +class MemoryCoordinatorImplTest; +struct MemoryCoordinatorSingletonTraits; + +// MemoryCoordinatorImpl is an internal implementation of MemoryCoordinator +// which uses a heuristic to determine a single global memory state. +// In the current implementation browser process and renderer processes share +// the global state; the memory coordinator will notify the global state to +// all background renderers if the state has changed. +// +// State calculation: +// MemoryCoordinatorImpl uses followings to determine the global state: +// * Compute "number of renderers which can be created until the system will +// be in a critical state". Call this N. +// (See memory_monitor.h for the definition of "critical") +// * Covert N to a memory state using some thresholds/hysteresis for each state. +// Once a state is changed to a limited state, larger N will be needed to go +// back to a relaxed state. (e.g. THROTTLED -> NORMAL) +// * Once a state is changed, it remains the same for a certain period of time. +class CONTENT_EXPORT MemoryCoordinatorImpl : public MemoryCoordinator, + public base::NonThreadSafe { + public: + MemoryCoordinatorImpl(scoped_refptr<base::SingleThreadTaskRunner> task_runner, + std::unique_ptr<MemoryMonitor> monitor); + ~MemoryCoordinatorImpl() override; + + // MemoryCoordinator implementations: + void Start() override; + void OnChildAdded(int render_process_id) override; + + MemoryMonitor* memory_monitor() { return memory_monitor_.get(); } + + base::MemoryState GetCurrentMemoryState() const override; + + private: + FRIEND_TEST_ALL_PREFIXES(MemoryCoordinatorImplTest, CalculateNextState); + FRIEND_TEST_ALL_PREFIXES(MemoryCoordinatorImplTest, UpdateState); + + friend struct MemoryCoordinatorSingletonTraits; + + using MemoryState = base::MemoryState; + + // Calculates the next global state from the amount of free memory using + // a heuristic. + MemoryState CalculateNextState(); + + // Updates the global state and notifies state changes to clients (lives in + // the browser) and child processes (renderers) if necessary. + void UpdateState(); + + // Notifies a state change to in-process clients. + void NotifyStateToClients(); + + // Notifies a state change to child processes. + void NotifyStateToChildren(); + + // Schedules a task to update the global state. The task will be executed + // after |delay| has passed. + void ScheduleUpdateState(base::TimeDelta delay); + + scoped_refptr<base::SingleThreadTaskRunner> task_runner_; + std::unique_ptr<MemoryMonitor> memory_monitor_; + base::Closure update_state_callback_; + base::MemoryState current_state_ = MemoryState::NORMAL; + base::TimeTicks last_state_change_; + + // Validates parameters defined below. + bool ValidateParameters(); + + // Parameters to control the heuristic. + + // The median size of a renderer on the current platform. This is used to + // convert the amount of free memory to an expected number of new renderers + // that could be started before hitting critical memory pressure. + int expected_renderer_size_; + // When in a NORMAL state and the potential number of new renderers drops + // below this level, the coordinator will transition to a THROTTLED state. + int new_renderers_until_throttled_; + // When in a NORMAL/THROTTLED state and the potential number of new renderers + // drops below this level, the coordinator will transition to a SUSPENDED + // state. + int new_renderers_until_suspended_; + // When in a THROTTLED/SUSPENDED state and the potential number of new + // renderers rises above this level, the coordinator will transition to a + // NORMAL state. + int new_renderers_back_to_normal_; + // When in a SUSPENDED state and the potential number of new renderers rises + // above this level, the coordinator will transition to a SUSPENDED state. + int new_renderers_back_to_throttled_; + // The memory coordinator stays in the same state at least this duration even + // when there are considerable changes in the amount of free memory to prevent + // thrashing. + base::TimeDelta minimum_transition_period_; + // The interval of checking the amount of free memory. + base::TimeDelta monitoring_interval_; + + base::WeakPtrFactory<MemoryCoordinatorImpl> weak_ptr_factory_; + + DISALLOW_COPY_AND_ASSIGN(MemoryCoordinatorImpl); +}; + +} // namespace content + +#endif // CONTENT_BROWSER_MEMORY_MEMORY_COORDINATOR_IMPL_H_
diff --git a/content/browser/memory/memory_coordinator_impl_unittest.cc b/content/browser/memory/memory_coordinator_impl_unittest.cc new file mode 100644 index 0000000..d8c575d6 --- /dev/null +++ b/content/browser/memory/memory_coordinator_impl_unittest.cc
@@ -0,0 +1,147 @@ +// 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 "content/browser/memory/memory_coordinator_impl.h" + +#include "base/run_loop.h" +#include "content/browser/memory/memory_monitor.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace content { + +namespace { + +class MockMemoryCoordinatorClient : public base::MemoryCoordinatorClient { + public: + void OnMemoryStateChange(base::MemoryState state) override { + is_called_ = true; + state_ = state; + } + + bool is_called() { return is_called_; } + base::MemoryState state() { return state_; } + + private: + bool is_called_ = false; + base::MemoryState state_ = base::MemoryState::NORMAL; +}; + +} // namespace + +class MockMemoryMonitor : public MemoryMonitor { + public: + MockMemoryMonitor() {} + ~MockMemoryMonitor() override {} + + void SetFreeMemoryUntilCriticalMB(int free_memory) { + free_memory_ = free_memory; + } + + // MemoryMonitor implementation + int GetFreeMemoryUntilCriticalMB() override { return free_memory_; } + + private: + int free_memory_ = 0; + + DISALLOW_COPY_AND_ASSIGN(MockMemoryMonitor); +}; + +class MemoryCoordinatorImplTest : public testing::Test { + public: + void SetUp() override { + coordinator_.reset(new MemoryCoordinatorImpl( + message_loop_.task_runner(), base::WrapUnique(new MockMemoryMonitor))); + } + + MockMemoryMonitor* GetMockMemoryMonitor() { + return static_cast<MockMemoryMonitor*>(coordinator_->memory_monitor()); + } + + protected: + std::unique_ptr<MemoryCoordinatorImpl> coordinator_; + base::MessageLoop message_loop_; +}; + +TEST_F(MemoryCoordinatorImplTest, CalculateNextState) { + coordinator_->expected_renderer_size_ = 10; + coordinator_->new_renderers_until_throttled_ = 4; + coordinator_->new_renderers_until_suspended_ = 2; + coordinator_->new_renderers_back_to_normal_ = 5; + coordinator_->new_renderers_back_to_throttled_ = 3; + DCHECK(coordinator_->ValidateParameters()); + + // The default state is NORMAL. + EXPECT_EQ(base::MemoryState::NORMAL, coordinator_->GetCurrentMemoryState()); + + // Transitions from NORMAL + coordinator_->current_state_ = base::MemoryState::NORMAL; + EXPECT_EQ(base::MemoryState::NORMAL, coordinator_->GetCurrentMemoryState()); + GetMockMemoryMonitor()->SetFreeMemoryUntilCriticalMB(50); + EXPECT_EQ(base::MemoryState::NORMAL, coordinator_->CalculateNextState()); + GetMockMemoryMonitor()->SetFreeMemoryUntilCriticalMB(40); + EXPECT_EQ(base::MemoryState::THROTTLED, coordinator_->CalculateNextState()); + GetMockMemoryMonitor()->SetFreeMemoryUntilCriticalMB(20); + EXPECT_EQ(base::MemoryState::SUSPENDED, coordinator_->CalculateNextState()); + + // Transitions from THROTTLED + coordinator_->current_state_ = base::MemoryState::THROTTLED; + EXPECT_EQ(base::MemoryState::THROTTLED, + coordinator_->GetCurrentMemoryState()); + GetMockMemoryMonitor()->SetFreeMemoryUntilCriticalMB(40); + EXPECT_EQ(base::MemoryState::THROTTLED, coordinator_->CalculateNextState()); + GetMockMemoryMonitor()->SetFreeMemoryUntilCriticalMB(50); + EXPECT_EQ(base::MemoryState::NORMAL, coordinator_->CalculateNextState()); + GetMockMemoryMonitor()->SetFreeMemoryUntilCriticalMB(20); + EXPECT_EQ(base::MemoryState::SUSPENDED, coordinator_->CalculateNextState()); + + // Transitions from SUSPENDED + coordinator_->current_state_ = base::MemoryState::SUSPENDED; + EXPECT_EQ(base::MemoryState::SUSPENDED, + coordinator_->GetCurrentMemoryState()); + GetMockMemoryMonitor()->SetFreeMemoryUntilCriticalMB(20); + EXPECT_EQ(base::MemoryState::SUSPENDED, coordinator_->CalculateNextState()); + GetMockMemoryMonitor()->SetFreeMemoryUntilCriticalMB(30); + EXPECT_EQ(base::MemoryState::THROTTLED, coordinator_->CalculateNextState()); + GetMockMemoryMonitor()->SetFreeMemoryUntilCriticalMB(50); + EXPECT_EQ(base::MemoryState::NORMAL, coordinator_->CalculateNextState()); +} + +TEST_F(MemoryCoordinatorImplTest, UpdateState) { + coordinator_->expected_renderer_size_ = 10; + coordinator_->new_renderers_until_throttled_ = 4; + coordinator_->new_renderers_until_suspended_ = 2; + coordinator_->new_renderers_back_to_normal_ = 5; + coordinator_->new_renderers_back_to_throttled_ = 3; + DCHECK(coordinator_->ValidateParameters()); + + { + // Transition happens (NORMAL -> THROTTLED). + MockMemoryCoordinatorClient client; + base::MemoryCoordinatorClientRegistry::GetInstance()->Register(&client); + coordinator_->current_state_ = base::MemoryState::NORMAL; + GetMockMemoryMonitor()->SetFreeMemoryUntilCriticalMB(40); + coordinator_->UpdateState(); + base::RunLoop loop; + loop.RunUntilIdle(); + EXPECT_TRUE(client.is_called()); + EXPECT_EQ(base::MemoryState::THROTTLED, client.state()); + base::MemoryCoordinatorClientRegistry::GetInstance()->Unregister(&client); + } + + { + // No transtion (NORMAL -> NORMAL). OnStateChange shouldn't be called. + MockMemoryCoordinatorClient client; + base::MemoryCoordinatorClientRegistry::GetInstance()->Register(&client); + coordinator_->current_state_ = base::MemoryState::NORMAL; + GetMockMemoryMonitor()->SetFreeMemoryUntilCriticalMB(50); + coordinator_->UpdateState(); + base::RunLoop loop; + loop.RunUntilIdle(); + EXPECT_FALSE(client.is_called()); + EXPECT_EQ(base::MemoryState::NORMAL, client.state()); + base::MemoryCoordinatorClientRegistry::GetInstance()->Unregister(&client); + } +} + +} // namespace content
diff --git a/content/browser/memory/memory_coordinator_unittest.cc b/content/browser/memory/memory_coordinator_unittest.cc index c62232f1..eb81c98 100644 --- a/content/browser/memory/memory_coordinator_unittest.cc +++ b/content/browser/memory/memory_coordinator_unittest.cc
@@ -59,7 +59,7 @@ }; TestMemoryCoordinator() {} - ~TestMemoryCoordinator() {} + ~TestMemoryCoordinator() override {} using MemoryCoordinator::OnConnectionError;
diff --git a/content/browser/memory/memory_monitor.cc b/content/browser/memory/memory_monitor.cc index 5e67c9c..a9e16845 100644 --- a/content/browser/memory/memory_monitor.cc +++ b/content/browser/memory/memory_monitor.cc
@@ -22,4 +22,12 @@ base::GetSystemMemoryInfo(mem_info); } +#if defined(OS_MACOSX) +// TODO(bashi,bcwhite): Remove when memory monitor for mac is available. +std::unique_ptr<MemoryMonitor> CreateMemoryMonitor() { + NOTREACHED(); + return std::unique_ptr<MemoryMonitor>(); +} +#endif + } // namespace content
diff --git a/content/browser/net/browser_online_state_observer.cc b/content/browser/net/browser_online_state_observer.cc index 9b457f9b..a2bbdfe8 100644 --- a/content/browser/net/browser_online_state_observer.cc +++ b/content/browser/net/browser_online_state_observer.cc
@@ -26,8 +26,8 @@ net::NetworkChangeNotifier::ConnectionType type) { for (RenderProcessHost::iterator it(RenderProcessHost::AllHostsIterator()); !it.IsAtEnd(); it.Advance()) { - it.GetCurrentValue()->Send( - new ViewMsg_NetworkConnectionChanged(type, max_bandwidth_mbps)); + it.GetCurrentValue()->GetRendererInterface()->OnNetworkConnectionChanged( + type, max_bandwidth_mbps); } } @@ -43,8 +43,8 @@ net::NetworkChangeNotifier::ConnectionType connection_type; net::NetworkChangeNotifier::GetMaxBandwidthAndConnectionType( &max_bandwidth_mbps, &connection_type); - rph->Send(new ViewMsg_NetworkConnectionChanged(connection_type, - max_bandwidth_mbps)); + rph->GetRendererInterface()->OnNetworkConnectionChanged( + connection_type, max_bandwidth_mbps); } } // namespace content
diff --git a/content/browser/notification_service_impl.cc b/content/browser/notification_service_impl.cc index 27de8579..b732ca7 100644 --- a/content/browser/notification_service_impl.cc +++ b/content/browser/notification_service_impl.cc
@@ -105,31 +105,27 @@ // Notify observers of all types and all sources if (HasKey(observers_[NOTIFICATION_ALL], AllSources()) && source != AllSources()) { - FOR_EACH_OBSERVER(NotificationObserver, - *observers_[NOTIFICATION_ALL][AllSources().map_key()], - Observe(type, source, details)); + for (auto& observer : *observers_[NOTIFICATION_ALL][AllSources().map_key()]) + observer.Observe(type, source, details); } // Notify observers of all types and the given source if (HasKey(observers_[NOTIFICATION_ALL], source)) { - FOR_EACH_OBSERVER(NotificationObserver, - *observers_[NOTIFICATION_ALL][source.map_key()], - Observe(type, source, details)); + for (auto& observer : *observers_[NOTIFICATION_ALL][source.map_key()]) + observer.Observe(type, source, details); } // Notify observers of the given type and all sources if (HasKey(observers_[type], AllSources()) && source != AllSources()) { - FOR_EACH_OBSERVER(NotificationObserver, - *observers_[type][AllSources().map_key()], - Observe(type, source, details)); + for (auto& observer : *observers_[type][AllSources().map_key()]) + observer.Observe(type, source, details); } // Notify observers of the given type and the given source if (HasKey(observers_[type], source)) { - FOR_EACH_OBSERVER(NotificationObserver, - *observers_[type][source.map_key()], - Observe(type, source, details)); + for (auto& observer : *observers_[type][source.map_key()]) + observer.Observe(type, source, details); } }
diff --git a/content/browser/notifications/notification_message_filter.cc b/content/browser/notifications/notification_message_filter.cc index 6efe1d2..42fd875 100644 --- a/content/browser/notifications/notification_message_filter.cc +++ b/content/browser/notifications/notification_message_filter.cc
@@ -117,10 +117,7 @@ OnShowPersistentNotification) IPC_MESSAGE_HANDLER(PlatformNotificationHostMsg_GetNotifications, OnGetNotifications) - IPC_MESSAGE_HANDLER(PlatformNotificationHostMsg_Close, - OnClosePlatformNotification) - IPC_MESSAGE_HANDLER(PlatformNotificationHostMsg_ClosePersistent, - OnClosePersistentNotification) + IPC_MESSAGE_HANDLER(PlatformNotificationHostMsg_Close, OnCloseNotification) IPC_MESSAGE_UNHANDLED(handled = false) IPC_END_MESSAGE_MAP() @@ -130,8 +127,7 @@ void NotificationMessageFilter::OverrideThreadForMessage( const IPC::Message& message, content::BrowserThread::ID* thread) { - if (message.type() == PlatformNotificationHostMsg_Show::ID || - message.type() == PlatformNotificationHostMsg_Close::ID) + if (message.type() == PlatformNotificationHostMsg_Show::ID) *thread = BrowserThread::UI; } @@ -306,26 +302,7 @@ request_id, persistent_notifications)); } -void NotificationMessageFilter::OnClosePlatformNotification( - const GURL& origin, - const std::string& tag, - int non_persistent_notification_id) { - DCHECK_CURRENTLY_ON(BrowserThread::UI); - if (!RenderProcessHost::FromID(process_id_)) - return; - - std::string notification_id = - GetNotificationIdGenerator()->GenerateForNonPersistentNotification( - origin, tag, non_persistent_notification_id, process_id_); - - if (!close_closures_.count(notification_id)) - return; - - close_closures_[notification_id].Run(); - close_closures_.erase(notification_id); -} - -void NotificationMessageFilter::OnClosePersistentNotification( +void NotificationMessageFilter::OnCloseNotification( const GURL& origin, const std::string& tag, const std::string& notification_id) { @@ -340,19 +317,38 @@ GetContentClient()->browser()->GetPlatformNotificationService(); DCHECK(service); - // There's no point in waiting until the database data has been removed before - // closing the notification presented to the user. Post that task immediately. - BrowserThread::PostTask( - BrowserThread::UI, FROM_HERE, - base::Bind(&PlatformNotificationService::ClosePersistentNotification, - base::Unretained(service), // The service is a singleton. - browser_context_, notification_id)); + if (NotificationIdGenerator::IsPersistentNotification(notification_id)) { + // There's no point in waiting until the database data has been removed + // before closing the notification presented to the user. + BrowserThread::PostTask( + BrowserThread::UI, FROM_HERE, + base::Bind(&PlatformNotificationService::ClosePersistentNotification, + base::Unretained(service), // The service is a singleton. + browser_context_, notification_id)); - notification_context_->DeleteNotificationData( - notification_id, origin, - base::Bind( - &NotificationMessageFilter::DidDeletePersistentNotificationData, - weak_factory_io_.GetWeakPtr())); + notification_context_->DeleteNotificationData( + notification_id, origin, + base::Bind( + &NotificationMessageFilter::DidDeletePersistentNotificationData, + weak_factory_io_.GetWeakPtr())); + + return; + } + + if (NotificationIdGenerator::IsNonPersistentNotification(notification_id)) { + if (!close_closures_.count(notification_id)) + return; + + BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, + close_closures_[notification_id]); + + close_closures_.erase(notification_id); + return; + } + + // The renderer may have been compromised if the given |notification_id| + // doesn't map to either a persistent or a non-persistent notification. + bad_message::ReceivedBadMessage(this, bad_message::NMF_INVALID_ID_CLOSE); } void NotificationMessageFilter::DidDeletePersistentNotificationData(
diff --git a/content/browser/notifications/notification_message_filter.h b/content/browser/notifications/notification_message_filter.h index 25d69c6..eaba08a 100644 --- a/content/browser/notifications/notification_message_filter.h +++ b/content/browser/notifications/notification_message_filter.h
@@ -73,12 +73,9 @@ int64_t service_worker_registration_id, const GURL& origin, const std::string& filter_tag); - void OnClosePlatformNotification(const GURL& origin, - const std::string& tag, - int non_persistent_notification_id); - void OnClosePersistentNotification(const GURL& origin, - const std::string& tag, - const std::string& notification_id); + void OnCloseNotification(const GURL& origin, + const std::string& tag, + const std::string& notification_id); // Callback to be invoked by the notification context when the notification // data for the persistent notification may have been written, as indicated by
diff --git a/content/browser/notifications/page_notification_delegate.cc b/content/browser/notifications/page_notification_delegate.cc index 4785829..6b3b695 100644 --- a/content/browser/notifications/page_notification_delegate.cc +++ b/content/browser/notifications/page_notification_delegate.cc
@@ -26,8 +26,8 @@ if (!sender) return; - sender->Send( - new PlatformNotificationMsg_DidShow(non_persistent_notification_id_)); + sender->Send(new PlatformNotificationMsg_DidShow( + non_persistent_notification_id_, notification_id_)); } void PageNotificationDelegate::NotificationClosed() { @@ -35,8 +35,8 @@ if (!sender) return; - sender->Send( - new PlatformNotificationMsg_DidClose(non_persistent_notification_id_)); + sender->Send(new PlatformNotificationMsg_DidClose( + non_persistent_notification_id_, notification_id_)); static_cast<RenderProcessHostImpl*>(sender) ->notification_message_filter()
diff --git a/content/browser/pepper_flash_settings_helper_impl.cc b/content/browser/pepper_flash_settings_helper_impl.cc index ab83fb6..70092dd0 100644 --- a/content/browser/pepper_flash_settings_helper_impl.cc +++ b/content/browser/pepper_flash_settings_helper_impl.cc
@@ -55,7 +55,7 @@ DCHECK_CURRENTLY_ON(BrowserThread::IO); DCHECK(!callback_.is_null()); - if (!channel_handle.name.empty()) + if (channel_handle.is_mojo_channel_handle()) callback_.Run(true, channel_handle); else callback_.Run(false, IPC::ChannelHandle());
diff --git a/content/browser/plugin_data_remover_impl.cc b/content/browser/plugin_data_remover_impl.cc index 6044984e..9ccec641 100644 --- a/content/browser/plugin_data_remover_impl.cc +++ b/content/browser/plugin_data_remover_impl.cc
@@ -139,7 +139,7 @@ void OnPpapiChannelOpened(const IPC::ChannelHandle& channel_handle, base::ProcessId /* peer_pid */, int /* child_id */) override { - if (!channel_handle.name.empty()) + if (channel_handle.is_mojo_channel_handle()) ConnectToChannel(channel_handle); // Balancing the AddRef call.
diff --git a/content/browser/plugin_service_impl.cc b/content/browser/plugin_service_impl.cc index 0585c241..3eca335 100644 --- a/content/browser/plugin_service_impl.cc +++ b/content/browser/plugin_service_impl.cc
@@ -68,7 +68,7 @@ !it.IsAtEnd(); it.Advance()) { RenderProcessHost* host = it.GetCurrentValue(); if (!browser_context || host->GetBrowserContext() == browser_context) - host->Send(new ViewMsg_PurgePluginListCache(reload_pages)); + host->GetRendererInterface()->PurgePluginListCache(reload_pages); } }
diff --git a/content/browser/renderer_host/compositor_impl_android.cc b/content/browser/renderer_host/compositor_impl_android.cc index a3f683f..04ffe13 100644 --- a/content/browser/renderer_host/compositor_impl_android.cc +++ b/content/browser/renderer_host/compositor_impl_android.cc
@@ -49,10 +49,8 @@ #include "cc/trees/layer_tree_settings.h" #include "components/display_compositor/compositor_overlay_candidate_validator_android.h" #include "components/display_compositor/gl_helper.h" -#include "content/browser/android/child_process_launcher_android.h" #include "content/browser/gpu/browser_gpu_memory_buffer_manager.h" #include "content/browser/gpu/compositor_util.h" -#include "content/browser/gpu/gpu_surface_tracker.h" #include "content/browser/renderer_host/context_provider_factory_impl_android.h" #include "content/browser/renderer_host/render_widget_host_impl.h" #include "content/common/gpu/client/context_provider_command_buffer.h" @@ -64,6 +62,7 @@ #include "gpu/command_buffer/client/gles2_interface.h" #include "gpu/ipc/client/command_buffer_proxy_impl.h" #include "gpu/ipc/client/gpu_channel_host.h" +#include "gpu/ipc/common/gpu_surface_tracker.h" #include "gpu/vulkan/vulkan_surface.h" #include "third_party/khronos/GLES2/gl2.h" #include "third_party/khronos/GLES2/gl2ext.h" @@ -471,7 +470,7 @@ JNIEnv* env = base::android::AttachCurrentThread(); base::android::ScopedJavaLocalRef<jobject> j_surface(env, surface); - GpuSurfaceTracker* tracker = GpuSurfaceTracker::Get(); + gpu::GpuSurfaceTracker* tracker = gpu::GpuSurfaceTracker::Get(); if (window_) { // Shut down GL context before unregistering surface. @@ -479,7 +478,8 @@ tracker->RemoveSurface(surface_handle_); ANativeWindow_release(window_); window_ = NULL; - UnregisterViewSurface(surface_handle_); + + tracker->UnregisterViewSurface(surface_handle_); surface_handle_ = gpu::kNullSurfaceHandle; } @@ -497,7 +497,7 @@ ANativeWindow_acquire(window); surface_handle_ = tracker->AddSurfaceForNativeWidget(window); // Register first, SetVisible() might create a CompositorFrameSink. - RegisterViewSurface(surface_handle_, j_surface); + tracker->RegisterViewSurface(surface_handle_, j_surface); SetVisible(true); ANativeWindow_release(window); }
diff --git a/content/browser/renderer_host/context_provider_factory_impl_android.cc b/content/browser/renderer_host/context_provider_factory_impl_android.cc index 7c91911..b59cf60 100644 --- a/content/browser/renderer_host/context_provider_factory_impl_android.cc +++ b/content/browser/renderer_host/context_provider_factory_impl_android.cc
@@ -14,7 +14,6 @@ #include "cc/surfaces/surface_manager.h" #include "content/browser/gpu/browser_gpu_memory_buffer_manager.h" #include "content/browser/gpu/compositor_util.h" -#include "content/browser/gpu/gpu_surface_tracker.h" #include "content/common/gpu/client/context_provider_command_buffer.h" #include "content/common/host_shared_bitmap_manager.h" #include "content/public/common/content_switches.h"
diff --git a/content/browser/renderer_host/input/input_router_client.h b/content/browser/renderer_host/input/input_router_client.h index fab52aed..b22290d3 100644 --- a/content/browser/renderer_host/input/input_router_client.h +++ b/content/browser/renderer_host/input/input_router_client.h
@@ -33,7 +33,7 @@ const ui::LatencyInfo& latency_info) = 0; // Called each time a WebInputEvent IPC is sent. - virtual void IncrementInFlightEventCount() = 0; + virtual void IncrementInFlightEventCount(blink::WebInputEvent::Type type) = 0; // Called each time a WebInputEvent ACK IPC is received. virtual void DecrementInFlightEventCount() = 0;
diff --git a/content/browser/renderer_host/input/input_router_impl.cc b/content/browser/renderer_host/input/input_router_impl.cc index 3e6bf114..83f66be 100644 --- a/content/browser/renderer_host/input/input_router_impl.cc +++ b/content/browser/renderer_host/input/input_router_impl.cc
@@ -433,7 +433,7 @@ // renderer. Consequently, such event types should not affect event time // or in-flight event count metrics. if (dispatch_type == InputEventDispatchType::DISPATCH_TYPE_BLOCKING) - client_->IncrementInFlightEventCount(); + client_->IncrementInFlightEventCount(input_event.type); return true; } return false;
diff --git a/content/browser/renderer_host/input/input_router_impl_perftest.cc b/content/browser/renderer_host/input/input_router_impl_perftest.cc index 01f1b4e7..da3a03b 100644 --- a/content/browser/renderer_host/input/input_router_impl_perftest.cc +++ b/content/browser/renderer_host/input/input_router_impl_perftest.cc
@@ -83,7 +83,8 @@ const ui::LatencyInfo& latency_info) override { return INPUT_EVENT_ACK_STATE_NOT_CONSUMED; } - void IncrementInFlightEventCount() override {} + void IncrementInFlightEventCount( + blink::WebInputEvent::Type event_type) override {} void DecrementInFlightEventCount() override {} void OnHasTouchEventHandlers(bool has_handlers) override {} void DidFlush() override {}
diff --git a/content/browser/renderer_host/input/mock_input_router_client.cc b/content/browser/renderer_host/input/mock_input_router_client.cc index 0adb140f..ae6026f 100644 --- a/content/browser/renderer_host/input/mock_input_router_client.cc +++ b/content/browser/renderer_host/input/mock_input_router_client.cc
@@ -37,7 +37,8 @@ return filter_state_; } -void MockInputRouterClient::IncrementInFlightEventCount() { +void MockInputRouterClient::IncrementInFlightEventCount( + blink::WebInputEvent::Type event_type) { ++in_flight_event_count_; }
diff --git a/content/browser/renderer_host/input/mock_input_router_client.h b/content/browser/renderer_host/input/mock_input_router_client.h index beeb084..f3cf552 100644 --- a/content/browser/renderer_host/input/mock_input_router_client.h +++ b/content/browser/renderer_host/input/mock_input_router_client.h
@@ -26,7 +26,8 @@ InputEventAckState FilterInputEvent( const blink::WebInputEvent& input_event, const ui::LatencyInfo& latency_info) override; - void IncrementInFlightEventCount() override; + void IncrementInFlightEventCount( + blink::WebInputEvent::Type event_type) override; void DecrementInFlightEventCount() override; void OnHasTouchEventHandlers(bool has_handlers) override; void DidFlush() override;
diff --git a/content/browser/renderer_host/render_view_host_impl.cc b/content/browser/renderer_host/render_view_host_impl.cc index b8f16e39..ee6c760 100644 --- a/content/browser/renderer_host/render_view_host_impl.cc +++ b/content/browser/renderer_host/render_view_host_impl.cc
@@ -572,7 +572,8 @@ is_waiting_for_close_ack_ = true; GetWidget()->StartHangMonitorTimeout( TimeDelta::FromMilliseconds(kUnloadTimeoutMS), - RenderWidgetHostDelegate::RENDERER_UNRESPONSIVE_CLOSE_PAGE); + blink::WebInputEvent::Undefined, + RendererUnresponsiveType::RENDERER_UNRESPONSIVE_CLOSE_PAGE); bool is_javascript_dialog_showing = delegate_->IsJavaScriptDialogShowing();
diff --git a/content/browser/renderer_host/render_widget_host_delegate.h b/content/browser/renderer_host/render_widget_host_delegate.h index b63dcbb..6948db4 100644 --- a/content/browser/renderer_host/render_widget_host_delegate.h +++ b/content/browser/renderer_host/render_widget_host_delegate.h
@@ -11,6 +11,7 @@ #include "build/build_config.h" #include "content/common/content_export.h" +#include "content/public/browser/renderer_unresponsive_type.h" #include "third_party/WebKit/public/platform/WebDisplayMode.h" #include "third_party/WebKit/public/web/WebInputEvent.h" #include "ui/gfx/native_widget_types.h" @@ -140,20 +141,6 @@ virtual RenderWidgetHostImpl* GetFocusedRenderWidgetHost( RenderWidgetHostImpl* receiving_widget); - // Used in histograms to differentiate between the different types of - // renderer hang reported by RenderWidgetHostDelegate::RendererUnresponsive. - // Only add values at the end, do not delete values. - enum RendererUnresponsiveType { - RENDERER_UNRESPONSIVE_UNKNOWN = 0, - RENDERER_UNRESPONSIVE_IN_FLIGHT_EVENTS = 1, - RENDERER_UNRESPONSIVE_DIALOG_CLOSED = 2, - RENDERER_UNRESPONSIVE_DIALOG_SUPPRESSED = 3, - RENDERER_UNRESPONSIVE_BEFORE_UNLOAD = 4, - RENDERER_UNRESPONSIVE_UNLOAD = 5, - RENDERER_UNRESPONSIVE_CLOSE_PAGE = 6, - RENDERER_UNRESPONSIVE_MAX = RENDERER_UNRESPONSIVE_CLOSE_PAGE, - }; - // Notification that the renderer has become unresponsive. The // delegate can use this notification to show a warning to the user. virtual void RendererUnresponsive(RenderWidgetHostImpl* render_widget_host,
diff --git a/content/browser/renderer_host/render_widget_host_impl.cc b/content/browser/renderer_host/render_widget_host_impl.cc index 0051c60..fde38b4 100644 --- a/content/browser/renderer_host/render_widget_host_impl.cc +++ b/content/browser/renderer_host/render_widget_host_impl.cc
@@ -218,7 +218,9 @@ hung_renderer_delay_( base::TimeDelta::FromMilliseconds(kHungRendererDelayMs)), hang_monitor_reason_( - RenderWidgetHostDelegate::RENDERER_UNRESPONSIVE_UNKNOWN), + RendererUnresponsiveType::RENDERER_UNRESPONSIVE_UNKNOWN), + hang_monitor_event_type_(blink::WebInputEvent::Undefined), + last_event_type_(blink::WebInputEvent::Undefined), new_content_rendering_delay_( base::TimeDelta::FromMilliseconds(kNewContentRenderingDelayMs)), weak_factory_(this) { @@ -485,7 +487,6 @@ IPC_MESSAGE_HANDLER(ViewHostMsg_UnlockMouse, OnUnlockMouse) IPC_MESSAGE_HANDLER(ViewHostMsg_ShowDisambiguationPopup, OnShowDisambiguationPopup) - IPC_MESSAGE_HANDLER(ViewHostMsg_SelectionChanged, OnSelectionChanged) IPC_MESSAGE_HANDLER(ViewHostMsg_SelectionBoundsChanged, OnSelectionBoundsChanged) IPC_MESSAGE_HANDLER(InputHostMsg_ImeCompositionRangeChanged, @@ -561,7 +562,7 @@ if (in_flight_event_count_) { RestartHangMonitorTimeout(); hang_monitor_reason_ = - RenderWidgetHostDelegate::RENDERER_UNRESPONSIVE_IN_FLIGHT_EVENTS; + RendererUnresponsiveType::RENDERER_UNRESPONSIVE_IN_FLIGHT_EVENTS; } // Always repaint on restore. @@ -903,9 +904,13 @@ void RenderWidgetHostImpl::StartHangMonitorTimeout( base::TimeDelta delay, - RenderWidgetHostDelegate::RendererUnresponsiveType hang_monitor_reason) { + blink::WebInputEvent::Type event_type, + RendererUnresponsiveType hang_monitor_reason) { if (!hang_monitor_timeout_) return; + if (!hang_monitor_timeout_->IsRunning()) + hang_monitor_event_type_ = event_type; + last_event_type_ = event_type; hang_monitor_timeout_->Start(delay); hang_monitor_reason_ = hang_monitor_reason; } @@ -924,7 +929,7 @@ if (hang_monitor_timeout_) { hang_monitor_timeout_->Stop(); hang_monitor_reason_ = - RenderWidgetHostDelegate::RENDERER_UNRESPONSIVE_UNKNOWN; + RendererUnresponsiveType::RENDERER_UNRESPONSIVE_UNKNOWN; } RendererIsResponsive(); } @@ -1314,9 +1319,9 @@ return input_router_->GetLastKeyboardEvent(); } -void RenderWidgetHostImpl::OnSelectionChanged(const base::string16& text, - uint32_t offset, - const gfx::Range& range) { +void RenderWidgetHostImpl::SelectionChanged(const base::string16& text, + uint32_t offset, + const gfx::Range& range) { if (view_) view_->SelectionChanged(text, static_cast<size_t>(offset), range); } @@ -1498,10 +1503,9 @@ Source<RenderWidgetHost>(this), NotificationService::NoDetails()); is_unresponsive_ = true; - RenderWidgetHostDelegate::RendererUnresponsiveType reason = - hang_monitor_reason_; + RendererUnresponsiveType reason = hang_monitor_reason_; hang_monitor_reason_ = - RenderWidgetHostDelegate::RENDERER_UNRESPONSIVE_UNKNOWN; + RendererUnresponsiveType::RENDERER_UNRESPONSIVE_UNKNOWN; if (delegate_) delegate_->RendererUnresponsive(this, reason); @@ -1893,12 +1897,13 @@ : INPUT_EVENT_ACK_STATE_NOT_CONSUMED; } -void RenderWidgetHostImpl::IncrementInFlightEventCount() { +void RenderWidgetHostImpl::IncrementInFlightEventCount( + blink::WebInputEvent::Type event_type) { increment_in_flight_event_count(); if (!is_hidden_) { StartHangMonitorTimeout( - hung_renderer_delay_, - RenderWidgetHostDelegate::RENDERER_UNRESPONSIVE_IN_FLIGHT_EVENTS); + hung_renderer_delay_, event_type, + RendererUnresponsiveType::RENDERER_UNRESPONSIVE_IN_FLIGHT_EVENTS); } } @@ -1910,8 +1915,9 @@ // The renderer is responsive, but there are in-flight events to wait for. if (!is_hidden_) { RestartHangMonitorTimeout(); + hang_monitor_event_type_ = blink::WebInputEvent::Undefined; hang_monitor_reason_ = - RenderWidgetHostDelegate::RENDERER_UNRESPONSIVE_IN_FLIGHT_EVENTS; + RendererUnresponsiveType::RENDERER_UNRESPONSIVE_IN_FLIGHT_EVENTS; } } }
diff --git a/content/browser/renderer_host/render_widget_host_impl.h b/content/browser/renderer_host/render_widget_host_impl.h index f663df5..eb69fce 100644 --- a/content/browser/renderer_host/render_widget_host_impl.h +++ b/content/browser/renderer_host/render_widget_host_impl.h
@@ -292,9 +292,9 @@ // Starts a hang monitor timeout. If there's already a hang monitor timeout // the new one will only fire if it has a shorter delay than the time // left on the existing timeouts. - void StartHangMonitorTimeout( - base::TimeDelta delay, - RenderWidgetHostDelegate::RendererUnresponsiveType hang_monitor_reason); + void StartHangMonitorTimeout(base::TimeDelta delay, + blink::WebInputEvent::Type event_type, + RendererUnresponsiveType hang_monitor_reason); // Stops all existing hang monitor timeouts and assumes the renderer is // responsive. @@ -323,7 +323,7 @@ const ui::LatencyInfo& ui_latency); virtual void ForwardWheelEventWithLatencyInfo( const blink::WebMouseWheelEvent& wheel_event, - const ui::LatencyInfo& ui_latency); // Virtual for testing. + const ui::LatencyInfo& ui_latency); // Virtual for testing. // Enables/disables touch emulation using mouse event. See TouchEmulator. void SetTouchEventEmulationEnabled( @@ -518,6 +518,11 @@ // a new renderer is created. void RendererExited(base::TerminationStatus status, int exit_code); + // Called from a RenderFrameHost when the text selection has changed. + void SelectionChanged(const base::string16& text, + uint32_t offset, + const gfx::Range& range); + // Expose increment/decrement of the in-flight event count, so // RenderViewHostImpl can account for in-flight beforeunload/unload events. int increment_in_flight_event_count() { return ++in_flight_event_count_; } @@ -526,6 +531,14 @@ return --in_flight_event_count_; } + size_t in_flight_event_count() const { return in_flight_event_count_; } + blink::WebInputEvent::Type hang_monitor_event_type() const { + return hang_monitor_event_type_; + } + blink::WebInputEvent::Type last_event_type() const { + return last_event_type_; + } + bool renderer_initialized() const { return renderer_initialized_; } bool needs_begin_frames() const { return needs_begin_frames_; } @@ -593,9 +606,6 @@ void OnShowDisambiguationPopup(const gfx::Rect& rect_pixels, const gfx::Size& size, const cc::SharedBitmapId& id); - void OnSelectionChanged(const base::string16& text, - uint32_t offset, - const gfx::Range& range); void OnSelectionBoundsChanged( const ViewHostMsg_SelectionBounds_Params& params); void OnForwardCompositorProto(const std::vector<uint8_t>& proto); @@ -616,7 +626,8 @@ InputEventAckState FilterInputEvent( const blink::WebInputEvent& event, const ui::LatencyInfo& latency_info) override; - void IncrementInFlightEventCount() override; + void IncrementInFlightEventCount( + blink::WebInputEvent::Type event_type) override; void DecrementInFlightEventCount() override; void OnHasTouchEventHandlers(bool has_handlers) override; void DidFlush() override; @@ -834,7 +845,13 @@ // Stores the reason the hang_monitor_timeout_ has been started. Used to // report histograms if the renderer is hung. - RenderWidgetHostDelegate::RendererUnresponsiveType hang_monitor_reason_; + RendererUnresponsiveType hang_monitor_reason_; + + // Type of the last blocking event that started the hang monitor. + blink::WebInputEvent::Type hang_monitor_event_type_; + + // Type of the last blocking event sent to the renderer. + blink::WebInputEvent::Type last_event_type_; // This value indicates how long to wait for a new compositor frame from a // renderer process before clearing any previously displayed content.
diff --git a/content/browser/renderer_host/render_widget_host_unittest.cc b/content/browser/renderer_host/render_widget_host_unittest.cc index a04ce10..75185179 100644 --- a/content/browser/renderer_host/render_widget_host_unittest.cc +++ b/content/browser/renderer_host/render_widget_host_unittest.cc
@@ -1092,14 +1092,14 @@ TEST_F(RenderWidgetHostTest, DontPostponeHangMonitorTimeout) { // Start with a short timeout. host_->StartHangMonitorTimeout( - TimeDelta::FromMilliseconds(10), - RenderWidgetHostDelegate::RENDERER_UNRESPONSIVE_UNKNOWN); + TimeDelta::FromMilliseconds(10), WebInputEvent::Undefined, + RendererUnresponsiveType::RENDERER_UNRESPONSIVE_UNKNOWN); // Immediately try to add a long 30 second timeout. EXPECT_FALSE(delegate_->unresponsive_timer_fired()); host_->StartHangMonitorTimeout( - TimeDelta::FromSeconds(30), - RenderWidgetHostDelegate::RENDERER_UNRESPONSIVE_UNKNOWN); + TimeDelta::FromSeconds(30), WebInputEvent::Undefined, + RendererUnresponsiveType::RENDERER_UNRESPONSIVE_UNKNOWN); // Wait long enough for first timeout and see if it fired. base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( @@ -1114,15 +1114,15 @@ TEST_F(RenderWidgetHostTest, StopAndStartHangMonitorTimeout) { // Start with a short timeout, then stop it. host_->StartHangMonitorTimeout( - TimeDelta::FromMilliseconds(10), - RenderWidgetHostDelegate::RENDERER_UNRESPONSIVE_UNKNOWN); + TimeDelta::FromMilliseconds(10), WebInputEvent::Undefined, + RendererUnresponsiveType::RENDERER_UNRESPONSIVE_UNKNOWN); host_->StopHangMonitorTimeout(); // Start it again to ensure it still works. EXPECT_FALSE(delegate_->unresponsive_timer_fired()); host_->StartHangMonitorTimeout( - TimeDelta::FromMilliseconds(10), - RenderWidgetHostDelegate::RENDERER_UNRESPONSIVE_UNKNOWN); + TimeDelta::FromMilliseconds(10), WebInputEvent::Undefined, + RendererUnresponsiveType::RENDERER_UNRESPONSIVE_UNKNOWN); // Wait long enough for first timeout and see if it fired. base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( @@ -1137,14 +1137,14 @@ TEST_F(RenderWidgetHostTest, ShorterDelayHangMonitorTimeout) { // Start with a timeout. host_->StartHangMonitorTimeout( - TimeDelta::FromMilliseconds(100), - RenderWidgetHostDelegate::RENDERER_UNRESPONSIVE_UNKNOWN); + TimeDelta::FromMilliseconds(100), WebInputEvent::Undefined, + RendererUnresponsiveType::RENDERER_UNRESPONSIVE_UNKNOWN); // Start it again with shorter delay. EXPECT_FALSE(delegate_->unresponsive_timer_fired()); host_->StartHangMonitorTimeout( - TimeDelta::FromMilliseconds(20), - RenderWidgetHostDelegate::RENDERER_UNRESPONSIVE_UNKNOWN); + TimeDelta::FromMilliseconds(20), WebInputEvent::Undefined, + RendererUnresponsiveType::RENDERER_UNRESPONSIVE_UNKNOWN); // Wait long enough for the second timeout and see if it fired. base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
diff --git a/content/browser/service_worker/embedded_worker_instance.cc b/content/browser/service_worker/embedded_worker_instance.cc index 338d490..eabb07ab 100644 --- a/content/browser/service_worker/embedded_worker_instance.cc +++ b/content/browser/service_worker/embedded_worker_instance.cc
@@ -603,7 +603,14 @@ void EmbeddedWorkerInstance::SendMojoStartWorker( std::unique_ptr<EmbeddedWorkerStartParams> params) { - client_->StartWorker(*params); + service_manager::mojom::InterfaceProviderPtr remote_interfaces; + service_manager::mojom::InterfaceProviderRequest request = + mojo::GetProxy(&remote_interfaces); + remote_interfaces_->Bind(std::move(remote_interfaces)); + service_manager::mojom::InterfaceProviderPtr exposed_interfaces; + interface_registry_->Bind(mojo::GetProxy(&exposed_interfaces)); + client_->StartWorker(*params, std::move(exposed_interfaces), + std::move(request)); registry_->BindWorkerToProcess(process_id(), embedded_worker_id()); TRACE_EVENT_ASYNC_STEP_PAST1("ServiceWorker", "EmbeddedWorkerInstance::Start", this, "SendStartWorker", "Status", "mojo"); @@ -706,17 +713,22 @@ for (auto& observer : listener_list_) observer.OnThreadStarted(); - service_manager::mojom::InterfaceProviderPtr exposed_interfaces; - interface_registry_->Bind(mojo::GetProxy(&exposed_interfaces)); - service_manager::mojom::InterfaceProviderPtr remote_interfaces; - service_manager::mojom::InterfaceProviderRequest request = - mojo::GetProxy(&remote_interfaces); - remote_interfaces_->Bind(std::move(remote_interfaces)); - BrowserThread::PostTask( - BrowserThread::UI, FROM_HERE, - base::Bind(SetupMojoOnUIThread, process_id(), thread_id_, - base::Passed(&request), - base::Passed(exposed_interfaces.PassInterface()))); + // This code is for BackgroundSync and FetchEvent, which have been already + // mojofied. Interfaces are exchanged at StartWorker when mojo for the service + // worker is enabled, so this code isn't necessary when the flag is enabled. + if (!ServiceWorkerUtils::IsMojoForServiceWorkerEnabled()) { + service_manager::mojom::InterfaceProviderPtr exposed_interfaces; + interface_registry_->Bind(mojo::GetProxy(&exposed_interfaces)); + service_manager::mojom::InterfaceProviderPtr remote_interfaces; + service_manager::mojom::InterfaceProviderRequest request = + mojo::GetProxy(&remote_interfaces); + remote_interfaces_->Bind(std::move(remote_interfaces)); + BrowserThread::PostTask( + BrowserThread::UI, FROM_HERE, + base::Bind(SetupMojoOnUIThread, process_id(), thread_id_, + base::Passed(&request), + base::Passed(exposed_interfaces.PassInterface()))); + } } void EmbeddedWorkerInstance::OnScriptLoadFailed() {
diff --git a/content/browser/service_worker/embedded_worker_instance_unittest.cc b/content/browser/service_worker/embedded_worker_instance_unittest.cc index ed332f66..08fa4dd 100644 --- a/content/browser/service_worker/embedded_worker_instance_unittest.cc +++ b/content/browser/service_worker/embedded_worker_instance_unittest.cc
@@ -726,7 +726,10 @@ : EmbeddedWorkerTestHelper::MockEmbeddedWorkerInstanceClient(helper) {} private: - void StartWorker(const EmbeddedWorkerStartParams& /* unused */) override { + void StartWorker( + const EmbeddedWorkerStartParams& /* unused */, + service_manager::mojom::InterfaceProviderPtr /* unused */, + service_manager::mojom::InterfaceProviderRequest /* unused */) override { helper_->mock_instance_clients()->clear(); } };
diff --git a/content/browser/service_worker/embedded_worker_registry.cc b/content/browser/service_worker/embedded_worker_registry.cc index 15b7ddd..fff48b95c 100644 --- a/content/browser/service_worker/embedded_worker_registry.cc +++ b/content/browser/service_worker/embedded_worker_registry.cc
@@ -229,10 +229,6 @@ MessagePortMessageFilter* EmbeddedWorkerRegistry::MessagePortMessageFilterForProcess(int process_id) { - // TODO(nhiroki): Change this to DCHECK after https://crbug.com/648477 is - // fixed. - CHECK( - base::ContainsKey(process_message_port_message_filter_map_, process_id)); return process_message_port_message_filter_map_[process_id]; }
diff --git a/content/browser/service_worker/embedded_worker_test_helper.cc b/content/browser/service_worker/embedded_worker_test_helper.cc index f7620af..d3ae532 100644 --- a/content/browser/service_worker/embedded_worker_test_helper.cc +++ b/content/browser/service_worker/embedded_worker_test_helper.cc
@@ -93,11 +93,15 @@ ~MockEmbeddedWorkerInstanceClient() {} void EmbeddedWorkerTestHelper::MockEmbeddedWorkerInstanceClient::StartWorker( - const EmbeddedWorkerStartParams& params) { + const EmbeddedWorkerStartParams& params, + service_manager::mojom::InterfaceProviderPtr browser_interfaces, + service_manager::mojom::InterfaceProviderRequest renderer_request) { if (!helper_) return; embedded_worker_id_ = params.embedded_worker_id; + local_interfaces_.Bind(std::move(renderer_request)); + remote_interfaces_.Bind(std::move(browser_interfaces)); EmbeddedWorkerInstance* worker = helper_->registry()->GetWorker(params.embedded_worker_id); @@ -166,10 +170,12 @@ void DispatchFetchEvent(int fetch_event_id, const ServiceWorkerFetchRequest& request, + mojom::FetchEventPreloadHandlePtr preload_handle, const DispatchFetchEventCallback& callback) override { if (!helper_) return; - helper_->OnFetchEventStub(thread_id_, fetch_event_id, request, callback); + helper_->OnFetchEventStub(thread_id_, fetch_event_id, request, + std::move(preload_handle), callback); } private: @@ -337,6 +343,7 @@ int embedded_worker_id, int fetch_event_id, const ServiceWorkerFetchRequest& request, + mojom::FetchEventPreloadHandlePtr preload_handle, const FetchCallback& callback) { SimulateSend(new ServiceWorkerHostMsg_FetchEventResponse( embedded_worker_id, fetch_event_id, @@ -498,12 +505,13 @@ int thread_id, int fetch_event_id, const ServiceWorkerFetchRequest& request, + mojom::FetchEventPreloadHandlePtr preload_handle, const FetchCallback& callback) { base::ThreadTaskRunnerHandle::Get()->PostTask( FROM_HERE, base::Bind(&EmbeddedWorkerTestHelper::OnFetchEvent, AsWeakPtr(), thread_id_embedded_worker_id_map_[thread_id], fetch_event_id, - request, callback)); + request, base::Passed(&preload_handle), callback)); } void EmbeddedWorkerTestHelper::OnPushEventStub(
diff --git a/content/browser/service_worker/embedded_worker_test_helper.h b/content/browser/service_worker/embedded_worker_test_helper.h index 8317f92..136b089e 100644 --- a/content/browser/service_worker/embedded_worker_test_helper.h +++ b/content/browser/service_worker/embedded_worker_test_helper.h
@@ -18,10 +18,13 @@ #include "base/optional.h" #include "base/time/time.h" #include "content/common/service_worker/embedded_worker.mojom.h" +#include "content/common/service_worker/fetch_event_dispatcher.mojom.h" #include "content/common/service_worker/service_worker_status_code.h" #include "ipc/ipc_listener.h" #include "ipc/ipc_test_sink.h" #include "mojo/public/cpp/bindings/binding.h" +#include "services/service_manager/public/cpp/interface_provider.h" +#include "services/service_manager/public/cpp/interface_registry.h" #include "services/service_manager/public/interfaces/interface_provider.mojom.h" #include "testing/gtest/include/gtest/gtest.h" #include "url/gurl.h" @@ -81,12 +84,19 @@ protected: // Implementation of mojo interfaces. - void StartWorker(const EmbeddedWorkerStartParams& params) override; + void StartWorker( + const EmbeddedWorkerStartParams& params, + service_manager::mojom::InterfaceProviderPtr browser_interfaces, + service_manager::mojom::InterfaceProviderRequest renderer_request) + override; void StopWorker(const StopWorkerCallback& callback) override; base::WeakPtr<EmbeddedWorkerTestHelper> helper_; mojo::Binding<mojom::EmbeddedWorkerInstanceClient> binding_; + service_manager::InterfaceRegistry local_interfaces_; + service_manager::InterfaceProvider remote_interfaces_; + base::Optional<int> embedded_worker_id_; private: @@ -181,6 +191,7 @@ virtual void OnFetchEvent(int embedded_worker_id, int fetch_event_id, const ServiceWorkerFetchRequest& request, + mojom::FetchEventPreloadHandlePtr preload_handle, const FetchCallback& callback); virtual void OnPushEvent(int embedded_worker_id, int request_id, @@ -221,6 +232,7 @@ void OnFetchEventStub(int thread_id, int fetch_event_id, const ServiceWorkerFetchRequest& request, + mojom::FetchEventPreloadHandlePtr preload_handle, const FetchCallback& callback); void OnPushEventStub(int request_id, const PushEventPayload& payload); void OnSetupMojoStub(
diff --git a/content/browser/service_worker/link_header_support.cc b/content/browser/service_worker/link_header_support.cc index cc0b18c..0cb2f29d 100644 --- a/content/browser/service_worker/link_header_support.cc +++ b/content/browser/service_worker/link_header_support.cc
@@ -95,9 +95,10 @@ if (!context_url.is_valid() || !script_url.is_valid() || !scope_url.is_valid()) return; - if (!ServiceWorkerUtils::CanRegisterServiceWorker(context_url, scope_url, - script_url)) + if (!ServiceWorkerUtils::AllOriginsMatchAndCanAccessServiceWorkers( + {context_url, scope_url, script_url})) { return; + } std::string error; if (ServiceWorkerUtils::ContainsDisallowedCharacter(scope_url, script_url, &error))
diff --git a/content/browser/service_worker/service_worker_context_wrapper.cc b/content/browser/service_worker/service_worker_context_wrapper.cc index eeac4d3..686e5ea5 100644 --- a/content/browser/service_worker/service_worker_context_wrapper.cc +++ b/content/browser/service_worker/service_worker_context_wrapper.cc
@@ -22,6 +22,7 @@ #include "base/threading/sequenced_worker_pool.h" #include "base/threading/thread_task_runner_handle.h" #include "content/browser/renderer_host/render_process_host_impl.h" +#include "content/browser/service_worker/embedded_worker_status.h" #include "content/browser/service_worker/service_worker_context_core.h" #include "content/browser/service_worker/service_worker_context_observer.h" #include "content/browser/service_worker/service_worker_process_manager.h" @@ -579,6 +580,32 @@ callback)); } +void ServiceWorkerContextWrapper::CountExternalRequestsForTest( + const GURL& origin, + const CountExternalRequestsCallback& callback) { + if (!BrowserThread::CurrentlyOn(BrowserThread::IO)) { + BrowserThread::PostTask( + BrowserThread::IO, FROM_HERE, + base::Bind(&ServiceWorkerContextWrapper::CountExternalRequestsForTest, + this, origin, callback)); + return; + } + + std::vector<ServiceWorkerVersionInfo> live_version_info = + GetAllLiveVersionInfo(); + size_t pending_external_request_count = 0; + for (const ServiceWorkerVersionInfo& info : live_version_info) { + ServiceWorkerVersion* version = GetLiveVersion(info.version_id); + if (version && version->scope().GetOrigin() == origin) { + pending_external_request_count = + version->GetExternalRequestCountForTest(); + break; + } + } + BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, + base::Bind(callback, pending_external_request_count)); +} + void ServiceWorkerContextWrapper::ClearAllServiceWorkersForTest( const base::Closure& callback) { if (!BrowserThread::CurrentlyOn(BrowserThread::IO)) { @@ -832,6 +859,28 @@ context_core_.reset(); } +bool ServiceWorkerContextWrapper::StartingExternalRequest( + int64_t service_worker_version_id, + const std::string& request_uuid) { + DCHECK_CURRENTLY_ON(BrowserThread::IO); + ServiceWorkerVersion* version = + context()->GetLiveVersion(service_worker_version_id); + if (!version) + return false; + return version->StartExternalRequest(request_uuid); +} + +bool ServiceWorkerContextWrapper::FinishedExternalRequest( + int64_t service_worker_version_id, + const std::string& request_uuid) { + DCHECK_CURRENTLY_ON(BrowserThread::IO); + ServiceWorkerVersion* version = + context()->GetLiveVersion(service_worker_version_id); + if (!version) + return false; + return version->FinishExternalRequest(request_uuid); +} + void ServiceWorkerContextWrapper::DidDeleteAndStartOver( ServiceWorkerStatusCode status) { DCHECK_CURRENTLY_ON(BrowserThread::IO);
diff --git a/content/browser/service_worker/service_worker_context_wrapper.h b/content/browser/service_worker/service_worker_context_wrapper.h index 12c8b72..905e725 100644 --- a/content/browser/service_worker/service_worker_context_wrapper.h +++ b/content/browser/service_worker/service_worker_context_wrapper.h
@@ -105,6 +105,9 @@ const GURL& url, const GURL& other_url, const CheckHasServiceWorkerCallback& callback) override; + void CountExternalRequestsForTest( + const GURL& url, + const CountExternalRequestsCallback& callback) override; void StopAllServiceWorkersForOrigin(const GURL& origin) override; void ClearAllServiceWorkersForTest(const base::Closure& callback) override; void StartServiceWorkerForNavigationHint( @@ -112,6 +115,10 @@ blink::WebNavigationHintType type, int render_process_id, const ResultCallback& callback) override; + bool StartingExternalRequest(int64_t service_worker_version_id, + const std::string& request_uuid) override; + bool FinishedExternalRequest(int64_t service_worker_version_id, + const std::string& request_uuid) override; // These methods must only be called from the IO thread. ServiceWorkerRegistration* GetLiveRegistration(int64_t registration_id);
diff --git a/content/browser/service_worker/service_worker_dispatcher_host.cc b/content/browser/service_worker/service_worker_dispatcher_host.cc index edff696..c04fe0a 100644 --- a/content/browser/service_worker/service_worker_dispatcher_host.cc +++ b/content/browser/service_worker/service_worker_dispatcher_host.cc
@@ -61,35 +61,6 @@ base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, callback); } -bool CanUnregisterServiceWorker(const GURL& document_url, - const GURL& pattern) { - DCHECK(document_url.is_valid()); - DCHECK(pattern.is_valid()); - return ServiceWorkerUtils::PassOriginEqualitySecurityCheck<GURL>(document_url, - pattern) && - OriginCanAccessServiceWorkers(document_url) && - OriginCanAccessServiceWorkers(pattern); -} - -bool CanUpdateServiceWorker(const GURL& document_url, const GURL& pattern) { - DCHECK(document_url.is_valid()); - DCHECK(pattern.is_valid()); - DCHECK(OriginCanAccessServiceWorkers(document_url)); - DCHECK(OriginCanAccessServiceWorkers(pattern)); - return ServiceWorkerUtils::PassOriginEqualitySecurityCheck<GURL>(document_url, - pattern); -} - -bool CanGetRegistration(const GURL& document_url, - const GURL& given_document_url) { - DCHECK(document_url.is_valid()); - DCHECK(given_document_url.is_valid()); - return ServiceWorkerUtils::PassOriginEqualitySecurityCheck<GURL>( - document_url, given_document_url) && - OriginCanAccessServiceWorkers(document_url) && - OriginCanAccessServiceWorkers(given_document_url); -} - } // namespace ServiceWorkerDispatcherHost::ServiceWorkerDispatcherHost( @@ -335,8 +306,8 @@ return; } - if (!ServiceWorkerUtils::CanRegisterServiceWorker( - provider_host->document_url(), pattern, script_url)) { + std::vector<GURL> urls = {provider_host->document_url(), pattern, script_url}; + if (!ServiceWorkerUtils::AllOriginsMatchAndCanAccessServiceWorkers(urls)) { // Temporary debugging for https://crbug.com/630495 base::debug::ScopedCrashKey host_url_key( "swdh_register_cannot_host_url", provider_host->document_url().spec()); @@ -427,8 +398,9 @@ return; } - if (!CanUpdateServiceWorker(provider_host->document_url(), - registration->pattern())) { + std::vector<GURL> urls = {provider_host->document_url(), + registration->pattern()}; + if (!ServiceWorkerUtils::AllOriginsMatchAndCanAccessServiceWorkers(urls)) { bad_message::ReceivedBadMessage(this, bad_message::SWDH_UPDATE_CANNOT); return; } @@ -508,8 +480,9 @@ return; } - if (!CanUnregisterServiceWorker(provider_host->document_url(), - registration->pattern())) { + std::vector<GURL> urls = {provider_host->document_url(), + registration->pattern()}; + if (!ServiceWorkerUtils::AllOriginsMatchAndCanAccessServiceWorkers(urls)) { // Temporary debugging for https://crbug.com/619294 base::debug::ScopedCrashKey host_url_key( "swdh_unregister_cannot_host_url", @@ -584,7 +557,8 @@ return; } - if (!CanGetRegistration(provider_host->document_url(), document_url)) { + std::vector<GURL> urls = {provider_host->document_url(), document_url}; + if (!ServiceWorkerUtils::AllOriginsMatchAndCanAccessServiceWorkers(urls)) { // Temporary debugging for https://crbug.com/630496 base::debug::ScopedCrashKey host_url_key( "swdh_get_registration_cannot_host_url",
diff --git a/content/browser/service_worker/service_worker_fetch_dispatcher.cc b/content/browser/service_worker/service_worker_fetch_dispatcher.cc index f3faf3e..fefc713 100644 --- a/content/browser/service_worker/service_worker_fetch_dispatcher.cc +++ b/content/browser/service_worker/service_worker_fetch_dispatcher.cc
@@ -8,6 +8,7 @@ #include <utility> #include "base/bind.h" +#include "base/command_line.h" #include "base/time/time.h" #include "base/trace_event/trace_event.h" #include "content/browser/service_worker/embedded_worker_status.h" @@ -228,7 +229,7 @@ // |dispatcher| is owned by |version_|. So it is safe to pass the unretained // raw pointer of |version_| to OnFetchEventFinished callback. dispatcher->DispatchFetchEvent( - fetch_event_id, *request_, + fetch_event_id, *request_, std::move(preload_handle_), base::Bind(&OnFetchEventFinished, base::Unretained(version_.get()), event_finish_id)); } @@ -270,6 +271,19 @@ fetch_callback.Run(status, fetch_result, response, version); } +void ServiceWorkerFetchDispatcher::MaybeStartNavigationPreload( + net::URLRequest* original_request) { + if (resource_type_ != RESOURCE_TYPE_MAIN_FRAME && + resource_type_ != RESOURCE_TYPE_SUB_FRAME) { + return; + } + if (!version_->navigation_preload_enabled()) + return; + // TODO(horo): Implement this to start the preload request for the navigation + // request and set |preload_handle_|. + NOTIMPLEMENTED(); +} + ServiceWorkerMetrics::EventType ServiceWorkerFetchDispatcher::GetEventType() const { if (request_->fetch_type == ServiceWorkerFetchType::FOREIGN_FETCH)
diff --git a/content/browser/service_worker/service_worker_fetch_dispatcher.h b/content/browser/service_worker/service_worker_fetch_dispatcher.h index 0011f47..3d32ce39 100644 --- a/content/browser/service_worker/service_worker_fetch_dispatcher.h +++ b/content/browser/service_worker/service_worker_fetch_dispatcher.h
@@ -10,11 +10,16 @@ #include "base/memory/weak_ptr.h" #include "content/browser/service_worker/service_worker_metrics.h" #include "content/common/content_export.h" +#include "content/common/service_worker/fetch_event_dispatcher.mojom.h" #include "content/common/service_worker/service_worker_status_code.h" #include "content/common/service_worker/service_worker_types.h" #include "content/public/common/resource_type.h" #include "net/log/net_log_with_source.h" +namespace net { +class URLRequest; +} // namespace net + namespace content { class ServiceWorkerVersion; @@ -37,6 +42,10 @@ const FetchCallback& fetch_callback); ~ServiceWorkerFetchDispatcher(); + // If appropriate, starts the navigation preload request and creates + // |preload_handle_|. + void MaybeStartNavigationPreload(net::URLRequest* original_request); + // Dispatches a fetch event to the |version| given in ctor, and fires // |fetch_callback| (also given in ctor) when finishes. It runs // |prepare_callback| as an intermediate step once the version is activated @@ -69,6 +78,8 @@ std::unique_ptr<ServiceWorkerFetchRequest> request_; ResourceType resource_type_; bool did_complete_; + mojom::FetchEventPreloadHandlePtr preload_handle_; + base::WeakPtrFactory<ServiceWorkerFetchDispatcher> weak_factory_; DISALLOW_COPY_AND_ASSIGN(ServiceWorkerFetchDispatcher);
diff --git a/content/browser/service_worker/service_worker_metrics.cc b/content/browser/service_worker/service_worker_metrics.cc index e2459fd..310e76e 100644 --- a/content/browser/service_worker/service_worker_metrics.cc +++ b/content/browser/service_worker/service_worker_metrics.cc
@@ -78,6 +78,8 @@ return "_NAVIGATION_HINT_LINK_TAP_UNCONFIRMED"; case ServiceWorkerMetrics::EventType::NAVIGATION_HINT_LINK_TAP_DOWN: return "_NAVIGATION_HINT_LINK_TAP_DOWN"; + case ServiceWorkerMetrics::EventType::EXTERNAL_REQUEST: + return "_EXTERNAL_REQUEST"; case ServiceWorkerMetrics::EventType::NUM_TYPES: NOTREACHED() << static_cast<int>(event_type); } @@ -227,6 +229,8 @@ return "Navigation Hint Link Tap Unconfirmed"; case EventType::NAVIGATION_HINT_LINK_TAP_DOWN: return "Navigation Hint Link Tap Down"; + case EventType::EXTERNAL_REQUEST: + return "External Request"; case EventType::NUM_TYPES: break; } @@ -565,6 +569,9 @@ UMA_HISTOGRAM_MEDIUM_TIMES("ServiceWorker.ExtendableMessageEvent.Time", time); break; + case EventType::EXTERNAL_REQUEST: + UMA_HISTOGRAM_MEDIUM_TIMES("ServiceWorker.ExternalRequest.Time", time); + break; // Those navigation hints should not be sent as request events. case EventType::NAVIGATION_HINT_LINK_MOUSE_DOWN: case EventType::NAVIGATION_HINT_LINK_TAP_UNCONFIRMED:
diff --git a/content/browser/service_worker/service_worker_metrics.h b/content/browser/service_worker/service_worker_metrics.h index c57ae0f..9f94599399 100644 --- a/content/browser/service_worker/service_worker_metrics.h +++ b/content/browser/service_worker/service_worker_metrics.h
@@ -110,6 +110,9 @@ NAVIGATION_HINT_LINK_MOUSE_DOWN = 18, NAVIGATION_HINT_LINK_TAP_UNCONFIRMED = 19, NAVIGATION_HINT_LINK_TAP_DOWN = 20, + // Used when external consumers want to add a request to + // ServiceWorkerVersion to keep it alive. + EXTERNAL_REQUEST = 21, // Add new events to record here. NUM_TYPES };
diff --git a/content/browser/service_worker/service_worker_read_from_cache_job.cc b/content/browser/service_worker/service_worker_read_from_cache_job.cc index 24f84342..a93bf740 100644 --- a/content/browser/service_worker/service_worker_read_from_cache_job.cc +++ b/content/browser/service_worker/service_worker_read_from_cache_job.cc
@@ -164,8 +164,11 @@ if (is_range_request()) SetupRangeResponse(http_info_io_buffer_->response_data_size); http_info_io_buffer_ = nullptr; - if (request_->url() == version_->script_url()) + if (is_main_script()) { + // TODO(nhiroki): Temporary check for debugging (https://crbug.com/485900). + CHECK_EQ(request_->url(), version_->script_url()); version_->SetMainScriptHttpResponseInfo(*http_info_); + } TRACE_EVENT_ASYNC_END1("ServiceWorker", "ServiceWorkerReadFromCacheJob::ReadInfo", this,
diff --git a/content/browser/service_worker/service_worker_url_request_job.cc b/content/browser/service_worker/service_worker_url_request_job.cc index e979fdd1..2f85293 100644 --- a/content/browser/service_worker/service_worker_url_request_job.cc +++ b/content/browser/service_worker/service_worker_url_request_job.cc
@@ -893,6 +893,7 @@ base::Bind(&ServiceWorkerURLRequestJob::DidDispatchFetchEvent, weak_factory_.GetWeakPtr()))); worker_start_time_ = base::TimeTicks::Now(); + fetch_dispatcher_->MaybeStartNavigationPreload(request()); fetch_dispatcher_->Run(); }
diff --git a/content/browser/service_worker/service_worker_url_request_job_unittest.cc b/content/browser/service_worker/service_worker_url_request_job_unittest.cc index 639b3cb..1bbbe28 100644 --- a/content/browser/service_worker/service_worker_url_request_job_unittest.cc +++ b/content/browser/service_worker/service_worker_url_request_job_unittest.cc
@@ -366,6 +366,7 @@ void OnFetchEvent(int embedded_worker_id, int fetch_event_id, const ServiceWorkerFetchRequest& request, + mojom::FetchEventPreloadHandlePtr preload_handle, const FetchCallback& callback) override { context()->RemoveProviderHost(mock_render_process_id(), kProviderID); SimulateSend(new ServiceWorkerHostMsg_FetchEventResponse( @@ -449,6 +450,7 @@ void OnFetchEvent(int embedded_worker_id, int fetch_event_id, const ServiceWorkerFetchRequest& request, + mojom::FetchEventPreloadHandlePtr preload_handle, const FetchCallback& callback) override { SimulateSend(new ServiceWorkerHostMsg_FetchEventResponse( embedded_worker_id, fetch_event_id, @@ -531,6 +533,7 @@ void OnFetchEvent(int embedded_worker_id, int fetch_event_id, const ServiceWorkerFetchRequest& request, + mojom::FetchEventPreloadHandlePtr preload_handle, const FetchCallback& callback) override { SimulateSend(new ServiceWorkerHostMsg_FetchEventResponse( embedded_worker_id, fetch_event_id, @@ -844,6 +847,7 @@ void OnFetchEvent(int embedded_worker_id, int fetch_event_id, const ServiceWorkerFetchRequest& request, + mojom::FetchEventPreloadHandlePtr preload_handle, const FetchCallback& callback) override { SimulateWorkerStopped(embedded_worker_id); callback.Run(SERVICE_WORKER_ERROR_ABORT, base::Time::Now()); @@ -956,6 +960,7 @@ void OnFetchEvent(int embedded_worker_id, int fetch_event_id, const ServiceWorkerFetchRequest& request, + mojom::FetchEventPreloadHandlePtr preload_handle, const FetchCallback& callback) override { callback_ = callback; SimulateSend(new ServiceWorkerHostMsg_FetchEventResponse( @@ -1030,6 +1035,7 @@ void OnFetchEvent(int embedded_worker_id, int fetch_event_id, const ServiceWorkerFetchRequest& request, + mojom::FetchEventPreloadHandlePtr preload_handle, const FetchCallback& callback) override { embedded_worker_id_ = embedded_worker_id; fetch_event_id_ = fetch_event_id;
diff --git a/content/browser/service_worker/service_worker_version.cc b/content/browser/service_worker/service_worker_version.cc index ee8408d..5bdeb7b 100644 --- a/content/browser/service_worker/service_worker_version.cc +++ b/content/browser/service_worker/service_worker_version.cc
@@ -566,6 +566,24 @@ return request_id; } +bool ServiceWorkerVersion::StartExternalRequest( + const std::string& request_uuid) { + // It's possible that the renderer is lying or the version started stopping + // right around the time of the IPC. + if (running_status() != EmbeddedWorkerStatus::RUNNING) + return false; + + if (external_request_uuid_to_request_id_.count(request_uuid) > 0u) + return false; + + int request_id = + StartRequest(ServiceWorkerMetrics::EventType::EXTERNAL_REQUEST, + base::Bind(&ServiceWorkerVersion::CleanUpExternalRequest, + this, request_uuid)); + external_request_uuid_to_request_id_[request_uuid] = request_id; + return true; +} + bool ServiceWorkerVersion::FinishRequest(int request_id, bool was_handled, base::Time dispatch_event_time) { @@ -593,6 +611,27 @@ return true; } +bool ServiceWorkerVersion::FinishExternalRequest( + const std::string& request_uuid) { + // It's possible that the renderer is lying or the version started stopping + // right around the time of the IPC. + if (running_status() != EmbeddedWorkerStatus::RUNNING) + return false; + + RequestUUIDToRequestIDMap::iterator iter = + external_request_uuid_to_request_id_.find(request_uuid); + if (iter != external_request_uuid_to_request_id_.end()) { + int request_id = iter->second; + external_request_uuid_to_request_id_.erase(iter); + return FinishRequest(request_id, true, base::Time::Now()); + } + + // It is possible that the request was cancelled or timed out before and we + // won't find it in |external_request_uuid_to_request_id_|. + // Return true so we don't kill the process. + return true; +} + void ServiceWorkerVersion::RunAfterStartWorker( ServiceWorkerMetrics::EventType purpose, const base::Closure& task, @@ -1792,6 +1831,7 @@ iter.Advance(); } pending_requests_.Clear(); + external_request_uuid_to_request_id_.clear(); // Close all mojo services. This will also fire and clear all callbacks // for messages that are still outstanding for those services. @@ -1831,4 +1871,12 @@ RunCallbacks(this, &start_callbacks_, status); } +void ServiceWorkerVersion::CleanUpExternalRequest( + const std::string& request_uuid, + ServiceWorkerStatusCode status) { + if (status == SERVICE_WORKER_OK) + return; + external_request_uuid_to_request_id_.erase(request_uuid); +} + } // namespace content
diff --git a/content/browser/service_worker/service_worker_version.h b/content/browser/service_worker/service_worker_version.h index 6aef95e3..b05b993 100644 --- a/content/browser/service_worker/service_worker_version.h +++ b/content/browser/service_worker/service_worker_version.h
@@ -170,6 +170,13 @@ foreign_fetch_origins_ = origins; } + bool navigation_preload_enabled() const { + return navigation_preload_enabled_; + } + void set_navigation_preload_enabled(bool enabled) { + navigation_preload_enabled_ = enabled; + } + ServiceWorkerMetrics::Site site_for_uma() const { return site_for_uma_; } // This sets the new status and also run status change callbacks @@ -236,6 +243,12 @@ const base::TimeDelta& timeout, TimeoutBehavior timeout_behavior); + // Starts a request of type EventType::EXTERNAL_REQUEST. + // Provides a mechanism to external clients to keep the worker running. + // |request_uuid| is a GUID for clients to identify the request. + // Returns true if the request was successfully scheduled to starrt. + bool StartExternalRequest(const std::string& request_uuid); + // Informs ServiceWorkerVersion that an event has finished being dispatched. // Returns false if no pending requests with the provided id exist, for // example if the request has already timed out. @@ -246,6 +259,11 @@ bool was_handled, base::Time dispatch_event_time); + // Finishes an external request that was started by StartExternalRequest(). + // Returns false if there was an error finishing the request: e.g. the request + // was not found or the worker already terminated. + bool FinishExternalRequest(const std::string& request_uuid); + // Connects to a specific mojo service exposed by the (running) service // worker. If a connection to a service for the same Interface already exists // this will return that existing connection. The |request_id| must be a value @@ -383,6 +401,11 @@ // requests, in-progress streaming URLRequestJobs, or pending start callbacks. bool HasWork() const; + // Returns the number of pending external request count of this worker. + size_t GetExternalRequestCountForTest() const { + return external_request_uuid_to_request_id_.size(); + } + private: friend class base::RefCounted<ServiceWorkerVersion>; friend class ServiceWorkerMetrics; @@ -695,6 +718,10 @@ // callbacks. void FinishStartWorker(ServiceWorkerStatusCode status); + // Removes any pending external request that has GUID of |request_uuid|. + void CleanUpExternalRequest(const std::string& request_uuid, + ServiceWorkerStatusCode status); + const int64_t version_id_; const int64_t registration_id_; const GURL script_url_; @@ -702,6 +729,7 @@ std::vector<GURL> foreign_fetch_scopes_; std::vector<url::Origin> foreign_fetch_origins_; FetchHandlerExistence fetch_handler_existence_; + bool navigation_preload_enabled_ = false; ServiceWorkerMetrics::Site site_for_uma_; Status status_ = NEW; @@ -714,6 +742,11 @@ // fetch, sync, etc. events. IDMap<PendingRequest, IDMapOwnPointer> pending_requests_; + // Container for pending external requests for this service worker. + // (key, value): (request uuid, request id). + using RequestUUIDToRequestIDMap = std::map<std::string, int>; + RequestUUIDToRequestIDMap external_request_uuid_to_request_id_; + // Stores all open connections to mojo services. Maps the service name to // the actual interface pointer. When a connection is closed it is removed // from this map.
diff --git a/content/browser/service_worker/service_worker_write_to_cache_job.cc b/content/browser/service_worker/service_worker_write_to_cache_job.cc index bf226ad..1296d96 100644 --- a/content/browser/service_worker/service_worker_write_to_cache_job.cc +++ b/content/browser/service_worker/service_worker_write_to_cache_job.cc
@@ -285,7 +285,10 @@ } } - if (version_->script_url() == url_) { + if (resource_type_ == RESOURCE_TYPE_SERVICE_WORKER) { + // TODO(nhiroki): Temporary check for debugging (https://crbug.com/485900). + CHECK_EQ(version_->script_url(), url_); + std::string mime_type; request->GetMimeType(&mime_type); if (mime_type != "application/x-javascript" &&
diff --git a/content/browser/shared_worker/shared_worker_service_impl.cc b/content/browser/shared_worker/shared_worker_service_impl.cc index e635448..291df2c 100644 --- a/content/browser/shared_worker/shared_worker_service_impl.cc +++ b/content/browser/shared_worker/shared_worker_service_impl.cc
@@ -474,9 +474,8 @@ void SharedWorkerServiceImpl::NotifyWorkerDestroyed(int worker_process_id, int worker_route_id) { - FOR_EACH_OBSERVER(WorkerServiceObserver, - observers_, - WorkerDestroyed(worker_process_id, worker_route_id)); + for (auto& observer : observers_) + observer.WorkerDestroyed(worker_process_id, worker_route_id); } blink::WebWorkerCreationError @@ -593,10 +592,8 @@ host->Start(pause_on_start); ProcessRouteIdPair key(worker_process_id, worker_route_id); worker_hosts_[key] = std::move(host); - FOR_EACH_OBSERVER( - WorkerServiceObserver, - observers_, - WorkerCreated(url, name, worker_process_id, worker_route_id)); + for (auto& observer : observers_) + observer.WorkerCreated(url, name, worker_process_id, worker_route_id); } void SharedWorkerServiceImpl::RenderProcessReserveFailedCallback(
diff --git a/content/browser/site_instance_impl.cc b/content/browser/site_instance_impl.cc index a55d786e..c12a0c7 100644 --- a/content/browser/site_instance_impl.cc +++ b/content/browser/site_instance_impl.cc
@@ -244,8 +244,10 @@ } void SiteInstanceImpl::DecrementActiveFrameCount() { - if (--active_frame_count_ == 0) - FOR_EACH_OBSERVER(Observer, observers_, ActiveFrameCountIsZero(this)); + if (--active_frame_count_ == 0) { + for (auto& observer : observers_) + observer.ActiveFrameCountIsZero(this); + } } void SiteInstanceImpl::IncrementRelatedActiveContentsCount() { @@ -395,13 +397,15 @@ void SiteInstanceImpl::RenderProcessWillExit(RenderProcessHost* host) { // TODO(nick): http://crbug.com/575400 - RenderProcessWillExit might not serve // any purpose here. - FOR_EACH_OBSERVER(Observer, observers_, RenderProcessGone(this)); + for (auto& observer : observers_) + observer.RenderProcessGone(this); } void SiteInstanceImpl::RenderProcessExited(RenderProcessHost* host, base::TerminationStatus status, int exit_code) { - FOR_EACH_OBSERVER(Observer, observers_, RenderProcessGone(this)); + for (auto& observer : observers_) + observer.RenderProcessGone(this); } void SiteInstanceImpl::LockToOrigin() {
diff --git a/content/browser/ssl/ssl_manager_unittest.cc b/content/browser/ssl/ssl_manager_unittest.cc index eadcb6b..8468bb14 100644 --- a/content/browser/ssl/ssl_manager_unittest.cc +++ b/content/browser/ssl/ssl_manager_unittest.cc
@@ -28,7 +28,7 @@ const SSLStatus& last_ssl_state() { return last_ssl_state_; } // WebContentsDelegate: - void VisibleSSLStateChanged(const WebContents* source) override { + void VisibleSSLStateChanged(WebContents* source) override { NavigationEntry* entry = source->GetController().GetVisibleEntry(); EXPECT_TRUE(entry); last_ssl_state_ = entry->GetSSL();
diff --git a/content/browser/theme_helper_mac.mm b/content/browser/theme_helper_mac.mm index 8499fd42..eb1dff4 100644 --- a/content/browser/theme_helper_mac.mm +++ b/content/browser/theme_helper_mac.mm
@@ -10,6 +10,7 @@ #include "base/mac/mac_util.h" #include "base/strings/sys_string_conversions.h" #include "content/browser/renderer_host/render_process_host_impl.h" +#include "content/common/renderer.mojom.h" #include "content/common/view_messages.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/notification_service.h" @@ -36,7 +37,8 @@ return blink::WebScrollbarButtonsPlacementDoubleEnd; } -void FillScrollbarThemeParams(ViewMsg_UpdateScrollbarTheme_Params* params) { +void FillScrollbarThemeParams( + content::mojom::UpdateScrollbarThemeParams* params) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; @@ -53,13 +55,13 @@ params->button_placement = GetButtonPlacement(); } -ViewMsg_SystemColorsChanged* CreateSystemColorsChangedMessage() { +void SendSystemColorsChangedMessage(content::mojom::Renderer* renderer) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; [defaults synchronize]; - return new ViewMsg_SystemColorsChanged( + renderer->OnSystemColorsChanged( [[defaults stringForKey:@"AppleAquaColorVariant"] intValue], base::SysNSStringToUTF8( [defaults stringForKey:@"AppleHighlightedTextColor"]), @@ -139,22 +141,23 @@ for (RenderProcessHost::iterator it(RenderProcessHost::AllHostsIterator()); !it.IsAtEnd(); it.Advance()) { - it.GetCurrentValue()->Send(CreateSystemColorsChangedMessage()); + SendSystemColorsChangedMessage( + it.GetCurrentValue()->GetRendererInterface()); } } + (void)notifyPrefsChangedWithRedraw:(BOOL)redraw { - ViewMsg_UpdateScrollbarTheme_Params params; - FillScrollbarThemeParams(¶ms); - params.redraw = redraw; - for (RenderProcessHost::iterator it(RenderProcessHost::AllHostsIterator()); !it.IsAtEnd(); it.Advance()) { + content::mojom::UpdateScrollbarThemeParamsPtr params = + content::mojom::UpdateScrollbarThemeParams::New(); + FillScrollbarThemeParams(params.get()); + params->redraw = redraw; RenderProcessHostImpl* rphi = static_cast<RenderProcessHostImpl*>(it.GetCurrentValue()); rphi->RecomputeAndUpdateWebKitPreferences(); - rphi->Send(new ViewMsg_UpdateScrollbarTheme(params)); + rphi->GetRendererInterface()->UpdateScrollbarTheme(std::move(params)); } } @@ -190,15 +193,18 @@ // When a new RenderProcess is created, send it the initial preference // parameters. - ViewMsg_UpdateScrollbarTheme_Params params; - FillScrollbarThemeParams(¶ms); - params.redraw = false; + content::mojom::UpdateScrollbarThemeParamsPtr params = + content::mojom::UpdateScrollbarThemeParams::New(); + FillScrollbarThemeParams(params.get()); + params->redraw = false; RenderProcessHostImpl* rphi = Source<content::RenderProcessHostImpl>(source).ptr(); rphi->RecomputeAndUpdateWebKitPreferences(); - rphi->Send(new ViewMsg_UpdateScrollbarTheme(params)); - rphi->Send(CreateSystemColorsChangedMessage()); + + content::mojom::Renderer* renderer = rphi->GetRendererInterface(); + renderer->UpdateScrollbarTheme(std::move(params)); + SendSystemColorsChangedMessage(renderer); } } // namespace content
diff --git a/content/browser/tracing/tracing_controller_impl.cc b/content/browser/tracing/tracing_controller_impl.cc index 2ca4738..dd01ac66 100644 --- a/content/browser/tracing/tracing_controller_impl.cc +++ b/content/browser/tracing/tracing_controller_impl.cc
@@ -532,8 +532,8 @@ TraceLog::GetInstance()->GetCurrentTraceConfig()); } - FOR_EACH_OBSERVER(TraceMessageFilterObserver, trace_message_filter_observers_, - OnTraceMessageFilterAdded(trace_message_filter)); + for (auto& observer : trace_message_filter_observers_) + observer.OnTraceMessageFilterAdded(trace_message_filter); } void TracingControllerImpl::RemoveTraceMessageFilter(
diff --git a/content/browser/web_contents/web_contents_android.cc b/content/browser/web_contents/web_contents_android.cc index d85822d..054aaffd 100644 --- a/content/browser/web_contents/web_contents_android.cc +++ b/content/browser/web_contents/web_contents_android.cc
@@ -27,6 +27,7 @@ #include "content/common/frame_messages.h" #include "content/common/input_messages.h" #include "content/common/view_messages.h" +#include "content/public/browser/android/app_web_message_port_service.h" #include "content/public/browser/browser_context.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/message_port_provider.h" @@ -559,18 +560,30 @@ ConvertJavaStringToUTF8(env, message)); } -void WebContentsAndroid::SendMessageToFrame( +void WebContentsAndroid::PostMessageToFrame( JNIEnv* env, const JavaParamRef<jobject>& obj, - const JavaParamRef<jstring>& frame_name, - const JavaParamRef<jstring>& message, - const JavaParamRef<jstring>& target_origin) { + const JavaParamRef<jstring>& jframe_name, + const JavaParamRef<jstring>& jmessage, + const JavaParamRef<jstring>& jtarget_origin, + const JavaParamRef<jintArray>& jsent_ports) { base::string16 source_origin; - base::string16 j_target_origin(ConvertJavaStringToUTF16(env, target_origin)); - base::string16 j_message(ConvertJavaStringToUTF16(env, message)); + base::string16 target_origin(ConvertJavaStringToUTF16(env, jtarget_origin)); + base::string16 message(ConvertJavaStringToUTF16(env, jmessage)); std::vector<int> ports; + + if (!jsent_ports.is_null()) + base::android::JavaIntArrayToIntVector(env, jsent_ports, &ports); content::MessagePortProvider::PostMessageToFrame( - web_contents_, source_origin, j_target_origin, j_message, ports); + web_contents_, source_origin, target_origin, message, ports); +} + +void WebContentsAndroid::CreateMessageChannel( + JNIEnv* env, + const JavaParamRef<jobject>& obj, + const JavaParamRef<jobjectArray>& ports) { + content::MessagePortProvider::GetAppWebMessagePortService() + ->CreateMessageChannel(env, ports, web_contents_); } jboolean WebContentsAndroid::HasAccessedInitialDocument(
diff --git a/content/browser/web_contents/web_contents_android.h b/content/browser/web_contents/web_contents_android.h index 5aaaf31b..91db51d 100644 --- a/content/browser/web_contents/web_contents_android.h +++ b/content/browser/web_contents/web_contents_android.h
@@ -133,12 +133,18 @@ jint level, const base::android::JavaParamRef<jstring>& message); - void SendMessageToFrame( + void PostMessageToFrame( JNIEnv* env, const base::android::JavaParamRef<jobject>& obj, - const base::android::JavaParamRef<jstring>& frame_name, - const base::android::JavaParamRef<jstring>& message, - const base::android::JavaParamRef<jstring>& target_origin); + const base::android::JavaParamRef<jstring>& jframe_name, + const base::android::JavaParamRef<jstring>& jmessage, + const base::android::JavaParamRef<jstring>& jtarget_origin, + const base::android::JavaParamRef<jintArray>& jsent_ports); + + void CreateMessageChannel( + JNIEnv* env, + const base::android::JavaParamRef<jobject>& obj, + const base::android::JavaParamRef<jobjectArray>& ports); jboolean HasAccessedInitialDocument( JNIEnv* env,
diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc index 864cb1d1..253e135 100644 --- a/content/browser/web_contents/web_contents_impl.cc +++ b/content/browser/web_contents/web_contents_impl.cc
@@ -108,6 +108,7 @@ #include "content/public/browser/user_metrics.h" #include "content/public/browser/web_contents_binding_set.h" #include "content/public/browser/web_contents_delegate.h" +#include "content/public/browser/web_contents_unresponsive_state.h" #include "content/public/common/bindings_policy.h" #include "content/public/common/browser_side_navigation_policy.h" #include "content/public/common/child_process_host.h" @@ -4678,7 +4679,7 @@ void WebContentsImpl::RendererUnresponsive( RenderWidgetHostImpl* render_widget_host, - RenderWidgetHostDelegate::RendererUnresponsiveType type) { + RendererUnresponsiveType type) { FOR_EACH_OBSERVER(WebContentsObserver, observers_, OnRendererUnresponsive(render_widget_host)); @@ -4698,7 +4699,7 @@ // Record histograms about the type of renderer hang. UMA_HISTOGRAM_ENUMERATION( "ChildProcess.HangRendererType", type, - RenderWidgetHostDelegate::RENDERER_UNRESPONSIVE_MAX); + RendererUnresponsiveType::RENDERER_UNRESPONSIVE_MAX); // We might have been waiting for both beforeunload and unload ACK. // Check if tab is to be unloaded first. @@ -4728,8 +4729,16 @@ if (!GetRenderViewHost() || !GetRenderViewHost()->IsRenderViewLive()) return; - if (delegate_) - delegate_->RendererUnresponsive(this); + if (delegate_) { + WebContentsUnresponsiveState unresponsive_state; + unresponsive_state.reason = type; + unresponsive_state.outstanding_ack_count = + render_widget_host->in_flight_event_count(); + unresponsive_state.outstanding_event_type = + render_widget_host->hang_monitor_event_type(); + unresponsive_state.last_event_type = render_widget_host->last_event_type(); + delegate_->RendererUnresponsive(this, unresponsive_state); + } } void WebContentsImpl::RendererResponsive(
diff --git a/content/browser/web_contents/web_contents_impl.h b/content/browser/web_contents/web_contents_impl.h index 6a99161..3afb1aa 100644 --- a/content/browser/web_contents/web_contents_impl.h +++ b/content/browser/web_contents/web_contents_impl.h
@@ -650,9 +650,8 @@ void ReplicatePageFocus(bool is_focused) override; RenderWidgetHostImpl* GetFocusedRenderWidgetHost( RenderWidgetHostImpl* receiving_widget) override; - void RendererUnresponsive( - RenderWidgetHostImpl* render_widget_host, - RenderWidgetHostDelegate::RendererUnresponsiveType type) override; + void RendererUnresponsive(RenderWidgetHostImpl* render_widget_host, + RendererUnresponsiveType type) override; void RendererResponsive(RenderWidgetHostImpl* render_widget_host) override; void RequestToLockMouse(RenderWidgetHostImpl* render_widget_host, bool user_gesture,
diff --git a/content/browser/webrtc/webrtc_image_capture_browsertest.cc b/content/browser/webrtc/webrtc_image_capture_browsertest.cc index 2213c5f..593a8db5 100644 --- a/content/browser/webrtc/webrtc_image_capture_browsertest.cc +++ b/content/browser/webrtc/webrtc_image_capture_browsertest.cc
@@ -22,13 +22,13 @@ #if defined(OS_WIN) // These tests are flaky on WebRTC Windows bots: https://crbug.com/633242. -#define MAYBE_CreateAndGetCapabilities DISABLED_CreateAndGetCapabilities -#define MAYBE_CreateAndTakePhoto DISABLED_CreateAndTakePhoto -#define MAYBE_CreateAndGrabFrame DISABLED_CreateAndGrabFrame +#define MAYBE_GetCapabilities DISABLED_GetCapabilities +#define MAYBE_TakePhoto DISABLED_TakePhoto +#define MAYBE_GrabFrame DISABLED_GrabFrame #else -#define MAYBE_CreateAndGetCapabilities CreateAndGetCapabilities -#define MAYBE_CreateAndTakePhoto CreateAndTakePhoto -#define MAYBE_CreateAndGrabFrame CreateAndGrabFrame +#define MAYBE_GetCapabilities GetCapabilities +#define MAYBE_TakePhoto TakePhoto +#define MAYBE_GrabFrame GrabFrame #endif namespace { @@ -36,9 +36,7 @@ static const char kImageCaptureHtmlFile[] = "/media/image_capture_test.html"; // TODO(mcasas): enable real-camera tests by disabling the Fake Device for -// platforms where the ImageCaptureCode is landed, https://crbug.com/518807. -// TODO(mcasas): enable in Android when takePhoto() can be specified a (small) -// capture resolution preventing the test from timeout https://crbug.com/634811. +// platforms where the ImageCaptureCode is landed, https://crbug.com/656810 static struct TargetCamera { bool use_fake; } const kTestParameters[] = {{true}}; @@ -67,15 +65,12 @@ switches::kUseFakeDeviceForMediaStream)); } - // Enables promised-based navigator.mediaDevices.getUserMedia(); - // TODO(mcasas): remove after https://crbug.com/503227 is closed. + // "GetUserMedia": enables navigator.mediaDevices.getUserMedia(); + // TODO(mcasas): remove GetUserMedia after https://crbug.com/503227. + // "ImageCapture": enables the ImageCapture API. + // TODO(mcasas): remove ImageCapture after https://crbug.com/603328. base::CommandLine::ForCurrentProcess()->AppendSwitchASCII( - switches::kEnableBlinkFeatures, "GetUserMedia"); - - // Specific flag to enable ImageCapture API. - // TODO(mcasas): remove after https://crbug.com/603328 is closed. - base::CommandLine::ForCurrentProcess()->AppendSwitchASCII( - switches::kEnableBlinkFeatures, "ImageCapture"); + switches::kEnableBlinkFeatures, "GetUserMedia,ImageCapture"); } void SetUp() override { @@ -112,20 +107,17 @@ DISALLOW_COPY_AND_ASSIGN(WebRtcImageCaptureBrowserTest); }; -IN_PROC_BROWSER_TEST_P(WebRtcImageCaptureBrowserTest, - MAYBE_CreateAndGetCapabilities) { +IN_PROC_BROWSER_TEST_P(WebRtcImageCaptureBrowserTest, MAYBE_GetCapabilities) { embedded_test_server()->StartAcceptingConnections(); ASSERT_TRUE(RunImageCaptureTestCase("testCreateAndGetCapabilities()")); } -IN_PROC_BROWSER_TEST_P(WebRtcImageCaptureBrowserTest, - MAYBE_CreateAndTakePhoto) { +IN_PROC_BROWSER_TEST_P(WebRtcImageCaptureBrowserTest, MAYBE_TakePhoto) { embedded_test_server()->StartAcceptingConnections(); ASSERT_TRUE(RunImageCaptureTestCase("testCreateAndTakePhoto()")); } -IN_PROC_BROWSER_TEST_P(WebRtcImageCaptureBrowserTest, - MAYBE_CreateAndGrabFrame) { +IN_PROC_BROWSER_TEST_P(WebRtcImageCaptureBrowserTest, MAYBE_GrabFrame) { embedded_test_server()->StartAcceptingConnections(); ASSERT_TRUE(RunImageCaptureTestCase("testCreateAndGrabFrame()")); }
diff --git a/content/browser/webrtc/webrtc_internals.cc b/content/browser/webrtc/webrtc_internals.cc index d4a517e..60cda5fc 100644 --- a/content/browser/webrtc/webrtc_internals.cc +++ b/content/browser/webrtc/webrtc_internals.cc
@@ -527,9 +527,8 @@ DCHECK_CURRENTLY_ON(BrowserThread::UI); while (!pending_updates_.empty()) { const auto& update = pending_updates_.front(); - FOR_EACH_OBSERVER(WebRTCInternalsUIObserver, - observers_, - OnUpdate(update.command(), update.value())); + for (auto& observer : observers_) + observer.OnUpdate(update.command(), update.value()); pending_updates_.pop(); } }
diff --git a/content/child/child_discardable_shared_memory_manager.cc b/content/child/child_discardable_shared_memory_manager.cc index 4438449..1d1aa4c 100644 --- a/content/child/child_discardable_shared_memory_manager.cc +++ b/content/child/child_discardable_shared_memory_manager.cc
@@ -235,6 +235,15 @@ return heap_.OnMemoryDump(pmd); } +ChildDiscardableSharedMemoryManager::Statistics +ChildDiscardableSharedMemoryManager::GetStatistics() const { + base::AutoLock lock(lock_); + Statistics stats; + stats.total_size = heap_.GetSize(); + stats.freelist_size = heap_.GetSizeOfFreeLists(); + return stats; +} + void ChildDiscardableSharedMemoryManager::ReleaseFreeMemory() { base::AutoLock lock(lock_);
diff --git a/content/child/child_discardable_shared_memory_manager.h b/content/child/child_discardable_shared_memory_manager.h index 4a645fa..9f83e1c1 100644 --- a/content/child/child_discardable_shared_memory_manager.h +++ b/content/child/child_discardable_shared_memory_manager.h
@@ -48,6 +48,13 @@ const char* name, base::trace_event::ProcessMemoryDump* pmd) const; + struct Statistics { + size_t total_size; + size_t freelist_size; + }; + + Statistics GetStatistics() const; + private: std::unique_ptr<base::DiscardableSharedMemory> AllocateLockedDiscardableSharedMemory(size_t size,
diff --git a/content/child/notifications/notification_manager.cc b/content/child/notifications/notification_manager.cc index 45af387..042cbf5b 100644 --- a/content/child/notifications/notification_manager.cc +++ b/content/child/notifications/notification_manager.cc
@@ -43,14 +43,6 @@ static base::LazyInstance<base::ThreadLocalPointer<NotificationManager>>::Leaky g_notification_manager_tls = LAZY_INSTANCE_INITIALIZER; -NotificationManager::ActiveNotificationData::ActiveNotificationData( - blink::WebNotificationDelegate* delegate, - const GURL& origin, - const std::string& tag) - : delegate(delegate), origin(origin), tag(tag) {} - -NotificationManager::ActiveNotificationData::~ActiveNotificationData() {} - NotificationManager::NotificationManager( ThreadSafeSender* thread_safe_sender, NotificationDispatcher* notification_dispatcher) @@ -90,18 +82,16 @@ GURL origin_gurl = blink::WebStringToGURL(origin.toString()); - int notification_id = + int non_persistent_notification_id = notification_dispatcher_->GenerateNotificationId(CurrentWorkerId()); - active_page_notifications_[notification_id] = ActiveNotificationData( - delegate, origin_gurl, - base::UTF16ToUTF8(base::StringPiece16(notification_data.tag))); + non_persistent_notifications_[non_persistent_notification_id] = delegate; // TODO(mkwst): This is potentially doing the wrong thing with unique // origins. Perhaps also 'file:', 'blob:' and 'filesystem:'. See // https://crbug.com/490074 for detail. thread_safe_sender_->Send(new PlatformNotificationHostMsg_Show( - notification_id, origin_gurl, + non_persistent_notification_id, origin_gurl, ToPlatformNotificationData(notification_data), ToNotificationResources(std::move(notification_resources)))); } @@ -186,54 +176,61 @@ base::UTF16ToUTF8(base::StringPiece16(filter_tag)))); } -void NotificationManager::close(blink::WebNotificationDelegate* delegate) { - for (auto& iter : active_page_notifications_) { - if (iter.second.delegate != delegate) - continue; +void NotificationManager::close(const blink::WebSecurityOrigin& origin, + const blink::WebString& tag, + const blink::WebString& notification_id) { + const std::string notification_id_str = + base::UTF16ToUTF8(base::StringPiece16(notification_id)); - thread_safe_sender_->Send(new PlatformNotificationHostMsg_Close( - iter.second.origin, iter.second.tag, iter.first)); - active_page_notifications_.erase(iter.first); - return; + // Remove the stored local state for non-persistent notifications. + auto iter = non_persistent_notification_ids_.find(notification_id_str); + if (iter != non_persistent_notification_ids_.end()) { + int non_persistent_notification_id = iter->second; + + non_persistent_notifications_.erase(non_persistent_notification_id); + non_persistent_notification_ids_.erase(iter); } - // It should not be possible for Blink to call close() on a Notification which - // does not exist in either the pending or active notification lists. - NOTREACHED(); -} - -void NotificationManager::closePersistent( - const blink::WebSecurityOrigin& origin, - const blink::WebString& tag, - const blink::WebString& notification_id) { - thread_safe_sender_->Send(new PlatformNotificationHostMsg_ClosePersistent( + thread_safe_sender_->Send(new PlatformNotificationHostMsg_Close( // TODO(mkwst): This is potentially doing the wrong thing with unique // origins. Perhaps also 'file:', 'blob:' and 'filesystem:'. See // https://crbug.com/490074 for detail. blink::WebStringToGURL(origin.toString()), - base::UTF16ToUTF8(base::StringPiece16(tag)), - base::UTF16ToUTF8(base::StringPiece16(notification_id)))); + base::UTF16ToUTF8(base::StringPiece16(tag)), notification_id_str)); } void NotificationManager::notifyDelegateDestroyed( blink::WebNotificationDelegate* delegate) { - for (auto& iter : active_page_notifications_) { - if (iter.second.delegate != delegate) + for (auto iter = non_persistent_notifications_.begin(); + iter != non_persistent_notifications_.end(); iter++) { + if (iter->second != delegate) continue; - active_page_notifications_.erase(iter.first); - return; + int non_persistent_notification_id = iter->first; + + // Remove the notification's ID association from the local state as well. + for (auto assoc_iter = non_persistent_notification_ids_.begin(); + assoc_iter != non_persistent_notification_ids_.end(); assoc_iter++) { + if (assoc_iter->second != non_persistent_notification_id) + continue; + + non_persistent_notification_ids_.erase(assoc_iter); + break; + } + + non_persistent_notifications_.erase(iter); + break; } } bool NotificationManager::OnMessageReceived(const IPC::Message& message) { bool handled = true; IPC_BEGIN_MESSAGE_MAP(NotificationManager, message) - IPC_MESSAGE_HANDLER(PlatformNotificationMsg_DidShow, OnDidShow); + IPC_MESSAGE_HANDLER(PlatformNotificationMsg_DidShow, OnDidShow) IPC_MESSAGE_HANDLER(PlatformNotificationMsg_DidShowPersistent, OnDidShowPersistent) - IPC_MESSAGE_HANDLER(PlatformNotificationMsg_DidClose, OnDidClose); - IPC_MESSAGE_HANDLER(PlatformNotificationMsg_DidClick, OnDidClick); + IPC_MESSAGE_HANDLER(PlatformNotificationMsg_DidClose, OnDidClose) + IPC_MESSAGE_HANDLER(PlatformNotificationMsg_DidClick, OnDidClick) IPC_MESSAGE_HANDLER(PlatformNotificationMsg_DidGetNotifications, OnDidGetNotifications) IPC_MESSAGE_UNHANDLED(handled = false) @@ -242,12 +239,19 @@ return handled; } -void NotificationManager::OnDidShow(int notification_id) { - const auto& iter = active_page_notifications_.find(notification_id); - if (iter == active_page_notifications_.end()) - return; +void NotificationManager::OnDidShow(int non_persistent_notification_id, + const std::string& notification_id) { + const auto iter = + non_persistent_notifications_.find(non_persistent_notification_id); - iter->second.delegate->dispatchShowEvent(); + if (iter == non_persistent_notifications_.end()) + return; // The notification has been destroyed by Blink since. + + non_persistent_notification_ids_[notification_id] = + non_persistent_notification_id; + + blink::WebNotificationDelegate* delegate = iter->second; + delegate->didShowNotification(blink::WebString::fromUTF8(notification_id)); } void NotificationManager::OnDidShowPersistent(int request_id, bool success) { @@ -266,22 +270,26 @@ pending_show_notification_requests_.Remove(request_id); } -void NotificationManager::OnDidClose(int notification_id) { - const auto& iter = active_page_notifications_.find(notification_id); - if (iter == active_page_notifications_.end()) +void NotificationManager::OnDidClose(int non_persistent_notification_id, + const std::string& notification_id) { + const auto iter = + non_persistent_notifications_.find(non_persistent_notification_id); + if (iter == non_persistent_notifications_.end()) return; - iter->second.delegate->dispatchCloseEvent(); + iter->second->didCloseNotification(); - active_page_notifications_.erase(iter); + non_persistent_notifications_.erase(iter); + non_persistent_notification_ids_.erase(notification_id); } -void NotificationManager::OnDidClick(int notification_id) { - const auto& iter = active_page_notifications_.find(notification_id); - if (iter == active_page_notifications_.end()) +void NotificationManager::OnDidClick(int non_persistent_notification_id) { + const auto iter = + non_persistent_notifications_.find(non_persistent_notification_id); + if (iter == non_persistent_notifications_.end()) return; - iter->second.delegate->dispatchClickEvent(); + iter->second->didClickNotification(); } void NotificationManager::OnDidGetNotifications(
diff --git a/content/child/notifications/notification_manager.h b/content/child/notifications/notification_manager.h index b556c8e1..da673a459 100644 --- a/content/child/notifications/notification_manager.h +++ b/content/child/notifications/notification_manager.h
@@ -56,10 +56,9 @@ const blink::WebString& filter_tag, blink::WebServiceWorkerRegistration* service_worker_registration, blink::WebNotificationGetCallbacks* callbacks) override; - void close(blink::WebNotificationDelegate* delegate) override; - void closePersistent(const blink::WebSecurityOrigin& origin, - const blink::WebString& tag, - const blink::WebString& notification_id) override; + void close(const blink::WebSecurityOrigin& origin, + const blink::WebString& tag, + const blink::WebString& notification_id) override; void notifyDelegateDestroyed( blink::WebNotificationDelegate* delegate) override; @@ -71,10 +70,12 @@ NotificationDispatcher* notification_dispatcher); // IPC message handlers. - void OnDidShow(int notification_id); + void OnDidShow(int non_persistent_notification_id, + const std::string& notification_id); void OnDidShowPersistent(int request_id, bool success); - void OnDidClose(int notification_id); - void OnDidClick(int notification_id); + void OnDidClose(int non_persistent_notification_id, + const std::string& notification_id); + void OnDidClick(int non_persistent_notification_id); void OnDidGetNotifications( int request_id, const std::vector<PersistentNotificationInfo>& notification_infos); @@ -90,21 +91,14 @@ IDMap<blink::WebNotificationShowCallbacks, IDMapOwnPointer> pending_show_notification_requests_; - // Structure holding the information for active non-persistent notifications. - struct ActiveNotificationData { - ActiveNotificationData() = default; - ActiveNotificationData(blink::WebNotificationDelegate* delegate, - const GURL& origin, - const std::string& tag); - ~ActiveNotificationData(); + // Map from the notification ID to the associated delegate for non-persistent + // notifications, for the purposes of triggering events. + std::unordered_map<int, blink::WebNotificationDelegate*> + non_persistent_notifications_; - blink::WebNotificationDelegate* delegate = nullptr; - GURL origin; - std::string tag; - }; - - // Map to store the delegate associated with a notification request Id. - std::unordered_map<int, ActiveNotificationData> active_page_notifications_; + // Association from the notification ID string to the non-persistent + // notification ID for non-persistent notifications. + std::unordered_map<std::string, int> non_persistent_notification_ids_; DISALLOW_COPY_AND_ASSIGN(NotificationManager); };
diff --git a/content/child/web_data_consumer_handle_impl.h b/content/child/web_data_consumer_handle_impl.h index 1c93bcd5..fb814a2 100644 --- a/content/child/web_data_consumer_handle_impl.h +++ b/content/child/web_data_consumer_handle_impl.h
@@ -43,6 +43,8 @@ scoped_refptr<Context> context_; mojo::Watcher handle_watcher_; Client* client_; + + DISALLOW_COPY_AND_ASSIGN(ReaderImpl); }; std::unique_ptr<Reader> obtainReader(Client* client) override; @@ -53,6 +55,8 @@ const char* debugName() const override; scoped_refptr<Context> context_; + + DISALLOW_COPY_AND_ASSIGN(WebDataConsumerHandleImpl); }; } // namespace content
diff --git a/content/common/BUILD.gn b/content/common/BUILD.gn index b5fb3e0..cbf0bb5 100644 --- a/content/common/BUILD.gn +++ b/content/common/BUILD.gn
@@ -200,8 +200,6 @@ "media/aec_dump_messages.h", "media/audio_messages.h", "media/cdm_info.cc", - "media/cdm_messages.h", - "media/cdm_messages_enums.h", "media/media_devices.cc", "media/media_devices.h", "media/media_devices_param_traits.cc",
diff --git a/content/common/cache_storage/cache_storage_messages.h b/content/common/cache_storage/cache_storage_messages.h index 82fe755..80a4ff8 100644 --- a/content/common/cache_storage/cache_storage_messages.h +++ b/content/common/cache_storage/cache_storage_messages.h
@@ -152,10 +152,6 @@ int /* thread_id */, int /* request_id */, blink::WebServiceWorkerCacheError /* reason */) -IPC_MESSAGE_CONTROL3(CacheStorageMsg_CacheStorageKeysError, - int /* thread_id */, - int /* request_id */, - blink::WebServiceWorkerCacheError /* reason */) IPC_MESSAGE_CONTROL3(CacheStorageMsg_CacheStorageMatchError, int /* thread_id */, int /* request_id */,
diff --git a/content/common/content_message_generator.h b/content/common/content_message_generator.h index 6d55200..ee5fd0e 100644 --- a/content/common/content_message_generator.h +++ b/content/common/content_message_generator.h
@@ -28,8 +28,6 @@ #include "content/common/manifest_manager_messages.h" #include "content/common/media/aec_dump_messages.h" #include "content/common/media/audio_messages.h" -// TODO(xhwang): Move this to a new ifdef block. -#include "content/common/media/cdm_messages.h" #include "content/common/media/media_player_delegate_messages.h" #include "content/common/media/media_stream_messages.h" #include "content/common/media/media_stream_track_metrics_host_messages.h"
diff --git a/content/common/frame_messages.h b/content/common/frame_messages.h index 62d319a3..118060d8 100644 --- a/content/common/frame_messages.h +++ b/content/common/frame_messages.h
@@ -51,6 +51,7 @@ #include "ui/gfx/geometry/rect_f.h" #include "ui/gfx/ipc/gfx_param_traits.h" #include "ui/gfx/ipc/skia/gfx_skia_param_traits.h" +#include "ui/gfx/range/range.h" #include "url/gurl.h" #include "url/origin.h" @@ -1289,6 +1290,14 @@ // user right clicked. IPC_MESSAGE_ROUTED1(FrameHostMsg_ContextMenu, content::ContextMenuParams) +// Notification that the text selection has changed. +// Note: The second parameter is the character based offset of the +// base::string16 text in the document. +IPC_MESSAGE_ROUTED3(FrameHostMsg_SelectionChanged, + base::string16 /* text covers the selection range */, + uint32_t /* the offset of the text in the document */, + gfx::Range /* selection range in the document */) + // Response for FrameMsg_JavaScriptExecuteRequest, sent when a reply was // requested. The ID is the parameter supplied to // FrameMsg_JavaScriptExecuteRequest. The result has the value returned by the
diff --git a/content/common/media/cdm_messages.h b/content/common/media/cdm_messages.h deleted file mode 100644 index 136edf1..0000000 --- a/content/common/media/cdm_messages.h +++ /dev/null
@@ -1,142 +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. - -// IPC messages for content decryption module (CDM) implementation. -// Multiply-included message file, hence no include guard. - -#include <stdint.h> - -#include <string> -#include <vector> - -#include "content/common/content_export.h" -#include "content/common/media/cdm_messages_enums.h" -#include "ipc/ipc_message_macros.h" -#include "media/base/cdm_key_information.h" -#include "media/base/media_keys.h" -#include "url/gurl.h" - -#undef IPC_MESSAGE_EXPORT -#define IPC_MESSAGE_EXPORT CONTENT_EXPORT -#define IPC_MESSAGE_START CdmMsgStart - -IPC_ENUM_TRAITS_MAX_VALUE(media::CdmKeyInformation::KeyStatus, - media::CdmKeyInformation::KEY_STATUS_MAX) -IPC_ENUM_TRAITS_MAX_VALUE(media::MediaKeys::Exception, - media::MediaKeys::EXCEPTION_MAX) -IPC_ENUM_TRAITS_MAX_VALUE(media::MediaKeys::SessionType, - media::MediaKeys::SESSION_TYPE_MAX) -IPC_ENUM_TRAITS_MAX_VALUE(media::MediaKeys::MessageType, - media::MediaKeys::MESSAGE_TYPE_MAX) -IPC_ENUM_TRAITS_MAX_VALUE(CdmHostMsg_CreateSession_InitDataType, - INIT_DATA_TYPE_MAX) - -IPC_STRUCT_BEGIN(CdmHostMsg_InitializeCdm_Params) - IPC_STRUCT_MEMBER(std::string, key_system) - IPC_STRUCT_MEMBER(GURL, security_origin) - IPC_STRUCT_MEMBER(bool, use_hw_secure_codecs) -IPC_STRUCT_END() - -IPC_STRUCT_TRAITS_BEGIN(media::CdmKeyInformation) - IPC_STRUCT_TRAITS_MEMBER(key_id) - IPC_STRUCT_TRAITS_MEMBER(status) - IPC_STRUCT_TRAITS_MEMBER(system_code) -IPC_STRUCT_TRAITS_END() - -// Parameter structure for CdmHostMsg_CreateSessionAndGenerateRequest. -IPC_STRUCT_BEGIN(CdmHostMsg_CreateSessionAndGenerateRequest_Params) - IPC_STRUCT_MEMBER(int, render_frame_id) - IPC_STRUCT_MEMBER(int, cdm_id) - IPC_STRUCT_MEMBER(uint32_t, promise_id) - IPC_STRUCT_MEMBER(media::MediaKeys::SessionType, session_type) - IPC_STRUCT_MEMBER(CdmHostMsg_CreateSession_InitDataType, init_data_type) - IPC_STRUCT_MEMBER(std::vector<uint8_t>, init_data) -IPC_STRUCT_END() - - -// Messages from render to browser. - -IPC_MESSAGE_CONTROL4(CdmHostMsg_InitializeCdm, - int /* render_frame_id */, - int /* cdm_id */, - uint32_t /* promise_id */, - CdmHostMsg_InitializeCdm_Params /* params */) - -IPC_MESSAGE_CONTROL4(CdmHostMsg_SetServerCertificate, - int /* render_frame_id */, - int /* cdm_id */, - uint32_t /* promise_id */, - std::vector<uint8_t> /* certificate */) - -IPC_MESSAGE_CONTROL1(CdmHostMsg_CreateSessionAndGenerateRequest, - CdmHostMsg_CreateSessionAndGenerateRequest_Params) - -IPC_MESSAGE_CONTROL5(CdmHostMsg_LoadSession, - int /* render_frame_id */, - int /* cdm_id */, - uint32_t /* promise_id */, - media::MediaKeys::SessionType /* session_type */, - std::string /* session_id */) - -IPC_MESSAGE_CONTROL5(CdmHostMsg_UpdateSession, - int /* render_frame_id */, - int /* cdm_id */, - uint32_t /* promise_id */, - std::string /* session_id */, - std::vector<uint8_t> /* response */) - -IPC_MESSAGE_CONTROL4(CdmHostMsg_CloseSession, - int /* render_frame_id */, - int /* cdm_id */, - uint32_t /* promise_id */, - std::string /* session_id */) - -IPC_MESSAGE_CONTROL4(CdmHostMsg_RemoveSession, - int /* render_frame_id */, - int /* cdm_id */, - uint32_t /* promise_id */, - std::string /* session_id */) - -IPC_MESSAGE_CONTROL2(CdmHostMsg_DestroyCdm, - int /* render_frame_id */, - int /* cdm_id */) - -// Messages from browser to render. - -IPC_MESSAGE_ROUTED4(CdmMsg_SessionMessage, - int /* cdm_id */, - std::string /* session_id */, - media::MediaKeys::MessageType /* message_type */, - std::vector<uint8_t> /* message */) - -IPC_MESSAGE_ROUTED2(CdmMsg_SessionClosed, - int /* cdm_id */, - std::string /* session_id */) - -IPC_MESSAGE_ROUTED4(CdmMsg_SessionKeysChange, - int /* cdm_id */, - std::string /* session_id */, - bool /* has_additional_usable_key */, - std::vector<media::CdmKeyInformation> /* keys_info */) - -IPC_MESSAGE_ROUTED3(CdmMsg_SessionExpirationUpdate, - int /* cdm_id */, - std::string /* session_id */, - base::Time /* new_expiry_time */) - -IPC_MESSAGE_ROUTED2(CdmMsg_ResolvePromise, - int /* cdm_id */, - uint32_t /* promise_id */) - -IPC_MESSAGE_ROUTED3(CdmMsg_ResolvePromiseWithSession, - int /* cdm_id */, - uint32_t /* promise_id */, - std::string /* session_id */) - -IPC_MESSAGE_ROUTED5(CdmMsg_RejectPromise, - int /* cdm_id */, - uint32_t /* promise_id */, - media::MediaKeys::Exception /* exception */, - uint32_t /* system_code */, - std::string /* error_message */)
diff --git a/content/common/media/cdm_messages_enums.h b/content/common/media/cdm_messages_enums.h deleted file mode 100644 index c87eb137..0000000 --- a/content/common/media/cdm_messages_enums.h +++ /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. - -#ifndef CONTENT_COMMON_MEDIA_CDM_MESSAGES_ENUMS_H_ -#define CONTENT_COMMON_MEDIA_CDM_MESSAGES_ENUMS_H_ - -// The Initialization Data Type when a request is generated. -// TODO(ddorwin): Replace this with a generic constant. See crbug.com/417440#c9. -enum CdmHostMsg_CreateSession_InitDataType { - INIT_DATA_TYPE_WEBM, - INIT_DATA_TYPE_CENC, - INIT_DATA_TYPE_MAX = INIT_DATA_TYPE_CENC -}; - -#endif // CONTENT_COMMON_MEDIA_CDM_MESSAGES_ENUMS_H_
diff --git a/content/common/native_types.mojom b/content/common/native_types.mojom index 222ee34..9a8d9cd 100644 --- a/content/common/native_types.mojom +++ b/content/common/native_types.mojom
@@ -20,5 +20,18 @@ [Native] struct ResizeParams; +// NOTE: This type is only mapped and usable on Mac. +[Native] +enum ScrollbarButtonsPlacement; + +// NOTE: This type is only mapped and usable on Mac. +[Native] +enum ScrollerStyle; + [Native] struct WebPreferences; + +// TODO(rockot): This should most likely be defined by network service mojom, +// but the network service doesn't exist yet. +[Native] +enum NetworkConnectionType;
diff --git a/content/common/native_types.typemap b/content/common/native_types.typemap index ad8a546..6ee3a9b4 100644 --- a/content/common/native_types.typemap +++ b/content/common/native_types.typemap
@@ -9,6 +9,7 @@ "//content/common/resize_params.h", "//content/public/common/renderer_preferences.h", "//content/public/common/web_preferences.h", + "//net/base/network_change_notifier.h", ] traits_headers = [ "//content/common/frame_messages.h", @@ -25,6 +26,7 @@ "//cc/ipc", "//media", "//media/base/ipc", + "//net", "//ui/accessibility", "//ui/base/ime:text_input_types", "//ui/gfx/ipc", @@ -36,6 +38,7 @@ type_mappings = [ "content.mojom.FrameOwnerProperties=content::FrameOwnerProperties", "content.mojom.FrameReplicationState=content::FrameReplicationState", + "content.mojom.NetworkConnectionType=net::NetworkChangeNotifier::ConnectionType", "content.mojom.RendererPreferences=content::RendererPreferences", "content.mojom.ResizeParams=content::ResizeParams", "content.mojom.WebPreferences=content::WebPreferences",
diff --git a/content/common/native_types_mac.typemap b/content/common/native_types_mac.typemap new file mode 100644 index 0000000..d614f04 --- /dev/null +++ b/content/common/native_types_mac.typemap
@@ -0,0 +1,34 @@ +# Copyright 2016 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +mojom = "//content/common/native_types.mojom" +public_headers = [ + "//third_party/WebKit/public/platform/WebScrollbarButtonsPlacement.h", + "//third_party/WebKit/public/web/mac/WebScrollbarTheme.h", +] +traits_headers = [ "//content/common/view_messages.h" ] +deps = [ + # NOTE: These dependencies are here to satisfy gn check because + # common_param_traits_macros.h and/or view_messages.h include their headers. + # Although the mojo bindings target is configured to allow direct circular + # includes from //content/common and //content/public/common, this isn't a + # transitive allowance, so those targets' own public_deps aren't included in + # the set of implied dependencies. + "//cc/ipc", + "//media", + "//media/base/ipc", + "//net", + "//third_party/WebKit/public:blink_headers", + "//ui/accessibility", + "//ui/base/ime:text_input_types", + "//ui/gfx/ipc", + "//ui/gfx/ipc/color", + "//ui/gfx/ipc/skia", + "//ui/surface", + "//url/ipc:url_ipc", +] +type_mappings = [ + "content.mojom.ScrollerStyle=::blink::ScrollerStyle", + "content.mojom.ScrollbarButtonsPlacement=::blink::WebScrollbarButtonsPlacement", +]
diff --git a/content/common/platform_notification_messages.h b/content/common/platform_notification_messages.h index 02bb9f3a..7646c0e 100644 --- a/content/common/platform_notification_messages.h +++ b/content/common/platform_notification_messages.h
@@ -71,16 +71,18 @@ // Messages sent from the browser to the renderer. // Informs the renderer that the browser has displayed the notification. -IPC_MESSAGE_CONTROL1(PlatformNotificationMsg_DidShow, - int /* notification_id */) +IPC_MESSAGE_CONTROL2(PlatformNotificationMsg_DidShow, + int /* non_persistent_notification_id */, + std::string /* notification_id */) // Informs the renderer that the notification has been closed. -IPC_MESSAGE_CONTROL1(PlatformNotificationMsg_DidClose, - int /* notification_id */) +IPC_MESSAGE_CONTROL2(PlatformNotificationMsg_DidClose, + int /* non_persistent_notification_id */, + std::string /* notification_id */) // Informs the renderer that the notification has been clicked on. IPC_MESSAGE_CONTROL1(PlatformNotificationMsg_DidClick, - int /* notification_id */) + int /* non_persistent_notification_id */) // Reply to PlatformNotificationHostMsg_ShowPersistent indicating that a // persistent notification has been shown on the platform (if |success| is @@ -122,9 +124,4 @@ IPC_MESSAGE_CONTROL3(PlatformNotificationHostMsg_Close, GURL /* origin */, std::string /* tag */, - int /* non_persistent_notification_id */) - -IPC_MESSAGE_CONTROL3(PlatformNotificationHostMsg_ClosePersistent, - GURL /* origin */, - std::string /* tag */, std::string /* notification_id */)
diff --git a/content/common/renderer.mojom b/content/common/renderer.mojom index fcefa5a..6c7fb6a 100644 --- a/content/common/renderer.mojom +++ b/content/common/renderer.mojom
@@ -122,6 +122,14 @@ CreateFrameWidgetParams widget_params; }; +struct UpdateScrollbarThemeParams { + float initial_button_delay; + float autoscroll_button_delay; + bool jump_on_track_click; + ScrollerStyle preferred_scroller_style; + bool redraw; + ScrollbarButtonsPlacement button_placement; +}; // The primordial Channel-associated interface implemented by a render process. // This should be used for implementing browser-to-renderer control messages @@ -143,4 +151,25 @@ CreateFrameProxy(int32 routing_id, int32 render_view_routing_id, int32 opener_routing_id, int32 parent_routing_id, FrameReplicationState replication_state); + + // Tells the renderer that the network type has changed so that + // navigator.onLine and navigator.connection can be updated. + OnNetworkConnectionChanged(NetworkConnectionType connection_type, + double max_bandwidth_mbps); + + // Tells the renderer to suspend/resume the webkit timers. Only for use on + // Android. + SetWebKitSharedTimersSuspended(bool suspend); + + // Tells the renderer about a scrollbar appearance change. Only for use on + // OS X. + UpdateScrollbarTheme(UpdateScrollbarThemeParams params); + + // Notification that the OS X Aqua color preferences changed. + OnSystemColorsChanged(int32 aqua_color_variant, string highlight_text_color, + string highlight_color); + + // Tells the renderer to empty its plugin list cache, optional reloading + // pages containing plugins. + PurgePluginListCache(bool reload_pages); };
diff --git a/content/common/service_worker/embedded_worker.mojom b/content/common/service_worker/embedded_worker.mojom index 28cff4a..e9d01b25 100644 --- a/content/common/service_worker/embedded_worker.mojom +++ b/content/common/service_worker/embedded_worker.mojom
@@ -12,6 +12,8 @@ // Interface to control a renderer-side worker's environment. interface EmbeddedWorkerInstanceClient { - StartWorker(EmbeddedWorkerStartParams params); + StartWorker(EmbeddedWorkerStartParams params, + service_manager.mojom.InterfaceProvider browser_interfaces, + service_manager.mojom.InterfaceProvider& renderer_request); StopWorker() => (); -}; +}; \ No newline at end of file
diff --git a/content/common/service_worker/fetch_event_dispatcher.mojom b/content/common/service_worker/fetch_event_dispatcher.mojom index e46b0e26..ff4252f 100644 --- a/content/common/service_worker/fetch_event_dispatcher.mojom +++ b/content/common/service_worker/fetch_event_dispatcher.mojom
@@ -4,14 +4,21 @@ module content.mojom; +import "content/common/url_loader.mojom"; import "mojo/common/common_custom_types.mojom"; import "third_party/WebKit/public/platform/modules/serviceworker/service_worker_event_status.mojom"; [Native] struct ServiceWorkerFetchRequest; +struct FetchEventPreloadHandle { + URLLoader url_loader; + URLLoaderClient& url_loader_client_request; +}; + interface FetchEventDispatcher { - DispatchFetchEvent(int32 fetch_event_id, ServiceWorkerFetchRequest request) + DispatchFetchEvent(int32 fetch_event_id, ServiceWorkerFetchRequest request, + FetchEventPreloadHandle? preload_handle) => (blink.mojom.ServiceWorkerEventStatus status, mojo.common.mojom.Time dispatch_event_time); };
diff --git a/content/common/service_worker/service_worker_utils.cc b/content/common/service_worker/service_worker_utils.cc index fb3e7251..368dfbf 100644 --- a/content/common/service_worker/service_worker_utils.cc +++ b/content/common/service_worker/service_worker_utils.cc
@@ -106,17 +106,30 @@ } // static -bool ServiceWorkerUtils::CanRegisterServiceWorker(const GURL& context_url, - const GURL& pattern, - const GURL& script_url) { - DCHECK(context_url.is_valid()); - DCHECK(pattern.is_valid()); - DCHECK(script_url.is_valid()); - return ServiceWorkerUtils::PassOriginEqualitySecurityCheck<GURL>( - context_url, pattern, script_url) && - OriginCanAccessServiceWorkers(context_url) && - OriginCanAccessServiceWorkers(pattern) && - OriginCanAccessServiceWorkers(script_url); +bool ServiceWorkerUtils::AllOriginsMatchAndCanAccessServiceWorkers( + const std::vector<GURL>& urls) { + // (A) Check if all origins can access service worker. Every URL must be + // checked despite the same-origin check below in (B), because GetOrigin() + // uses the inner URL for filesystem URLs so that https://foo/ and + // filesystem:https://foo/ are considered equal, but filesystem URLs cannot + // access service worker. + for (const GURL& url : urls) { + if (!OriginCanAccessServiceWorkers(url)) + return false; + } + + // (B) Check if all origins are equal. Cross-origin access is permitted when + // --disable-web-security is set. + if (base::CommandLine::ForCurrentProcess()->HasSwitch( + switches::kDisableWebSecurity)) { + return true; + } + const GURL& first = urls.front(); + for (const GURL& url : urls) { + if (first.GetOrigin() != url.GetOrigin()) + return false; + } + return true; } // static
diff --git a/content/common/service_worker/service_worker_utils.h b/content/common/service_worker/service_worker_utils.h index b0c3cc8de..8c9b528 100644 --- a/content/common/service_worker/service_worker_utils.h +++ b/content/common/service_worker/service_worker_utils.h
@@ -42,26 +42,14 @@ const GURL& script_url, std::string* error_message); - static bool CanRegisterServiceWorker(const GURL& context_url, - const GURL& pattern, - const GURL& script_url); - static bool IsMojoForServiceWorkerEnabled(); - // Returns true when '--disable-web-security' flag is set. Otherwise returns - // whether the all origins of |urls| are same as the origin of |url|. - template <typename... Args> - static bool PassOriginEqualitySecurityCheck(const GURL& url, - const Args&... urls) { - if (base::CommandLine::ForCurrentProcess()->HasSwitch( - switches::kDisableWebSecurity)) - return true; - for (const GURL& u : {urls...}) { - if (url.GetOrigin() != u.GetOrigin()) - return false; - } - return true; - } + // Returns true if all members of |urls| have the same origin, and + // OriginCanAccessServiceWorkers is true for this origin. + // If --disable-web-security is enabled, the same origin check is + // not performed. + CONTENT_EXPORT static bool AllOriginsMatchAndCanAccessServiceWorkers( + const std::vector<GURL>& urls); // PlzNavigate // Returns true if the |provider_id| was assigned by the browser process.
diff --git a/content/common/service_worker/service_worker_utils_unittest.cc b/content/common/service_worker/service_worker_utils_unittest.cc index 393c36c..96564a2 100644 --- a/content/common/service_worker/service_worker_utils_unittest.cc +++ b/content/common/service_worker/service_worker_utils_unittest.cc
@@ -2,7 +2,9 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include "base/command_line.h" #include "content/common/service_worker/service_worker_utils.h" +#include "content/public/common/content_switches.h" #include "testing/gtest/include/gtest/gtest.h" namespace content { @@ -162,7 +164,7 @@ GURL("http://example.com/foo/sw.js?key/value"))); } -TEST(ServiceWorkerUtils, PathRestriction_SelfReference) { +TEST(ServiceWorkerUtilsTest, PathRestriction_SelfReference) { // Self reference is canonicalized. ASSERT_EQ(GURL("http://example.com/foo/bar"), GURL("http://example.com/././foo/bar")); @@ -352,7 +354,7 @@ GURL("http://example.com/foo/sw.js?key%5cvalue"))); } -TEST(ServiceWorkerUtils, PathRestriction_ServiceWorkerAllowed) { +TEST(ServiceWorkerUtilsTest, PathRestriction_ServiceWorkerAllowed) { // Setting header to default max scope changes nothing. EXPECT_TRUE(IsPathRestrictionSatisfiedWithServiceWorkerAllowedHeader( GURL("http://example.com/"), GURL("http://example.com/sw.js"), @@ -394,4 +396,44 @@ "")); } +TEST(ServiceWorkerUtilsTest, AllOriginsMatchAndCanAccessServiceWorkers) { + std::vector<GURL> https_same_origin = {GURL("https://example.com/1"), + GURL("https://example.com/2"), + GURL("https://example.com/3")}; + EXPECT_TRUE(ServiceWorkerUtils::AllOriginsMatchAndCanAccessServiceWorkers( + https_same_origin)); + + std::vector<GURL> http_same_origin = {GURL("http://example.com/1"), + GURL("http://example.com/2")}; + EXPECT_FALSE(ServiceWorkerUtils::AllOriginsMatchAndCanAccessServiceWorkers( + http_same_origin)); + + std::vector<GURL> localhost_same_origin = {GURL("http://localhost/1"), + GURL("http://localhost/2")}; + EXPECT_TRUE(ServiceWorkerUtils::AllOriginsMatchAndCanAccessServiceWorkers( + localhost_same_origin)); + + std::vector<GURL> filesystem_same_origin = { + GURL("https://example.com/1"), GURL("https://example.com/2"), + GURL("filesystem:https://example.com/3")}; + EXPECT_FALSE(ServiceWorkerUtils::AllOriginsMatchAndCanAccessServiceWorkers( + filesystem_same_origin)); + + std::vector<GURL> https_cross_origin = {GURL("https://example.com/1"), + GURL("https://example.org/2"), + GURL("https://example.com/3")}; + EXPECT_FALSE(ServiceWorkerUtils::AllOriginsMatchAndCanAccessServiceWorkers( + https_cross_origin)); + + // Cross-origin access is permitted with --disable-web-security. + base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); + command_line->AppendSwitch(switches::kDisableWebSecurity); + EXPECT_TRUE(ServiceWorkerUtils::AllOriginsMatchAndCanAccessServiceWorkers( + https_cross_origin)); + + // Disallowed schemes are not permitted even with --disable-web-security. + EXPECT_FALSE(ServiceWorkerUtils::AllOriginsMatchAndCanAccessServiceWorkers( + filesystem_same_origin)); +} + } // namespace content
diff --git a/content/common/typemaps_mac.gni b/content/common/typemaps_mac.gni new file mode 100644 index 0000000..a45d2402 --- /dev/null +++ b/content/common/typemaps_mac.gni
@@ -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. + +typemaps = [ "//content/common/native_types_mac.typemap" ]
diff --git a/content/common/view_messages.h b/content/common/view_messages.h index c1720c0..ffa017ce 100644 --- a/content/common/view_messages.h +++ b/content/common/view_messages.h
@@ -64,7 +64,6 @@ #include "ui/gfx/ipc/color/gfx_param_traits.h" #include "ui/gfx/ipc/gfx_param_traits.h" #include "ui/gfx/ipc/skia/gfx_skia_param_traits.h" -#include "ui/gfx/range/range.h" #if defined(OS_MACOSX) #include "third_party/WebKit/public/platform/WebScrollbarButtonsPlacement.h" @@ -362,17 +361,6 @@ IPC_STRUCT_MEMBER(int, flags) IPC_STRUCT_END() -#if defined(OS_MACOSX) -IPC_STRUCT_BEGIN(ViewMsg_UpdateScrollbarTheme_Params) - IPC_STRUCT_MEMBER(float, initial_button_delay) - IPC_STRUCT_MEMBER(float, autoscroll_button_delay) - IPC_STRUCT_MEMBER(bool, jump_on_track_click) - IPC_STRUCT_MEMBER(blink::ScrollerStyle, preferred_scroller_style) - IPC_STRUCT_MEMBER(bool, redraw) - IPC_STRUCT_MEMBER(blink::WebScrollbarButtonsPlacement, button_placement) -IPC_STRUCT_END() -#endif - // Messages sent from the browser to the renderer. #if defined(OS_ANDROID) @@ -565,12 +553,6 @@ // This message is sent only if the worker successfully loaded the script. IPC_MESSAGE_ROUTED0(ViewMsg_WorkerConnected) -// Tells the renderer that the network type has changed so that navigator.onLine -// and navigator.connection can be updated. -IPC_MESSAGE_CONTROL2(ViewMsg_NetworkConnectionChanged, - net::NetworkChangeNotifier::ConnectionType /* type */, - double /* max bandwidth mbps */) - // Sent by the browser to synchronize with the next compositor frame. Used only // for tests. IPC_MESSAGE_ROUTED1(ViewMsg_WaitForNextFrameForTests, int /* routing_id */) @@ -587,11 +569,6 @@ // or not. IPC_MESSAGE_ROUTED1(ViewMsg_PpapiBrokerPermissionResult, bool /* result */) - -// Tells the renderer to empty its plugin list cache, optional reloading -// pages containing plugins. -IPC_MESSAGE_CONTROL1(ViewMsg_PurgePluginListCache, - bool /* reload_pages */) #endif // An acknowledge to ViewHostMsg_MultipleTargetsTouched to notify the renderer @@ -602,23 +579,7 @@ // Fetches complete rendered content of a web page as plain text. IPC_MESSAGE_ROUTED0(ViewMsg_GetRenderedText) -#if defined(OS_MACOSX) -// Notification of a change in scrollbar appearance and/or behavior. -IPC_MESSAGE_CONTROL1(ViewMsg_UpdateScrollbarTheme, - ViewMsg_UpdateScrollbarTheme_Params /* params */) - -// Notification that the OS X Aqua color preferences changed. -IPC_MESSAGE_CONTROL3(ViewMsg_SystemColorsChanged, - int /* AppleAquaColorVariant */, - std::string /* AppleHighlightedTextColor */, - std::string /* AppleHighlightColor */) -#endif - #if defined(OS_ANDROID) -// Tells the renderer to suspend/resume the webkit timers. -IPC_MESSAGE_CONTROL1(ViewMsg_SetWebKitSharedTimersSuspended, - bool /* suspend */) - // Notifies the renderer whether hiding/showing the top controls is enabled // and whether or not to animate to the proper state. IPC_MESSAGE_ROUTED3(ViewMsg_UpdateTopControlsState, @@ -839,15 +800,6 @@ base::string16 /* tooltip text string */, blink::WebTextDirection /* text direction hint */) -// Notification that the text selection has changed. -// Note: The secound parameter is the character based offset of the -// base::string16 -// text in the document. -IPC_MESSAGE_ROUTED3(ViewHostMsg_SelectionChanged, - base::string16 /* text covers the selection range */, - uint32_t /* the offset of the text in the document */, - gfx::Range /* selection range in the document */) - // Notification that the selection bounds have changed. IPC_MESSAGE_ROUTED1(ViewHostMsg_SelectionBoundsChanged, ViewHostMsg_SelectionBounds_Params)
diff --git a/content/ppapi_plugin/ppapi_thread.cc b/content/ppapi_plugin/ppapi_thread.cc index ca09ba68..a719424 100644 --- a/content/ppapi_plugin/ppapi_thread.cc +++ b/content/ppapi_plugin/ppapi_thread.cc
@@ -488,10 +488,7 @@ bool incognito, IPC::ChannelHandle* handle) { DCHECK(is_broker_ == (connect_instance_func_ != NULL)); - IPC::ChannelHandle plugin_handle; - plugin_handle.name = IPC::Channel::GenerateVerifiedChannelID( - base::StringPrintf( - "%d.r%d", base::GetCurrentProcId(), renderer_child_id)); + mojo::MessagePipe pipe; ppapi::proxy::ProxyChannel* dispatcher = NULL; bool init_result = false; @@ -500,10 +497,8 @@ BrokerProcessDispatcher* broker_dispatcher = new BrokerProcessDispatcher(plugin_entry_points_.get_interface, connect_instance_func_, peer_is_browser); - init_result = broker_dispatcher->InitBrokerWithChannel(this, - renderer_pid, - plugin_handle, - false); + init_result = broker_dispatcher->InitBrokerWithChannel( + this, renderer_pid, pipe.handle0.release(), false); dispatcher = broker_dispatcher; } else { DCHECK_NE(base::kNullProcessId, renderer_pid); @@ -511,10 +506,8 @@ new PluginProcessDispatcher(plugin_entry_points_.get_interface, permissions_, incognito); - init_result = plugin_dispatcher->InitPluginWithChannel(this, - renderer_pid, - plugin_handle, - false); + init_result = plugin_dispatcher->InitPluginWithChannel( + this, renderer_pid, pipe.handle0.release(), false); dispatcher = plugin_dispatcher; } @@ -522,16 +515,7 @@ delete dispatcher; return false; } - - handle->name = plugin_handle.name; -#if defined(OS_POSIX) - // On POSIX, transfer ownership of the renderer-side (client) FD. - // This ensures this process will be notified when it is closed even if a - // connection is not established. - handle->socket = base::FileDescriptor(dispatcher->TakeRendererFD()); - if (handle->socket.fd == -1) - return false; -#endif + *handle = pipe.handle1.release(); // From here, the dispatcher will manage its own lifetime according to the // lifetime of the attached channel.
diff --git a/content/public/android/BUILD.gn b/content/public/android/BUILD.gn index b1a7563c..877df73 100644 --- a/content/public/android/BUILD.gn +++ b/content/public/android/BUILD.gn
@@ -199,6 +199,8 @@ "java/src/org/chromium/content_public/browser/InterfaceRegistrar.java", "java/src/org/chromium/content_public/browser/JavaScriptCallback.java", "java/src/org/chromium/content_public/browser/LoadUrlParams.java", + "java/src/org/chromium/content_public/browser/MessagePort.java", + "java/src/org/chromium/content_public/browser/MessagePortService.java", "java/src/org/chromium/content_public/browser/NavigationController.java", "java/src/org/chromium/content_public/browser/NavigationEntry.java", "java/src/org/chromium/content_public/browser/NavigationHistory.java",
diff --git a/content/public/android/java/src/org/chromium/content/browser/AppWebMessagePort.java b/content/public/android/java/src/org/chromium/content/browser/AppWebMessagePort.java index 9e650385..30e50d02 100644 --- a/content/public/android/java/src/org/chromium/content/browser/AppWebMessagePort.java +++ b/content/public/android/java/src/org/chromium/content/browser/AppWebMessagePort.java
@@ -9,6 +9,9 @@ import android.os.Message; import org.chromium.base.Log; +import org.chromium.content_public.browser.MessagePort; + +import java.util.Arrays; /** * Represents the MessageChannel MessagePort object. Inspired from @@ -70,15 +73,7 @@ * transferring data. As a return, it simplifies implementation and prevents hard * to debug, racy corner cases while receiving/sending data. */ -public class AppWebMessagePort implements PostMessageSender.PostMessageSenderDelegate { - /** - * The message callback for receiving messages. Called on UI thread or if - * provided, on the handler that is provided. - */ - public abstract static class MessageCallback { - public abstract void onMessage(String message, AppWebMessagePort[] sentPorts); - } - +public class AppWebMessagePort implements MessagePort, PostMessageSender.PostMessageSenderDelegate { private static final String TAG = "MessagePort"; private static final int PENDING = -1; @@ -136,6 +131,7 @@ mMessagePortService.addObserver(mPostMessageSender); } + @Override public boolean isReady() { return mPortId != PENDING; } @@ -149,6 +145,7 @@ releaseMessages(); } + @Override public void close() { if (mTransferred) { throw new IllegalStateException("Port is already transferred"); @@ -166,10 +163,12 @@ } } + @Override public boolean isClosed() { return mClosed; } + @Override public boolean isTransferred() { return mTransferred; } @@ -178,11 +177,13 @@ mTransferred = true; } + @Override public boolean isStarted() { return mStarted; } // Only called on UI thread + @Override public void setMessageCallback(MessageCallback messageCallback, Handler handler) { mStarted = true; synchronized (mLock) { @@ -228,20 +229,22 @@ } } - public void postMessage(String message, AppWebMessagePort[] sentPorts) - throws IllegalStateException { + @Override + public void postMessage(String message, MessagePort[] sentPorts) throws IllegalStateException { if (isClosed() || isTransferred()) { throw new IllegalStateException("Port is already closed or transferred"); } + AppWebMessagePort[] ports = null; if (sentPorts != null) { - for (AppWebMessagePort port : sentPorts) { + for (MessagePort port : sentPorts) { if (port.equals(this)) { throw new IllegalStateException("Source port cannot be transferred"); } } + ports = Arrays.copyOf(sentPorts, sentPorts.length, AppWebMessagePort[].class); } mStarted = true; - mPostMessageSender.postMessage(null, message, null, sentPorts); + mPostMessageSender.postMessage(null, message, null, ports); } // Implements PostMessageSender.PostMessageSenderDelegate interface method.
diff --git a/content/public/android/java/src/org/chromium/content/browser/AppWebMessagePortService.java b/content/public/android/java/src/org/chromium/content/browser/AppWebMessagePortService.java index d4f2665e..b908901 100644 --- a/content/public/android/java/src/org/chromium/content/browser/AppWebMessagePortService.java +++ b/content/public/android/java/src/org/chromium/content/browser/AppWebMessagePortService.java
@@ -10,6 +10,7 @@ import org.chromium.base.ThreadUtils; import org.chromium.base.annotations.CalledByNative; import org.chromium.base.annotations.JNINamespace; +import org.chromium.content_public.browser.MessagePortService; /** * Provides the Message Channel functionality for Android Apps @@ -33,7 +34,7 @@ * All methods are called on UI thread except as noted. */ @JNINamespace("content") -public class AppWebMessagePortService { +public class AppWebMessagePortService implements MessagePortService { private static final String TAG = "AppWebMessagePortService"; /** @@ -109,6 +110,7 @@ } } + @Override public AppWebMessagePort[] createMessageChannel() { return new AppWebMessagePort[] {new AppWebMessagePort(this), new AppWebMessagePort(this)}; }
diff --git a/content/public/android/java/src/org/chromium/content/browser/ChildProcessLauncher.java b/content/public/android/java/src/org/chromium/content/browser/ChildProcessLauncher.java index a5e78cf9..f0d37a9 100644 --- a/content/public/android/java/src/org/chromium/content/browser/ChildProcessLauncher.java +++ b/content/public/android/java/src/org/chromium/content/browser/ChildProcessLauncher.java
@@ -490,10 +490,6 @@ // Manages oom bindings used to bind chind services. private static BindingManager sBindingManager = BindingManagerImpl.createBindingManager(); - // Map from surface id to Surface. - private static Map<Integer, Surface> sViewSurfaceMap = - new ConcurrentHashMap<Integer, Surface>(); - // Map from surface texture id to Surface. private static Map<Pair<Integer, Integer>, Surface> sSurfaceTextureSurfaceMap = new ConcurrentHashMap<Pair<Integer, Integer>, Surface>(); @@ -512,32 +508,6 @@ return sBindingManager.isOomProtected(pid); } - @CalledByNative - private static void registerViewSurface(int surfaceId, Surface surface) { - if (!surface.isValid()) - throw new RuntimeException("Attempting to register invalid Surface."); - sViewSurfaceMap.put(surfaceId, surface); - } - - @CalledByNative - private static void unregisterViewSurface(int surfaceId) { - sViewSurfaceMap.remove(surfaceId); - } - - @CalledByNative - private static Surface getViewSurface(int surfaceId) { - Surface surface = sViewSurfaceMap.get(surfaceId); - if (surface == null) { - Log.e(TAG, "Invalid surfaceId."); - return null; - } - if (!surface.isValid()) { - Log.e(TAG, "Requested surface is not valid."); - return null; - } - return surface; - } - private static void registerSurfaceTextureSurface( int surfaceTextureId, int clientId, Surface surface) { Pair<Integer, Integer> key = new Pair<Integer, Integer>(surfaceTextureId, clientId); @@ -894,7 +864,7 @@ Log.e(TAG, "Illegal callback for non-GPU process."); return null; } - Surface surface = ChildProcessLauncher.getViewSurface(surfaceId); + Surface surface = ChildProcessLauncher.nativeGetViewSurface(surfaceId); if (surface == null) { return null; } @@ -1029,4 +999,5 @@ private static native void nativeCompleteScopedSurfaceRequest( long requestTokenHigh, long requestTokenLow, Surface surface); private static native boolean nativeIsSingleProcess(); + private static native Surface nativeGetViewSurface(int surfaceId); }
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 1c34c0f..5b56171 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
@@ -47,6 +47,15 @@ "ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE"; private static final int WINDOW_CONTENT_CHANGED_DELAY_MS = 500; + // Constants from AccessibilityNodeInfo defined in the M SDK. + // Source: https://developer.android.com/reference/android/R.id.html + private static final int ACTION_CONTEXT_CLICK = 0x0102003c; + private static final int ACTION_SHOW_ON_SCREEN = 0x01020036; + private static final int ACTION_SCROLL_UP = 0x01020038; + private static final int ACTION_SCROLL_DOWN = 0x0102003a; + private static final int ACTION_SCROLL_LEFT = 0x01020039; + private static final int ACTION_SCROLL_RIGHT = 0x0102003b; + private final AccessibilityNodeProvider mAccessibilityNodeProvider; private ContentViewCore mContentViewCore; private final AccessibilityManager mAccessibilityManager; @@ -328,6 +337,20 @@ // If something is collapsible or expandable, just activate it to toggle. nativeClick(mNativeObj, virtualViewId); return true; + case ACTION_SHOW_ON_SCREEN: + nativeScrollToMakeNodeVisible(mNativeObj, virtualViewId); + return true; + case ACTION_CONTEXT_CLICK: + nativeShowContextMenu(mNativeObj, virtualViewId); + return true; + case ACTION_SCROLL_UP: + return nativeScroll(mNativeObj, virtualViewId, ScrollDirection.UP); + case ACTION_SCROLL_DOWN: + return nativeScroll(mNativeObj, virtualViewId, ScrollDirection.DOWN); + case ACTION_SCROLL_LEFT: + return nativeScroll(mNativeObj, virtualViewId, ScrollDirection.LEFT); + case ACTION_SCROLL_RIGHT: + return nativeScroll(mNativeObj, virtualViewId, ScrollDirection.RIGHT); default: break; } @@ -822,6 +845,8 @@ node.addAction(AccessibilityNodeInfo.ACTION_PREVIOUS_HTML_ELEMENT); node.addAction(AccessibilityNodeInfo.ACTION_NEXT_AT_MOVEMENT_GRANULARITY); node.addAction(AccessibilityNodeInfo.ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY); + node.addAction(ACTION_SHOW_ON_SCREEN); + node.addAction(ACTION_CONTEXT_CLICK); if (editableText && enabled) { // TODO: don't support actions that modify it if it's read-only (but @@ -844,8 +869,21 @@ node.addAction(AccessibilityNodeInfo.ACTION_SCROLL_BACKWARD); } - // TODO(dmazzoni): add custom actions for scrolling up, down, - // left, and right. + if (canScrollUp) { + node.addAction(ACTION_SCROLL_UP); + } + + if (canScrollDown) { + node.addAction(ACTION_SCROLL_DOWN); + } + + if (canScrollLeft) { + node.addAction(ACTION_SCROLL_LEFT); + } + + if (canScrollRight) { + node.addAction(ACTION_SCROLL_RIGHT); + } if (focusable) { if (focused) { @@ -1152,4 +1190,6 @@ long nativeBrowserAccessibilityManagerAndroid, int id, int direction); protected native String nativeGetSupportedHtmlElementTypes( long nativeBrowserAccessibilityManagerAndroid); + private native void nativeShowContextMenu( + long nativeBrowserAccessibilityManagerAndroid, int id); }
diff --git a/content/public/android/java/src/org/chromium/content/browser/webcontents/WebContentsImpl.java b/content/public/android/java/src/org/chromium/content/browser/webcontents/WebContentsImpl.java index f241bb0..73aa41ce 100644 --- a/content/public/android/java/src/org/chromium/content/browser/webcontents/WebContentsImpl.java +++ b/content/public/android/java/src/org/chromium/content/browser/webcontents/WebContentsImpl.java
@@ -17,11 +17,14 @@ import org.chromium.base.VisibleForTesting; import org.chromium.base.annotations.CalledByNative; import org.chromium.base.annotations.JNINamespace; +import org.chromium.content.browser.AppWebMessagePort; +import org.chromium.content.browser.AppWebMessagePortService; import org.chromium.content_public.browser.AccessibilitySnapshotCallback; import org.chromium.content_public.browser.AccessibilitySnapshotNode; import org.chromium.content_public.browser.ContentBitmapCallback; import org.chromium.content_public.browser.ImageDownloadCallback; import org.chromium.content_public.browser.JavaScriptCallback; +import org.chromium.content_public.browser.MessagePortService; import org.chromium.content_public.browser.NavigationController; import org.chromium.content_public.browser.WebContents; import org.chromium.content_public.browser.WebContentsObserver; @@ -334,8 +337,18 @@ } @Override - public void sendMessageToFrame(String frameName, String message, String targetOrigin) { - nativeSendMessageToFrame(mNativeWebContentsAndroid, frameName, message, targetOrigin); + public void postMessageToFrame( + String frameName, String message, String targetOrigin, int[] sentPortIds) { + nativePostMessageToFrame( + mNativeWebContentsAndroid, frameName, message, targetOrigin, sentPortIds); + } + + @Override + public AppWebMessagePort[] createMessageChannel(MessagePortService service) + throws IllegalStateException { + AppWebMessagePort[] ports = ((AppWebMessagePortService) service).createMessageChannel(); + nativeCreateMessageChannel(mNativeWebContentsAndroid, ports); + return ports; } @Override @@ -525,8 +538,10 @@ String script, JavaScriptCallback callback); private native void nativeAddMessageToDevToolsConsole( long nativeWebContentsAndroid, int level, String message); - private native void nativeSendMessageToFrame(long nativeWebContentsAndroid, - String frameName, String message, String targetOrigin); + private native void nativePostMessageToFrame(long nativeWebContentsAndroid, String frameName, + String message, String targetOrigin, int[] sentPortIds); + private native void nativeCreateMessageChannel( + long nativeWebContentsAndroid, AppWebMessagePort[] ports); private native boolean nativeHasAccessedInitialDocument( long nativeWebContentsAndroid); private native int nativeGetThemeColor(long nativeWebContentsAndroid);
diff --git a/content/public/android/java/src/org/chromium/content_public/browser/MessagePort.java b/content/public/android/java/src/org/chromium/content_public/browser/MessagePort.java new file mode 100644 index 0000000..812894f --- /dev/null +++ b/content/public/android/java/src/org/chromium/content_public/browser/MessagePort.java
@@ -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. + +package org.chromium.content_public.browser; + +import android.os.Handler; + +/** + * Interface for message ports that handle postMessage requests. + */ +public interface MessagePort { + /** + * The message callback for receiving messages. + */ + public interface MessageCallback { + /** + * Sent when the associated {@link MessagePort} gets a postMessage. + * @param message The message that was received. + * @param sentPorts The {@link MessagePort}s that were sent if any. + */ + void onMessage(String message, MessagePort[] sentPorts); + } + + /** + * @return Whether the message port is ready for receiving + * {@link MessagePort#postMessage(String, MessagePort[])} calls. + */ + boolean isReady(); + + /** + * Close the port for use. + */ + void close(); + + /** + * @return Whether the port has been closed before. + */ + boolean isClosed(); + + /** + * @return Whether the port has been transferred using + * {@link MessagePort#postMessage(String, MessagePort[])} before. + */ + boolean isTransferred(); + + /** + * @return Whether the port has been started. + */ + boolean isStarted(); + + /** + * Sets the handler and message callback to be used for the messages received. If the given + * {@link Handler} is not null, then the callback is received on the handler thread, if not + * it is on UI thread. + * + * See {@link MessagePort.MessageCallback} + */ + void setMessageCallback(MessageCallback messageCallback, Handler handler); + + /** + * Send a postMessage request through this port to its designated receiving end. + * @param message The message to be sent. + * @param sentPorts The ports to be transferred. + */ + void postMessage(String message, MessagePort[] sentPorts); +}
diff --git a/content/public/android/java/src/org/chromium/content_public/browser/MessagePortService.java b/content/public/android/java/src/org/chromium/content_public/browser/MessagePortService.java new file mode 100644 index 0000000..8982b21 --- /dev/null +++ b/content/public/android/java/src/org/chromium/content_public/browser/MessagePortService.java
@@ -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. + +package org.chromium.content_public.browser; + +/** + * An interface for creating and managing channels with {@link MessagePort}s on both ends. + */ +public interface MessagePortService { + /** + * @return Two {@link MessagePort}s that forms the ends of a message channel created. The user + * of the API should send one of these to the main frame of the tab that should be + * receiving the messages and hold onto the other one. + */ + MessagePort[] createMessageChannel(); +}
diff --git a/content/public/android/java/src/org/chromium/content_public/browser/WebContents.java b/content/public/android/java/src/org/chromium/content_public/browser/WebContents.java index a1017bd..fce0c95c 100644 --- a/content/public/android/java/src/org/chromium/content_public/browser/WebContents.java +++ b/content/public/android/java/src/org/chromium/content_public/browser/WebContents.java
@@ -269,7 +269,16 @@ /** * Dispatches a Message event to the specified frame. */ - void sendMessageToFrame(String frameName, String message, String targetOrigin); + void postMessageToFrame( + String frameName, String message, String targetOrigin, int[] sentPortIds); + + /** + * Creates a message channel for sending postMessage requests and returns the ports for + * each end of the channel. + * @param service The message port service to register the channel with. + * @return The ports that forms the ends of the message channel created. + */ + MessagePort[] createMessageChannel(MessagePortService service); /** * Returns whether the initial empty page has been accessed by a script from another
diff --git a/content/public/browser/BUILD.gn b/content/public/browser/BUILD.gn index ddc3ee4..189d51e 100644 --- a/content/public/browser/BUILD.gn +++ b/content/public/browser/BUILD.gn
@@ -87,6 +87,7 @@ "desktop_notification_delegate.h", "devtools_agent_host.h", "devtools_agent_host_client.h", + "devtools_agent_host_observer.h", "devtools_external_agent_proxy.h", "devtools_external_agent_proxy_delegate.h", "devtools_frontend_host.h", @@ -195,6 +196,7 @@ "render_widget_host_view.h", "render_widget_host_view_frame_subscriber.h", "render_widget_host_view_mac_delegate.h", + "renderer_unresponsive_type.h", "resource_context.h", "resource_controller.h", "resource_dispatcher_host.cc", @@ -258,6 +260,8 @@ "web_contents_media_capture_id.h", "web_contents_observer.cc", "web_contents_observer.h", + "web_contents_unresponsive_state.cc", + "web_contents_unresponsive_state.h", "web_contents_user_data.h", "web_contents_view_delegate.cc", "web_contents_view_delegate.h",
diff --git a/content/public/browser/devtools_agent_host.h b/content/public/browser/devtools_agent_host.h index 3f09618..04c0ca5 100644 --- a/content/public/browser/devtools_agent_host.h +++ b/content/public/browser/devtools_agent_host.h
@@ -15,6 +15,7 @@ #include "base/time/time.h" #include "content/common/content_export.h" #include "content/public/browser/devtools_agent_host_client.h" +#include "content/public/browser/devtools_agent_host_observer.h" #include "url/gurl.h" namespace base { @@ -124,6 +125,10 @@ // Stops remote debugging. static void StopRemoteDebuggingServer(); + // Observer is notified about changes in DevToolsAgentHosts. + static void AddObserver(DevToolsAgentHostObserver*); + static void RemoveObserver(DevToolsAgentHostObserver*); + // Attaches |client| to this agent host to start debugging. // Returns true iff attach succeeded. virtual bool AttachClient(DevToolsAgentHostClient* client) = 0; @@ -201,12 +206,6 @@ // Terminates all debugging sessions and detaches all clients. static void DetachAllClients(); - typedef base::Callback<void(DevToolsAgentHost*, bool attached)> - AgentStateCallback; - - static void AddAgentStateCallback(const AgentStateCallback& callback); - static void RemoveAgentStateCallback(const AgentStateCallback& callback); - protected: friend class base::RefCounted<DevToolsAgentHost>; virtual ~DevToolsAgentHost() {}
diff --git a/content/public/browser/devtools_agent_host_observer.h b/content/public/browser/devtools_agent_host_observer.h new file mode 100644 index 0000000..c23f96b3 --- /dev/null +++ b/content/public/browser/devtools_agent_host_observer.h
@@ -0,0 +1,25 @@ +// 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_PUBLIC_BROWSER_DEVTOOLS_AGENT_HOST_OBSERVER_H_ +#define CONTENT_PUBLIC_BROWSER_DEVTOOLS_AGENT_HOST_OBSERVER_H_ + +#include "content/common/content_export.h" + +namespace content { + +class DevToolsAgentHost; + +// Observer API notifies interested parties about changes in DevToolsAgentHosts. +class CONTENT_EXPORT DevToolsAgentHostObserver { + public: + virtual ~DevToolsAgentHostObserver() {} + + virtual void DevToolsAgentHostAttached(DevToolsAgentHost* agent_host) {} + virtual void DevToolsAgentHostDetached(DevToolsAgentHost* agent_host) {} +}; + +} // namespace content + +#endif // CONTENT_PUBLIC_BROWSER_DEVTOOLS_AGENT_HOST_OBSERVER_H_
diff --git a/content/public/browser/devtools_manager_delegate.cc b/content/public/browser/devtools_manager_delegate.cc index 3e31453..b4d12ed 100644 --- a/content/public/browser/devtools_manager_delegate.cc +++ b/content/public/browser/devtools_manager_delegate.cc
@@ -10,10 +10,6 @@ void DevToolsManagerDelegate::Inspect(DevToolsAgentHost* agent_host) { } -void DevToolsManagerDelegate::DevToolsAgentStateChanged( - DevToolsAgentHost* agent_host, bool attached) { -} - std::string DevToolsManagerDelegate::GetTargetType(RenderFrameHost* host) { return std::string(); }
diff --git a/content/public/browser/devtools_manager_delegate.h b/content/public/browser/devtools_manager_delegate.h index 165b233..7f235572 100644 --- a/content/public/browser/devtools_manager_delegate.h +++ b/content/public/browser/devtools_manager_delegate.h
@@ -25,9 +25,6 @@ // Opens the inspector for |agent_host|. virtual void Inspect(DevToolsAgentHost* agent_host); - virtual void DevToolsAgentStateChanged(DevToolsAgentHost* agent_host, - bool attached); - // Returns DevToolsAgentHost type to use for given |host| target. virtual std::string GetTargetType(RenderFrameHost* host);
diff --git a/content/public/browser/gpu_utils.cc b/content/public/browser/gpu_utils.cc index a28e4ae..d537c35 100644 --- a/content/public/browser/gpu_utils.cc +++ b/content/public/browser/gpu_utils.cc
@@ -45,7 +45,9 @@ #endif #if defined(ENABLE_WEBRTC) gpu_preferences.disable_web_rtc_hw_encoding = - command_line->HasSwitch(switches::kDisableWebRtcHWEncoding); + command_line->HasSwitch(switches::kDisableWebRtcHWEncoding) && + command_line->GetSwitchValueASCII(switches::kDisableWebRtcHWEncoding) + .empty(); #endif #if defined(OS_WIN) uint32_t enable_accelerated_vpx_decode_val =
diff --git a/content/public/browser/renderer_unresponsive_type.h b/content/public/browser/renderer_unresponsive_type.h new file mode 100644 index 0000000..34fa884ee --- /dev/null +++ b/content/public/browser/renderer_unresponsive_type.h
@@ -0,0 +1,27 @@ +// 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 CONTENT_PUBLIC_BROWSER_RENDERER_UNRESPONSIVE_TYPE_H_ +#define CONTENT_PUBLIC_BROWSER_RENDERER_UNRESPONSIVE_TYPE_H_ + +#include "content/common/content_export.h" + +namespace content { + +// Used in histograms to differentiate between the different types of +// renderer hang. Only add values at the end, do not delete values. +enum RendererUnresponsiveType { + RENDERER_UNRESPONSIVE_UNKNOWN = 0, + RENDERER_UNRESPONSIVE_IN_FLIGHT_EVENTS = 1, + RENDERER_UNRESPONSIVE_DIALOG_CLOSED = 2, + RENDERER_UNRESPONSIVE_DIALOG_SUPPRESSED = 3, + RENDERER_UNRESPONSIVE_BEFORE_UNLOAD = 4, + RENDERER_UNRESPONSIVE_UNLOAD = 5, + RENDERER_UNRESPONSIVE_CLOSE_PAGE = 6, + RENDERER_UNRESPONSIVE_MAX = RENDERER_UNRESPONSIVE_CLOSE_PAGE, +}; + +} // namespace content + +#endif // CONTENT_PUBLIC_BROWSER_RENDERER_UNRESPONSIVE_TYPE_H_
diff --git a/content/public/browser/service_worker_context.h b/content/public/browser/service_worker_context.h index 47f355c..c095f9d 100644 --- a/content/public/browser/service_worker_context.h +++ b/content/public/browser/service_worker_context.h
@@ -23,15 +23,18 @@ public: // https://rawgithub.com/slightlyoff/ServiceWorker/master/spec/service_worker/index.html#url-scope: // roughly, must be of the form "<origin>/<path>/*". - typedef GURL Scope; + using Scope = GURL; - typedef base::Callback<void(bool success)> ResultCallback; + using ResultCallback = base::Callback<void(bool success)>; - typedef base::Callback<void(const std::vector<ServiceWorkerUsageInfo>& - usage_info)> GetUsageInfoCallback; + using GetUsageInfoCallback = base::Callback<void( + const std::vector<ServiceWorkerUsageInfo>& usage_info)>; - typedef base::Callback<void(bool has_service_worker)> - CheckHasServiceWorkerCallback; + using CheckHasServiceWorkerCallback = + base::Callback<void(bool has_service_worker)>; + + using CountExternalRequestsCallback = + base::Callback<void(size_t external_request_count)>; // Registers the header name which should not be passed to the ServiceWorker. // Must be called from the IO thread. @@ -60,6 +63,21 @@ const GURL& script_url, const ResultCallback& callback) = 0; + // Mechanism for embedder to increment/decrement ref count of a service + // worker. + // Embedders can call StartingExternalRequest() while it is performing some + // work with the worker. The worker is considered to be working until embedder + // calls FinishedExternalRequest(). This ensures that content/ does not + // shut the worker down while embedder is expecting the worker to be kept + // alive. + // + // Must be called from the IO thread. Returns whether or not changing the ref + // count succeeded. + virtual bool StartingExternalRequest(int64_t service_worker_version_id, + const std::string& request_uuid) = 0; + virtual bool FinishedExternalRequest(int64_t service_worker_version_id, + const std::string& request_uuid) = 0; + // Equivalent to calling navigator.serviceWorker.unregister(pattern) from a // renderer, except that |pattern| is an absolute URL instead of relative to // some current origin. |callback| is passed true when the JS promise is @@ -96,6 +114,12 @@ const GURL& other_url, const CheckHasServiceWorkerCallback& callback) = 0; + // Returns the pending external request count for the worker with the + // specified |origin| via |callback|. + virtual void CountExternalRequestsForTest( + const GURL& origin, + const CountExternalRequestsCallback& callback) = 0; + // Stops all running workers on the given |origin|. // // This function can be called from any thread.
diff --git a/content/public/browser/web_contents_delegate.h b/content/public/browser/web_contents_delegate.h index d6e7139..538d30f 100644 --- a/content/public/browser/web_contents_delegate.h +++ b/content/public/browser/web_contents_delegate.h
@@ -79,6 +79,7 @@ class RenderWidgetHost; struct OpenURLParams; +struct WebContentsUnresponsiveState; // Objects implement this interface to get notified about changes in the // WebContents and to provide necessary functionality. @@ -111,7 +112,7 @@ // Called to inform the delegate that the WebContent's visible SSL state (as // defined by SSLStatus) changed. - virtual void VisibleSSLStateChanged(const WebContents* source) {} + virtual void VisibleSSLStateChanged(WebContents* source) {} // Creates a new tab with the already-created WebContents 'new_contents'. // The window for the added contents should be reparented correctly when this @@ -321,7 +322,9 @@ WebContents* new_contents) {} // Notification that the tab is hung. - virtual void RendererUnresponsive(WebContents* source) {} + virtual void RendererUnresponsive( + WebContents* source, + const WebContentsUnresponsiveState& unresponsive_state) {} // Notification that the tab is no longer hung. virtual void RendererResponsive(WebContents* source) {}
diff --git a/content/public/browser/web_contents_unresponsive_state.cc b/content/public/browser/web_contents_unresponsive_state.cc new file mode 100644 index 0000000..8a97780 --- /dev/null +++ b/content/public/browser/web_contents_unresponsive_state.cc
@@ -0,0 +1,14 @@ +// 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 "content/public/browser/web_contents_unresponsive_state.h" + +namespace content { + +WebContentsUnresponsiveState::WebContentsUnresponsiveState() + : reason(RendererUnresponsiveType::RENDERER_UNRESPONSIVE_UNKNOWN), + outstanding_ack_count(0), + last_event_type(blink::WebInputEvent::Undefined) {} + +} // namespace content
diff --git a/content/public/browser/web_contents_unresponsive_state.h b/content/public/browser/web_contents_unresponsive_state.h new file mode 100644 index 0000000..8231d095 --- /dev/null +++ b/content/public/browser/web_contents_unresponsive_state.h
@@ -0,0 +1,35 @@ +// 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 CONTENT_PUBLIC_BROWSER_WEB_CONTENTS_UNRESPONSIVE_STATE_H_ +#define CONTENT_PUBLIC_BROWSER_WEB_CONTENTS_UNRESPONSIVE_STATE_H_ + +#include "content/common/content_export.h" +#include "content/public/browser/renderer_unresponsive_type.h" +#include "third_party/WebKit/public/platform/WebInputEvent.h" + +namespace content { + +// Contains a variety of information regarding the state +// at which a renderer was marked as unresponsive. Some of +// this information may be provided in a crash report. +struct CONTENT_EXPORT WebContentsUnresponsiveState { + WebContentsUnresponsiveState(); + + // The reason why the renderer was unresponsive. + RendererUnresponsiveType reason; + + // TODO(dtapuska): Remove these fields once crbug.com/615090 is fixed. + // The number of outstanding blocking input events sent to the renderer + // that have not be acknowledged. + size_t outstanding_ack_count; + // The input event type that started the unresponsive state timeout. + blink::WebInputEvent::Type outstanding_event_type; + // The last blocking input event type sent to the renderer. + blink::WebInputEvent::Type last_event_type; +}; + +} // namespace content + +#endif // CONTENT_PUBLIC_BROWSER_WEB_CONTENTS_UNRESPONSIVE_STATE_H_
diff --git a/content/public/common/content_features.cc b/content/public/common/content_features.cc index db686ca2..426ef7b 100644 --- a/content/public/common/content_features.cc +++ b/content/public/common/content_features.cc
@@ -65,7 +65,7 @@ // same-origin to the top frame, or if a user gesture is being processed. const base::Feature kFramebustingNeedsSameOriginOrUserGesture{ "FramebustingNeedsSameOriginOrUserGesture", - base::FEATURE_ENABLED_BY_DEFAULT}; + base::FEATURE_DISABLED_BY_DEFAULT}; // Enables extended Gamepad API features like motion tracking and haptics. const base::Feature kGamepadExtensions{"GamepadExtensions",
diff --git a/content/public/common/content_switches.cc b/content/public/common/content_switches.cc index 95d7544..724f892 100644 --- a/content/public/common/content_switches.cc +++ b/content/public/common/content_switches.cc
@@ -909,6 +909,9 @@ // Disables HW encode acceleration for WebRTC. const char kDisableWebRtcHWEncoding[] = "disable-webrtc-hw-encoding"; +const char kDisableWebRtcHWEncodingVPx[] = "vpx"; +const char kDisableWebRtcHWEncodingH264[] = "h264"; +const char kDisableWebRtcHWEncodingNone[] = "none"; // Enables H264 HW encode acceleration for WebRTC. const char kEnableWebRtcHWH264Encoding[] = "enable-webrtc-hw-h264-encoding";
diff --git a/content/public/common/content_switches.h b/content/public/common/content_switches.h index d6f16f47..38334653 100644 --- a/content/public/common/content_switches.h +++ b/content/public/common/content_switches.h
@@ -262,6 +262,9 @@ CONTENT_EXPORT extern const char kDisableWebRtcHWDecoding[]; CONTENT_EXPORT extern const char kDisableWebRtcEncryption[]; CONTENT_EXPORT extern const char kDisableWebRtcHWEncoding[]; +CONTENT_EXPORT extern const char kDisableWebRtcHWEncodingVPx[]; +CONTENT_EXPORT extern const char kDisableWebRtcHWEncodingH264[]; +CONTENT_EXPORT extern const char kDisableWebRtcHWEncodingNone[]; CONTENT_EXPORT extern const char kEnableWebRtcHWH264Encoding[]; CONTENT_EXPORT extern const char kEnableWebRtcStunOrigin[]; CONTENT_EXPORT extern const char kEnforceWebRtcIPPermissionCheck[];
diff --git a/content/public/renderer/content_renderer_client.h b/content/public/renderer/content_renderer_client.h index fc9fba9..32c5092 100644 --- a/content/public/renderer/content_renderer_client.h +++ b/content/public/renderer/content_renderer_client.h
@@ -346,14 +346,14 @@ // is called from the worker thread. virtual void DidInitializeServiceWorkerContextOnWorkerThread( v8::Local<v8::Context> context, - int embedded_worker_id, + int64_t service_worker_version_id, const GURL& url) {} // Notifies that a service worker context will be destroyed. This function // is called from the worker thread. virtual void WillDestroyServiceWorkerContextOnWorkerThread( v8::Local<v8::Context> context, - int embedded_worker_id, + int64_t service_worker_version_id, const GURL& url) {} // Whether this renderer should enforce preferences related to the WebRTC
diff --git a/content/renderer/cache_storage/cache_storage_dispatcher.cc b/content/renderer/cache_storage/cache_storage_dispatcher.cc index 1fefe44..26f84fc3 100644 --- a/content/renderer/cache_storage/cache_storage_dispatcher.cc +++ b/content/renderer/cache_storage/cache_storage_dispatcher.cc
@@ -261,8 +261,6 @@ OnCacheStorageOpenError) IPC_MESSAGE_HANDLER(CacheStorageMsg_CacheStorageDeleteError, OnCacheStorageDeleteError) - IPC_MESSAGE_HANDLER(CacheStorageMsg_CacheStorageKeysError, - OnCacheStorageKeysError) IPC_MESSAGE_HANDLER(CacheStorageMsg_CacheStorageMatchError, OnCacheStorageMatchError) IPC_MESSAGE_HANDLER(CacheStorageMsg_CacheMatchSuccess, @@ -394,18 +392,6 @@ delete_times_.erase(request_id); } -void CacheStorageDispatcher::OnCacheStorageKeysError( - int thread_id, - int request_id, - blink::WebServiceWorkerCacheError reason) { - DCHECK_EQ(thread_id, CurrentWorkerId()); - WebServiceWorkerCacheStorage::CacheStorageKeysCallbacks* callbacks = - keys_callbacks_.Lookup(request_id); - callbacks->onError(reason); - keys_callbacks_.Remove(request_id); - keys_times_.erase(request_id); -} - void CacheStorageDispatcher::OnCacheStorageMatchError( int thread_id, int request_id,
diff --git a/content/renderer/cache_storage/cache_storage_dispatcher.h b/content/renderer/cache_storage/cache_storage_dispatcher.h index 26f0592..6c810a0 100644 --- a/content/renderer/cache_storage/cache_storage_dispatcher.h +++ b/content/renderer/cache_storage/cache_storage_dispatcher.h
@@ -70,9 +70,6 @@ void OnCacheStorageDeleteError(int thread_id, int request_id, blink::WebServiceWorkerCacheError reason); - void OnCacheStorageKeysError(int thread_id, - int request_id, - blink::WebServiceWorkerCacheError reason); void OnCacheStorageMatchError(int thread_id, int request_id, blink::WebServiceWorkerCacheError reason);
diff --git a/content/renderer/devtools/devtools_client.cc b/content/renderer/devtools/devtools_client.cc index edc31a3..cfa785bf 100644 --- a/content/renderer/devtools/devtools_client.cc +++ b/content/renderer/devtools/devtools_client.cc
@@ -29,6 +29,7 @@ compatibility_script_(compatibility_script), web_tools_frontend_( WebDevToolsFrontend::create(main_render_frame->GetWebFrame(), this)) { + compatibility_script_ += "\n//# sourceURL=devtools_compatibility.js"; } DevToolsClient::~DevToolsClient() {
diff --git a/content/renderer/media/audio_device_factory.cc b/content/renderer/media/audio_device_factory.cc index f4acdbf6..2b06de4 100644 --- a/content/renderer/media/audio_device_factory.cc +++ b/content/renderer/media/audio_device_factory.cc
@@ -32,6 +32,8 @@ // In this case we will time out, to avoid renderer hang forever waiting for // device authorization (http://crbug/615589). This will result in "no audio". const int64_t kMaxAuthorizationTimeoutMs = 1000; +#elif defined(OS_MACOSX) +const int64_t kMaxAuthorizationTimeoutMs = 2000; #else const int64_t kMaxAuthorizationTimeoutMs = 0; // No timeout. #endif // defined(OS_WIN)
diff --git a/content/renderer/media/gpu/rtc_video_encoder_factory.cc b/content/renderer/media/gpu/rtc_video_encoder_factory.cc index f27cc61..4e4f5b7b 100644 --- a/content/renderer/media/gpu/rtc_video_encoder_factory.cc +++ b/content/renderer/media/gpu/rtc_video_encoder_factory.cc
@@ -15,6 +15,15 @@ namespace content { namespace { +bool IsCodecDisabledByCommandLine(const base::CommandLine* cmd_line, + const std::string codec_name) { + if (!cmd_line->HasSwitch(switches::kDisableWebRtcHWEncoding)) + return false; + + const std::string codec_filter = + cmd_line->GetSwitchValueASCII(switches::kDisableWebRtcHWEncoding); + return codec_filter.empty() || codec_filter == codec_name; +} // Translate from media::VideoEncodeAccelerator::SupportedProfile to // one or more instances of cricket::WebRtcVideoEncoderFactory::VideoCodec @@ -29,8 +38,11 @@ const base::CommandLine* cmd_line = base::CommandLine::ForCurrentProcess(); if (profile.profile >= media::VP8PROFILE_MIN && profile.profile <= media::VP8PROFILE_MAX) { - codecs->push_back(cricket::WebRtcVideoEncoderFactory::VideoCodec( - webrtc::kVideoCodecVP8, "VP8", width, height, fps)); + if (!IsCodecDisabledByCommandLine(cmd_line, + switches::kDisableWebRtcHWEncodingVPx)) { + codecs->push_back(cricket::WebRtcVideoEncoderFactory::VideoCodec( + webrtc::kVideoCodecVP8, "VP8", width, height, fps)); + } } else if (profile.profile >= media::H264PROFILE_MIN && profile.profile <= media::H264PROFILE_MAX) { // Enable H264 HW encode for WebRTC when SW fallback is available, which is @@ -44,7 +56,9 @@ base::FeatureList::IsEnabled(kWebRtcH264WithOpenH264FFmpeg); #endif // BUILDFLAG(RTC_USE_H264) && !defined(MEDIA_DISABLE_FFMPEG) if (cmd_line->HasSwitch(switches::kEnableWebRtcHWH264Encoding) || - webrtc_h264_sw_enabled) { + webrtc_h264_sw_enabled || + !IsCodecDisabledByCommandLine(cmd_line, + switches::kDisableWebRtcHWEncodingH264)) { codecs->push_back(cricket::WebRtcVideoEncoderFactory::VideoCodec( webrtc::kVideoCodecH264, "H264", width, height, fps)); }
diff --git a/content/renderer/media/webrtc/media_stream_remote_video_source_unittest.cc b/content/renderer/media/webrtc/media_stream_remote_video_source_unittest.cc index 5222b3e6..f132925 100644 --- a/content/renderer/media/webrtc/media_stream_remote_video_source_unittest.cc +++ b/content/renderer/media/webrtc/media_stream_remote_video_source_unittest.cc
@@ -132,7 +132,7 @@ buffer->SetToBlack(); source()->SinkInterfaceForTest()->OnFrame( - cricket::WebRtcVideoFrame(buffer, 1, webrtc::kVideoRotation_0)); + cricket::WebRtcVideoFrame(buffer, webrtc::kVideoRotation_0, 1000)); run_loop.Run(); EXPECT_EQ(1, sink.number_of_frames());
diff --git a/content/renderer/media/webrtc/peer_connection_dependency_factory.cc b/content/renderer/media/webrtc/peer_connection_dependency_factory.cc index df31b7cd..f503eeb 100644 --- a/content/renderer/media/webrtc/peer_connection_dependency_factory.cc +++ b/content/renderer/media/webrtc/peer_connection_dependency_factory.cc
@@ -238,8 +238,11 @@ if (!cmd_line->HasSwitch(switches::kDisableWebRtcHWDecoding)) decoder_factory.reset(new RTCVideoDecoderFactory(gpu_factories)); - if (!cmd_line->HasSwitch(switches::kDisableWebRtcHWEncoding)) + if (!cmd_line->HasSwitch(switches::kDisableWebRtcHWEncoding) || + !cmd_line->GetSwitchValueASCII(switches::kDisableWebRtcHWEncoding) + .empty()) { encoder_factory.reset(new RTCVideoEncoderFactory(gpu_factories)); + } } #if defined(OS_ANDROID)
diff --git a/content/renderer/pepper/host_dispatcher_wrapper.cc b/content/renderer/pepper/host_dispatcher_wrapper.cc index 88d567a..75b58ef 100644 --- a/content/renderer/pepper/host_dispatcher_wrapper.cc +++ b/content/renderer/pepper/host_dispatcher_wrapper.cc
@@ -37,15 +37,9 @@ PP_GetInterface_Func local_get_interface, const ppapi::Preferences& preferences, scoped_refptr<PepperHungPluginFilter> filter) { - if (channel_handle.name.empty()) + if (!channel_handle.is_mojo_channel_handle()) return false; -#if defined(OS_POSIX) - DCHECK_NE(-1, channel_handle.socket.fd); - if (channel_handle.socket.fd == -1) - return false; -#endif - dispatcher_delegate_.reset(new PepperProxyChannelDelegateImpl); dispatcher_.reset(new ppapi::proxy::HostDispatcher( module_->pp_module(), local_get_interface, permissions_));
diff --git a/content/renderer/pepper/pepper_broker.cc b/content/renderer/pepper/pepper_broker.cc index 765e7b3..2651d0e 100644 --- a/content/renderer/pepper/pepper_broker.cc +++ b/content/renderer/pepper/pepper_broker.cc
@@ -54,15 +54,9 @@ bool PepperBrokerDispatcherWrapper::Init( base::ProcessId broker_pid, const IPC::ChannelHandle& channel_handle) { - if (channel_handle.name.empty()) + if (!channel_handle.is_mojo_channel_handle()) return false; -#if defined(OS_POSIX) - DCHECK_NE(-1, channel_handle.socket.fd); - if (channel_handle.socket.fd == -1) - return false; -#endif - dispatcher_delegate_.reset(new PepperProxyChannelDelegateImpl); dispatcher_.reset(new ppapi::proxy::BrokerHostDispatcher());
diff --git a/content/renderer/pepper/pepper_broker_unittest.cc b/content/renderer/pepper/pepper_broker_unittest.cc index d7949d8..62c2574a 100644 --- a/content/renderer/pepper/pepper_broker_unittest.cc +++ b/content/renderer/pepper/pepper_broker_unittest.cc
@@ -39,23 +39,10 @@ // On valid ChannelHandle, initialization should succeed. TEST_F(PepperBrokerTest, InitSuccess) { PepperBrokerDispatcherWrapper dispatcher_wrapper; - const char kChannelName[] = "PepperHelperImplTestChannelName"; -#if defined(OS_POSIX) - int fds[2] = {-1, -1}; - ASSERT_EQ(0, socketpair(AF_UNIX, SOCK_STREAM, 0, fds)); - // Channel::ChannelImpl::CreatePipe needs the fd to be non-blocking. - ASSERT_EQ(0, fcntl(fds[1], F_SETFL, O_NONBLOCK)); - base::FileDescriptor file_descriptor(fds[1], true); // Auto close. - IPC::ChannelHandle valid_channel(kChannelName, file_descriptor); -#else - IPC::ChannelHandle valid_channel(kChannelName); -#endif // defined(OS_POSIX)); + mojo::MessagePipe pipe; + IPC::ChannelHandle valid_channel(pipe.handle0.release()); EXPECT_TRUE(dispatcher_wrapper.Init(base::kNullProcessId, valid_channel)); - -#if defined(OS_POSIX) - EXPECT_EQ(0, ::close(fds[0])); -#endif // defined(OS_POSIX)); } } // namespace content
diff --git a/content/renderer/pepper/plugin_instance_throttler_impl.cc b/content/renderer/pepper/plugin_instance_throttler_impl.cc index 5b1f9eaf..b525309 100644 --- a/content/renderer/pepper/plugin_instance_throttler_impl.cc +++ b/content/renderer/pepper/plugin_instance_throttler_impl.cc
@@ -71,7 +71,8 @@ weak_factory_(this) {} PluginInstanceThrottlerImpl::~PluginInstanceThrottlerImpl() { - FOR_EACH_OBSERVER(Observer, observer_list_, OnThrottlerDestroyed()); + for (auto& observer : observer_list_) + observer.OnThrottlerDestroyed(); if (state_ != THROTTLER_STATE_MARKED_ESSENTIAL) RecordUnthrottleMethodMetric(UNTHROTTLE_METHOD_NEVER); } @@ -101,15 +102,19 @@ state_ = THROTTLER_STATE_MARKED_ESSENTIAL; RecordUnthrottleMethodMetric(method); - FOR_EACH_OBSERVER(Observer, observer_list_, OnPeripheralStateChange()); + for (auto& observer : observer_list_) + observer.OnPeripheralStateChange(); - if (was_throttled) - FOR_EACH_OBSERVER(Observer, observer_list_, OnThrottleStateChange()); + if (was_throttled) { + for (auto& observer : observer_list_) + observer.OnThrottleStateChange(); + } } void PluginInstanceThrottlerImpl::SetHiddenForPlaceholder(bool hidden) { is_hidden_for_placeholder_ = hidden; - FOR_EACH_OBSERVER(Observer, observer_list_, OnHiddenForPlaceholder(hidden)); + for (auto& observer : observer_list_) + observer.OnHiddenForPlaceholder(hidden); } PepperWebPluginImpl* PluginInstanceThrottlerImpl::GetWebPlugin() const { @@ -151,7 +156,8 @@ if (status != RenderFrame::CONTENT_STATUS_PERIPHERAL) { DCHECK_NE(THROTTLER_STATE_MARKED_ESSENTIAL, state_); state_ = THROTTLER_STATE_MARKED_ESSENTIAL; - FOR_EACH_OBSERVER(Observer, observer_list_, OnPeripheralStateChange()); + for (auto& observer : observer_list_) + observer.OnPeripheralStateChange(); if (status == RenderFrame::CONTENT_STATUS_ESSENTIAL_CROSS_ORIGIN_BIG) frame->WhitelistContentOrigin(content_origin); @@ -213,15 +219,16 @@ return; if (!last_received_frame_.empty()) { - FOR_EACH_OBSERVER(Observer, observer_list_, - OnKeyframeExtracted(&last_received_frame_)); + for (auto& observer : observer_list_) + observer.OnKeyframeExtracted(&last_received_frame_); // Release our reference to the underlying pixel data. last_received_frame_.reset(); } state_ = THROTTLER_STATE_PLUGIN_THROTTLED; - FOR_EACH_OBSERVER(Observer, observer_list_, OnThrottleStateChange()); + for (auto& observer : observer_list_) + observer.OnThrottleStateChange(); } } // namespace content
diff --git a/content/renderer/pepper/plugin_module.cc b/content/renderer/pepper/plugin_module.cc index 4afc90b..1344480 100644 --- a/content/renderer/pepper/plugin_module.cc +++ b/content/renderer/pepper/plugin_module.cc
@@ -801,7 +801,7 @@ int plugin_child_id = 0; render_frame->Send(new FrameHostMsg_OpenChannelToPepperPlugin( path, &channel_handle, &peer_pid, &plugin_child_id)); - if (channel_handle.name.empty()) { + if (!channel_handle.is_mojo_channel_handle()) { // Couldn't be initialized. return scoped_refptr<PluginModule>(); }
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc index 8f75c8c8..a97f03a 100644 --- a/content/renderer/render_frame_impl.cc +++ b/content/renderer/render_frame_impl.cc
@@ -229,7 +229,6 @@ #include "content/renderer/media/android/stream_texture_wrapper_impl.h" #include "content/renderer/media/android/webmediaplayer_android.h" #include "media/base/android/media_codec_util.h" -#include "media/mojo/clients/mojo_renderer_factory.h" // nogncheck #include "third_party/WebKit/public/platform/WebFloatPoint.h" #endif @@ -1164,8 +1163,10 @@ file_chooser_completions_.pop_front(); } - FOR_EACH_OBSERVER(RenderFrameObserver, observers_, RenderFrameGone()); - FOR_EACH_OBSERVER(RenderFrameObserver, observers_, OnDestruct()); + for (auto& observer : observers_) + observer.RenderFrameGone(); + for (auto& observer : observers_) + observer.OnDestruct(); base::trace_event::TraceLog::GetInstance()->RemoveProcessLabel(routing_id_); @@ -1267,8 +1268,8 @@ #if defined(ENABLE_PLUGINS) void RenderFrameImpl::PepperPluginCreated(RendererPpapiHost* host) { - FOR_EACH_OBSERVER(RenderFrameObserver, observers_, - DidCreatePepperPlugin(host)); + for (auto& observer : observers_) + observer.DidCreatePepperPlugin(host); } void RenderFrameImpl::PepperDidChangeCursor( @@ -1529,7 +1530,7 @@ OnCustomContextMenuAction) #if defined(ENABLE_PLUGINS) IPC_MESSAGE_HANDLER(FrameMsg_SetPepperVolume, OnSetPepperVolume) -#endif //defined(ENABLE_PLUGINS) +#endif // defined(ENABLE_PLUGINS) IPC_MESSAGE_HANDLER(InputMsg_Undo, OnUndo) IPC_MESSAGE_HANDLER(InputMsg_Redo, OnRedo) IPC_MESSAGE_HANDLER(InputMsg_Cut, OnCut) @@ -2142,8 +2143,8 @@ if (accessibility_mode_ & AccessibilityModeFlagFullTree) render_accessibility_ = new RenderAccessibilityImpl(this); - FOR_EACH_OBSERVER(RenderFrameObserver, observers_, - AccessibilityModeChanged()); + for (auto& observer : observers_) + observer.AccessibilityModeChanged(); } void RenderFrameImpl::OnSnapshotAccessibilityTree(int callback_id) { @@ -2375,15 +2376,15 @@ void RenderFrameImpl::DidMeaningfulLayout( blink::WebMeaningfulLayout layout_type) { - FOR_EACH_OBSERVER(RenderFrameObserver, observers_, - DidMeaningfulLayout(layout_type)); + for (auto& observer : observers_) + observer.DidMeaningfulLayout(layout_type); } void RenderFrameImpl::DidCommitCompositorFrame() { if (BrowserPluginManager::Get()) BrowserPluginManager::Get()->DidCommitCompositorFrame(GetRoutingID()); - FOR_EACH_OBSERVER( - RenderFrameObserver, observers_, DidCommitCompositorFrame()); + for (auto& observer : observers_) + observer.DidCommitCompositorFrame(); } void RenderFrameImpl::DidCommitAndDrawCompositorFrame() { @@ -2566,11 +2567,8 @@ void RenderFrameImpl::SetSelectedText(const base::string16& selection_text, size_t offset, const gfx::Range& range) { - // Use the routing id of Render Widget Host. - Send(new ViewHostMsg_SelectionChanged(GetRenderWidget()->routing_id(), - selection_text, - static_cast<uint32_t>(offset), - range)); + Send(new FrameHostMsg_SelectionChanged(routing_id_, selection_text, + static_cast<uint32_t>(offset), range)); } void RenderFrameImpl::EnsureMojoBuiltinsAreAvailable( @@ -2981,9 +2979,10 @@ GetRenderWidget()->set_focused_pepper_plugin(nullptr); #endif - FOR_EACH_OBSERVER(RenderFrameObserver, observers_, FrameDetached()); - FOR_EACH_OBSERVER(RenderViewObserver, render_view_->observers(), - FrameDetached(frame)); + for (auto& observer : observers_) + observer.FrameDetached(); + for (auto& observer : render_view_->observers()) + observer.FrameDetached(frame); // Send a state update before the frame is detached. if (SiteIsolationPolicy::UseSubframeNavigationEntries()) @@ -3035,8 +3034,8 @@ void RenderFrameImpl::willCommitProvisionalLoad(blink::WebLocalFrame* frame) { DCHECK_EQ(frame_, frame); - FOR_EACH_OBSERVER(RenderFrameObserver, observers_, - WillCommitProvisionalLoad()); + for (auto& observer : observers_) + observer.WillCommitProvisionalLoad(); } void RenderFrameImpl::didChangeName(const blink::WebString& name, @@ -3105,9 +3104,8 @@ const blink::WebVector<blink::WebString>& stopped_matching_selectors) { DCHECK_EQ(frame_, frame); - FOR_EACH_OBSERVER(RenderFrameObserver, observers_, - DidMatchCSS(newly_matching_selectors, - stopped_matching_selectors)); + for (auto& observer : observers_) + observer.DidMatchCSS(newly_matching_selectors, stopped_matching_selectors); } bool RenderFrameImpl::shouldReportDetailedMessageForSource( @@ -3141,10 +3139,11 @@ } if (shouldReportDetailedMessageForSource(source_name)) { - FOR_EACH_OBSERVER(RenderFrameObserver, observers_, - DetailedConsoleMessageAdded( - message.text, source_name, stack_trace, source_line, - static_cast<uint32_t>(log_severity))); + for (auto& observer : observers_) { + observer.DetailedConsoleMessageAdded(message.text, source_name, + stack_trace, source_line, + static_cast<uint32_t>(log_severity)); + } } Send(new FrameHostMsg_AddMessageToConsole( @@ -3178,7 +3177,8 @@ } void RenderFrameImpl::willSendSubmitEvent(const blink::WebFormElement& form) { - FOR_EACH_OBSERVER(RenderFrameObserver, observers_, WillSendSubmitEvent(form)); + for (auto& observer : observers_) + observer.WillSendSubmitEvent(form); } void RenderFrameImpl::willSubmitForm(const blink::WebFormElement& form) { @@ -3206,7 +3206,8 @@ web_searchable_form_data.encoding().utf8()); } - FOR_EACH_OBSERVER(RenderFrameObserver, observers_, WillSubmitForm(form)); + for (auto& observer : observers_) + observer.WillSubmitForm(form); } void RenderFrameImpl::didCreateDataSource(blink::WebLocalFrame* frame, @@ -3361,9 +3362,10 @@ navigation_state->common_params().navigation_start; DCHECK(!navigation_start.is_null()); - FOR_EACH_OBSERVER(RenderViewObserver, render_view_->observers(), - DidStartProvisionalLoad(frame)); - FOR_EACH_OBSERVER(RenderFrameObserver, observers_, DidStartProvisionalLoad()); + for (auto& observer : render_view_->observers()) + observer.DidStartProvisionalLoad(frame); + for (auto& observer : observers_) + observer.DidStartProvisionalLoad(); Send(new FrameHostMsg_DidStartProvisionalLoad( routing_id_, ds->request().url(), navigation_start)); @@ -3398,10 +3400,10 @@ // SSL manager can react to the provisional load failure before being // notified the load stopped. // - FOR_EACH_OBSERVER(RenderViewObserver, render_view_->observers(), - DidFailProvisionalLoad(frame, error)); - FOR_EACH_OBSERVER(RenderFrameObserver, observers_, - DidFailProvisionalLoad(error)); + for (auto& observer : render_view_->observers()) + observer.DidFailProvisionalLoad(frame, error); + for (auto& observer : observers_) + observer.DidFailProvisionalLoad(error); SendFailedProvisionalLoad(failed_request, error, frame); @@ -3597,12 +3599,12 @@ } } - FOR_EACH_OBSERVER(RenderViewObserver, render_view_->observers_, - DidCommitProvisionalLoad(frame, is_new_navigation)); - FOR_EACH_OBSERVER( - RenderFrameObserver, observers_, - DidCommitProvisionalLoad(is_new_navigation, - navigation_state->WasWithinSamePage())); + for (auto& observer : render_view_->observers_) + observer.DidCommitProvisionalLoad(frame, is_new_navigation); + for (auto& observer : observers_) { + observer.DidCommitProvisionalLoad(is_new_navigation, + navigation_state->WasWithinSamePage()); + } if (!frame->parent()) { // Only for top frames. RenderThreadImpl* render_thread_impl = RenderThreadImpl::current(); @@ -3637,9 +3639,10 @@ void RenderFrameImpl::didCreateNewDocument(blink::WebLocalFrame* frame) { DCHECK(!frame_ || frame_ == frame); - FOR_EACH_OBSERVER(RenderFrameObserver, observers_, DidCreateNewDocument()); - FOR_EACH_OBSERVER(RenderViewObserver, render_view_->observers(), - DidCreateNewDocument(frame)); + for (auto& observer : observers_) + observer.DidCreateNewDocument(); + for (auto& observer : render_view_->observers()) + observer.DidCreateNewDocument(frame); } void RenderFrameImpl::didClearWindowObject(blink::WebLocalFrame* frame) { @@ -3665,9 +3668,10 @@ if (command_line.HasSwitch(switches::kEnableSkiaBenchmarking)) SkiaBenchmarking::Install(frame); - FOR_EACH_OBSERVER(RenderViewObserver, render_view_->observers(), - DidClearWindowObject(frame)); - FOR_EACH_OBSERVER(RenderFrameObserver, observers_, DidClearWindowObject()); + for (auto& observer : render_view_->observers()) + observer.DidClearWindowObject(frame); + for (auto& observer : observers_) + observer.DidClearWindowObject(); } void RenderFrameImpl::didCreateDocumentElement(blink::WebLocalFrame* frame) { @@ -3689,10 +3693,10 @@ } } - FOR_EACH_OBSERVER(RenderFrameObserver, observers_, - DidCreateDocumentElement()); - FOR_EACH_OBSERVER(RenderViewObserver, render_view_->observers(), - DidCreateDocumentElement(frame)); + for (auto& observer : observers_) + observer.DidCreateDocumentElement(); + for (auto& observer : render_view_->observers()) + observer.DidCreateDocumentElement(frame); } void RenderFrameImpl::runScriptsAtDocumentElementAvailable( @@ -3748,9 +3752,10 @@ Send(new FrameHostMsg_DidFinishDocumentLoad(routing_id_)); - FOR_EACH_OBSERVER(RenderViewObserver, render_view_->observers(), - DidFinishDocumentLoad(frame)); - FOR_EACH_OBSERVER(RenderFrameObserver, observers_, DidFinishDocumentLoad()); + for (auto& observer : render_view_->observers()) + observer.DidFinishDocumentLoad(frame); + for (auto& observer : observers_) + observer.DidFinishDocumentLoad(); // Check whether we have new encoding name. UpdateEncoding(frame, frame->view()->pageEncoding().utf8()); @@ -3834,8 +3839,8 @@ WebDataSource* ds = frame->dataSource(); DCHECK(ds); - FOR_EACH_OBSERVER(RenderViewObserver, render_view_->observers(), - DidFailLoad(frame, error)); + for (auto& observer : render_view_->observers()) + observer.DidFailLoad(frame, error); const WebURLRequest& failed_request = ds->request(); base::string16 error_description; @@ -3866,9 +3871,10 @@ document_state->set_finish_load_time(Time::Now()); } - FOR_EACH_OBSERVER(RenderViewObserver, render_view_->observers(), - DidFinishLoad(frame)); - FOR_EACH_OBSERVER(RenderFrameObserver, observers_, DidFinishLoad()); + for (auto& observer : render_view_->observers()) + observer.DidFinishLoad(frame); + for (auto& observer : observers_) + observer.DidFinishLoad(); Send(new FrameHostMsg_DidFinishLoad(routing_id_, ds->request().url())); @@ -4219,6 +4225,8 @@ navigation_state->common_params().allow_download); extra_data->set_transition_type(transition_type); extra_data->set_should_replace_current_entry(should_replace_current_entry); + // TODO(lukasza): https://crbug.com/656179: Navigational things (e.g. + // StartNavigationParams) should not apply to subresource requests. extra_data->set_transferred_request_child_id( navigation_state->start_params().transferred_request_child_id); extra_data->set_transferred_request_request_id( @@ -4253,7 +4261,12 @@ request.setRequestorID(render_view_->GetRoutingID()); request.setHasUserGesture(WebUserGestureIndicator::isProcessingUserGesture()); - if (!navigation_state->start_params().extra_headers.empty()) { + // StartNavigationParams should only apply to navigational requests (and not + // to subresource requests). For example - Content-Type header provided via + // OpenURLParams::extra_headers should only be applied to the original POST + // navigation request (and not to subresource requests). + if (!navigation_state->start_params().extra_headers.empty() && + request.getFrameType() != WebURLRequest::FrameTypeNone) { for (net::HttpUtil::HeadersIterator i( navigation_state->start_params().extra_headers.begin(), navigation_state->start_params().extra_headers.end(), "\n"); @@ -4355,15 +4368,14 @@ } void RenderFrameImpl::didChangePerformanceTiming() { - FOR_EACH_OBSERVER(RenderFrameObserver, - observers_, - DidChangePerformanceTiming()); + for (auto& observer : observers_) + observer.DidChangePerformanceTiming(); } void RenderFrameImpl::didObserveLoadingBehavior( blink::WebLoadingBehaviorFlag behavior) { - FOR_EACH_OBSERVER(RenderFrameObserver, observers_, - DidObserveLoadingBehavior(behavior)); + for (auto& observer : observers_) + observer.DidObserveLoadingBehavior(behavior); } void RenderFrameImpl::didCreateScriptContext(blink::WebLocalFrame* frame, @@ -4372,8 +4384,8 @@ int world_id) { DCHECK_EQ(frame_, frame); - FOR_EACH_OBSERVER(RenderFrameObserver, observers_, - DidCreateScriptContext(context, extension_group, world_id)); + for (auto& observer : observers_) + observer.DidCreateScriptContext(context, extension_group, world_id); } void RenderFrameImpl::willReleaseScriptContext(blink::WebLocalFrame* frame, @@ -4381,16 +4393,16 @@ int world_id) { DCHECK_EQ(frame_, frame); - FOR_EACH_OBSERVER(RenderFrameObserver, - observers_, - WillReleaseScriptContext(context, world_id)); + for (auto& observer : observers_) + observer.WillReleaseScriptContext(context, world_id); } void RenderFrameImpl::didChangeScrollOffset(blink::WebLocalFrame* frame) { DCHECK_EQ(frame_, frame); render_view_->StartNavStateSyncTimerIfNecessary(this); - FOR_EACH_OBSERVER(RenderFrameObserver, observers_, DidChangeScrollOffset()); + for (auto& observer : observers_) + observer.DidChangeScrollOffset(); } void RenderFrameImpl::willInsertBody(blink::WebLocalFrame* frame) { @@ -4565,7 +4577,8 @@ } void RenderFrameImpl::didChangeManifest() { - FOR_EACH_OBSERVER(RenderFrameObserver, observers_, DidChangeManifest()); + for (auto& observer : observers_) + observer.DidChangeManifest(); } void RenderFrameImpl::enterFullscreen() { @@ -4640,14 +4653,18 @@ if (!weak_this) return; - if (frame_ && !frame_->parent()) - FOR_EACH_OBSERVER(RenderViewObserver, render_view_->observers_, OnStop()); + if (frame_ && !frame_->parent()) { + for (auto& observer : render_view_->observers_) + observer.OnStop(); + } - FOR_EACH_OBSERVER(RenderFrameObserver, observers_, OnStop()); + for (auto& observer : observers_) + observer.OnStop(); } void RenderFrameImpl::WasHidden() { - FOR_EACH_OBSERVER(RenderFrameObserver, observers_, WasHidden()); + for (auto& observer : observers_) + observer.WasHidden(); #if defined(ENABLE_PLUGINS) for (auto* plugin : active_pepper_instances_) @@ -4660,7 +4677,8 @@ } void RenderFrameImpl::WasShown() { - FOR_EACH_OBSERVER(RenderFrameObserver, observers_, WasShown()); + for (auto& observer : observers_) + observer.WasShown(); #if defined(ENABLE_PLUGINS) for (auto* plugin : active_pepper_instances_) @@ -4673,7 +4691,8 @@ } void RenderFrameImpl::WidgetWillClose() { - FOR_EACH_OBSERVER(RenderFrameObserver, observers_, WidgetWillClose()); + for (auto& observer : observers_) + observer.WidgetWillClose(); } bool RenderFrameImpl::IsMainFrame() { @@ -4743,7 +4762,7 @@ // Set the URL to be displayed in the browser UI to the user. params.url = GetLoadingUrl(); - if (frame->document().baseURL() != params.url) + if (GURL(frame->document().baseURL()) != params.url) params.base_url = frame->document().baseURL(); GetRedirectChain(ds, ¶ms.redirects); @@ -4962,7 +4981,8 @@ } void RenderFrameImpl::FocusedNodeChanged(const WebNode& node) { - FOR_EACH_OBSERVER(RenderFrameObserver, observers_, FocusedNodeChanged(node)); + for (auto& observer : observers_) + observer.FocusedNodeChanged(node); } void RenderFrameImpl::FocusedNodeChangedForAccessibility(const WebNode& node) { @@ -5029,8 +5049,7 @@ if (!ShouldDisplayErrorPageForFailedLoad(error_code, common_params.url)) { // The browser expects this frame to be loading an error page. Inform it // that the load stopped. - if (!frame_->isLoading()) - Send(new FrameHostMsg_DidStopLoading(routing_id_)); + Send(new FrameHostMsg_DidStopLoading(routing_id_)); return; } @@ -5993,8 +6012,8 @@ MaybeHandleDebugURL(url); if (is_main_frame_) { - FOR_EACH_OBSERVER(RenderViewObserver, render_view_->observers_, - Navigate(url)); + for (auto& observer : render_view_->observers_) + observer.Navigate(url); } render_view_->history_list_offset_ =
diff --git a/content/renderer/render_thread_impl.cc b/content/renderer/render_thread_impl.cc index 7afa5c8..923db00 100644 --- a/content/renderer/render_thread_impl.cc +++ b/content/renderer/render_thread_impl.cc
@@ -23,6 +23,7 @@ #include "base/metrics/field_trial.h" #include "base/metrics/histogram_macros.h" #include "base/path_service.h" +#include "base/process/process_metrics.h" #include "base/run_loop.h" #include "base/strings/string16.h" #include "base/strings/string_number_conversions.h" @@ -211,6 +212,12 @@ #include "content/common/external_ipc_dumper.h" #endif +#if defined(OS_MACOSX) +#include <malloc/malloc.h> +#else +#include <malloc.h> +#endif + using base::ThreadRestrictions; using blink::WebDocument; using blink::WebFrame; @@ -898,6 +905,8 @@ base::ThreadPriority::BACKGROUND); #endif + record_purge_suspend_metric_closure_.Reset(base::Bind( + &RenderThreadImpl::RecordPurgeAndSuspendMetrics, base::Unretained(this))); is_renderer_suspended_ = false; base::MemoryCoordinatorClientRegistry::GetInstance()->Register(this); @@ -907,8 +916,8 @@ } void RenderThreadImpl::Shutdown() { - FOR_EACH_OBSERVER( - RenderThreadObserver, observers_, OnRenderProcessShutdown()); + for (auto& observer : observers_) + observer.OnRenderProcessShutdown(); if (memory_observer_) { message_loop()->RemoveTaskObserver(memory_observer_.get()); @@ -1420,7 +1429,8 @@ idle_timer_.Stop(); } - FOR_EACH_OBSERVER(RenderThreadObserver, observers_, IdleNotification()); + for (auto& observer : observers_) + observer.IdleNotification(); } int64_t RenderThreadImpl::GetIdleNotificationDelayInMs() const { @@ -1736,22 +1746,7 @@ bool handled = true; IPC_BEGIN_MESSAGE_MAP(RenderThreadImpl, msg) - // TODO(port): removed from render_messages_internal.h; - // is there a new non-windows message I should add here? - IPC_MESSAGE_HANDLER(ViewMsg_NetworkConnectionChanged, - OnNetworkConnectionChanged) IPC_MESSAGE_HANDLER(WorkerProcessMsg_CreateWorker, OnCreateNewSharedWorker) -#if defined(OS_ANDROID) - IPC_MESSAGE_HANDLER(ViewMsg_SetWebKitSharedTimersSuspended, - OnSetWebKitSharedTimersSuspended) -#endif -#if defined(OS_MACOSX) - IPC_MESSAGE_HANDLER(ViewMsg_UpdateScrollbarTheme, OnUpdateScrollbarTheme) - IPC_MESSAGE_HANDLER(ViewMsg_SystemColorsChanged, OnSystemColorsChanged) -#endif -#if defined(ENABLE_PLUGINS) - IPC_MESSAGE_HANDLER(ViewMsg_PurgePluginListCache, OnPurgePluginListCache) -#endif IPC_MESSAGE_UNHANDLED(handled = false) IPC_END_MESSAGE_MAP() return handled; @@ -1764,6 +1759,7 @@ renderer_scheduler_->OnRendererBackgrounded(); } else { renderer_scheduler_->OnRendererForegrounded(); + record_purge_suspend_metric_closure_.Cancel(); is_renderer_suspended_ = false; } } @@ -1775,6 +1771,110 @@ // TODO(hajimehoshi): Implement purging e.g. cache (crbug/607077) is_renderer_suspended_ = true; renderer_scheduler_->SuspendRenderer(); + + // Since purging is not a synchronous task (e.g. v8 GC, oilpan GC, ...), + // we need to wait until the task is finished. So wait 15 seconds and + // update purge+suspend UMA histogram. + // TODO(tasak): use MemoryCoordinator's callback to report purge+suspend + // UMA when MemoryCoordinator is available. + GetRendererScheduler()->DefaultTaskRunner()->PostDelayedTask( + FROM_HERE, record_purge_suspend_metric_closure_.callback(), + base::TimeDelta::FromSeconds(15)); +} + +// TODO(tasak): Replace the following GetMallocUsage() with memory-infra +// when it is possible to run memory-infra without tracing. +#if defined(OS_WIN) +namespace { + +static size_t GetMallocUsage() { + DWORD number_of_heaps = ::GetProcessHeaps(0, NULL); + if (number_of_heaps <= 0) + return 0; + + size_t malloc_usage = 0; + std::unique_ptr<HANDLE[]> heaps(new HANDLE[number_of_heaps]); + ::GetProcessHeaps(number_of_heaps, heaps.get()); + for (size_t i = 0; i < number_of_heaps; i++) { + PROCESS_HEAP_ENTRY heap_entry; + ::HeapLock(heaps[i]); + heap_entry.lpData = NULL; + while (::HeapWalk(heaps[i], &heap_entry) != 0) { + if (heap_entry.lpData == heaps.get()) + continue; + if ((heap_entry.wFlags & PROCESS_HEAP_ENTRY_BUSY) != 0) + malloc_usage += heap_entry.cbData; + } + ::HeapUnlock(heaps[i]); + } + return malloc_usage; +} + +} // namespace +#elif defined(OS_MACOSX) || defined(OS_IOS) +namespace { + +static size_t GetMallocUsage() { + malloc_statistics_t stats = {0}; + malloc_zone_statistics(nullptr, &stats); + return stats.size_in_use; +} + +} // namespace +#endif + +// TODO(tasak): Once it is possible to use memory-infra without tracing, +// we should collect the metrics using memory-infra. +// TODO(tasak): We should also report a difference between the memory usages +// before and after purging by using memory-infra. +void RenderThreadImpl::RecordPurgeAndSuspendMetrics() const { + // If this renderer is resumed, we should not update UMA. + if (!is_renderer_suspended_) + return; + + // TODO(tasak): Compare memory metrics between purge-enabled renderers and + // purge-disabled renderers (A/B testing). + blink::WebMemoryStatistics blink_stats = blink::WebMemoryStatistics::Get(); + UMA_HISTOGRAM_MEMORY_KB("PurgeAndSuspend.Memory.PartitionAllocKB", + blink_stats.partitionAllocTotalAllocatedBytes / 1024); + UMA_HISTOGRAM_MEMORY_KB("PurgeAndSuspend.Memory.BlinkGCKB", + blink_stats.blinkGCTotalAllocatedBytes / 1024); +#if defined(OS_LINUX) || defined(OS_ANDROID) + struct mallinfo minfo = mallinfo(); +#if defined(USE_TCMALLOC) + size_t malloc_usage = minfo.uordblks; +#else + size_t malloc_usage = minfo.hblkhd + minfo.arena; +#endif +#else + size_t malloc_usage = GetMallocUsage(); +#endif + UMA_HISTOGRAM_MEMORY_MB("PurgeAndSuspend.Memory.MallocMB", + malloc_usage / 1024 / 1024); + + ChildDiscardableSharedMemoryManager::Statistics discardable_stats = + ChildThreadImpl::discardable_shared_memory_manager()->GetStatistics(); + size_t discardable_usage = + discardable_stats.total_size - discardable_stats.freelist_size; + UMA_HISTOGRAM_MEMORY_KB("PurgeAndSuspend.Memory.DiscardableKB", + discardable_usage / 1024); + + size_t v8_usage = 0; + if (v8::Isolate* isolate = blink::mainThreadIsolate()) { + v8::HeapStatistics v8_heap_statistics; + isolate->GetHeapStatistics(&v8_heap_statistics); + v8_usage = v8_heap_statistics.total_heap_size(); + } + // TODO(tasak): Currently only memory usage of mainThreadIsolate() is + // reported. We should collect memory usages of all isolates using + // memory-infra. + UMA_HISTOGRAM_MEMORY_MB("PurgeAndSuspend.Memory.V8MainThreadIsolateMB", + v8_usage / 1024 / 1024); + UMA_HISTOGRAM_MEMORY_MB("PurgeAndSuspend.Memory.TotalAllocatedMB", + (blink_stats.partitionAllocTotalAllocatedBytes + + blink_stats.blinkGCTotalAllocatedBytes + + malloc_usage + v8_usage + discardable_usage) / + 1024 / 1024); } scoped_refptr<gpu::GpuChannelHost> RenderThreadImpl::EstablishGpuChannelSync() { @@ -2000,31 +2100,6 @@ return gpu_channel_.get(); } -#if defined(ENABLE_PLUGINS) -void RenderThreadImpl::OnPurgePluginListCache(bool reload_pages) { - // The call below will cause a GetPlugins call with refresh=true, but at this - // point we already know that the browser has refreshed its list, so disable - // refresh temporarily to prevent each renderer process causing the list to be - // regenerated. - blink_platform_impl_->set_plugin_refresh_allowed(false); - blink::resetPluginCache(reload_pages); - blink_platform_impl_->set_plugin_refresh_allowed(true); - - FOR_EACH_OBSERVER(RenderThreadObserver, observers_, PluginListChanged()); -} -#endif - -void RenderThreadImpl::OnNetworkConnectionChanged( - net::NetworkChangeNotifier::ConnectionType type, - double max_bandwidth_mbps) { - bool online = type != net::NetworkChangeNotifier::CONNECTION_NONE; - WebNetworkStateNotifier::setOnLine(online); - FOR_EACH_OBSERVER( - RenderThreadObserver, observers_, NetworkStateChanged(online)); - WebNetworkStateNotifier::setWebConnection( - NetConnectionTypeToWebConnectionType(type), max_bandwidth_mbps); -} - void RenderThreadImpl::CreateView(mojom::CreateViewParamsPtr params) { CompositorDependencies* compositor_deps = this; // When bringing in render_view, also bring in webkit's glue and jsbindings. @@ -2078,6 +2153,75 @@ replicated_state); } +void RenderThreadImpl::OnNetworkConnectionChanged( + net::NetworkChangeNotifier::ConnectionType type, + double max_bandwidth_mbps) { + bool online = type != net::NetworkChangeNotifier::CONNECTION_NONE; + WebNetworkStateNotifier::setOnLine(online); + for (auto& observer : observers_) + observer.NetworkStateChanged(online); + WebNetworkStateNotifier::setWebConnection( + NetConnectionTypeToWebConnectionType(type), max_bandwidth_mbps); +} + +void RenderThreadImpl::SetWebKitSharedTimersSuspended(bool suspend) { +#if defined(OS_ANDROID) + if (suspend) { + renderer_scheduler_->SuspendTimerQueue(); + } else { + renderer_scheduler_->ResumeTimerQueue(); + } + webkit_shared_timer_suspended_ = suspend; +#else + NOTREACHED(); +#endif +} + +void RenderThreadImpl::UpdateScrollbarTheme( + mojom::UpdateScrollbarThemeParamsPtr params) { +#if defined(OS_MACOSX) + static_cast<WebScrollbarBehaviorImpl*>( + blink_platform_impl_->scrollbarBehavior()) + ->set_jump_on_track_click(params->jump_on_track_click); + + blink::WebScrollbarTheme::updateScrollbarsWithNSDefaults( + params->initial_button_delay, params->autoscroll_button_delay, + params->preferred_scroller_style, params->redraw, + params->button_placement); +#else + NOTREACHED(); +#endif +} + +void RenderThreadImpl::OnSystemColorsChanged( + int32_t aqua_color_variant, + const std::string& highlight_text_color, + const std::string& highlight_color) { +#if defined(OS_MACOSX) + SystemColorsDidChange(aqua_color_variant, highlight_text_color, + highlight_color); +#else + NOTREACHED(); +#endif +} + +void RenderThreadImpl::PurgePluginListCache(bool reload_pages) { +#if defined(ENABLE_PLUGINS) + // The call below will cause a GetPlugins call with refresh=true, but at this + // point we already know that the browser has refreshed its list, so disable + // refresh temporarily to prevent each renderer process causing the list to be + // regenerated. + blink_platform_impl_->set_plugin_refresh_allowed(false); + blink::resetPluginCache(reload_pages); + blink_platform_impl_->set_plugin_refresh_allowed(true); + + for (auto& observer : observers_) + observer.PluginListChanged(); +#else + NOTREACHED(); +#endif +} + void RenderThreadImpl::OnTimeZoneChange(const std::string& zone_id) { if (!blink_platform_impl_) return; @@ -2090,39 +2234,6 @@ NotifyTimezoneChange(); } -#if defined(OS_ANDROID) -void RenderThreadImpl::OnSetWebKitSharedTimersSuspended(bool suspend) { - if (suspend) { - renderer_scheduler_->SuspendTimerQueue(); - } else { - renderer_scheduler_->ResumeTimerQueue(); - } - webkit_shared_timer_suspended_ = suspend; -} -#endif - -#if defined(OS_MACOSX) -void RenderThreadImpl::OnUpdateScrollbarTheme( - const ViewMsg_UpdateScrollbarTheme_Params& params) { - static_cast<WebScrollbarBehaviorImpl*>( - blink_platform_impl_->scrollbarBehavior()) - ->set_jump_on_track_click(params.jump_on_track_click); - - blink::WebScrollbarTheme::updateScrollbarsWithNSDefaults( - params.initial_button_delay, params.autoscroll_button_delay, - params.preferred_scroller_style, params.redraw, - params.button_placement); -} - -void RenderThreadImpl::OnSystemColorsChanged( - int aqua_color_variant, - const std::string& highlight_text_color, - const std::string& highlight_color) { - SystemColorsDidChange(aqua_color_variant, highlight_text_color, - highlight_color); -} -#endif - void RenderThreadImpl::OnCreateNewSharedWorker( const WorkerProcessMsg_CreateWorker_Params& params) { // EmbeddedSharedWorkerStub will self-destruct.
diff --git a/content/renderer/render_thread_impl.h b/content/renderer/render_thread_impl.h index 8296b5f1..51474f6 100644 --- a/content/renderer/render_thread_impl.h +++ b/content/renderer/render_thread_impl.h
@@ -23,6 +23,7 @@ #include "base/threading/thread_checker.h" #include "base/timer/timer.h" #include "build/build_config.h" +#include "content/child/child_discardable_shared_memory_manager.h" #include "content/child/child_thread_impl.h" #include "content/child/memory/child_memory_coordinator_impl.h" #include "content/common/associated_interface_registry_impl.h" @@ -43,6 +44,7 @@ #include "net/base/network_change_notifier.h" #include "third_party/WebKit/public/platform/WebConnectionType.h" #include "third_party/WebKit/public/platform/scheduler/renderer/renderer_scheduler.h" +#include "third_party/WebKit/public/web/WebMemoryStatistics.h" #include "ui/gfx/native_widget_types.h" #if defined(OS_MACOSX) @@ -51,7 +53,6 @@ class GrContext; class SkBitmap; -struct ViewMsg_UpdateScrollbarTheme_Params; struct WorkerProcessMsg_CreateWorker_Params; namespace blink { @@ -508,12 +509,6 @@ scoped_refptr<base::SingleThreadTaskRunner>& resource_task_queue); void OnTransferBitmap(const SkBitmap& bitmap, int resource_id); -#if defined(ENABLE_PLUGINS) - void OnPurgePluginListCache(bool reload_pages); -#endif - void OnNetworkConnectionChanged( - net::NetworkChangeNotifier::ConnectionType type, - double max_bandwidth_mbps); void OnGetAccessibilityTree(); // mojom::Renderer: @@ -524,27 +519,30 @@ int32_t opener_routing_id, int32_t parent_routing_id, const FrameReplicationState& replicated_state) override; + void OnNetworkConnectionChanged( + net::NetworkChangeNotifier::ConnectionType type, + double max_bandwidth_mbps) override; + void SetWebKitSharedTimersSuspended(bool suspend) override; + void UpdateScrollbarTheme( + mojom::UpdateScrollbarThemeParamsPtr params) override; + void OnSystemColorsChanged(int32_t aqua_color_variant, + const std::string& highlight_text_color, + const std::string& highlight_color) override; + void PurgePluginListCache(bool reload_pages) override; // device::mojom::TimeZoneClient: void OnTimeZoneChange(const std::string& zoneId) override; void OnMemoryPressure( base::MemoryPressureListener::MemoryPressureLevel memory_pressure_level); -#if defined(OS_ANDROID) - void OnSetWebKitSharedTimersSuspended(bool suspend); -#endif -#if defined(OS_MACOSX) - void OnUpdateScrollbarTheme( - const ViewMsg_UpdateScrollbarTheme_Params& params); - void OnSystemColorsChanged(int aqua_color_variant, - const std::string& highlight_text_color, - const std::string& highlight_color); -#endif + void OnCreateNewSharedWorker( const WorkerProcessMsg_CreateWorker_Params& params); bool RendererIsHidden() const; void OnRendererHidden(); void OnRendererVisible(); + void RecordPurgeAndSuspendMetrics() const; + void ReleaseFreeMemory(); void OnSyncMemoryPressure( @@ -742,6 +740,7 @@ mojom::RenderFrameMessageFilterAssociatedPtr render_frame_message_filter_; mojom::RenderMessageFilterAssociatedPtr render_message_filter_; + base::CancelableClosure record_purge_suspend_metric_closure_; bool is_renderer_suspended_; DISALLOW_COPY_AND_ASSIGN(RenderThreadImpl);
diff --git a/content/renderer/render_view_browsertest.cc b/content/renderer/render_view_browsertest.cc index 119f8581..b9b698c 100644 --- a/content/renderer/render_view_browsertest.cc +++ b/content/renderer/render_view_browsertest.cc
@@ -1762,7 +1762,7 @@ if (type == ViewHostMsg_TextInputStateChanged::ID) { is_input_type_called = true; last_input_type = i; - } else if (type == ViewHostMsg_SelectionChanged::ID) { + } else if (type == FrameHostMsg_SelectionChanged::ID) { is_selection_called = true; last_selection = i; }
diff --git a/content/renderer/render_view_impl.cc b/content/renderer/render_view_impl.cc index 42fc1eb..7dd11dd 100644 --- a/content/renderer/render_view_impl.cc +++ b/content/renderer/render_view_impl.cc
@@ -881,8 +881,10 @@ DCHECK_NE(this, it->second) << "Failed to call Close?"; #endif - FOR_EACH_OBSERVER(RenderViewObserver, observers_, RenderViewGone()); - FOR_EACH_OBSERVER(RenderViewObserver, observers_, OnDestruct()); + for (auto& observer : observers_) + observer.RenderViewGone(); + for (auto& observer : observers_) + observer.OnDestruct(); } /*static*/ @@ -1256,7 +1258,8 @@ // RenderWidgetInputHandlerDelegate ----------------------------------------- void RenderViewImpl::RenderWidgetFocusChangeComplete() { - FOR_EACH_OBSERVER(RenderViewObserver, observers_, FocusChangeComplete()); + for (auto& observer : observers_) + observer.FocusChangeComplete(); } bool RenderViewImpl::DoesRenderWidgetHaveTouchEventHandlersAt( @@ -1628,8 +1631,8 @@ UMA_HISTOGRAM_BOOLEAN("PrintPreview.OutOfProcessSubframe", frame->top()->isWebRemoteFrame()); - FOR_EACH_OBSERVER(RenderViewObserver, observers_, - PrintPage(frame, input_handler().handling_input_event())); + for (auto& observer : observers_) + observer.PrintPage(frame, input_handler().handling_input_event()); } bool RenderViewImpl::enumerateChosenDirectory( @@ -1643,8 +1646,10 @@ void RenderViewImpl::FrameDidStartLoading(WebFrame* frame) { DCHECK_GE(frames_in_progress_, 0); - if (frames_in_progress_ == 0) - FOR_EACH_OBSERVER(RenderViewObserver, observers_, DidStartLoading()); + if (frames_in_progress_ == 0) { + for (auto& observer : observers_) + observer.DidStartLoading(); + } frames_in_progress_++; } @@ -1656,7 +1661,8 @@ frames_in_progress_--; if (frames_in_progress_ == 0) { DidStopLoadingIcons(); - FOR_EACH_OBSERVER(RenderViewObserver, observers_, DidStopLoading()); + for (auto& observer : observers_) + observer.DidStopLoading(); } } @@ -1672,7 +1678,8 @@ page_zoom_level_ = zoom_level; webview()->setZoomLevel(zoom_level); - FOR_EACH_OBSERVER(RenderViewObserver, observers_, OnZoomLevelChanged()); + for (auto& observer : observers_) + observer.OnZoomLevelChanged(); } void RenderViewImpl::didCancelCompositionOnSelectionChange() { @@ -1852,7 +1859,8 @@ node_bounds)); // TODO(estade): remove. - FOR_EACH_OBSERVER(RenderViewObserver, observers_, FocusedNodeChanged(toNode)); + for (auto& observer : observers_) + observer.FocusedNodeChanged(toNode); RenderFrameImpl* previous_frame = nullptr; if (!fromNode.isNull()) @@ -1872,7 +1880,8 @@ } void RenderViewImpl::didUpdateLayout() { - FOR_EACH_OBSERVER(RenderViewObserver, observers_, DidUpdateLayout()); + for (auto& observer : observers_) + observer.DidUpdateLayout(); // We don't always want to set up a timer, only if we've been put in that // mode by getting a |ViewMsg_EnablePreferredSizeChangedMode| @@ -1940,8 +1949,8 @@ } void RenderViewImpl::onMouseDown(const WebNode& mouse_down_node) { - FOR_EACH_OBSERVER( - RenderViewObserver, observers_, OnMouseDown(mouse_down_node)); + for (auto& observer : observers_) + observer.OnMouseDown(mouse_down_node); } void RenderViewImpl::didHandleGestureEvent( @@ -1950,8 +1959,8 @@ RenderWidget::didHandleGestureEvent(event, event_cancelled); if (!event_cancelled) { - FOR_EACH_OBSERVER( - RenderViewObserver, observers_, DidHandleGestureEvent(event)); + for (auto& observer : observers_) + observer.DidHandleGestureEvent(event); } // TODO(ananta): Piggyback off existing IPCs to communicate this information, @@ -2459,7 +2468,8 @@ } void RenderViewImpl::OnClosePage() { - FOR_EACH_OBSERVER(RenderViewObserver, observers_, ClosePage()); + for (auto& observer : observers_) + observer.ClosePage(); // TODO(creis): We'd rather use webview()->Close() here, but that currently // sets the WebView's delegate_ to NULL, preventing any JavaScript dialogs // in the onunload handler from appearing. For now, we're bypassing that and @@ -2740,10 +2750,8 @@ } void RenderViewImpl::draggableRegionsChanged() { - FOR_EACH_OBSERVER( - RenderViewObserver, - observers_, - DraggableRegionsChanged(webview()->mainFrame())); + for (auto& observer : observers_) + observer.DraggableRegionsChanged(webview()->mainFrame()); } void RenderViewImpl::pageImportanceSignalsChanged() { @@ -2981,7 +2989,8 @@ void RenderViewImpl::DidCommitCompositorFrame() { RenderWidget::DidCommitCompositorFrame(); - FOR_EACH_OBSERVER(RenderViewObserver, observers_, DidCommitCompositorFrame()); + for (auto& observer : observers_) + observer.DidCommitCompositorFrame(); } void RenderViewImpl::SendUpdateFaviconURL(const std::vector<FaviconURL>& urls) {
diff --git a/content/renderer/render_widget.cc b/content/renderer/render_widget.cc index bad73417..ad847c8 100644 --- a/content/renderer/render_widget.cc +++ b/content/renderer/render_widget.cc
@@ -646,8 +646,8 @@ TRACE_EVENT0("renderer", "RenderWidget::OnWasHidden"); // Go into a mode where we stop generating paint and scrolling events. SetHidden(true); - FOR_EACH_OBSERVER(RenderFrameImpl, render_frames_, - WasHidden()); + for (auto& observer : render_frames_) + observer.WasHidden(); } void RenderWidget::OnWasShown(bool needs_repainting, @@ -659,8 +659,8 @@ // See OnWasHidden SetHidden(false); - FOR_EACH_OBSERVER(RenderFrameImpl, render_frames_, - WasShown()); + for (auto& observer : render_frames_) + observer.WasShown(); if (!needs_repainting) return; @@ -713,8 +713,8 @@ if (GetWebWidget()) GetWebWidget()->setFocus(enable); - FOR_EACH_OBSERVER(RenderFrameImpl, render_frames_, - RenderWidgetSetFocus(enable)); + for (auto& observer : render_frames_) + observer.RenderWidgetSetFocus(enable); } void RenderWidget::SetNeedsMainFrame() { @@ -765,18 +765,18 @@ // tab_capture_performancetest.cc. TRACE_EVENT0("gpu", "RenderWidget::DidCommitAndDrawCompositorFrame"); - FOR_EACH_OBSERVER(RenderFrameImpl, render_frames_, - DidCommitAndDrawCompositorFrame()); + for (auto& observer : render_frames_) + observer.DidCommitAndDrawCompositorFrame(); // Notify subclasses that we initiated the paint operation. DidInitiatePaint(); } void RenderWidget::DidCommitCompositorFrame() { - FOR_EACH_OBSERVER(RenderFrameImpl, render_frames_, - DidCommitCompositorFrame()); - FOR_EACH_OBSERVER(RenderFrameProxy, render_frame_proxies_, - DidCommitCompositorFrame()); + for (auto& observer : render_frames_) + observer.DidCommitCompositorFrame(); + for (auto& observer : render_frame_proxies_) + observer.DidCommitCompositorFrame(); input_handler_->FlushPendingInputEventAck(); } @@ -843,8 +843,8 @@ UpdateTextInputState(ShowIme::HIDE_IME, ChangeSource::FROM_NON_IME); UpdateSelectionBounds(); - FOR_EACH_OBSERVER(RenderFrameProxy, render_frame_proxies_, - WillBeginCompositorFrame()); + for (auto& observer : render_frame_proxies_) + observer.WillBeginCompositorFrame(); } std::unique_ptr<cc::SwapPromise> RenderWidget::RequestCopyOfOutputForLayoutTest( @@ -1001,8 +1001,8 @@ } bool RenderWidget::WillHandleMouseEvent(const blink::WebMouseEvent& event) { - FOR_EACH_OBSERVER(RenderFrameImpl, render_frames_, - RenderWidgetWillHandleMouseEvent()); + for (auto& observer : render_frames_) + observer.RenderWidgetWillHandleMouseEvent(); if (owner_delegate_) return owner_delegate_->RenderWidgetWillHandleMouseEvent(event); @@ -1170,8 +1170,8 @@ MESSAGE_DELIVERY_POLICY_WITH_VISUAL_STATE); } - FOR_EACH_OBSERVER(RenderFrameImpl, render_frames_, - DidMeaningfulLayout(layout_type)); + for (auto& observer : render_frames_) + observer.DidMeaningfulLayout(layout_type); } void RenderWidget::ScheduleComposite() { @@ -1276,7 +1276,8 @@ } void RenderWidget::NotifyOnClose() { - FOR_EACH_OBSERVER(RenderFrameImpl, render_frames_, WidgetWillClose()); + for (auto& observer : render_frames_) + observer.WidgetWillClose(); } void RenderWidget::closeWidgetSoon() {
diff --git a/content/renderer/service_worker/embedded_worker_instance_client_impl.cc b/content/renderer/service_worker/embedded_worker_instance_client_impl.cc index 2cbc998..4b399b88 100644 --- a/content/renderer/service_worker/embedded_worker_instance_client_impl.cc +++ b/content/renderer/service_worker/embedded_worker_instance_client_impl.cc
@@ -12,6 +12,7 @@ #include "content/public/common/content_client.h" #include "content/renderer/service_worker/embedded_worker_devtools_agent.h" #include "content/renderer/service_worker/service_worker_context_client.h" +#include "services/service_manager/public/cpp/interface_registry.h" #include "third_party/WebKit/public/web/WebEmbeddedWorker.h" #include "third_party/WebKit/public/web/WebEmbeddedWorkerStartData.h" @@ -25,6 +26,12 @@ new EmbeddedWorkerInstanceClientImpl(dispatcher, std::move(request)); } +void EmbeddedWorkerInstanceClientImpl::ExposeInterfacesToBrowser( + service_manager::InterfaceRegistry* interface_registry) { + DCHECK(renderer_request_.is_pending()); + interface_registry->Bind(std::move(renderer_request_)); +} + void EmbeddedWorkerInstanceClientImpl::StopWorkerCompleted() { DCHECK(embedded_worker_id_); DCHECK(stop_callback_); @@ -37,10 +44,15 @@ } void EmbeddedWorkerInstanceClientImpl::StartWorker( - const EmbeddedWorkerStartParams& params) { + const EmbeddedWorkerStartParams& params, + service_manager::mojom::InterfaceProviderPtr browser_interfaces, + service_manager::mojom::InterfaceProviderRequest renderer_request) { + DCHECK(ChildThreadImpl::current()); TRACE_EVENT0("ServiceWorker", "EmbeddedWorkerInstanceClientImpl::StartWorker"); embedded_worker_id_ = params.embedded_worker_id; + remote_interfaces_.Bind(std::move(browser_interfaces)); + renderer_request_ = std::move(renderer_request); std::unique_ptr<EmbeddedWorkerDispatcher::WorkerWrapper> wrapper = dispatcher_->StartWorkerContext( @@ -55,6 +67,7 @@ void EmbeddedWorkerInstanceClientImpl::StopWorker( const StopWorkerCallback& callback) { + DCHECK(ChildThreadImpl::current()); DCHECK(embedded_worker_id_); DCHECK(!stop_callback_); TRACE_EVENT0("ServiceWorker", "EmbeddedWorkerInstanceClientImpl::StopWorker");
diff --git a/content/renderer/service_worker/embedded_worker_instance_client_impl.h b/content/renderer/service_worker/embedded_worker_instance_client_impl.h index bb0c777..e0fc098 100644 --- a/content/renderer/service_worker/embedded_worker_instance_client_impl.h +++ b/content/renderer/service_worker/embedded_worker_instance_client_impl.h
@@ -7,14 +7,17 @@ #include "base/id_map.h" #include "base/optional.h" +#include "content/child/child_thread_impl.h" #include "content/common/service_worker/embedded_worker.mojom.h" #include "content/renderer/service_worker/embedded_worker_dispatcher.h" #include "mojo/public/cpp/bindings/binding.h" +#include "mojo/public/cpp/bindings/interface_ptr.h" +#include "services/service_manager/public/cpp/interface_provider.h" namespace content { // This class exposes interfaces of WebEmbeddedWorker to the browser process. -// All methods should be called on the main thread. +// Unless otherwise noted, all methods should be called on the main thread. class EmbeddedWorkerInstanceClientImpl : public mojom::EmbeddedWorkerInstanceClient { public: @@ -24,7 +27,11 @@ ~EmbeddedWorkerInstanceClientImpl() override; - // Called from ServiceWorkerContextClient. Must call on the main thread. + // This method can be called from any threads. + void ExposeInterfacesToBrowser( + service_manager::InterfaceRegistry* interface_registry); + + // Called from ServiceWorkerContextClient. void StopWorkerCompleted(); private: @@ -33,24 +40,31 @@ mojo::InterfaceRequest<mojom::EmbeddedWorkerInstanceClient> request); // mojom::EmbeddedWorkerInstanceClient implementation - void StartWorker(const EmbeddedWorkerStartParams& params) override; + void StartWorker( + const EmbeddedWorkerStartParams& params, + service_manager::mojom::InterfaceProviderPtr browser_interfaces, + service_manager::mojom::InterfaceProviderRequest renderer_request) + override; void StopWorker(const StopWorkerCallback& callback) override; // Handler of connection error bound to |binding_| void OnError(); EmbeddedWorkerDispatcher* dispatcher_; - // This object will be bound to the main thread. mojo::Binding<mojom::EmbeddedWorkerInstanceClient> binding_; + service_manager::InterfaceProvider remote_interfaces_; // This is valid before StartWorker is called. After that, this object // will be passed to ServiceWorkerContextClient. std::unique_ptr<EmbeddedWorkerInstanceClientImpl> temporal_self_; + // This is drained by ServiceWorkerContextClient after the worker thread is + // launched. + service_manager::mojom::InterfaceProviderRequest renderer_request_; + base::Optional<int> embedded_worker_id_; EmbeddedWorkerDispatcher::WorkerWrapper* wrapper_; - // Stores callbacks StopWorkerCallback stop_callback_; DISALLOW_COPY_AND_ASSIGN(EmbeddedWorkerInstanceClientImpl);
diff --git a/content/renderer/service_worker/service_worker_context_client.cc b/content/renderer/service_worker/service_worker_context_client.cc index a08b1de..b416772 100644 --- a/content/renderer/service_worker/service_worker_context_client.cc +++ b/content/renderer/service_worker/service_worker_context_client.cc
@@ -209,13 +209,15 @@ // Pending callbacks for ClaimClients(). ClaimClientsCallbacksMap claim_clients_callbacks; - // Pending callbacks for Background Sync Events + // Pending callbacks for Background Sync Events. SyncEventCallbacksMap sync_event_callbacks; - // Pending callbacks for Fetch Events + // Pending callbacks for Fetch Events. FetchEventCallbacksMap fetch_event_callbacks; service_manager::InterfaceRegistry interface_registry; + // This is not used when mojo for the service workers is enabled. At that + // time, remote interfaces are stored in EmbeddedWorkerInstanceClientImpl. service_manager::InterfaceProvider remote_interfaces; base::ThreadChecker thread_checker; @@ -237,6 +239,7 @@ void DispatchFetchEvent(int fetch_event_id, const ServiceWorkerFetchRequest& request, + mojom::FetchEventPreloadHandlePtr preload_handle, const DispatchFetchEventCallback& callback) override { ServiceWorkerContextClient* client = ServiceWorkerContextClient::ThreadSpecificInstance(); @@ -244,6 +247,11 @@ callback.Run(SERVICE_WORKER_ERROR_ABORT, base::Time::Now()); return; } + if (preload_handle) { + // TODO(horo): Implement this to pass |preload_handle| to FetchEvent. + NOTIMPLEMENTED(); + return; + } client->DispatchFetchEvent(fetch_event_id, request, callback); } @@ -429,6 +437,12 @@ context_->interface_registry.AddInterface( base::Bind(&FetchEventDispatcherImpl::Create)); + if (ServiceWorkerUtils::IsMojoForServiceWorkerEnabled()) { + DCHECK(embedded_worker_client_); + embedded_worker_client_->ExposeInterfacesToBrowser( + &context_->interface_registry); + } + SetRegistrationInServiceWorkerGlobalScope(registration_info, version_attrs); Send(new EmbeddedWorkerHostMsg_WorkerThreadStarted( @@ -459,7 +473,7 @@ GetContentClient() ->renderer() ->DidInitializeServiceWorkerContextOnWorkerThread( - context, embedded_worker_id_, script_url_); + context, service_worker_version_id_, script_url_); } void ServiceWorkerContextClient::willDestroyWorkerContext( @@ -492,7 +506,7 @@ g_worker_client_tls.Pointer()->Set(NULL); GetContentClient()->renderer()->WillDestroyServiceWorkerContextOnWorkerThread( - context, embedded_worker_id_, script_url_); + context, service_worker_version_id_, script_url_); } void ServiceWorkerContextClient::workerContextDestroyed() {
diff --git a/content/renderer/service_worker/service_worker_context_client.h b/content/renderer/service_worker/service_worker_context_client.h index 5261f91..622ed930 100644 --- a/content/renderer/service_worker/service_worker_context_client.h +++ b/content/renderer/service_worker/service_worker_context_client.h
@@ -84,7 +84,7 @@ const GURL& service_worker_scope, const GURL& script_url, int worker_devtools_agent_route_id, - std::unique_ptr<EmbeddedWorkerInstanceClientImpl> embedded_worker); + std::unique_ptr<EmbeddedWorkerInstanceClientImpl> embedded_worker_client); ~ServiceWorkerContextClient() override; void OnMessageReceived(int thread_id,
diff --git a/content/shell/browser/shell.cc b/content/shell/browser/shell.cc index a214d2a..a01fdc5 100644 --- a/content/shell/browser/shell.cc +++ b/content/shell/browser/shell.cc
@@ -431,7 +431,9 @@ return switches::IsRunLayoutTestSwitchPresent(); } -void Shell::RendererUnresponsive(WebContents* source) { +void Shell::RendererUnresponsive( + WebContents* source, + const WebContentsUnresponsiveState& unresponsive_state) { if (switches::IsRunLayoutTestSwitchPresent()) BlinkTestController::Get()->RendererUnresponsive(); }
diff --git a/content/shell/browser/shell.h b/content/shell/browser/shell.h index 708b3d57..da0089d 100644 --- a/content/shell/browser/shell.h +++ b/content/shell/browser/shell.h
@@ -158,7 +158,9 @@ const base::string16& message, int32_t line_no, const base::string16& source_id) override; - void RendererUnresponsive(WebContents* source) override; + void RendererUnresponsive( + WebContents* source, + const WebContentsUnresponsiveState& unresponsive_state) override; void ActivateContents(WebContents* contents) override; static gfx::Size GetShellDefaultSize();
diff --git a/content/test/BUILD.gn b/content/test/BUILD.gn index 685d1557..f6f8b8f 100644 --- a/content/test/BUILD.gn +++ b/content/test/BUILD.gn
@@ -1099,6 +1099,7 @@ "../browser/media/session/audio_focus_manager_unittest.cc", "../browser/media/session/media_session_controller_unittest.cc", "../browser/media/session/media_session_uma_helper_unittest.cc", + "../browser/memory/memory_coordinator_impl_unittest.cc", "../browser/memory/memory_coordinator_unittest.cc", "../browser/memory/memory_monitor_android_unittest.cc", "../browser/memory/memory_monitor_win_unittest.cc",
diff --git a/content/test/data/gpu/pixel_offscreenCanvas_2d_commit_main.html b/content/test/data/gpu/pixel_offscreenCanvas_2d_commit_main.html index 2387137..4aba7ad 100644 --- a/content/test/data/gpu/pixel_offscreenCanvas_2d_commit_main.html +++ b/content/test/data/gpu/pixel_offscreenCanvas_2d_commit_main.html
@@ -8,7 +8,7 @@ <html> <head> -<title>OffscreenCanvas 2d commit flow on main thread: blue square on white background.</title> +<title>OffscreenCanvas 2d commit flow on main thread: Four-color squares on white background.</title> <style type="text/css"> .nomargin { margin: 0px auto; @@ -27,10 +27,16 @@ { var canvas = document.getElementById("c"); var offscreenCanvas = canvas.transferControlToOffscreen(); - var ctx2d = offscreenCanvas.getContext("2d"); - ctx2d.fillStyle = "blue"; - ctx2d.fillRect(0, 0, offscreenCanvas.width, offscreenCanvas.height); - ctx2d.commit(); + var offscreen2d = offscreenCanvas.getContext("2d"); + offscreen2d.fillStyle = "red"; + offscreen2d.fillRect(0, 0, 100, 100); + offscreen2d.fillStyle = "green"; + offscreen2d.fillRect(100, 0, 100, 100); + offscreen2d.fillStyle = "blue"; + offscreen2d.fillRect(0, 100, 100, 100); + offscreen2d.fillStyle = "black"; + offscreen2d.fillRect(100, 100, 100, 100); + offscreen2d.commit(); } function waitForFinish() @@ -47,10 +53,10 @@ </script> </head> <body onload="main()"> -<div style="position:relative; width:350px; height:350px; background-color:white"> +<div style="position:relative; width:300px; height:300px; background-color:white"> </div> <div id="container" style="position:absolute; top:0px; left:0px"> -<canvas id="c" width="320" height="320" class="nomargin"></canvas> +<canvas id="c" width="200" height="200" class="nomargin"></canvas> </div> </body> </html>
diff --git a/content/test/data/gpu/pixel_offscreenCanvas_2d_commit_worker.html b/content/test/data/gpu/pixel_offscreenCanvas_2d_commit_worker.html index 410a78ac..1c02a62 100644 --- a/content/test/data/gpu/pixel_offscreenCanvas_2d_commit_worker.html +++ b/content/test/data/gpu/pixel_offscreenCanvas_2d_commit_worker.html
@@ -8,7 +8,7 @@ <html> <head> -<title>OffscreenCanvas 2d commit flow on worker thread: blue square on white background.</title> +<title>OffscreenCanvas 2d commit flow on worker thread: Four-color square on white background.</title> <style type="text/css"> .nomargin { margin: 0px auto; @@ -18,8 +18,14 @@ self.onmessage = function(e) { var transferredCanvas = e.data; var offscreen2d = transferredCanvas.getContext("2d"); + offscreen2d.fillStyle = "red"; + offscreen2d.fillRect(0, 0, 100, 100); + offscreen2d.fillStyle = "green"; + offscreen2d.fillRect(100, 0, 100, 100); offscreen2d.fillStyle = "blue"; - offscreen2d.fillRect(0, 0, transferredCanvas.width, transferredCanvas.height); + offscreen2d.fillRect(0, 100, 100, 100); + offscreen2d.fillStyle = "black"; + offscreen2d.fillRect(100, 100, 100, 100); offscreen2d.commit(); self.postMessage(""); }; @@ -58,10 +64,10 @@ </script> </head> <body onload="main()"> -<div style="position:relative; width:350px; height:350px; background-color:white"> +<div style="position:relative; width:300px; height:300px; background-color:white"> </div> <div id="container" style="position:absolute; top:0px; left:0px"> -<canvas id="c" width="320" height="320" class="nomargin"></canvas> +<canvas id="c" width="200" height="200" class="nomargin"></canvas> </div> </body> </html>
diff --git a/content/test/gpu/gpu_tests/pixel_expectations.py b/content/test/gpu/gpu_tests/pixel_expectations.py index bceb253..f9ac8ac 100644 --- a/content/test/gpu/gpu_tests/pixel_expectations.py +++ b/content/test/gpu/gpu_tests/pixel_expectations.py
@@ -44,3 +44,11 @@ # TODO(kbr): flakily timing out on this configuration. self.Flaky('*', ['linux', 'intel', 'debug'], bug=648369) + + # TODO(xlai): check / generate reference images. + self.Fail('Pixel_OffscreenCanvasAccelerated2D', bug=655311) + self.Fail('Pixel_OffscreenCanvasAccelerated2DWorker', bug=655311) + self.Fail('Pixel_OffscreenCanvasUnaccelerated2D', bug=655311) + self.Fail('Pixel_OffscreenCanvasUnaccelerated2DWorker', bug=655311) + self.Fail('Pixel_OffscreenCanvasUnaccelerated2DGPUCompositing', bug=655311) + self.Fail('Pixel_OffscreenCanvasUnaccelerated2DGPUCompositingWorker', bug=655311)
diff --git a/content/test/gpu/gpu_tests/pixel_test_pages.py b/content/test/gpu/gpu_tests/pixel_test_pages.py index 40074192..d892779 100644 --- a/content/test/gpu/gpu_tests/pixel_test_pages.py +++ b/content/test/gpu/gpu_tests/pixel_test_pages.py
@@ -183,43 +183,43 @@ PixelTestPage( 'pixel_offscreenCanvas_2d_commit_main.html', base_name + '_OffscreenCanvasAccelerated2D', - test_rect=[0, 0, 350, 350], - revision=1, + test_rect=[0, 0, 300, 300], + revision=2, browser_args=browser_args), PixelTestPage( 'pixel_offscreenCanvas_2d_commit_worker.html', base_name + '_OffscreenCanvasAccelerated2DWorker', - test_rect=[0, 0, 350, 350], - revision=1, + test_rect=[0, 0, 300, 300], + revision=2, browser_args=browser_args), PixelTestPage( 'pixel_offscreenCanvas_2d_commit_main.html', base_name + '_OffscreenCanvasUnaccelerated2D', - test_rect=[0, 0, 350, 350], - revision=1, + test_rect=[0, 0, 300, 300], + revision=2, browser_args=browser_args + unaccelerated_args), PixelTestPage( 'pixel_offscreenCanvas_2d_commit_worker.html', base_name + '_OffscreenCanvasUnaccelerated2DWorker', - test_rect=[0, 0, 350, 350], - revision=1, + test_rect=[0, 0, 300, 300], + revision=2, browser_args=browser_args + unaccelerated_args), PixelTestPage( 'pixel_offscreenCanvas_2d_commit_main.html', base_name + '_OffscreenCanvasUnaccelerated2DGPUCompositing', - test_rect=[0, 0, 350, 350], - revision=1, + test_rect=[0, 0, 300, 300], + revision=2, browser_args=browser_args + ['--disable-accelerated-2d-canvas']), PixelTestPage( 'pixel_offscreenCanvas_2d_commit_worker.html', base_name + '_OffscreenCanvasUnaccelerated2DGPUCompositingWorker', - test_rect=[0, 0, 350, 350], - revision=1, + test_rect=[0, 0, 300, 300], + revision=2, browser_args=browser_args + ['--disable-accelerated-2d-canvas']), ]
diff --git a/content/test/gpu/gpu_tests/webgl2_conformance_expectations.py b/content/test/gpu/gpu_tests/webgl2_conformance_expectations.py index 1853e179..9694f7b 100644 --- a/content/test/gpu/gpu_tests/webgl2_conformance_expectations.py +++ b/content/test/gpu/gpu_tests/webgl2_conformance_expectations.py
@@ -60,26 +60,6 @@ bug=654201) self.Fail('conformance2/transform_feedback/transform_feedback.html', bug=654201) - self.Fail('conformance2/context/constants-and-properties-2.html', - bug=655836) - self.Fail('conformance/extensions/webgl-compressed-texture-etc.html', - bug=655836) - self.Fail('conformance/extensions/webgl-compressed-texture-pvrtc.html', - bug=655836) - self.Fail('conformance/extensions/webgl-compressed-texture-atc.html', - bug=655836) - self.Fail('conformance/extensions/webgl-compressed-texture-s3tc.html', - bug=655836) - self.Fail('conformance/extensions/webgl-compressed-texture-s3tc-srgb.html', - bug=655836) - self.Fail('conformance2/textures/misc/tex-storage-compressed-formats.html', - bug=655836) - self.Fail('deqp/functional/gles3/integerstatequery.html', bug=655836) - self.Fail('deqp/functional/gles3/negativetextureapi.html', - ['win', 'mac'], bug=655836) - self.Fail('deqp/functional/gles3/textureformat/*', bug=655836) - self.Fail('deqp/functional/gles3/texturewrap/*', bug=655836) - self.Fail('deqp/functional/gles3/texturewrap.html', bug=655836) # Windows only. # We are awesome! @@ -203,9 +183,6 @@ self.Fail('deqp/data/gles3/shaders/linkage.html', ['mac'], bug=641129) - self.Fail('deqp/functional/gles3/uniformbuffers/random.html', - ['mac'], bug=618464) - # This is due to "centroid out" / "in" mismatch. self.Fail('deqp/data/gles3/shaders/qualification_order.html', ['mac'], bug=483282) @@ -469,6 +446,10 @@ self.Fail('deqp/functional/gles3/shaderoperator/geometric.html', ['mac', 'amd'], bug=483282) + # Fixed on OSX 10.12 + self.Fail('deqp/functional/gles3/uniformbuffers/random.html', + ['mac', 'amd'], bug=618464) + self.Flaky('deqp/functional/gles3/shaderindexing/mat_02.html', ['mac', 'amd'], bug=644360) @@ -500,12 +481,6 @@ self.Fail('deqp/functional/gles3/texturespecification/' + 'random_teximage2d_2d.html', ['mac', 'intel'], bug=483282) - self.Fail('deqp/functional/gles3/texturespecification/' + - 'teximage3d_pbo_params.html', - ['mac', 'intel'], bug=483282) - self.Fail('deqp/functional/gles3/texturespecification/' + - 'texsubimage3d_pbo_params.html', - ['mac', 'intel'], bug=483282) self.Fail('deqp/functional/gles3/shadertexturefunction/' + 'texturelod.html', @@ -524,8 +499,9 @@ self.Fail('deqp/functional/gles3/framebufferblit/rect_04.html', ['mac', 'intel'], bug=483282) - self.Fail('conformance2/textures/misc/tex-unpack-params.html', - ['mac', 'intel'], bug=483282) + # Fixed on OSX 10.11 + self.Fail('deqp/functional/gles3/uniformbuffers/random.html', + ['mac', 'intel'], bug=618464) # Linux only. self.Fail('conformance2/buffers/get-buffer-sub-data.html',
diff --git a/extensions/BUILD.gn b/extensions/BUILD.gn index f502923a..4613736 100644 --- a/extensions/BUILD.gn +++ b/extensions/BUILD.gn
@@ -280,7 +280,7 @@ "//components/resources", "//components/strings", "//components/sync", - "//components/sync:test_support_sync_model", + "//components/sync:test_support_model", "//components/translate/core/common", "//crypto:platform", "//crypto:test_support",
diff --git a/extensions/browser/BUILD.gn b/extensions/browser/BUILD.gn index e58b1af..74fcbd3 100644 --- a/extensions/browser/BUILD.gn +++ b/extensions/browser/BUILD.gn
@@ -418,7 +418,9 @@ ":browser", "//base", "//base/test:test_support", + "//components/cast_certificate", "//components/cast_certificate:test_support", + "//components/cast_certificate/proto:unittest_proto", "//components/crx_file", "//components/keyed_service/content", "//components/pref_registry:test_support",
diff --git a/extensions/browser/api/audio/audio_service_chromeos.cc b/extensions/browser/api/audio/audio_service_chromeos.cc index 5d3d37f..0a17972 100644 --- a/extensions/browser/api/audio/audio_service_chromeos.cc +++ b/extensions/browser/api/audio/audio_service_chromeos.cc
@@ -222,12 +222,13 @@ } void AudioServiceImpl::NotifyDeviceChanged() { - FOR_EACH_OBSERVER(AudioService::Observer, observer_list_, OnDeviceChanged()); + for (auto& observer : observer_list_) + observer.OnDeviceChanged(); } void AudioServiceImpl::NotifyLevelChanged(uint64_t id, int level) { - FOR_EACH_OBSERVER(AudioService::Observer, observer_list_, - OnLevelChanged(base::Uint64ToString(id), level)); + for (auto& observer : observer_list_) + observer.OnLevelChanged(base::Uint64ToString(id), level); // Notify DeviceChanged event for backward compatibility. // TODO(jennyz): remove this code when the old version of hotrod retires. @@ -235,8 +236,8 @@ } void AudioServiceImpl::NotifyMuteChanged(bool is_input, bool is_muted) { - FOR_EACH_OBSERVER(AudioService::Observer, observer_list_, - OnMuteChanged(is_input, is_muted)); + for (auto& observer : observer_list_) + observer.OnMuteChanged(is_input, is_muted); // Notify DeviceChanged event for backward compatibility. // TODO(jennyz): remove this code when the old version of hotrod retires. @@ -273,8 +274,8 @@ devices_info_list.push_back(std::move(info)); } - FOR_EACH_OBSERVER(AudioService::Observer, observer_list_, - OnDevicesChanged(devices_info_list)); + for (auto& observer : observer_list_) + observer.OnDevicesChanged(devices_info_list); // Notify DeviceChanged event for backward compatibility. // TODO(jennyz): remove this code when the old version of hotrod retires.
diff --git a/extensions/browser/api/cast_channel/cast_auth_util.cc b/extensions/browser/api/cast_channel/cast_auth_util.cc index c6067bdf..e6e7268 100644 --- a/extensions/browser/api/cast_channel/cast_auth_util.cc +++ b/extensions/browser/api/cast_channel/cast_auth_util.cc
@@ -6,11 +6,14 @@ #include <vector> +#include "base/feature_list.h" #include "base/logging.h" #include "base/macros.h" +#include "base/metrics/histogram.h" #include "base/strings/string_number_conversions.h" #include "base/strings/stringprintf.h" #include "components/cast_certificate/cast_cert_validator.h" +#include "components/cast_certificate/cast_crl.h" #include "extensions/browser/api/cast_channel/cast_message_util.h" #include "extensions/common/api/cast_channel/cast_channel.pb.h" #include "net/cert/x509_certificate.h" @@ -26,6 +29,15 @@ // The maximum number of days a cert can live for. const int kMaxSelfSignedCertLifetimeInDays = 4; +// Enforce certificate revocation when enabled. +// If disabled, any revocation failures are ignored. +// +// This flags only controls the enforcement. Revocation is checked regardless. +// +// This flag tracks the changes necessary to fully enforce revocation. +const base::Feature kEnforceRevocationChecking{ + "CastCertificateRevocation", base::FEATURE_DISABLED_BY_DEFAULT}; + namespace cast_crypto = ::cast_certificate; // Extracts an embedded DeviceAuthMessage payload from an auth challenge reply @@ -63,6 +75,16 @@ return AuthResult(); } +// Must match with histogram enum CastCertificateStatus. +// This should never be reordered. +enum CertVerificationStatus { + CERT_STATUS_OK, + CERT_STATUS_INVALID_CRL, + CERT_STATUS_VERIFICATION_FAILED, + CERT_STATUS_REVOKED, + CERT_STATUS_COUNT, +}; + } // namespace AuthResult::AuthResult() @@ -110,16 +132,16 @@ peer_cert.valid_start() > base::Time::Now()) { return AuthResult::CreateWithParseError( "Certificate's valid start date is in the future.", - AuthResult::ERROR_VALID_START_DATE_IN_FUTURE); + AuthResult::ERROR_TLS_CERT_VALID_START_DATE_IN_FUTURE); } if (expiry.is_null() || peer_cert.HasExpired()) { return AuthResult::CreateWithParseError("Certificate has expired.", - AuthResult::ERROR_CERT_EXPIRED); + AuthResult::ERROR_TLS_CERT_EXPIRED); } if (expiry > lifetime_limit) { return AuthResult::CreateWithParseError( "Peer cert lifetime is too long.", - AuthResult::ERROR_VALIDITY_PERIOD_TOO_LONG); + AuthResult::ERROR_TLS_CERT_VALIDITY_PERIOD_TOO_LONG); } const AuthResponse& response = auth_message.response(); @@ -130,13 +152,27 @@ // // * Verifies that the certificate chain |response.client_auth_certificate| + // |response.intermediate_certificate| is valid and chains to a trusted -// Cast root. +// Cast root. The list of trusted Cast roots can be overrided by providing a +// non-nullptr |cast_trust_store|. The certificate is verified at +// |verification_time|. +// +// * Verifies that none of the certificates in the chain are revoked based on +// the CRL provided in the response |response.crl|. The CRL is verified to be +// valid and its issuer certificate chains to a trusted Cast CRL root. The +// list of trusted Cast CRL roots can be overrided by providing a non-nullptr +// |crl_trust_store|. If |crl_policy| is CRL_OPTIONAL then the result of +// revocation checking is ignored. The CRL is verified at +// |verification_time|. // // * Verifies that |response.signature| matches the signature // of |signature_input| by |response.client_auth_certificate|'s public // key. -AuthResult VerifyCredentials(const AuthResponse& response, - const std::string& signature_input) { +AuthResult VerifyCredentialsImpl(const AuthResponse& response, + const std::string& signature_input, + const cast_crypto::CRLPolicy& crl_policy, + net::TrustStore* cast_trust_store, + net::TrustStore* crl_trust_store, + const base::Time& verification_time) { // Verify the certificate std::unique_ptr<cast_crypto::CertVerificationContext> verification_context; @@ -147,19 +183,56 @@ response.intermediate_certificate().begin(), response.intermediate_certificate().end()); - // Use the current time when checking certificate validity. - base::Time now = base::Time::Now(); - - // CRL should not be enforced until it is served. - cast_crypto::CastDeviceCertPolicy device_policy; - if (!cast_crypto::VerifyDeviceCert( - cert_chain, now, &verification_context, &device_policy, nullptr, - cast_certificate::CRLPolicy::CRL_OPTIONAL)) { - // TODO(eroman): The error information was lost; this error is ambiguous. - return AuthResult("Failed verifying cast device certificate", - AuthResult::ERROR_CERT_NOT_SIGNED_BY_TRUSTED_CA); + // Parse the CRL. + std::unique_ptr<cast_crypto::CastCRL> crl = + cast_crypto::ParseAndVerifyCRLUsingCustomTrustStore( + response.crl(), verification_time, crl_trust_store); + if (!crl) { + // CRL is invalid. + UMA_HISTOGRAM_ENUMERATION("Cast.Channel.Certificate", + CERT_STATUS_INVALID_CRL, CERT_STATUS_COUNT); + if (crl_policy == cast_crypto::CRLPolicy::CRL_REQUIRED) { + return AuthResult("Failed verifying Cast CRL.", + AuthResult::ERROR_CRL_INVALID); + } } + cast_crypto::CastDeviceCertPolicy device_policy; + bool verification_success = + cast_crypto::VerifyDeviceCertUsingCustomTrustStore( + cert_chain, verification_time, &verification_context, &device_policy, + crl.get(), crl_policy, cast_trust_store); + if (!verification_success) { + // TODO(ryanchung): Once this feature is completely rolled-out, remove the + // reverification step and use error reporting to get verification errors + // for metrics. + bool verification_no_crl_success = + cast_crypto::VerifyDeviceCertUsingCustomTrustStore( + cert_chain, verification_time, &verification_context, + &device_policy, nullptr, cast_crypto::CRLPolicy::CRL_OPTIONAL, + cast_trust_store); + if (!verification_no_crl_success) { + // TODO(eroman): The error information was lost; this error is ambiguous. + UMA_HISTOGRAM_ENUMERATION("Cast.Channel.Certificate", + CERT_STATUS_VERIFICATION_FAILED, + CERT_STATUS_COUNT); + return AuthResult("Failed verifying cast device certificate", + AuthResult::ERROR_CERT_NOT_SIGNED_BY_TRUSTED_CA); + } + if (crl) { + // If CRL was not present, it should've been recorded as such. + UMA_HISTOGRAM_ENUMERATION("Cast.Channel.Certificate", CERT_STATUS_REVOKED, + CERT_STATUS_COUNT); + } + if (crl_policy == cast_crypto::CRLPolicy::CRL_REQUIRED) { + // Device is revoked. + return AuthResult("Failed certificate revocation check.", + AuthResult::ERROR_CERT_REVOKED); + } + } + // The certificate is verified at this point. + UMA_HISTOGRAM_ENUMERATION("Cast.Channel.Certificate", CERT_STATUS_OK, + CERT_STATUS_COUNT); if (!verification_context->VerifySignatureOverData(response.signature(), signature_input)) { return AuthResult("Failed verifying signature over data", @@ -181,6 +254,28 @@ return success; } +AuthResult VerifyCredentials(const AuthResponse& response, + const std::string& signature_input) { + base::Time now = base::Time::Now(); + cast_crypto::CRLPolicy policy = cast_crypto::CRLPolicy::CRL_REQUIRED; + if (!base::FeatureList::IsEnabled(kEnforceRevocationChecking)) { + policy = cast_crypto::CRLPolicy::CRL_OPTIONAL; + } + return VerifyCredentialsImpl(response, signature_input, policy, nullptr, + nullptr, now); +} + +AuthResult VerifyCredentialsForTest(const AuthResponse& response, + const std::string& signature_input, + const cast_crypto::CRLPolicy& crl_policy, + net::TrustStore* cast_trust_store, + net::TrustStore* crl_trust_store, + const base::Time& verification_time) { + return VerifyCredentialsImpl(response, signature_input, crl_policy, + cast_trust_store, crl_trust_store, + verification_time); +} + } // namespace cast_channel } // namespace api } // namespace extensions
diff --git a/extensions/browser/api/cast_channel/cast_auth_util.h b/extensions/browser/api/cast_channel/cast_auth_util.h index 61f1007..95715b0 100644 --- a/extensions/browser/api/cast_channel/cast_auth_util.h +++ b/extensions/browser/api/cast_channel/cast_auth_util.h
@@ -8,9 +8,15 @@ #include <string> #include "base/memory/ref_counted.h" +#include "base/time/time.h" + +namespace cast_certificate { +enum class CRLPolicy; +} namespace net { class X509Certificate; +class TrustStore; } // namespace net namespace extensions { @@ -36,10 +42,11 @@ ERROR_CERT_NOT_SIGNED_BY_TRUSTED_CA, ERROR_CANNOT_EXTRACT_PUBLIC_KEY, ERROR_SIGNED_BLOBS_MISMATCH, - ERROR_UNEXPECTED_AUTH_LIBRARY_RESULT, - ERROR_VALIDITY_PERIOD_TOO_LONG, - ERROR_VALID_START_DATE_IN_FUTURE, - ERROR_CERT_EXPIRED, + ERROR_TLS_CERT_VALIDITY_PERIOD_TOO_LONG, + ERROR_TLS_CERT_VALID_START_DATE_IN_FUTURE, + ERROR_TLS_CERT_EXPIRED, + ERROR_CRL_INVALID, + ERROR_CERT_REVOKED, }; enum PolicyType { POLICY_NONE = 0, POLICY_AUDIO_ONLY = 1 << 0 }; @@ -73,6 +80,18 @@ AuthResult VerifyCredentials(const AuthResponse& response, const std::string& signature_input); +// Exposed for testing only. +// +// Overloaded version of VerifyCredentials that allows modifying +// the crl policy, trust stores, and verification times. +AuthResult VerifyCredentialsForTest( + const AuthResponse& response, + const std::string& signature_input, + const cast_certificate::CRLPolicy& crl_policy, + net::TrustStore* cast_trust_store, + net::TrustStore* crl_trust_store, + const base::Time& verification_time); + } // namespace cast_channel } // namespace api } // namespace extensions
diff --git a/extensions/browser/api/cast_channel/cast_auth_util_unittest.cc b/extensions/browser/api/cast_channel/cast_auth_util_unittest.cc index 9393eac..819daaf 100644 --- a/extensions/browser/api/cast_channel/cast_auth_util_unittest.cc +++ b/extensions/browser/api/cast_channel/cast_auth_util_unittest.cc
@@ -7,8 +7,13 @@ #include <string> #include "base/macros.h" +#include "base/time/time.h" +#include "components/cast_certificate/cast_cert_validator.h" #include "components/cast_certificate/cast_cert_validator_test_helpers.h" +#include "components/cast_certificate/cast_crl.h" +#include "components/cast_certificate/proto/test_suite.pb.h" #include "extensions/common/api/cast_channel/cast_channel.pb.h" +#include "net/cert/internal/trust_store_in_memory.h" #include "testing/gtest/include/gtest/gtest.h" namespace extensions { @@ -54,7 +59,10 @@ TEST_F(CastAuthUtilTest, VerifySuccess) { std::string signed_data; AuthResponse auth_response = CreateAuthResponse(&signed_data); - AuthResult result = VerifyCredentials(auth_response, signed_data); + base::Time now = base::Time::Now(); + AuthResult result = VerifyCredentialsForTest( + auth_response, signed_data, cast_certificate::CRLPolicy::CRL_OPTIONAL, + nullptr, nullptr, now); EXPECT_TRUE(result.success()); EXPECT_EQ(AuthResult::POLICY_NONE, result.channel_policies); } @@ -96,6 +104,156 @@ EXPECT_EQ(AuthResult::ERROR_SIGNED_BLOBS_MISMATCH, result.error_type); } +// Indicates the expected result of test step's verification. +enum TestStepResult { + RESULT_SUCCESS, + RESULT_FAIL, +}; + +// Verifies that the certificate chain provided is not revoked according to +// the provided Cast CRL at |verification_time|. +// The provided CRL is verified at |verification_time|. +// If |crl_required| is set, then a valid Cast CRL must be provided. +// Otherwise, a missing CRL is be ignored. +AuthResult TestVerifyRevocation( + const std::vector<std::string>& certificate_chain, + const std::string& crl_bundle, + const base::Time& verification_time, + bool crl_required, + net::TrustStore* cast_trust_store, + net::TrustStore* crl_trust_store) { + AuthResponse response; + + if (certificate_chain.size() > 0) { + response.set_client_auth_certificate(certificate_chain[0]); + for (size_t i = 1; i < certificate_chain.size(); ++i) + response.add_intermediate_certificate(certificate_chain[i]); + } + + response.set_crl(crl_bundle); + + cast_certificate::CRLPolicy crl_policy = + cast_certificate::CRLPolicy::CRL_REQUIRED; + if (!crl_required && crl_bundle.empty()) + crl_policy = cast_certificate::CRLPolicy::CRL_OPTIONAL; + AuthResult result = + VerifyCredentialsForTest(response, "", crl_policy, cast_trust_store, + crl_trust_store, verification_time); + // This test doesn't set the signature so it will just fail there. + EXPECT_FALSE(result.success()); + return result; +} + +// Runs a single test case. +bool RunTest(const cast_certificate::DeviceCertTest& test_case) { + std::unique_ptr<net::TrustStore> crl_trust_store; + std::unique_ptr<net::TrustStore> cast_trust_store; + if (test_case.use_test_trust_anchors()) { + crl_trust_store = cast_certificate::testing::CreateTrustStoreFromFile( + "certificates/cast_crl_test_root_ca.pem"); + cast_trust_store = cast_certificate::testing::CreateTrustStoreFromFile( + "certificates/cast_test_root_ca.pem"); + + EXPECT_TRUE(crl_trust_store.get()); + EXPECT_TRUE(cast_trust_store.get()); + } + + std::vector<std::string> certificate_chain; + for (auto const& cert : test_case.der_cert_path()) { + certificate_chain.push_back(cert); + } + + // CastAuthUtil verifies the CRL at the same time as the certificate. + base::Time verification_time; + uint64_t cert_verify_time = test_case.cert_verification_time_seconds(); + if (cert_verify_time) { + verification_time = cast_certificate::testing::ConvertUnixTimestampSeconds( + cert_verify_time); + } else { + verification_time = cast_certificate::testing::ConvertUnixTimestampSeconds( + test_case.crl_verification_time_seconds()); + } + + std::string crl_bundle = test_case.crl_bundle(); + AuthResult result; + switch (test_case.expected_result()) { + case cast_certificate::PATH_VERIFICATION_FAILED: + result = TestVerifyRevocation( + certificate_chain, crl_bundle, verification_time, false, + cast_trust_store.get(), crl_trust_store.get()); + EXPECT_EQ(result.error_type, + AuthResult::ERROR_CERT_NOT_SIGNED_BY_TRUSTED_CA); + return result.error_type == + AuthResult::ERROR_CERT_NOT_SIGNED_BY_TRUSTED_CA; + case cast_certificate::CRL_VERIFICATION_FAILED: + // Fall-through intended. + case cast_certificate::REVOCATION_CHECK_FAILED_WITHOUT_CRL: + result = TestVerifyRevocation( + certificate_chain, crl_bundle, verification_time, true, + cast_trust_store.get(), crl_trust_store.get()); + EXPECT_EQ(result.error_type, AuthResult::ERROR_CRL_INVALID); + return result.error_type == AuthResult::ERROR_CRL_INVALID; + case cast_certificate::CRL_EXPIRED_AFTER_INITIAL_VERIFICATION: + // By-pass this test because CRL is always verified at the time the + // certificate is verified. + return true; + case cast_certificate::REVOCATION_CHECK_FAILED: + result = TestVerifyRevocation( + certificate_chain, crl_bundle, verification_time, true, + cast_trust_store.get(), crl_trust_store.get()); + EXPECT_EQ(result.error_type, AuthResult::ERROR_CERT_REVOKED); + return result.error_type == AuthResult::ERROR_CERT_REVOKED; + case cast_certificate::SUCCESS: + result = TestVerifyRevocation( + certificate_chain, crl_bundle, verification_time, false, + cast_trust_store.get(), crl_trust_store.get()); + EXPECT_EQ(result.error_type, AuthResult::ERROR_SIGNED_BLOBS_MISMATCH); + return result.error_type == AuthResult::ERROR_SIGNED_BLOBS_MISMATCH; + case UNSPECIFIED: + return false; + } + return false; +} + +// Parses the provided test suite provided in wire-format proto. +// Each test contains the inputs and the expected output. +// To see the description of the test, execute the test. +// These tests are generated by a test generator in google3. +void RunTestSuite(const std::string& test_suite_file_name) { + std::string testsuite_raw = + cast_certificate::testing::ReadTestFileToString(test_suite_file_name); + cast_certificate::DeviceCertTestSuite test_suite; + EXPECT_TRUE(test_suite.ParseFromString(testsuite_raw)); + uint16_t success = 0; + uint16_t failed = 0; + std::vector<std::string> failed_tests; + + for (auto const& test_case : test_suite.tests()) { + LOG(INFO) << "[ RUN ] " << test_case.description(); + bool result = RunTest(test_case); + EXPECT_TRUE(result); + if (!result) { + LOG(INFO) << "[ FAILED ] " << test_case.description(); + ++failed; + failed_tests.push_back(test_case.description()); + } else { + LOG(INFO) << "[ PASSED ] " << test_case.description(); + ++success; + } + } + LOG(INFO) << "[ PASSED ] " << success << " test(s)."; + if (failed) { + LOG(INFO) << "[ FAILED ] " << failed << " test(s), listed below:"; + for (const auto& failed_test : failed_tests) { + LOG(INFO) << "[ FAILED ] " << failed_test; + } + } +} + +TEST_F(CastAuthUtilTest, CRLTestSuite) { + RunTestSuite("testsuite/testsuite1.pb"); +} + } // namespace } // namespace cast_channel } // namespace api
diff --git a/extensions/browser/api/cast_channel/logger.cc b/extensions/browser/api/cast_channel/logger.cc index 46cd102..eff4c8a 100644 --- a/extensions/browser/api/cast_channel/logger.cc +++ b/extensions/browser/api/cast_channel/logger.cc
@@ -58,6 +58,16 @@ return proto::CHALLENGE_REPLY_ERROR_CANNOT_EXTRACT_PUBLIC_KEY; case AuthResult::ERROR_SIGNED_BLOBS_MISMATCH: return proto::CHALLENGE_REPLY_ERROR_SIGNED_BLOBS_MISMATCH; + case AuthResult::ERROR_TLS_CERT_VALIDITY_PERIOD_TOO_LONG: + return proto::CHALLENGE_REPLY_ERROR_TLS_CERT_VALIDITY_PERIOD_TOO_LONG; + case AuthResult::ERROR_TLS_CERT_VALID_START_DATE_IN_FUTURE: + return proto::CHALLENGE_REPLY_ERROR_TLS_CERT_VALID_START_DATE_IN_FUTURE; + case AuthResult::ERROR_TLS_CERT_EXPIRED: + return proto::CHALLENGE_REPLY_ERROR_TLS_CERT_EXPIRED; + case AuthResult::ERROR_CRL_INVALID: + return proto::CHALLENGE_REPLY_ERROR_CRL_INVALID; + case AuthResult::ERROR_CERT_REVOKED: + return proto::CHALLENGE_REPLY_ERROR_CERT_REVOKED; default: NOTREACHED(); return proto::CHALLENGE_REPLY_ERROR_NONE;
diff --git a/extensions/browser/api/declarative_webrequest/webrequest_action.cc b/extensions/browser/api/declarative_webrequest/webrequest_action.cc index 3092113..39f945b 100644 --- a/extensions/browser/api/declarative_webrequest/webrequest_action.cc +++ b/extensions/browser/api/declarative_webrequest/webrequest_action.cc
@@ -21,6 +21,7 @@ #include "extensions/browser/api/web_request/web_request_api_constants.h" #include "extensions/browser/api/web_request/web_request_api_helpers.h" #include "extensions/browser/api/web_request/web_request_permissions.h" +#include "extensions/browser/extension_navigation_ui_data.h" #include "extensions/browser/guest_view/web_view/web_view_renderer_state.h" #include "extensions/browser/info_map.h" #include "extensions/common/error_utils.h" @@ -475,12 +476,16 @@ return type() == other->type(); } -bool WebRequestAction::HasPermission(const InfoMap* extension_info_map, - const std::string& extension_id, - const net::URLRequest* request, - bool crosses_incognito) const { - if (WebRequestPermissions::HideRequest(extension_info_map, request)) +bool WebRequestAction::HasPermission(ApplyInfo* apply_info, + const std::string& extension_id) const { + const InfoMap* extension_info_map = apply_info->extension_info_map; + const net::URLRequest* request = apply_info->request_data.request; + ExtensionNavigationUIData* navigation_ui_data = + apply_info->request_data.navigation_ui_data; + if (WebRequestPermissions::HideRequest(extension_info_map, request, + navigation_ui_data)) { return false; + } // In unit tests we don't have an extension_info_map object here and skip host // permission checks. @@ -492,7 +497,8 @@ // The embedder can always access all hosts from within a <webview>. // The same is not true of extensions. - if (WebViewRendererState::GetInstance()->IsGuest(process_id)) + if (WebViewRendererState::GetInstance()->IsGuest(process_id) || + (navigation_ui_data && navigation_ui_data->is_web_view())) return true; WebRequestPermissions::HostPermissionsCheck permission_check = @@ -510,7 +516,7 @@ // TODO(devlin): Pass in the real tab id here. return WebRequestPermissions::CanExtensionAccessURL( extension_info_map, extension_id, request->url(), -1, - crosses_incognito, + apply_info->crosses_incognito, permission_check) == PermissionsData::ACCESS_ALLOWED; } @@ -539,9 +545,7 @@ void WebRequestAction::Apply(const std::string& extension_id, base::Time extension_install_time, ApplyInfo* apply_info) const { - if (!HasPermission(apply_info->extension_info_map, extension_id, - apply_info->request_data.request, - apply_info->crosses_incognito)) + if (!HasPermission(apply_info, extension_id)) return; if (stages() & apply_info->request_data.stage) { LinkedPtrEventResponseDelta delta = CreateDelta(
diff --git a/extensions/browser/api/declarative_webrequest/webrequest_action.h b/extensions/browser/api/declarative_webrequest/webrequest_action.h index 2644af0..6109eb0f 100644 --- a/extensions/browser/api/declarative_webrequest/webrequest_action.h +++ b/extensions/browser/api/declarative_webrequest/webrequest_action.h
@@ -119,14 +119,12 @@ // Returns whether the specified extension has permission to execute this // action on |request|. Checks the host permission if the host permissions // strategy is STRATEGY_DEFAULT. - // |extension_info_map| may only be NULL for during testing, in which case - // host permissions are ignored. |crosses_incognito| specifies + // |apply_info->extension_info_map| may only be NULL for during testing, in + // which case host permissions are ignored. |crosses_incognito| specifies // whether the request comes from a different profile than |extension_id| // but was processed because the extension is in spanning mode. - virtual bool HasPermission(const InfoMap* extension_info_map, - const std::string& extension_id, - const net::URLRequest* request, - bool crosses_incognito) const; + bool HasPermission(ApplyInfo* apply_info, + const std::string& extension_id) const; // Factory method that instantiates a concrete WebRequestAction // implementation according to |json_action|, the representation of the
diff --git a/extensions/browser/api/declarative_webrequest/webrequest_condition.cc b/extensions/browser/api/declarative_webrequest/webrequest_condition.cc index 0da8826..6b3f712 100644 --- a/extensions/browser/api/declarative_webrequest/webrequest_condition.cc +++ b/extensions/browser/api/declarative_webrequest/webrequest_condition.cc
@@ -48,14 +48,17 @@ WebRequestData::WebRequestData(net::URLRequest* request, RequestStage stage) : request(request), stage(stage), - original_response_headers(NULL) {} + navigation_ui_data(nullptr), + original_response_headers(nullptr) {} WebRequestData::WebRequestData( net::URLRequest* request, RequestStage stage, + ExtensionNavigationUIData* navigation_ui_data, const net::HttpResponseHeaders* original_response_headers) : request(request), stage(stage), + navigation_ui_data(navigation_ui_data), original_response_headers(original_response_headers) {} WebRequestData::~WebRequestData() {}
diff --git a/extensions/browser/api/declarative_webrequest/webrequest_condition.h b/extensions/browser/api/declarative_webrequest/webrequest_condition.h index 2380dfe6..a572731 100644 --- a/extensions/browser/api/declarative_webrequest/webrequest_condition.h +++ b/extensions/browser/api/declarative_webrequest/webrequest_condition.h
@@ -18,15 +18,16 @@ #include "net/http/http_response_headers.h" namespace extensions { +class ExtensionNavigationUIData; // Container for information about a URLRequest to determine which // rules apply to the request. struct WebRequestData { WebRequestData(net::URLRequest* request, RequestStage stage); - WebRequestData( - net::URLRequest* request, - RequestStage stage, - const net::HttpResponseHeaders* original_response_headers); + WebRequestData(net::URLRequest* request, + RequestStage stage, + ExtensionNavigationUIData* navigation_ui_data, + const net::HttpResponseHeaders* original_response_headers); ~WebRequestData(); // The network request that is currently being processed. @@ -35,6 +36,7 @@ RequestStage stage; // Additional information about requests that is not // available in all request stages. + ExtensionNavigationUIData* navigation_ui_data; const net::HttpResponseHeaders* original_response_headers; };
diff --git a/extensions/browser/api/declarative_webrequest/webrequest_condition_attribute_unittest.cc b/extensions/browser/api/declarative_webrequest/webrequest_condition_attribute_unittest.cc index 5527cd6..87d5f303 100644 --- a/extensions/browser/api/declarative_webrequest/webrequest_condition_attribute_unittest.cc +++ b/extensions/browser/api/declarative_webrequest/webrequest_condition_attribute_unittest.cc
@@ -162,10 +162,10 @@ EXPECT_EQ("", error); ASSERT_TRUE(attribute_include.get()); EXPECT_FALSE(attribute_include->IsFulfilled( - WebRequestData(url_request.get(), ON_BEFORE_REQUEST, + WebRequestData(url_request.get(), ON_BEFORE_REQUEST, nullptr, url_request->response_headers()))); EXPECT_TRUE(attribute_include->IsFulfilled( - WebRequestData(url_request.get(), ON_HEADERS_RECEIVED, + WebRequestData(url_request.get(), ON_HEADERS_RECEIVED, nullptr, url_request->response_headers()))); EXPECT_EQ(std::string(keys::kContentTypeKey), attribute_include->GetName()); @@ -175,7 +175,7 @@ EXPECT_EQ("", error); ASSERT_TRUE(attribute_exclude.get()); EXPECT_FALSE(attribute_exclude->IsFulfilled( - WebRequestData(url_request.get(), ON_HEADERS_RECEIVED, + WebRequestData(url_request.get(), ON_HEADERS_RECEIVED, nullptr, url_request->response_headers()))); content_types.Clear(); @@ -186,7 +186,7 @@ EXPECT_EQ("", error); ASSERT_TRUE(attribute_unincluded.get()); EXPECT_FALSE(attribute_unincluded->IsFulfilled( - WebRequestData(url_request.get(), ON_HEADERS_RECEIVED, + WebRequestData(url_request.get(), ON_HEADERS_RECEIVED, nullptr, url_request->response_headers()))); scoped_refptr<const WebRequestConditionAttribute> attribute_unexcluded = @@ -195,7 +195,7 @@ EXPECT_EQ("", error); ASSERT_TRUE(attribute_unexcluded.get()); EXPECT_TRUE(attribute_unexcluded->IsFulfilled( - WebRequestData(url_request.get(), ON_HEADERS_RECEIVED, + WebRequestData(url_request.get(), ON_HEADERS_RECEIVED, nullptr, url_request->response_headers()))); EXPECT_EQ(std::string(keys::kExcludeContentTypeKey), attribute_unexcluded->GetName()); @@ -435,7 +435,7 @@ EXPECT_EQ(key, attribute->GetName()); *result = attribute->IsFulfilled(WebRequestData( - url_request, stage, url_request->response_headers())); + url_request, stage, nullptr, url_request->response_headers())); } } // namespace
diff --git a/extensions/browser/api/display_source/display_source_apitestbase.cc b/extensions/browser/api/display_source/display_source_apitestbase.cc index 5b9ac88..b2c52c1 100644 --- a/extensions/browser/api/display_source/display_source_apitestbase.cc +++ b/extensions/browser/api/display_source/display_source_apitestbase.cc
@@ -406,8 +406,8 @@ } void MockDisplaySourceConnectionDelegate::NotifySinksUpdated() { - FOR_EACH_OBSERVER(DisplaySourceConnectionDelegate::Observer, observers_, - OnSinksUpdated(sinks_)); + for (auto& observer : observers_) + observer.OnSinksUpdated(sinks_); } void MockDisplaySourceConnectionDelegate::
diff --git a/extensions/browser/api/networking_private/networking_private_linux.cc b/extensions/browser/api/networking_private/networking_private_linux.cc index 2b8ccd7..c6a467f 100644 --- a/extensions/browser/api/networking_private/networking_private_linux.cc +++ b/extensions/browser/api/networking_private/networking_private_linux.cc
@@ -1176,17 +1176,15 @@ void NetworkingPrivateLinux::OnNetworksChangedEventOnUIThread( const GuidList& network_guids) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); - FOR_EACH_OBSERVER(NetworkingPrivateDelegateObserver, - network_events_observers_, - OnNetworksChangedEvent(network_guids)); + for (auto& observer : network_events_observers_) + observer.OnNetworksChangedEvent(network_guids); } void NetworkingPrivateLinux::OnNetworkListChangedEventOnUIThread( const GuidList& network_guids) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); - FOR_EACH_OBSERVER(NetworkingPrivateDelegateObserver, - network_events_observers_, - OnNetworkListChangedEvent(network_guids)); + for (auto& observer : network_events_observers_) + observer.OnNetworkListChangedEvent(network_guids); } void NetworkingPrivateLinux::PostOnNetworksChangedToUIThread(
diff --git a/extensions/browser/api/networking_private/networking_private_service_client.cc b/extensions/browser/api/networking_private/networking_private_service_client.cc index 5a40cc1..da828a8 100644 --- a/extensions/browser/api/networking_private/networking_private_service_client.cc +++ b/extensions/browser/api/networking_private/networking_private_service_client.cc
@@ -459,17 +459,15 @@ void NetworkingPrivateServiceClient::OnNetworksChangedEventOnUIThread( const std::vector<std::string>& network_guids) { DCHECK_CURRENTLY_ON(BrowserThread::UI); - FOR_EACH_OBSERVER(NetworkingPrivateDelegateObserver, - network_events_observers_, - OnNetworksChangedEvent(network_guids)); + for (auto& observer : network_events_observers_) + observer.OnNetworksChangedEvent(network_guids); } void NetworkingPrivateServiceClient::OnNetworkListChangedEventOnUIThread( const std::vector<std::string>& network_guids) { DCHECK_CURRENTLY_ON(BrowserThread::UI); - FOR_EACH_OBSERVER(NetworkingPrivateDelegateObserver, - network_events_observers_, - OnNetworkListChangedEvent(network_guids)); + for (auto& observer : network_events_observers_) + observer.OnNetworkListChangedEvent(network_guids); } } // namespace extensions
diff --git a/extensions/browser/api/printer_provider_internal/printer_provider_internal_api.cc b/extensions/browser/api/printer_provider_internal/printer_provider_internal_api.cc index db57e7f2..ff7eee7 100644 --- a/extensions/browser/api/printer_provider_internal/printer_provider_internal_api.cc +++ b/extensions/browser/api/printer_provider_internal/printer_provider_internal_api.cc
@@ -67,33 +67,32 @@ const Extension* extension, int request_id, const PrinterProviderInternalAPIObserver::PrinterInfoVector& printers) { - FOR_EACH_OBSERVER(PrinterProviderInternalAPIObserver, observers_, - OnGetPrintersResult(extension, request_id, printers)); + for (auto& observer : observers_) + observer.OnGetPrintersResult(extension, request_id, printers); } void PrinterProviderInternalAPI::NotifyGetCapabilityResult( const Extension* extension, int request_id, const base::DictionaryValue& capability) { - FOR_EACH_OBSERVER(PrinterProviderInternalAPIObserver, observers_, - OnGetCapabilityResult(extension, request_id, capability)); + for (auto& observer : observers_) + observer.OnGetCapabilityResult(extension, request_id, capability); } void PrinterProviderInternalAPI::NotifyPrintResult( const Extension* extension, int request_id, api::printer_provider_internal::PrintError error) { - FOR_EACH_OBSERVER(PrinterProviderInternalAPIObserver, observers_, - OnPrintResult(extension, request_id, error)); + for (auto& observer : observers_) + observer.OnPrintResult(extension, request_id, error); } void PrinterProviderInternalAPI::NotifyGetUsbPrinterInfoResult( const Extension* extension, int request_id, const api::printer_provider::PrinterInfo* printer_info) { - FOR_EACH_OBSERVER( - PrinterProviderInternalAPIObserver, observers_, - OnGetUsbPrinterInfoResult(extension, request_id, printer_info)); + for (auto& observer : observers_) + observer.OnGetUsbPrinterInfoResult(extension, request_id, printer_info); } PrinterProviderInternalReportPrintResultFunction::
diff --git a/extensions/browser/api/web_request/web_request_api.cc b/extensions/browser/api/web_request/web_request_api.cc index 1e5c123..3b7e3a9 100644 --- a/extensions/browser/api/web_request/web_request_api.cc +++ b/extensions/browser/api/web_request/web_request_api.cc
@@ -183,15 +183,33 @@ // Given a |request|, this function determines whether it originated from // a <webview> guest process or not. If it is from a <webview> guest process, -// then |web_view_info| is returned with information about the instance ID -// that uniquely identifies the <webview> and its embedder. +// then |web_view_instance_id| and |web_view_rules_registry_id| are returned +// with information about the instance ID that uniquely identifies the +// <webview> and its embedder, as well as the rules registry ID.. bool GetWebViewInfo(const net::URLRequest* request, - WebViewRendererState::WebViewInfo* web_view_info) { + ExtensionNavigationUIData* navigation_ui_data, + int* web_view_instance_id, + int* web_view_rules_registry_id) { int render_process_host_id = -1; int routing_id = -1; ExtractRequestRoutingInfo(request, &render_process_host_id, &routing_id); - return WebViewRendererState::GetInstance()->GetInfo( - render_process_host_id, routing_id, web_view_info); + WebViewRendererState::WebViewInfo web_view_info; + if (WebViewRendererState::GetInstance()->GetInfo( + render_process_host_id, routing_id, &web_view_info)) { + *web_view_instance_id = web_view_info.instance_id; + *web_view_rules_registry_id = web_view_info.rules_registry_id; + return true; + } + + // PlzNavigate main frame request. + if (navigation_ui_data && navigation_ui_data->is_web_view()) { + *web_view_instance_id = navigation_ui_data->web_view_instance_id(); + *web_view_rules_registry_id = + navigation_ui_data->web_view_rules_registry_id(); + return true; + } + + return false; } // Converts a HttpHeaders dictionary to a |name|, |value| pair. Returns @@ -229,14 +247,13 @@ // a <webview> guest renderer. // |extension_id| identifies the extension that sends and receives the event. // |is_web_view_guest| indicates whether the action is for a <webview>. -// |web_view_info| is a struct containing information about the <webview> -// embedder. +// |web_view_instance_id| is a valid if |is_web_view_guest| is true. // |event_details| is passed to the event listener. void SendOnMessageEventOnUI( void* browser_context_id, const std::string& extension_id, bool is_web_view_guest, - const WebViewRendererState::WebViewInfo& web_view_info, + int web_view_instance_id, std::unique_ptr<WebRequestEventDetails> event_details) { DCHECK_CURRENTLY_ON(BrowserThread::UI); @@ -259,7 +276,7 @@ // process. We use a filter here so that only event listeners for a particular // <webview> will fire. if (is_web_view_guest) { - event_filtering_info.SetInstanceID(web_view_info.instance_id); + event_filtering_info.SetInstanceID(is_web_view_guest); histogram_value = events::WEB_VIEW_INTERNAL_ON_MESSAGE; event_name = webview::kEventMessage; } else { @@ -314,9 +331,11 @@ // We hide events from the system context as well as sensitive requests. bool ShouldHideEvent(void* browser_context, const InfoMap* extension_info_map, - const net::URLRequest* request) { + const net::URLRequest* request, + ExtensionNavigationUIData* navigation_ui_data) { return (!browser_context || - WebRequestPermissions::HideRequest(extension_info_map, request)); + WebRequestPermissions::HideRequest(extension_info_map, request, + navigation_ui_data)); } } // namespace @@ -561,8 +580,10 @@ net::URLRequest* request, const net::CompletionCallback& callback, GURL* new_url) { - if (ShouldHideEvent(browser_context, extension_info_map, request)) + if (ShouldHideEvent(browser_context, extension_info_map, request, + navigation_ui_data)) { return net::OK; + } if (IsPageLoad(request)) NotifyPageLoad(); @@ -578,11 +599,11 @@ initialize_blocked_requests |= ProcessDeclarativeRules(browser_context, extension_info_map, web_request::OnBeforeRequest::kEventName, request, - ON_BEFORE_REQUEST, NULL); + navigation_ui_data, ON_BEFORE_REQUEST, NULL); int extra_info_spec = 0; RawListeners listeners = GetMatchingListeners( - browser_context, extension_info_map, + browser_context, extension_info_map, navigation_ui_data, web_request::OnBeforeRequest::kEventName, request, &extra_info_spec); if (!listeners.empty() && !GetAndSetSignaled(request->identifier(), kOnBeforeRequest)) { @@ -610,7 +631,7 @@ // If there are no blocking handlers, only the declarative rules tried // to modify the request and we can respond synchronously. return ExecuteDeltas(browser_context, request->identifier(), - false /* call_callback*/); + navigation_ui_data, false /* call_callback*/); } return net::ERR_IO_PENDING; } @@ -622,19 +643,21 @@ net::URLRequest* request, const net::CompletionCallback& callback, net::HttpRequestHeaders* headers) { - if (ShouldHideEvent(browser_context, extension_info_map, request)) + if (ShouldHideEvent(browser_context, extension_info_map, request, + navigation_ui_data)) { return net::OK; + } bool initialize_blocked_requests = false; initialize_blocked_requests |= ProcessDeclarativeRules( browser_context, extension_info_map, keys::kOnBeforeSendHeadersEvent, - request, ON_BEFORE_SEND_HEADERS, NULL); + request, navigation_ui_data, ON_BEFORE_SEND_HEADERS, NULL); int extra_info_spec = 0; RawListeners listeners = GetMatchingListeners( - browser_context, extension_info_map, keys::kOnBeforeSendHeadersEvent, - request, &extra_info_spec); + browser_context, extension_info_map, navigation_ui_data, + keys::kOnBeforeSendHeadersEvent, request, &extra_info_spec); if (!listeners.empty() && !GetAndSetSignaled(request->identifier(), kOnBeforeSendHeaders)) { std::unique_ptr<WebRequestEventDetails> event_details( @@ -661,7 +684,7 @@ // If there are no blocking handlers, only the declarative rules tried // to modify the request and we can respond synchronously. return ExecuteDeltas(browser_context, request->identifier(), - false /* call_callback*/); + navigation_ui_data, false /* call_callback*/); } return net::ERR_IO_PENDING; } @@ -672,7 +695,8 @@ ExtensionNavigationUIData* navigation_ui_data, net::URLRequest* request, const net::HttpRequestHeaders& headers) { - if (ShouldHideEvent(browser_context, extension_info_map, request)) + if (ShouldHideEvent(browser_context, extension_info_map, request, + navigation_ui_data)) return; if (GetAndSetSignaled(request->identifier(), kOnSendHeaders)) @@ -682,8 +706,8 @@ int extra_info_spec = 0; RawListeners listeners = GetMatchingListeners( - browser_context, extension_info_map, keys::kOnSendHeadersEvent, request, - &extra_info_spec); + browser_context, extension_info_map, navigation_ui_data, + keys::kOnSendHeadersEvent, request, &extra_info_spec); if (listeners.empty()) return; @@ -704,19 +728,22 @@ const net::HttpResponseHeaders* original_response_headers, scoped_refptr<net::HttpResponseHeaders>* override_response_headers, GURL* allowed_unsafe_redirect_url) { - if (ShouldHideEvent(browser_context, extension_info_map, request)) + if (ShouldHideEvent(browser_context, extension_info_map, request, + navigation_ui_data)) { return net::OK; + } bool initialize_blocked_requests = false; initialize_blocked_requests |= ProcessDeclarativeRules( browser_context, extension_info_map, keys::kOnHeadersReceivedEvent, - request, ON_HEADERS_RECEIVED, original_response_headers); + request, navigation_ui_data, ON_HEADERS_RECEIVED, + original_response_headers); int extra_info_spec = 0; RawListeners listeners = GetMatchingListeners( - browser_context, extension_info_map, keys::kOnHeadersReceivedEvent, - request, &extra_info_spec); + browser_context, extension_info_map, navigation_ui_data, + keys::kOnHeadersReceivedEvent, request, &extra_info_spec); if (!listeners.empty() && !GetAndSetSignaled(request->identifier(), kOnHeadersReceived)) { @@ -746,7 +773,7 @@ // If there are no blocking handlers, only the declarative rules tried // to modify the request and we can respond synchronously. return ExecuteDeltas(browser_context, request->identifier(), - false /* call_callback*/); + navigation_ui_data, false /* call_callback*/); } return net::ERR_IO_PENDING; } @@ -763,14 +790,15 @@ // No browser_context means that this is for authentication challenges in the // system context. Skip in that case. Also skip sensitive requests. if (!browser_context || - WebRequestPermissions::HideRequest(extension_info_map, request)) { + WebRequestPermissions::HideRequest(extension_info_map, request, + navigation_ui_data)) { return net::NetworkDelegate::AUTH_REQUIRED_RESPONSE_NO_ACTION; } int extra_info_spec = 0; RawListeners listeners = GetMatchingListeners( - browser_context, extension_info_map, keys::kOnAuthRequiredEvent, request, - &extra_info_spec); + browser_context, extension_info_map, navigation_ui_data, + keys::kOnAuthRequiredEvent, request, &extra_info_spec); if (listeners.empty()) return net::NetworkDelegate::AUTH_REQUIRED_RESPONSE_NO_ACTION; @@ -799,8 +827,10 @@ ExtensionNavigationUIData* navigation_ui_data, net::URLRequest* request, const GURL& new_location) { - if (ShouldHideEvent(browser_context, extension_info_map, request)) + if (ShouldHideEvent(browser_context, extension_info_map, request, + navigation_ui_data)) { return; + } if (GetAndSetSignaled(request->identifier(), kOnBeforeRedirect)) return; @@ -812,8 +842,8 @@ int extra_info_spec = 0; RawListeners listeners = GetMatchingListeners( - browser_context, extension_info_map, keys::kOnBeforeRedirectEvent, - request, &extra_info_spec); + browser_context, extension_info_map, navigation_ui_data, + keys::kOnBeforeRedirectEvent, request, &extra_info_spec); if (listeners.empty()) return; @@ -835,8 +865,10 @@ int net_error) { DCHECK_NE(net::ERR_IO_PENDING, net_error); - if (ShouldHideEvent(browser_context, extension_info_map, request)) + if (ShouldHideEvent(browser_context, extension_info_map, request, + navigation_ui_data)) { return; + } // OnResponseStarted is even triggered, when the request was cancelled. if (net_error != net::OK) @@ -844,8 +876,8 @@ int extra_info_spec = 0; RawListeners listeners = GetMatchingListeners( - browser_context, extension_info_map, keys::kOnResponseStartedEvent, - request, &extra_info_spec); + browser_context, extension_info_map, navigation_ui_data, + keys::kOnResponseStartedEvent, request, &extra_info_spec); if (listeners.empty()) return; @@ -880,7 +912,8 @@ // already signaled it and thus we have to signal the end of it. This is // risk-free because the handler cannot modify the request now. if (!browser_context || - (WebRequestPermissions::HideRequest(extension_info_map, request) && + (WebRequestPermissions::HideRequest(extension_info_map, request, + navigation_ui_data) && !WasSignaled(*request))) { return; } @@ -895,9 +928,9 @@ ClearPendingCallbacks(request); int extra_info_spec = 0; - RawListeners listeners = - GetMatchingListeners(browser_context, extension_info_map, - keys::kOnCompletedEvent, request, &extra_info_spec); + RawListeners listeners = GetMatchingListeners( + browser_context, extension_info_map, navigation_ui_data, + keys::kOnCompletedEvent, request, &extra_info_spec); if (listeners.empty()) return; @@ -933,7 +966,8 @@ // already signaled it and thus we have to signal the end of it. This is // risk-free because the handler cannot modify the request now. if (!browser_context || - (WebRequestPermissions::HideRequest(extension_info_map, request) && + (WebRequestPermissions::HideRequest(extension_info_map, request, + navigation_ui_data) && !WasSignaled(*request))) { return; } @@ -950,7 +984,7 @@ int extra_info_spec = 0; RawListeners listeners = GetMatchingListeners( - browser_context, extension_info_map, + browser_context, extension_info_map, navigation_ui_data, web_request::OnErrorOccurred::kEventName, request, &extra_info_spec); if (listeners.empty()) return; @@ -1310,6 +1344,7 @@ void* browser_context, const net::URLRequest* request, const InfoMap* extension_info_map, + ExtensionNavigationUIData* navigation_ui_data, bool crosses_incognito, const std::string& event_name, const GURL& url, @@ -1322,8 +1357,10 @@ RawListeners* matching_listeners) { std::string web_request_event_name(event_name); WebViewRendererState::WebViewInfo web_view_info; - bool is_web_view_guest = WebViewRendererState::GetInstance()->GetInfo( - render_process_host_id, routing_id, &web_view_info); + bool is_web_view_guest = + WebViewRendererState::GetInstance()->GetInfo( + render_process_host_id, routing_id, &web_view_info) || + (navigation_ui_data && navigation_ui_data->is_web_view()); if (is_web_view_guest) { web_request_event_name.replace( 0, sizeof(kWebRequestEventPrefix) - 1, webview::kWebViewEventPrefix); @@ -1337,7 +1374,10 @@ continue; } - if (is_web_view_guest && + // If this is a PlzNavigate request, then |navigation_ui_data| will be valid + // and the IDs will be -1. We can skip this verification since + // |navigation_ui_data| was created and set in the browser so it's trusted. + if (is_web_view_guest && !navigation_ui_data && (listener->id.embedder_process_id != web_view_info.embedder_process_id || listener->id.web_view_instance_id != web_view_info.instance_id)) { @@ -1361,6 +1401,7 @@ // TODO(devlin): Figure out when one/both of these can fail, and if we // need to address it. bool found_render_frame = + !navigation_ui_data && content::ResourceRequestInfo::GetRenderFrameForRequest( request, &render_process_id, &render_frame_id); UMA_HISTOGRAM_BOOLEAN("Extensions.WebRequestEventFoundFrame", @@ -1369,6 +1410,8 @@ if (found_render_frame) { ExtensionApiFrameIdMap::Get()->GetCachedFrameDataOnIO( render_process_id, render_frame_id, &frame_data); + } else if (navigation_ui_data) { + frame_data = navigation_ui_data->frame_data(); } // Check if the tab id and window id match, if they were set in the // listener params. @@ -1428,6 +1471,7 @@ ExtensionWebRequestEventRouter::GetMatchingListeners( void* browser_context, const InfoMap* extension_info_map, + ExtensionNavigationUIData* navigation_ui_data, const std::string& event_name, const net::URLRequest* request, int* extra_info_spec) { @@ -1455,18 +1499,18 @@ } RawListeners matching_listeners; - GetMatchingListenersImpl( - browser_context, request, extension_info_map, false, event_name, - url, render_process_host_id, routing_id, resource_type, - is_async_request, is_request_from_extension, extra_info_spec, - &matching_listeners); + GetMatchingListenersImpl(browser_context, request, extension_info_map, + navigation_ui_data, false, event_name, url, + render_process_host_id, routing_id, resource_type, + is_async_request, is_request_from_extension, + extra_info_spec, &matching_listeners); void* cross_browser_context = GetCrossBrowserContext(browser_context); if (cross_browser_context) { - GetMatchingListenersImpl( - cross_browser_context, request, extension_info_map, true, event_name, - url, render_process_host_id, routing_id, resource_type, - is_async_request, is_request_from_extension, extra_info_spec, - &matching_listeners); + GetMatchingListenersImpl(cross_browser_context, request, extension_info_map, + navigation_ui_data, true, event_name, url, + render_process_host_id, routing_id, resource_type, + is_async_request, is_request_from_extension, + extra_info_spec, &matching_listeners); } return matching_listeners; @@ -1665,7 +1709,7 @@ if (num_handlers_blocking == 0) { blocked_request.request->LogUnblocked(); - ExecuteDeltas(browser_context, request_id, true); + ExecuteDeltas(browser_context, request_id, nullptr, true); } else { // Update the URLRequest to make sure it's tagged with an extension that's // still blocking it. This may end up being the same extension as before. @@ -1685,16 +1729,18 @@ void ExtensionWebRequestEventRouter::SendMessages( void* browser_context, - const BlockedRequest& blocked_request) { + const BlockedRequest& blocked_request, + ExtensionNavigationUIData* navigation_ui_data) { const helpers::EventResponseDeltas& deltas = blocked_request.response_deltas; for (const auto& delta : deltas) { const std::set<std::string>& messages = delta->messages_to_extension; for (const std::string& message : messages) { std::unique_ptr<WebRequestEventDetails> event_details( CreateEventDetails(blocked_request.request, /* extra_info_spec */ 0)); - WebViewRendererState::WebViewInfo web_view_info; - bool is_web_view_guest = GetWebViewInfo(blocked_request.request, - &web_view_info); + int web_view_instance_id, web_view_rules_registry_id; + bool is_web_view_guest = + GetWebViewInfo(blocked_request.request, navigation_ui_data, + &web_view_instance_id, &web_view_rules_registry_id); event_details->SetString(keys::kMessageKey, message); event_details->SetString(keys::kStageKey, GetRequestStageAsString(blocked_request.event)); @@ -1702,15 +1748,17 @@ BrowserThread::PostTask( BrowserThread::UI, FROM_HERE, base::Bind(&SendOnMessageEventOnUI, browser_context, - delta->extension_id, is_web_view_guest, web_view_info, - base::Passed(&event_details))); + delta->extension_id, is_web_view_guest, + web_view_instance_id, base::Passed(&event_details))); } } } -int ExtensionWebRequestEventRouter::ExecuteDeltas(void* browser_context, - uint64_t request_id, - bool call_callback) { +int ExtensionWebRequestEventRouter::ExecuteDeltas( + void* browser_context, + uint64_t request_id, + ExtensionNavigationUIData* navigation_ui_data, + bool call_callback) { BlockedRequest& blocked_request = blocked_requests_[request_id]; CHECK_EQ(0, blocked_request.num_handlers_blocking); helpers::EventResponseDeltas& deltas = blocked_request.response_deltas; @@ -1762,7 +1810,7 @@ NOTREACHED(); } - SendMessages(browser_context, blocked_request); + SendMessages(browser_context, blocked_request, navigation_ui_data); if (!warnings.empty()) { BrowserThread::PostTask( @@ -1813,12 +1861,15 @@ const InfoMap* extension_info_map, const std::string& event_name, net::URLRequest* request, + ExtensionNavigationUIData* navigation_ui_data, RequestStage request_stage, const net::HttpResponseHeaders* original_response_headers) { - WebViewRendererState::WebViewInfo web_view_info; - bool is_web_view_guest = GetWebViewInfo(request, &web_view_info); + int web_view_instance_id, web_view_rules_registry_id; + bool is_web_view_guest = + GetWebViewInfo(request, navigation_ui_data, &web_view_instance_id, + &web_view_rules_registry_id); int rules_registry_id = is_web_view_guest - ? web_view_info.rules_registry_id + ? web_view_rules_registry_id : RulesRegistryService::kDefaultRulesRegistryID; RulesRegistryKey rules_key(browser_context, rules_registry_id); @@ -1881,7 +1932,8 @@ WebRequestRulesRegistry* rules_registry = it.first; helpers::EventResponseDeltas result = rules_registry->CreateDeltas( extension_info_map, - WebRequestData(request, request_stage, original_response_headers), + WebRequestData(request, request_stage, navigation_ui_data, + original_response_headers), it.second); if (!result.empty()) { @@ -1915,10 +1967,8 @@ base::Time::Now() - blocked_request.blocking_time; UMA_HISTOGRAM_TIMES("Extensions.NetworkDelayRegistryLoad", block_time); - ProcessDeclarativeRules(browser_context, - blocked_request.extension_info_map, - event_name, - blocked_request.request, + ProcessDeclarativeRules(browser_context, blocked_request.extension_info_map, + event_name, blocked_request.request, nullptr, request_stage, blocked_request.original_response_headers.get()); // Reset to NULL so that nobody relies on this being set.
diff --git a/extensions/browser/api/web_request/web_request_api.h b/extensions/browser/api/web_request/web_request_api.h index e0051e6..5031d207 100644 --- a/extensions/browser/api/web_request/web_request_api.h +++ b/extensions/browser/api/web_request/web_request_api.h
@@ -436,6 +436,7 @@ RawListeners GetMatchingListeners( void* browser_context, const extensions::InfoMap* extension_info_map, + ExtensionNavigationUIData* navigation_ui_data, const std::string& event_name, const net::URLRequest* request, int* extra_info_spec); @@ -447,6 +448,7 @@ void GetMatchingListenersImpl(void* browser_context, const net::URLRequest* request, const extensions::InfoMap* extension_info_map, + ExtensionNavigationUIData* navigation_ui_data, bool crosses_incognito, const std::string& event_name, const GURL& url, @@ -477,6 +479,7 @@ // and wants to return the correct network error code himself. int ExecuteDeltas(void* browser_context, uint64_t request_id, + ExtensionNavigationUIData* navigation_ui_data, bool call_callback); // Evaluates the rules of the declarative webrequest API and stores @@ -489,14 +492,16 @@ const extensions::InfoMap* extension_info_map, const std::string& event_name, net::URLRequest* request, + ExtensionNavigationUIData* navigation_ui_data, extensions::RequestStage request_stage, const net::HttpResponseHeaders* original_response_headers); // If the BlockedRequest contains messages_to_extension entries in the event // deltas, we send them to subscribers of // chrome.declarativeWebRequest.onMessage. - void SendMessages( - void* browser_context, const BlockedRequest& blocked_request); + void SendMessages(void* browser_context, + const BlockedRequest& blocked_request, + ExtensionNavigationUIData* navigation_ui_data); // Called when the RulesRegistry is ready to unblock a request that was // waiting for said event.
diff --git a/extensions/browser/api/web_request/web_request_permissions.cc b/extensions/browser/api/web_request/web_request_permissions.cc index f213890..c4ac795 100644 --- a/extensions/browser/api/web_request/web_request_permissions.cc +++ b/extensions/browser/api/web_request/web_request_permissions.cc
@@ -7,6 +7,7 @@ #include "base/strings/string_util.h" #include "base/strings/stringprintf.h" #include "content/public/browser/resource_request_info.h" +#include "extensions/browser/extension_navigation_ui_data.h" #include "extensions/browser/guest_view/web_view/web_view_renderer_state.h" #include "extensions/browser/info_map.h" #include "extensions/common/constants.h" @@ -84,14 +85,17 @@ // static bool WebRequestPermissions::HideRequest( const extensions::InfoMap* extension_info_map, - const net::URLRequest* request) { + const net::URLRequest* request, + extensions::ExtensionNavigationUIData* navigation_ui_data) { // Hide requests from the Chrome WebStore App or signin process. const ResourceRequestInfo* info = ResourceRequestInfo::ForRequest(request); if (info) { int process_id = info->GetChildID(); // Never hide requests from guest processes. - if (extensions::WebViewRendererState::GetInstance()->IsGuest(process_id)) + if (extensions::WebViewRendererState::GetInstance()->IsGuest(process_id) || + (navigation_ui_data && navigation_ui_data->is_web_view())) { return false; + } if (extension_info_map && extension_info_map->process_map().Contains(extensions::kWebStoreAppId,
diff --git a/extensions/browser/api/web_request/web_request_permissions.h b/extensions/browser/api/web_request/web_request_permissions.h index f24b019e..02c98ca4 100644 --- a/extensions/browser/api/web_request/web_request_permissions.h +++ b/extensions/browser/api/web_request/web_request_permissions.h
@@ -14,6 +14,7 @@ class GURL; namespace extensions { +class ExtensionNavigationUIData; class InfoMap; } @@ -32,8 +33,10 @@ }; // Returns true if the request shall not be reported to extensions. - static bool HideRequest(const extensions::InfoMap* extension_info_map, - const net::URLRequest* request); + static bool HideRequest( + const extensions::InfoMap* extension_info_map, + const net::URLRequest* request, + extensions::ExtensionNavigationUIData* navigation_ui_data); // |host_permission_check| controls how permissions are checked with regard to // |url|.
diff --git a/extensions/browser/app_window/app_window_geometry_cache.cc b/extensions/browser/app_window/app_window_geometry_cache.cc index 87f05559..561034e 100644 --- a/extensions/browser/app_window/app_window_geometry_cache.cc +++ b/extensions/browser/app_window/app_window_geometry_cache.cc
@@ -132,10 +132,8 @@ "ts", base::Int64ToString(it->second.last_change.ToInternalValue())); dict->SetWithoutPathExpansion(it->first, std::move(value)); - FOR_EACH_OBSERVER( - Observer, - observers_, - OnGeometryCacheChanged(extension_id, it->first, bounds)); + for (auto& observer : observers_) + observer.OnGeometryCacheChanged(extension_id, it->first, bounds); } prefs_->SetGeometryCache(extension_id, std::move(dict));
diff --git a/extensions/browser/app_window/app_window_registry.cc b/extensions/browser/app_window/app_window_registry.cc index 6fc0dedc..3eb52ca 100644 --- a/extensions/browser/app_window/app_window_registry.cc +++ b/extensions/browser/app_window/app_window_registry.cc
@@ -45,14 +45,12 @@ } AppWindowRegistry::AppWindowRegistry(content::BrowserContext* context) - : context_(context), - devtools_callback_(base::Bind(&AppWindowRegistry::OnDevToolsStateChanged, - base::Unretained(this))) { - content::DevToolsAgentHost::AddAgentStateCallback(devtools_callback_); + : context_(context) { + content::DevToolsAgentHost::AddObserver(this); } AppWindowRegistry::~AppWindowRegistry() { - content::DevToolsAgentHost::RemoveAgentStateCallback(devtools_callback_); + content::DevToolsAgentHost::RemoveObserver(this); } // static @@ -62,26 +60,30 @@ void AppWindowRegistry::AddAppWindow(AppWindow* app_window) { BringToFront(app_window); - FOR_EACH_OBSERVER(Observer, observers_, OnAppWindowAdded(app_window)); + for (auto& observer : observers_) + observer.OnAppWindowAdded(app_window); } void AppWindowRegistry::AppWindowIconChanged(AppWindow* app_window) { AddAppWindowToList(app_window); - FOR_EACH_OBSERVER(Observer, observers_, OnAppWindowIconChanged(app_window)); + for (auto& observer : observers_) + observer.OnAppWindowIconChanged(app_window); } void AppWindowRegistry::AppWindowActivated(AppWindow* app_window) { BringToFront(app_window); - FOR_EACH_OBSERVER(Observer, observers_, OnAppWindowActivated(app_window)); + for (auto& observer : observers_) + observer.OnAppWindowActivated(app_window); } void AppWindowRegistry::AppWindowHidden(AppWindow* app_window) { - FOR_EACH_OBSERVER(Observer, observers_, OnAppWindowHidden(app_window)); + for (auto& observer : observers_) + observer.OnAppWindowHidden(app_window); } void AppWindowRegistry::AppWindowShown(AppWindow* app_window, bool was_hidden) { - FOR_EACH_OBSERVER(Observer, observers_, - OnAppWindowShown(app_window, was_hidden)); + for (auto& observer : observers_) + observer.OnAppWindowShown(app_window, was_hidden); } void AppWindowRegistry::RemoveAppWindow(AppWindow* app_window) { @@ -89,7 +91,8 @@ std::find(app_windows_.begin(), app_windows_.end(), app_window); if (it != app_windows_.end()) app_windows_.erase(it); - FOR_EACH_OBSERVER(Observer, observers_, OnAppWindowRemoved(app_window)); + for (auto& observer : observers_) + observer.OnAppWindowRemoved(app_window); } void AppWindowRegistry::AddObserver(Observer* observer) { @@ -180,21 +183,17 @@ return key.empty() ? false : inspected_windows_.count(key) != 0; } -void AppWindowRegistry::OnDevToolsStateChanged( - content::DevToolsAgentHost* agent_host, - bool attached) { - content::WebContents* web_contents = agent_host->GetWebContents(); - // Ignore unrelated notifications. - if (!web_contents || web_contents->GetBrowserContext() != context_) - return; - - std::string key = GetWindowKeyForWebContents(web_contents); - if (key.empty()) - return; - - if (attached) +void AppWindowRegistry::DevToolsAgentHostAttached( + content::DevToolsAgentHost* agent_host) { + std::string key = GetWindowKeyForAgentHost(agent_host); + if (!key.empty()) inspected_windows_.insert(key); - else +} + +void AppWindowRegistry::DevToolsAgentHostDetached( + content::DevToolsAgentHost* agent_host) { + std::string key = GetWindowKeyForAgentHost(agent_host); + if (!key.empty()) inspected_windows_.erase(key); } @@ -214,6 +213,14 @@ app_windows_.push_front(app_window); } +std::string AppWindowRegistry::GetWindowKeyForAgentHost( + content::DevToolsAgentHost* agent_host) const { + content::WebContents* web_contents = agent_host->GetWebContents(); + if (!web_contents || web_contents->GetBrowserContext() != context_) + return std::string(); + return GetWindowKeyForWebContents(web_contents); +} + std::string AppWindowRegistry::GetWindowKeyForWebContents( content::WebContents* web_contents) const { AppWindow* app_window = GetAppWindowForWebContents(web_contents);
diff --git a/extensions/browser/app_window/app_window_registry.h b/extensions/browser/app_window/app_window_registry.h index d273fbb1..799c4f6 100644 --- a/extensions/browser/app_window/app_window_registry.h +++ b/extensions/browser/app_window/app_window_registry.h
@@ -15,6 +15,7 @@ #include "base/observer_list.h" #include "components/keyed_service/content/browser_context_keyed_service_factory.h" #include "components/keyed_service/core/keyed_service.h" +#include "content/public/browser/devtools_agent_host_observer.h" #include "ui/gfx/native_widget_types.h" namespace content { @@ -29,7 +30,8 @@ // The AppWindowRegistry tracks the AppWindows for all platform apps for a // particular browser context. -class AppWindowRegistry : public KeyedService { +class AppWindowRegistry : public KeyedService, + public content::DevToolsAgentHostObserver { public: class Observer { public: @@ -125,9 +127,6 @@ content::BrowserContext* context) const override; }; - protected: - void OnDevToolsStateChanged(content::DevToolsAgentHost*, bool attached); - private: // Ensures the specified |app_window| is included in |app_windows_|. // Otherwise adds |app_window| to the back of |app_windows_|. @@ -144,12 +143,19 @@ // WebContents is not for a AppWindow, return an empty string. std::string GetWindowKeyForWebContents( content::WebContents* web_contents) const; + std::string GetWindowKeyForAgentHost( + content::DevToolsAgentHost* agent_host) const; + + // content::DevToolsAgentHostObserver overrides. + void DevToolsAgentHostAttached( + content::DevToolsAgentHost* agent_host) override; + void DevToolsAgentHostDetached( + content::DevToolsAgentHost* agent_host) override; content::BrowserContext* context_; AppWindowList app_windows_; InspectedWindowSet inspected_windows_; base::ObserverList<Observer> observers_; - base::Callback<void(content::DevToolsAgentHost*, bool)> devtools_callback_; }; } // namespace extensions
diff --git a/extensions/browser/bad_message.cc b/extensions/browser/bad_message.cc index 520610a..bae713e 100644 --- a/extensions/browser/bad_message.cc +++ b/extensions/browser/bad_message.cc
@@ -6,20 +6,35 @@ #include "base/logging.h" #include "base/metrics/sparse_histogram.h" +#include "content/public/browser/browser_message_filter.h" #include "content/public/browser/render_process_host.h" namespace extensions { namespace bad_message { -void ReceivedBadMessage(content::RenderProcessHost* host, - BadMessageReason reason) { +namespace { + +void LogBadMessage(BadMessageReason reason) { LOG(ERROR) << "Terminating extension renderer for bad IPC message, reason " << reason; UMA_HISTOGRAM_SPARSE_SLOWLY("Stability.BadMessageTerminated.Extensions", reason); +} + +} // namespace + +void ReceivedBadMessage(content::RenderProcessHost* host, + BadMessageReason reason) { + LogBadMessage(reason); host->ShutdownForBadMessage( content::RenderProcessHost::CrashReportMode::GENERATE_CRASH_DUMP); } +void ReceivedBadMessage(content::BrowserMessageFilter* filter, + BadMessageReason reason) { + LogBadMessage(reason); + filter->ShutdownForBadMessage(); +} + } // namespace bad_message } // namespace extensions
diff --git a/extensions/browser/bad_message.h b/extensions/browser/bad_message.h index bef0c71..2abea641 100644 --- a/extensions/browser/bad_message.h +++ b/extensions/browser/bad_message.h
@@ -6,6 +6,7 @@ #define EXTENSIONS_BROWSER_BAD_MESSAGE_H_ namespace content { +class BrowserMessageFilter; class RenderProcessHost; } @@ -28,6 +29,8 @@ AVG_BAD_INST_ID = 4, AVG_BAD_EXT_ID = 5, AVG_NULL_AVG = 6, + // Invalid decrement of an Extensions SW ref count. + ESWMF_INVALID_DECREMENT_ACTIVIY = 7, // Please add new elements here. The naming convention is abbreviated class // name (e.g. ExtensionHost becomes EH) plus a unique description of the // reason. After making changes, you MUST update histograms.xml by running: @@ -41,6 +44,12 @@ void ReceivedBadMessage(content::RenderProcessHost* host, BadMessageReason reason); +// Called when a browser message filter receives a bad IPC message from a +// renderer or other child process. Logs the event, records a histogram metric +// for the |reason|, and terminates the process for |filter|. +void ReceivedBadMessage(content::BrowserMessageFilter* filter, + BadMessageReason reason); + } // namespace bad_message } // namespace extensions
diff --git a/extensions/browser/extension_function.cc b/extensions/browser/extension_function.cc index 04216934..359507c 100644 --- a/extensions/browser/extension_function.cc +++ b/extensions/browser/extension_function.cc
@@ -450,11 +450,14 @@ UIThreadExtensionFunction::UIThreadExtensionFunction() : context_(nullptr), render_frame_host_(nullptr), - is_from_service_worker_(false) {} + service_worker_version_id_(extensions::kInvalidServiceWorkerVersionId) {} UIThreadExtensionFunction::~UIThreadExtensionFunction() { - if (dispatcher() && render_frame_host()) - dispatcher()->OnExtensionFunctionCompleted(extension()); + if (dispatcher() && (render_frame_host() || is_from_service_worker())) { + dispatcher()->OnExtensionFunctionCompleted(extension(), + is_from_service_worker()); + } + // The extension function should always respond to avoid leaks in the // renderer, dangling callbacks, etc. The exception is if the system is // shutting down. @@ -503,7 +506,7 @@ void UIThreadExtensionFunction::SetRenderFrameHost( content::RenderFrameHost* render_frame_host) { // An extension function from Service Worker does not have a RenderFrameHost. - if (is_from_service_worker_) { + if (is_from_service_worker()) { DCHECK(!render_frame_host); return; }
diff --git a/extensions/browser/extension_function.h b/extensions/browser/extension_function.h index a547b0e..89ac5a2d 100644 --- a/extensions/browser/extension_function.h +++ b/extensions/browser/extension_function.h
@@ -23,6 +23,7 @@ #include "content/public/common/console_message_level.h" #include "extensions/browser/extension_function_histogram_value.h" #include "extensions/browser/info_map.h" +#include "extensions/common/constants.h" #include "extensions/common/extension.h" #include "extensions/common/features/feature.h" #include "ipc/ipc_message.h" @@ -518,8 +519,8 @@ return dispatcher_.get(); } - void set_is_from_service_worker(bool value) { - is_from_service_worker_ = value; + void set_service_worker_version_id(int64_t version_id) { + service_worker_version_id_ = version_id; } // Gets the "current" web contents if any. If there is no associated web @@ -557,15 +558,20 @@ void Destruct() const override; + bool is_from_service_worker() const { + return service_worker_version_id_ != + extensions::kInvalidServiceWorkerVersionId; + } + // The dispatcher that will service this extension function call. base::WeakPtr<extensions::ExtensionFunctionDispatcher> dispatcher_; // The RenderFrameHost we will send responses to. content::RenderFrameHost* render_frame_host_; - // Whether or not this ExtensionFunction was called by an extension Service - // Worker. - bool is_from_service_worker_; + // If this ExtensionFunction was called by an extension Service Worker, then + // this contains the worker's version id. + int64_t service_worker_version_id_; std::unique_ptr<RenderFrameHostTracker> tracker_;
diff --git a/extensions/browser/extension_function_dispatcher.cc b/extensions/browser/extension_function_dispatcher.cc index b944303a..43469fb 100644 --- a/extensions/browser/extension_function_dispatcher.cc +++ b/extensions/browser/extension_function_dispatcher.cc
@@ -24,6 +24,7 @@ #include "content/public/browser/render_process_host.h" #include "content/public/browser/render_process_host_observer.h" #include "content/public/browser/render_view_host.h" +#include "content/public/browser/service_worker_context.h" #include "content/public/browser/user_metrics.h" #include "content/public/browser/web_contents.h" #include "content/public/browser/web_contents_observer.h" @@ -32,11 +33,13 @@ #include "extensions/browser/extension_function_registry.h" #include "extensions/browser/extension_registry.h" #include "extensions/browser/extension_system.h" +#include "extensions/browser/extension_util.h" #include "extensions/browser/extensions_browser_client.h" #include "extensions/browser/io_thread_extension_message_filter.h" #include "extensions/browser/process_manager.h" #include "extensions/browser/process_map.h" #include "extensions/browser/quota_service.h" +#include "extensions/common/constants.h" #include "extensions/common/extension_api.h" #include "extensions/common/extension_messages.h" #include "extensions/common/extension_set.h" @@ -60,6 +63,12 @@ args); } +bool IsRequestFromServiceWorker( + const ExtensionHostMsg_Request_Params& request_params) { + return request_params.service_worker_version_id != + extensions::kInvalidServiceWorkerVersionId; +} + // Separate copy of ExtensionAPI used for IO thread extension functions. We need // this because ExtensionAPI has mutable data. It should be possible to remove // this once all the extension APIs are updated to the feature system. @@ -277,17 +286,18 @@ }; struct ExtensionFunctionDispatcher::WorkerResponseCallbackMapKey { - WorkerResponseCallbackMapKey(int render_process_id, int embedded_worker_id) + WorkerResponseCallbackMapKey(int render_process_id, + int64_t service_worker_version_id) : render_process_id(render_process_id), - embedded_worker_id(embedded_worker_id) {} + service_worker_version_id(service_worker_version_id) {} bool operator<(const WorkerResponseCallbackMapKey& other) const { - return std::tie(render_process_id, embedded_worker_id) < - std::tie(other.render_process_id, other.embedded_worker_id); + return std::tie(render_process_id, service_worker_version_id) < + std::tie(other.render_process_id, other.service_worker_version_id); } int render_process_id; - int embedded_worker_id; + int64_t service_worker_version_id; }; WindowController* @@ -418,9 +428,9 @@ callback_wrapper->CreateCallback(params.request_id)); } else { // Extension API from Service Worker. - DCHECK_GE(params.embedded_worker_id, 0); + DCHECK_NE(kInvalidServiceWorkerVersionId, params.service_worker_version_id); WorkerResponseCallbackMapKey key(render_process_id, - params.embedded_worker_id); + params.service_worker_version_id); UIThreadWorkerResponseCallbackWrapperMap::const_iterator iter = ui_thread_response_callback_wrappers_for_worker_.find(key); UIThreadWorkerResponseCallbackWrapper* callback_wrapper = nullptr; @@ -472,8 +482,9 @@ NOTREACHED(); return; } - if (params.embedded_worker_id != -1) { - function_ui->set_is_from_service_worker(true); + if (IsRequestFromServiceWorker(params)) { + function_ui->set_service_worker_version_id( + params.service_worker_version_id); } else { function_ui->SetRenderFrameHost(render_frame_host); } @@ -536,13 +547,16 @@ if (!registry->enabled_extensions().GetByID(params.extension_id)) return; - // We only adjust the keepalive count for UIThreadExtensionFunction for - // now, largely for simplicity's sake. This is OK because currently, only - // the webRequest API uses IOThreadExtensionFunction, and that API is not - // compatible with lazy background pages. - // TODO(lazyboy): API functions from extension Service Worker will incorrectly - // change keepalive count below. - process_manager->IncrementLazyKeepaliveCount(extension); + if (!IsRequestFromServiceWorker(params)) { + // Increment ref count for non-service worker extension API. Ref count for + // service worker extension API is handled separately on IO thread via IPC. + + // We only adjust the keepalive count for UIThreadExtensionFunction for + // now, largely for simplicity's sake. This is OK because currently, only + // the webRequest API uses IOThreadExtensionFunction, and that API is not + // compatible with lazy background pages. + process_manager->IncrementLazyKeepaliveCount(function->extension()); + } } void ExtensionFunctionDispatcher::RemoveWorkerCallbacksForProcess( @@ -560,10 +574,12 @@ } void ExtensionFunctionDispatcher::OnExtensionFunctionCompleted( - const Extension* extension) { - // TODO(lazyboy): API functions from extension Service Worker will incorrectly - // change keepalive count below. - if (extension) { + const Extension* extension, + bool is_from_service_worker) { + if (extension && !is_from_service_worker) { + // Decrement ref count for non-service worker extension API. Service + // worker extension API ref counts are handled separately on IO thread + // directly via IPC. ProcessManager::Get(browser_context_) ->DecrementLazyKeepaliveCount(extension); }
diff --git a/extensions/browser/extension_function_dispatcher.h b/extensions/browser/extension_function_dispatcher.h index 074c241..9aa833f4 100644 --- a/extensions/browser/extension_function_dispatcher.h +++ b/extensions/browser/extension_function_dispatcher.h
@@ -101,7 +101,8 @@ // Called when an ExtensionFunction is done executing, after it has sent // a response (if any) to the extension. - void OnExtensionFunctionCompleted(const Extension* extension); + void OnExtensionFunctionCompleted(const Extension* extension, + bool is_from_service_worker); // See the Delegate class for documentation on these methods. // TODO(devlin): None of these belong here. We should kill
diff --git a/extensions/browser/extension_function_histogram_value.h b/extensions/browser/extension_function_histogram_value.h index f92812e..059b12bc 100644 --- a/extensions/browser/extension_function_histogram_value.h +++ b/extensions/browser/extension_function_histogram_value.h
@@ -1152,8 +1152,8 @@ TABCAPTURE_CAPTUREOFFSCREENTAB, LANGUAGESETTINGSPRIVATE_ADDSPELLCHECKWORD, LANGUAGESETTINGSPRIVATE_REMOVESPELLCHECKWORD, - SETTINGSPRIVATE_GETDEFAULTZOOMPERCENTFUNCTION, - SETTINGSPRIVATE_SETDEFAULTZOOMPERCENTFUNCTION, + SETTINGSPRIVATE_GETDEFAULTZOOMFUNCTION, + SETTINGSPRIVATE_SETDEFAULTZOOMFUNCTION, BLUETOOTHPRIVATE_CONNECT, BLUETOOTHPRIVATE_FORGETDEVICE, DISPLAYSOURCE_GETAVAILABLESINKS,
diff --git a/extensions/browser/extension_host.cc b/extensions/browser/extension_host.cc index 63e5c65..01845d2 100644 --- a/extensions/browser/extension_host.cc +++ b/extensions/browser/extension_host.cc
@@ -102,11 +102,10 @@ extensions::NOTIFICATION_EXTENSION_HOST_DESTROYED, content::Source<BrowserContext>(browser_context_), content::Details<ExtensionHost>(this)); - FOR_EACH_OBSERVER(ExtensionHostObserver, observer_list_, - OnExtensionHostDestroyed(this)); - FOR_EACH_OBSERVER(DeferredStartRenderHostObserver, - deferred_start_render_host_observer_list_, - OnDeferredStartRenderHostDestroyed(this)); + for (auto& observer : observer_list_) + observer.OnExtensionHostDestroyed(this); + for (auto& observer : deferred_start_render_host_observer_list_) + observer.OnDeferredStartRenderHostDestroyed(this); // Remove ourselves from the queue as late as possible (before effectively // destroying self, but after everything else) so that queues that are @@ -211,18 +210,18 @@ int event_id) { CHECK(IsBackgroundPage()); unacked_messages_.insert(event_id); - FOR_EACH_OBSERVER(ExtensionHostObserver, observer_list_, - OnBackgroundEventDispatched(this, event_name, event_id)); + for (auto& observer : observer_list_) + observer.OnBackgroundEventDispatched(this, event_name, event_id); } void ExtensionHost::OnNetworkRequestStarted(uint64_t request_id) { - FOR_EACH_OBSERVER(ExtensionHostObserver, observer_list_, - OnNetworkRequestStarted(this, request_id)); + for (auto& observer : observer_list_) + observer.OnNetworkRequestStarted(this, request_id); } void ExtensionHost::OnNetworkRequestDone(uint64_t request_id) { - FOR_EACH_OBSERVER(ExtensionHostObserver, observer_list_, - OnNetworkRequestDone(this, request_id)); + for (auto& observer : observer_list_) + observer.OnNetworkRequestDone(this, request_id); } const GURL& ExtensionHost::GetURL() const { @@ -287,9 +286,8 @@ void ExtensionHost::DidStartLoading() { if (!has_loaded_once_) { - FOR_EACH_OBSERVER(DeferredStartRenderHostObserver, - deferred_start_render_host_observer_list_, - OnDeferredStartRenderHostDidStartFirstLoad(this)); + for (auto& observer : deferred_start_render_host_observer_list_) + observer.OnDeferredStartRenderHostDidStartFirstLoad(this); } } @@ -305,9 +303,8 @@ extensions::NOTIFICATION_EXTENSION_HOST_DID_STOP_FIRST_LOAD, content::Source<BrowserContext>(browser_context_), content::Details<ExtensionHost>(this)); - FOR_EACH_OBSERVER(DeferredStartRenderHostObserver, - deferred_start_render_host_observer_list_, - OnDeferredStartRenderHostDidStopFirstLoad(this)); + for (auto& observer : deferred_start_render_host_observer_list_) + observer.OnDeferredStartRenderHostDidStopFirstLoad(this); } } @@ -371,8 +368,8 @@ // sent by the renderer is one that this ExtensionHost expects to receive. // This way if a renderer _is_ compromised, it can really only affect itself. if (unacked_messages_.erase(event_id) > 0) { - FOR_EACH_OBSERVER(ExtensionHostObserver, observer_list_, - OnBackgroundEventAcked(this, event_id)); + for (auto& observer : observer_list_) + observer.OnBackgroundEventAcked(this, event_id); } else { // We have received an unexpected event id from the renderer. It might be // compromised or it might have some other issue. Kill it just to be safe.
diff --git a/extensions/browser/extension_icon_image.cc b/extensions/browser/extension_icon_image.cc index 94e6489..2d4aa174 100644 --- a/extensions/browser/extension_icon_image.cc +++ b/extensions/browser/extension_icon_image.cc
@@ -163,7 +163,8 @@ } IconImage::~IconImage() { - FOR_EACH_OBSERVER(Observer, observers_, OnExtensionIconImageDestroyed(this)); + for (auto& observer : observers_) + observer.OnExtensionIconImageDestroyed(this); source_->ResetHost(); } @@ -247,7 +248,8 @@ // there's no way to combine the storage of two images. image_ = gfx::Image(image_skia_); - FOR_EACH_OBSERVER(Observer, observers_, OnExtensionIconImageChanged(this)); + for (auto& observer : observers_) + observer.OnExtensionIconImageChanged(this); } void IconImage::Observe(int type,
diff --git a/extensions/browser/extension_navigation_ui_data.cc b/extensions/browser/extension_navigation_ui_data.cc index c7576ba1..1980b88 100644 --- a/extensions/browser/extension_navigation_ui_data.cc +++ b/extensions/browser/extension_navigation_ui_data.cc
@@ -5,6 +5,7 @@ #include "extensions/browser/extension_navigation_ui_data.h" #include "content/public/browser/navigation_handle.h" +#include "extensions/browser/guest_view/web_view/web_view_guest.h" namespace extensions { @@ -21,13 +22,27 @@ ExtensionApiFrameIdMap::GetParentFrameId(navigation_handle); frame_data_.tab_id = tab_id; frame_data_.window_id = window_id; + + WebViewGuest* web_view = + WebViewGuest::FromWebContents(navigation_handle->GetWebContents()); + if (web_view) { + is_web_view_ = true; + web_view_instance_id_ = web_view->view_instance_id(); + web_view_rules_registry_id_ = web_view->rules_registry_id(); + } else { + is_web_view_ = false; + web_view_instance_id_ = web_view_rules_registry_id_ = 0; + } } std::unique_ptr<ExtensionNavigationUIData> ExtensionNavigationUIData::DeepCopy() const { std::unique_ptr<ExtensionNavigationUIData> copy( new ExtensionNavigationUIData()); - copy->set_frame_data(frame_data_); + copy->frame_data_ = frame_data_; + copy->is_web_view_ = is_web_view_; + copy->web_view_instance_id_ = web_view_instance_id_; + copy->web_view_rules_registry_id_ = web_view_rules_registry_id_; return copy; }
diff --git a/extensions/browser/extension_navigation_ui_data.h b/extensions/browser/extension_navigation_ui_data.h index b514568..e1467e2c 100644 --- a/extensions/browser/extension_navigation_ui_data.h +++ b/extensions/browser/extension_navigation_ui_data.h
@@ -31,12 +31,16 @@ return frame_data_; } - private: - void set_frame_data(const ExtensionApiFrameIdMap::FrameData& frame_data) { - frame_data_ = frame_data; - } + bool is_web_view() const { return is_web_view_; } + int web_view_instance_id() const { return web_view_instance_id_; } + int web_view_rules_registry_id() const { return web_view_rules_registry_id_; } + private: ExtensionApiFrameIdMap::FrameData frame_data_; + bool is_web_view_; + // These are only valid iff is_web_view_. + int web_view_instance_id_; + int web_view_rules_registry_id_; DISALLOW_COPY_AND_ASSIGN(ExtensionNavigationUIData); };
diff --git a/extensions/browser/extension_pref_value_map.cc b/extensions/browser/extension_pref_value_map.cc index 4b00bf8..68c5c61 100644 --- a/extensions/browser/extension_pref_value_map.cc +++ b/extensions/browser/extension_pref_value_map.cc
@@ -378,8 +378,8 @@ } void ExtensionPrefValueMap::NotifyInitializationCompleted() { - FOR_EACH_OBSERVER(ExtensionPrefValueMap::Observer, observers_, - OnInitializationCompleted()); + for (auto& observer : observers_) + observer.OnInitializationCompleted(); } void ExtensionPrefValueMap::NotifyPrefValueChanged( @@ -389,11 +389,11 @@ } void ExtensionPrefValueMap::NotifyPrefValueChanged(const std::string& key) { - FOR_EACH_OBSERVER(ExtensionPrefValueMap::Observer, observers_, - OnPrefValueChanged(key)); + for (auto& observer : observers_) + observer.OnPrefValueChanged(key); } void ExtensionPrefValueMap::NotifyOfDestruction() { - FOR_EACH_OBSERVER(ExtensionPrefValueMap::Observer, observers_, - OnExtensionPrefValueMapDestruction()); + for (auto& observer : observers_) + observer.OnExtensionPrefValueMapDestruction(); }
diff --git a/extensions/browser/extension_prefs.cc b/extensions/browser/extension_prefs.cc index 7f54cf7..657da21 100644 --- a/extensions/browser/extension_prefs.cc +++ b/extensions/browser/extension_prefs.cc
@@ -463,9 +463,8 @@ void ExtensionPrefs::DeleteExtensionPrefs(const std::string& extension_id) { extension_pref_value_map_->UnregisterExtension(extension_id); - FOR_EACH_OBSERVER(ExtensionPrefsObserver, - observer_list_, - OnExtensionPrefsDeleted(extension_id)); + for (auto& observer : observer_list_) + observer.OnExtensionPrefsDeleted(extension_id); DictionaryPrefUpdate update(prefs_, pref_names::kExtensions); base::DictionaryValue* dict = update.Get(); dict->Remove(extension_id, NULL); @@ -805,9 +804,8 @@ new base::FundamentalValue(new_value)); } - FOR_EACH_OBSERVER(ExtensionPrefsObserver, - observer_list_, - OnExtensionDisableReasonsChanged(extension_id, new_value)); + for (auto& observer : observer_list_) + observer.OnExtensionDisableReasonsChanged(extension_id, new_value); } std::set<std::string> ExtensionPrefs::GetBlacklistedExtensions() const { @@ -1126,9 +1124,8 @@ new base::FundamentalValue( Extension::EXTERNAL_EXTENSION_UNINSTALLED)); extension_pref_value_map_->SetExtensionState(extension_id, false); - FOR_EACH_OBSERVER(ExtensionPrefsObserver, - observer_list_, - OnExtensionStateChanged(extension_id, false)); + for (auto& observer : observer_list_) + observer.OnExtensionStateChanged(extension_id, false); } else { DeleteExtensionPrefs(extension_id); } @@ -1139,8 +1136,8 @@ new base::FundamentalValue(Extension::ENABLED)); extension_pref_value_map_->SetExtensionState(extension_id, true); UpdateExtensionPref(extension_id, kPrefDisableReasons, nullptr); - FOR_EACH_OBSERVER(ExtensionPrefsObserver, observer_list_, - OnExtensionStateChanged(extension_id, true)); + for (auto& observer : observer_list_) + observer.OnExtensionStateChanged(extension_id, true); } void ExtensionPrefs::SetExtensionDisabled(const std::string& extension_id, @@ -1152,8 +1149,8 @@ } UpdateExtensionPref(extension_id, kPrefDisableReasons, new base::FundamentalValue(disable_reasons)); - FOR_EACH_OBSERVER(ExtensionPrefsObserver, observer_list_, - OnExtensionStateChanged(extension_id, false)); + for (auto& observer : observer_list_) + observer.OnExtensionStateChanged(extension_id, false); } void ExtensionPrefs::SetExtensionBlacklistState(const std::string& extension_id, @@ -1906,10 +1903,8 @@ value_map->RegisterExtension( *extension_id, install_time, is_enabled, is_incognito_enabled); - FOR_EACH_OBSERVER( - ExtensionPrefsObserver, - observer_list_, - OnExtensionRegistered(*extension_id, install_time, is_enabled)); + for (auto& observer : observer_list_) + observer.OnExtensionRegistered(*extension_id, install_time, is_enabled); // Set regular extension controlled prefs. LoadExtensionControlledPrefs( @@ -1923,9 +1918,8 @@ LoadExtensionControlledPrefs( this, value_map, *extension_id, kExtensionPrefsScopeRegularOnly); - FOR_EACH_OBSERVER(ExtensionPrefsObserver, - observer_list_, - OnExtensionPrefsLoaded(*extension_id, this)); + for (auto& observer : observer_list_) + observer.OnExtensionPrefsLoaded(*extension_id, this); } } @@ -1983,10 +1977,8 @@ extension_pref_value_map_->RegisterExtension( extension_id, install_time, is_enabled, is_incognito_enabled); - FOR_EACH_OBSERVER( - ExtensionPrefsObserver, - observer_list_, - OnExtensionRegistered(extension_id, install_time, is_enabled)); + for (auto& observer : observer_list_) + observer.OnExtensionRegistered(extension_id, install_time, is_enabled); } } // namespace extensions
diff --git a/extensions/browser/extension_registry.cc b/extensions/browser/extension_registry.cc index 7054673..e7bf356 100644 --- a/extensions/browser/extension_registry.cc +++ b/extensions/browser/extension_registry.cc
@@ -51,16 +51,15 @@ void ExtensionRegistry::TriggerOnLoaded(const Extension* extension) { CHECK(extension); DCHECK(enabled_extensions_.Contains(extension->id())); - FOR_EACH_OBSERVER(ExtensionRegistryObserver, - observers_, - OnExtensionLoaded(browser_context_, extension)); + for (auto& observer : observers_) + observer.OnExtensionLoaded(browser_context_, extension); } void ExtensionRegistry::TriggerOnReady(const Extension* extension) { CHECK(extension); DCHECK(enabled_extensions_.Contains(extension->id())); - FOR_EACH_OBSERVER(ExtensionRegistryObserver, observers_, - OnExtensionReady(browser_context_, extension)); + for (auto& observer : observers_) + observer.OnExtensionReady(browser_context_, extension); } void ExtensionRegistry::TriggerOnUnloaded( @@ -68,9 +67,8 @@ UnloadedExtensionInfo::Reason reason) { CHECK(extension); DCHECK(!enabled_extensions_.Contains(extension->id())); - FOR_EACH_OBSERVER(ExtensionRegistryObserver, - observers_, - OnExtensionUnloaded(browser_context_, extension, reason)); + for (auto& observer : observers_) + observer.OnExtensionUnloaded(browser_context_, extension, reason); } void ExtensionRegistry::TriggerOnWillBeInstalled(const Extension* extension, @@ -80,29 +78,25 @@ DCHECK_EQ(is_update, GenerateInstalledExtensionsSet()->Contains(extension->id())); DCHECK_EQ(is_update, !old_name.empty()); - FOR_EACH_OBSERVER(ExtensionRegistryObserver, observers_, - OnExtensionWillBeInstalled(browser_context_, extension, - is_update, old_name)); + for (auto& observer : observers_) + observer.OnExtensionWillBeInstalled(browser_context_, extension, is_update, + old_name); } void ExtensionRegistry::TriggerOnInstalled(const Extension* extension, bool is_update) { CHECK(extension); DCHECK(GenerateInstalledExtensionsSet()->Contains(extension->id())); - FOR_EACH_OBSERVER(ExtensionRegistryObserver, - observers_, - OnExtensionInstalled( - browser_context_, extension, is_update)); + for (auto& observer : observers_) + observer.OnExtensionInstalled(browser_context_, extension, is_update); } void ExtensionRegistry::TriggerOnUninstalled(const Extension* extension, UninstallReason reason) { CHECK(extension); DCHECK(!GenerateInstalledExtensionsSet()->Contains(extension->id())); - FOR_EACH_OBSERVER( - ExtensionRegistryObserver, - observers_, - OnExtensionUninstalled(browser_context_, extension, reason)); + for (auto& observer : observers_) + observer.OnExtensionUninstalled(browser_context_, extension, reason); } const Extension* ExtensionRegistry::GetExtensionById(const std::string& id, @@ -211,7 +205,8 @@ void ExtensionRegistry::Shutdown() { // Release references to all Extension objects in the sets. ClearAll(); - FOR_EACH_OBSERVER(ExtensionRegistryObserver, observers_, OnShutdown(this)); + for (auto& observer : observers_) + observer.OnShutdown(this); } } // namespace extensions
diff --git a/extensions/browser/extension_service_worker_message_filter.cc b/extensions/browser/extension_service_worker_message_filter.cc index fa3357e..98195f40 100644 --- a/extensions/browser/extension_service_worker_message_filter.cc +++ b/extensions/browser/extension_service_worker_message_filter.cc
@@ -4,6 +4,8 @@ #include "extensions/browser/extension_service_worker_message_filter.h" +#include "content/public/browser/service_worker_context.h" +#include "extensions/browser/bad_message.h" #include "extensions/browser/extension_function_dispatcher.h" #include "extensions/common/extension_messages.h" @@ -11,9 +13,11 @@ ExtensionServiceWorkerMessageFilter::ExtensionServiceWorkerMessageFilter( int render_process_id, - content::BrowserContext* context) + content::BrowserContext* context, + content::ServiceWorkerContext* service_worker_context) : content::BrowserMessageFilter(ExtensionWorkerMsgStart), render_process_id_(render_process_id), + service_worker_context_(service_worker_context), dispatcher_(new ExtensionFunctionDispatcher(context)) {} ExtensionServiceWorkerMessageFilter::~ExtensionServiceWorkerMessageFilter() { @@ -33,6 +37,10 @@ bool handled = true; IPC_BEGIN_MESSAGE_MAP(ExtensionServiceWorkerMessageFilter, message) IPC_MESSAGE_HANDLER(ExtensionHostMsg_RequestWorker, OnRequestWorker) + IPC_MESSAGE_HANDLER(ExtensionHostMsg_IncrementServiceWorkerActivity, + OnIncrementServiceWorkerActivity) + IPC_MESSAGE_HANDLER(ExtensionHostMsg_DecrementServiceWorkerActivity, + OnDecrementServiceWorkerActivity) IPC_MESSAGE_UNHANDLED(handled = false) IPC_END_MESSAGE_MAP() return handled; @@ -44,4 +52,27 @@ dispatcher_->Dispatch(params, nullptr, render_process_id_); } +void ExtensionServiceWorkerMessageFilter::OnIncrementServiceWorkerActivity( + int64_t service_worker_version_id, + const std::string& request_uuid) { + DCHECK_CURRENTLY_ON(content::BrowserThread::IO); + // The worker might have already stopped before we got here, so the increment + // below might fail legitimately. Therefore, we do not send bad_message to the + // worker even if it fails. + service_worker_context_->StartingExternalRequest(service_worker_version_id, + request_uuid); +} + +void ExtensionServiceWorkerMessageFilter::OnDecrementServiceWorkerActivity( + int64_t service_worker_version_id, + const std::string& request_uuid) { + DCHECK_CURRENTLY_ON(content::BrowserThread::IO); + bool status = service_worker_context_->FinishedExternalRequest( + service_worker_version_id, request_uuid); + if (!status) { + bad_message::ReceivedBadMessage( + this, bad_message::ESWMF_INVALID_DECREMENT_ACTIVIY); + } +} + } // namespace extensions
diff --git a/extensions/browser/extension_service_worker_message_filter.h b/extensions/browser/extension_service_worker_message_filter.h index 44f4f60a..f76bf9b4 100644 --- a/extensions/browser/extension_service_worker_message_filter.h +++ b/extensions/browser/extension_service_worker_message_filter.h
@@ -12,6 +12,7 @@ namespace content { class BrowserContext; +class ServiceWorkerContext; } namespace extensions { @@ -22,8 +23,10 @@ class ExtensionServiceWorkerMessageFilter : public content::BrowserMessageFilter { public: - ExtensionServiceWorkerMessageFilter(int render_process_id, - content::BrowserContext* context); + ExtensionServiceWorkerMessageFilter( + int render_process_id, + content::BrowserContext* context, + content::ServiceWorkerContext* service_worker_context); // content::BrowserMessageFilter: bool OnMessageReceived(const IPC::Message& message) override; @@ -33,10 +36,18 @@ private: ~ExtensionServiceWorkerMessageFilter() override; + // Message handlers. void OnRequestWorker(const ExtensionHostMsg_Request_Params& params); + void OnIncrementServiceWorkerActivity(int64_t service_worker_version_id, + const std::string& request_uuid); + void OnDecrementServiceWorkerActivity(int64_t service_worker_version_id, + const std::string& request_uuid); const int render_process_id_; + // Owned by the StoragePartition of our profile. + content::ServiceWorkerContext* service_worker_context_; + std::unique_ptr<ExtensionFunctionDispatcher, content::BrowserThread::DeleteOnUIThread> dispatcher_;
diff --git a/extensions/browser/extension_util.cc b/extensions/browser/extension_util.cc index 4981790a..142e1e4 100644 --- a/extensions/browser/extension_util.cc +++ b/extensions/browser/extension_util.cc
@@ -4,6 +4,8 @@ #include "extensions/browser/extension_util.h" +#include "content/public/browser/browser_context.h" +#include "content/public/browser/site_instance.h" #include "extensions/browser/extension_prefs.h" #include "extensions/browser/extension_registry.h" #include "extensions/common/manifest_handlers/app_isolation_info.h" @@ -43,5 +45,16 @@ extension->location() == Manifest::COMPONENT); } +content::StoragePartition* GetStoragePartitionForExtensionId( + const std::string& extension_id, + content::BrowserContext* browser_context) { + GURL site_url = content::SiteInstance::GetSiteForURL( + browser_context, Extension::GetBaseURLFromExtensionId(extension_id)); + content::StoragePartition* storage_partition = + content::BrowserContext::GetStoragePartitionForSite(browser_context, + site_url); + return storage_partition; +} + } // namespace util } // namespace extensions
diff --git a/extensions/browser/extension_util.h b/extensions/browser/extension_util.h index cdd4218..b3e8233 100644 --- a/extensions/browser/extension_util.h +++ b/extensions/browser/extension_util.h
@@ -11,6 +11,7 @@ namespace content { class BrowserContext; +class StoragePartition; } namespace extensions { @@ -34,6 +35,10 @@ // Returns true if the extension can be enabled in incognito mode. bool CanBeIncognitoEnabled(const Extension* extension); +content::StoragePartition* GetStoragePartitionForExtensionId( + const std::string& extension_id, + content::BrowserContext* browser_context); + } // namespace util } // namespace extensions
diff --git a/extensions/browser/guest_view/web_view/web_view_guest.cc b/extensions/browser/guest_view/web_view/web_view_guest.cc index 645d9af..d18165d 100644 --- a/extensions/browser/guest_view/web_view/web_view_guest.cc +++ b/extensions/browser/guest_view/web_view/web_view_guest.cc
@@ -663,7 +663,9 @@ webview::kEventResponsive, std::move(args))); } -void WebViewGuest::RendererUnresponsive(WebContents* source) { +void WebViewGuest::RendererUnresponsive( + WebContents* source, + const content::WebContentsUnresponsiveState& unresponsive_state) { std::unique_ptr<base::DictionaryValue> args(new base::DictionaryValue()); args->SetInteger(webview::kProcessId, web_contents()->GetRenderProcessHost()->GetID());
diff --git a/extensions/browser/guest_view/web_view/web_view_guest.h b/extensions/browser/guest_view/web_view/web_view_guest.h index 9ed2fbb..2996529 100644 --- a/extensions/browser/guest_view/web_view/web_view_guest.h +++ b/extensions/browser/guest_view/web_view/web_view_guest.h
@@ -89,6 +89,8 @@ // Shows the context menu for the guest. void ShowContextMenu(int request_id); + int rules_registry_id() const { return rules_registry_id_; } + // Sets the frame name of the guest. void SetName(const std::string& name); const std::string& name() { return name_; } @@ -216,7 +218,9 @@ bool PreHandleGestureEvent(content::WebContents* source, const blink::WebGestureEvent& event) final; void RendererResponsive(content::WebContents* source) final; - void RendererUnresponsive(content::WebContents* source) final; + void RendererUnresponsive( + content::WebContents* source, + const content::WebContentsUnresponsiveState& unresponsive_state) final; void RequestMediaAccessPermission( content::WebContents* source, const content::MediaStreamRequest& request,
diff --git a/extensions/browser/process_manager.cc b/extensions/browser/process_manager.cc index 0def1d2..f6687a8d4 100644 --- a/extensions/browser/process_manager.cc +++ b/extensions/browser/process_manager.cc
@@ -263,9 +263,7 @@ registrar_.Add(this, extensions::NOTIFICATION_EXTENSION_HOST_VIEW_SHOULD_CLOSE, content::Source<BrowserContext>(context)); - devtools_callback_ = base::Bind(&ProcessManager::OnDevToolsStateChanged, - weak_ptr_factory_.GetWeakPtr()); - content::DevToolsAgentHost::AddAgentStateCallback(devtools_callback_); + content::DevToolsAgentHost::AddObserver(this); OnKeepaliveImpulseCheck(); } @@ -274,7 +272,7 @@ extension_registry_->RemoveObserver(this); CloseBackgroundHosts(); DCHECK(background_hosts_.empty()); - content::DevToolsAgentHost::RemoveAgentStateCallback(devtools_callback_); + content::DevToolsAgentHost::RemoveObserver(this); } void ProcessManager::RegisterRenderFrameHost( @@ -289,10 +287,8 @@ // UnregisterRenderFrame. AcquireLazyKeepaliveCountForFrame(render_frame_host); - FOR_EACH_OBSERVER(ProcessManagerObserver, - observer_list_, - OnExtensionFrameRegistered(extension->id(), - render_frame_host)); + for (auto& observer : observer_list_) + observer.OnExtensionFrameRegistered(extension->id(), render_frame_host); } void ProcessManager::UnregisterRenderFrameHost( @@ -306,10 +302,8 @@ ReleaseLazyKeepaliveCountForFrame(render_frame_host); all_extension_frames_.erase(frame); - FOR_EACH_OBSERVER(ProcessManagerObserver, - observer_list_, - OnExtensionFrameUnregistered(extension_id, - render_frame_host)); + for (auto& observer : observer_list_) + observer.OnExtensionFrameUnregistered(extension_id, render_frame_host); } } @@ -321,10 +315,8 @@ if (frame != all_extension_frames_.end()) { std::string extension_id = GetExtensionID(render_frame_host); - FOR_EACH_OBSERVER(ProcessManagerObserver, - observer_list_, - OnExtensionFrameNavigated(extension_id, - render_frame_host)); + for (auto& observer : observer_list_) + observer.OnExtensionFrameNavigated(extension_id, render_frame_host); } } @@ -703,9 +695,8 @@ for (const scoped_refptr<const Extension>& extension : extension_registry_->enabled_extensions()) { CreateBackgroundHostForExtensionLoad(this, extension.get()); - FOR_EACH_OBSERVER(ProcessManagerObserver, - observer_list_, - OnBackgroundHostStartup(extension.get())); + for (auto& observer : observer_list_) + observer.OnBackgroundHostStartup(extension.get()); } } @@ -721,8 +712,8 @@ since_suspended->Elapsed()); } } - FOR_EACH_OBSERVER(ProcessManagerObserver, observer_list_, - OnBackgroundHostCreated(host)); + for (auto& observer : observer_list_) + observer.OnBackgroundHostCreated(host); } void ProcessManager::CloseBackgroundHost(ExtensionHost* host) { @@ -732,9 +723,8 @@ // |host| should deregister itself from our structures. CHECK(background_hosts_.find(host) == background_hosts_.end()); - FOR_EACH_OBSERVER(ProcessManagerObserver, - observer_list_, - OnBackgroundHostClose(extension_id)); + for (auto& observer : observer_list_) + observer.OnBackgroundHostClose(extension_id); } void ProcessManager::AcquireLazyKeepaliveCountForFrame( @@ -891,29 +881,32 @@ } } -void ProcessManager::OnDevToolsStateChanged( - content::DevToolsAgentHost* agent_host, - bool attached) { +const Extension* ProcessManager::GetExtensionForAgentHost( + content::DevToolsAgentHost* agent_host) { content::WebContents* web_contents = agent_host->GetWebContents(); // Ignore unrelated notifications. if (!web_contents || web_contents->GetBrowserContext() != browser_context_) - return; + return nullptr; if (GetViewType(web_contents) != VIEW_TYPE_EXTENSION_BACKGROUND_PAGE) - return; - const Extension* extension = - extension_registry_->enabled_extensions().GetByID( - GetExtensionIdForSiteInstance(web_contents->GetSiteInstance())); - if (!extension) - return; - if (attached) { + return nullptr; + return GetExtensionForWebContents(web_contents); +} + +void ProcessManager::DevToolsAgentHostAttached( + content::DevToolsAgentHost* agent_host) { + if (const Extension* extension = GetExtensionForAgentHost(agent_host)) { // Keep the lazy background page alive while it's being inspected. CancelSuspend(extension); IncrementLazyKeepaliveCount(extension); - } else { - DecrementLazyKeepaliveCount(extension); } } +void ProcessManager::DevToolsAgentHostDetached( + content::DevToolsAgentHost* agent_host) { + if (const Extension* extension = GetExtensionForAgentHost(agent_host)) + DecrementLazyKeepaliveCount(extension); +} + void ProcessManager::UnregisterExtension(const std::string& extension_id) { // The lazy_keepalive_count may be greater than zero at this point because // RenderFrameHosts are still alive. During extension reloading, they will @@ -925,9 +918,8 @@ content::RenderFrameHost* host = it->first; if (GetExtensionID(host) == extension_id) { all_extension_frames_.erase(it++); - FOR_EACH_OBSERVER(ProcessManagerObserver, - observer_list_, - OnExtensionFrameUnregistered(extension_id, host)); + for (auto& observer : observer_list_) + observer.OnExtensionFrameUnregistered(extension_id, host); } else { ++it; }
diff --git a/extensions/browser/process_manager.h b/extensions/browser/process_manager.h index bcd3192b..c192e402 100644 --- a/extensions/browser/process_manager.h +++ b/extensions/browser/process_manager.h
@@ -18,6 +18,7 @@ #include "base/memory/weak_ptr.h" #include "base/observer_list.h" #include "components/keyed_service/core/keyed_service.h" +#include "content/public/browser/devtools_agent_host_observer.h" #include "content/public/browser/notification_observer.h" #include "content/public/browser/notification_registrar.h" #include "extensions/browser/event_page_tracker.h" @@ -48,7 +49,8 @@ class ProcessManager : public KeyedService, public content::NotificationObserver, public ExtensionRegistryObserver, - public EventPageTracker { + public EventPageTracker, + public content::DevToolsAgentHostObserver { public: using ExtensionHostSet = std::set<extensions::ExtensionHost*>; @@ -267,7 +269,14 @@ void CloseLazyBackgroundPageNow(const std::string& extension_id, uint64_t sequence_id); - void OnDevToolsStateChanged(content::DevToolsAgentHost*, bool attached); + const Extension* GetExtensionForAgentHost( + content::DevToolsAgentHost* agent_host); + + // content::DevToolsAgentHostObserver overrides. + void DevToolsAgentHostAttached( + content::DevToolsAgentHost* agent_host) override; + void DevToolsAgentHostDetached( + content::DevToolsAgentHost* agent_host) override; // Unregister RenderFrameHosts and clear background page data for an extension // which has been unloaded. @@ -299,8 +308,6 @@ // True if we have created the startup set of background hosts. bool startup_background_hosts_created_; - base::Callback<void(content::DevToolsAgentHost*, bool)> devtools_callback_; - ImpulseCallbackForTesting keepalive_impulse_callback_for_testing_; ImpulseCallbackForTesting keepalive_impulse_decrement_callback_for_testing_;
diff --git a/extensions/browser/script_executor.cc b/extensions/browser/script_executor.cc index 105889c..db2c02da 100644 --- a/extensions/browser/script_executor.cc +++ b/extensions/browser/script_executor.cc
@@ -168,9 +168,8 @@ host_id_.type() == HostID::EXTENSIONS) { ScriptExecutionObserver::ExecutingScriptsMap id_map; id_map[host_id_.id()] = std::set<std::string>(); - FOR_EACH_OBSERVER( - ScriptExecutionObserver, *script_observers_, - OnScriptsExecuted(web_contents(), id_map, root_frame_url_)); + for (auto& observer : *script_observers_) + observer.OnScriptsExecuted(web_contents(), id_map, root_frame_url_); } if (!callback_.is_null())
diff --git a/extensions/browser/user_script_loader.cc b/extensions/browser/user_script_loader.cc index 92c7fc15..0855deb 100644 --- a/extensions/browser/user_script_loader.cc +++ b/extensions/browser/user_script_loader.cc
@@ -170,7 +170,8 @@ } UserScriptLoader::~UserScriptLoader() { - FOR_EACH_OBSERVER(Observer, observers_, OnUserScriptLoaderDestroyed(this)); + for (auto& observer : observers_) + observer.OnUserScriptLoaderDestroyed(this); } void UserScriptLoader::AddScripts(std::unique_ptr<UserScriptList> scripts) { @@ -394,7 +395,8 @@ extensions::NOTIFICATION_USER_SCRIPTS_UPDATED, content::Source<BrowserContext>(browser_context_), content::Details<base::SharedMemory>(shared_memory_.get())); - FOR_EACH_OBSERVER(Observer, observers_, OnScriptsLoaded(this)); + for (auto& observer : observers_) + observer.OnScriptsLoaded(this); } void UserScriptLoader::SendUpdate(content::RenderProcessHost* process,
diff --git a/extensions/browser/warning_service.cc b/extensions/browser/warning_service.cc index 8ba356ac..68422c89 100644 --- a/extensions/browser/warning_service.cc +++ b/extensions/browser/warning_service.cc
@@ -117,8 +117,8 @@ void WarningService::NotifyWarningsChanged( const ExtensionIdSet& affected_extensions) { - FOR_EACH_OBSERVER(Observer, observer_list_, - ExtensionWarningsChanged(affected_extensions)); + for (auto& observer : observer_list_) + observer.ExtensionWarningsChanged(affected_extensions); } void WarningService::OnExtensionUnloaded(
diff --git a/extensions/common/api/_api_features.json b/extensions/common/api/_api_features.json index 10e15425..5380a15 100644 --- a/extensions/common/api/_api_features.json +++ b/extensions/common/api/_api_features.json
@@ -446,6 +446,7 @@ "blessed_extension", "blessed_web_page", "content_script", + "extension_service_worker", "unblessed_extension" ] }, {
diff --git a/extensions/common/api/cast_channel/cast_channel.proto b/extensions/common/api/cast_channel/cast_channel.proto index 1bd2877..098ecb74 100644 --- a/extensions/common/api/cast_channel/cast_channel.proto +++ b/extensions/common/api/cast_channel/cast_channel.proto
@@ -59,10 +59,17 @@ RSASSA_PSS = 2; } +enum HashAlgorithm { + SHA1 = 0; + SHA256 = 1; +} + // Messages for authentication protocol between a sender and a receiver. message AuthChallenge { optional SignatureAlgorithm signature_algorithm = 1 [default = RSASSA_PKCS1v15]; + optional bytes sender_nonce = 2; + optional HashAlgorithm hash_algorithm = 3 [default = SHA1]; } message AuthResponse { @@ -71,6 +78,9 @@ repeated bytes intermediate_certificate = 3; optional SignatureAlgorithm signature_algorithm = 4 [default = RSASSA_PKCS1v15]; + optional bytes sender_nonce = 5; + optional HashAlgorithm hash_algorithm = 6 [default = SHA1]; + optional bytes crl = 7; } message AuthError {
diff --git a/extensions/common/api/cast_channel/logging.proto b/extensions/common/api/cast_channel/logging.proto index 6ac52e4..a199c01 100644 --- a/extensions/common/api/cast_channel/logging.proto +++ b/extensions/common/api/cast_channel/logging.proto
@@ -122,6 +122,11 @@ CHALLENGE_REPLY_ERROR_CERT_NOT_SIGNED_BY_TRUSTED_CA = 10; CHALLENGE_REPLY_ERROR_CANNOT_EXTRACT_PUBLIC_KEY = 11; CHALLENGE_REPLY_ERROR_SIGNED_BLOBS_MISMATCH = 12; + CHALLENGE_REPLY_ERROR_TLS_CERT_VALIDITY_PERIOD_TOO_LONG = 13; + CHALLENGE_REPLY_ERROR_TLS_CERT_VALID_START_DATE_IN_FUTURE = 14; + CHALLENGE_REPLY_ERROR_TLS_CERT_EXPIRED = 15; + CHALLENGE_REPLY_ERROR_CRL_INVALID = 16; + CHALLENGE_REPLY_ERROR_CERT_REVOKED = 17; } message SocketEvent {
diff --git a/extensions/common/constants.cc b/extensions/common/constants.cc index 94684c5..ac685dd 100644 --- a/extensions/common/constants.cc +++ b/extensions/common/constants.cc
@@ -87,6 +87,8 @@ const char kMimeTypeJpeg[] = "image/jpeg"; const char kMimeTypePng[] = "image/png"; +const int64_t kInvalidServiceWorkerVersionId = -1; + } // namespace extensions namespace extension_misc {
diff --git a/extensions/common/constants.h b/extensions/common/constants.h index d3f0b532..4e1ef6a 100644 --- a/extensions/common/constants.h +++ b/extensions/common/constants.h
@@ -104,6 +104,11 @@ extern const char kMimeTypeJpeg[]; extern const char kMimeTypePng[]; +// TODO(lazyboy): This is a hack and it is copied from service_worker_types.cc, +// which is not available to extensions/ code. Move the constant to +// content/public/common. +extern const int64_t kInvalidServiceWorkerVersionId; + // The extension id of the Web Store component application. extern const char kWebStoreAppId[];
diff --git a/extensions/common/extension_messages.h b/extensions/common/extension_messages.h index f9e9bcb..55f72aa1 100644 --- a/extensions/common/extension_messages.h +++ b/extensions/common/extension_messages.h
@@ -116,9 +116,9 @@ // id. Otherwise, this is -1. IPC_STRUCT_MEMBER(int, worker_thread_id) - // If this API call is for a service worker, then this is the embedded - // worker id. Otherwise, this is -1. - IPC_STRUCT_MEMBER(int, embedded_worker_id) + // If this API call is for a service worker, then this is the service + // worker version id. Otherwise, this is -1. + IPC_STRUCT_MEMBER(int64_t, service_worker_version_id) IPC_STRUCT_END() // Allows an extension to execute code in a tab. @@ -887,3 +887,20 @@ bool /* success */, base::ListValue /* response wrapper (see comment above) */, std::string /* error */) + +// Asks the browser to increment the pending activity count for +// the worker with version id |service_worker_version_id|. +// Each request to increment must use unique |request_uuid|. If a request with +// |request_uuid| is already in progress (due to race condition or renderer +// compromise), browser process ignores the IPC. +IPC_MESSAGE_CONTROL2(ExtensionHostMsg_IncrementServiceWorkerActivity, + int64_t /* service_worker_version_id */, + std::string /* request_uuid */) + +// Asks the browser to decrement the pending activity count for +// the worker with version id |service_worker_version_id|. +// |request_uuid| must match the GUID of a previous request, otherwise the +// browser process ignores the IPC. +IPC_MESSAGE_CONTROL2(ExtensionHostMsg_DecrementServiceWorkerActivity, + int64_t /* service_worker_version_id */, + std::string /* request_uuid */)
diff --git a/extensions/components/native_app_window/native_app_window_views.cc b/extensions/components/native_app_window/native_app_window_views.cc index 9021342..f4abafac 100644 --- a/extensions/components/native_app_window/native_app_window_views.cc +++ b/extensions/components/native_app_window/native_app_window_views.cc
@@ -194,9 +194,8 @@ } void NativeAppWindowViews::OnViewWasResized() { - FOR_EACH_OBSERVER(web_modal::ModalDialogHostObserver, - observer_list_, - OnPositionRequiresUpdate()); + for (auto& observer : observer_list_) + observer.OnPositionRequiresUpdate(); } // WidgetDelegate implementation. @@ -272,9 +271,8 @@ // WidgetObserver implementation. void NativeAppWindowViews::OnWidgetDestroying(views::Widget* widget) { - FOR_EACH_OBSERVER(web_modal::ModalDialogHostObserver, - observer_list_, - OnHostDestroying()); + for (auto& observer : observer_list_) + observer.OnHostDestroying(); } void NativeAppWindowViews::OnWidgetVisibilityChanged(views::Widget* widget,
diff --git a/extensions/renderer/BUILD.gn b/extensions/renderer/BUILD.gn index 0d4fd28c..e867ea9 100644 --- a/extensions/renderer/BUILD.gn +++ b/extensions/renderer/BUILD.gn
@@ -255,6 +255,8 @@ sources = [ "activity_log_converter_strategy_unittest.cc", "api/mojo_private/mojo_private_unittest.cc", + "api_binding_test_util.cc", + "api_binding_test_util.h", "api_binding_unittest.cc", "api_test_base.cc", "api_test_base.h", @@ -279,6 +281,7 @@ deps = [ ":renderer", "//base", + "//content/public/child", "//extensions:extensions_renderer_resources", "//gin:gin_test",
diff --git a/extensions/renderer/api_binding_test_util.cc b/extensions/renderer/api_binding_test_util.cc new file mode 100644 index 0000000..9559642 --- /dev/null +++ b/extensions/renderer/api_binding_test_util.cc
@@ -0,0 +1,69 @@ +// 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 "extensions/renderer/api_binding_test_util.h" + +#include "base/json/json_reader.h" +#include "base/json/json_writer.h" +#include "base/strings/string_util.h" +#include "base/values.h" +#include "content/public/child/v8_value_converter.h" +#include "gin/converter.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace extensions { + +std::string ReplaceSingleQuotes(base::StringPiece str) { + std::string result; + base::ReplaceChars(str.as_string(), "'", "\"", &result); + return result; +} + +std::unique_ptr<base::Value> ValueFromString(base::StringPiece str) { + std::unique_ptr<base::Value> value = + base::JSONReader::Read(ReplaceSingleQuotes(str)); + EXPECT_TRUE(value) << str; + return value; +} + +std::unique_ptr<base::ListValue> ListValueFromString(base::StringPiece str) { + return base::ListValue::From(ValueFromString(str)); +} + +std::unique_ptr<base::DictionaryValue> DictionaryValueFromString( + base::StringPiece str) { + return base::DictionaryValue::From(ValueFromString(str)); +} + +std::string ValueToString(const base::Value& value) { + std::string json; + EXPECT_TRUE(base::JSONWriter::Write(value, &json)); + return json; +} + +v8::Local<v8::Value> V8ValueFromScriptSource(v8::Isolate* isolate, + base::StringPiece source) { + v8::Local<v8::Script> script = + v8::Script::Compile(gin::StringToV8(isolate, source)); + if (script.IsEmpty()) + return v8::Local<v8::Value>(); + return script->Run(); +} + +v8::Local<v8::Function> FunctionFromString(v8::Isolate* isolate, + base::StringPiece source) { + v8::Local<v8::Value> value = V8ValueFromScriptSource(isolate, source); + v8::Local<v8::Function> function; + EXPECT_TRUE(gin::ConvertFromV8(isolate, value, &function)); + return function; +} + +std::unique_ptr<base::Value> V8ToBaseValue(v8::Local<v8::Value> value, + v8::Local<v8::Context> context) { + std::unique_ptr<content::V8ValueConverter> converter( + content::V8ValueConverter::create()); + return converter->FromV8Value(value, context); +} + +} // namespace extensions
diff --git a/extensions/renderer/api_binding_test_util.h b/extensions/renderer/api_binding_test_util.h new file mode 100644 index 0000000..830b93b8 --- /dev/null +++ b/extensions/renderer/api_binding_test_util.h
@@ -0,0 +1,56 @@ +// 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 EXTENSIONS_RENDERER_API_BINDING_TEST_UTIL_H_ +#define EXTENSIONS_RENDERER_API_BINDING_TEST_UTIL_H_ + +#include <memory> +#include <string> + +#include "base/strings/string_piece.h" +#include "v8/include/v8.h" + +namespace base { +class DictionaryValue; +class ListValue; +class Value; +} + +namespace extensions { + +// Returns a string with all single quotes replaced with double quotes. Useful +// to write JSON strings without needing to escape quotes. +std::string ReplaceSingleQuotes(base::StringPiece str); + +// Returns a base::Value parsed from |str|. EXPECTs the conversion to succeed. +std::unique_ptr<base::Value> ValueFromString(base::StringPiece str); + +// As above, but returning a ListValue. +std::unique_ptr<base::ListValue> ListValueFromString(base::StringPiece str); + +// As above, but returning a DictionaryValue. +std::unique_ptr<base::DictionaryValue> DictionaryValueFromString( + base::StringPiece str); + +// Converts the given |value| to a JSON string. EXPECTs the conversion to +// succeed. +std::string ValueToString(const base::Value& value); + +// Returns a v8::Value result from compiling and running |source|, or an empty +// local on failure. +v8::Local<v8::Value> V8ValueFromScriptSource(v8::Isolate* isolate, + base::StringPiece source); + +// Returns a v8::Function parsed from the given |source|. EXPECTs the conversion +// to succeed. +v8::Local<v8::Function> FunctionFromString(v8::Isolate* isolate, + base::StringPiece source); + +// Converts the given |value| to a base::Value and returns the result. +std::unique_ptr<base::Value> V8ToBaseValue(v8::Local<v8::Value> value, + v8::Local<v8::Context> context); + +} // extensions + +#endif // EXTENSIONS_RENDERER_API_BINDING_TEST_UTIL_H_
diff --git a/extensions/renderer/api_binding_unittest.cc b/extensions/renderer/api_binding_unittest.cc index cadee14..cdcf0b1 100644 --- a/extensions/renderer/api_binding_unittest.cc +++ b/extensions/renderer/api_binding_unittest.cc
@@ -3,14 +3,12 @@ // found in the LICENSE file. #include "base/bind.h" -#include "base/json/json_reader.h" -#include "base/json/json_writer.h" #include "base/memory/ptr_util.h" #include "base/stl_util.h" -#include "base/strings/string_util.h" #include "base/strings/stringprintf.h" #include "base/values.h" #include "extensions/renderer/api_binding.h" +#include "extensions/renderer/api_binding_test_util.h" #include "gin/converter.h" #include "gin/public/context_holder.h" #include "gin/public/isolate_holder.h" @@ -67,16 +65,6 @@ const char kError[] = "Uncaught TypeError: Invalid invocation"; -// Helper to convert |source| into a ListValue after replacing single quotes -// with double quotes. -std::unique_ptr<base::ListValue> GetListValue(const char* source) { - std::string str; - base::ReplaceChars(source, "'", "\"", &str); - std::unique_ptr<base::Value> value = base::JSONReader::Read(str); - EXPECT_TRUE(value) << source; - return base::ListValue::From(std::move(value)); -} - } // namespace class APIBindingTest : public gin::V8Test { @@ -104,10 +92,8 @@ void ExpectPass(v8::Local<v8::Object> object, const std::string& script_source, const std::string& expected_json_arguments_single_quotes) { - std::string expected_json_arguments; - base::ReplaceChars(expected_json_arguments_single_quotes.c_str(), "'", "\"", - &expected_json_arguments); - RunTest(object, script_source, true, expected_json_arguments, + RunTest(object, script_source, true, + ReplaceSingleQuotes(expected_json_arguments_single_quotes), std::string()); } @@ -139,17 +125,12 @@ std::string wrapped_script_source = base::StringPrintf("(function(obj) { %s })", script_source.c_str()); v8::Isolate* isolate = instance_->isolate(); - v8::Local<v8::String> source = - gin::StringToV8(isolate, wrapped_script_source); - ASSERT_FALSE(source.IsEmpty()); + + v8::Local<v8::Function> func = + FunctionFromString(isolate, wrapped_script_source); + ASSERT_FALSE(func.IsEmpty()); v8::TryCatch try_catch(isolate); - v8::Local<v8::Script> script = v8::Script::Compile(source); - ASSERT_FALSE(script.IsEmpty()); - v8::Local<v8::Value> val = script->Run(); - ASSERT_FALSE(val.IsEmpty()); - v8::Local<v8::Function> func; - ASSERT_TRUE(gin::ConvertFromV8(isolate, val, &func)); v8::Local<v8::Value> argv[] = {object}; func->Call(v8::Undefined(isolate), 1, argv); @@ -157,9 +138,7 @@ EXPECT_FALSE(try_catch.HasCaught()) << gin::V8ToString(try_catch.Message()->Get()); ASSERT_TRUE(arguments_) << script_source; - std::string actual_json; - EXPECT_TRUE(base::JSONWriter::Write(*arguments_, &actual_json)); - EXPECT_EQ(expected_json_arguments, actual_json); + EXPECT_EQ(expected_json_arguments, ValueToString(*arguments_)); } else { ASSERT_TRUE(try_catch.HasCaught()) << script_source; std::string message = gin::V8ToString(try_catch.Message()->Get()); @@ -170,7 +149,7 @@ } TEST_F(APIBindingTest, Test) { - std::unique_ptr<base::ListValue> functions = GetListValue(kFunctions); + std::unique_ptr<base::ListValue> functions = ListValueFromString(kFunctions); ASSERT_TRUE(functions); ArgumentSpec::RefMap refs; APIBinding binding( @@ -248,9 +227,10 @@ " }]" "}]"; - std::unique_ptr<base::ListValue> functions = GetListValue(kRefFunctions); + std::unique_ptr<base::ListValue> functions = + ListValueFromString(kRefFunctions); ASSERT_TRUE(functions); - std::unique_ptr<base::ListValue> types = GetListValue(kTypes); + std::unique_ptr<base::ListValue> types = ListValueFromString(kTypes); ASSERT_TRUE(types); ArgumentSpec::RefMap refs; APIBinding binding(
diff --git a/extensions/renderer/argument_spec_unittest.cc b/extensions/renderer/argument_spec_unittest.cc index 336f3f80..6213259 100644 --- a/extensions/renderer/argument_spec_unittest.cc +++ b/extensions/renderer/argument_spec_unittest.cc
@@ -2,11 +2,9 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "base/json/json_reader.h" -#include "base/json/json_writer.h" #include "base/memory/ptr_util.h" -#include "base/strings/string_util.h" #include "base/values.h" +#include "extensions/renderer/api_binding_test_util.h" #include "extensions/renderer/argument_spec.h" #include "gin/converter.h" #include "gin/public/isolate_holder.h" @@ -16,20 +14,6 @@ namespace extensions { -namespace { - -// Returns a parsed version of |str|, substituting double quotes for single -// quotes. -std::unique_ptr<base::Value> GetValue(const std::string& str) { - std::string updated; - base::ReplaceChars(str.c_str(), "'", "\"", &updated); - std::unique_ptr<base::Value> value = base::JSONReader::Read(updated); - CHECK(value) << str; - return value; -} - -} // namespace - class ArgumentSpecUnitTest : public gin::V8Test { protected: ArgumentSpecUnitTest() {} @@ -37,11 +21,8 @@ void ExpectSuccess(const ArgumentSpec& spec, const std::string& script_source, const std::string& expected_json_single_quotes) { - std::string expected_json; - base::ReplaceChars(expected_json_single_quotes.c_str(), "'", "\"", - &expected_json); - RunTest(spec, script_source, TestResult::PASS, expected_json, - std::string()); + RunTest(spec, script_source, TestResult::PASS, + ReplaceSingleQuotes(expected_json_single_quotes), std::string()); } void ExpectFailure(const ArgumentSpec& spec, @@ -82,15 +63,11 @@ const std::string& expected_thrown_message) { v8::Isolate* isolate = instance_->isolate(); v8::HandleScope handle_scope(instance_->isolate()); - v8::Local<v8::String> source = gin::StringToV8(isolate, script_source); - ASSERT_FALSE(source.IsEmpty()); v8::Local<v8::Context> context = v8::Local<v8::Context>::New(instance_->isolate(), context_); - v8::Local<v8::Script> script = v8::Script::Compile(source); - ASSERT_FALSE(script.IsEmpty()) << script_source; v8::TryCatch try_catch(isolate); - v8::Local<v8::Value> val = script->Run(); + v8::Local<v8::Value> val = V8ValueFromScriptSource(isolate, script_source); ASSERT_FALSE(val.IsEmpty()) << script_source; std::string error; @@ -102,9 +79,7 @@ ASSERT_EQ(should_throw, try_catch.HasCaught()) << script_source; if (should_succeed) { ASSERT_TRUE(out_value); - std::string actual_json; - EXPECT_TRUE(base::JSONWriter::Write(*out_value, &actual_json)); - EXPECT_EQ(expected_json, actual_json); + EXPECT_EQ(expected_json, ValueToString(*out_value)); } else if (should_throw) { EXPECT_EQ(expected_thrown_message, gin::V8ToString(try_catch.Message()->Get())); @@ -113,7 +88,7 @@ TEST_F(ArgumentSpecUnitTest, Test) { { - ArgumentSpec spec(*GetValue("{'type': 'integer'}")); + ArgumentSpec spec(*ValueFromString("{'type': 'integer'}")); ExpectSuccess(spec, "1", "1"); ExpectSuccess(spec, "-1", "-1"); ExpectSuccess(spec, "0", "0"); @@ -126,7 +101,7 @@ } { - ArgumentSpec spec(*GetValue("{'type': 'integer', 'minimum': 1}")); + ArgumentSpec spec(*ValueFromString("{'type': 'integer', 'minimum': 1}")); ExpectSuccess(spec, "2", "2"); ExpectSuccess(spec, "1", "1"); ExpectFailure(spec, "0"); @@ -134,7 +109,7 @@ } { - ArgumentSpec spec(*GetValue("{'type': 'string'}")); + ArgumentSpec spec(*ValueFromString("{'type': 'string'}")); ExpectSuccess(spec, "'foo'", "'foo'"); ExpectSuccess(spec, "''", "''"); ExpectFailure(spec, "1"); @@ -143,7 +118,8 @@ } { - ArgumentSpec spec(*GetValue("{'type': 'string', 'enum': ['foo', 'bar']}")); + ArgumentSpec spec( + *ValueFromString("{'type': 'string', 'enum': ['foo', 'bar']}")); ExpectSuccess(spec, "'foo'", "'foo'"); ExpectSuccess(spec, "'bar'", "'bar'"); ExpectFailure(spec, "['foo']"); @@ -154,7 +130,7 @@ } { - ArgumentSpec spec(*GetValue("{'type': 'boolean'}")); + ArgumentSpec spec(*ValueFromString("{'type': 'boolean'}")); ExpectSuccess(spec, "true", "true"); ExpectSuccess(spec, "false", "false"); ExpectFailure(spec, "1"); @@ -164,7 +140,7 @@ { ArgumentSpec spec( - *GetValue("{'type': 'array', 'items': {'type': 'string'}}")); + *ValueFromString("{'type': 'array', 'items': {'type': 'string'}}")); ExpectSuccess(spec, "[]", "[]"); ExpectSuccess(spec, "['foo']", "['foo']"); ExpectSuccess(spec, "['foo', 'bar']", "['foo','bar']"); @@ -191,7 +167,7 @@ " 'prop2': {'type': 'integer', 'optional': true}" " }" "}"; - ArgumentSpec spec(*GetValue(kObjectSpec)); + ArgumentSpec spec(*ValueFromString(kObjectSpec)); ExpectSuccess(spec, "({prop1: 'foo', prop2: 2})", "{'prop1':'foo','prop2':2}"); ExpectSuccess(spec, "({prop1: 'foo', prop2: 2, prop3: 'blah'})", @@ -240,8 +216,10 @@ "}"; const char kEnumType[] = "{'id': 'refEnum', 'type': 'string', 'enum': ['alpha', 'beta']}"; - AddTypeRef("refObj", base::MakeUnique<ArgumentSpec>(*GetValue(kObjectType))); - AddTypeRef("refEnum", base::MakeUnique<ArgumentSpec>(*GetValue(kEnumType))); + AddTypeRef("refObj", + base::MakeUnique<ArgumentSpec>(*ValueFromString(kObjectType))); + AddTypeRef("refEnum", + base::MakeUnique<ArgumentSpec>(*ValueFromString(kEnumType))); { const char kObjectWithRefEnumSpec[] = @@ -253,7 +231,7 @@ " 'sub': {'type': 'integer'}" " }" "}"; - ArgumentSpec spec(*GetValue(kObjectWithRefEnumSpec)); + ArgumentSpec spec(*ValueFromString(kObjectWithRefEnumSpec)); ExpectSuccess(spec, "({e: 'alpha', sub: 1})", "{'e':'alpha','sub':1}"); ExpectSuccess(spec, "({e: 'beta', sub: 1})", "{'e':'beta','sub':1}"); ExpectFailure(spec, "({e: 'gamma', sub: 1})"); @@ -269,7 +247,7 @@ " 'o': {'$ref': 'refObj'}" " }" "}"; - ArgumentSpec spec(*GetValue(kObjectWithRefObjectSpec)); + ArgumentSpec spec(*ValueFromString(kObjectWithRefObjectSpec)); ExpectSuccess(spec, "({o: {prop1: 'foo'}})", "{'o':{'prop1':'foo'}}"); ExpectSuccess(spec, "({o: {prop1: 'foo', prop2: 2}})", "{'o':{'prop1':'foo','prop2':2}}"); @@ -279,7 +257,7 @@ { const char kRefEnumListSpec[] = "{'type': 'array', 'items': {'$ref': 'refEnum'}}"; - ArgumentSpec spec(*GetValue(kRefEnumListSpec)); + ArgumentSpec spec(*ValueFromString(kRefEnumListSpec)); ExpectSuccess(spec, "['alpha']", "['alpha']"); ExpectSuccess(spec, "['alpha', 'alpha']", "['alpha','alpha']"); ExpectSuccess(spec, "['alpha', 'beta']", "['alpha','beta']");
diff --git a/extensions/renderer/dispatcher.cc b/extensions/renderer/dispatcher.cc index 053d688a..4b7525bb 100644 --- a/extensions/renderer/dispatcher.cc +++ b/extensions/renderer/dispatcher.cc
@@ -87,6 +87,7 @@ #include "extensions/renderer/script_injection.h" #include "extensions/renderer/script_injection_manager.h" #include "extensions/renderer/send_request_natives.h" +#include "extensions/renderer/service_worker_request_sender.h" #include "extensions/renderer/set_icon_natives.h" #include "extensions/renderer/static_v8_external_one_byte_string_resource.h" #include "extensions/renderer/test_features_native_handler.h" @@ -397,7 +398,7 @@ void Dispatcher::DidInitializeServiceWorkerContextOnWorkerThread( v8::Local<v8::Context> v8_context, - int embedded_worker_id, + int64_t service_worker_version_id, const GURL& url) { const base::TimeTicks start_time = base::TimeTicks::Now(); @@ -443,7 +444,7 @@ context->set_url(url); if (ExtensionsClient::Get()->ExtensionAPIEnabledInExtensionServiceWorkers()) { - WorkerThreadDispatcher::Get()->AddWorkerData(embedded_worker_id); + WorkerThreadDispatcher::Get()->AddWorkerData(service_worker_version_id); { // TODO(lazyboy): Make sure accessing |source_map_| in worker thread is // safe. @@ -537,7 +538,7 @@ // static void Dispatcher::WillDestroyServiceWorkerContextOnWorkerThread( v8::Local<v8::Context> v8_context, - int embedded_worker_id, + int64_t service_worker_version_id, const GURL& url) { if (url.SchemeIs(kExtensionScheme) || url.SchemeIs(kExtensionResourceScheme)) { @@ -545,7 +546,7 @@ g_worker_script_context_set.Get().Remove(v8_context, url); } if (ExtensionsClient::Get()->ExtensionAPIEnabledInExtensionServiceWorkers()) - WorkerThreadDispatcher::Get()->RemoveWorkerData(embedded_worker_id); + WorkerThreadDispatcher::Get()->RemoveWorkerData(service_worker_version_id); } void Dispatcher::DidCreateDocumentElement(blink::WebLocalFrame* frame) {
diff --git a/extensions/renderer/dispatcher.h b/extensions/renderer/dispatcher.h index b592b07..b960bef 100644 --- a/extensions/renderer/dispatcher.h +++ b/extensions/renderer/dispatcher.h
@@ -102,7 +102,7 @@ // variables. void DidInitializeServiceWorkerContextOnWorkerThread( v8::Local<v8::Context> v8_context, - int embedded_worker_id, + int64_t service_worker_version_id, const GURL& url); void WillReleaseScriptContext(blink::WebLocalFrame* frame, @@ -112,7 +112,7 @@ // Runs on a different thread and should not use any member variables. static void WillDestroyServiceWorkerContextOnWorkerThread( v8::Local<v8::Context> v8_context, - int embedded_worker_id, + int64_t service_worker_version_id, const GURL& url); // This method is not allowed to run JavaScript code in the frame.
diff --git a/extensions/renderer/request_sender.cc b/extensions/renderer/request_sender.cc index 9937389..b3fc126 100644 --- a/extensions/renderer/request_sender.cc +++ b/extensions/renderer/request_sender.cc
@@ -8,6 +8,7 @@ #include "base/timer/elapsed_timer.h" #include "base/values.h" #include "content/public/renderer/render_frame.h" +#include "extensions/common/constants.h" #include "extensions/common/extension_messages.h" #include "extensions/renderer/script_context.h" #include "third_party/WebKit/public/web/WebDocument.h" @@ -118,7 +119,7 @@ // Set Service Worker specific params to default values. params.worker_thread_id = -1; - params.embedded_worker_id = -1; + params.service_worker_version_id = kInvalidServiceWorkerVersionId; SendRequest(render_frame, for_io_thread, params); return true;
diff --git a/extensions/renderer/script_injection_manager.cc b/extensions/renderer/script_injection_manager.cc index 3b6bc305..19c356f 100644 --- a/extensions/renderer/script_injection_manager.cc +++ b/extensions/renderer/script_injection_manager.cc
@@ -218,7 +218,7 @@ // TODO(markdittmer): URL-checking isn't the best security measure. // Begin script injection workflow only if the current URL is identical to // the one that matched declarative conditions in the browser. - if (render_frame()->GetWebFrame()->document().url() == url) { + if (GURL(render_frame()->GetWebFrame()->document().url()) == url) { manager_->HandleExecuteDeclarativeScript(render_frame(), tab_id, extension_id,
diff --git a/extensions/renderer/service_worker_data.cc b/extensions/renderer/service_worker_data.cc index 197bff95..b10b015b 100644 --- a/extensions/renderer/service_worker_data.cc +++ b/extensions/renderer/service_worker_data.cc
@@ -10,11 +10,12 @@ namespace extensions { ServiceWorkerData::ServiceWorkerData(WorkerThreadDispatcher* dispatcher, - int embedded_worker_id) - : embedded_worker_id_(embedded_worker_id), + int64_t service_worker_version_id) + : service_worker_version_id_(service_worker_version_id), v8_schema_registry_(new V8SchemaRegistry), request_sender_( - new ServiceWorkerRequestSender(dispatcher, embedded_worker_id)) {} + new ServiceWorkerRequestSender(dispatcher, + service_worker_version_id)) {} ServiceWorkerData::~ServiceWorkerData() {}
diff --git a/extensions/renderer/service_worker_data.h b/extensions/renderer/service_worker_data.h index b273960..701a7613 100644 --- a/extensions/renderer/service_worker_data.h +++ b/extensions/renderer/service_worker_data.h
@@ -19,15 +19,18 @@ // TODO(lazyboy): Also put worker ScriptContexts in this. class ServiceWorkerData { public: - ServiceWorkerData(WorkerThreadDispatcher* dispatcher, int embedded_worker_id); + ServiceWorkerData(WorkerThreadDispatcher* dispatcher, + int64_t service_worker_version_id); ~ServiceWorkerData(); V8SchemaRegistry* v8_schema_registry() { return v8_schema_registry_.get(); } - RequestSender* request_sender() { return request_sender_.get(); } - int embedded_worker_id() const { return embedded_worker_id_; } + ServiceWorkerRequestSender* request_sender() { return request_sender_.get(); } + int64_t service_worker_version_id() const { + return service_worker_version_id_; + } private: - const int embedded_worker_id_; + const int64_t service_worker_version_id_; std::unique_ptr<V8SchemaRegistry> v8_schema_registry_; std::unique_ptr<ServiceWorkerRequestSender> request_sender_;
diff --git a/extensions/renderer/service_worker_request_sender.cc b/extensions/renderer/service_worker_request_sender.cc index a4d089ae..6830ed3 100644 --- a/extensions/renderer/service_worker_request_sender.cc +++ b/extensions/renderer/service_worker_request_sender.cc
@@ -4,6 +4,7 @@ #include "extensions/renderer/service_worker_request_sender.h" +#include "base/guid.h" #include "content/public/child/worker_thread.h" #include "extensions/common/extension_messages.h" #include "extensions/renderer/worker_thread_dispatcher.h" @@ -12,8 +13,9 @@ ServiceWorkerRequestSender::ServiceWorkerRequestSender( WorkerThreadDispatcher* dispatcher, - int embedded_worker_id) - : dispatcher_(dispatcher), embedded_worker_id_(embedded_worker_id) {} + int64_t service_worker_version_id) + : dispatcher_(dispatcher), + service_worker_version_id_(service_worker_version_id) {} ServiceWorkerRequestSender::~ServiceWorkerRequestSender() {} @@ -25,9 +27,32 @@ int worker_thread_id = content::WorkerThread::GetCurrentId(); DCHECK_GT(worker_thread_id, 0); params.worker_thread_id = worker_thread_id; - params.embedded_worker_id = embedded_worker_id_; + params.service_worker_version_id = service_worker_version_id_; + std::string guid = base::GenerateGUID(); + request_id_to_guid_[params.request_id] = guid; + + // Keeps the worker alive during extension function call. Balanced in + // HandleWorkerResponse(). + dispatcher_->Send(new ExtensionHostMsg_IncrementServiceWorkerActivity( + service_worker_version_id_, guid)); dispatcher_->Send(new ExtensionHostMsg_RequestWorker(params)); } +void ServiceWorkerRequestSender::HandleWorkerResponse( + int request_id, + int64_t service_worker_version_id, + bool success, + const base::ListValue& response, + const std::string& error) { + RequestSender::HandleResponse(request_id, success, response, error); + + std::map<int, std::string>::iterator iter = + request_id_to_guid_.find(request_id); + DCHECK(iter != request_id_to_guid_.end()); + dispatcher_->Send(new ExtensionHostMsg_DecrementServiceWorkerActivity( + service_worker_version_id_, iter->second)); + request_id_to_guid_.erase(iter); +} + } // namespace extensions
diff --git a/extensions/renderer/service_worker_request_sender.h b/extensions/renderer/service_worker_request_sender.h index ad22f47..0493f617 100644 --- a/extensions/renderer/service_worker_request_sender.h +++ b/extensions/renderer/service_worker_request_sender.h
@@ -14,16 +14,24 @@ class ServiceWorkerRequestSender : public RequestSender { public: ServiceWorkerRequestSender(WorkerThreadDispatcher* dispatcher, - int embedded_worker_id); + int64_t service_worker_version_id); ~ServiceWorkerRequestSender() override; void SendRequest(content::RenderFrame* render_frame, bool for_io_thread, ExtensionHostMsg_Request_Params& params) override; + void HandleWorkerResponse(int request_id, + int64_t service_worker_version_id, + bool success, + const base::ListValue& response, + const std::string& error); private: WorkerThreadDispatcher* const dispatcher_; - const int embedded_worker_id_; + const int64_t service_worker_version_id_; + + // request id -> GUID map for each outstanding requests. + std::map<int, std::string> request_id_to_guid_; DISALLOW_COPY_AND_ASSIGN(ServiceWorkerRequestSender); };
diff --git a/extensions/renderer/user_script_set.cc b/extensions/renderer/user_script_set.cc index cf100812..8a7fdfb 100644 --- a/extensions/renderer/user_script_set.cc +++ b/extensions/renderer/user_script_set.cc
@@ -156,8 +156,8 @@ scripts_.push_back(std::move(script)); } - FOR_EACH_OBSERVER(Observer, observers_, - OnUserScriptsUpdated(changed_hosts, scripts_)); + for (auto& observer : observers_) + observer.OnUserScriptsUpdated(changed_hosts, scripts_); return true; }
diff --git a/extensions/renderer/user_script_set_manager.cc b/extensions/renderer/user_script_set_manager.cc index 3b63067..8108c04 100644 --- a/extensions/renderer/user_script_set_manager.cc +++ b/extensions/renderer/user_script_set_manager.cc
@@ -151,8 +151,8 @@ if (scripts->UpdateUserScripts(shared_memory, *effective_hosts, whitelisted_only)) { - FOR_EACH_OBSERVER(Observer, observers_, - OnUserScriptsUpdated(*effective_hosts)); + for (auto& observer : observers_) + observer.OnUserScriptsUpdated(*effective_hosts); } }
diff --git a/extensions/renderer/worker_thread_dispatcher.cc b/extensions/renderer/worker_thread_dispatcher.cc index cc9fdc88..0d189d44f 100644 --- a/extensions/renderer/worker_thread_dispatcher.cc +++ b/extensions/renderer/worker_thread_dispatcher.cc
@@ -24,8 +24,10 @@ bool succeeded, const std::unique_ptr<base::ListValue>& response, const std::string& error) { - WorkerThreadDispatcher::GetRequestSender()->HandleResponse( - request_id, succeeded, *response, error); + ServiceWorkerData* data = g_data_tls.Pointer()->Get(); + WorkerThreadDispatcher::GetRequestSender()->HandleWorkerResponse( + request_id, data->service_worker_version_id(), succeeded, *response, + error); } } // namespace @@ -52,7 +54,7 @@ } // static -RequestSender* WorkerThreadDispatcher::GetRequestSender() { +ServiceWorkerRequestSender* WorkerThreadDispatcher::GetRequestSender() { ServiceWorkerData* data = g_data_tls.Pointer()->Get(); DCHECK(data); return data->request_sender(); @@ -84,19 +86,20 @@ base::Passed(response.CreateDeepCopy()), error)); } -void WorkerThreadDispatcher::AddWorkerData(int embedded_worker_id) { +void WorkerThreadDispatcher::AddWorkerData(int64_t service_worker_version_id) { ServiceWorkerData* data = g_data_tls.Pointer()->Get(); if (!data) { ServiceWorkerData* new_data = - new ServiceWorkerData(this, embedded_worker_id); + new ServiceWorkerData(this, service_worker_version_id); g_data_tls.Pointer()->Set(new_data); } } -void WorkerThreadDispatcher::RemoveWorkerData(int embedded_worker_id) { +void WorkerThreadDispatcher::RemoveWorkerData( + int64_t service_worker_version_id) { ServiceWorkerData* data = g_data_tls.Pointer()->Get(); if (data) { - DCHECK_EQ(embedded_worker_id, data->embedded_worker_id()); + DCHECK_EQ(service_worker_version_id, data->service_worker_version_id()); delete data; g_data_tls.Pointer()->Set(nullptr); }
diff --git a/extensions/renderer/worker_thread_dispatcher.h b/extensions/renderer/worker_thread_dispatcher.h index 4a93011..da8946a 100644 --- a/extensions/renderer/worker_thread_dispatcher.h +++ b/extensions/renderer/worker_thread_dispatcher.h
@@ -19,6 +19,7 @@ namespace extensions { class RequestSender; +class ServiceWorkerRequestSender; class V8SchemaRegistry; // Sends and receives IPC in an extension Service Worker. @@ -34,12 +35,12 @@ // Thread safe. static WorkerThreadDispatcher* Get(); - static RequestSender* GetRequestSender(); + static ServiceWorkerRequestSender* GetRequestSender(); void Init(content::RenderThread* render_thread); bool Send(IPC::Message* message); - void AddWorkerData(int embedded_worker_id); - void RemoveWorkerData(int embedded_worker_id); + void AddWorkerData(int64_t service_worker_version_id); + void RemoveWorkerData(int64_t service_worker_version_id); V8SchemaRegistry* GetV8SchemaRegistry(); private:
diff --git a/gin/modules/module_registry.cc b/gin/modules/module_registry.cc index bf11ec8..3e8b4759 100644 --- a/gin/modules/module_registry.cc +++ b/gin/modules/module_registry.cc
@@ -163,8 +163,8 @@ const std::string pending_id = pending->id; const std::vector<std::string> pending_dependencies = pending->dependencies; AttemptToLoad(isolate, std::move(pending)); - FOR_EACH_OBSERVER(ModuleRegistryObserver, observer_list_, - OnDidAddPendingModule(pending_id, pending_dependencies)); + for (auto& observer : observer_list_) + observer.OnDidAddPendingModule(pending_id, pending_dependencies); } void ModuleRegistry::LoadModule(Isolate* isolate,
diff --git a/google_apis/drive/auth_service.cc b/google_apis/drive/auth_service.cc index c14f32e..cfa54fa3 100644 --- a/google_apis/drive/auth_service.cc +++ b/google_apis/drive/auth_service.cc
@@ -226,9 +226,8 @@ access_token_.clear(); has_refresh_token_ = has_refresh_token; - FOR_EACH_OBSERVER(AuthServiceObserver, - observers_, - OnOAuth2RefreshTokenChanged()); + for (auto& observer : observers_) + observer.OnOAuth2RefreshTokenChanged(); } } // namespace google_apis
diff --git a/google_apis/gaia/account_tracker.cc b/google_apis/gaia/account_tracker.cc index 0a2cce0..c00e5bdc 100644 --- a/google_apis/gaia/account_tracker.cc +++ b/google_apis/gaia/account_tracker.cc
@@ -154,14 +154,14 @@ void AccountTracker::NotifyAccountAdded(const AccountState& account) { DCHECK(!account.ids.gaia.empty()); - FOR_EACH_OBSERVER( - Observer, observer_list_, OnAccountAdded(account.ids)); + for (auto& observer : observer_list_) + observer.OnAccountAdded(account.ids); } void AccountTracker::NotifyAccountRemoved(const AccountState& account) { DCHECK(!account.ids.gaia.empty()); - FOR_EACH_OBSERVER( - Observer, observer_list_, OnAccountRemoved(account.ids)); + for (auto& observer : observer_list_) + observer.OnAccountRemoved(account.ids); } void AccountTracker::NotifySignInChanged(const AccountState& account) { @@ -172,9 +172,8 @@ "422460 AccountTracker::NotifySignInChanged")); DCHECK(!account.ids.gaia.empty()); - FOR_EACH_OBSERVER(Observer, - observer_list_, - OnAccountSignInChanged(account.ids, account.is_signed_in)); + for (auto& observer : observer_list_) + observer.OnAccountSignInChanged(account.ids, account.is_signed_in); } void AccountTracker::UpdateSignInState(const std::string& account_key,
diff --git a/google_apis/gaia/identity_provider.cc b/google_apis/gaia/identity_provider.cc index be698ff..77a1480 100644 --- a/google_apis/gaia/identity_provider.cc +++ b/google_apis/gaia/identity_provider.cc
@@ -48,31 +48,30 @@ if (account_id != GetActiveAccountId()) return; - FOR_EACH_OBSERVER(OAuth2TokenService::Observer, - token_service_observers_, - OnRefreshTokenAvailable(account_id)); + for (auto& observer : token_service_observers_) + observer.OnRefreshTokenAvailable(account_id); } void IdentityProvider::OnRefreshTokenRevoked(const std::string& account_id) { if (account_id != GetActiveAccountId()) return; - FOR_EACH_OBSERVER(OAuth2TokenService::Observer, - token_service_observers_, - OnRefreshTokenRevoked(account_id)); + for (auto& observer : token_service_observers_) + observer.OnRefreshTokenRevoked(account_id); } void IdentityProvider::OnRefreshTokensLoaded() { - FOR_EACH_OBSERVER(OAuth2TokenService::Observer, - token_service_observers_, - OnRefreshTokensLoaded()); + for (auto& observer : token_service_observers_) + observer.OnRefreshTokensLoaded(); } IdentityProvider::IdentityProvider() : token_service_observer_count_(0) {} void IdentityProvider::FireOnActiveAccountLogin() { - FOR_EACH_OBSERVER(Observer, observers_, OnActiveAccountLogin()); + for (auto& observer : observers_) + observer.OnActiveAccountLogin(); } void IdentityProvider::FireOnActiveAccountLogout() { - FOR_EACH_OBSERVER(Observer, observers_, OnActiveAccountLogout()); + for (auto& observer : observers_) + observer.OnActiveAccountLogout(); }
diff --git a/google_apis/gaia/oauth2_token_service.cc b/google_apis/gaia/oauth2_token_service.cc index 7e55a49..01614d8 100644 --- a/google_apis/gaia/oauth2_token_service.cc +++ b/google_apis/gaia/oauth2_token_service.cc
@@ -483,10 +483,8 @@ FROM_HERE_WITH_EXPLICIT_FUNCTION( "422460 OAuth2TokenService::StartRequestForClientWithContext 1")); std::unique_ptr<RequestImpl> request(new RequestImpl(account_id, consumer)); - FOR_EACH_OBSERVER(DiagnosticsObserver, diagnostics_observer_list_, - OnAccessTokenRequested(account_id, - consumer->id(), - scopes)); + for (auto& observer : diagnostics_observer_list_) + observer.OnAccessTokenRequested(account_id, consumer->id(), scopes); if (!RefreshTokenIsAvailable(account_id)) { // TODO(robliao): Remove ScopedTracker below once https://crbug.com/422460 @@ -497,10 +495,10 @@ GoogleServiceAuthError error(GoogleServiceAuthError::USER_NOT_SIGNED_UP); - FOR_EACH_OBSERVER(DiagnosticsObserver, diagnostics_observer_list_, - OnFetchAccessTokenComplete( - account_id, consumer->id(), scopes, error, - base::Time())); + for (auto& observer : diagnostics_observer_list_) { + observer.OnFetchAccessTokenComplete(account_id, consumer->id(), scopes, + error, base::Time()); + } base::ThreadTaskRunnerHandle::Get()->PostTask( FROM_HERE, @@ -578,13 +576,12 @@ OAuth2TokenService::Consumer* consumer) { CHECK(HasCacheEntry(request_parameters)); const CacheEntry* cache_entry = GetCacheEntry(request_parameters); - FOR_EACH_OBSERVER(DiagnosticsObserver, diagnostics_observer_list_, - OnFetchAccessTokenComplete( - request_parameters.account_id, - consumer->id(), - request_parameters.scopes, - GoogleServiceAuthError::AuthErrorNone(), - cache_entry->expiration_date)); + for (auto& observer : diagnostics_observer_list_) { + observer.OnFetchAccessTokenComplete( + request_parameters.account_id, consumer->id(), + request_parameters.scopes, GoogleServiceAuthError::AuthErrorNone(), + cache_entry->expiration_date); + } base::ThreadTaskRunnerHandle::Get()->PostTask( FROM_HERE, base::Bind(&RequestImpl::InformConsumer, request->AsWeakPtr(), @@ -681,11 +678,11 @@ for (size_t i = 0; i < requests.size(); ++i) { const RequestImpl* req = requests[i].get(); if (req) { - FOR_EACH_OBSERVER(DiagnosticsObserver, diagnostics_observer_list_, - OnFetchAccessTokenComplete( - req->GetAccountId(), req->GetConsumerId(), - fetcher->GetScopeSet(), fetcher->error(), - entry ? entry->expiration_date : base::Time())); + for (auto& observer : diagnostics_observer_list_) { + observer.OnFetchAccessTokenComplete( + req->GetAccountId(), req->GetConsumerId(), fetcher->GetScopeSet(), + fetcher->error(), entry ? entry->expiration_date : base::Time()); + } } } @@ -724,9 +721,10 @@ TokenCache::iterator token_iterator = token_cache_.find(request_parameters); if (token_iterator != token_cache_.end() && token_iterator->second.access_token == token_to_remove) { - FOR_EACH_OBSERVER(DiagnosticsObserver, diagnostics_observer_list_, - OnTokenRemoved(request_parameters.account_id, - request_parameters.scopes)); + for (auto& observer : diagnostics_observer_list_) { + observer.OnTokenRemoved(request_parameters.account_id, + request_parameters.scopes); + } token_cache_.erase(token_iterator); return true; } @@ -756,9 +754,8 @@ DCHECK(CalledOnValidThread()); for (TokenCache::iterator iter = token_cache_.begin(); iter != token_cache_.end(); ++iter) { - FOR_EACH_OBSERVER(DiagnosticsObserver, diagnostics_observer_list_, - OnTokenRemoved(iter->first.account_id, - iter->first.scopes)); + for (auto& observer : diagnostics_observer_list_) + observer.OnTokenRemoved(iter->first.account_id, iter->first.scopes); } token_cache_.clear(); @@ -770,8 +767,8 @@ iter != token_cache_.end(); /* iter incremented in body */) { if (iter->first.account_id == account_id) { - FOR_EACH_OBSERVER(DiagnosticsObserver, diagnostics_observer_list_, - OnTokenRemoved(account_id, iter->first.scopes)); + for (auto& observer : diagnostics_observer_list_) + observer.OnTokenRemoved(account_id, iter->first.scopes); token_cache_.erase(iter++); } else { ++iter;
diff --git a/google_apis/gaia/oauth2_token_service_delegate.cc b/google_apis/gaia/oauth2_token_service_delegate.cc index 0898c7a2..ccdba78 100644 --- a/google_apis/gaia/oauth2_token_service_delegate.cc +++ b/google_apis/gaia/oauth2_token_service_delegate.cc
@@ -58,17 +58,19 @@ void OAuth2TokenServiceDelegate::StartBatchChanges() { ++batch_change_depth_; - if (batch_change_depth_ == 1) - FOR_EACH_OBSERVER(OAuth2TokenService::Observer, observer_list_, - OnStartBatchChanges()); + if (batch_change_depth_ == 1) { + for (auto& observer : observer_list_) + observer.OnStartBatchChanges(); + } } void OAuth2TokenServiceDelegate::EndBatchChanges() { --batch_change_depth_; DCHECK_LE(0, batch_change_depth_); - if (batch_change_depth_ == 0) - FOR_EACH_OBSERVER(OAuth2TokenService::Observer, observer_list_, - OnEndBatchChanges()); + if (batch_change_depth_ == 0) { + for (auto& observer : observer_list_) + observer.OnEndBatchChanges(); + } } void OAuth2TokenServiceDelegate::FireRefreshTokenAvailable( @@ -79,14 +81,14 @@ FROM_HERE_WITH_EXPLICIT_FUNCTION( "422460 OAuth2TokenService::FireRefreshTokenAvailable")); - FOR_EACH_OBSERVER(OAuth2TokenService::Observer, observer_list_, - OnRefreshTokenAvailable(account_id)); + for (auto& observer : observer_list_) + observer.OnRefreshTokenAvailable(account_id); } void OAuth2TokenServiceDelegate::FireRefreshTokenRevoked( const std::string& account_id) { - FOR_EACH_OBSERVER(OAuth2TokenService::Observer, observer_list_, - OnRefreshTokenRevoked(account_id)); + for (auto& observer : observer_list_) + observer.OnRefreshTokenRevoked(account_id); } void OAuth2TokenServiceDelegate::FireRefreshTokensLoaded() { @@ -96,8 +98,8 @@ FROM_HERE_WITH_EXPLICIT_FUNCTION( "422460 OAuth2TokenService::FireRefreshTokensLoaded")); - FOR_EACH_OBSERVER(OAuth2TokenService::Observer, observer_list_, - OnRefreshTokensLoaded()); + for (auto& observer : observer_list_) + observer.OnRefreshTokensLoaded(); } net::URLRequestContextGetter* OAuth2TokenServiceDelegate::GetRequestContext()
diff --git a/gpu/command_buffer/build_gles2_cmd_buffer.py b/gpu/command_buffer/build_gles2_cmd_buffer.py index 5c070f1..21f8b656 100755 --- a/gpu/command_buffer/build_gles2_cmd_buffer.py +++ b/gpu/command_buffer/build_gles2_cmd_buffer.py
@@ -10948,7 +10948,6 @@ f.write(code % { 'name': ToUnderscore(name), }) - f.write("UpdateETCCompressedTextureFormats();"); f.write("}\n\n"); f.write("void Validators::UpdateETCCompressedTextureFormats() {\n") @@ -11022,12 +11021,6 @@ for es3_enum in _NAMED_TYPE_INFO[enum]['valid_es3']: if not es3_enum in valid_list: valid_list.append(es3_enum) - if enum in [ - 'CompressedTextureFormat', - 'TextureInternalFormatStorage', - ]: - for es3_enum in _ETC_COMPRESSED_TEXTURE_FORMATS: - valid_list.append(es3_enum) assert len(valid_list) == len(set(valid_list)) if len(valid_list) > 0: f.write(" static const EnumToString string_table[] = {\n")
diff --git a/gpu/command_buffer/common/gles2_cmd_utils_implementation_autogen.h b/gpu/command_buffer/common/gles2_cmd_utils_implementation_autogen.h index 3f0bf14..cdebc20 100644 --- a/gpu/command_buffer/common/gles2_cmd_utils_implementation_autogen.h +++ b/gpu/command_buffer/common/gles2_cmd_utils_implementation_autogen.h
@@ -3632,23 +3632,7 @@ } std::string GLES2Util::GetStringCompressedTextureFormat(uint32_t value) { - static const EnumToString string_table[] = { - {GL_COMPRESSED_R11_EAC, "GL_COMPRESSED_R11_EAC"}, - {GL_COMPRESSED_SIGNED_R11_EAC, "GL_COMPRESSED_SIGNED_R11_EAC"}, - {GL_COMPRESSED_RG11_EAC, "GL_COMPRESSED_RG11_EAC"}, - {GL_COMPRESSED_SIGNED_RG11_EAC, "GL_COMPRESSED_SIGNED_RG11_EAC"}, - {GL_COMPRESSED_RGB8_ETC2, "GL_COMPRESSED_RGB8_ETC2"}, - {GL_COMPRESSED_SRGB8_ETC2, "GL_COMPRESSED_SRGB8_ETC2"}, - {GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2, - "GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2"}, - {GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2, - "GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2"}, - {GL_COMPRESSED_RGBA8_ETC2_EAC, "GL_COMPRESSED_RGBA8_ETC2_EAC"}, - {GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC, - "GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC"}, - }; - return GLES2Util::GetQualifiedEnumString(string_table, - arraysize(string_table), value); + return GLES2Util::GetQualifiedEnumString(NULL, 0, value); } std::string GLES2Util::GetStringCoverageModulationComponents(uint32_t value) { @@ -4731,19 +4715,6 @@ {GL_DEPTH_COMPONENT32F, "GL_DEPTH_COMPONENT32F"}, {GL_DEPTH24_STENCIL8, "GL_DEPTH24_STENCIL8"}, {GL_DEPTH32F_STENCIL8, "GL_DEPTH32F_STENCIL8"}, - {GL_COMPRESSED_R11_EAC, "GL_COMPRESSED_R11_EAC"}, - {GL_COMPRESSED_SIGNED_R11_EAC, "GL_COMPRESSED_SIGNED_R11_EAC"}, - {GL_COMPRESSED_RG11_EAC, "GL_COMPRESSED_RG11_EAC"}, - {GL_COMPRESSED_SIGNED_RG11_EAC, "GL_COMPRESSED_SIGNED_RG11_EAC"}, - {GL_COMPRESSED_RGB8_ETC2, "GL_COMPRESSED_RGB8_ETC2"}, - {GL_COMPRESSED_SRGB8_ETC2, "GL_COMPRESSED_SRGB8_ETC2"}, - {GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2, - "GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2"}, - {GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2, - "GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2"}, - {GL_COMPRESSED_RGBA8_ETC2_EAC, "GL_COMPRESSED_RGBA8_ETC2_EAC"}, - {GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC, - "GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC"}, }; return GLES2Util::GetQualifiedEnumString(string_table, arraysize(string_table), value);
diff --git a/gpu/command_buffer/service/feature_info.cc b/gpu/command_buffer/service/feature_info.cc index 06ce1cef..0ad77686 100644 --- a/gpu/command_buffer/service/feature_info.cc +++ b/gpu/command_buffer/service/feature_info.cc
@@ -215,8 +215,6 @@ // Default context_type_ to a GLES2 Context. context_type_ = CONTEXT_TYPE_OPENGLES2; - chromium_color_buffer_float_rgba_available_ = false; - chromium_color_buffer_float_rgb_available_ = false; ext_color_buffer_float_available_ = false; oes_texture_float_linear_available_ = false; oes_texture_half_float_linear_available_ = false; @@ -300,7 +298,7 @@ } void FeatureInfo::EnableCHROMIUMColorBufferFloatRGBA() { - if (!chromium_color_buffer_float_rgba_available_) + if (!feature_flags_.chromium_color_buffer_float_rgba) return; validators_.texture_internal_format.AddValue(GL_RGBA32F); validators_.texture_sized_color_renderable_internal_format.AddValue( @@ -309,7 +307,7 @@ } void FeatureInfo::EnableCHROMIUMColorBufferFloatRGB() { - if (!chromium_color_buffer_float_rgb_available_) + if (!feature_flags_.chromium_color_buffer_float_rgb) return; validators_.texture_internal_format.AddValue(GL_RGB32F); validators_.texture_sized_color_renderable_internal_format.AddValue( @@ -651,7 +649,8 @@ // disable BGRA if we have to. bool has_apple_bgra = extensions.Contains("GL_APPLE_texture_format_BGRA8888"); bool has_ext_bgra = extensions.Contains("GL_EXT_texture_format_BGRA8888"); - bool has_bgra = has_ext_bgra || has_apple_bgra || !gl_version_info_->is_es; + bool enable_texture_format_bgra8888 = + has_ext_bgra || has_apple_bgra || !gl_version_info_->is_es; bool has_ext_texture_storage = extensions.Contains("GL_EXT_texture_storage"); bool has_arb_texture_storage = extensions.Contains("GL_ARB_texture_storage"); @@ -660,7 +659,6 @@ (has_ext_texture_storage || has_arb_texture_storage || gl_version_info_->is_es3 || gl_version_info_->IsAtLeastGL(4, 2)); - bool enable_texture_format_bgra8888 = has_bgra; bool enable_texture_storage = has_texture_storage; bool texture_storage_incompatible_with_bgra = @@ -895,12 +893,12 @@ DCHECK(glGetError() == GL_NO_ERROR); if (status_rgba == GL_FRAMEBUFFER_COMPLETE) { - chromium_color_buffer_float_rgba_available_ = true; + feature_flags_.chromium_color_buffer_float_rgba = true; if (!disallowed_features_.chromium_color_buffer_float_rgba) EnableCHROMIUMColorBufferFloatRGBA(); } if (status_rgb == GL_FRAMEBUFFER_COMPLETE) { - chromium_color_buffer_float_rgb_available_ = true; + feature_flags_.chromium_color_buffer_float_rgb = true; if (!disallowed_features_.chromium_color_buffer_float_rgb) EnableCHROMIUMColorBufferFloatRGB(); } @@ -1104,8 +1102,13 @@ feature_flags_.ext_texture_storage = true; AddExtensionString("GL_EXT_texture_storage"); validators_.texture_parameter.AddValue(GL_TEXTURE_IMMUTABLE_FORMAT_EXT); - if (enable_texture_format_bgra8888) - validators_.texture_internal_format_storage.AddValue(GL_BGRA8_EXT); + if (enable_texture_format_bgra8888) { + validators_.texture_internal_format_storage.AddValue(GL_BGRA8_EXT); + validators_.texture_sized_color_renderable_internal_format.AddValue( + GL_BGRA8_EXT); + validators_.texture_sized_texture_filterable_internal_format.AddValue( + GL_BGRA8_EXT); + } if (enable_texture_float) { validators_.texture_internal_format_storage.AddValue(GL_RGBA32F_EXT); validators_.texture_internal_format_storage.AddValue(GL_RGB32F_EXT); @@ -1477,6 +1480,14 @@ kTotalDrawBufferEnums - max_draw_buffers); } + if (feature_flags_.ext_texture_format_bgra8888) { + validators_.texture_internal_format.AddValue(GL_BGRA8_EXT); + validators_.texture_sized_color_renderable_internal_format.AddValue( + GL_BGRA8_EXT); + validators_.texture_sized_texture_filterable_internal_format.AddValue( + GL_BGRA8_EXT); + } + unsafe_es3_apis_enabled_ = true; }
diff --git a/gpu/command_buffer/service/feature_info.h b/gpu/command_buffer/service/feature_info.h index 57ac4f4..9038ca82 100644 --- a/gpu/command_buffer/service/feature_info.h +++ b/gpu/command_buffer/service/feature_info.h
@@ -92,6 +92,8 @@ bool ext_read_format_bgra; bool desktop_srgb_support; bool arb_es3_compatibility; + bool chromium_color_buffer_float_rgb = false; + bool chromium_color_buffer_float_rgba = false; }; FeatureInfo(); @@ -189,8 +191,6 @@ bool unsafe_es3_apis_enabled_; - bool chromium_color_buffer_float_rgba_available_; - bool chromium_color_buffer_float_rgb_available_; bool ext_color_buffer_float_available_; bool oes_texture_float_linear_available_; bool oes_texture_half_float_linear_available_;
diff --git a/gpu/command_buffer/service/framebuffer_manager_unittest.cc b/gpu/command_buffer/service/framebuffer_manager_unittest.cc index 1884200a..bb8e2fb 100644 --- a/gpu/command_buffer/service/framebuffer_manager_unittest.cc +++ b/gpu/command_buffer/service/framebuffer_manager_unittest.cc
@@ -135,14 +135,18 @@ protected: void SetUp() override { - InitializeContext("2.0", "GL_EXT_framebuffer_object"); + bool is_es3 = false; + if (context_type_ == CONTEXT_TYPE_WEBGL2 || + context_type_ == CONTEXT_TYPE_OPENGLES3) + is_es3 = true; + InitializeContext(is_es3 ? "3.0" : "2.0", "GL_EXT_framebuffer_object"); } void InitializeContext(const char* gl_version, const char* extensions) { GpuServiceTest::SetUpWithGLVersion(gl_version, extensions); TestHelper::SetupFeatureInfoInitExpectationsWithGLVersion(gl_.get(), extensions, "", gl_version, context_type_); - feature_info_->InitializeForTesting(); + feature_info_->InitializeForTesting(context_type_); decoder_.reset(new MockGLES2Decoder()); manager_.CreateFramebuffer(kClient1Id, kService1Id); error_state_.reset(new ::testing::StrictMock<gles2::MockErrorState>()); @@ -490,7 +494,7 @@ const GLsizei kWidth3 = 75; const GLsizei kHeight3 = 123; const GLint kLevel3 = 0; - const GLenum kFormat3 = GL_RGB565; + const GLenum kFormat3 = GL_RGBA; const GLsizei kSamples3 = 0; EXPECT_FALSE(framebuffer_->HasUnclearedAttachment(GL_COLOR_ATTACHMENT0)); EXPECT_FALSE(framebuffer_->HasUnclearedAttachment(GL_DEPTH_ATTACHMENT)); @@ -1278,11 +1282,10 @@ framebuffer_->ValidateAndAdjustDrawBuffers(0x310u, 0x330u)); } -class FramebufferInfoFloatTest : public FramebufferInfoTest { +class FramebufferInfoFloatTest : public FramebufferInfoTestBase { public: FramebufferInfoFloatTest() - : FramebufferInfoTest() { - } + : FramebufferInfoTestBase(CONTEXT_TYPE_OPENGLES2) {} ~FramebufferInfoFloatTest() override {} protected: @@ -1547,18 +1550,6 @@ void SetUp() override { InitializeContext("OpenGL ES 3.0", ""); } - - void InitializeContext(const char* gl_version, const char* extensions) { - GpuServiceTest::SetUpWithGLVersion(gl_version, extensions); - TestHelper::SetupFeatureInfoInitExpectationsWithGLVersion(gl_.get(), - extensions, "", gl_version, context_type_); - feature_info_->InitializeForTesting(CONTEXT_TYPE_OPENGLES3); - decoder_.reset(new MockGLES2Decoder()); - manager_.CreateFramebuffer(kClient1Id, kService1Id); - error_state_.reset(new ::testing::StrictMock<gles2::MockErrorState>()); - framebuffer_ = manager_.GetFramebuffer(kClient1Id); - ASSERT_TRUE(framebuffer_ != nullptr); - } }; TEST_F(FramebufferInfoES3Test, DifferentDimensions) {
diff --git a/gpu/command_buffer/service/gles2_cmd_apply_framebuffer_attachment_cmaa_intel.cc b/gpu/command_buffer/service/gles2_cmd_apply_framebuffer_attachment_cmaa_intel.cc index 8db5f43..58051d4 100644 --- a/gpu/command_buffer/service/gles2_cmd_apply_framebuffer_attachment_cmaa_intel.cc +++ b/gpu/command_buffer/service/gles2_cmd_apply_framebuffer_attachment_cmaa_intel.cc
@@ -41,11 +41,11 @@ edges1_texture_(0), mini4_edge_texture_(0), mini4_edge_depth_texture_(0), - edges1_shader_result_texture_float4_slot1_(0), - edges1_shader_result_texture_(0), - edges_combine_shader_result_texture_float4_slot1_(0), - process_and_apply_shader_result_texture_float4_slot1_(0), - edges_combine_shader_result_texture_slot2_(0) {} + edges0_shader_result_rgba_texture_slot1_(0), + edges0_shader_target_texture_slot2_(0), + edges1_shader_result_edge_texture_(0), + process_and_apply_shader_result_rgba_texture_slot1_(0), + edges_combine_shader_result_edge_texture_(0) {} ApplyFramebufferAttachmentCMAAINTELResourceManager:: ~ApplyFramebufferAttachmentCMAAINTELResourceManager() { @@ -173,16 +173,16 @@ process_and_apply_shader_ = CreateProgram(blur.str().c_str(), vert_str_, cmaa_frag_c_str); - edges1_shader_result_texture_float4_slot1_ = - glGetUniformLocation(edges0_shader_, "g_resultTextureFlt4Slot1"); - edges1_shader_result_texture_ = - glGetUniformLocation(edges1_shader_, "g_resultTexture"); - edges_combine_shader_result_texture_float4_slot1_ = - glGetUniformLocation(edges_combine_shader_, "g_resultTextureFlt4Slot1"); - edges_combine_shader_result_texture_slot2_ = - glGetUniformLocation(edges_combine_shader_, "g_resultTextureSlot2"); - process_and_apply_shader_result_texture_float4_slot1_ = glGetUniformLocation( - process_and_apply_shader_, "g_resultTextureFlt4Slot1"); + edges0_shader_result_rgba_texture_slot1_ = + glGetUniformLocation(edges0_shader_, "g_resultRGBATextureSlot1"); + edges0_shader_target_texture_slot2_ = + glGetUniformLocation(edges0_shader_, "g_targetTextureSlot2"); + edges1_shader_result_edge_texture_ = + glGetUniformLocation(edges1_shader_, "g_resultEdgeTexture"); + edges_combine_shader_result_edge_texture_ = + glGetUniformLocation(edges_combine_shader_, "g_resultEdgeTexture"); + process_and_apply_shader_result_rgba_texture_slot1_ = glGetUniformLocation( + process_and_apply_shader_, "g_resultRGBATextureSlot1"); initialized_ = true; } @@ -241,26 +241,17 @@ // Process using a GL_RGBA8 copy if this is not the case. bool do_copy = internal_format != GL_RGBA8; - // Copy source_texture to rgba8_texture_ - if (do_copy) { - glBindFramebufferEXT(GL_FRAMEBUFFER, copy_framebuffer_); - glFramebufferTexture2DEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, - GL_TEXTURE_2D, source_texture, 0); - CopyTexture(rgba8_texture_); - } - // CMAA Effect if (do_copy) { - ApplyCMAAEffectTexture(rgba8_texture_, rgba8_texture_); + ApplyCMAAEffectTexture(source_texture, rgba8_texture_, do_copy); } else { - ApplyCMAAEffectTexture(source_texture, source_texture); + ApplyCMAAEffectTexture(source_texture, source_texture, do_copy); } // Copy rgba8_texture_ to source_texture if (do_copy) { + // copy_framebuffer_ always binds rgba8_texture_ glBindFramebufferEXT(GL_FRAMEBUFFER, copy_framebuffer_); - glFramebufferTexture2DEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, - GL_TEXTURE_2D, rgba8_texture_, 0); CopyTexture(source_texture); } decoder->RestoreTextureState(source_texture); @@ -280,7 +271,8 @@ void ApplyFramebufferAttachmentCMAAINTELResourceManager::ApplyCMAAEffectTexture( GLuint source_texture, - GLuint dest_texture) { + GLuint dest_texture, + bool do_copy) { frame_id_++; GLuint edge_texture_a; @@ -326,7 +318,7 @@ // Outputs // gl_FragDepth mini4_edge_depth_texture_ fbo.depth // out uvec4 outEdges mini4_edge_texture_ fbo.col - // image2D g_resultTextureFlt4Slot1 working_color_texture_ image1 + // image2D g_resultRGBATextureSlot1 working_color_texture_ image1 GLenum edge_format = supports_r8_image_ ? GL_R8 : GL_R32F; { @@ -337,10 +329,18 @@ glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); if (!is_gles31_compatible_) { - glUniform1i(edges1_shader_result_texture_float4_slot1_, 1); + glUniform1i(edges0_shader_result_rgba_texture_slot1_, 1); + glUniform1i(edges0_shader_target_texture_slot2_, 2); } glBindImageTextureEXT(1, working_color_texture_, 0, GL_FALSE, 0, GL_WRITE_ONLY, GL_RGBA8); + if (do_copy) { + glUniform1i(2, GL_TRUE); + glBindImageTextureEXT(2, dest_texture, 0, GL_FALSE, 0, GL_WRITE_ONLY, + GL_RGBA8); + } else { + glUniform1i(2, GL_FALSE); + } glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, source_texture); @@ -357,7 +357,7 @@ // Inputs // g_src0Texture4Uint mini4_edge_texture_ tex1 // Outputs - // image2D g_resultTexture edge_texture_b image0 + // image2D g_resultEdgeTexture edge_texture_b image0 { glUseProgram(edges1_shader_); glUniform2f(0, 1.0f / width_, 1.0f / height_); @@ -366,7 +366,7 @@ glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); if (!is_gles31_compatible_) { - glUniform1i(edges1_shader_result_texture_, 0); + glUniform1i(edges1_shader_result_edge_texture_, 0); } glBindImageTextureEXT(0, edge_texture_b, 0, GL_FALSE, 0, GL_WRITE_ONLY, edge_format); @@ -390,7 +390,7 @@ // Inputs // g_src0TextureFlt edge_texture_b tex1 //ps // Outputs - // image2D g_resultTextureSlot2 edge_texture_a image2 + // image2D g_resultEdgeTexture edge_texture_a image2 // gl_FragDepth mini4_edge_texture_ fbo.depth { // Combine edges: each pixel will now contain info on all (top, right, @@ -403,9 +403,9 @@ glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); if (!is_gles31_compatible_) { - glUniform1i(edges_combine_shader_result_texture_slot2_, 2); + glUniform1i(edges_combine_shader_result_edge_texture_, 0); } - glBindImageTextureEXT(2, edge_texture_a, 0, GL_FALSE, 0, GL_WRITE_ONLY, + glBindImageTextureEXT(0, edge_texture_a, 0, GL_FALSE, 0, GL_WRITE_ONLY, edge_format); glActiveTexture(GL_TEXTURE1); @@ -429,7 +429,7 @@ // g_src0TextureFlt edge_texture_a tex1 //ps // sampled // Outputs - // g_resultTextureFlt4Slot1 dest_texture image1 + // g_resultRGBATextureSlot1 dest_texture image1 // gl_FragDepth mini4_edge_texture_ fbo.depth { glUseProgram(process_and_apply_shader_); @@ -439,7 +439,7 @@ glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); if (!is_gles31_compatible_) { - glUniform1i(process_and_apply_shader_result_texture_float4_slot1_, 1); + glUniform1i(process_and_apply_shader_result_rgba_texture_slot1_, 1); } glBindImageTextureEXT(1, dest_texture, 0, GL_FALSE, 0, GL_WRITE_ONLY, GL_RGBA8); @@ -477,6 +477,9 @@ glGenTextures(1, &rgba8_texture_); glBindTexture(GL_TEXTURE_2D, rgba8_texture_); glTexStorage2DEXT(GL_TEXTURE_2D, 1, GL_RGBA8, width, height); + glBindFramebufferEXT(GL_FRAMEBUFFER, copy_framebuffer_); + glFramebufferTexture2DEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, + rgba8_texture_, 0); // Edges texture - R8 // OpenGLES has no single component 8/16-bit image support, so needs to be R32 @@ -680,6 +683,9 @@ \n#ifndef EDGE_DETECT_THRESHOLD\n layout(location = 1) uniform float g_ColorThreshold; \n#endif\n + \n#ifdef DETECT_EDGES1\n + layout(location = 2) uniform int g_DoCopy; + \n#endif\n \n#ifdef SUPPORTS_USAMPLER2D\n \n#define USAMPLER usampler2D\n @@ -704,18 +710,18 @@ // bind to image stage 0/1/2 \n#ifdef GL_ES\n layout(binding = 0, EDGE_READ_FORMAT) restrict writeonly uniform highp - image2D g_resultTexture; + image2D g_resultEdgeTexture; layout(binding = 1, rgba8) restrict writeonly uniform highp - image2D g_resultTextureFlt4Slot1; - layout(binding = 2, EDGE_READ_FORMAT) restrict writeonly uniform highp - image2D g_resultTextureSlot2; + image2D g_resultRGBATextureSlot1; + layout(binding = 2, rgba8) restrict writeonly uniform highp + image2D g_targetTextureSlot2; \n#else\n layout(EDGE_READ_FORMAT) restrict writeonly uniform highp - image2D g_resultTexture; + image2D g_resultEdgeTexture; layout(rgba8) restrict writeonly uniform highp - image2D g_resultTextureFlt4Slot1; - layout(EDGE_READ_FORMAT) restrict writeonly uniform highp - image2D g_resultTextureSlot2; + image2D g_resultRGBATextureSlot1; + layout(rgba8) restrict writeonly uniform highp + image2D g_targetTextureSlot2; \n#endif\n // Constants @@ -974,7 +980,7 @@ float(pixelPos.y) + 0.5); \n#ifdef DEBUG_OUTPUT_AAINFO\n - imageStore(g_resultTextureSlot2, pixelPos, + imageStore(g_resultEdgeTexture, pixelPos, PackBlurAAInfo(pixelPos, 1u)); \n#endif\n @@ -991,7 +997,7 @@ \n#ifdef IN_GAMMA_CORRECT_MODE\n color.rgb = D3DX_FLOAT3_to_SRGB(color.rgb); \n#endif\n - imageStore(g_resultTextureFlt4Slot1, pixelPos, color); + imageStore(g_resultRGBATextureSlot1, pixelPos, color); } } @@ -1051,6 +1057,13 @@ vec4 pixel12 = texelFetchOffset(g_screenTexture, screenPosI.xy, 0, ivec2(1, 2)); + if (g_DoCopy == 1) { + imageStore(g_targetTextureSlot2, screenPosI.xy + ivec2(0, 0), pixel00); + imageStore(g_targetTextureSlot2, screenPosI.xy + ivec2(1, 0), pixel10); + imageStore(g_targetTextureSlot2, screenPosI.xy + ivec2(0, 1), pixel01); + imageStore(g_targetTextureSlot2, screenPosI.xy + ivec2(1, 1), pixel11); + } + float storeFlagPixel00 = 0.0; float storeFlagPixel10 = 0.0; float storeFlagPixel20 = 0.0; @@ -1124,28 +1137,28 @@ if (gl_FragDepth != 0.0) { if (storeFlagPixel00 != 0.0) - imageStore(g_resultTextureFlt4Slot1, screenPosI.xy + ivec2(0, 0), + imageStore(g_resultRGBATextureSlot1, screenPosI.xy + ivec2(0, 0), pixel00); if (storeFlagPixel10 != 0.0) - imageStore(g_resultTextureFlt4Slot1, screenPosI.xy + ivec2(1, 0), + imageStore(g_resultRGBATextureSlot1, screenPosI.xy + ivec2(1, 0), pixel10); if (storeFlagPixel20 != 0.0) - imageStore(g_resultTextureFlt4Slot1, screenPosI.xy + ivec2(2, 0), + imageStore(g_resultRGBATextureSlot1, screenPosI.xy + ivec2(2, 0), pixel20); if (storeFlagPixel01 != 0.0) - imageStore(g_resultTextureFlt4Slot1, screenPosI.xy + ivec2(0, 1), + imageStore(g_resultRGBATextureSlot1, screenPosI.xy + ivec2(0, 1), pixel01); if (storeFlagPixel02 != 0.0) - imageStore(g_resultTextureFlt4Slot1, screenPosI.xy + ivec2(0, 2), + imageStore(g_resultRGBATextureSlot1, screenPosI.xy + ivec2(0, 2), pixel02); if (storeFlagPixel11 != 0.0) - imageStore(g_resultTextureFlt4Slot1, screenPosI.xy + ivec2(1, 1), + imageStore(g_resultRGBATextureSlot1, screenPosI.xy + ivec2(1, 1), pixel11); if (storeFlagPixel21 != 0.0) - imageStore(g_resultTextureFlt4Slot1, screenPosI.xy + ivec2(2, 1), + imageStore(g_resultRGBATextureSlot1, screenPosI.xy + ivec2(2, 1), pixel21); if (storeFlagPixel12 != 0.0) - imageStore(g_resultTextureFlt4Slot1, screenPosI.xy + ivec2(1, 2), + imageStore(g_resultRGBATextureSlot1, screenPosI.xy + ivec2(1, 2), pixel12); } outEdges = STORE_UVEC4(outputEdges); @@ -1250,7 +1263,7 @@ CollectEdges(2, 2, edges, packedVals); uint pe = PackEdge(PruneNonDominantEdges(edges)); if (pe != 0u) { - imageStore(g_resultTexture, 2 * screenPosI.xy + ivec2(0, 0), + imageStore(g_resultEdgeTexture, 2 * screenPosI.xy + ivec2(0, 0), vec4(float(0x80u | pe) / 255.0, 0, 0, 0)); } } @@ -1279,7 +1292,7 @@ // Note: texelFetch() on out of range gives an undefined value. uint pe = PackEdge(dominant_edges * uvec4(notTopRight.x, 1, 1, 1)); if (pe != 0u) { - imageStore(g_resultTexture, 2 * screenPosI.xy + ivec2(1, 0), + imageStore(g_resultEdgeTexture, 2 * screenPosI.xy + ivec2(1, 0), vec4(float(0x80u | pe) / 255.0, 0, 0, 0)); } } @@ -1306,7 +1319,7 @@ uvec4 dominant_edges = PruneNonDominantEdges(edges); uint pe = PackEdge(dominant_edges * uvec4(1, notTopRight.y, 1, 1)); if (pe != 0u) { - imageStore(g_resultTexture, 2 * screenPosI.xy + ivec2(0, 1), + imageStore(g_resultEdgeTexture, 2 * screenPosI.xy + ivec2(0, 1), vec4(float(0x80u | pe) / 255.0, 0, 0, 0)); } } @@ -1316,7 +1329,7 @@ uvec4 dominant_edges = PruneNonDominantEdges(edges); uint pe = PackEdge(dominant_edges * uvec4(notTopRight, 1, 1)); if (pe != 0u) { - imageStore(g_resultTexture, 2 * screenPosI.xy + ivec2(1, 1), + imageStore(g_resultEdgeTexture, 2 * screenPosI.xy + ivec2(1, 1), vec4(float(0x80u | pe) / 255.0, 0, 0, 0)); } } @@ -1374,13 +1387,13 @@ pixelsC | ((pixelsL & 0x01u) << 2u) | ((pixelsU & 0x02u) << 2u); vec4 outEdge4Flt = vec4(outEdge4) / 255.0; - imageStore(g_resultTextureSlot2, screenPosIBase.xy + ivec2(0, 0), + imageStore(g_resultEdgeTexture, screenPosIBase.xy + ivec2(0, 0), outEdge4Flt.xxxx); - imageStore(g_resultTextureSlot2, screenPosIBase.xy + ivec2(1, 0), + imageStore(g_resultEdgeTexture, screenPosIBase.xy + ivec2(1, 0), outEdge4Flt.yyyy); - imageStore(g_resultTextureSlot2, screenPosIBase.xy + ivec2(0, 1), + imageStore(g_resultEdgeTexture, screenPosIBase.xy + ivec2(0, 1), outEdge4Flt.zzzz); - imageStore(g_resultTextureSlot2, screenPosIBase.xy + ivec2(1, 1), + imageStore(g_resultEdgeTexture, screenPosIBase.xy + ivec2(1, 1), outEdge4Flt.wwww); // uvec4 numberOfEdges4 = uvec4(bitCount(outEdge4)); @@ -1634,10 +1647,10 @@ \n#endif\n \n#ifdef DEBUG_OUTPUT_AAINFO\n - imageStore(g_resultTextureSlot2, screenPosI.xy, + imageStore(g_resultEdgeTexture, screenPosI.xy, PackBlurAAInfo(screenPosI.xy, numberOfEdges)); \n#endif\n - imageStore(g_resultTextureFlt4Slot1, screenPosI.xy, color); + imageStore(g_resultRGBATextureSlot1, screenPosI.xy, color); if (numberOfEdges == 2u) { uint packedEdgesL = packedEdgesArray[(0 + _x) * 4 + (1 + _y)];
diff --git a/gpu/command_buffer/service/gles2_cmd_apply_framebuffer_attachment_cmaa_intel.h b/gpu/command_buffer/service/gles2_cmd_apply_framebuffer_attachment_cmaa_intel.h index 33e787dab..855e1e6 100644 --- a/gpu/command_buffer/service/gles2_cmd_apply_framebuffer_attachment_cmaa_intel.h +++ b/gpu/command_buffer/service/gles2_cmd_apply_framebuffer_attachment_cmaa_intel.h
@@ -39,7 +39,9 @@ private: // Applies the CMAA algorithm to a texture. - void ApplyCMAAEffectTexture(GLuint source_texture, GLuint dest_texture); + void ApplyCMAAEffectTexture(GLuint source_texture, + GLuint dest_texture, + bool do_copy); void OnSize(GLint width, GLint height); void ReleaseTextures(); @@ -79,11 +81,11 @@ GLuint mini4_edge_texture_; GLuint mini4_edge_depth_texture_; - GLuint edges1_shader_result_texture_float4_slot1_; - GLuint edges1_shader_result_texture_; - GLuint edges_combine_shader_result_texture_float4_slot1_; - GLuint process_and_apply_shader_result_texture_float4_slot1_; - GLuint edges_combine_shader_result_texture_slot2_; + GLuint edges0_shader_result_rgba_texture_slot1_; + GLuint edges0_shader_target_texture_slot2_; + GLuint edges1_shader_result_edge_texture_; + GLuint process_and_apply_shader_result_rgba_texture_slot1_; + GLuint edges_combine_shader_result_edge_texture_; static const char vert_str_[]; static const char cmaa_frag_s1_[];
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc index 33e87e3..62724d4a 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder.cc +++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc
@@ -3817,6 +3817,8 @@ driver_bug_workarounds |= SH_REWRITE_DO_WHILE_LOOPS; if (workarounds().emulate_isnan_on_float) driver_bug_workarounds |= SH_EMULATE_ISNAN_FLOAT_FUNCTION; + if (workarounds().use_unused_standard_shared_blocks) + driver_bug_workarounds |= SH_USE_UNUSED_STANDARD_SHARED_BLOCKS; resources.WEBGL_debug_shader_precision = group_->gpu_preferences().emulate_shader_precision; @@ -16407,22 +16409,18 @@ GLsizei level_width = width; GLsizei level_height = height; GLsizei level_depth = depth; - GLenum adjusted_format = - feature_info_->IsES3Enabled() ? internal_format : format; for (int ii = 0; ii < levels; ++ii) { if (target == GL_TEXTURE_CUBE_MAP) { for (int jj = 0; jj < 6; ++jj) { GLenum face = GL_TEXTURE_CUBE_MAP_POSITIVE_X + jj; - texture_manager()->SetLevelInfo(texture_ref, face, ii, - adjusted_format, - level_width, level_height, 1, - 0, format, type, gfx::Rect()); + texture_manager()->SetLevelInfo( + texture_ref, face, ii, internal_format, level_width, level_height, + 1, 0, format, type, gfx::Rect()); } } else { - texture_manager()->SetLevelInfo(texture_ref, target, ii, - adjusted_format, - level_width, level_height, level_depth, - 0, format, type, gfx::Rect()); + texture_manager()->SetLevelInfo( + texture_ref, target, ii, internal_format, level_width, level_height, + level_depth, 0, format, type, gfx::Rect()); } level_width = std::max(1, level_width >> 1); level_height = std::max(1, level_height >> 1);
diff --git a/gpu/command_buffer/service/gles2_cmd_srgb_converter.cc b/gpu/command_buffer/service/gles2_cmd_srgb_converter.cc index 5ffbb47d..8300d61 100644 --- a/gpu/command_buffer/service/gles2_cmd_srgb_converter.cc +++ b/gpu/command_buffer/service/gles2_cmd_srgb_converter.cc
@@ -198,6 +198,10 @@ // If we need to blit from linear to srgb or vice versa, some steps will be // skipped. DCHECK(srgb_converter_initialized_); + // Use RGBA32F as the temp texture's internalformat to prevent precision + // loss during srgb conversion. But it is not color-renderable and + // texture-filterable in ES context. + DCHECK(!feature_info_->gl_version_info().is_es); // Set the states glActiveTexture(GL_TEXTURE0); @@ -239,7 +243,7 @@ glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0); glBindTexture(GL_TEXTURE_2D, srgb_converter_textures_[1]); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, c.width(), c.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr); glBindFramebufferEXT(GL_FRAMEBUFFER, srgb_decoder_fbo_); @@ -272,7 +276,7 @@ height_draw = dstY1 > dstY0 ? dstY1 - dstY0 : dstY0 - dstY1; glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0); glTexImage2D( - GL_TEXTURE_2D, 0, decode ? GL_RGBA : src_framebuffer_internal_format, + GL_TEXTURE_2D, 0, decode ? GL_RGBA32F : src_framebuffer_internal_format, width_draw, height_draw, 0, decode ? GL_RGBA : src_framebuffer_format, decode ? GL_UNSIGNED_BYTE : src_framebuffer_type,
diff --git a/gpu/command_buffer/service/gles2_cmd_validation_implementation_autogen.h b/gpu/command_buffer/service/gles2_cmd_validation_implementation_autogen.h index 2d0b597..632eaeed 100644 --- a/gpu/command_buffer/service/gles2_cmd_validation_implementation_autogen.h +++ b/gpu/command_buffer/service/gles2_cmd_validation_implementation_autogen.h
@@ -1502,7 +1502,6 @@ arraysize(valid_vertex_attrib_type_table_es3)); vertex_attribute.AddValues(valid_vertex_attribute_table_es3, arraysize(valid_vertex_attribute_table_es3)); - UpdateETCCompressedTextureFormats(); } void Validators::UpdateETCCompressedTextureFormats() {
diff --git a/gpu/command_buffer/service/shader_translator.cc b/gpu/command_buffer/service/shader_translator.cc index d24a90d..60b6d63 100644 --- a/gpu/command_buffer/service/shader_translator.cc +++ b/gpu/command_buffer/service/shader_translator.cc
@@ -276,9 +276,8 @@ } ShaderTranslator::~ShaderTranslator() { - FOR_EACH_OBSERVER(DestructionObserver, - destruction_observers_, - OnDestruct(this)); + for (auto& observer : destruction_observers_) + observer.OnDestruct(this); if (compiler_ != NULL) ShDestruct(compiler_);
diff --git a/gpu/command_buffer/service/texture_manager.cc b/gpu/command_buffer/service/texture_manager.cc index 0ab416a..24fbaf6 100644 --- a/gpu/command_buffer/service/texture_manager.cc +++ b/gpu/command_buffer/service/texture_manager.cc
@@ -231,6 +231,8 @@ {GL_DEPTH24_STENCIL8, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8}, {GL_DEPTH32F_STENCIL8, GL_DEPTH_STENCIL, GL_FLOAT_32_UNSIGNED_INT_24_8_REV}, + // Exposed by GL_APPLE_texture_format_BGRA8888 + {GL_BGRA8_EXT, GL_BGRA_EXT, GL_UNSIGNED_BYTE}, }; for (size_t ii = 0; ii < arraysize(kSupportedFormatTypes); ++ii) { @@ -308,6 +310,24 @@ } } +bool SizedFormatAvailable(const FeatureInfo* feature_info, + bool immutable, + GLenum internal_format) { + if (immutable) + return true; + + // TODO(dshwang): check if it's possible to remove + // CHROMIUM_color_buffer_float_rgb. crbug.com/329605 + if ((feature_info->feature_flags().chromium_color_buffer_float_rgb && + internal_format == GL_RGB32F) || + (feature_info->feature_flags().chromium_color_buffer_float_rgba && + internal_format == GL_RGBA32F)) { + return true; + } + + return feature_info->IsES3Enabled(); +} + // A 32-bit and 64-bit compatible way of converting a pointer to a GLuint. GLuint ToGLuint(const void* ptr) { return static_cast<GLuint>(reinterpret_cast<size_t>(ptr)); @@ -601,9 +621,8 @@ // TODO(zmo): The assumption that compressed textures are all filterable // may not be true in the future. } else { - if (!Texture::TextureFilterable(feature_info, - first_level.internal_format, - first_level.type)) { + if (!Texture::TextureFilterable(feature_info, first_level.internal_format, + first_level.type, immutable_)) { return false; } } @@ -729,9 +748,10 @@ return false; } - if (!Texture::ColorRenderable(feature_info, base.internal_format) || - !Texture::TextureFilterable( - feature_info, base.internal_format, base.type)) { + if (!Texture::ColorRenderable(feature_info, base.internal_format, + immutable_) || + !Texture::TextureFilterable(feature_info, base.internal_format, base.type, + immutable_)) { return false; } @@ -808,19 +828,24 @@ // static bool Texture::ColorRenderable(const FeatureInfo* feature_info, - GLenum internal_format) { + GLenum internal_format, + bool immutable) { if (feature_info->validators()->texture_unsized_internal_format.IsValid( internal_format)) { return true; } - return feature_info->validators()-> - texture_sized_color_renderable_internal_format.IsValid(internal_format); + + return SizedFormatAvailable(feature_info, immutable, internal_format) && + feature_info->validators() + ->texture_sized_color_renderable_internal_format.IsValid( + internal_format); } // static bool Texture::TextureFilterable(const FeatureInfo* feature_info, GLenum internal_format, - GLenum type) { + GLenum type, + bool immutable) { if (feature_info->validators()->texture_unsized_internal_format.IsValid( internal_format)) { switch (type) { @@ -833,8 +858,10 @@ return true; } } - return feature_info->validators()-> - texture_sized_texture_filterable_internal_format.IsValid(internal_format); + return SizedFormatAvailable(feature_info, immutable, internal_format) && + feature_info->validators() + ->texture_sized_texture_filterable_internal_format.IsValid( + internal_format); } void Texture::SetLevelClearedRect(GLenum target, @@ -1711,15 +1738,15 @@ level < static_cast<GLint>(face_infos_[0].level_infos.size())); GLenum internal_format = face_infos_[0].level_infos[level].internal_format; bool color_renderable = - ((feature_info->validators()->texture_unsized_internal_format. - IsValid(internal_format) && - internal_format != GL_ALPHA && - internal_format != GL_LUMINANCE && + ((feature_info->validators()->texture_unsized_internal_format.IsValid( + internal_format) && + internal_format != GL_ALPHA && internal_format != GL_LUMINANCE && internal_format != GL_LUMINANCE_ALPHA && internal_format != GL_SRGB_EXT) || - feature_info->validators()-> - texture_sized_color_renderable_internal_format.IsValid( - internal_format)); + (SizedFormatAvailable(feature_info, immutable_, internal_format) && + feature_info->validators() + ->texture_sized_color_renderable_internal_format.IsValid( + internal_format))); bool depth_renderable = feature_info->validators()-> texture_depth_renderable_internal_format.IsValid(internal_format); bool stencil_renderable = feature_info->validators()-> @@ -2545,6 +2572,39 @@ } } + if (args.command_type == DoTexImageArguments::kTexImage3D && + texture_state->unpack_image_height_workaround_with_unpack_buffer && + buffer) { + ContextState::Dimension dimension = ContextState::k3D; + const PixelStoreParams unpack_params(state->GetUnpackParams(dimension)); + if (unpack_params.image_height != 0 && + unpack_params.image_height != args.height) { + ReserveTexImageToBeFilled(texture_state, state, framebuffer_state, + function_name, texture_ref, args); + + DoTexSubImageArguments sub_args = { + args.target, + args.level, + 0, + 0, + 0, + args.width, + args.height, + args.depth, + args.format, + args.type, + args.pixels, + args.pixels_size, + args.padding, + DoTexSubImageArguments::kTexSubImage3D}; + DoTexSubImageLayerByLayerWorkaround(texture_state, state, sub_args, + unpack_params); + + SetLevelCleared(texture_ref, args.target, args.level, true); + return; + } + } + if (texture_state->unpack_alignment_workaround_with_unpack_buffer && buffer) { uint32_t buffer_size = static_cast<uint32_t>(buffer->size()); if (buffer_size - args.pixels_size - ToGLuint(args.pixels) < args.padding) { @@ -2753,6 +2813,19 @@ } } + if (args.command_type == DoTexSubImageArguments::kTexSubImage3D && + texture_state->unpack_image_height_workaround_with_unpack_buffer && + buffer) { + ContextState::Dimension dimension = ContextState::k3D; + const PixelStoreParams unpack_params(state->GetUnpackParams(dimension)); + if (unpack_params.image_height != 0 && + unpack_params.image_height != args.height) { + DoTexSubImageLayerByLayerWorkaround(texture_state, state, args, + unpack_params); + return; + } + } + if (texture_state->unpack_alignment_workaround_with_unpack_buffer && buffer) { uint32_t buffer_size = static_cast<uint32_t>(buffer->size()); if (buffer_size - args.pixels_size - ToGLuint(args.pixels) < args.padding) { @@ -2962,6 +3035,51 @@ glPixelStorei(GL_UNPACK_ROW_LENGTH, unpack_params.row_length); } +void TextureManager::DoTexSubImageLayerByLayerWorkaround( + DecoderTextureState* texture_state, + ContextState* state, + const DoTexSubImageArguments& args, + const PixelStoreParams& unpack_params) { + glPixelStorei(GL_UNPACK_IMAGE_HEIGHT, 0); + + GLenum format = AdjustTexFormat(feature_info_.get(), args.format); + + GLsizei row_length = + unpack_params.row_length ? unpack_params.row_length : args.width; + GLsizei row_bytes = + row_length * GLES2Util::ComputeImageGroupSize(format, args.type); + GLsizei alignment_diff = row_bytes % unpack_params.alignment; + if (alignment_diff != 0) { + row_bytes += unpack_params.alignment - alignment_diff; + } + DCHECK_EQ(0, row_bytes % unpack_params.alignment); + + // process the texture layer by layer + GLsizei image_height = unpack_params.image_height; + GLsizei image_bytes = row_bytes * image_height; + const GLubyte* image_pixels = reinterpret_cast<const GLubyte*>(args.pixels); + for (GLsizei image = 0; image < args.depth - 1; ++image) { + glTexSubImage3D(args.target, args.level, args.xoffset, args.yoffset, + image + args.zoffset, args.width, args.height, 1, format, + args.type, image_pixels); + + image_pixels += image_bytes; + } + + // Process the last image row by row + glPixelStorei(GL_UNPACK_ALIGNMENT, 1); + const GLubyte* row_pixels = image_pixels; + for (GLsizei row = 0; row < args.height; ++row) { + glTexSubImage3D(args.target, args.level, args.xoffset, row + args.yoffset, + args.depth - 1 + args.zoffset, args.width, 1, 1, format, + args.type, row_pixels); + row_pixels += row_bytes; + } + // Restore unpack state + glPixelStorei(GL_UNPACK_ALIGNMENT, unpack_params.alignment); + glPixelStorei(GL_UNPACK_IMAGE_HEIGHT, unpack_params.image_height); +} + // static GLenum TextureManager::AdjustTexInternalFormat( const gles2::FeatureInfo* feature_info,
diff --git a/gpu/command_buffer/service/texture_manager.h b/gpu/command_buffer/service/texture_manager.h index f2097c9..11c8b63 100644 --- a/gpu/command_buffer/service/texture_manager.h +++ b/gpu/command_buffer/service/texture_manager.h
@@ -500,11 +500,13 @@ GLenum type); static bool ColorRenderable(const FeatureInfo* feature_info, - GLenum internal_format); + GLenum internal_format, + bool immutable); static bool TextureFilterable(const FeatureInfo* feature_info, GLenum internal_format, - GLenum type); + GLenum type, + bool immutable); // Sets the Texture's target // Parameters: @@ -708,7 +710,9 @@ unpack_alignment_workaround_with_unpack_buffer( workarounds.unpack_alignment_workaround_with_unpack_buffer), unpack_overlapping_rows_separately_unpack_buffer( - workarounds.unpack_overlapping_rows_separately_unpack_buffer) {} + workarounds.unpack_overlapping_rows_separately_unpack_buffer), + unpack_image_height_workaround_with_unpack_buffer( + workarounds.unpack_image_height_workaround_with_unpack_buffer) {} // This indicates all the following texSubImage*D calls that are part of the // failed texImage*D call should be ignored. The client calls have a lock @@ -725,6 +729,7 @@ bool force_cube_complete; bool unpack_alignment_workaround_with_unpack_buffer; bool unpack_overlapping_rows_separately_unpack_buffer; + bool unpack_image_height_workaround_with_unpack_buffer; }; // This class keeps track of the textures and their sizes so we can do NPOT and @@ -1170,6 +1175,12 @@ const DoTexSubImageArguments& args, const PixelStoreParams& unpack_params); + void DoTexSubImageLayerByLayerWorkaround( + DecoderTextureState* texture_state, + ContextState* state, + const DoTexSubImageArguments& args, + const PixelStoreParams& unpack_params); + void DoCubeMapWorkaround( DecoderTextureState* texture_state, ContextState* state,
diff --git a/gpu/command_buffer/tests/gl_texture_storage_unittest.cc b/gpu/command_buffer/tests/gl_texture_storage_unittest.cc index f5d9a61..7803bfb 100644 --- a/gpu/command_buffer/tests/gl_texture_storage_unittest.cc +++ b/gpu/command_buffer/tests/gl_texture_storage_unittest.cc
@@ -156,6 +156,17 @@ EXPECT_EQ(static_cast<GLenum>(GL_INVALID_OPERATION), glGetError()); } +TEST_F(TextureStorageTest, InternalFormatBleedingToTexImage) { + if (!extension_available_) + return; + + EXPECT_EQ(static_cast<GLenum>(GL_NO_ERROR), glGetError()); + // The context is ES2 context. + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8_OES, 4, 4, 0, GL_RGBA, + GL_UNSIGNED_BYTE, nullptr); + EXPECT_EQ(static_cast<GLenum>(GL_INVALID_VALUE), glGetError()); +} + } // namespace gpu
diff --git a/gpu/config/gpu_blacklist_unittest.cc b/gpu/config/gpu_blacklist_unittest.cc index 8144b76..420a4fb 100644 --- a/gpu/config/gpu_blacklist_unittest.cc +++ b/gpu/config/gpu_blacklist_unittest.cc
@@ -81,6 +81,13 @@ kSoftwareRenderingListJson, GpuBlacklist::kAllOs)); } +TEST_F(GpuBlacklistTest, DuplicatedIDValidation) { + std::unique_ptr<GpuBlacklist> blacklist(GpuBlacklist::Create()); + EXPECT_TRUE(blacklist->LoadList( + kSoftwareRenderingListJson, GpuBlacklist::kAllOs)); + EXPECT_FALSE(blacklist->has_duplicated_entry_id()); +} + #define GPU_BLACKLIST_FEATURE_TEST(test_name, feature_name, feature_type) \ TEST_F(GpuBlacklistTest, test_name) { \ RunFeatureTest(feature_name, feature_type); \
diff --git a/gpu/config/gpu_control_list.cc b/gpu/config/gpu_control_list.cc index 98d5409a2..a2406e32 100644 --- a/gpu/config/gpu_control_list.cc +++ b/gpu/config/gpu_control_list.cc
@@ -1580,6 +1580,17 @@ return entries_.size(); } +bool GpuControlList::has_duplicated_entry_id() const { + std::set<int> ids; + for (size_t i = 0; i < entries_.size(); ++i) { + if (ids.count(entries_[i]->id()) == 0) + ids.insert(entries_[i]->id()); + else + return true; + } + return false; +} + uint32_t GpuControlList::max_entry_id() const { return max_entry_id_; }
diff --git a/gpu/config/gpu_control_list.h b/gpu/config/gpu_control_list.h index 8fc373f..944d3f5 100644 --- a/gpu/config/gpu_control_list.h +++ b/gpu/config/gpu_control_list.h
@@ -91,6 +91,9 @@ // Returns the number of entries. This is only for tests. size_t num_entries() const; + // This is only for tests. + bool has_duplicated_entry_id() const; + // Register a feature to FeatureMap - used to construct a GpuControlList. void AddSupportedFeature(const std::string& feature_name, int feature_id); // Register whether "all" is recognized as all features.
diff --git a/gpu/config/gpu_driver_bug_list_json.cc b/gpu/config/gpu_driver_bug_list_json.cc index 944c0d9e..0b50ec2 100644 --- a/gpu/config/gpu_driver_bug_list_json.cc +++ b/gpu/config/gpu_driver_bug_list_json.cc
@@ -19,7 +19,7 @@ { "name": "gpu driver bug list", // Please update the version number whenever you change this file. - "version": "9.08", + "version": "9.10", "entries": [ { "id": 1, @@ -2099,6 +2099,29 @@ "features": [ "init_two_cube_map_levels_before_copyteximage" ] + }, + { + "id": 195, + "description": "Insert statements to reference all members in unused std140/shared blocks on Mac", + "cr_bugs": [618464], + "os": { + "type": "macosx" + }, + "features": [ + "use_unused_standard_shared_blocks" + ] + }, + { + "id": 196, + "description": "Tex(Sub)Image3D performs incorrectly when uploading from unpack buffer with GL_UNPACK_IMAGE_HEIGHT greater than zero on Intel Macs", + "cr_bugs": [654258], + "os": { + "type": "macosx" + }, + "vendor_id": "0x8086", + "features": [ + "unpack_image_height_workaround_with_unpack_buffer" + ] } ] // Please update the version number at beginning of this file whenever you
diff --git a/gpu/config/gpu_driver_bug_list_unittest.cc b/gpu/config/gpu_driver_bug_list_unittest.cc index 09612d2..03bf5a3e 100644 --- a/gpu/config/gpu_driver_bug_list_unittest.cc +++ b/gpu/config/gpu_driver_bug_list_unittest.cc
@@ -207,5 +207,11 @@ EXPECT_EQ(0u, bugs.count(DISABLE_D3D11)); } +TEST_F(GpuDriverBugListTest, DuplicatedBugIDValidation) { + std::unique_ptr<GpuDriverBugList> list(GpuDriverBugList::Create()); + EXPECT_TRUE(list->LoadList(kGpuDriverBugListJson, GpuControlList::kAllOs)); + EXPECT_FALSE(list->has_duplicated_entry_id()); +} + } // namespace gpu
diff --git a/gpu/config/gpu_driver_bug_workaround_type.h b/gpu/config/gpu_driver_bug_workaround_type.h index f5f6bca..adffab4 100644 --- a/gpu/config/gpu_driver_bug_workaround_type.h +++ b/gpu/config/gpu_driver_bug_workaround_type.h
@@ -171,6 +171,8 @@ unfold_short_circuit_as_ternary_operation) \ GPU_OP(UNPACK_ALIGNMENT_WORKAROUND_WITH_UNPACK_BUFFER, \ unpack_alignment_workaround_with_unpack_buffer) \ + GPU_OP(UNPACK_IMAGE_HEIGHT_WORKAROUND_WITH_UNPACK_BUFFER, \ + unpack_image_height_workaround_with_unpack_buffer) \ GPU_OP(UNPACK_OVERLAPPING_ROWS_SEPARATELY_UNPACK_BUFFER, \ unpack_overlapping_rows_separately_unpack_buffer) \ GPU_OP(USE_CLIENT_SIDE_ARRAYS_FOR_STREAM_BUFFERS, \ @@ -181,6 +183,8 @@ use_non_zero_size_for_client_side_stream_buffers) \ GPU_OP(USE_SHADOWED_TEX_LEVEL_PARAMS, \ use_shadowed_tex_level_params) \ + GPU_OP(USE_UNUSED_STANDARD_SHARED_BLOCKS, \ + use_unused_standard_shared_blocks) \ GPU_OP(USE_VIRTUALIZED_GL_CONTEXTS, \ use_virtualized_gl_contexts) \ GPU_OP(VALIDATE_MULTISAMPLE_BUFFER_ALLOCATION, \
diff --git a/gpu/config/software_rendering_list_json.cc b/gpu/config/software_rendering_list_json.cc index 7c61694..86f081ef0 100644 --- a/gpu/config/software_rendering_list_json.cc +++ b/gpu/config/software_rendering_list_json.cc
@@ -18,7 +18,7 @@ { "name": "software rendering list", // Please update the version number whenever you change this file. - "version": "11.16", + "version": "11.17", "entries": [ { "id": 1, @@ -691,6 +691,17 @@ ] }, { + "id": 82, + "description": "MediaCodec is still too buggy to use for encoding (b/11536167)", + "cr_bugs": [615108], + "os": { + "type": "android" + }, + "features": [ + "accelerated_video_encode" + ] + }, + { "id": 86, "description": "Intel Graphics Media Accelerator 3150 causes the GPU process to hang running WebGL", "cr_bugs": [305431],
diff --git a/gpu/ipc/client/command_buffer_proxy_impl.cc b/gpu/ipc/client/command_buffer_proxy_impl.cc index 0ce0b8d..2ea77b34f 100644 --- a/gpu/ipc/client/command_buffer_proxy_impl.cc +++ b/gpu/ipc/client/command_buffer_proxy_impl.cc
@@ -100,7 +100,8 @@ } CommandBufferProxyImpl::~CommandBufferProxyImpl() { - FOR_EACH_OBSERVER(DeletionObserver, deletion_observers_, OnWillDeleteImpl()); + for (auto& observer : deletion_observers_) + observer.OnWillDeleteImpl(); DisconnectChannel(); }
diff --git a/gpu/ipc/common/BUILD.gn b/gpu/ipc/common/BUILD.gn index e2b7e8f7..842bfb8 100644 --- a/gpu/ipc/common/BUILD.gn +++ b/gpu/ipc/common/BUILD.gn
@@ -173,3 +173,21 @@ "//mojo/public/cpp/bindings:bindings", ] } + +if (is_mac || is_android) { + source_set("gpu_surface_tracker") { + sources = [ + "gpu_surface_tracker.cc", + "gpu_surface_tracker.h", + ] + + deps = [ + "//gpu/ipc/common", + "//ui/gl", + ] + + if (is_android) { + libs = [ "android" ] + } + } +}
diff --git a/gpu/ipc/common/gpu_surface_tracker.cc b/gpu/ipc/common/gpu_surface_tracker.cc new file mode 100644 index 0000000..fa02242 --- /dev/null +++ b/gpu/ipc/common/gpu_surface_tracker.cc
@@ -0,0 +1,101 @@ +// 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 "gpu/ipc/common/gpu_surface_tracker.h" + +#include "base/logging.h" +#include "build/build_config.h" + +#if defined(OS_ANDROID) +#include <android/native_window_jni.h> +#include "ui/gl/android/scoped_java_surface.h" +#endif // defined(OS_ANDROID) + +namespace gpu { + +GpuSurfaceTracker::GpuSurfaceTracker() + : next_surface_handle_(1) { + gpu::GpuSurfaceLookup::InitInstance(this); +} + +GpuSurfaceTracker::~GpuSurfaceTracker() { + gpu::GpuSurfaceLookup::InitInstance(NULL); +} + +GpuSurfaceTracker* GpuSurfaceTracker::GetInstance() { + return base::Singleton<GpuSurfaceTracker>::get(); +} + +int GpuSurfaceTracker::AddSurfaceForNativeWidget( + gfx::AcceleratedWidget widget) { + base::AutoLock lock(surface_map_lock_); + gpu::SurfaceHandle surface_handle = next_surface_handle_++; + surface_map_[surface_handle] = widget; + return surface_handle; +} + +bool GpuSurfaceTracker::IsValidSurfaceHandle( + gpu::SurfaceHandle surface_handle) const { + base::AutoLock lock(surface_map_lock_); + return surface_map_.find(surface_handle) != surface_map_.end(); +} + +void GpuSurfaceTracker::RemoveSurface(gpu::SurfaceHandle surface_handle) { + base::AutoLock lock(surface_map_lock_); + DCHECK(surface_map_.find(surface_handle) != surface_map_.end()); + surface_map_.erase(surface_handle); +} + +gfx::AcceleratedWidget GpuSurfaceTracker::AcquireNativeWidget( + gpu::SurfaceHandle surface_handle) { + base::AutoLock lock(surface_map_lock_); + SurfaceMap::iterator it = surface_map_.find(surface_handle); + if (it == surface_map_.end()) + return gfx::kNullAcceleratedWidget; + +#if defined(OS_ANDROID) + if (it->second != gfx::kNullAcceleratedWidget) + ANativeWindow_acquire(it->second); +#endif // defined(OS_ANDROID) + + return it->second; +} + +#if defined(OS_ANDROID) +void GpuSurfaceTracker::RegisterViewSurface( + int surface_id, const base::android::JavaRef<jobject>& j_surface) { + base::AutoLock lock(surface_view_map_lock_); + DCHECK(surface_view_map_.find(surface_id) == surface_view_map_.end()); + + surface_view_map_[surface_id] = + gl::ScopedJavaSurface::AcquireExternalSurface(j_surface.obj()); + CHECK(surface_view_map_[surface_id].IsValid()); +} + +void GpuSurfaceTracker::UnregisterViewSurface(int surface_id) +{ + base::AutoLock lock(surface_view_map_lock_); + DCHECK(surface_view_map_.find(surface_id) != surface_view_map_.end()); + surface_view_map_.erase(surface_id); +} + +gl::ScopedJavaSurface GpuSurfaceTracker::AcquireJavaSurface(int surface_id) { + base::AutoLock lock(surface_view_map_lock_); + SurfaceViewMap::const_iterator iter = surface_view_map_.find(surface_id); + if (iter == surface_view_map_.end()) + return gl::ScopedJavaSurface(); + + const gl::ScopedJavaSurface& j_surface = iter->second; + DCHECK(j_surface.IsValid()); + return gl::ScopedJavaSurface::AcquireExternalSurface( + j_surface.j_surface().obj()); +} +#endif + +std::size_t GpuSurfaceTracker::GetSurfaceCount() { + base::AutoLock lock(surface_map_lock_); + return surface_map_.size(); +} + +} // namespace gpu
diff --git a/content/browser/gpu/gpu_surface_tracker.h b/gpu/ipc/common/gpu_surface_tracker.h similarity index 79% rename from content/browser/gpu/gpu_surface_tracker.h rename to gpu/ipc/common/gpu_surface_tracker.h index 0d55b32..b781ae27 100644 --- a/content/browser/gpu/gpu_surface_tracker.h +++ b/gpu/ipc/common/gpu_surface_tracker.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CONTENT_BROWSER_GPU_GPU_SURFACE_TRACKER_H_ -#define CONTENT_BROWSER_GPU_GPU_SURFACE_TRACKER_H_ +#ifndef GPU_IPC_COMMON_GPU_SURFACE_TRACKER_H_ +#define GPU_IPC_COMMON_GPU_SURFACE_TRACKER_H_ #include <stddef.h> @@ -12,12 +12,12 @@ #include "base/macros.h" #include "base/memory/singleton.h" #include "base/synchronization/lock.h" -#include "content/common/content_export.h" +#include "gpu/gpu_export.h" #include "gpu/ipc/common/gpu_surface_lookup.h" #include "gpu/ipc/common/surface_handle.h" #include "ui/gfx/native_widget_types.h" -namespace content { +namespace gpu { // This class is used on Android and Mac, and is responsible for tracking native // window surfaces exposed to the GPU process. Every surface gets registered to @@ -30,7 +30,7 @@ // On Mac, the handle just passes through the GPU process, and is sent back via // GpuCommandBufferMsg_SwapBuffersCompleted to reference the surface. // This class is thread safe. -class CONTENT_EXPORT GpuSurfaceTracker : public gpu::GpuSurfaceLookup { +class GPU_EXPORT GpuSurfaceTracker : public gpu::GpuSurfaceLookup { public: // GpuSurfaceLookup implementation: // Returns the native widget associated with a given surface_handle. @@ -39,6 +39,9 @@ gpu::SurfaceHandle surface_handle) override; #if defined(OS_ANDROID) + void RegisterViewSurface(int surface_id, + const base::android::JavaRef<jobject>& j_surface); + void UnregisterViewSurface(int surface_id); gl::ScopedJavaSurface AcquireJavaSurface(int surface_id) override; #endif @@ -69,13 +72,20 @@ GpuSurfaceTracker(); ~GpuSurfaceTracker() override; - base::Lock lock_; + mutable base::Lock surface_map_lock_; SurfaceMap surface_map_; int next_surface_handle_; +#if defined(OS_ANDROID) + base::Lock surface_view_map_lock_; + typedef std::map<gpu::SurfaceHandle, gl::ScopedJavaSurface> SurfaceViewMap; + SurfaceViewMap surface_view_map_; +#endif + DISALLOW_COPY_AND_ASSIGN(GpuSurfaceTracker); }; -} // namespace content +} // namespace ui -#endif // CONTENT_BROWSER_GPU_GPU_SURFACE_TRACKER_H_ +#endif // GPU_IPC_COMMON_GPU_SURFACE_TRACKER_H_ +
diff --git a/gpu/ipc/service/gpu_command_buffer_stub.cc b/gpu/ipc/service/gpu_command_buffer_stub.cc index 6c3063aa..74b4197 100644 --- a/gpu/ipc/service/gpu_command_buffer_stub.cc +++ b/gpu/ipc/service/gpu_command_buffer_stub.cc
@@ -428,9 +428,8 @@ // don't leak resources. have_context = decoder_->GetGLContext()->MakeCurrent(surface_.get()); } - FOR_EACH_OBSERVER(DestructionObserver, - destruction_observers_, - OnWillDestroyStub()); + for (auto& observer : destruction_observers_) + observer.OnWillDestroyStub(); if (decoder_) { decoder_->Destroy(have_context);
diff --git a/infra/config/recipes.cfg b/infra/config/recipes.cfg index e5c8969..af5ae02 100644 --- a/infra/config/recipes.cfg +++ b/infra/config/recipes.cfg
@@ -5,17 +5,17 @@ project_id: "build" url: "https://chromium.googlesource.com/chromium/tools/build.git" branch: "master" - revision: "6484849c469e34f3a15f3c45c2147e5b67071a61" + revision: "5993e5340c3d0e30c1c07528f424177cf7c83acc" } deps { project_id: "depot_tools" url: "https://chromium.googlesource.com/chromium/tools/depot_tools.git" branch: "master" - revision: "49ea106b94697002edb0038374f421710d54ef02" + revision: "1c822ade1f731ec35a3d2d3be8805f773df22c4c" } deps { project_id: "recipe_engine" url: "https://chromium.googlesource.com/external/github.com/luci/recipes-py.git" branch: "master" - revision: "9de4473f1587a0ba103ecaf8ce6b6e882ac40093" + revision: "bb6caf8060139fd4bcefee43f54ae00150e7ce3a" }
diff --git a/ios/chrome/BUILD.gn b/ios/chrome/BUILD.gn index 1301bf6..236f79d 100644 --- a/ios/chrome/BUILD.gn +++ b/ios/chrome/BUILD.gn
@@ -53,6 +53,7 @@ "browser/net/image_fetcher_unittest.mm", "browser/net/metrics_network_client_unittest.mm", "browser/net/retryable_url_fetcher_unittest.mm", + "browser/notification_promo_unittest.cc", "browser/passwords/credential_manager_js_unittest.mm", "browser/passwords/credential_manager_unittest.mm", "browser/passwords/password_controller_js_unittest.mm", @@ -108,9 +109,10 @@ "//components/signin/core/browser:test_support", "//components/signin/ios/browser:test_support", "//components/ssl_config:ssl_config", - "//components/sync:test_support_sync_driver", + "//components/sync:test_support_driver", "//components/syncable_prefs:test_support", "//components/update_client", + "//components/variations", "//components/version_info", "//ios/chrome/app", "//ios/chrome/app/resources:packed_resources",
diff --git a/ios/chrome/app/strings/resources/ios_strings_am.xtb b/ios/chrome/app/strings/resources/ios_strings_am.xtb index 21d8d03..5a22273 100644 --- a/ios/chrome/app/strings/resources/ios_strings_am.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_am.xtb
@@ -15,6 +15,7 @@ <translation id="3335947283844343239">የተዘጋውን ትር ዳግም ክፈት</translation> <translation id="3414292259312108062">Chrome ይህንን በእርስዎ በ<ph name="BEGIN_LINK" />Google የተቀመጡ የይለፍ ቃሎች<ph name="END_LINK" /> ያከማቸው እና እራስዎ ማስታወስ እንዳያስፈልግዎት በራስ-ሰር ይሞላልዎታል።</translation> <translation id="3567664240939803299">Google Smart Lock የዚህን ጣቢያ የይለፍ ቃልዎን እንዲያስቀምጥልዎ ይፈልጋሉ?</translation> +<translation id="3692781555820666866">በሚነቃበት ጊዜ፣ ኦምኒቦክሱ ከእርስዎ አቅራቢያ ባሉ መሣሪያዎች ለተሰራጩ የድር ገጾች የጥቆማ ሐሳቦችን ያካትታል።</translation> <translation id="385051799172605136">ተመለስ</translation> <translation id="4121993058175073134">የተጣራ-ወደ-ውጭ-የሚላክ ውሂብ ለመላክ እባክዎ የኢሜይል መለያዎን በቅንብሮች መተግበሪያው ውስጥ ያዋቅሩ።</translation> <translation id="4399225372525667111">Chrome የዚህ ጣቢያ ዩአርኤል ትክክለኛ መሆኑን ሊያረጋግጥ አልቻለም።</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ar.xtb b/ios/chrome/app/strings/resources/ios_strings_ar.xtb index 6ceec1c0..3beeb8799 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ar.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ar.xtb
@@ -15,6 +15,7 @@ <translation id="3335947283844343239">إعادة فتح علامة التبويب المغلقة</translation> <translation id="3414292259312108062">سيخزن Chrome ذلك في <ph name="BEGIN_LINK" />كلمات مرور Chrome المحفوظة<ph name="END_LINK" /> ويكتبها تلقائيًا بالنيابة عنك حتى لا تضطر لحفظها بنفسك.</translation> <translation id="3567664240939803299">هل تريد من Google Smart Lock حفظ كلمة المرور لهذا الموقع؟</translation> +<translation id="3692781555820666866">عند التمكين، سوف يتضمن المربّع متعدد الاستخدامات اقتراحات لبث صفحات الويب من الأجهزة القريبة منك.</translation> <translation id="385051799172605136">الرجوع إلى الوراء</translation> <translation id="4121993058175073134">لإرسال بيانات تصدير الشبكة، الرجاء تهيئة حساب بريدك الإلكتروني في التطبيق "الإعدادات".</translation> <translation id="4399225372525667111">يتعذر على متصفح Chrome التحقق من صحة عنوان URL لموقع الويب هذا.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_bg.xtb b/ios/chrome/app/strings/resources/ios_strings_bg.xtb index d83351e7..43fec4e 100644 --- a/ios/chrome/app/strings/resources/ios_strings_bg.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_bg.xtb
@@ -15,6 +15,7 @@ <translation id="3335947283844343239">Повторно отваряне на затворения раздел</translation> <translation id="3414292259312108062">Chrome ще съхрани тази парола при <ph name="BEGIN_LINK" />останалите, запазени в Google<ph name="END_LINK" />, и автоматично ще я попълва вместо вас, за да не се налага да я помните.</translation> <translation id="3567664240939803299">Искате ли Google Smart Lock да запази паролата ви за този сайт?</translation> +<translation id="3692781555820666866">Когато е активиран, полето за всичко ще включва предложения за уеб страници, излъчвани от устройства близо до вас.</translation> <translation id="385051799172605136">Назад</translation> <translation id="4121993058175073134">За изпращане на експ. данни от мрежата конфиг. имейла си в Настройки.</translation> <translation id="4399225372525667111">Chrome не може да потвърди, че URL адресът за този сайт е правилен.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_bn.xtb b/ios/chrome/app/strings/resources/ios_strings_bn.xtb index 11b3315..097552d 100644 --- a/ios/chrome/app/strings/resources/ios_strings_bn.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_bn.xtb
@@ -15,6 +15,7 @@ <translation id="3335947283844343239">বন্ধ হওয়া ট্যাব পুনরায় খুলুন</translation> <translation id="3414292259312108062">Chrome এটিকে আপনার <ph name="BEGIN_LINK" />Google এর সংরক্ষিত পাসওয়ার্ডগুলি<ph name="END_LINK" /> এ সংরক্ষণ করতে এবং আপনার জন্য এটিকে স্বতঃপূর্ণ করবে যাতে করে আপনাকে এটি আর মনে রাখতে না হয়৷</translation> <translation id="3567664240939803299">আপনি কি চান Google Smart Lock এই সাইটের জন্য আপনার পাসওয়ার্ড সংরক্ষণ করুক?</translation> +<translation id="3692781555820666866">সক্ষম করা হলে, বহুউপযোগী ক্ষেত্র আপনার আশেপাশের ডিভাইসের জন্য ওয়েব পৃষ্ঠা সমপ্রচারগুলির পরামর্শ অন্তর্ভুক্ত করা হবে।</translation> <translation id="385051799172605136">ফিরুন</translation> <translation id="4121993058175073134">নেট-রপ্তানি ডেটা পাঠানোর জন্য, দয়া করে সিস্টেম অ্যাপ্লিকেশানে আপনার ইমেল অ্যাকাউন্ট কনফিগার করুন৷</translation> <translation id="4399225372525667111">সাইটের জন্য URLটি সঠিক কিনা Chrome তা যাচাই করতে অক্ষম৷</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ca.xtb b/ios/chrome/app/strings/resources/ios_strings_ca.xtb index d4ce1ec..39c2e0e 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ca.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ca.xtb
@@ -15,6 +15,7 @@ <translation id="3335947283844343239">Torna a obrir la pestanya tancada</translation> <translation id="3414292259312108062">Chrome l'emmagatzemarà a les <ph name="BEGIN_LINK" />contrasenyes desades a Google<ph name="END_LINK" /> i l'emplenarà automàticament perquè no us calgui recordar-la.</translation> <translation id="3567664240939803299">Voleu que Google Smart Lock desi la vostra contrasenya per a aquest lloc?</translation> +<translation id="3692781555820666866">Quan s'activi, l'omnibox inclourà suggeriments de pàgines web emeses pels dispositius que tinguis a prop.</translation> <translation id="385051799172605136">Enrere</translation> <translation id="4121993058175073134">Definiu el vostre compte de correu electrònic a l'aplicació Configuració per enviar dades d'exportació de xarxa.</translation> <translation id="4399225372525667111">Chrome no pot verificar que l'URL d'aquest lloc sigui correcte.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_cs.xtb b/ios/chrome/app/strings/resources/ios_strings_cs.xtb index c4a5b4d..fef89e84 100644 --- a/ios/chrome/app/strings/resources/ios_strings_cs.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_cs.xtb
@@ -15,6 +15,7 @@ <translation id="3335947283844343239">Znovu otevřít zavřenou kartu</translation> <translation id="3414292259312108062">Chrome toto heslo uloží ve vašich <ph name="BEGIN_LINK" />uložených heslech Google<ph name="END_LINK" /> a automaticky vám jej vyplní, abyste si jej nemuseli pamatovat.</translation> <translation id="3567664240939803299">Má funkce Google Smart Lock uložit vaše heslo pro tyto stránky?</translation> +<translation id="3692781555820666866">Pokud je tento příznak aktivován, bude omnibox zahrnovat návrhy webových stránek, které jsou vysílány zařízeními v okolí.</translation> <translation id="385051799172605136">Zpět</translation> <translation id="4121993058175073134">Chcete-li odesílat data nástroje net-export, nakonfigurujte e-mailový účet v aplikaci Nastavení.</translation> <translation id="4399225372525667111">Chrome nemohl ověřit správnost adresy URL tohoto webu.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_da.xtb b/ios/chrome/app/strings/resources/ios_strings_da.xtb index 2911e567..5e894bc 100644 --- a/ios/chrome/app/strings/resources/ios_strings_da.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_da.xtb
@@ -15,6 +15,7 @@ <translation id="3335947283844343239">Åbn lukket fane igen</translation> <translation id="3414292259312108062">Chrome gemmer denne i dine <ph name="BEGIN_LINK" />Gemte adgangskoder på Google<ph name="END_LINK" /> og autofylder den for dig, så du ikke behøver at huske den selv.</translation> <translation id="3567664240939803299">Skal Google Smart Lock gemme din adgangskode til dette website?</translation> +<translation id="3692781555820666866">Når Fysisk web er aktiveret, medtager omnifeltet websideforslag, som enheder i nærheden af dig udsender.</translation> <translation id="385051799172605136">Tilbage</translation> <translation id="4121993058175073134">For at sende oplysninger om nettoeksporten skal du konfigurere din e-mailkonto i appen Indstillinger.</translation> <translation id="4399225372525667111">Chrome kan ikke bekræfte, at webadressen for dette website er korrekt.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_de.xtb b/ios/chrome/app/strings/resources/ios_strings_de.xtb index c4910da..fe5e54d 100644 --- a/ios/chrome/app/strings/resources/ios_strings_de.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_de.xtb
@@ -15,6 +15,7 @@ <translation id="3335947283844343239">Geschlossenen Tab wieder öffnen</translation> <translation id="3414292259312108062">Chrome speichert dieses Passwort in Ihren <ph name="BEGIN_LINK" />in Google gespeicherten Passwörtern<ph name="END_LINK" /> und fügt es automatisch für Sie ein. Sie müssen es sich also nicht merken.</translation> <translation id="3567664240939803299">Soll Google Smart Lock Ihr Passwort für diese Website speichern?</translation> +<translation id="3692781555820666866">Wenn Physical Web aktiviert ist, enthält die Omnibox Vorschläge für Webseiten, die von Geräten in Ihrer Nähe übertragen werden.</translation> <translation id="385051799172605136">Zurück</translation> <translation id="4121993058175073134">Zum Senden von Exportdaten E-Mail-Konto in App "Einstellungen" konfigurieren</translation> <translation id="4399225372525667111">Chrome kann die Richtigkeit dieser Website-URL nicht bestätigen.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_el.xtb b/ios/chrome/app/strings/resources/ios_strings_el.xtb index 1d3b035..4d40df0 100644 --- a/ios/chrome/app/strings/resources/ios_strings_el.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_el.xtb
@@ -15,6 +15,7 @@ <translation id="3335947283844343239">Εκ Νέου Άνοιγμα Κλεισμένης Καρτέλας</translation> <translation id="3414292259312108062">Το Chrome θα αποθηκεύσει αυτόν τον κωδικό στους <ph name="BEGIN_LINK" />αποθηκευμένους κωδικούς πρόσβασης Google<ph name="END_LINK" /> και θα τον συμπληρώνει αυτόματα, έτσι ώστε να μην χρειάζεται να τον απομνημονεύσετε.</translation> <translation id="3567664240939803299">Θέλετε το Google Smart Lock να αποθηκεύσει τον κωδικό πρόσβασης για αυτόν τον ιστότοπο;</translation> +<translation id="3692781555820666866">Όταν είναι ενεργοποιημένο, το κύριο πλαίσιο θα περιλαμβάνει προτάσεις για ιστοσελίδες που μεταδίδονται από συσκευές που βρίσκονται κοντά σας.</translation> <translation id="385051799172605136">Πίσω</translation> <translation id="4121993058175073134">Για αποστ. δεδομ.εξαγ.δικτ.,διαμορφ. το email σας στην εφ. "Ρυθμίσεις"</translation> <translation id="4399225372525667111">Το Chrome δεν μπορεί να επαληθεύσει ότι η διεύθυνση URL για αυτόν τον ιστότοπο είναι σωστή.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb b/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb index 2768d3a..50c723c0 100644 --- a/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb
@@ -15,6 +15,7 @@ <translation id="3335947283844343239">Re-open Closed Tab</translation> <translation id="3414292259312108062">Chrome will store this in your <ph name="BEGIN_LINK" />Google saved passwords<ph name="END_LINK" /> and autofill it for you so that you don't have to remember it yourself.</translation> <translation id="3567664240939803299">Do you want Google Smart Lock to save your password for this site?</translation> +<translation id="3692781555820666866">When enabled, the omnibox will include suggestions for web pages broadcast by devices near you.</translation> <translation id="385051799172605136">Back</translation> <translation id="4121993058175073134">To send net-export data, please configure your email account in the Settings app.</translation> <translation id="4399225372525667111">Chrome is unable to verify that the URL for this site is correct.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_es-419.xtb b/ios/chrome/app/strings/resources/ios_strings_es-419.xtb index d20ca19..7d9124b 100644 --- a/ios/chrome/app/strings/resources/ios_strings_es-419.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_es-419.xtb
@@ -15,6 +15,7 @@ <translation id="3335947283844343239">Volver a abrir pestaña cerrada</translation> <translation id="3414292259312108062">Chrome almacenará esto en tus <ph name="BEGIN_LINK" />contraseñas de Google guardadas<ph name="END_LINK" /> y las autocompletará para que no tengas que recordarlas.</translation> <translation id="3567664240939803299">¿Deseas que Google Smart Lock guarde tu contraseña para este sitio?</translation> +<translation id="3692781555820666866">Cuando está habilitado, el cuadro multifunción incluirá sugerencias para páginas web que transmiten dispositivos cercanos.</translation> <translation id="385051799172605136">Atrás</translation> <translation id="4121993058175073134">Configura cuenta en Configuración p/ enviar datos exportaciones netas.</translation> <translation id="4399225372525667111">Chrome no puede verificar si la URL de este sitio es correcta.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_es.xtb b/ios/chrome/app/strings/resources/ios_strings_es.xtb index e51a5a0..f239374 100644 --- a/ios/chrome/app/strings/resources/ios_strings_es.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_es.xtb
@@ -15,6 +15,7 @@ <translation id="3335947283844343239">Volver a abrir pestaña cerrada</translation> <translation id="3414292259312108062">Chrome almacenará esta contraseña en las <ph name="BEGIN_LINK" />contraseñas guardadas de Google<ph name="END_LINK" /> y utilizará la función Autocompletar para que no tengas que memorizarla.</translation> <translation id="3567664240939803299">¿Quieres que Google Smart Lock guarde tu contraseña en este sitio web?</translation> +<translation id="3692781555820666866">Si se habilita, el omnibox incluirá sugerencias de las páginas web que envíen dispositivos cercanos.</translation> <translation id="385051799172605136">Atrás</translation> <translation id="4121993058175073134">Configura tu correo en Ajustes para enviar datos de exportaciones netas.</translation> <translation id="4399225372525667111">Chrome no puede comprobar que la URL de este sitio sea correcta.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_et.xtb b/ios/chrome/app/strings/resources/ios_strings_et.xtb index 0961b4b..78deb12 100644 --- a/ios/chrome/app/strings/resources/ios_strings_et.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_et.xtb
@@ -15,6 +15,7 @@ <translation id="3335947283844343239">Ava uuesti suletud vaheleht</translation> <translation id="3414292259312108062">Chrome salvestab selle <ph name="BEGIN_LINK" />Google'i salvestatud paroolide<ph name="END_LINK" /> hulka ja täidab parooli automaatselt, nii et te ei pea seda meeles pidama.</translation> <translation id="3567664240939803299">Kas soovite, et Smart Lock salvestaks selle saidi puhul teie parooli?</translation> +<translation id="3692781555820666866">Kui funktsioon on lubatud, soovitab omnikastike veebilehti, mida levitavad lähedal asuvad seadmed.</translation> <translation id="385051799172605136">Tagasi</translation> <translation id="4121993058175073134">Netiekspordi andmete saatmiseks seadistage meilikonto rakenduses Seaded.</translation> <translation id="4399225372525667111">Chrome ei suuda kinnitada, et selle saidi URL on õige.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fa.xtb b/ios/chrome/app/strings/resources/ios_strings_fa.xtb index eecf725b..a8712046 100644 --- a/ios/chrome/app/strings/resources/ios_strings_fa.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_fa.xtb
@@ -15,6 +15,7 @@ <translation id="3335947283844343239">باز کردن مجدد برگه بسته شده</translation> <translation id="3414292259312108062">Chrome این گذرواژه را در <ph name="BEGIN_LINK" />گذرواژههای ذخیرهشده Google<ph name="END_LINK" /> شما ذخیره میکند و به صورت خودکار آن را برایتان وارد میکند، بنابراین نیازی نیست آن را به خاطر بسپارید.</translation> <translation id="3567664240939803299">آیا میخواهید Google Smart Lock گذرواژه شما را برای این سایت ذخیره کند؟</translation> +<translation id="3692781555820666866">omnibox، درصورت فعال بودن، پیشنهاداتی برای پخش صفحههای وب توسط دستگاههای نزدیک شما ارائه میدهد.</translation> <translation id="385051799172605136">بازگشت</translation> <translation id="4121993058175073134">برای ارسال دادههای صادراتی شبکه، لطفاً حساب ایمیلتان را در برنامه تنظیمات پیکربندی کنید.</translation> <translation id="4399225372525667111">Chrome نمیتواند صحت نشانی وب این سایت را تأیید کند.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fi.xtb b/ios/chrome/app/strings/resources/ios_strings_fi.xtb index 530a87b..9d4293f 100644 --- a/ios/chrome/app/strings/resources/ios_strings_fi.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_fi.xtb
@@ -15,6 +15,7 @@ <translation id="3335947283844343239">Avaa suljettu välilehti uudelleen</translation> <translation id="3414292259312108062">Chrome tallentaa tämän <ph name="BEGIN_LINK" />Googlen tallennettuihin salasanoihin<ph name="END_LINK" /> ja täyttää sen automaattisesti, joten sinun ei tarvitse muistaa salasanaa itse.</translation> <translation id="3567664240939803299">Haluatko, että Google Smart Lock tallentaa salasanasi tälle sivustolle?</translation> +<translation id="3692781555820666866">Kun tämä on käytössä, omniboxissa näytetään ehdotuksia lähellä olevien laitteiden lähettämistä verkkosivuista.</translation> <translation id="385051799172605136">Edellinen</translation> <translation id="4121993058175073134">Tee sähköp.tilin määritykset asetuksissa lähettääksesi nettovientitiet.</translation> <translation id="4399225372525667111">Chrome ei voi varmistaa, onko tämän sivuston URL-osoite oikea.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fil.xtb b/ios/chrome/app/strings/resources/ios_strings_fil.xtb index 20cff71..67bebc3 100644 --- a/ios/chrome/app/strings/resources/ios_strings_fil.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_fil.xtb
@@ -15,6 +15,7 @@ <translation id="3335947283844343239">Muling buksan ang Nakasarang Tab</translation> <translation id="3414292259312108062">Iiimbak ito ng Chrome sa iyong <ph name="BEGIN_LINK" />mga naka-save na password sa Google<ph name="END_LINK" /> at io-autofill ito para sa iyo nang sa gayon ay hindi mo na ito kailangang tandaan.</translation> <translation id="3567664240939803299">Gusto mo bang i-save ng Google Smart Lock ang iyong password para sa site na ito?</translation> +<translation id="3692781555820666866">Kapag naka-enable, magkakaroon ang omnibox ng mga suhestyon para sa mga web page na bino-broadcast ng mga device na malapit sa iyo.</translation> <translation id="385051799172605136">Bumalik</translation> <translation id="4121993058175073134">Upang makapagpadala ng net-export data, paki-configure ang iyong email account sa app ng Mga Setting.</translation> <translation id="4399225372525667111">Hindi ma-verify ng Chrome na tama ang URL para sa site na ito.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fr.xtb b/ios/chrome/app/strings/resources/ios_strings_fr.xtb index ca8308b..db2ee536 100644 --- a/ios/chrome/app/strings/resources/ios_strings_fr.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_fr.xtb
@@ -15,6 +15,7 @@ <translation id="3335947283844343239">Rouvrir l'onglet fermé</translation> <translation id="3414292259312108062">Chrome stocke ce mot de passe dans les <ph name="BEGIN_LINK" />mots de passe Google enregistrés<ph name="END_LINK" />. Il sera renseigné automatiquement afin que vous n'ayez pas à le retenir.</translation> <translation id="3567664240939803299">Voulez-vous que Google Smart Lock enregistre votre mot de passe pour ce site ?</translation> +<translation id="3692781555820666866">Une fois le Web physique activé, l'omnibox fournit des suggestions de pages Web diffusées par les appareils à proximité.</translation> <translation id="385051799172605136">Retour</translation> <translation id="4121993058175073134">Configurez compte mess. dans appli Paramètres pour envoyer données net-export.</translation> <translation id="4399225372525667111">Impossible de vérifier dans Google Chrome que l'URL de ce site est correcte.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_gu.xtb b/ios/chrome/app/strings/resources/ios_strings_gu.xtb index 36c3f83..aa40971 100644 --- a/ios/chrome/app/strings/resources/ios_strings_gu.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_gu.xtb
@@ -15,6 +15,7 @@ <translation id="3335947283844343239">બંધ કરેલું ટૅબ ફરીથી ખોલો</translation> <translation id="3414292259312108062">Chrome આને તમારા <ph name="BEGIN_LINK" />Google સાચવેલા પાસવર્ડ્સ<ph name="END_LINK" />માં સંગ્રહિત કરશે અને તમારા માટે સ્વતઃભરણ કરશે તેથી તમારે તેને જાતે યાદ રાખવાનું હોતું નથી.</translation> <translation id="3567664240939803299">શું તમે ઇચ્છો છો કે Google Smart Lock આ સાઇટ માટે તમારો પાસવર્ડ સાચવે?</translation> +<translation id="3692781555820666866">સક્ષમ કરવા પર, ઑમ્નિબૉક્સ, તમારી નજીકના ઉપકરણો દ્વારા બ્રોડકાસ્ટ કરવામાં આવેલા વેબ પૃષ્ઠો માટે સૂચનોને શામેલ કરશે.</translation> <translation id="385051799172605136">પાછળ</translation> <translation id="4121993058175073134">ચોખ્ખો-નિકાસ ડેટા મોકલવા માટે, કૃપા કરીને સેટિંગ્સ એપ્લિકેશનમાં તમારા ઇમેઇલ એકાઉન્ટને ગોઠવો.</translation> <translation id="4399225372525667111">આ સાઇટ માટે URL સાચું છે એ ચકાસવામાં Chrome અસમર્થ છે.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hi.xtb b/ios/chrome/app/strings/resources/ios_strings_hi.xtb index c1e62484..90226e52 100644 --- a/ios/chrome/app/strings/resources/ios_strings_hi.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_hi.xtb
@@ -15,6 +15,7 @@ <translation id="3335947283844343239">बंद किए गए टैब फिर से खोलें</translation> <translation id="3414292259312108062">Chrome इसे आपके <ph name="BEGIN_LINK" />Google द्वारा सहेजे गए पासवर्ड<ph name="END_LINK" /> में संग्रहीत करेगा और आपके लिए इसे ऑटोमैटिक भरेगा ताकि आपको उसे याद न रखना पड़े.</translation> <translation id="3567664240939803299">क्या आप चाहते हैं कि Google Smart Lock इस साइट के लिए आपका पासवर्ड सहेजे?</translation> +<translation id="3692781555820666866">सक्षम होने पर खोज वाली पट्टी में आपके नज़दीकी डिवाइस द्वारा प्रसारित किए गए वेबपृष्ठों को लिए सुझाव शामिल होंगे.</translation> <translation id="385051799172605136">वापस</translation> <translation id="4121993058175073134">कुल निर्यात डेटा भेजने के लिए, कृपया सेटिंग ऐप्स में अपना ईमेल खाता कॉन्फ़िगर करें.</translation> <translation id="4399225372525667111">Chrome यह सत्यापित करने में असमर्थ है कि इस साइट का URL सही है.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hr.xtb b/ios/chrome/app/strings/resources/ios_strings_hr.xtb index 089b463..4ee3de4 100644 --- a/ios/chrome/app/strings/resources/ios_strings_hr.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_hr.xtb
@@ -15,6 +15,7 @@ <translation id="3335947283844343239">Ponovo otvori zatvorenu karticu</translation> <translation id="3414292259312108062">Chrome će to pohraniti u vašim <ph name="BEGIN_LINK" />Googleovim spremljenim zaporkama<ph name="END_LINK" /> i automatski popuniti umjesto vas kako ne biste morali pamtiti.</translation> <translation id="3567664240939803299">Želite li da Google Smart Lock spremi vašu zaporku za ovu web-lokaciju?</translation> +<translation id="3692781555820666866">Kada je ta značajka omogućena, višenamjenski okvir uključit će prijedloge za web-stranice koje emitiraju uređaji u vašoj blizini.</translation> <translation id="385051799172605136">Natrag</translation> <translation id="4121993058175073134">Za slanje neto izvezenih datoteka konfigurirajte svoj račun e-pošte u aplikaciji Postavke.</translation> <translation id="4399225372525667111">Chrome ne može potvrditi da je URL ove stranice točan.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hu.xtb b/ios/chrome/app/strings/resources/ios_strings_hu.xtb index c39849c9..5d36605 100644 --- a/ios/chrome/app/strings/resources/ios_strings_hu.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_hu.xtb
@@ -15,6 +15,7 @@ <translation id="3335947283844343239">Bezárt lap megnyitása</translation> <translation id="3414292259312108062">A Chrome eltárolja ezt a jelszót a <ph name="BEGIN_LINK" />mentett Google-jelszavak<ph name="END_LINK" /> közé, és szükség esetén automatikusan beilleszti, így Önnek nem kell megjegyeznie.</translation> <translation id="3567664240939803299">Szeretné, hogy a Google Smart Lock mentse a webhely jelszavát?</translation> +<translation id="3692781555820666866">Ha engedélyezve van, a cím- és keresősáv javaslatokat jelenít meg a közeli eszközök által sugárzott weboldalakról.</translation> <translation id="385051799172605136">Vissza</translation> <translation id="4121993058175073134">Net-export adatok küldéséhez, kérjük, konfigurálja e-mail fiókját a Beállítások alkalmazásban.</translation> <translation id="4399225372525667111">A Chrome nem tudja ellenőrizni, hogy az oldalhoz tartozó URL helyes-e.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_id.xtb b/ios/chrome/app/strings/resources/ios_strings_id.xtb index 8c24bc8..8cc05401d 100644 --- a/ios/chrome/app/strings/resources/ios_strings_id.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_id.xtb
@@ -15,6 +15,7 @@ <translation id="3335947283844343239">Buka Kembali Tab yang Tertutup</translation> <translation id="3414292259312108062">Chrome akan menyimpan sandi ini pada <ph name="BEGIN_LINK" />sandi tersimpan Google<ph name="END_LINK" /> dan melengkapinya secara otomatis sehingga Anda tidak perlu mengingatnya.</translation> <translation id="3567664240939803299">Ingin Google Smart Lock menyimpan sandi untuk situs ini?</translation> +<translation id="3692781555820666866">Jika diaktifkan, omnibox akan menyertakan saran untuk laman web yang disiarkan oleh perangkat di sekitar Anda.</translation> <translation id="385051799172605136">Mundur</translation> <translation id="4121993058175073134">Konfigurasi akun email Anda di aplikasi Setelan untuk mengirim data net-ekspor.</translation> <translation id="4399225372525667111">Chrome tidak dapat memverifikasi bahwa URL untuk situs ini benar.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_it.xtb b/ios/chrome/app/strings/resources/ios_strings_it.xtb index 9cf4746..24e7e72 100644 --- a/ios/chrome/app/strings/resources/ios_strings_it.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_it.xtb
@@ -15,6 +15,7 @@ <translation id="3335947283844343239">Riapri scheda chiusa</translation> <translation id="3414292259312108062">Chrome archivierà questa password nelle <ph name="BEGIN_LINK" />password Google salvate<ph name="END_LINK" /> per inserirla automaticamente, in modo da non doverla imparare a memoria.</translation> <translation id="3567664240939803299">Vuoi che Google Smart Lock salvi la password di questo sito?</translation> +<translation id="3692781555820666866">Quando è attivo, la omnibox include suggerimenti relativi alle pagine web trasmesse dai dispositivi nelle vicinanze.</translation> <translation id="385051799172605136">Indietro</translation> <translation id="4121993058175073134">Per inviare dati net-export, configura il tuo account email nell'app Impostazioni.</translation> <translation id="4399225372525667111">Chrome non riesce a verificare l'esattezza dell'URL di questo sito.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_iw.xtb b/ios/chrome/app/strings/resources/ios_strings_iw.xtb index 157e4a9..a8bddf3 100644 --- a/ios/chrome/app/strings/resources/ios_strings_iw.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_iw.xtb
@@ -15,6 +15,7 @@ <translation id="3335947283844343239">פתח מחדש כרטיסייה שנסגרה</translation> <translation id="3414292259312108062">Chrome יאחסן את הסיסמה ב<ph name="BEGIN_LINK" />סיסמאות Google השמורות<ph name="END_LINK" /> ויזין אותה באופן אוטומטי כדי שלא תצטרך לזכור אותה.</translation> <translation id="3567664240939803299">האם אתה מעוניין ש-Google Smart Lock ישמור את הסיסמה לאתר זה?</translation> +<translation id="3692781555820666866">כשאפשרות זו מופעלת, סרגל הכתובות יכלול הצעות לדפי אינטרנט המשודרים ממכשירים בסביבתך הקרובה.</translation> <translation id="385051799172605136">חזור</translation> <translation id="4121993058175073134">כדי לשלוח נתוני ייצוא ברשת, הגדר את חשבון האימייל שלך ביישום 'הגדרות'.</translation> <translation id="4399225372525667111">Chrome אינו יכול לוודא שכתובת האתר עבור אתר זה נכונה.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ja.xtb b/ios/chrome/app/strings/resources/ios_strings_ja.xtb index 12002a4..c38e1d4 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ja.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ja.xtb
@@ -15,6 +15,7 @@ <translation id="3335947283844343239">閉じたタブを開く</translation> <translation id="3414292259312108062">このパスワードは<ph name="BEGIN_LINK" />Googleの保存パスワード<ph name="END_LINK" />として保存され、次回から自動入力されます。</translation> <translation id="3567664240939803299">Google Smart Lock でこのサイトのパスワードを保存しますか?</translation> +<translation id="3692781555820666866">有効にすると、近くのデバイスからブロードキャストされているウェブページの候補がアドレスバー(オムニボックス)に表示されます。</translation> <translation id="385051799172605136">戻る</translation> <translation id="4121993058175073134">エクスポート データのみを送信するには、設定アプリでメール アカウントを設定してください。</translation> <translation id="4399225372525667111">ChromeではこのサイトのURLが正しいことを確認できません。</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_kn.xtb b/ios/chrome/app/strings/resources/ios_strings_kn.xtb index e0eb27a..710c148b 100644 --- a/ios/chrome/app/strings/resources/ios_strings_kn.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_kn.xtb
@@ -15,6 +15,7 @@ <translation id="3335947283844343239">ಮುಚ್ಚಿದ ಟ್ಯಾಬ್ ಮರುತೆರೆ</translation> <translation id="3414292259312108062">Chrome ಇದನ್ನು ನಿಮ್ಮ <ph name="BEGIN_LINK" />Google ಉಳಿಸಲಾದ ಪಾಸ್ವಡ್ಗಳಲ್ಲಿ<ph name="END_LINK" /> ಸಂಗ್ರಹಿಸುತ್ತದೆ ಮತ್ತು ಅದನ್ನು ಸ್ವಯಂ ಭರ್ತಿ ಮಾಡುತ್ತದೆ ಆದ್ದರಿಂದ ನೀವು ಅದನ್ನು ನೆನಪಿಡುವ ಅಗತ್ಯವಿಲ್ಲ.</translation> <translation id="3567664240939803299">ಈ ಸೈಟ್ಗೆ ನಿಮ್ಮ ಪಾಸ್ವರ್ಡ್ ಅನ್ನು Google Smart Lock ಉಳಿಸಬೇಕೆಂದು ನೀವು ಬಯಸುವಿರಾ?</translation> +<translation id="3692781555820666866">ಸಕ್ರಿಯಗೊಳಿಸಿದಾಗ, ನಿಮಗೆ ಹತ್ತಿರದಲ್ಲಿರುವ ಸಾಧನಗಳ ಮೂಲಕ ವೆಬ್ ಪುಟಗಳ ಪ್ರಸಾರಕ್ಕೆ ಆಮ್ನಿಬಾಕ್ಸ್ ಸಲಹೆಗಳನ್ನು ಒಳಗೊಂಡಿರುತ್ತದೆ.</translation> <translation id="385051799172605136">ಹಿಂದೆ</translation> <translation id="4121993058175073134">ಒಟ್ಟು ರಫ್ತು ಡೇಟಾ ಕಳುಹಿಸಲು, ದಯವಿಟ್ಟು ನಿಮ್ಮ ಇಮೇಲ್ ಖಾತೆಯನ್ನು ಸೆಟ್ಟಿಂಗ್ಗಳ ಅಪ್ಲಿಕೇಶನ್ನಲ್ಲಿ ಕಾನ್ಫಿಗರ್ ಮಾಡಿ.</translation> <translation id="4399225372525667111">ಈ ಸೈಟ್ ಗಾಗಿ URL ಸರಿಯಾಗಿದೆಯೇ ಎಂಬುದನ್ನು ಪರಿಶೀಲಿಸಲು Chrome ಗೆ ಸಾಧ್ಯವಿಲ್ಲ.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ko.xtb b/ios/chrome/app/strings/resources/ios_strings_ko.xtb index b9719fc..2f249b03 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ko.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ko.xtb
@@ -1,7 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="ko"> -<translation id="1047726139967079566">페이지 북마크...</translation> +<translation id="1047726139967079566">현재 페이지를 북마크에 추가...</translation> <translation id="1172898394251786223">다음 필드</translation> <translation id="2320166752086256636">키보드 숨기기</translation> <translation id="2467815441875554965">문맥 검색</translation> @@ -15,6 +15,7 @@ <translation id="3335947283844343239">닫은 탭 다시 열기</translation> <translation id="3414292259312108062">Chrome은 이 비밀번호를 <ph name="BEGIN_LINK" />Google에 저장된 비밀번호<ph name="END_LINK" />에 저장하고 자동완성 기능을 지원하므로 직접 기억할 필요가 없습니다.</translation> <translation id="3567664240939803299">Google Smart Lock에서 이 사이트의 비밀번호를 저장하도록 하시겠습니까?</translation> +<translation id="3692781555820666866">이 기능을 사용하도록 설정한 경우 내 주변에 있는 기기의 웹페이지 브로드캐스트 제안이 검색주소창에 표시됩니다.</translation> <translation id="385051799172605136">뒤로</translation> <translation id="4121993058175073134">순 내보내기 데이터를 전송하려면 설정 앱에서 이메일 계정을 설정하시기 바랍니다.</translation> <translation id="4399225372525667111">Chrome은 이 사이트의 URL이 올바른지 확인할 수 없습니다.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_lt.xtb b/ios/chrome/app/strings/resources/ios_strings_lt.xtb index 57515d7..7ba6016 100644 --- a/ios/chrome/app/strings/resources/ios_strings_lt.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_lt.xtb
@@ -15,6 +15,7 @@ <translation id="3335947283844343239">Iš naujo atidarykite uždarytą skirtuką</translation> <translation id="3414292259312108062">„Chrome“ išsaugos šį slaptažodį <ph name="BEGIN_LINK" />„Google“ išsaugotuose slaptažodžiuose<ph name="END_LINK" /> ir jis bus automatiškai įvestas už jus, kad jums nereikėtų jo įsiminti.</translation> <translation id="3567664240939803299">Ar norite, kad „Google Smart Lock“ išsaugotų svetainės slaptažodį?</translation> +<translation id="3692781555820666866">Kai įgalinta, „omnibox“ juosta apims netoli jūsų esančių įrenginių tinklalapių transliacijos pasiūlymus.</translation> <translation id="385051799172605136">Grįžti</translation> <translation id="4121993058175073134">Jei n. siųsti tinklo eksp. duom., sukonf. el. pšt. pask. nust. progr.</translation> <translation id="4399225372525667111">„Chrome“ negali patikrinti, ar šios svetainės URL tinkamas.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_lv.xtb b/ios/chrome/app/strings/resources/ios_strings_lv.xtb index 9f0bf63..1c504822 100644 --- a/ios/chrome/app/strings/resources/ios_strings_lv.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_lv.xtb
@@ -15,6 +15,7 @@ <translation id="3335947283844343239">Vēlreiz atvērt aizvērto cilni</translation> <translation id="3414292259312108062">Šo informāciju Chrome saglabās <ph name="BEGIN_LINK" />Google saglabātajās parolēs<ph name="END_LINK" /> un izmantos automātiskajai aizpildei, lai jums tā nav jāatceras.</translation> <translation id="3567664240939803299">Vai vēlaties, lai Google Smart Lock saglabātu šīs vietnes paroli?</translation> +<translation id="3692781555820666866">Ja šī opcija ir iespējota, universālajā lodziņā tiek rādīti tīmekļa lapu ieteikumi, ko apraida tuvumā esošas ierīces.</translation> <translation id="385051799172605136">Atpakaļ</translation> <translation id="4121993058175073134">Neto eksporta datu sūtīšanai konfigurējiet e-pasta kontu iestatījumos.</translation> <translation id="4399225372525667111">Chrome nevar apstiprināt, ka šīs vietnes URL ir pareizs.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ml.xtb b/ios/chrome/app/strings/resources/ios_strings_ml.xtb index d3aea7c..0c6b783d 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ml.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ml.xtb
@@ -15,6 +15,7 @@ <translation id="3335947283844343239">അടച്ച ടാബ് വീണ്ടും തുറക്കുക</translation> <translation id="3414292259312108062">ഇത് നിങ്ങളുടെ <ph name="BEGIN_LINK" />Google സംരക്ഷിത പാസ്വേഡുകളിൽ<ph name="END_LINK" /> Chrome സംരക്ഷിക്കുകയും നിങ്ങൾക്കായി ഓട്ടോഫിൽ ചെയ്യുകയും ചെയ്യുന്നതിനാൽ ഓർക്കേണ്ടതില്ല.</translation> <translation id="3567664240939803299">ഈ സൈറ്റിന്റെ നിങ്ങളുടെ പാസ്വേഡ് Google Smart Lock സംരക്ഷിക്കണോ?</translation> +<translation id="3692781555820666866">പ്രവർത്തനക്ഷമമായിരിക്കുമ്പോൾ ഒമ്നിബോക്സ്, നിങ്ങൾക്ക് സമീപമുള്ള ഉപകരണങ്ങൾ ഉപയോഗിച്ച് വെബ് പേജുകളുടെ നിർദ്ദേശങ്ങൾ ഉൾപ്പെടുത്തും.</translation> <translation id="385051799172605136">പിന്നോട്ട്</translation> <translation id="4121993058175073134">നെറ്റ്-എക്സ്പോർട്ട് ഡാറ്റ അയയ്ക്കുന്നതിന്, ക്രമീകരണങ്ങളുടെ അപ്ലിക്കേഷനിൽ നിങ്ങളുടെ ഇമെയിൽ അക്കൗൺറ്റ് കോൺഫിഗർ ചെയ്യുക.</translation> <translation id="4399225372525667111">ഈ സൈറ്റിനായുള്ള URL ശരിയാണെന്നത് സ്ഥിരീകരിക്കാൻ Chrome-ന് കഴിയുന്നില്ല.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_mr.xtb b/ios/chrome/app/strings/resources/ios_strings_mr.xtb index 6183f56f..ecd7e42 100644 --- a/ios/chrome/app/strings/resources/ios_strings_mr.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_mr.xtb
@@ -15,6 +15,7 @@ <translation id="3335947283844343239">बंद केलेले टॅब पुन्हा उघडा</translation> <translation id="3414292259312108062">Chrome हे आपल्या <ph name="BEGIN_LINK" />Google ने जतन केलेले संकेतशब्द<ph name="END_LINK" /> मध्ये जतन करेल आणि आपल्यासाठी हे स्वयं-भरण करेल जेणेकरून आपल्याला हे लक्षात ठेवावे लागत नाही.</translation> <translation id="3567664240939803299">या साइटसाठी Google Smart Lock ने आपला संकेतशब्द जतन करावा असे आपण इच्छिता?</translation> +<translation id="3692781555820666866">सक्षम केलेले असताना, आपल्या जवळपास असलेले डिव्हाइसेस प्रसारित करतात त्या वेबपृष्ठांसाठी सूचना विविधोपयोगी क्षेत्रात समाविष्ट केल्या जातील.</translation> <translation id="385051799172605136">मागील</translation> <translation id="4121993058175073134">निव्वळ-निर्यात डेटा पाठविण्यासाठी, कृपया सेटिंग्ज अॅप मध्ये आपले ईमेल खाते कॉन्फिगर करा.</translation> <translation id="4399225372525667111">या साइटसाठी URL योग्य आहे हे सत्यापित करण्यासाठी Chrome अक्षम आहे.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ms.xtb b/ios/chrome/app/strings/resources/ios_strings_ms.xtb index a033505..96f1414a 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ms.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ms.xtb
@@ -15,6 +15,7 @@ <translation id="3335947283844343239">Buka Semula Tab Yang Ditutup</translation> <translation id="3414292259312108062">Chrome akan menyimpan ini dalam <ph name="BEGIN_LINK" />Kata laluan Google yang disimpan<ph name="END_LINK" /> anda dan auto isi untuk anda agar anda tidak perlu mengingati kata laluan itu sendiri.</translation> <translation id="3567664240939803299">Anda mahu Google Smart Lock menyimpan kata laluan untuk tapak ini?</translation> +<translation id="3692781555820666866">Apabila didayakan, kotak omni akan menyertakan cadangan untuk halaman web yang disiarkan oleh peranti berdekatan anda.</translation> <translation id="385051799172605136">Kembali</translation> <translation id="4121993058175073134">Tetapkn akaun e-mel anda dahulu dlm apl Tetapan utk mhantar data net-eksport.</translation> <translation id="4399225372525667111">Chrome tidak dapat mengesahkan bahawa URL untuk tapak web ini adalah betul.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_nl.xtb b/ios/chrome/app/strings/resources/ios_strings_nl.xtb index dba74a0..c46e4320 100644 --- a/ios/chrome/app/strings/resources/ios_strings_nl.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_nl.xtb
@@ -15,6 +15,7 @@ <translation id="3335947283844343239">Open gesloten tabblad opnieuw</translation> <translation id="3414292259312108062">Chrome slaat dit op in je <ph name="BEGIN_LINK" />door Google opgeslagen wachtwoorden<ph name="END_LINK" /> en vult dit automatisch voor je aan, zodat je je wachtwoord niet zelf hoeft te onthouden.</translation> <translation id="3567664240939803299">Wil je dat Google Smart Lock je wachtwoord voor deze site opslaat?</translation> +<translation id="3692781555820666866">Indien ingeschakeld, bevat de omnibox suggesties voor webpagina's die worden uitgezonden door apparaten bij jou in de buurt.</translation> <translation id="385051799172605136">Vorige</translation> <translation id="4121993058175073134">Als je netto-exportgegevens wilt verzenden, configureer je je e-mailaccount in de app Instellingen.</translation> <translation id="4399225372525667111">Chrome kan niet verifiëren of de URL voor deze site correct is.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_no.xtb b/ios/chrome/app/strings/resources/ios_strings_no.xtb index be062b88..28e629e 100644 --- a/ios/chrome/app/strings/resources/ios_strings_no.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_no.xtb
@@ -15,6 +15,7 @@ <translation id="3335947283844343239">Åpne lukkede faner igjen</translation> <translation id="3414292259312108062">Chrome lagrer dette i <ph name="BEGIN_LINK" />Google-lagrede passord<ph name="END_LINK" />. Deretter legges det inn automatisk, slik at du ikke trenger å huske det selv.</translation> <translation id="3567664240939803299">Vil du at Google Smart Lock skal lagre passordet ditt for dette nettstedet?</translation> +<translation id="3692781555820666866">Når dette er slått på, inneholder søkefeltet forslag til nettsider som kringkastes av enheter i nærheten.</translation> <translation id="385051799172605136">Tilbake</translation> <translation id="4121993058175073134">For å sende data for netteksport må du konfigurere e-postkontoen din i Innstillinger-appen.</translation> <translation id="4399225372525667111">Chrome kan ikke bekrefte at nettadressen for dette nettstedet er korrekt.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_pl.xtb b/ios/chrome/app/strings/resources/ios_strings_pl.xtb index 3ce2ef2..1e615fb0 100644 --- a/ios/chrome/app/strings/resources/ios_strings_pl.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_pl.xtb
@@ -15,6 +15,7 @@ <translation id="3335947283844343239">Otwórz ponownie zamkniętą kartę</translation> <translation id="3414292259312108062">Chrome umieści to hasło w <ph name="BEGIN_LINK" />zapisanych hasłach Google<ph name="END_LINK" /> i będzie je automatycznie wstawiać, więc nie musisz go zapamiętywać.</translation> <translation id="3567664240939803299">Czy Google Smart Lock ma zapisać hasło do tej strony?</translation> +<translation id="3692781555820666866">Po włączeniu tej funkcji omnibox będzie pokazywał sugestie stron internetowych transmitowanych przez urządzenia w pobliżu.</translation> <translation id="385051799172605136">Wstecz</translation> <translation id="4121993058175073134">Aby wysłać dane net-export, skonfiguruj konto e-mail w aplikacji Ustawienia.</translation> <translation id="4399225372525667111">Chrome nie może sprawdzić, czy URL tej strony jest prawidłowy.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_pt-BR.xtb b/ios/chrome/app/strings/resources/ios_strings_pt-BR.xtb index ea8a75b..64efa5f 100644 --- a/ios/chrome/app/strings/resources/ios_strings_pt-BR.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_pt-BR.xtb
@@ -15,6 +15,7 @@ <translation id="3335947283844343239">Reabrir guia fechada</translation> <translation id="3414292259312108062">O Chrome armazenará esta senha nas suas <ph name="BEGIN_LINK" />senhas salvas do Google<ph name="END_LINK" /> e a preencherá automaticamente para você, para que não precise se lembrar dela.</translation> <translation id="3567664240939803299">Deseja que o Google Smart Lock salve sua senha para este site?</translation> +<translation id="3692781555820666866">Quando ativada, a omnibox inclui sugestões de páginas da Web transmitidas por dispositivos perto de você.</translation> <translation id="385051799172605136">Voltar</translation> <translation id="4121993058175073134">Para enviar dados de exportação líquida, configure sua conta de e-mail no aplicativo "Configurações".</translation> <translation id="4399225372525667111">O Google Chrome não consegue confirmar se o URL deste site está correto.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_pt-PT.xtb b/ios/chrome/app/strings/resources/ios_strings_pt-PT.xtb index e12318b..87a84bfd 100644 --- a/ios/chrome/app/strings/resources/ios_strings_pt-PT.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_pt-PT.xtb
@@ -15,6 +15,7 @@ <translation id="3335947283844343239">Reabrir separador fechado</translation> <translation id="3414292259312108062">O Chrome armazena esta informação nas suas <ph name="BEGIN_LINK" />palavras-passe guardadas do Google<ph name="END_LINK" /> e preenche-a automaticamente por si para que não a tenha de memorizar.</translation> <translation id="3567664240939803299">Pretende que o Google Smart Lock guarde a palavra-passe p/ este site?</translation> +<translation id="3692781555820666866">Quando está ativada, a caixa geral inclui sugestões de páginas Web transmitidas por dispositivos perto de si.</translation> <translation id="385051799172605136">Anterior</translation> <translation id="4121993058175073134">P/enviar dados exp. da Int., config. a conta de email na ap. Definiç.</translation> <translation id="4399225372525667111">O Chrome não consegue verificar se o URL para este Web site está correto.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ro.xtb b/ios/chrome/app/strings/resources/ios_strings_ro.xtb index 511f781..7d447ae 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ro.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ro.xtb
@@ -15,6 +15,7 @@ <translation id="3335947283844343239">Redeschide fila închisă</translation> <translation id="3414292259312108062">Chrome o va stoca în <ph name="BEGIN_LINK" />parolele Google salvate<ph name="END_LINK" /> și o va completa automat ca să nu mai fie nevoie să o ții minte.</translation> <translation id="3567664240939803299">Dorești ca Google Smart Lock să îți salveze parola pentru acest site?</translation> +<translation id="3692781555820666866">Când este activat, caseta polivalentă va include sugestii pentru pagini web difuzate de dispozitivele din apropiere.</translation> <translation id="385051799172605136">Înapoi</translation> <translation id="4121993058175073134">Pentru trimitere date de export în rețea, configurați e-mailul în Setări.</translation> <translation id="4399225372525667111">Chrome nu poate verifica dacă adresa URL pentru acest site este corectă.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ru.xtb b/ios/chrome/app/strings/resources/ios_strings_ru.xtb index 50ba441..3d18e59 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ru.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ru.xtb
@@ -15,6 +15,7 @@ <translation id="3335947283844343239">Открыть закрытую вкладку</translation> <translation id="3414292259312108062">Этот пароль будет добавлен в <ph name="BEGIN_LINK" />список сохраненных паролей<ph name="END_LINK" />, чтобы Chrome мог автоматически вводить его в соответствующие поля.</translation> <translation id="3567664240939803299">Сохранить пароль для этого сайта в Google Smart Lock?</translation> +<translation id="3692781555820666866">Если функция включена, в омнибоксе будут предлагаться страницы с устройств поблизости</translation> <translation id="385051799172605136">Назад</translation> <translation id="4121993058175073134">Чтобы отправлять очищенные данные для экспорта, задайте соответствующие параметры аккаунта электронной почты в приложении "Настройки".</translation> <translation id="4399225372525667111">Не удалось проверить подлинность URL.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sk.xtb b/ios/chrome/app/strings/resources/ios_strings_sk.xtb index 54fb8dc9..39c555d 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sk.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sk.xtb
@@ -15,6 +15,7 @@ <translation id="3335947283844343239">Znova otvoriť zatvorenú kartu</translation> <translation id="3414292259312108062">Prehliadač Chrome ho uchová do priečinka <ph name="BEGIN_LINK" />Uložené heslá Google<ph name="END_LINK" /> a automaticky ho bude dopĺňať, takže si ho nemusíte pamätať.</translation> <translation id="3567664240939803299">Chcete, aby funkcia Google Smart Lock uložila vaše heslo pre tento web?</translation> +<translation id="3692781555820666866">Keď je tento príznak aktivovaný, všeobecné pole bude zahŕňať návrhy webových stránok, ktoré vysielajú zariadenia v okolí.</translation> <translation id="385051799172605136">Naspäť</translation> <translation id="4121993058175073134">Ak chcete odoslať údaje čistého exportu, v aplikácii Nastavenia nakonfigurujte svoj e-mailový účet.</translation> <translation id="4399225372525667111">Prehliadaču Chrome sa nepodarilo verifikovať, či je webová adresa pre tieto stránky správna.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sl.xtb b/ios/chrome/app/strings/resources/ios_strings_sl.xtb index 4f1f1c9..07ebfd3 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sl.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sl.xtb
@@ -15,6 +15,7 @@ <translation id="3335947283844343239">Znova odpri zaprt zavihek</translation> <translation id="3414292259312108062">Chrome will store this in your <ph name="BEGIN_LINK" />Google saved passwords<ph name="END_LINK" /> and autofill it for you so you don't have to remember it yourself.</translation> <translation id="3567664240939803299">Ali želite, da Google Smart Lock shrani geslo za to spletno mesto?</translation> +<translation id="3692781555820666866">Če je to omogočeno, iskalna vrstica vsebuje predloge za spletne strani, ki jih oddajajo naprave v vaši bližini.</translation> <translation id="385051799172605136">Nazaj</translation> <translation id="4121993058175073134">Če želite pošiljati podatke net-export, v aplikaciji Nastavitve konfigurirajte e-poštni račun.</translation> <translation id="4399225372525667111">Chrome ne more preveriti, ali je URL za to spletno mesto pravilen.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sr.xtb b/ios/chrome/app/strings/resources/ios_strings_sr.xtb index b40053b..55e83880 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sr.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sr.xtb
@@ -15,6 +15,7 @@ <translation id="3335947283844343239">Поново отвори затворену картицу</translation> <translation id="3414292259312108062">Chrome ће ово сачувати у вашим <ph name="BEGIN_LINK" />Google сачуваним лозинкама<ph name="END_LINK" /> и аутоматски унети тако да не морате да памтите.</translation> <translation id="3567664240939803299">Желите ли да Google Smart Lock сачува лозинку за овај сајт?</translation> +<translation id="3692781555820666866">Када га омогућите, омнибокс обухвата предлоге за веб-странице које емитују уређаји у близини.</translation> <translation id="385051799172605136">Назад</translation> <translation id="4121993058175073134">За слање података нето извоза подесите налог е-поште у апликацији Подешавања.</translation> <translation id="4399225372525667111">Chrome не може да верификује да је URL адреса овог сајта исправна.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sv.xtb b/ios/chrome/app/strings/resources/ios_strings_sv.xtb index 6eff805..f8f65a8 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sv.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sv.xtb
@@ -15,6 +15,7 @@ <translation id="3335947283844343239">Öppna stängd flik igen</translation> <translation id="3414292259312108062">Chrome vill spara lösenordet i <ph name="BEGIN_LINK" />lösenord som Google sparat<ph name="END_LINK" /> och fylla i det automatiskt så att du slipper komma ihåg det.</translation> <translation id="3567664240939803299">Vill du att Google Smart Lock sparar ditt lösenord för webbplatsen?</translation> +<translation id="3692781555820666866">När det här alternativet är aktiverat visas förslag på utsändningar av webbsidor från enheter i närheten.</translation> <translation id="385051799172605136">Bakåt</translation> <translation id="4121993058175073134">Ange ett e-postkonto i appen Inställningar om du vill skicka nätverksexportdata.</translation> <translation id="4399225372525667111">Chrome kan inte verifiera att den här webbplatsens webbadress är korrekt.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sw.xtb b/ios/chrome/app/strings/resources/ios_strings_sw.xtb index 70a5c55..3acca4f 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sw.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sw.xtb
@@ -15,6 +15,7 @@ <translation id="3335947283844343239">Fungua Tena Kichupo Kilichofugwa</translation> <translation id="3414292259312108062">Chrome itahifadhi hili katika <ph name="BEGIN_LINK" />manenosiri yako yaliyohifadhiwa na Google<ph name="END_LINK" /> na kukujazia kiotomatiki ili usihitaji kulikumbuka.</translation> <translation id="3567664240939803299">Je, ungependa Google Smart Lock ihifadhi nenosiri lako kwa ajili ya tovuti hii?</translation> +<translation id="3692781555820666866">Sanduku kuu linapowashwa litajumuisha mapendekezo ya utangazaji wa kurasa za wavuti kwa vifaa vilivyo karibu nawe.</translation> <translation id="385051799172605136">Nyuma</translation> <translation id="4121993058175073134">Ili kutuma data ya uhamishaji nje ya mtandao, tafadhali sanidi akaunti yako ya barua pepe katika programu ya Mipangilio.</translation> <translation id="4399225372525667111">Chrome haiwezi kuthibitisha kuwa URL ya tovuti hii ni sahihi.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ta.xtb b/ios/chrome/app/strings/resources/ios_strings_ta.xtb index b690b56..151ed9f3 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ta.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ta.xtb
@@ -15,6 +15,7 @@ <translation id="3335947283844343239">மூடப்பட்ட தாவலை மீண்டும் திற</translation> <translation id="3414292259312108062">Chrome இதனை, உங்கள் <ph name="BEGIN_LINK" />Google இல் சேமித்த கடவுச்சொற்களில்<ph name="END_LINK" /> சேமித்து, தானாகவே தன்னிரப்புவதால் கடவுச்சொல்லை நினைவில் வைத்திருக்க வேண்டிய அவசியமில்லை.</translation> <translation id="3567664240939803299">இந்தத் தளத்திற்கான கடவுச்சொல்லை Google Smart Lock சேமிக்க வேண்டுமா?</translation> +<translation id="3692781555820666866">இயக்கியிருக்கும் போது, உங்களுக்கு அருகிலுள்ள சாதனங்கள் வலைபரப்பும் இணையப் பக்கங்களுக்கான பரிந்துரைகளை, சர்வபுலம் சேர்க்கும்.</translation> <translation id="385051799172605136">முந்தைய பக்கம்</translation> <translation id="4121993058175073134">மொத்த-ஏற்றுமதி தரவை அனுப்புவதற்கு, அமைப்புகளின் பயன்பாட்டில் உங்கள் மின்னஞ்சல் கணக்கை உள்ளமைக்கவும்.</translation> <translation id="4399225372525667111">இந்தத் தளத்திற்கான URL சரியானது என்பதை Chrome ஆல் சரிபார்க்க முடியவில்லை.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_te.xtb b/ios/chrome/app/strings/resources/ios_strings_te.xtb index 3efa5728..c8582801 100644 --- a/ios/chrome/app/strings/resources/ios_strings_te.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_te.xtb
@@ -15,6 +15,7 @@ <translation id="3335947283844343239">మూసిన ట్యాబ్ను మళ్ళీ తెరువు</translation> <translation id="3414292259312108062">Chrome దీన్ని మీ <ph name="BEGIN_LINK" />Google సేవ్ చేసిన పాస్వర్డ్లు<ph name="END_LINK" />లో నిల్వ చేస్తుంది మరియు మీ కోసం దీన్ని స్వీయపూర్తి చేస్తుంది, కావున మీ అంతట మీరే దీన్ని గుర్తుంచుకోవాల్సిన అవసరం లేదు.</translation> <translation id="3567664240939803299">Google Smart Lock ఈ సైట్ కోసం మీ పాస్వర్డ్ను సేవ్ చేయాలని మీరు కోరుకుంటున్నారా?</translation> +<translation id="3692781555820666866">ప్రారంభించినప్పుడు, ఓమ్నిపెట్టె మీకు సమీపంలోని పరికరాల ద్వారా వెబ్ పేజీల ప్రసారం కోసం సూచనలను చేర్చుతుంది.</translation> <translation id="385051799172605136">వెనుకకు</translation> <translation id="4121993058175073134">నికర ఎగుమతి డేటాను పంపడానికి, దయచేసి సెట్టింగ్ల అనువర్తనంలో మీ ఇమెయిల్ ఖాతాను కాన్ఫిగర్ చేయండి.</translation> <translation id="4399225372525667111">ఈ సైట్ కోసం URL సరిగ్గా ఉందని Chrome ధృవీకరించలేకపోయింది.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_th.xtb b/ios/chrome/app/strings/resources/ios_strings_th.xtb index 8ad1611..5c7e3bd 100644 --- a/ios/chrome/app/strings/resources/ios_strings_th.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_th.xtb
@@ -15,6 +15,7 @@ <translation id="3335947283844343239">เปิดแท็บที่ปิดไปแล้วขึ้นใหม่</translation> <translation id="3414292259312108062">Chrome จะเก็บข้อมูลนี้ไว้ใน<ph name="BEGIN_LINK" />รหัสผ่านที่บันทึกไว้ของ Google<ph name="END_LINK" /> และป้อนให้คุณโดยอัตโนมัติ เพื่อให้คุณไม่ต้องจำเอง</translation> <translation id="3567664240939803299">คุณต้องการให้ Google Smart Lock บันทึกรหัสผ่านของคุณสำหรับเว็บไซต์นี้ไหม</translation> +<translation id="3692781555820666866">เมื่อเปิดใช้ แถบอเนกประสงค์จะรวมคำแนะนำการเผยแพร่หน้าเว็บจากอุปกรณ์ใกล้เคียง</translation> <translation id="385051799172605136">กลับ</translation> <translation id="4121993058175073134">หากต้องการส่งข้อมูล net-export โปรดกำหนดค่าบัญชีอีเมลของคุณในแอปการตั้งค่า</translation> <translation id="4399225372525667111">Chrome ไม่สามารถยืนยันได้ว่า URL ของไซต์นี้ถูกต้อง</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_tr.xtb b/ios/chrome/app/strings/resources/ios_strings_tr.xtb index cb9ee239..25141da 100644 --- a/ios/chrome/app/strings/resources/ios_strings_tr.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_tr.xtb
@@ -15,6 +15,7 @@ <translation id="3335947283844343239">Kapatılan Sekmeyi Tekrar Aç</translation> <translation id="3414292259312108062">Chrome, daha sonra hatırlamak zorunda kalmamanız için bunu <ph name="BEGIN_LINK" />Google kayıtlı şifrelerinizde<ph name="END_LINK" /> depolar ve sizin için otomatik olarak doldurur.</translation> <translation id="3567664240939803299">Google Smart Lock'un bu sitedeki şifrenizi kaydetmesini ister misiniz?</translation> +<translation id="3692781555820666866">Özellik etkinleştirildiğinde, yakınınızdaki cihazların yayınladığı web sayfalarına ilişkin öneriler çok amaçlı adres çubuğunda görünür.</translation> <translation id="385051799172605136">Geri</translation> <translation id="4121993058175073134">Net-export verilerini göndermek için lütfen Ayarlar uygulamasında e-posta hesabınızı yapılandırın.</translation> <translation id="4399225372525667111">Chrome bu sitenin URL'sinin doğruluğunu onaylayamıyor.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_uk.xtb b/ios/chrome/app/strings/resources/ios_strings_uk.xtb index f2a7051..9d5e341 100644 --- a/ios/chrome/app/strings/resources/ios_strings_uk.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_uk.xtb
@@ -15,6 +15,7 @@ <translation id="3335947283844343239">Знову відкрити закриту вкладку</translation> <translation id="3414292259312108062">Chrome додасть пароль у розділ <ph name="BEGIN_LINK" />Збережені паролі Google<ph name="END_LINK" /> й автоматично вводитиме його, тож вам не потрібно нічого запам’ятовувати.</translation> <translation id="3567664240939803299">Зберегти пароль для цього сайту в Google Smart Lock?</translation> +<translation id="3692781555820666866">Якщо ввімкнено, універсальне вікно пошуку включатиме пропозиції трансляції веб-сторінок пристроями поблизу.</translation> <translation id="385051799172605136">Назад</translation> <translation id="4121993058175073134">Щоб надсил. дані про чистий експорт, налашт. обл. запис у програмі Налаштування.</translation> <translation id="4399225372525667111">Chrome не може підтвердити правильність URL-адреси цього сайту.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_vi.xtb b/ios/chrome/app/strings/resources/ios_strings_vi.xtb index 857bfd7..4f9f9ee 100644 --- a/ios/chrome/app/strings/resources/ios_strings_vi.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_vi.xtb
@@ -15,6 +15,7 @@ <translation id="3335947283844343239">Mở lại Tab đã Đóng</translation> <translation id="3414292259312108062">Chrome sẽ lưu mật khẩu này vào <ph name="BEGIN_LINK" />Mật khẩu đã lưu của Google<ph name="END_LINK" /> và tự động điền mật khẩu cho bạn để bạn không phải tự ghi nhớ.</translation> <translation id="3567664240939803299">Bạn có muốn Google Smart Lock lưu mật khẩu của mình cho trang web này không?</translation> +<translation id="3692781555820666866">Khi được bật, thanh địa chỉ sẽ bao gồm đề xuất cho những trang web mà các thiết bị ở gần bạn truyền phát.</translation> <translation id="385051799172605136">Quay lại</translation> <translation id="4121993058175073134">Để gửi dữ liệu đã xuất, hãy định cấu hình tài khoản email trong ứng dụng Cài đặt.</translation> <translation id="4399225372525667111">Chrome không thể xác minh rằng URL của trang web này chính xác.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb b/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb index 248ffdc9..d0a51cc 100644 --- a/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb
@@ -15,6 +15,7 @@ <translation id="3335947283844343239">重新打开关闭的标签页</translation> <translation id="3414292259312108062">Chrome 会将此密码存储在 <ph name="BEGIN_LINK" />Google 保存的密码<ph name="END_LINK" />中,并会在需要时自动填充此密码,因此您记不住它也没有关系。</translation> <translation id="3567664240939803299">您想让 Google Smart Lock 保存您在此网站上使用的密码吗?</translation> +<translation id="3692781555820666866">启用此功能后,多功能框会推荐您附近的设备播报的网页。</translation> <translation id="385051799172605136">后退</translation> <translation id="4121993058175073134">要发送净导出数据,请在“设置”应用中指定您的电子邮件帐户。</translation> <translation id="4399225372525667111">Chrome 浏览器无法确认此网站的网址是否正确。</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb b/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb index 61cd027f..9ce279d 100644 --- a/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb
@@ -15,6 +15,7 @@ <translation id="3335947283844343239">重新開啟先前關閉的分頁</translation> <translation id="3414292259312108062">Chrome 會將這組密碼儲存在您的 <ph name="BEGIN_LINK" />Google 儲存的密碼<ph name="END_LINK" />中,並為您自動填入這組密碼,即使您記不住也沒關係。</translation> <translation id="3567664240939803299">您要讓 Google Smart Lock 儲存您在這個網站的密碼嗎?</translation> +<translation id="3692781555820666866">啟用後,網址列的建議項目會包含附近裝置播送的網頁。</translation> <translation id="385051799172605136">返回</translation> <translation id="4121993058175073134">如要傳送淨匯出資料,請在「設定」應用程式中設定您的電子郵件帳戶。</translation> <translation id="4399225372525667111">Chrome 無法驗證這個網站的網址是否正確。</translation>
diff --git a/ios/chrome/browser/BUILD.gn b/ios/chrome/browser/BUILD.gn index 26cfb533..4071cfd 100644 --- a/ios/chrome/browser/BUILD.gn +++ b/ios/chrome/browser/BUILD.gn
@@ -816,7 +816,7 @@ "//components/signin/ios/browser", "//components/signin/ios/browser:test_support", "//components/sync", - "//components/sync:test_support_sync_driver", + "//components/sync:test_support_driver", "//components/syncable_prefs", "//components/syncable_prefs:test_support", "//components/user_prefs",
diff --git a/ios/chrome/browser/browser_state/browser_state_info_cache.cc b/ios/chrome/browser/browser_state/browser_state_info_cache.cc index 074eb31b..28041e9 100644 --- a/ios/chrome/browser/browser_state/browser_state_info_cache.cc +++ b/ios/chrome/browser/browser_state/browser_state_info_cache.cc
@@ -54,8 +54,8 @@ cache->SetWithoutPathExpansion(key, info.release()); AddBrowserStateCacheKey(key); - FOR_EACH_OBSERVER(BrowserStateInfoCacheObserver, observer_list_, - OnBrowserStateAdded(browser_state_path)); + for (auto& observer : observer_list_) + observer.OnBrowserStateAdded(browser_state_path); } void BrowserStateInfoCache::AddObserver( @@ -82,8 +82,8 @@ cache->Remove(key, nullptr); sorted_keys_.erase(std::find(sorted_keys_.begin(), sorted_keys_.end(), key)); - FOR_EACH_OBSERVER(BrowserStateInfoCacheObserver, observer_list_, - OnBrowserStateWasRemoved(browser_state_path)); + for (auto& observer : observer_list_) + observer.OnBrowserStateWasRemoved(browser_state_path); } size_t BrowserStateInfoCache::GetNumberOfBrowserStates() const {
diff --git a/ios/chrome/browser/browsing_data/ios_chrome_browsing_data_remover.mm b/ios/chrome/browser/browsing_data/ios_chrome_browsing_data_remover.mm index 9db0148..574684a 100644 --- a/ios/chrome/browser/browsing_data/ios_chrome_browsing_data_remover.mm +++ b/ios/chrome/browser/browsing_data/ios_chrome_browsing_data_remover.mm
@@ -392,8 +392,8 @@ GetOnBrowsingDataRemovedCallbacks()->Notify(details); - FOR_EACH_OBSERVER(Observer, observer_list_, - OnIOSChromeBrowsingDataRemoverDone()); + for (auto& observer : observer_list_) + observer.OnIOSChromeBrowsingDataRemoverDone(); // History requests aren't happy if you delete yourself from the callback. // As such, we do a delete later.
diff --git a/ios/chrome/browser/find_in_page/find_in_page_controller.mm b/ios/chrome/browser/find_in_page/find_in_page_controller.mm index deab4906f..1817250 100644 --- a/ios/chrome/browser/find_in_page/find_in_page_controller.mm +++ b/ios/chrome/browser/find_in_page/find_in_page_controller.mm
@@ -9,7 +9,6 @@ #import <cmath> #include <memory> -#include "base/ios/ios_util.h" #include "base/logging.h" #include "base/mac/foundation_util.h" #include "base/mac/scoped_nsobject.h" @@ -351,16 +350,7 @@ NSDictionary* info = [note userInfo]; CGSize kbSize = [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size; - UIInterfaceOrientation orientation = - [[UIApplication sharedApplication] statusBarOrientation]; CGFloat kbHeight = kbSize.height; - // Prior to iOS 8, the keyboard frame was not dependent on interface - // orientation, so height and width need to be swapped in landscape mode. - if (UIInterfaceOrientationIsLandscape(orientation) && - !base::ios::IsRunningOnIOS8OrLater()) { - kbHeight = kbSize.width; - } - UIEdgeInsets insets = UIEdgeInsetsZero; insets.bottom = kbHeight; [_webViewProxy registerInsets:insets forCaller:self];
diff --git a/ios/chrome/browser/memory/memory_debugger.mm b/ios/chrome/browser/memory/memory_debugger.mm index f328a1d..da304df0 100644 --- a/ios/chrome/browser/memory/memory_debugger.mm +++ b/ios/chrome/browser/memory/memory_debugger.mm
@@ -8,7 +8,6 @@ #include <memory> -#include "base/ios/ios_util.h" #import "base/mac/scoped_nsobject.h" #import "ios/chrome/browser/memory/memory_metrics.h" #include "ios/chrome/browser/ui/ui_util.h" @@ -60,7 +59,6 @@ self.opaque = NO; [self addSubviews]; - [self adjustForOrientation:nil]; [self sizeToFit]; [self registerForNotifications]; } @@ -169,17 +167,6 @@ } - (void)registerForNotifications { - // On iOS 7, the screen coordinate system is not dependent on orientation so - // the debugger has to handle its own rotation. - if (!base::ios::IsRunningOnIOS8OrLater()) { - // Register to receive orientation notifications. - [[NSNotificationCenter defaultCenter] - addObserver:self - selector:@selector(adjustForOrientation:) - name:UIDeviceOrientationDidChangeNotification - object:nil]; - } - // Register to receive memory warning. [[NSNotificationCenter defaultCenter] addObserver:self @@ -379,45 +366,6 @@ [self setCenter:[superview center]]; } -- (void)adjustForOrientation:(NSNotification*)notification { - if (base::ios::IsRunningOnIOS8OrLater()) { - return; - } - UIInterfaceOrientation orientation = - [[UIApplication sharedApplication] statusBarOrientation]; - if (orientation == _currentOrientation) { - return; - } - _currentOrientation = orientation; - CGFloat angle; - switch (orientation) { - case UIInterfaceOrientationPortrait: - angle = 0; - break; - case UIInterfaceOrientationPortraitUpsideDown: - angle = M_PI; - break; - case UIInterfaceOrientationLandscapeLeft: - angle = -M_PI_2; - break; - case UIInterfaceOrientationLandscapeRight: - angle = M_PI_2; - break; - case UIInterfaceOrientationUnknown: - default: - angle = 0; - } - - // Since the debugger view is in screen coordinates and handles its own - // rotation via the |transform| property, the view's position after rotation - // can be unexpected and partially off-screen. Centering the view before - // rotating it ensures that the view remains within the bounds of the screen. - if (self.superview) { - self.center = self.superview.center; - } - self.transform = CGAffineTransformMakeRotation(angle); -} - #pragma mark Keyboard notification callbacks // Ensures the debugger is visible by shifting it up as the keyboard animates @@ -428,11 +376,8 @@ [userInfo valueForKey:UIKeyboardFrameEndUserInfoKey]; CGFloat keyboardHeight = CurrentKeyboardHeight(keyboardFrameValue); - // Get the coord of the bottom of the debugger's frame. This is orientation - // dependent on iOS 7 because the debugger is in screen coords. + // Get the coord of the bottom of the debugger's frame. CGFloat bottomOfFrame = CGRectGetMaxY(self.frame); - if (!base::ios::IsRunningOnIOS8OrLater() && IsLandscape()) - bottomOfFrame = CGRectGetMaxX(self.frame); // Shift the debugger up by the "height" of the keyboard, but since the // keyboard rect is in screen coords, use the orientation to find the height.
diff --git a/ios/chrome/browser/notification_promo_unittest.cc b/ios/chrome/browser/notification_promo_unittest.cc index 396b63d..d27c78a 100644 --- a/ios/chrome/browser/notification_promo_unittest.cc +++ b/ios/chrome/browser/notification_promo_unittest.cc
@@ -8,6 +8,7 @@ #include <vector> #include "base/json/json_reader.h" +#include "base/memory/ptr_util.h" #include "base/metrics/field_trial.h" #include "base/strings/string_number_conversions.h" #include "base/strings/string_util.h" @@ -53,8 +54,8 @@ public: NotificationPromoTest() : notification_promo_(&local_state_), - field_trial_list_( - new base::FieldTrialList(new base::MockEntropyProvider())), + field_trial_list_(base::MakeUnique<base::FieldTrialList>( + base::MakeUnique<base::MockEntropyProvider>())), received_notification_(false), start_(0.0), end_(0.0),
diff --git a/ios/chrome/browser/passwords/credential_manager.mm b/ios/chrome/browser/passwords/credential_manager.mm index 3d7b992..2a3b081 100644 --- a/ios/chrome/browser/passwords/credential_manager.mm +++ b/ios/chrome/browser/passwords/credential_manager.mm
@@ -6,7 +6,6 @@ #include <utility> -#include "base/ios/ios_util.h" #import "base/ios/weak_nsobject.h" #include "base/mac/bind_objc_block.h" #include "base/memory/scoped_vector.h" @@ -100,8 +99,7 @@ web::URLVerificationTrustLevel trust_level = web::URLVerificationTrustLevel::kNone; const GURL page_url(web_state()->GetCurrentURL(&trust_level)); - if (!base::ios::IsRunningOnIOS8OrLater() || - trust_level != web::URLVerificationTrustLevel::kAbsolute || + if (trust_level != web::URLVerificationTrustLevel::kAbsolute || !web::UrlHasWebScheme(page_url) || !web_state()->ContentIsHTML()) { return; }
diff --git a/ios/chrome/browser/reading_list/reading_list_model.cc b/ios/chrome/browser/reading_list/reading_list_model.cc index 073ec3b..3407c0eb 100644 --- a/ios/chrome/browser/reading_list/reading_list_model.cc +++ b/ios/chrome/browser/reading_list/reading_list_model.cc
@@ -32,8 +32,8 @@ ++current_batch_updates_count_; if (current_batch_updates_count_ == 1) { - FOR_EACH_OBSERVER(ReadingListModelObserver, observers_, - ReadingListModelBeganBatchUpdates(this)); + for (auto& observer : observers_) + observer.ReadingListModelBeganBatchUpdates(this); } return token; } @@ -42,7 +42,7 @@ DCHECK(IsPerformingBatchUpdates()); --current_batch_updates_count_; if (current_batch_updates_count_ == 0) { - FOR_EACH_OBSERVER(ReadingListModelObserver, observers_, - ReadingListModelCompletedBatchUpdates(this)); + for (auto& observer : observers_) + observer.ReadingListModelCompletedBatchUpdates(this); } }
diff --git a/ios/chrome/browser/reading_list/reading_list_model_impl.cc b/ios/chrome/browser/reading_list/reading_list_model_impl.cc index c3e068d6..7951622 100644 --- a/ios/chrome/browser/reading_list/reading_list_model_impl.cc +++ b/ios/chrome/browser/reading_list/reading_list_model_impl.cc
@@ -23,8 +23,8 @@ ReadingListModelImpl::~ReadingListModelImpl() {} void ReadingListModelImpl::Shutdown() { - FOR_EACH_OBSERVER(ReadingListModelObserver, observers_, - ReadingListModelBeingDeleted(this)); + for (auto& observer : observers_) + observer.ReadingListModelBeingDeleted(this); loaded_ = false; } @@ -92,27 +92,29 @@ auto result = std::find(unread_.begin(), unread_.end(), entry); if (result != unread_.end()) { - FOR_EACH_OBSERVER(ReadingListModelObserver, observers_, - ReadingListWillRemoveUnreadEntry( - this, std::distance(unread_.begin(), result))); + for (auto& observer : observers_) { + observer.ReadingListWillRemoveUnreadEntry( + this, std::distance(unread_.begin(), result)); + } unread_.erase(result); if (storageLayer_ && !IsPerformingBatchUpdates()) storageLayer_->SavePersistentUnreadList(unread_); - FOR_EACH_OBSERVER(ReadingListModelObserver, observers_, - ReadingListDidApplyChanges(this)); + for (auto& observer : observers_) + observer.ReadingListDidApplyChanges(this); return; } result = std::find(read_.begin(), read_.end(), entry); if (result != read_.end()) { - FOR_EACH_OBSERVER(ReadingListModelObserver, observers_, - ReadingListWillRemoveReadEntry( - this, std::distance(read_.begin(), result))); + for (auto& observer : observers_) { + observer.ReadingListWillRemoveReadEntry( + this, std::distance(read_.begin(), result)); + } read_.erase(result); if (storageLayer_ && !IsPerformingBatchUpdates()) storageLayer_->SavePersistentReadList(read_); - FOR_EACH_OBSERVER(ReadingListModelObserver, observers_, - ReadingListDidApplyChanges(this)); + for (auto& observer : observers_) + observer.ReadingListDidApplyChanges(this); return; } } @@ -123,16 +125,16 @@ DCHECK(loaded()); RemoveEntryByUrl(url); ReadingListEntry entry(url, title); - FOR_EACH_OBSERVER(ReadingListModelObserver, observers_, - ReadingListWillAddUnreadEntry(this, entry)); + for (auto& observer : observers_) + observer.ReadingListWillAddUnreadEntry(this, entry); unread_.insert(unread_.begin(), std::move(entry)); hasUnseen_ = true; if (storageLayer_ && !IsPerformingBatchUpdates()) { storageLayer_->SavePersistentUnreadList(unread_); storageLayer_->SavePersistentHasUnseen(true); } - FOR_EACH_OBSERVER(ReadingListModelObserver, observers_, - ReadingListDidApplyChanges(this)); + for (auto& observer : observers_) + observer.ReadingListDidApplyChanges(this); return *unread_.begin(); } @@ -143,9 +145,10 @@ if (result == unread_.end()) return; - FOR_EACH_OBSERVER( - ReadingListModelObserver, observers_, - ReadingListWillMoveEntry(this, std::distance(unread_.begin(), result))); + for (auto& observer : observers_) { + observer.ReadingListWillMoveEntry(this, + std::distance(unread_.begin(), result)); + } read_.insert(read_.begin(), std::move(*result)); unread_.erase(result); @@ -154,8 +157,8 @@ storageLayer_->SavePersistentUnreadList(unread_); storageLayer_->SavePersistentReadList(read_); } - FOR_EACH_OBSERVER(ReadingListModelObserver, observers_, - ReadingListDidApplyChanges(this)); + for (auto& observer : observers_) + observer.ReadingListDidApplyChanges(this); } void ReadingListModelImpl::SetEntryTitle(const GURL& url, @@ -165,27 +168,29 @@ auto result = std::find(unread_.begin(), unread_.end(), entry); if (result != unread_.end()) { - FOR_EACH_OBSERVER(ReadingListModelObserver, observers_, - ReadingListWillUpdateUnreadEntry( - this, std::distance(unread_.begin(), result))); + for (auto& observer : observers_) { + observer.ReadingListWillUpdateUnreadEntry( + this, std::distance(unread_.begin(), result)); + } result->SetTitle(title); if (storageLayer_ && !IsPerformingBatchUpdates()) storageLayer_->SavePersistentUnreadList(unread_); - FOR_EACH_OBSERVER(ReadingListModelObserver, observers_, - ReadingListDidApplyChanges(this)); + for (auto& observer : observers_) + observer.ReadingListDidApplyChanges(this); return; } result = std::find(read_.begin(), read_.end(), entry); if (result != read_.end()) { - FOR_EACH_OBSERVER(ReadingListModelObserver, observers_, - ReadingListWillUpdateReadEntry( - this, std::distance(read_.begin(), result))); + for (auto& observer : observers_) { + observer.ReadingListWillUpdateReadEntry( + this, std::distance(read_.begin(), result)); + } result->SetTitle(title); if (storageLayer_ && !IsPerformingBatchUpdates()) storageLayer_->SavePersistentReadList(read_); - FOR_EACH_OBSERVER(ReadingListModelObserver, observers_, - ReadingListDidApplyChanges(this)); + for (auto& observer : observers_) + observer.ReadingListDidApplyChanges(this); return; } } @@ -197,27 +202,29 @@ auto result = std::find(unread_.begin(), unread_.end(), entry); if (result != unread_.end()) { - FOR_EACH_OBSERVER(ReadingListModelObserver, observers_, - ReadingListWillUpdateUnreadEntry( - this, std::distance(unread_.begin(), result))); + for (auto& observer : observers_) { + observer.ReadingListWillUpdateUnreadEntry( + this, std::distance(unread_.begin(), result)); + } result->SetDistilledURL(distilled_url); if (storageLayer_ && !IsPerformingBatchUpdates()) storageLayer_->SavePersistentUnreadList(unread_); - FOR_EACH_OBSERVER(ReadingListModelObserver, observers_, - ReadingListDidApplyChanges(this)); + for (auto& observer : observers_) + observer.ReadingListDidApplyChanges(this); return; } result = std::find(read_.begin(), read_.end(), entry); if (result != read_.end()) { - FOR_EACH_OBSERVER(ReadingListModelObserver, observers_, - ReadingListWillUpdateReadEntry( - this, std::distance(read_.begin(), result))); + for (auto& observer : observers_) { + observer.ReadingListWillUpdateReadEntry( + this, std::distance(read_.begin(), result)); + } result->SetDistilledURL(distilled_url); if (storageLayer_ && !IsPerformingBatchUpdates()) storageLayer_->SavePersistentReadList(read_); - FOR_EACH_OBSERVER(ReadingListModelObserver, observers_, - ReadingListDidApplyChanges(this)); + for (auto& observer : observers_) + observer.ReadingListDidApplyChanges(this); return; } } @@ -230,27 +237,29 @@ auto result = std::find(unread_.begin(), unread_.end(), entry); if (result != unread_.end()) { - FOR_EACH_OBSERVER(ReadingListModelObserver, observers_, - ReadingListWillUpdateUnreadEntry( - this, std::distance(unread_.begin(), result))); + for (auto& observer : observers_) { + observer.ReadingListWillUpdateUnreadEntry( + this, std::distance(unread_.begin(), result)); + } result->SetDistilledState(state); if (storageLayer_ && !IsPerformingBatchUpdates()) storageLayer_->SavePersistentUnreadList(unread_); - FOR_EACH_OBSERVER(ReadingListModelObserver, observers_, - ReadingListDidApplyChanges(this)); + for (auto& observer : observers_) + observer.ReadingListDidApplyChanges(this); return; } result = std::find(read_.begin(), read_.end(), entry); if (result != read_.end()) { - FOR_EACH_OBSERVER(ReadingListModelObserver, observers_, - ReadingListWillUpdateReadEntry( - this, std::distance(read_.begin(), result))); + for (auto& observer : observers_) { + observer.ReadingListWillUpdateReadEntry( + this, std::distance(read_.begin(), result)); + } result->SetDistilledState(state); if (storageLayer_ && !IsPerformingBatchUpdates()) storageLayer_->SavePersistentReadList(read_); - FOR_EACH_OBSERVER(ReadingListModelObserver, observers_, - ReadingListDidApplyChanges(this)); + for (auto& observer : observers_) + observer.ReadingListDidApplyChanges(this); return; } };
diff --git a/ios/chrome/browser/signin/signin_manager_factory.cc b/ios/chrome/browser/signin/signin_manager_factory.cc index aef5a4b..201daba9 100644 --- a/ios/chrome/browser/signin/signin_manager_factory.cc +++ b/ios/chrome/browser/signin/signin_manager_factory.cc
@@ -75,8 +75,8 @@ void SigninManagerFactory::NotifyObserversOfSigninManagerCreationForTesting( SigninManager* manager) { - FOR_EACH_OBSERVER(SigninManagerFactoryObserver, observer_list_, - SigninManagerCreated(manager)); + for (auto& observer : observer_list_) + observer.SigninManagerCreated(manager); } std::unique_ptr<KeyedService> SigninManagerFactory::BuildServiceInstanceFor( @@ -91,17 +91,18 @@ ios::GaiaCookieManagerServiceFactory::GetForBrowserState( chrome_browser_state))); service->Initialize(GetApplicationContext()->GetLocalState()); - FOR_EACH_OBSERVER(SigninManagerFactoryObserver, observer_list_, - SigninManagerCreated(service.get())); + for (auto& observer : observer_list_) + observer.SigninManagerCreated(service.get()); return std::move(service); } void SigninManagerFactory::BrowserStateShutdown(web::BrowserState* context) { SigninManager* manager = static_cast<SigninManager*>(GetServiceForBrowserState(context, false)); - if (manager) - FOR_EACH_OBSERVER(SigninManagerFactoryObserver, observer_list_, - SigninManagerShutdown(manager)); + if (manager) { + for (auto& observer : observer_list_) + observer.SigninManagerShutdown(manager); + } BrowserStateKeyedServiceFactory::BrowserStateShutdown(context); }
diff --git a/ios/chrome/browser/voice/BUILD.gn b/ios/chrome/browser/voice/BUILD.gn new file mode 100644 index 0000000..5342d5a1 --- /dev/null +++ b/ios/chrome/browser/voice/BUILD.gn
@@ -0,0 +1,21 @@ +# 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. + +source_set("voice") { + sources = [ + "speech_input_locale.h", + "speech_input_locale_config.h", + "speech_input_locale_config.mm", + "speech_input_locale_config_impl.h", + "speech_input_locale_config_impl.mm", + "speech_input_locale_match_config.h", + "speech_input_locale_match_config.mm", + ] + + public_deps = [ + "//base", + "//ios/chrome/browser", + "//ios/public/provider/chrome/browser", + ] +}
diff --git a/ios/chrome/browser/voice/OWNERS b/ios/chrome/browser/voice/OWNERS new file mode 100644 index 0000000..cc50037 --- /dev/null +++ b/ios/chrome/browser/voice/OWNERS
@@ -0,0 +1,2 @@ +kkhorimoto@chromium.org +rohitrao@chromium.org
diff --git a/ios/chrome/browser/voice/speech_input_locale.h b/ios/chrome/browser/voice/speech_input_locale.h new file mode 100644 index 0000000..9fdb108 --- /dev/null +++ b/ios/chrome/browser/voice/speech_input_locale.h
@@ -0,0 +1,24 @@ +// 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 IOS_CHROME_BROWSER_VOICE_SPEECH_INPUT_LOCALE_H_ +#define IOS_CHROME_BROWSER_VOICE_SPEECH_INPUT_LOCALE_H_ + +#include <string> + +#include "base/strings/string16.h" + +namespace voice { + +// Struct describing a valid speech input locale. +typedef struct { + // The locale code in canonical form (e.g. "en-US", "fr-FR"). + std::string code; + // The display name (e.g. "English U.S.", "Français (France)"). + base::string16 display_name; +} SpeechInputLocale; + +} // namespace voice + +#endif // IOS_CHROME_BROWSER_VOICE_SPEECH_INPUT_LOCALE_H_
diff --git a/ios/chrome/browser/voice/speech_input_locale_config.h b/ios/chrome/browser/voice/speech_input_locale_config.h new file mode 100644 index 0000000..a8a5b48 --- /dev/null +++ b/ios/chrome/browser/voice/speech_input_locale_config.h
@@ -0,0 +1,57 @@ +// 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 IOS_CHROME_BROWSER_VOICE_SPEECH_INPUT_LOCALE_CONFIG_H_ +#define IOS_CHROME_BROWSER_VOICE_SPEECH_INPUT_LOCALE_CONFIG_H_ + +#include <string> +#include <vector> + +#include "base/macros.h" +#include "ios/chrome/browser/voice/speech_input_locale.h" + +namespace voice { + +class SpeechInputLocaleConfig; + +// Configuration object supplying information about valid locales for Voice +// Search. +class SpeechInputLocaleConfig { + public: + // Returns a pointer to the singleton object. + static SpeechInputLocaleConfig* GetInstance(); + + // Returns the default locale as determined by the system language. + virtual SpeechInputLocale GetDefaultLocale() const = 0; + + // Returns a reference to a vector of SpeechInputLocales sorted alphabetically + // by their display names. + virtual const std::vector<SpeechInputLocale>& GetAvailableLocales() const = 0; + + // Returns the SpeechInputLocale to use for |locale_code|. If |locale_code| is + // not contained in GetAvailableLocales()'s return value, then the + // SpeechInputLocaleConfig will attempt to match with an appropriate subsitute + // (e.g. "en-NZ" => "en-AU"). + virtual SpeechInputLocale GetLocaleForCode( + const std::string& locale_code) const = 0; + + // Returns a reference to an alphabetically sorted vector containing language + // codes (e.g. "en", "fr") that can be used to trigger Text To Speech results. + virtual const std::vector<std::string>& GetTextToSpeechLanguages() const = 0; + + // Returns whether the language portion of |locale_code| is an available + // TTS language. + virtual bool IsTextToSpeechEnabledForCode( + const std::string& locale_code) const = 0; + + protected: + SpeechInputLocaleConfig() = default; + virtual ~SpeechInputLocaleConfig() = default; + + DISALLOW_COPY_AND_ASSIGN(SpeechInputLocaleConfig); +}; + +} // namespace voice + +#endif // IOS_CHROME_BROWSER_VOICE_SPEECH_INPUT_LOCALE_CONFIG_H_
diff --git a/ios/chrome/browser/voice/speech_input_locale_config.mm b/ios/chrome/browser/voice/speech_input_locale_config.mm new file mode 100644 index 0000000..a4941b3 --- /dev/null +++ b/ios/chrome/browser/voice/speech_input_locale_config.mm
@@ -0,0 +1,16 @@ +// 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 "ios/chrome/browser/voice/speech_input_locale_config.h" + +#include "ios/chrome/browser/voice/speech_input_locale_config_impl.h" + +namespace voice { + +// static +SpeechInputLocaleConfig* SpeechInputLocaleConfig::GetInstance() { + return SpeechInputLocaleConfigImpl::GetInstance(); +} + +} // namespace voice
diff --git a/ios/chrome/browser/voice/speech_input_locale_config_impl.h b/ios/chrome/browser/voice/speech_input_locale_config_impl.h new file mode 100644 index 0000000..bd942c13 --- /dev/null +++ b/ios/chrome/browser/voice/speech_input_locale_config_impl.h
@@ -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. + +#ifndef IOS_CHROME_BROWSER_VOICE_SPEECH_INPUT_LOCALE_CONFIG_IMPL_H_ +#define IOS_CHROME_BROWSER_VOICE_SPEECH_INPUT_LOCALE_CONFIG_IMPL_H_ + +#include <map> + +#include "base/memory/singleton.h" +#include "ios/chrome/browser/voice/speech_input_locale_config.h" + +namespace base { +template <typename T> +struct DefaultSingletonTraits; +} // namespace base + +namespace voice { + +// A concrete implementation of SpeechInputLocaleConfig that uses the available +// language list from S3Kit and the speech input locale matching from +// SpeechInputLocaleMatches.plist. +class SpeechInputLocaleConfigImpl : public SpeechInputLocaleConfig { + public: + // Singleton getter for subclass. + static SpeechInputLocaleConfigImpl* GetInstance(); + + // Returns the available locale that matches |locale_code|. Defaults to en-US + // if a matching locale is not found. + SpeechInputLocale GetMatchingLocale(const std::string& locale_code) const; + + // SpeechInputLocaleConfig: + SpeechInputLocale GetDefaultLocale() const override; + const std::vector<SpeechInputLocale>& GetAvailableLocales() const override; + SpeechInputLocale GetLocaleForCode( + const std::string& locale_code) const override; + const std::vector<std::string>& GetTextToSpeechLanguages() const override; + bool IsTextToSpeechEnabledForCode( + const std::string& locale_code) const override; + + protected: + // The constructor is protected, as the object must be referenced via + // SpeechInputLocaleConfig's singleton getter. + SpeechInputLocaleConfigImpl(); + ~SpeechInputLocaleConfigImpl() override; + + private: + // Returns a canonical locale code created from combining the UI language + // preference from NSLocale's |+preferredLanguages| and the country code from + // the device's locale. + std::string GetDefaultLocaleCode() const; + + // Populates |available_locales_| using S3Kit's language manager. + void InitializeAvailableLocales(); + + // Adds local matching data from speech_input_matches.plist into + // |locale_indices_for_codes_|. + void InitializeLocaleMatches(); + + // Populates |text_to_speech_languages_| with the available locales. + void InitializeTextToSpeechLangauges(); + + friend struct base::DefaultSingletonTraits<SpeechInputLocaleConfigImpl>; + + // The list of available speech input locales. + std::vector<SpeechInputLocale> available_locales_; + // A map storing canonical locale codes with the index of their associated + // InputLocale within |available_locales_|. + std::map<std::string, size_t> locale_indices_for_codes_; + // A map storing the language portions of locale codes with the index of their + // associated InputLocale within |available_locales_|. + std::map<std::string, size_t> default_locale_indices_for_languages_; + // The languages available for Text To Speech search results. + std::vector<std::string> text_to_speech_languages_; + + DISALLOW_COPY_AND_ASSIGN(SpeechInputLocaleConfigImpl); +}; + +} // namespace voice + +#endif // IOS_CHROME_BROWSER_VOICE_SPEECH_INPUT_LOCALE_CONFIG_IMPL_H_
diff --git a/ios/chrome/browser/voice/speech_input_locale_config_impl.mm b/ios/chrome/browser/voice/speech_input_locale_config_impl.mm new file mode 100644 index 0000000..5be24ab --- /dev/null +++ b/ios/chrome/browser/voice/speech_input_locale_config_impl.mm
@@ -0,0 +1,193 @@ +// 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 "ios/chrome/browser/voice/speech_input_locale_config_impl.h" + +#import <Foundation/Foundation.h> + +#include "base/mac/bundle_locations.h" +#include "base/mac/foundation_util.h" +#include "base/mac/scoped_cftyperef.h" +#include "base/strings/string_split.h" +#include "base/strings/sys_string_conversions.h" +#import "ios/chrome/browser/voice/speech_input_locale_match_config.h" +#include "ios/public/provider/chrome/browser/chrome_browser_provider.h" +#include "ios/public/provider/chrome/browser/voice/voice_search_language.h" + +namespace { + +// Returns the language portion of |locale_code|. +std::string GetLanguageComponentForLocaleCode(const std::string& locale_code) { + std::vector<std::string> tokens = base::SplitString( + locale_code, "-", base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY); + if (tokens.empty()) + return std::string(); + return tokens[0]; +} + +// Use "en-US" as a default value. +const char kEnglishUS[] = "en-US"; + +// Converts |locale| to its canonical form and returns it as a std::string. +std::string GetCanonicalLocaleForLocale(NSString* locale_code) { + std::string locale = base::SysNSStringToUTF8( + [NSLocale canonicalLocaleIdentifierFromString:locale_code]); + return locale; +} + +} // namespace + +namespace voice { + +// static +SpeechInputLocaleConfigImpl* SpeechInputLocaleConfigImpl::GetInstance() { + return base::Singleton<SpeechInputLocaleConfigImpl>::get(); +} + +SpeechInputLocaleConfigImpl::SpeechInputLocaleConfigImpl() { + InitializeAvailableLocales(); + InitializeLocaleMatches(); + InitializeTextToSpeechLangauges(); +} + +SpeechInputLocaleConfigImpl::~SpeechInputLocaleConfigImpl() {} + +SpeechInputLocale SpeechInputLocaleConfigImpl::GetDefaultLocale() const { + return GetMatchingLocale(GetDefaultLocaleCode()); +} + +const std::vector<SpeechInputLocale>& +SpeechInputLocaleConfigImpl::GetAvailableLocales() const { + return available_locales_; +} + +SpeechInputLocale SpeechInputLocaleConfigImpl::GetLocaleForCode( + const std::string& locale_code) const { + auto index_iterator = locale_indices_for_codes_.find(locale_code); + if (index_iterator == locale_indices_for_codes_.end()) + return SpeechInputLocale(); + return available_locales_[index_iterator->second]; +} + +const std::vector<std::string>& +SpeechInputLocaleConfigImpl::GetTextToSpeechLanguages() const { + return text_to_speech_languages_; +} + +bool SpeechInputLocaleConfigImpl::IsTextToSpeechEnabledForCode( + const std::string& locale_code) const { + std::string language = GetLanguageComponentForLocaleCode(locale_code); + auto found_language = std::find(text_to_speech_languages_.begin(), + text_to_speech_languages_.end(), language); + return found_language != text_to_speech_languages_.end(); +} + +SpeechInputLocale SpeechInputLocaleConfigImpl::GetMatchingLocale( + const std::string& locale_code) const { + // Return exact match if one is found. + auto index_iterator = locale_indices_for_codes_.find(locale_code); + if (index_iterator != locale_indices_for_codes_.end()) + return available_locales_[index_iterator->second]; + // If there is no exact match, search for another locale with the same + // language component. + std::string language = GetLanguageComponentForLocaleCode(locale_code); + std::vector<size_t> locale_indices; + for (auto locale_index_for_code : locale_indices_for_codes_) { + std::string code = locale_index_for_code.first; + if (GetLanguageComponentForLocaleCode(code) == language) + locale_indices.push_back(locale_index_for_code.second); + } + // Use en-US as a default value. + auto it = locale_indices_for_codes_.find(kEnglishUS); + CHECK(it != locale_indices_for_codes_.end()); + size_t locale_index = it->second; + if (locale_indices.size() == 1) { + // If only one match was found, use its associated InputLocale. + locale_index = locale_indices[0]; + } else if (locale_indices.size() > 1) { + // If multiple regional differences for the same language are supported + // (e.g. en-US, en-GB, en-AU, en-NZ), use the default language mapping. + auto default_locale_iterator = + default_locale_indices_for_languages_.find(language); + if (default_locale_iterator != default_locale_indices_for_languages_.end()) + return available_locales_[default_locale_iterator->second]; + } + return available_locales_[locale_index]; +} + +std::string SpeechInputLocaleConfigImpl::GetDefaultLocaleCode() const { + // Default locale code is computed based on the UI language as reported by + // first object in +preferredLanguages and the device's locale (which + // corresponds to the "Region Format" in iOS' Settings UI). By combining + // the two signals, there is a better chance of setting the default + // Voice Search language to the regionally specific language variant. + // For example, users who selected English as the UI language and use + // South Africa Region Format (for date, time, currency, etc.) will + // default to use en-ZA, English (South Africa), as the Voice Search + // language. + NSLocale* current_locale = [NSLocale currentLocale]; + NSLocale* lang_pref_locale = [NSLocale + localeWithLocaleIdentifier:[[NSLocale preferredLanguages] firstObject]]; + // Prioritize the language portion of |language_pref_locale|. + NSString* language = [lang_pref_locale objectForKey:NSLocaleLanguageCode]; + if (!language.length) + language = [current_locale objectForKey:NSLocaleLanguageCode]; + DCHECK(language.length); + // Prioritize the country portion of |current_locale|. + NSString* country = [current_locale objectForKey:NSLocaleCountryCode]; + if (!country.length) + country = [lang_pref_locale objectForKey:NSLocaleCountryCode]; + DCHECK(country.length); + return GetCanonicalLocaleForLocale( + [NSString stringWithFormat:@"%@-%@", language, country]); +} + +void SpeechInputLocaleConfigImpl::InitializeAvailableLocales() { + NSArray* languages = + ios::GetChromeBrowserProvider()->GetAvailableVoiceSearchLanguages(); + for (VoiceSearchLanguage* language in languages) { + // Store the InputLocale in |available_locales_|. + std::string locale_code = GetCanonicalLocaleForLocale(language.identifier); + DCHECK(locale_code.length()); + voice::SpeechInputLocale locale; + locale.code = locale_code; + locale.display_name = base::SysNSStringToUTF16(language.displayName); + available_locales_.push_back(locale); + // Store the index of the InputLocale. + size_t locale_index = available_locales_.size() - 1; + locale_indices_for_codes_[locale_code] = locale_index; + // Store a mapping from |language.localizationPreference| to the locale. + std::string localization_preference = + GetCanonicalLocaleForLocale(language.localizationPreference); + if (localization_preference.length()) + locale_indices_for_codes_[localization_preference] = locale_index; + } +} + +void SpeechInputLocaleConfigImpl::InitializeLocaleMatches() { + NSArray* matches = [SpeechInputLocaleMatchConfig sharedInstance].matches; + for (SpeechInputLocaleMatch* match in matches) { + std::string locale = GetCanonicalLocaleForLocale(match.matchedLocaleCode); + auto index_iterator = locale_indices_for_codes_.find(locale); + if (index_iterator != locale_indices_for_codes_.end()) { + size_t index = index_iterator->second; + for (NSString* matching_locale in match.matchingLocaleCodes) { + // Record the regional variant matches. + std::string locale_code = GetCanonicalLocaleForLocale(matching_locale); + locale_indices_for_codes_[locale_code] = index; + } + for (NSString* matching_language in match.matchingLanguages) { + // Record the default locale for the matching languages. + std::string language = base::SysNSStringToUTF8(matching_language); + default_locale_indices_for_languages_[language] = index; + } + } + } +} + +void SpeechInputLocaleConfigImpl::InitializeTextToSpeechLangauges() { + text_to_speech_languages_ = {"de", "en", "es", "fr", "it", "ja", "ko"}; +} + +} // namespace voice
diff --git a/ios/chrome/browser/voice/speech_input_locale_match_config.h b/ios/chrome/browser/voice/speech_input_locale_match_config.h new file mode 100644 index 0000000..011f7ca --- /dev/null +++ b/ios/chrome/browser/voice/speech_input_locale_match_config.h
@@ -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. + +#ifndef IOS_CHROME_BROWSER_VOICE_SPEECH_INPUT_LOCALE_MATCH_CONFIG_H_ +#define IOS_CHROME_BROWSER_VOICE_SPEECH_INPUT_LOCALE_MATCH_CONFIG_H_ + +#import <Foundation/Foundation.h> + +#import "ios/chrome/browser/updatable_config/updatable_array.h" + +// Object containing matching locales for unsupported regional variants, loaded +// from SpeechInputLocaleMatches.plist. +@interface SpeechInputLocaleMatchConfig : UpdatableArray + +// Access to singleton object. ++ (instancetype)sharedInstance; + +// The SpeechInputLocaleMatches loaded from the plist. +@property(nonatomic, readonly) NSArray* matches; + +@end + +// Object describing the locale codes that match a single supported locale. +@interface SpeechInputLocaleMatch : NSObject + +// Designated initializer. +- (instancetype)initWithDictionary:(NSDictionary*)matchDict + NS_DESIGNATED_INITIALIZER; +- (instancetype)init NS_UNAVAILABLE; + +// The locale code that should be used as the default code for the locale codes +// found in |matchingLocaleCodes|. +@property(nonatomic, readonly) NSString* matchedLocaleCode; + +// The locale codes that should be matched with |matchedLocaleCode|. +@property(nonatomic, readonly) NSArray* matchingLocaleCodes; + +// The languages that use |matchedLocaleCode| as a default. +@property(nonatomic, readonly) NSArray* matchingLanguages; + +@end + +#endif // IOS_CHROME_BROWSER_VOICE_SPEECH_INPUT_LOCALE_MATCH_CONFIG_H_
diff --git a/ios/chrome/browser/voice/speech_input_locale_match_config.mm b/ios/chrome/browser/voice/speech_input_locale_match_config.mm new file mode 100644 index 0000000..73fcca6 --- /dev/null +++ b/ios/chrome/browser/voice/speech_input_locale_match_config.mm
@@ -0,0 +1,108 @@ +// 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 "ios/chrome/browser/voice/speech_input_locale_match_config.h" + +#import "base/mac/scoped_nsobject.h" + +namespace { + +// Name of plist file containing locale matches. +NSString* const kLocaleMatchesFilename = @"SpeechInputLocaleMatches.plist"; + +// Keys used in SpeechInputLocaleMatches.plist: +NSString* const kMatchedLocaleKey = @"Locale"; +NSString* const kMatchingLocalesKey = @"MatchingLocales"; +NSString* const kMatchingLanguagesKey = @"MatchingLanguages"; + +} // namespace + +#pragma mark - SpeechInputLocaleMatchConfig + +@interface SpeechInputLocaleMatchConfig () { + // Backing object for the property of the same name. + base::scoped_nsobject<NSArray> _matches; +} + +@end + +@implementation SpeechInputLocaleMatchConfig + ++ (instancetype)sharedInstance { + static SpeechInputLocaleMatchConfig* matchConfig; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + matchConfig = [[SpeechInputLocaleMatchConfig alloc] init]; + }); + return matchConfig; +} + +- (instancetype)init { + self = [super initWithAppId:nil version:nil plist:kLocaleMatchesFilename]; + if (self) + self.stopsUpdateChecksOnAppTermination = YES; + return self; +} + +#pragma mark Accessors + +- (NSArray*)matches { + if (!_matches) { + NSMutableArray* matches = [NSMutableArray array]; + for (NSDictionary* matchDict in [self arrayFromConfig]) { + SpeechInputLocaleMatch* match = [[[SpeechInputLocaleMatch alloc] + initWithDictionary:matchDict] autorelease]; + [matches addObject:match]; + } + _matches.reset([matches copy]); + } + return _matches; +} + +#pragma mark UpdatableConfigBase + +- (void)resourceDidUpdate:(NSNotification*)notification { + [super resourceDidUpdate:notification]; + _matches.reset(); +} + +@end + +#pragma mark - SpeechInputLocaleMatch + +@interface SpeechInputLocaleMatch () { + // Backing objects for properties of the same name. + base::scoped_nsobject<NSString> _matchedLocaleCode; + base::scoped_nsobject<NSArray> _matchingLocaleCodes; + base::scoped_nsobject<NSArray> _matchingLanguages; +} + +@end + +@implementation SpeechInputLocaleMatch + +- (instancetype)initWithDictionary:(NSDictionary*)matchDict { + if ((self = [super init])) { + _matchedLocaleCode.reset([matchDict[kMatchedLocaleKey] copy]); + _matchingLocaleCodes.reset([matchDict[kMatchingLocalesKey] copy]); + _matchingLanguages.reset([matchDict[kMatchingLanguagesKey] copy]); + } + return self; +} + +#pragma mark Accessors + +- (NSString*)matchedLocaleCode { + return _matchedLocaleCode; +} + +- (NSArray*)matchingLocaleCodes { + return _matchingLocaleCodes; +} + +- (NSArray*)matchingLanguages { + return _matchingLanguages; +} + +@end
diff --git a/ios/net/cookies/cookie_creation_time_manager_unittest.mm b/ios/net/cookies/cookie_creation_time_manager_unittest.mm index 54e5161..5a3f082 100644 --- a/ios/net/cookies/cookie_creation_time_manager_unittest.mm +++ b/ios/net/cookies/cookie_creation_time_manager_unittest.mm
@@ -47,16 +47,10 @@ base::Time now = base::Time::Now(); ASSERT_FALSE(time.is_null()); int64_t delta = (now - time).InMilliseconds(); - // On iOS 8, the range is (0, 1000) ms, but on earlier iOS versions the range - // is (-500, 500) ms. The intervals tested are actually 1200 ms to allow some - // imprecision. - if (base::ios::IsRunningOnIOS8OrLater()) { - EXPECT_GT(delta, -100); - EXPECT_LT(delta, 1100); - } else { - EXPECT_GT(delta, -600); - EXPECT_LT(delta, 600); - } + // On iOS 8, the range is (0, 1000) ms. The intervals tested are actually + // 1200 ms to allow some imprecision. + EXPECT_GT(delta, -100); + EXPECT_LT(delta, 1100); } TEST_F(CookieCreationTimeManagerTest, MakeUniqueCreationTime) {
diff --git a/ios/net/cookies/cookie_store_ios.mm b/ios/net/cookies/cookie_store_ios.mm index 2767aa2..fe45137 100644 --- a/ios/net/cookies/cookie_store_ios.mm +++ b/ios/net/cookies/cookie_store_ios.mm
@@ -87,13 +87,13 @@ } void NotificationTrampoline::NotifyCookiesChanged() { - FOR_EACH_OBSERVER(CookieNotificationObserver, observer_list_, - OnSystemCookiesChanged()); + for (auto& observer : observer_list_) + observer.OnSystemCookiesChanged(); } void NotificationTrampoline::NotifyCookiePolicyChanged() { - FOR_EACH_OBSERVER(CookieNotificationObserver, observer_list_, - OnSystemCookiePolicyChanged()); + for (auto& observer : observer_list_) + observer.OnSystemCookiePolicyChanged(); } NotificationTrampoline::NotificationTrampoline() { @@ -121,11 +121,8 @@ // Clears all cookies from the .binarycookies file. // Must be called from a thread where IO operations are allowed. // Preconditions: There must be no active WKWebViews present in the app. +// Note that the .binarycookies file is present only on iOS8+. void ClearAllCookiesFromBinaryCookiesFile() { - // The .binarycookies file is present only on iOS8+. - if (!base::ios::IsRunningOnIOS8OrLater()) { - return; - } base::FilePath path = GetBinaryCookiesFilePath(); if (base::PathExists(path)) { bool success = base::DeleteFile(path, false);
diff --git a/ios/public/provider/chrome/browser/BUILD.gn b/ios/public/provider/chrome/browser/BUILD.gn index 5c63258..c809db6 100644 --- a/ios/public/provider/chrome/browser/BUILD.gn +++ b/ios/public/provider/chrome/browser/BUILD.gn
@@ -2,6 +2,9 @@ # 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("//ios/public/provider/chrome/browser/build_config.gni") + source_set("browser") { sources = [ "browser_constants.cc", @@ -29,6 +32,12 @@ "ui/text_field_styling.h", "updatable_resource_provider.h", "updatable_resource_provider.mm", + "voice/voice_search_language.h", + "voice/voice_search_language.mm", + ] + + public_deps = [ + ":provider_flags", ] deps = [ @@ -42,6 +51,11 @@ ] } +buildflag_header("provider_flags") { + header = "provider_flags.h" + flags = [ "USE_IOS_INTERNAL_PROVIDER=$use_ios_internal_provider" ] +} + source_set("test_support") { testonly = true
diff --git a/ios/public/provider/chrome/browser/build_config.gni b/ios/public/provider/chrome/browser/build_config.gni new file mode 100644 index 0000000..64c1528d --- /dev/null +++ b/ios/public/provider/chrome/browser/build_config.gni
@@ -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. + +import("//build/config/chrome_build.gni") + +declare_args() { + # Control the provider API implementation used by Chromium on iOS. Requires + # access to the private Google-internal Chrome on iOS repository if true. + use_ios_internal_provider = is_chrome_branded +}
diff --git a/ios/public/provider/chrome/browser/chrome_browser_provider.h b/ios/public/provider/chrome/browser/chrome_browser_provider.h index 349e282..599c591 100644 --- a/ios/public/provider/chrome/browser/chrome_browser_provider.h +++ b/ios/public/provider/chrome/browser/chrome_browser_provider.h
@@ -140,6 +140,9 @@ // metrics_services_manager_client.h for details on |on_update_callback|. virtual bool IsSafeBrowsingEnabled(const base::Closure& on_update_callback); + // Returns the list of available voice search languages. + virtual NSArray* GetAvailableVoiceSearchLanguages() const; + // Returns the SyncedWindowDelegatesGetter implementation. virtual std::unique_ptr<sync_sessions::SyncedWindowDelegatesGetter> CreateSyncedWindowDelegatesGetter(ios::ChromeBrowserState* browser_state);
diff --git a/ios/public/provider/chrome/browser/chrome_browser_provider.mm b/ios/public/provider/chrome/browser/chrome_browser_provider.mm index 691be182..be7376d 100644 --- a/ios/public/provider/chrome/browser/chrome_browser_provider.mm +++ b/ios/public/provider/chrome/browser/chrome_browser_provider.mm
@@ -122,4 +122,8 @@ return nullptr; } +NSArray* ChromeBrowserProvider::GetAvailableVoiceSearchLanguages() const { + return [NSArray array]; +} + } // namespace ios
diff --git a/ios/public/provider/chrome/browser/signin/chrome_identity_service.mm b/ios/public/provider/chrome/browser/signin/chrome_identity_service.mm index 4a93ead..e19e1ee 100644 --- a/ios/public/provider/chrome/browser/signin/chrome_identity_service.mm +++ b/ios/public/provider/chrome/browser/signin/chrome_identity_service.mm
@@ -11,8 +11,8 @@ ChromeIdentityService::ChromeIdentityService() {} ChromeIdentityService::~ChromeIdentityService() { - FOR_EACH_OBSERVER(Observer, observer_list_, - OnChromeIdentityServiceWillBeDestroyed()); + for (auto& observer : observer_list_) + observer.OnChromeIdentityServiceWillBeDestroyed(); } void ChromeIdentityService::DismissDialogs() {} @@ -131,18 +131,20 @@ } void ChromeIdentityService::FireIdentityListChanged() { - FOR_EACH_OBSERVER(Observer, observer_list_, OnIdentityListChanged()); + for (auto& observer : observer_list_) + observer.OnIdentityListChanged(); } void ChromeIdentityService::FireAccessTokenRefreshFailed( ChromeIdentity* identity, NSDictionary* user_info) { - FOR_EACH_OBSERVER(Observer, observer_list_, - OnAccessTokenRefreshFailed(identity, user_info)); + for (auto& observer : observer_list_) + observer.OnAccessTokenRefreshFailed(identity, user_info); } void ChromeIdentityService::FireProfileDidUpdate(ChromeIdentity* identity) { - FOR_EACH_OBSERVER(Observer, observer_list_, OnProfileUpdate(identity)); + for (auto& observer : observer_list_) + observer.OnProfileUpdate(identity); } } // namespace ios
diff --git a/ios/public/provider/chrome/browser/test_chrome_browser_provider.h b/ios/public/provider/chrome/browser/test_chrome_browser_provider.h index 0d30d7bf..dffc1f6 100644 --- a/ios/public/provider/chrome/browser/test_chrome_browser_provider.h +++ b/ios/public/provider/chrome/browser/test_chrome_browser_provider.h
@@ -30,6 +30,7 @@ UpdatableResourceProvider* GetUpdatableResourceProvider() override; UITextField<TextFieldStyling>* CreateStyledTextField( CGRect frame) const override NS_RETURNS_RETAINED; + NSArray* GetAvailableVoiceSearchLanguages() const override; private: std::unique_ptr<ChromeIdentityService> chrome_identity_service_;
diff --git a/ios/public/provider/chrome/browser/test_chrome_browser_provider.mm b/ios/public/provider/chrome/browser/test_chrome_browser_provider.mm index 5cd4f0e..ee7cd51 100644 --- a/ios/public/provider/chrome/browser/test_chrome_browser_provider.mm +++ b/ios/public/provider/chrome/browser/test_chrome_browser_provider.mm
@@ -7,9 +7,11 @@ #import <UIKit/UIKit.h> #include "base/logging.h" +#include "base/mac/scoped_nsobject.h" #include "base/memory/ptr_util.h" #include "ios/public/provider/chrome/browser/signin/fake_chrome_identity_service.h" #import "ios/public/provider/chrome/browser/test_updatable_resource_provider.h" +#import "ios/public/provider/chrome/browser/voice/voice_search_language.h" @interface TestStyledTextField : UITextField<TextFieldStyling> @end @@ -58,4 +60,12 @@ return [[TestStyledTextField alloc] initWithFrame:frame]; } +NSArray* TestChromeBrowserProvider::GetAvailableVoiceSearchLanguages() const { + base::scoped_nsobject<VoiceSearchLanguage> en([[VoiceSearchLanguage alloc] + initWithIdentifier:@"en-US" + displayName:@"English (US)" + localizationPreference:nil]); + return @[ en ]; +} + } // namespace ios
diff --git a/ios/public/provider/chrome/browser/voice/voice_search_language.h b/ios/public/provider/chrome/browser/voice/voice_search_language.h new file mode 100644 index 0000000..afb44f4 --- /dev/null +++ b/ios/public/provider/chrome/browser/voice/voice_search_language.h
@@ -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. + +#ifndef IOS_PUBLIC_PROVIDER_CHROME_BROWSER_VOICE_VOICE_SEARCH_LANGUAGE_H_ +#define IOS_PUBLIC_PROVIDER_CHROME_BROWSER_VOICE_VOICE_SEARCH_LANGUAGE_H_ + +#import <Foundation/Foundation.h> + +// VoiceSearchLanguage stores data about a single supported voice search +// language. +@interface VoiceSearchLanguage : NSObject + +// Creates a VoiceSearchLanguageObject. |localizationPreferences| can be nil. +- (instancetype)initWithIdentifier:(NSString*)identifier + displayName:(NSString*)displayName + localizationPreference:(NSString*)localizationPreference + NS_DESIGNATED_INITIALIZER; + +- (instancetype)init NS_UNAVAILABLE; + +// The BCP 47 identifier for the language, e.g. "en-us" or "yue-hant-hk". +@property(nonatomic, readonly, copy) NSString* identifier; + +// The display name for the language. +@property(nonatomic, readonly, copy) NSString* displayName; + +// A localization identifier for use with +[NSBundle +// preferredLocalizationsFromArray:forPreferences:]. In general this is the +// same as |identifier|, but in some cases e.g. Chinese and Cantonese it +// differs to facilitate the NSBundle method. +@property(nonatomic, readonly, copy) NSString* localizationPreference; + +@end + +#endif // IOS_PUBLIC_PROVIDER_CHROME_BROWSER_VOICE_VOICE_SEARCH_LANGUAGE_H_
diff --git a/ios/public/provider/chrome/browser/voice/voice_search_language.mm b/ios/public/provider/chrome/browser/voice/voice_search_language.mm new file mode 100644 index 0000000..54907602 --- /dev/null +++ b/ios/public/provider/chrome/browser/voice/voice_search_language.mm
@@ -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. + +#import "ios/public/provider/chrome/browser/voice/voice_search_language.h" + +#include "base/mac/objc_property_releaser.h" + +@implementation VoiceSearchLanguage { + base::mac::ObjCPropertyReleaser _propertyReleaser_VoiceSearchLanguage; +} + +@synthesize identifier = _identifier; +@synthesize displayName = _displayName; +@synthesize localizationPreference = _localizationPreference; + +- (instancetype)initWithIdentifier:(NSString*)identifier + displayName:(NSString*)displayName + localizationPreference:(NSString*)localizationPreference { + if ((self = [super init])) { + _identifier = [identifier copy]; + _displayName = [displayName copy]; + _localizationPreference = [localizationPreference copy]; + + _propertyReleaser_VoiceSearchLanguage.Init(self, + [VoiceSearchLanguage class]); + } + return self; +} + +@end
diff --git a/ios/web/active_state_manager_impl.mm b/ios/web/active_state_manager_impl.mm index d2f3b1e..0fa3cda 100644 --- a/ios/web/active_state_manager_impl.mm +++ b/ios/web/active_state_manager_impl.mm
@@ -27,7 +27,8 @@ } ActiveStateManagerImpl::~ActiveStateManagerImpl() { - FOR_EACH_OBSERVER(Observer, observer_list_, WillBeDestroyed()); + for (auto& observer : observer_list_) + observer.WillBeDestroyed(); DCHECK(!IsActive()); } @@ -46,9 +47,11 @@ active_ = active; if (active) { - FOR_EACH_OBSERVER(Observer, observer_list_, OnActive()); + for (auto& observer : observer_list_) + observer.OnActive(); } else { - FOR_EACH_OBSERVER(Observer, observer_list_, OnInactive()); + for (auto& observer : observer_list_) + observer.OnInactive(); } }
diff --git a/ios/web/web_state/global_web_state_event_tracker.mm b/ios/web/web_state/global_web_state_event_tracker.mm index 267b38c..49ed9f9a 100644 --- a/ios/web/web_state/global_web_state_event_tracker.mm +++ b/ios/web/web_state/global_web_state_event_tracker.mm
@@ -112,42 +112,42 @@ void GlobalWebStateEventTracker::NavigationItemsPruned( WebState* web_state, size_t pruned_item_count) { - FOR_EACH_OBSERVER(GlobalWebStateObserver, observer_list_, - NavigationItemsPruned(web_state, pruned_item_count)); + for (auto& observer : observer_list_) + observer.NavigationItemsPruned(web_state, pruned_item_count); } void GlobalWebStateEventTracker::NavigationItemChanged(WebState* web_state) { - FOR_EACH_OBSERVER(GlobalWebStateObserver, observer_list_, - NavigationItemChanged(web_state)); + for (auto& observer : observer_list_) + observer.NavigationItemChanged(web_state); } void GlobalWebStateEventTracker::NavigationItemCommitted( WebState* web_state, const LoadCommittedDetails& load_details) { - FOR_EACH_OBSERVER(GlobalWebStateObserver, observer_list_, - NavigationItemCommitted(web_state, load_details)); + for (auto& observer : observer_list_) + observer.NavigationItemCommitted(web_state, load_details); } void GlobalWebStateEventTracker::WebStateDidStartLoading(WebState* web_state) { - FOR_EACH_OBSERVER(GlobalWebStateObserver, observer_list_, - WebStateDidStartLoading(web_state)); + for (auto& observer : observer_list_) + observer.WebStateDidStartLoading(web_state); } void GlobalWebStateEventTracker::WebStateDidStopLoading(WebState* web_state) { - FOR_EACH_OBSERVER(GlobalWebStateObserver, observer_list_, - WebStateDidStopLoading(web_state)); + for (auto& observer : observer_list_) + observer.WebStateDidStopLoading(web_state); } void GlobalWebStateEventTracker::PageLoaded( WebState* web_state, PageLoadCompletionStatus load_completion_status) { - FOR_EACH_OBSERVER(GlobalWebStateObserver, observer_list_, - PageLoaded(web_state, load_completion_status)); + for (auto& observer : observer_list_) + observer.PageLoaded(web_state, load_completion_status); } void GlobalWebStateEventTracker::WebStateDestroyed(WebState* web_state) { - FOR_EACH_OBSERVER(GlobalWebStateObserver, observer_list_, - WebStateDestroyed(web_state)); + for (auto& observer : observer_list_) + observer.WebStateDestroyed(web_state); } } // namespace web
diff --git a/ios/web/web_state/web_state_impl.mm b/ios/web/web_state/web_state_impl.mm index f43b3595..b39231d5 100644 --- a/ios/web/web_state/web_state_impl.mm +++ b/ios/web/web_state/web_state_impl.mm
@@ -76,11 +76,14 @@ // layer. DCHECK(!facade_delegate_); - FOR_EACH_OBSERVER(WebStateObserver, observers_, WebStateDestroyed()); - FOR_EACH_OBSERVER(WebStateObserver, observers_, ResetWebState()); - FOR_EACH_OBSERVER(WebStatePolicyDecider, policy_deciders_, - WebStateDestroyed()); - FOR_EACH_OBSERVER(WebStatePolicyDecider, policy_deciders_, ResetWebState()); + for (auto& observer : observers_) + observer.WebStateDestroyed(); + for (auto& observer : observers_) + observer.ResetWebState(); + for (auto& observer : policy_deciders_) + observer.WebStateDestroyed(); + for (auto& observer : policy_deciders_) + observer.ResetWebState(); DCHECK(script_command_callbacks_.empty()); if (request_tracker_.get()) CloseRequestTracker(); @@ -160,11 +163,13 @@ } void WebStateImpl::OnUrlHashChanged() { - FOR_EACH_OBSERVER(WebStateObserver, observers_, UrlHashChanged()); + for (auto& observer : observers_) + observer.UrlHashChanged(); } void WebStateImpl::OnHistoryStateChanged() { - FOR_EACH_OBSERVER(WebStateObserver, observers_, HistoryStateChanged()); + for (auto& observer : observers_) + observer.HistoryStateChanged(); } bool WebStateImpl::OnScriptCommandReceived(const std::string& command, @@ -192,9 +197,11 @@ facade_delegate_->OnLoadingStateChanged(); if (is_loading) { - FOR_EACH_OBSERVER(WebStateObserver, observers_, DidStartLoading()); + for (auto& observer : observers_) + observer.DidStartLoading(); } else { - FOR_EACH_OBSERVER(WebStateObserver, observers_, DidStopLoading()); + for (auto& observer : observers_) + observer.DidStopLoading(); } } @@ -217,8 +224,8 @@ PageLoadCompletionStatus load_completion_status = load_success ? PageLoadCompletionStatus::SUCCESS : PageLoadCompletionStatus::FAILURE; - FOR_EACH_OBSERVER(WebStateObserver, observers_, - PageLoaded(load_completion_status)); + for (auto& observer : observers_) + observer.PageLoaded(load_completion_status); } void WebStateImpl::OnFormActivityRegistered(const std::string& form_name, @@ -227,15 +234,16 @@ const std::string& value, int key_code, bool input_missing) { - FOR_EACH_OBSERVER(WebStateObserver, observers_, - FormActivityRegistered(form_name, field_name, type, value, - key_code, input_missing)); + for (auto& observer : observers_) { + observer.FormActivityRegistered(form_name, field_name, type, value, + key_code, input_missing); + } } void WebStateImpl::OnFaviconUrlUpdated( const std::vector<FaviconURL>& candidates) { - FOR_EACH_OBSERVER(WebStateObserver, observers_, - FaviconUrlUpdated(candidates)); + for (auto& observer : observers_) + observer.FaviconUrlUpdated(candidates); } void WebStateImpl::OnCredentialsRequested( @@ -244,44 +252,45 @@ bool unmediated, const std::vector<std::string>& federations, bool user_interaction) { - FOR_EACH_OBSERVER(WebStateObserver, observers_, - CredentialsRequested(request_id, source_url, unmediated, - federations, user_interaction)); + for (auto& observer : observers_) { + observer.CredentialsRequested(request_id, source_url, unmediated, + federations, user_interaction); + } } void WebStateImpl::OnSignedIn(int request_id, const GURL& source_url, const web::Credential& credential) { - FOR_EACH_OBSERVER(WebStateObserver, observers_, - SignedIn(request_id, source_url, credential)); + for (auto& observer : observers_) + observer.SignedIn(request_id, source_url, credential); } void WebStateImpl::OnSignedIn(int request_id, const GURL& source_url) { - FOR_EACH_OBSERVER(WebStateObserver, observers_, - SignedIn(request_id, source_url)); + for (auto& observer : observers_) + observer.SignedIn(request_id, source_url); } void WebStateImpl::OnSignedOut(int request_id, const GURL& source_url) { - FOR_EACH_OBSERVER(WebStateObserver, observers_, - SignedOut(request_id, source_url)); + for (auto& observer : observers_) + observer.SignedOut(request_id, source_url); } void WebStateImpl::OnSignInFailed(int request_id, const GURL& source_url, const web::Credential& credential) { - FOR_EACH_OBSERVER(WebStateObserver, observers_, - SignInFailed(request_id, source_url, credential)); + for (auto& observer : observers_) + observer.SignInFailed(request_id, source_url, credential); } void WebStateImpl::OnSignInFailed(int request_id, const GURL& source_url) { - FOR_EACH_OBSERVER(WebStateObserver, observers_, - SignInFailed(request_id, source_url)); + for (auto& observer : observers_) + observer.SignInFailed(request_id, source_url); } void WebStateImpl::OnDocumentSubmitted(const std::string& form_name, bool user_initiated) { - FOR_EACH_OBSERVER(WebStateObserver, observers_, - DocumentSubmitted(form_name, user_initiated)); + for (auto& observer : observers_) + observer.DocumentSubmitted(form_name, user_initiated); } NavigationManagerImpl& WebStateImpl::GetNavigationManagerImpl() { @@ -409,7 +418,8 @@ interstitial->DontProceed(); // Don't access |interstitial| after calling |DontProceed()|, as it triggers // deletion. - FOR_EACH_OBSERVER(WebStateObserver, observers_, InsterstitialDismissed()); + for (auto& observer : observers_) + observer.InsterstitialDismissed(); } [web_controller_ clearTransientContentView]; } @@ -660,8 +670,8 @@ } void WebStateImpl::OnProvisionalNavigationStarted(const GURL& url) { - FOR_EACH_OBSERVER(WebStateObserver, observers_, - ProvisionalNavigationStarted(url)); + for (auto& observer : observers_) + observer.ProvisionalNavigationStarted(url); } #pragma mark - NavigationManagerDelegate implementation @@ -678,18 +688,19 @@ } void WebStateImpl::OnNavigationItemsPruned(size_t pruned_item_count) { - FOR_EACH_OBSERVER(WebStateObserver, observers_, - NavigationItemsPruned(pruned_item_count)); + for (auto& observer : observers_) + observer.NavigationItemsPruned(pruned_item_count); } void WebStateImpl::OnNavigationItemChanged() { - FOR_EACH_OBSERVER(WebStateObserver, observers_, NavigationItemChanged()); + for (auto& observer : observers_) + observer.NavigationItemChanged(); } void WebStateImpl::OnNavigationItemCommitted( const LoadCommittedDetails& load_details) { - FOR_EACH_OBSERVER(WebStateObserver, observers_, - NavigationItemCommitted(load_details)); + for (auto& observer : observers_) + observer.NavigationItemCommitted(load_details); } WebState* WebStateImpl::GetWebState() {
diff --git a/ipc/ipc_channel.h b/ipc/ipc_channel.h index ba5ef42..2861d0f2 100644 --- a/ipc/ipc_channel.h +++ b/ipc/ipc_channel.h
@@ -297,12 +297,11 @@ static std::string GenerateVerifiedChannelID(const std::string& prefix); #endif - // Generates a pair of channel handles that can be used as the client and - // server ends of a ChannelMojo. |name_postfix| is appended to the end of the - // handle name to help identify the handles. + // Deprecated: Create a mojo::MessagePipe directly and release() its handles + // instead. // - // Note, when using ChannelMojo, |ChannelHandle::name| serves no functional - // purpose other than to identify the channel in logging. + // Generates a pair of channel handles that can be used as the client and + // server ends of a ChannelMojo. |name_postfix| is ignored. static void GenerateMojoChannelHandlePair( const std::string& name_postfix, IPC::ChannelHandle* handle0,
diff --git a/ipc/ipc_channel_common.cc b/ipc/ipc_channel_common.cc index adb0dd2..10b88b6 100644 --- a/ipc/ipc_channel_common.cc +++ b/ipc/ipc_channel_common.cc
@@ -55,22 +55,9 @@ IPC::ChannelHandle* handle0, IPC::ChannelHandle* handle1) { DCHECK_NE(handle0, handle1); - // |name| is only used for logging and to aid developers in debugging. It - // doesn't _need_ to be unique, but this string is probably more useful than a - // generic "ChannelMojo". -#if !defined(OS_NACL_SFI) - std::string name = "ChannelMojo-" + GenerateUniqueRandomChannelID(); -#else - std::string name = "ChannelMojo"; -#endif - if (!name_postfix.empty()) { - name += "-" + name_postfix; - } mojo::MessagePipe message_pipe; - *handle0 = ChannelHandle(name); - handle0->mojo_handle = message_pipe.handle0.release(); - *handle1 = ChannelHandle(name); - handle1->mojo_handle = message_pipe.handle1.release(); + *handle0 = ChannelHandle(message_pipe.handle0.release()); + *handle1 = ChannelHandle(message_pipe.handle1.release()); } Channel::~Channel() {
diff --git a/ipc/ipc_channel_handle.h b/ipc/ipc_channel_handle.h index 2e9dc3e..8a344fd3 100644 --- a/ipc/ipc_channel_handle.h +++ b/ipc/ipc_channel_handle.h
@@ -50,6 +50,17 @@ #endif // defined(OS_POSIX) ChannelHandle(mojo::MessagePipeHandle h) : mojo_handle(h) {} + bool is_mojo_channel_handle() const { +#if defined(OS_WIN) + if (pipe.handle) + return false; +#elif defined(OS_POSIX) + if (socket.fd != -1) + return false; +#endif // defined(OS_POSIX) + return mojo_handle.is_valid() && name.empty(); + } + std::string name; #if defined(OS_POSIX) base::FileDescriptor socket;
diff --git a/jingle/notifier/listener/fake_push_client.cc b/jingle/notifier/listener/fake_push_client.cc index 1106c932..7225408 100644 --- a/jingle/notifier/listener/fake_push_client.cc +++ b/jingle/notifier/listener/fake_push_client.cc
@@ -40,20 +40,20 @@ } void FakePushClient::EnableNotifications() { - FOR_EACH_OBSERVER(PushClientObserver, observers_, - OnNotificationsEnabled()); + for (auto& observer : observers_) + observer.OnNotificationsEnabled(); } void FakePushClient::DisableNotifications( NotificationsDisabledReason reason) { - FOR_EACH_OBSERVER(PushClientObserver, observers_, - OnNotificationsDisabled(reason)); + for (auto& observer : observers_) + observer.OnNotificationsDisabled(reason); } void FakePushClient::SimulateIncomingNotification( const Notification& notification) { - FOR_EACH_OBSERVER(PushClientObserver, observers_, - OnIncomingNotification(notification)); + for (auto& observer : observers_) + observer.OnIncomingNotification(notification); } const SubscriptionList& FakePushClient::subscriptions() const {
diff --git a/jingle/notifier/listener/non_blocking_push_client.cc b/jingle/notifier/listener/non_blocking_push_client.cc index 4596657a..4b7309d 100644 --- a/jingle/notifier/listener/non_blocking_push_client.cc +++ b/jingle/notifier/listener/non_blocking_push_client.cc
@@ -218,27 +218,28 @@ void NonBlockingPushClient::OnNotificationsEnabled() { DCHECK(thread_checker_.CalledOnValidThread()); - FOR_EACH_OBSERVER(PushClientObserver, observers_, - OnNotificationsEnabled()); + for (auto& observer : observers_) + observer.OnNotificationsEnabled(); } void NonBlockingPushClient::OnNotificationsDisabled( NotificationsDisabledReason reason) { DCHECK(thread_checker_.CalledOnValidThread()); - FOR_EACH_OBSERVER(PushClientObserver, observers_, - OnNotificationsDisabled(reason)); + for (auto& observer : observers_) + observer.OnNotificationsDisabled(reason); } void NonBlockingPushClient::OnIncomingNotification( const Notification& notification) { DCHECK(thread_checker_.CalledOnValidThread()); - FOR_EACH_OBSERVER(PushClientObserver, observers_, - OnIncomingNotification(notification)); + for (auto& observer : observers_) + observer.OnIncomingNotification(notification); } void NonBlockingPushClient::OnPingResponse() { DCHECK(thread_checker_.CalledOnValidThread()); - FOR_EACH_OBSERVER(PushClientObserver, observers_, OnPingResponse()); + for (auto& observer : observers_) + observer.OnPingResponse(); } } // namespace notifier
diff --git a/jingle/notifier/listener/xmpp_push_client.cc b/jingle/notifier/listener/xmpp_push_client.cc index 4083e23d..0fe9c88c 100644 --- a/jingle/notifier/listener/xmpp_push_client.cc +++ b/jingle/notifier/listener/xmpp_push_client.cc
@@ -63,41 +63,41 @@ DCHECK(thread_checker_.CalledOnValidThread()); DVLOG(1) << "Push: Transient disconnection"; base_task_.reset(); - FOR_EACH_OBSERVER(PushClientObserver, observers_, - OnNotificationsDisabled(TRANSIENT_NOTIFICATION_ERROR)); + for (auto& observer : observers_) + observer.OnNotificationsDisabled(TRANSIENT_NOTIFICATION_ERROR); } void XmppPushClient::OnCredentialsRejected() { DCHECK(thread_checker_.CalledOnValidThread()); DVLOG(1) << "Push: Credentials rejected"; base_task_.reset(); - FOR_EACH_OBSERVER( - PushClientObserver, observers_, - OnNotificationsDisabled(NOTIFICATION_CREDENTIALS_REJECTED)); + for (auto& observer : observers_) + observer.OnNotificationsDisabled(NOTIFICATION_CREDENTIALS_REJECTED); } void XmppPushClient::OnNotificationReceived( const Notification& notification) { DCHECK(thread_checker_.CalledOnValidThread()); - FOR_EACH_OBSERVER(PushClientObserver, observers_, - OnIncomingNotification(notification)); + for (auto& observer : observers_) + observer.OnIncomingNotification(notification); } void XmppPushClient::OnPingResponseReceived() { DCHECK(thread_checker_.CalledOnValidThread()); - FOR_EACH_OBSERVER(PushClientObserver, observers_, OnPingResponse()); + for (auto& observer : observers_) + observer.OnPingResponse(); } void XmppPushClient::OnSubscribed() { DCHECK(thread_checker_.CalledOnValidThread()); - FOR_EACH_OBSERVER(PushClientObserver, observers_, - OnNotificationsEnabled()); + for (auto& observer : observers_) + observer.OnNotificationsEnabled(); } void XmppPushClient::OnSubscriptionError() { DCHECK(thread_checker_.CalledOnValidThread()); - FOR_EACH_OBSERVER(PushClientObserver, observers_, - OnNotificationsDisabled(TRANSIENT_NOTIFICATION_ERROR)); + for (auto& observer : observers_) + observer.OnNotificationsDisabled(TRANSIENT_NOTIFICATION_ERROR); } void XmppPushClient::AddObserver(PushClientObserver* observer) {
diff --git a/media/BUILD.gn b/media/BUILD.gn index e723369..3b45d60 100644 --- a/media/BUILD.gn +++ b/media/BUILD.gn
@@ -911,3 +911,15 @@ "//third_party/libwebm", ] } + +if (proprietary_codecs) { + fuzzer_test("media_mp4_avcc_parser_fuzzer") { + sources = [ + "formats/mp4/mp4_avcc_parser_fuzzer.cc", + ] + deps = [ + ":media", + "//base", + ] + } +}
diff --git a/media/audio/audio_manager_base.cc b/media/audio/audio_manager_base.cc index 7d3c946..944156c 100644 --- a/media/audio/audio_manager_base.cc +++ b/media/audio/audio_manager_base.cc
@@ -320,7 +320,8 @@ void AudioManagerBase::NotifyAllOutputDeviceChangeListeners() { DCHECK(GetTaskRunner()->BelongsToCurrentThread()); DVLOG(1) << "Firing OnDeviceChange() notifications."; - FOR_EACH_OBSERVER(AudioDeviceListener, output_listeners_, OnDeviceChange()); + for (auto& observer : output_listeners_) + observer.OnDeviceChange(); } AudioParameters AudioManagerBase::GetDefaultOutputStreamParameters() {
diff --git a/media/base/android/java/src/org/chromium/media/MediaCodecBridge.java b/media/base/android/java/src/org/chromium/media/MediaCodecBridge.java index 69670921..d8fc12f 100644 --- a/media/base/android/java/src/org/chromium/media/MediaCodecBridge.java +++ b/media/base/android/java/src/org/chromium/media/MediaCodecBridge.java
@@ -27,7 +27,7 @@ */ @JNINamespace("media") class MediaCodecBridge { - private static final String TAG = "cr_media"; + private static final String TAG = "cr_MediaCodecBridge"; // Error code for MediaCodecBridge. Keep this value in sync with // MediaCodecStatus in media_codec_bridge.h. @@ -202,8 +202,7 @@ MediaCodecUtil.CodecCreationInfo info = new MediaCodecUtil.CodecCreationInfo(); try { if (direction == MediaCodecUtil.MEDIA_CODEC_ENCODER) { - info.mediaCodec = MediaCodec.createEncoderByType(mime); - info.supportsAdaptivePlayback = false; + info = MediaCodecUtil.createEncoder(mime); } else { // |isSecure| only applies to video decoders. info = MediaCodecUtil.createDecoder(mime, isSecure, requireSoftwareCodec); @@ -358,6 +357,7 @@ Bundle b = new Bundle(); b.putInt(MediaCodec.PARAMETER_KEY_VIDEO_BITRATE, bps); mMediaCodec.setParameters(b); + Log.v(TAG, "setVideoBitrate " + bps); } @TargetApi(Build.VERSION_CODES.KITKAT) @@ -545,6 +545,7 @@ format.setInteger(MediaFormat.KEY_FRAME_RATE, frameRate); format.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, iFrameInterval); format.setInteger(MediaFormat.KEY_COLOR_FORMAT, colorFormat); + Log.d(TAG, "video encoder format: " + format); return format; }
diff --git a/media/base/android/java/src/org/chromium/media/MediaCodecUtil.java b/media/base/android/java/src/org/chromium/media/MediaCodecUtil.java index f6d97af..e3673d7 100644 --- a/media/base/android/java/src/org/chromium/media/MediaCodecUtil.java +++ b/media/base/android/java/src/org/chromium/media/MediaCodecUtil.java
@@ -15,6 +15,8 @@ import org.chromium.base.annotations.JNINamespace; import org.chromium.base.annotations.MainDex; +import java.util.Arrays; +import java.util.List; import java.util.Locale; /** @@ -22,7 +24,7 @@ */ @JNINamespace("media") class MediaCodecUtil { - private static final String TAG = "MediaCodecUtil"; + private static final String TAG = "cr_MediaCodecUtil"; // Codec direction. Keep this in sync with media_codec_direction.h. static final int MEDIA_CODEC_DECODER = 0; @@ -356,4 +358,123 @@ } return false; } + + // List of supported HW encoders. + private static enum HWEncoderProperties { + QcomVp8(MimeTypes.VIDEO_VP8, "OMX.qcom.", Build.VERSION_CODES.KITKAT), + QcomH264(MimeTypes.VIDEO_H264, "OMX.qcom.", Build.VERSION_CODES.KITKAT), + ExynosVp8(MimeTypes.VIDEO_VP8, "OMX.Exynos.", Build.VERSION_CODES.M), + ExynosH264(MimeTypes.VIDEO_H264, "OMX.Exynos.", Build.VERSION_CODES.LOLLIPOP); + + private final String mMime; + private final String mPrefix; + private final int mMinSDK; + + private HWEncoderProperties(String mime, String prefix, int minSDK) { + this.mMime = mime; + this.mPrefix = prefix; + this.mMinSDK = minSDK; + } + + public String getMime() { + return mMime; + } + + public String getPrefix() { + return mPrefix; + } + + public int getMinSDK() { + return mMinSDK; + } + } + + // List of devices with poor H.264 encoder quality. + private static final String[] H264_ENCODER_MODEL_BLACKLIST = new String[] { + // HW H.264 encoder on below devices has poor bitrate control - actual bitrates deviates + // a lot from the target value. + "SAMSUNG-SGH-I337", "Nexus 7", "Nexus 4"}; + + /** + * Creates MediaCodec encoder. + * @param mime MIME type of the media. + * @return CodecCreationInfo object + */ + static CodecCreationInfo createEncoder(String mime) { + // Always return a valid CodecCreationInfo, its |mediaCodec| field will be null + // if we cannot create the codec. + CodecCreationInfo result = new CodecCreationInfo(); + + if (!isEncoderSupportedByDevice(mime)) return result; + + try { + result.mediaCodec = MediaCodec.createEncoderByType(mime); + result.supportsAdaptivePlayback = false; + } catch (Exception e) { + Log.e(TAG, "Failed to create MediaCodec: %s", mime, e); + } + return result; + } + + /** + * This is a way to blacklist misbehaving devices. + * @param mime MIME type as passed to mediaCodec.createEncoderByType(mime). + * @return true if this codec is supported for encoder on this device. + */ + @CalledByNative + static boolean isEncoderSupportedByDevice(String mime) { + // MediaCodec.setParameters is missing for JB and below, so bitrate + // can not be adjusted dynamically. + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) { + return false; + } + + // Check if this is supported HW encoder. + if (mime.equals(MimeTypes.VIDEO_H264)) { + // Check if device is in H.264 exception list. + List<String> exceptionModels = Arrays.asList(H264_ENCODER_MODEL_BLACKLIST); + if (exceptionModels.contains(Build.MODEL)) { + Log.w(TAG, "Model: " + Build.MODEL + " has blacklisted H.264 encoder."); + return false; + } + } + + MediaCodecListHelper codecListHelper = new MediaCodecListHelper(); + int codecCount = codecListHelper.getCodecCount(); + for (int i = 0; i < codecCount; ++i) { + MediaCodecInfo info = codecListHelper.getCodecInfoAt(i); + + if (!info.isEncoder() || isSoftwareCodec(info.getName())) continue; + + String encoderName = null; + for (String mimeType : info.getSupportedTypes()) { + if (mimeType.equalsIgnoreCase(mime)) { + encoderName = info.getName(); + break; + } + } + + if (encoderName == null) { + continue; // No HW support in this codec; try the next one. + } + + // Check if this is supported HW encoder. + for (HWEncoderProperties codecProperties : HWEncoderProperties.values()) { + if (!mime.equalsIgnoreCase(codecProperties.getMime())) continue; + + if (encoderName.startsWith(codecProperties.getPrefix())) { + if (Build.VERSION.SDK_INT < codecProperties.getMinSDK()) { + Log.w(TAG, "Codec " + encoderName + " is disabled due to SDK version " + + Build.VERSION.SDK_INT); + continue; + } + Log.d(TAG, "Found target encoder for mime " + mime + " : " + encoderName); + return true; + } + } + } + + Log.w(TAG, "HW encoder for " + mime + " is not available on this device."); + return false; + } }
diff --git a/media/base/android/media_codec_util.cc b/media/base/android/media_codec_util.cc index 568131e..467449f1 100644 --- a/media/base/android/media_codec_util.cc +++ b/media/base/android/media_codec_util.cc
@@ -87,6 +87,14 @@ return Java_MediaCodecUtil_isDecoderSupportedForDevice(env, j_mime); } +static bool IsEncoderSupportedByDevice(const std::string& android_mime_type) { + DCHECK(MediaCodecUtil::IsMediaCodecAvailable()); + JNIEnv* env = AttachCurrentThread(); + ScopedJavaLocalRef<jstring> j_mime = + ConvertUTF8ToJavaString(env, android_mime_type); + return Java_MediaCodecUtil_isEncoderSupportedByDevice(env, j_mime); +} + // static bool MediaCodecUtil::IsMediaCodecAvailable() { // Blacklist some devices on Jellybean as MediaCodec is buggy. @@ -212,6 +220,11 @@ } // static +bool MediaCodecUtil::IsH264EncoderAvailable() { + return IsMediaCodecAvailable() && IsEncoderSupportedByDevice(kAvcMimeType); +} + +// static bool MediaCodecUtil::IsSurfaceViewOutputSupported() { // Disable SurfaceView output for the Samsung Galaxy S3; it does not work // well enough for even 360p24 H264 playback. http://crbug.com/602870.
diff --git a/media/base/android/media_codec_util.h b/media/base/android/media_codec_util.h index 09e5ac84d1..59f07467b 100644 --- a/media/base/android/media_codec_util.h +++ b/media/base/android/media_codec_util.h
@@ -77,6 +77,9 @@ // Indicates if the vp9 decoder is available on this device. static bool IsVp9DecoderAvailable(); + // Indicates if the h264 encoder is available on this device. + static bool IsH264EncoderAvailable(); + // Indicates if SurfaceView and MediaCodec work well together on this device. static bool IsSurfaceViewOutputSupported();
diff --git a/media/base/demuxer_perftest.cc b/media/base/demuxer_perftest.cc index 8528d3a..0407c9b 100644 --- a/media/base/demuxer_perftest.cc +++ b/media/base/demuxer_perftest.cc
@@ -11,8 +11,8 @@ #include "base/macros.h" #include "base/message_loop/message_loop.h" #include "base/run_loop.h" -#include "base/single_thread_task_runner.h" #include "base/strings/string_number_conversions.h" +#include "base/threading/thread_task_runner_handle.h" #include "base/time/time.h" #include "build/build_config.h" #include "media/base/media.h" @@ -83,7 +83,8 @@ const std::vector<int>& counts() { return counts_; } private: - void OnReadDone(base::MessageLoop* message_loop, + void OnReadDone(scoped_refptr<base::SingleThreadTaskRunner> task_runner, + const base::Closure& quit_when_idle_closure, bool* end_of_stream, base::TimeDelta* timestamp, media::DemuxerStream::Status status, @@ -128,10 +129,12 @@ bool end_of_stream = false; base::TimeDelta timestamp; - streams_[index]->Read(base::Bind( - &StreamReader::OnReadDone, base::Unretained(this), - base::MessageLoop::current(), &end_of_stream, ×tamp)); - base::RunLoop().Run(); + base::RunLoop run_loop; + streams_[index]->Read( + base::Bind(&StreamReader::OnReadDone, base::Unretained(this), + base::ThreadTaskRunnerHandle::Get(), + run_loop.QuitWhenIdleClosure(), &end_of_stream, ×tamp)); + run_loop.Run(); CHECK(end_of_stream || timestamp != media::kNoTimestamp); end_of_stream_[index] = end_of_stream; @@ -148,7 +151,8 @@ } void StreamReader::OnReadDone( - base::MessageLoop* message_loop, + scoped_refptr<base::SingleThreadTaskRunner> task_runner, + const base::Closure& quit_when_idle_closure, bool* end_of_stream, base::TimeDelta* timestamp, media::DemuxerStream::Status status, @@ -157,8 +161,7 @@ CHECK(buffer.get()); *end_of_stream = buffer->end_of_stream(); *timestamp = *end_of_stream ? media::kNoTimestamp : buffer->timestamp(); - message_loop->task_runner()->PostTask( - FROM_HERE, base::MessageLoop::QuitWhenIdleClosure()); + task_runner->PostTask(FROM_HERE, quit_when_idle_closure); } int StreamReader::GetNextStreamIndexToRead() {
diff --git a/media/base/eme_constants.h b/media/base/eme_constants.h index 51b117f..acf1d6ea 100644 --- a/media/base/eme_constants.h +++ b/media/base/eme_constants.h
@@ -14,12 +14,7 @@ // Defines values that specify registered Initialization Data Types used // in Encrypted Media Extensions (EME). // http://w3c.github.io/encrypted-media/initdata-format-registry.html#registry -enum class EmeInitDataType { - UNKNOWN, - WEBM, - CENC, - KEYIDS -}; +enum class EmeInitDataType { UNKNOWN, WEBM, CENC, KEYIDS, MAX = KEYIDS }; // Defines bitmask values that specify codecs used in Encrypted Media Extension // (EME). Each value represents a codec within a specific container.
diff --git a/media/base/ipc/media_param_traits_macros.h b/media/base/ipc/media_param_traits_macros.h index 806d009..f7d1e74 100644 --- a/media/base/ipc/media_param_traits_macros.h +++ b/media/base/ipc/media_param_traits_macros.h
@@ -9,16 +9,22 @@ #include "media/base/audio_codecs.h" #include "media/base/audio_parameters.h" #include "media/base/buffering_state.h" +#include "media/base/cdm_key_information.h" #include "media/base/channel_layout.h" #include "media/base/decode_status.h" #include "media/base/decryptor.h" #include "media/base/demuxer_stream.h" +#include "media/base/eme_constants.h" +#include "media/base/encryption_scheme.h" +#include "media/base/media_keys.h" #include "media/base/sample_format.h" #include "media/base/subsample_entry.h" #include "media/base/video_capture_types.h" #include "media/base/video_codecs.h" #include "media/base/video_types.h" +// Enum traits. + IPC_ENUM_TRAITS_MAX_VALUE(media::AudioCodec, media::AudioCodec::kAudioCodecMax) IPC_ENUM_TRAITS_MAX_VALUE(media::AudioLatency::LatencyType, @@ -30,6 +36,9 @@ IPC_ENUM_TRAITS_MAX_VALUE(media::BufferingState, media::BufferingState::BUFFERING_STATE_MAX) +IPC_ENUM_TRAITS_MAX_VALUE(media::CdmKeyInformation::KeyStatus, + media::CdmKeyInformation::KEY_STATUS_MAX) + IPC_ENUM_TRAITS_MAX_VALUE(media::ChannelLayout, media::CHANNEL_LAYOUT_MAX) IPC_ENUM_TRAITS_MAX_VALUE(media::ColorSpace, media::COLOR_SPACE_MAX) @@ -49,6 +58,20 @@ IPC_ENUM_TRAITS_MAX_VALUE(media::DemuxerStream::Type, media::DemuxerStream::TYPE_MAX) +IPC_ENUM_TRAITS_MAX_VALUE(media::EmeInitDataType, media::EmeInitDataType::MAX) + +IPC_ENUM_TRAITS_MAX_VALUE(media::EncryptionScheme::CipherMode, + media::EncryptionScheme::CipherMode::CIPHER_MODE_MAX) + +IPC_ENUM_TRAITS_MAX_VALUE(media::MediaKeys::Exception, + media::MediaKeys::EXCEPTION_MAX) + +IPC_ENUM_TRAITS_MAX_VALUE(media::MediaKeys::MessageType, + media::MediaKeys::MESSAGE_TYPE_MAX) + +IPC_ENUM_TRAITS_MAX_VALUE(media::MediaKeys::SessionType, + media::MediaKeys::SESSION_TYPE_MAX) + IPC_ENUM_TRAITS_MAX_VALUE(media::SampleFormat, media::kSampleFormatMax) IPC_ENUM_TRAITS_MAX_VALUE(media::VideoCodec, media::kVideoCodecMax) @@ -61,6 +84,14 @@ IPC_ENUM_TRAITS_MAX_VALUE(media::VideoPixelStorage, media::PIXEL_STORAGE_MAX) +// Struct traits. + +IPC_STRUCT_TRAITS_BEGIN(media::CdmKeyInformation) + IPC_STRUCT_TRAITS_MEMBER(key_id) + IPC_STRUCT_TRAITS_MEMBER(status) + IPC_STRUCT_TRAITS_MEMBER(system_code) +IPC_STRUCT_TRAITS_END() + IPC_STRUCT_TRAITS_BEGIN(media::SubsampleEntry) IPC_STRUCT_TRAITS_MEMBER(clear_bytes) IPC_STRUCT_TRAITS_MEMBER(cypher_bytes)
diff --git a/media/formats/mp4/mp4_avcc_parser_fuzzer.cc b/media/formats/mp4/mp4_avcc_parser_fuzzer.cc new file mode 100644 index 0000000..4d5c574 --- /dev/null +++ b/media/formats/mp4/mp4_avcc_parser_fuzzer.cc
@@ -0,0 +1,21 @@ +// 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/logging.h" +#include "media/formats/mp4/box_definitions.h" + +extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { + media::mp4::AVCDecoderConfigurationRecord().Parse(data, size); + return 0; +} + +// For disabling noisy logging. +struct Environment { + Environment() { logging::SetMinLogLevel(logging::LOG_FATAL); } +}; + +Environment* env = new Environment();
diff --git a/media/gpu/android_video_encode_accelerator.cc b/media/gpu/android_video_encode_accelerator.cc index 023d235..77780dc 100644 --- a/media/gpu/android_video_encode_accelerator.cc +++ b/media/gpu/android_video_encode_accelerator.cc
@@ -108,8 +108,7 @@ const VideoCodec codec; const VideoCodecProfile profile; } kSupportedCodecs[] = {{kCodecVP8, VP8PROFILE_ANY}, - {kCodecH264, H264PROFILE_BASELINE}, - {kCodecH264, H264PROFILE_MAIN}}; + {kCodecH264, H264PROFILE_BASELINE}}; for (const auto& supported_codec : kSupportedCodecs) { if (supported_codec.codec == kCodecVP8 && @@ -117,6 +116,11 @@ continue; } + if (supported_codec.codec == kCodecH264 && + !MediaCodecUtil::IsH264EncoderAvailable()) { + continue; + } + if (VideoCodecBridge::IsKnownUnaccelerated(supported_codec.codec, MEDIA_CODEC_ENCODER)) { continue; @@ -161,15 +165,18 @@ // encoder before being returned any output frames, since the encoder may // need to hold onto some subset of inputs as reference pictures. uint32_t frame_input_count; + uint32_t i_frame_interval; if (output_profile == VP8PROFILE_ANY) { codec = kCodecVP8; mime_type = "video/x-vnd.on2.vp8"; frame_input_count = 1; + i_frame_interval = IFRAME_INTERVAL_VPX; } else if (output_profile == H264PROFILE_BASELINE || output_profile == H264PROFILE_MAIN) { codec = kCodecH264; mime_type = "video/avc"; frame_input_count = 30; + i_frame_interval = IFRAME_INTERVAL_H264; } else { return false; } @@ -190,7 +197,7 @@ } media_codec_.reset(VideoCodecBridge::CreateEncoder( codec, input_visible_size, initial_bitrate, INITIAL_FRAMERATE, - IFRAME_INTERVAL, pixel_format)); + i_frame_interval, pixel_format)); if (!media_codec_) { DLOG(ERROR) << "Failed to create/start the codec: " @@ -347,9 +354,10 @@ frame->coded_size().height()); RETURN_ON_FAILURE(converted, "Failed to I420ToNV12!", kPlatformFailureError); - fake_input_timestamp_ += base::TimeDelta::FromMicroseconds(1); + input_timestamp_ += base::TimeDelta::FromMicroseconds( + base::Time::kMicrosecondsPerSecond / INITIAL_FRAMERATE); status = media_codec_->QueueInputBuffer(input_buf_index, nullptr, queued_size, - fake_input_timestamp_); + input_timestamp_); UMA_HISTOGRAM_TIMES("Media.AVDA.InputQueueTime", base::Time::Now() - std::get<2>(input)); RETURN_ON_FAILURE(status == MEDIA_CODEC_OK, @@ -369,34 +377,33 @@ size_t offset = 0; size_t size = 0; bool key_frame = false; - do { - MediaCodecStatus status = - media_codec_->DequeueOutputBuffer(NoWaitTimeOut(), &buf_index, &offset, - &size, nullptr, nullptr, &key_frame); - switch (status) { - case MEDIA_CODEC_DEQUEUE_OUTPUT_AGAIN_LATER: - return; - case MEDIA_CODEC_ERROR: - RETURN_ON_FAILURE(false, "Codec error", kPlatformFailureError); - // Unreachable because of previous statement, but included for clarity. - return; + MediaCodecStatus status = + media_codec_->DequeueOutputBuffer(NoWaitTimeOut(), &buf_index, &offset, + &size, nullptr, nullptr, &key_frame); + switch (status) { + case MEDIA_CODEC_DEQUEUE_OUTPUT_AGAIN_LATER: + return; - case MEDIA_CODEC_OUTPUT_FORMAT_CHANGED: - break; + case MEDIA_CODEC_ERROR: + RETURN_ON_FAILURE(false, "Codec error", kPlatformFailureError); + // Unreachable because of previous statement, but included for clarity. + return; - case MEDIA_CODEC_OUTPUT_BUFFERS_CHANGED: - break; + case MEDIA_CODEC_OUTPUT_FORMAT_CHANGED: + return; - case MEDIA_CODEC_OK: - DCHECK_GE(buf_index, 0); - break; + case MEDIA_CODEC_OUTPUT_BUFFERS_CHANGED: + return; - default: - NOTREACHED(); - break; - } - } while (buf_index < 0); + case MEDIA_CODEC_OK: + DCHECK_GE(buf_index, 0); + break; + + default: + NOTREACHED(); + break; + } BitstreamBuffer bitstream_buffer = available_bitstream_buffers_.back(); available_bitstream_buffers_.pop_back(); @@ -407,8 +414,8 @@ "Encoded buffer too large: " << size << ">" << shm->size(), kPlatformFailureError); - MediaCodecStatus status = media_codec_->CopyFromOutputBuffer( - buf_index, offset, shm->memory(), size); + status = media_codec_->CopyFromOutputBuffer(buf_index, offset, shm->memory(), + size); RETURN_ON_FAILURE(status == MEDIA_CODEC_OK, "CopyFromOutputBuffer failed", kPlatformFailureError); media_codec_->ReleaseOutputBuffer(buf_index, false);
diff --git a/media/gpu/android_video_encode_accelerator.h b/media/gpu/android_video_encode_accelerator.h index ce0fb704..ef1ec841 100644 --- a/media/gpu/android_video_encode_accelerator.h +++ b/media/gpu/android_video_encode_accelerator.h
@@ -55,7 +55,9 @@ enum { // Arbitrary choice. INITIAL_FRAMERATE = 30, - // Until there are non-realtime users, no need for unrequested I-frames. + // Default I-Frame interval in seconds. + IFRAME_INTERVAL_H264 = 20, + IFRAME_INTERVAL_VPX = 100, IFRAME_INTERVAL = INT32_MAX, }; @@ -93,9 +95,8 @@ // The difference between number of buffers queued & dequeued at the codec. int32_t num_buffers_at_codec_; - // A monotonically-growing value, used as a fake timestamp just to keep things - // appearing to move forward. - base::TimeDelta fake_input_timestamp_; + // A monotonically-growing value. + base::TimeDelta input_timestamp_; // Resolution of input stream. Set once in initialization and not allowed to // change after.
diff --git a/media/mojo/clients/mojo_cdm.cc b/media/mojo/clients/mojo_cdm.cc index 805cbcb..41958e7e 100644 --- a/media/mojo/clients/mojo_cdm.cc +++ b/media/mojo/clients/mojo_cdm.cc
@@ -28,8 +28,8 @@ template <typename PromiseType> static void RejectPromise(std::unique_ptr<PromiseType> promise, mojom::CdmPromiseResultPtr result) { - promise->reject(static_cast<MediaKeys::Exception>(result->exception), - result->system_code, result->error_message); + promise->reject(result->exception, result->system_code, + result->error_message); } // static @@ -153,10 +153,9 @@ DCHECK(thread_checker_.CalledOnValidThread()); remote_cdm_->CreateSessionAndGenerateRequest( - static_cast<mojom::ContentDecryptionModule::SessionType>(session_type), - static_cast<mojom::ContentDecryptionModule::InitDataType>(init_data_type), - init_data, base::Bind(&MojoCdm::OnNewSessionCdmPromiseResult, - base::Unretained(this), base::Passed(&promise))); + session_type, init_data_type, init_data, + base::Bind(&MojoCdm::OnNewSessionCdmPromiseResult, base::Unretained(this), + base::Passed(&promise))); } void MojoCdm::LoadSession(SessionType session_type, @@ -166,9 +165,9 @@ DCHECK(thread_checker_.CalledOnValidThread()); remote_cdm_->LoadSession( - static_cast<mojom::ContentDecryptionModule::SessionType>(session_type), - session_id, base::Bind(&MojoCdm::OnNewSessionCdmPromiseResult, - base::Unretained(this), base::Passed(&promise))); + session_type, session_id, + base::Bind(&MojoCdm::OnNewSessionCdmPromiseResult, base::Unretained(this), + base::Passed(&promise))); } void MojoCdm::UpdateSession(const std::string& session_id, @@ -235,13 +234,12 @@ } void MojoCdm::OnSessionMessage(const std::string& session_id, - mojom::CdmMessageType message_type, + MessageType message_type, const std::vector<uint8_t>& message) { DVLOG(2) << __FUNCTION__; DCHECK(thread_checker_.CalledOnValidThread()); - session_message_cb_.Run( - session_id, static_cast<MediaKeys::MessageType>(message_type), message); + session_message_cb_.Run(session_id, message_type, message); } void MojoCdm::OnSessionClosed(const std::string& session_id) {
diff --git a/media/mojo/clients/mojo_cdm.h b/media/mojo/clients/mojo_cdm.h index e9578654..2d7edde 100644 --- a/media/mojo/clients/mojo_cdm.h +++ b/media/mojo/clients/mojo_cdm.h
@@ -36,6 +36,8 @@ public CdmContext, public mojom::ContentDecryptionModuleClient { public: + using MessageType = MediaKeys::MessageType; + static void Create( const std::string& key_system, const GURL& security_origin, @@ -90,7 +92,7 @@ // mojom::ContentDecryptionModuleClient implementation. void OnSessionMessage(const std::string& session_id, - mojom::CdmMessageType message_type, + MessageType message_type, const std::vector<uint8_t>& message) final; void OnSessionClosed(const std::string& session_id) final; void OnSessionKeysChange(
diff --git a/media/mojo/clients/mojo_decryptor.cc b/media/mojo/clients/mojo_decryptor.cc index 74ce2d2..53a574c 100644 --- a/media/mojo/clients/mojo_decryptor.cc +++ b/media/mojo/clients/mojo_decryptor.cc
@@ -176,7 +176,7 @@ DCHECK(thread_checker_.CalledOnValidThread()); if (buffer.is_null()) { - decrypt_cb.Run(static_cast<Decryptor::Status>(status), nullptr); + decrypt_cb.Run(status, nullptr); return; } @@ -187,7 +187,7 @@ return; } - decrypt_cb.Run(static_cast<Decryptor::Status>(status), media_buffer); + decrypt_cb.Run(status, media_buffer); } void MojoDecryptor::OnAudioDecoded( @@ -202,7 +202,7 @@ for (size_t i = 0; i < audio_buffers.size(); ++i) audio_frames.push_back(audio_buffers[i].To<scoped_refptr<AudioBuffer>>()); - audio_decode_cb.Run(static_cast<Decryptor::Status>(status), audio_frames); + audio_decode_cb.Run(status, audio_frames); } void MojoDecryptor::OnVideoDecoded(const VideoDecodeCB& video_decode_cb, @@ -213,7 +213,7 @@ DCHECK(thread_checker_.CalledOnValidThread()); if (video_frame.is_null()) { - video_decode_cb.Run(static_cast<Decryptor::Status>(status), nullptr); + video_decode_cb.Run(status, nullptr); return; } @@ -228,7 +228,7 @@ &MojoDecryptor::ReleaseSharedBuffer, weak_factory_.GetWeakPtr())); } - video_decode_cb.Run(static_cast<Decryptor::Status>(status), frame); + video_decode_cb.Run(status, frame); } void MojoDecryptor::ReleaseSharedBuffer(mojo::ScopedSharedBufferHandle buffer,
diff --git a/media/mojo/common/media_type_converters.cc b/media/mojo/common/media_type_converters.cc index e07e0dc..8ca720e1 100644 --- a/media/mojo/common/media_type_converters.cc +++ b/media/mojo/common/media_type_converters.cc
@@ -16,7 +16,6 @@ #include "media/base/decoder_buffer.h" #include "media/base/decrypt_config.h" #include "media/base/encryption_scheme.h" -#include "media/base/media_keys.h" #include "media/base/subsample_entry.h" #include "media/base/video_decoder_config.h" #include "media/base/video_frame.h" @@ -25,93 +24,6 @@ namespace mojo { -#define ASSERT_ENUM_EQ(media_enum, media_prefix, mojo_prefix, value) \ - static_assert(media::media_prefix##value == \ - static_cast<media::media_enum>( \ - media::mojom::media_enum::mojo_prefix##value), \ - "Mismatched enum: " #media_prefix #value " != " #media_enum \ - "::" #mojo_prefix #value) - -#define ASSERT_ENUM_EQ_RAW(media_enum, media_enum_value, mojo_enum_value) \ - static_assert(media::media_enum_value == static_cast<media::media_enum>( \ - media::mojom::mojo_enum_value), \ - "Mismatched enum: " #media_enum_value " != " #mojo_enum_value) - -// CipherMode -ASSERT_ENUM_EQ_RAW(EncryptionScheme::CipherMode, - EncryptionScheme::CipherMode::CIPHER_MODE_UNENCRYPTED, - CipherMode::UNENCRYPTED); -ASSERT_ENUM_EQ_RAW(EncryptionScheme::CipherMode, - EncryptionScheme::CipherMode::CIPHER_MODE_AES_CTR, - CipherMode::AES_CTR); -ASSERT_ENUM_EQ_RAW(EncryptionScheme::CipherMode, - EncryptionScheme::CipherMode::CIPHER_MODE_AES_CBC, - CipherMode::AES_CBC); -ASSERT_ENUM_EQ_RAW(EncryptionScheme::CipherMode, - EncryptionScheme::CipherMode::CIPHER_MODE_MAX, - CipherMode::MAX); - -// CdmException -#define ASSERT_CDM_EXCEPTION(value) \ - static_assert( \ - media::MediaKeys::value == static_cast<media::MediaKeys::Exception>( \ - media::mojom::CdmException::value), \ - "Mismatched CDM Exception") -ASSERT_CDM_EXCEPTION(NOT_SUPPORTED_ERROR); -ASSERT_CDM_EXCEPTION(INVALID_STATE_ERROR); -ASSERT_CDM_EXCEPTION(INVALID_ACCESS_ERROR); -ASSERT_CDM_EXCEPTION(QUOTA_EXCEEDED_ERROR); -ASSERT_CDM_EXCEPTION(UNKNOWN_ERROR); -ASSERT_CDM_EXCEPTION(CLIENT_ERROR); -ASSERT_CDM_EXCEPTION(OUTPUT_ERROR); - -// CDM Session Type -#define ASSERT_CDM_SESSION_TYPE(value) \ - static_assert( \ - media::MediaKeys::value == \ - static_cast<media::MediaKeys::SessionType>( \ - media::mojom::ContentDecryptionModule::SessionType::value), \ - "Mismatched CDM Session Type") -ASSERT_CDM_SESSION_TYPE(TEMPORARY_SESSION); -ASSERT_CDM_SESSION_TYPE(PERSISTENT_LICENSE_SESSION); -ASSERT_CDM_SESSION_TYPE(PERSISTENT_RELEASE_MESSAGE_SESSION); - -// CDM InitDataType -#define ASSERT_CDM_INIT_DATA_TYPE(value) \ - static_assert( \ - media::EmeInitDataType::value == \ - static_cast<media::EmeInitDataType>( \ - media::mojom::ContentDecryptionModule::InitDataType::value), \ - "Mismatched CDM Init Data Type") -ASSERT_CDM_INIT_DATA_TYPE(UNKNOWN); -ASSERT_CDM_INIT_DATA_TYPE(WEBM); -ASSERT_CDM_INIT_DATA_TYPE(CENC); -ASSERT_CDM_INIT_DATA_TYPE(KEYIDS); - -// CDM Key Status -#define ASSERT_CDM_KEY_STATUS(value) \ - static_assert(media::CdmKeyInformation::value == \ - static_cast<media::CdmKeyInformation::KeyStatus>( \ - media::mojom::CdmKeyStatus::value), \ - "Mismatched CDM Key Status") -ASSERT_CDM_KEY_STATUS(USABLE); -ASSERT_CDM_KEY_STATUS(INTERNAL_ERROR); -ASSERT_CDM_KEY_STATUS(EXPIRED); -ASSERT_CDM_KEY_STATUS(OUTPUT_RESTRICTED); -ASSERT_CDM_KEY_STATUS(OUTPUT_DOWNSCALED); -ASSERT_CDM_KEY_STATUS(KEY_STATUS_PENDING); -ASSERT_CDM_KEY_STATUS(RELEASED); - -// CDM Message Type -#define ASSERT_CDM_MESSAGE_TYPE(value) \ - static_assert( \ - media::MediaKeys::value == static_cast<media::MediaKeys::MessageType>( \ - media::mojom::CdmMessageType::value), \ - "Mismatched CDM Message Type") -ASSERT_CDM_MESSAGE_TYPE(LICENSE_REQUEST); -ASSERT_CDM_MESSAGE_TYPE(LICENSE_RENEWAL); -ASSERT_CDM_MESSAGE_TYPE(LICENSE_RELEASE); - template <> struct TypeConverter<media::mojom::PatternPtr, media::EncryptionScheme::Pattern> { @@ -149,8 +61,7 @@ media::EncryptionScheme>::Convert(const media::EncryptionScheme& input) { media::mojom::EncryptionSchemePtr mojo_encryption_scheme( media::mojom::EncryptionScheme::New()); - mojo_encryption_scheme->mode = - static_cast<media::mojom::CipherMode>(input.mode()); + mojo_encryption_scheme->mode = input.mode(); mojo_encryption_scheme->pattern = media::mojom::Pattern::From(input.pattern()); return mojo_encryption_scheme; @@ -161,8 +72,7 @@ TypeConverter<media::EncryptionScheme, media::mojom::EncryptionSchemePtr>:: Convert(const media::mojom::EncryptionSchemePtr& input) { return media::EncryptionScheme( - static_cast<media::EncryptionScheme::CipherMode>(input->mode), - input->pattern.To<media::EncryptionScheme::Pattern>()); + input->mode, input->pattern.To<media::EncryptionScheme::Pattern>()); } // static @@ -284,11 +194,10 @@ TypeConverter<media::AudioDecoderConfig, media::mojom::AudioDecoderConfigPtr>:: Convert(const media::mojom::AudioDecoderConfigPtr& input) { media::AudioDecoderConfig config; - config.Initialize( - input->codec, static_cast<media::SampleFormat>(input->sample_format), - input->channel_layout, input->samples_per_second, input->extra_data, - input->encryption_scheme.To<media::EncryptionScheme>(), - input->seek_preroll, input->codec_delay); + config.Initialize(input->codec, input->sample_format, input->channel_layout, + input->samples_per_second, input->extra_data, + input->encryption_scheme.To<media::EncryptionScheme>(), + input->seek_preroll, input->codec_delay); return config; } @@ -330,7 +239,7 @@ media::mojom::CdmKeyInformationPtr info( media::mojom::CdmKeyInformation::New()); info->key_id = input.key_id; - info->status = static_cast<media::mojom::CdmKeyStatus>(input.status); + info->status = input.status; info->system_code = input.system_code; return info; } @@ -341,9 +250,7 @@ media::mojom::CdmKeyInformationPtr>:: Convert(const media::mojom::CdmKeyInformationPtr& input) { return base::MakeUnique<media::CdmKeyInformation>( - input->key_id, - static_cast<media::CdmKeyInformation::KeyStatus>(input->status), - input->system_code); + input->key_id, input->status, input->system_code); } // static @@ -406,9 +313,9 @@ channel_ptrs[i] = input->data.data() + i * size_per_channel; return media::AudioBuffer::CopyFrom( - static_cast<media::SampleFormat>(input->sample_format), - input->channel_layout, input->channel_count, input->sample_rate, - input->frame_count, &channel_ptrs[0], input->timestamp); + input->sample_format, input->channel_layout, input->channel_count, + input->sample_rate, input->frame_count, &channel_ptrs[0], + input->timestamp); } // static
diff --git a/media/mojo/interfaces/content_decryption_module.mojom b/media/mojo/interfaces/content_decryption_module.mojom index fc98ff9..52c8da5c 100644 --- a/media/mojo/interfaces/content_decryption_module.mojom +++ b/media/mojo/interfaces/content_decryption_module.mojom
@@ -7,30 +7,9 @@ import "media/mojo/interfaces/decryptor.mojom"; import "url/mojo/url.mojom"; -// Transport layer of media::MediaKeys::Exception (see media/base/media_keys.h). -// This is used for ContentDecryptionModule (CDM) promise rejections. -enum CdmException { - NOT_SUPPORTED_ERROR, - INVALID_STATE_ERROR, - INVALID_ACCESS_ERROR, - QUOTA_EXCEEDED_ERROR, - UNKNOWN_ERROR, - CLIENT_ERROR, - OUTPUT_ERROR -}; - -// Transport layer of media::CdmKeyInformation::KeyStatus (see -// media/base/cdm_key_information.h). This is used for indicating the status -// of a specific key ID. -enum CdmKeyStatus { - USABLE, - INTERNAL_ERROR, - EXPIRED, - OUTPUT_RESTRICTED, - OUTPUT_DOWNSCALED, - KEY_STATUS_PENDING, - RELEASED -}; +// See media::EmeInitDataType. +[Native] +enum EmeInitDataType; // Transport layer of media::CdmConfig (see media/base/cdm_config.h). struct CdmConfig { @@ -45,8 +24,12 @@ // - When |success| is false, the promise is rejected with |exception|, // |system_code| and |error_message|. struct CdmPromiseResult { + // See media::MediaKeys::Exception + [Native] + enum Exception; + bool success; - CdmException exception; + Exception exception; uint32 system_code; string error_message; }; @@ -55,35 +38,20 @@ // media/base/cdm_key_information.h). It is used to specify a key_id and it's // associated status. struct CdmKeyInformation { - array<uint8> key_id; - CdmKeyStatus status; - uint32 system_code; -}; + [Native] + enum KeyStatus; -// See media::MediaKeys::MessageType -enum CdmMessageType { - LICENSE_REQUEST, - LICENSE_RENEWAL, - LICENSE_RELEASE + array<uint8> key_id; + KeyStatus status; + uint32 system_code; }; // An interface that represents a CDM in the Encrypted Media Extensions (EME) // spec (https://w3c.github.io/encrypted-media/). See media/base/media_keys.h. interface ContentDecryptionModule { - // See media::MediaKeys::SessionType. - enum SessionType { - TEMPORARY_SESSION, - PERSISTENT_LICENSE_SESSION, - PERSISTENT_RELEASE_MESSAGE_SESSION - }; - - // See media::EmeInitDataType. - enum InitDataType { - UNKNOWN, - WEBM, - CENC, - KEYIDS - }; + // See media::MediaKeys::SessionType + [Native] + enum SessionType; // Sets ContentDecryptionModuleClient. Must be called before any other calls. SetClient(ContentDecryptionModuleClient client); @@ -105,7 +73,7 @@ // provided. If |result.success| is false, the output |session_id| will be // empty. CreateSessionAndGenerateRequest(SessionType session_type, - InitDataType init_data_type, + EmeInitDataType init_data_type, array<uint8> init_data) => (CdmPromiseResult result, string session_id); @@ -132,7 +100,11 @@ // Session callbacks. See media/base/media_keys.h for details. interface ContentDecryptionModuleClient { - OnSessionMessage(string session_id, CdmMessageType message_type, + // See media::MediaKeys::MessageType + [Native] + enum MessageType; + + OnSessionMessage(string session_id, MessageType message_type, array<uint8> message); OnSessionClosed(string session_id);
diff --git a/media/mojo/interfaces/content_decryption_module.typemap b/media/mojo/interfaces/content_decryption_module.typemap new file mode 100644 index 0000000..86cb28a --- /dev/null +++ b/media/mojo/interfaces/content_decryption_module.typemap
@@ -0,0 +1,26 @@ +# Copyright 2016 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +mojom = "//media/mojo/interfaces/content_decryption_module.mojom" + +public_headers = [ + "//media/base/cdm_key_information.h", + "//media/base/eme_constants.h", + "//media/base/media_keys.h", +] + +traits_headers = [ "//media/base/ipc/media_param_traits_macros.h" ] + +deps = [ + "//media", + "//media/base/ipc", +] + +type_mappings = [ + "media.mojom.CdmKeyInformation.KeyStatus=media::CdmKeyInformation::KeyStatus", + "media.mojom.CdmPromiseResult.Exception=media::MediaKeys::Exception", + "media.mojom.ContentDecryptionModule.SessionType=media::MediaKeys::SessionType", + "media.mojom.ContentDecryptionModuleClient.MessageType=media::MediaKeys::MessageType", + "media.mojom.EmeInitDataType=media::EmeInitDataType", +]
diff --git a/media/mojo/interfaces/media_types.mojom b/media/mojo/interfaces/media_types.mojom index 4edfe031..e9b6796 100644 --- a/media/mojo/interfaces/media_types.mojom +++ b/media/mojo/interfaces/media_types.mojom
@@ -43,15 +43,6 @@ [Native] enum VideoCodecProfile; -// See media/base/encryption_scheme.h. -// Kept in sync with media::CipherMode via static_asserts. -enum CipherMode { - UNENCRYPTED = 0, - AES_CTR, - AES_CBC, - MAX = AES_CBC -}; - // This defines a mojo transport format for media::EncryptionScheme::Pattern // See media/base/encryption_scheme.h for description. struct Pattern { @@ -62,6 +53,9 @@ // This defines a mojo transport format for media::EncryptionScheme. // See media/base/encryption_scheme.h for description. struct EncryptionScheme { + [Native] + enum CipherMode; + CipherMode mode; Pattern pattern; };
diff --git a/media/mojo/interfaces/media_types.typemap b/media/mojo/interfaces/media_types.typemap index 46c3487c..13a1525 100644 --- a/media/mojo/interfaces/media_types.typemap +++ b/media/mojo/interfaces/media_types.typemap
@@ -9,6 +9,7 @@ "//media/base/buffering_state.h", "//media/base/channel_layout.h", "//media/base/decode_status.h", + "//media/base/encryption_scheme.h", "//media/base/sample_format.h", "//media/base/subsample_entry.h", "//media/base/video_codecs.h", @@ -28,6 +29,7 @@ "media.mojom.ChannelLayout=media::ChannelLayout", "media.mojom.ColorSpace=media::ColorSpace", "media.mojom.DecodeStatus=media::DecodeStatus", + "media.mojom.EncryptionScheme.CipherMode=media::EncryptionScheme::CipherMode", "media.mojom.SampleFormat=media::SampleFormat", "media.mojom.SubsampleEntry=media::SubsampleEntry", "media.mojom.VideoCodec=media::VideoCodec",
diff --git a/media/mojo/interfaces/typemaps.gni b/media/mojo/interfaces/typemaps.gni index 737a5657..2bde9f0 100644 --- a/media/mojo/interfaces/typemaps.gni +++ b/media/mojo/interfaces/typemaps.gni
@@ -4,6 +4,7 @@ typemaps = [ "//media/mojo/interfaces/audio_parameters.typemap", + "//media/mojo/interfaces/content_decryption_module.typemap", "//media/mojo/interfaces/decryptor.typemap", "//media/mojo/interfaces/demuxer_stream.typemap", "//media/mojo/interfaces/media_types.typemap",
diff --git a/media/mojo/services/mojo_cdm_promise.cc b/media/mojo/services/mojo_cdm_promise.cc index 430360b..2de75b9 100644 --- a/media/mojo/services/mojo_cdm_promise.cc +++ b/media/mojo/services/mojo_cdm_promise.cc
@@ -21,7 +21,7 @@ const std::string& error_message) { mojom::CdmPromiseResultPtr cdm_promise_result(mojom::CdmPromiseResult::New()); cdm_promise_result->success = false; - cdm_promise_result->exception = static_cast<mojom::CdmException>(exception); + cdm_promise_result->exception = exception; cdm_promise_result->system_code = system_code; cdm_promise_result->error_message = error_message; return cdm_promise_result;
diff --git a/media/mojo/services/mojo_cdm_service.cc b/media/mojo/services/mojo_cdm_service.cc index 83e885ca..0d23993 100644 --- a/media/mojo/services/mojo_cdm_service.cc +++ b/media/mojo/services/mojo_cdm_service.cc
@@ -127,24 +127,21 @@ } void MojoCdmService::CreateSessionAndGenerateRequest( - mojom::ContentDecryptionModule::SessionType session_type, - mojom::ContentDecryptionModule::InitDataType init_data_type, + SessionType session_type, + EmeInitDataType init_data_type, const std::vector<uint8_t>& init_data, const CreateSessionAndGenerateRequestCallback& callback) { DVLOG(2) << __FUNCTION__; cdm_->CreateSessionAndGenerateRequest( - static_cast<MediaKeys::SessionType>(session_type), - static_cast<EmeInitDataType>(init_data_type), init_data, + session_type, init_data_type, init_data, base::MakeUnique<NewSessionMojoCdmPromise>(callback)); } -void MojoCdmService::LoadSession( - mojom::ContentDecryptionModule::SessionType session_type, - const std::string& session_id, - const LoadSessionCallback& callback) { +void MojoCdmService::LoadSession(SessionType session_type, + const std::string& session_id, + const LoadSessionCallback& callback) { DVLOG(2) << __FUNCTION__; - cdm_->LoadSession(static_cast<MediaKeys::SessionType>(session_type), - session_id, + cdm_->LoadSession(session_type, session_id, base::MakeUnique<NewSessionMojoCdmPromise>(callback)); } @@ -184,7 +181,7 @@ // populated. See http://crbug.com/469366 if (!cdm || !context_) { cdm_promise_result->success = false; - cdm_promise_result->exception = mojom::CdmException::NOT_SUPPORTED_ERROR; + cdm_promise_result->exception = MediaKeys::Exception::NOT_SUPPORTED_ERROR; cdm_promise_result->system_code = 0; cdm_promise_result->error_message = error_message; callback.Run(std::move(cdm_promise_result), 0, nullptr); @@ -219,8 +216,7 @@ MediaKeys::MessageType message_type, const std::vector<uint8_t>& message) { DVLOG(2) << __FUNCTION__ << "(" << message_type << ")"; - client_->OnSessionMessage( - session_id, static_cast<mojom::CdmMessageType>(message_type), message); + client_->OnSessionMessage(session_id, message_type, message); } void MojoCdmService::OnSessionKeysChange(const std::string& session_id,
diff --git a/media/mojo/services/mojo_cdm_service.h b/media/mojo/services/mojo_cdm_service.h index a983881..16486f2 100644 --- a/media/mojo/services/mojo_cdm_service.h +++ b/media/mojo/services/mojo_cdm_service.h
@@ -14,6 +14,7 @@ #include "base/macros.h" #include "base/memory/ref_counted.h" #include "base/memory/weak_ptr.h" +#include "media/base/eme_constants.h" #include "media/base/media_keys.h" #include "media/mojo/interfaces/content_decryption_module.mojom.h" #include "media/mojo/services/media_mojo_export.h" @@ -30,6 +31,8 @@ class MEDIA_MOJO_EXPORT MojoCdmService : NON_EXPORTED_BASE(public mojom::ContentDecryptionModule) { public: + using SessionType = MediaKeys::SessionType; + // Get the CDM associated with |cdm_id|, which is unique per process. // Can be called on any thread. The returned CDM is not guaranteed to be // thread safe. @@ -55,11 +58,11 @@ void SetServerCertificate(const std::vector<uint8_t>& certificate_data, const SetServerCertificateCallback& callback) final; void CreateSessionAndGenerateRequest( - mojom::ContentDecryptionModule::SessionType session_type, - mojom::ContentDecryptionModule::InitDataType init_data_type, + SessionType session_type, + EmeInitDataType init_data_type, const std::vector<uint8_t>& init_data, const CreateSessionAndGenerateRequestCallback& callback) final; - void LoadSession(mojom::ContentDecryptionModule::SessionType session_type, + void LoadSession(SessionType session_type, const std::string& session_id, const LoadSessionCallback& callback) final; void UpdateSession(const std::string& session_id,
diff --git a/media/renderers/audio_renderer_impl.cc b/media/renderers/audio_renderer_impl.cc index c653bfc..66fe2b7 100644 --- a/media/renderers/audio_renderer_impl.cc +++ b/media/renderers/audio_renderer_impl.cc
@@ -57,6 +57,7 @@ received_end_of_stream_(false), rendered_end_of_stream_(false), is_suspending_(false), + last_reported_media_time_(kNoTimestamp), weak_factory_(this) { audio_buffer_stream_->set_splice_observer(base::Bind( &AudioRendererImpl::OnNewSpliceBuffer, weak_factory_.GetWeakPtr())); @@ -171,11 +172,27 @@ last_render_time_ = stop_rendering_time_ = base::TimeTicks(); first_packet_timestamp_ = kNoTimestamp; audio_clock_.reset(new AudioClock(time, audio_parameters_.sample_rate())); + last_reported_media_time_ = kNoTimestamp; } base::TimeDelta AudioRendererImpl::CurrentMediaTime() { base::AutoLock auto_lock(lock_); + // Re-use last reported time if rendering has stopped to avoid confusing blink + // layer (avoid currentTime advancing after signaling buffer underflow). + // TODO(chcunningham): Do this in blink instead. Patching it here for now + // because HTMLMediaElement's currentTime is a mess. + if (!rendering_ && last_reported_media_time_ != kNoTimestamp) { + // If rendering stops, be sure to at least report the front time of the most + // recently rendered audio buffer. + if (last_reported_media_time_ < audio_clock_->front_timestamp()) + last_reported_media_time_ = audio_clock_->front_timestamp(); + + DVLOG(3) << __func__ << " Returning cached time while rendering stopped:" + << last_reported_media_time_.InMicroseconds(); + return last_reported_media_time_; + } + // Return the current time based on the known extents of the rendered audio // data plus an estimate based on the last time those values were calculated. base::TimeDelta current_media_time = audio_clock_->front_timestamp(); @@ -186,6 +203,7 @@ current_media_time = audio_clock_->back_timestamp(); } + last_reported_media_time_ = current_media_time; return current_media_time; } @@ -430,6 +448,7 @@ audio_clock_.reset( new AudioClock(base::TimeDelta(), audio_parameters_.sample_rate())); + last_reported_media_time_ = kNoTimestamp; audio_buffer_stream_->Initialize( stream, base::Bind(&AudioRendererImpl::OnAudioBufferStreamInitialized,
diff --git a/media/renderers/audio_renderer_impl.h b/media/renderers/audio_renderer_impl.h index d76ba066..6ab57ae 100644 --- a/media/renderers/audio_renderer_impl.h +++ b/media/renderers/audio_renderer_impl.h
@@ -290,6 +290,9 @@ // suspend/is suspended and when it resumes. bool is_suspending_; + // Track the last reported media time. + base::TimeDelta last_reported_media_time_; + // End variables which must be accessed under |lock_|. ---------------------- // NOTE: Weak pointers must be invalidated before all other member variables.
diff --git a/media/renderers/audio_renderer_impl_unittest.cc b/media/renderers/audio_renderer_impl_unittest.cc index 3fdee31f..c5b51af 100644 --- a/media/renderers/audio_renderer_impl_unittest.cc +++ b/media/renderers/audio_renderer_impl_unittest.cc
@@ -748,7 +748,13 @@ StopTicking(); EXPECT_EQ(timestamp_helper.GetTimestamp(), CurrentMediaTime()); tick_clock_->Advance(kConsumptionDuration * 2); - timestamp_helper.AddFrames(frames_to_consume.value); + + // TODO(chcunningham): Uncomment the AddFrames() call below. AudioClock should + // be expected to advance time through the last rendered buffer's samples, but + // we've currently capped it to not advance time after ticking stops as a + // short term workaround for messy blink code. See longterm solution at + // http://crrev.com/2425463002. + // timestamp_helper.AddFrames(frames_to_consume.value); EXPECT_EQ(timestamp_helper.GetTimestamp(), CurrentMediaTime()); }
diff --git a/mojo/public/tools/bindings/chromium_bindings_configuration.gni b/mojo/public/tools/bindings/chromium_bindings_configuration.gni index d8cc54d..ce0a11c07 100644 --- a/mojo/public/tools/bindings/chromium_bindings_configuration.gni +++ b/mojo/public/tools/bindings/chromium_bindings_configuration.gni
@@ -30,8 +30,10 @@ "//ui/gfx/typemaps.gni", "//url/mojo/typemaps.gni", ] -_typemaps = [] +_typemap_imports_mac = [ "//content/common/typemaps_mac.gni" ] + +_typemaps = [] foreach(typemap_import, _typemap_imports) { # Avoid reassignment error by assigning to empty scope first. _imported = { @@ -44,3 +46,16 @@ foreach(typemap, _typemaps) { typemaps += [ read_file(typemap, "scope") ] } + +_typemaps_mac = [] +foreach(typemap_import, _typemap_imports_mac) { + _imported = { + } + _imported = read_file(typemap_import, "scope") + _typemaps_mac += _imported.typemaps +} + +typemaps_mac = [] +foreach(typemap, _typemaps_mac) { + typemaps_mac += [ read_file(typemap, "scope") ] +}
diff --git a/mojo/public/tools/bindings/mojom.gni b/mojo/public/tools/bindings/mojom.gni index be36cb49..d8302ec6 100644 --- a/mojo/public/tools/bindings/mojom.gni +++ b/mojo/public/tools/bindings/mojom.gni
@@ -39,10 +39,15 @@ _bindings_configurations += [ read_file(config_file, "scope") ] } foreach(configuration, _bindings_configurations) { + # Check that the mojom field of each typemap refers to a mojom that exists. foreach(typemap, configuration.typemaps) { - # Check that the mojom field of each typemap refers to a mojom that exists. read_file(typemap.mojom, "") } + if (is_mac && defined(configuration.typemaps_mac)) { + foreach(typemap, configuration.typemaps_mac) { + read_file(typemap.mojom, "") + } + } } # Generate C++/JavaScript/Java source files from mojom files. The output files @@ -258,6 +263,13 @@ active_typemaps += [ typemap ] } } + if (is_mac && defined(bindings_configuration.typemaps_mac)) { + foreach(typemap, bindings_configuration.typemaps_mac) { + if (get_path_info(source, "abspath") == typemap.mojom) { + active_typemaps += [ typemap ] + } + } + } } if (!cpp_only) {
diff --git a/net/base/sdch_manager.cc b/net/base/sdch_manager.cc index c409bd6..b4de9a15 100644 --- a/net/base/sdch_manager.cc +++ b/net/base/sdch_manager.cc
@@ -96,7 +96,8 @@ blacklisted_domains_.clear(); allow_latency_experiment_.clear(); dictionaries_.clear(); - FOR_EACH_OBSERVER(SdchObserver, observers_, OnClearDictionaries()); + for (auto& observer : observers_) + observer.OnClearDictionaries(); } // static @@ -192,16 +193,15 @@ if (rv != SDCH_OK) return rv; - FOR_EACH_OBSERVER(SdchObserver, - observers_, - OnGetDictionary(request_url, dictionary_url)); + for (auto& observer : observers_) + observer.OnGetDictionary(request_url, dictionary_url); return SDCH_OK; } void SdchManager::OnDictionaryUsed(const std::string& server_hash) { - FOR_EACH_OBSERVER(SdchObserver, observers_, - OnDictionaryUsed(server_hash)); + for (auto& observer : observers_) + observer.OnDictionaryUsed(server_hash); } SdchProblemCode SdchManager::CanFetchDictionary( @@ -423,8 +423,8 @@ if (server_hash_p) *server_hash_p = server_hash; - FOR_EACH_OBSERVER(SdchObserver, observers_, - OnDictionaryAdded(dictionary_url, server_hash)); + for (auto& observer : observers_) + observer.OnDictionaryAdded(dictionary_url, server_hash); return SDCH_OK; } @@ -436,7 +436,8 @@ dictionaries_.erase(server_hash); - FOR_EACH_OBSERVER(SdchObserver, observers_, OnDictionaryRemoved(server_hash)); + for (auto& observer : observers_) + observer.OnDictionaryRemoved(server_hash); return SDCH_OK; }
diff --git a/net/cert/sth_distributor.cc b/net/cert/sth_distributor.cc index c511e27..61b2ce8 100644 --- a/net/cert/sth_distributor.cc +++ b/net/cert/sth_distributor.cc
@@ -35,7 +35,8 @@ else *it = sth; - FOR_EACH_OBSERVER(STHObserver, observer_list_, NewSTHObserved(sth)); + for (auto& observer : observer_list_) + observer.NewSTHObserved(sth); if (sth.log_id.compare(0, sth.log_id.size(), reinterpret_cast<const char*>(kPilotLogID),
diff --git a/net/dns/mdns_client_impl.cc b/net/dns/mdns_client_impl.cc index 634822e..bd4b0d1 100644 --- a/net/dns/mdns_client_impl.cc +++ b/net/dns/mdns_client_impl.cc
@@ -323,7 +323,8 @@ listeners_.upper_bound(ListenerKey(record->name(), 0)); for (; i != listeners_.end() && i->first.first == record->name(); i++) { if (!rdata->GetBit(i->first.second)) { - FOR_EACH_OBSERVER(MDnsListenerImpl, *i->second, AlertNsecRecord()); + for (auto& observer : *i->second) + observer.AlertNsecRecord(); } } } @@ -340,8 +341,8 @@ ListenerMap::iterator listener_map_iterator = listeners_.find(key); if (listener_map_iterator == listeners_.end()) return; - FOR_EACH_OBSERVER(MDnsListenerImpl, *listener_map_iterator->second, - HandleRecordUpdate(update_type, record)); + for (auto& observer : *listener_map_iterator->second) + observer.HandleRecordUpdate(update_type, record); } void MDnsClientImpl::Core::AddListener(
diff --git a/net/http/http_basic_state.cc b/net/http/http_basic_state.cc index 3e7b63e..90a2212c 100644 --- a/net/http/http_basic_state.cc +++ b/net/http/http_basic_state.cc
@@ -24,8 +24,7 @@ connection_(std::move(connection)), using_proxy_(using_proxy), http_09_on_non_default_ports_enabled_( - http_09_on_non_default_ports_enabled), - request_info_(nullptr) {} + http_09_on_non_default_ports_enabled) {} HttpBasicState::~HttpBasicState() {} @@ -34,7 +33,8 @@ const NetLogWithSource& net_log, const CompletionCallback& callback) { DCHECK(!parser_.get()); - request_info_ = request_info; + url_ = request_info->url; + request_method_ = request_info->method; parser_.reset(new HttpStreamParser( connection_.get(), request_info, read_buf_.get(), net_log)); parser_->set_http_09_on_non_default_ports_enabled( @@ -55,16 +55,14 @@ std::string HttpBasicState::GenerateRequestLine() const { static const char kSuffix[] = " HTTP/1.1\r\n"; const size_t kSuffixLen = arraysize(kSuffix) - 1; - DCHECK(request_info_); - const GURL& url = request_info_->url; const std::string path = - using_proxy_ ? HttpUtil::SpecForRequest(url) : url.PathForRequest(); + using_proxy_ ? HttpUtil::SpecForRequest(url_) : url_.PathForRequest(); // Don't use StringPrintf for concatenation because it is very inefficient. std::string request_line; - const size_t expected_size = request_info_->method.size() + 1 + path.size() + - kSuffixLen; + const size_t expected_size = + request_method_.size() + 1 + path.size() + kSuffixLen; request_line.reserve(expected_size); - request_line.append(request_info_->method); + request_line.append(request_method_); request_line.append(1, ' '); request_line.append(path); request_line.append(kSuffix, kSuffixLen);
diff --git a/net/http/http_basic_state.h b/net/http/http_basic_state.h index ac8ac376..c89beab 100644 --- a/net/http/http_basic_state.h +++ b/net/http/http_basic_state.h
@@ -16,6 +16,7 @@ #include "net/base/completion_callback.h" #include "net/base/net_export.h" #include "net/base/request_priority.h" +#include "url/gurl.h" namespace net { @@ -70,7 +71,8 @@ const bool http_09_on_non_default_ports_enabled_; - const HttpRequestInfo* request_info_; + GURL url_; + std::string request_method_; DISALLOW_COPY_AND_ASSIGN(HttpBasicState); };
diff --git a/net/http/http_network_transaction.cc b/net/http/http_network_transaction.cc index 4d75e97..3c5c35c5 100644 --- a/net/http/http_network_transaction.cc +++ b/net/http/http_network_transaction.cc
@@ -122,7 +122,6 @@ stream->Drain(session_); } } - if (request_ && request_->upload_data_stream) request_->upload_data_stream->Reset(); // Invalidate pending callbacks. } @@ -132,6 +131,7 @@ const NetLogWithSource& net_log) { net_log_ = net_log; request_ = request_info; + url_ = request_->url; // Now that we have an HttpRequestInfo object, update server_ssl_config_. session_->GetSSLConfig(*request_, &server_ssl_config_, &proxy_ssl_config_); @@ -295,8 +295,6 @@ DCHECK(buf); DCHECK_LT(0, buf_len); - State next_state = STATE_NONE; - scoped_refptr<HttpResponseHeaders> headers(GetResponseHeaders()); if (headers_valid_ && headers.get() && stream_request_.get()) { // We're trying to read the body of the response but we're still trying @@ -312,17 +310,27 @@ DCHECK_EQ(headers->response_code(), HTTP_PROXY_AUTHENTICATION_REQUIRED); LOG(WARNING) << "Blocked proxy response with status " << headers->response_code() << " to CONNECT request for " - << GetHostAndPort(request_->url) << "."; + << GetHostAndPort(url_) << "."; return ERR_TUNNEL_CONNECTION_FAILED; } // Are we using SPDY or HTTP? - next_state = STATE_READ_BODY; + next_state_ = STATE_READ_BODY; + + // We have reached the end of Start state machine, reset the requestinfo to + // null. + // RequestInfo is a member of the HttpTransaction's consumer and is useful + // only till final response headers are received. A reset will ensure that + // HttpRequestInfo is only used up until final response headers are received. + // Resetting is allowed so that the transaction can be disassociated from its + // creating consumer in cases where it is shared for writing to the cache. + // It is also safe to reset it to null at this point since upload_data_stream + // is also not used in the Read state machine. + request_ = nullptr; read_buf_ = buf; read_buf_len_ = buf_len; - next_state_ = next_state; int rv = DoLoop(OK); if (rv == ERR_IO_PENDING) callback_ = callback;
diff --git a/net/http/http_network_transaction.h b/net/http/http_network_transaction.h index ec2b5ce..198f1ce 100644 --- a/net/http/http_network_transaction.h +++ b/net/http/http_network_transaction.h
@@ -312,7 +312,12 @@ HttpNetworkSession* session_; NetLogWithSource net_log_; + + // Reset to null at the start of the Read state machine. const HttpRequestInfo* request_; + + // The requested URL. + GURL url_; RequestPriority priority_; HttpResponseInfo response_;
diff --git a/net/http/http_stream.h b/net/http/http_stream.h index b161a87..3def66ee 100644 --- a/net/http/http_stream.h +++ b/net/http/http_stream.h
@@ -47,7 +47,9 @@ virtual ~HttpStream() {} // Initialize stream. Must be called before calling SendRequest(). - // |request_info| must outlive the HttpStream. + // The consumer should ensure that request_info points to a valid value till + // final response headers are received; after that point, the HttpStream + // will not access |*request_info| and it may be deleted. // Returns a net error code, possibly ERR_IO_PENDING. virtual int InitializeStream(const HttpRequestInfo* request_info, RequestPriority priority,
diff --git a/net/http/http_stream_parser.cc b/net/http/http_stream_parser.cc index 0a65fda5..f8e5c0f 100644 --- a/net/http/http_stream_parser.cc +++ b/net/http/http_stream_parser.cc
@@ -380,6 +380,12 @@ user_read_buf_len_ = buf_len; io_state_ = STATE_READ_BODY; + // Invalidate HttpRequestInfo pointer. This is to allow the stream to be + // shared across multiple consumers. + // It is safe to reset it at this point since request_->upload_data_stream + // is also not needed anymore. + request_ = nullptr; + int result = DoLoop(OK); if (result == ERR_IO_PENDING) callback_ = callback;
diff --git a/net/http/http_stream_parser.h b/net/http/http_stream_parser.h index 4d30bc4..2791f32 100644 --- a/net/http/http_stream_parser.h +++ b/net/http/http_stream_parser.h
@@ -204,7 +204,7 @@ // Next state of the request, when the current one completes. State io_state_; - // The request to send. + // Null when read state machine is invoked. const HttpRequestInfo* request_; // The request header data. May include a merged request body.
diff --git a/net/http/http_transaction.h b/net/http/http_transaction.h index b39e651..eff45d1 100644 --- a/net/http/http_transaction.h +++ b/net/http/http_transaction.h
@@ -52,6 +52,10 @@ // Starts the HTTP transaction (i.e., sends the HTTP request). // + // The consumer should ensure that request_info points to a valid value till + // final response headers are received; after that point, the HttpTransaction + // will not access |*request_info| and it may be deleted. + // // Returns OK if the transaction could be started synchronously, which means // that the request was served from the cache. ERR_IO_PENDING is returned to // indicate that the CompletionCallback will be notified once response info is
diff --git a/net/http/transport_security_state.cc b/net/http/transport_security_state.cc index a3f468d..9ec99257 100644 --- a/net/http/transport_security_state.cc +++ b/net/http/transport_security_state.cc
@@ -681,6 +681,7 @@ const SSLInfo& ssl_info, const std::string& ocsp_response, std::string* out_serialized_report) { + DCHECK(ssl_info.is_issued_by_known_root); base::DictionaryValue report; report.SetString("date-time", TimeToISO8601(base::Time::Now())); report.SetString("hostname", host_port_pair.host()); @@ -699,12 +700,11 @@ SerializeExpectStapleRevocationStatus( ssl_info.ocsp_result.revocation_status)); } - if (ssl_info.is_issued_by_known_root) { - report.Set("served-certificate-chain", - GetPEMEncodedChainAsList(ssl_info.unverified_cert.get())); - report.Set("validated-certificate-chain", - GetPEMEncodedChainAsList(ssl_info.cert.get())); - } + + report.Set("served-certificate-chain", + GetPEMEncodedChainAsList(ssl_info.unverified_cert.get())); + report.Set("validated-certificate-chain", + GetPEMEncodedChainAsList(ssl_info.cert.get())); if (!base::JSONWriter::Write(report, out_serialized_report)) return false; @@ -792,8 +792,10 @@ const SSLInfo& ssl_info, const std::string& ocsp_response) { DCHECK(CalledOnValidThread()); - if (!enable_static_expect_staple_ || !report_sender_) + if (!enable_static_expect_staple_ || !report_sender_ || + !ssl_info.is_issued_by_known_root) { return; + } // Determine if the host is on the Expect-Staple preload list. If the build is // not timely (i.e. the preload list is not fresh), this will fail and return
diff --git a/net/http/transport_security_state.h b/net/http/transport_security_state.h index 3326ca2..d5116c7 100644 --- a/net/http/transport_security_state.h +++ b/net/http/transport_security_state.h
@@ -313,10 +313,12 @@ // 1. Sending Expect-Staple reports is enabled (via // |enable_static_expect_staple_|) // 2. A report sender was provided via SetReportSender(). - // 3. The build is timele (i.e. the preload list is fresh). + // 3. The build is timely (i.e. the preload list is fresh). // 4. The given host is present on the Expect-Staple preload list. // 5. |ssl_info| indicates the connection did not provide an OCSP response // indicating a revocation status of GOOD. + // 6. The certificate chain in |ssl_info| chains to a known root. Reports + // for OCSP responses behind MITM proxies are not useful to site owners. void CheckExpectStaple(const HostPortPair& host_port_pair, const SSLInfo& ssl_info, const std::string& ocsp_response);
diff --git a/net/http/transport_security_state_unittest.cc b/net/http/transport_security_state_unittest.cc index bdc2dd2..93b75f3 100644 --- a/net/http/transport_security_state_unittest.cc +++ b/net/http/transport_security_state_unittest.cc
@@ -258,8 +258,7 @@ // 5. The "cert-status" field matches |cert_status|, and is not present when // |cert_status| is empty. // 6. The "validated-chain" and "serverd-chain" fields match those in -// |ssl_info|, and are only present when |ssl_info.is_issued_by_known_root| -// is true. +// |ssl_info|. void CheckSerializedExpectStapleReport(const std::string& report, const HostPortPair& host_port_pair, const SSLInfo& ssl_info, @@ -318,18 +317,13 @@ bool has_validated_chain = report_dict->GetList( "validated-certificate-chain", &report_validated_certificate_chain); - if (ssl_info.is_issued_by_known_root) { - EXPECT_TRUE(has_served_chain); - EXPECT_NO_FATAL_FAILURE(CompareCertificateChainWithList( - ssl_info.unverified_cert, report_served_certificate_chain)); + EXPECT_TRUE(has_served_chain); + EXPECT_NO_FATAL_FAILURE(CompareCertificateChainWithList( + ssl_info.unverified_cert, report_served_certificate_chain)); - EXPECT_TRUE(has_validated_chain); - EXPECT_NO_FATAL_FAILURE(CompareCertificateChainWithList( - ssl_info.cert, report_validated_certificate_chain)); - } else { - EXPECT_FALSE(has_served_chain); - EXPECT_FALSE(has_validated_chain); - } + EXPECT_TRUE(has_validated_chain); + EXPECT_NO_FATAL_FAILURE(CompareCertificateChainWithList( + ssl_info.cert, report_validated_certificate_chain)); } // Set up |state| for ExpectStaple, call CheckExpectStaple(), and verify the @@ -345,6 +339,11 @@ HostPortPair host_port(kExpectStapleStaticHostname, 443); state->SetReportSender(reporter); state->CheckExpectStaple(host_port, ssl_info, ocsp_response); + if (!ssl_info.is_issued_by_known_root) { + EXPECT_EQ(GURL(), reporter->latest_report_uri()); + EXPECT_EQ(std::string(), reporter->latest_report()); + return; + } EXPECT_EQ(GURL(kExpectStapleStaticReportURI), reporter->latest_report_uri()); EXPECT_EQ("application/json; charset=utf-8", reporter->latest_content_type()); std::string serialized_report = reporter->latest_report(); @@ -2067,14 +2066,14 @@ ssl_info.unverified_cert = cert2; ssl_info.ocsp_result.response_status = test.response_status; - // Certificate chains should only be included when |is_issued_by_known_root| - // is true. + // Reports should only be sent when |is_issued_by_known_root| is true. ssl_info.is_issued_by_known_root = true; ASSERT_NO_FATAL_FAILURE( CheckExpectStapleReport(&state, &reporter, ssl_info, ocsp_response, test.response_status_string, std::string())); + reporter.Clear(); - // No certificate chains should be included in the report. + // No report should be sent. ssl_info.is_issued_by_known_root = false; ASSERT_NO_FATAL_FAILURE( CheckExpectStapleReport(&state, &reporter, ssl_info, ocsp_response, @@ -2122,14 +2121,13 @@ ssl_info.ocsp_result.response_status = OCSPVerifyResult::PROVIDED; ssl_info.ocsp_result.revocation_status = test.revocation_status; - // Certificate chains should only be included when |is_issued_by_known_root| - // is true. + // Reports should only be sent when |is_issued_by_known_root| is true. ssl_info.is_issued_by_known_root = true; ASSERT_NO_FATAL_FAILURE(CheckExpectStapleReport(&state, &reporter, ssl_info, ocsp_response, "PROVIDED", test.cert_status_string)); + reporter.Clear(); - // No certificate chains should be included in the report. ssl_info.is_issued_by_known_root = false; ASSERT_NO_FATAL_FAILURE(CheckExpectStapleReport(&state, &reporter, ssl_info, ocsp_response, "PROVIDED",
diff --git a/net/log/net_log.cc b/net/log/net_log.cc index cec37e18..669b111 100644 --- a/net/log/net_log.cc +++ b/net/log/net_log.cc
@@ -279,7 +279,8 @@ // Notify all of the log observers. base::AutoLock lock(lock_); - FOR_EACH_OBSERVER(ThreadSafeObserver, observers_, OnAddEntryData(entry_data)); + for (auto& observer : observers_) + observer.OnAddEntryData(entry_data); } } // namespace net
diff --git a/net/nqe/network_quality_store.cc b/net/nqe/network_quality_store.cc index 7a1c253..01b5005 100644 --- a/net/nqe/network_quality_store.cc +++ b/net/nqe/network_quality_store.cc
@@ -60,9 +60,8 @@ DCHECK_LE(cached_network_qualities_.size(), static_cast<size_t>(kMaximumNetworkQualityCacheSize)); - FOR_EACH_OBSERVER( - NetworkQualitiesCacheObserver, network_qualities_cache_observer_list_, - OnChangeInCachedNetworkQuality(network_id, cached_network_quality)); + for (auto& observer : network_qualities_cache_observer_list_) + observer.OnChangeInCachedNetworkQuality(network_id, cached_network_quality); } bool NetworkQualityStore::GetById(
diff --git a/net/proxy/polling_proxy_config_service.cc b/net/proxy/polling_proxy_config_service.cc index ecec5cf..defe507 100644 --- a/net/proxy/polling_proxy_config_service.cc +++ b/net/proxy/polling_proxy_config_service.cc
@@ -125,9 +125,8 @@ // If the configuration has changed, notify the observers. has_config_ = true; last_config_ = config; - FOR_EACH_OBSERVER(Observer, observers_, - OnProxyConfigChanged(config, - ProxyConfigService::CONFIG_VALID)); + for (auto& observer : observers_) + observer.OnProxyConfigChanged(config, ProxyConfigService::CONFIG_VALID); } if (poll_task_queued_)
diff --git a/net/proxy/proxy_config_service_android.cc b/net/proxy/proxy_config_service_android.cc index 25049911..096ad47 100644 --- a/net/proxy/proxy_config_service_android.cc +++ b/net/proxy/proxy_config_service_android.cc
@@ -336,9 +336,10 @@ void SetNewConfigOnNetworkThread(const ProxyConfig& proxy_config) { DCHECK(OnNetworkThread()); proxy_config_ = proxy_config; - FOR_EACH_OBSERVER(Observer, observers_, - OnProxyConfigChanged(proxy_config, - ProxyConfigService::CONFIG_VALID)); + for (auto& observer : observers_) { + observer.OnProxyConfigChanged(proxy_config, + ProxyConfigService::CONFIG_VALID); + } } bool OnJNIThread() const {
diff --git a/net/proxy/proxy_config_service_linux.cc b/net/proxy/proxy_config_service_linux.cc index 6f9add0..71d43a17 100644 --- a/net/proxy/proxy_config_service_linux.cc +++ b/net/proxy/proxy_config_service_linux.cc
@@ -1729,9 +1729,8 @@ DCHECK(io_task_runner_->BelongsToCurrentThread()); VLOG(1) << "Proxy configuration changed"; cached_config_ = new_config; - FOR_EACH_OBSERVER( - Observer, observers_, - OnProxyConfigChanged(new_config, ProxyConfigService::CONFIG_VALID)); + for (auto& observer : observers_) + observer.OnProxyConfigChanged(new_config, ProxyConfigService::CONFIG_VALID); } void ProxyConfigServiceLinux::Delegate::PostDestroyTask() {
diff --git a/net/proxy/proxy_config_service_mac.cc b/net/proxy/proxy_config_service_mac.cc index 1483dbc6..1f208267 100644 --- a/net/proxy/proxy_config_service_mac.cc +++ b/net/proxy/proxy_config_service_mac.cc
@@ -277,8 +277,8 @@ last_config_fetched_ = new_config; // Notify all the observers. - FOR_EACH_OBSERVER(Observer, observers_, - OnProxyConfigChanged(new_config, CONFIG_VALID)); + for (auto& observer : observers_) + observer.OnProxyConfigChanged(new_config, CONFIG_VALID); } } // namespace net
diff --git a/net/proxy/proxy_service_unittest.cc b/net/proxy/proxy_service_unittest.cc index f6a2134d..f1391c8 100644 --- a/net/proxy/proxy_service_unittest.cc +++ b/net/proxy/proxy_service_unittest.cc
@@ -159,8 +159,8 @@ void SetConfig(const ProxyConfig& config) { availability_ = CONFIG_VALID; config_ = config; - FOR_EACH_OBSERVER(Observer, observers_, - OnProxyConfigChanged(config_, availability_)); + for (auto& observer : observers_) + observer.OnProxyConfigChanged(config_, availability_); } private:
diff --git a/net/quic/chromium/quic_chromium_client_session.cc b/net/quic/chromium/quic_chromium_client_session.cc index 846a534..176bb80 100644 --- a/net/quic/chromium/quic_chromium_client_session.cc +++ b/net/quic/chromium/quic_chromium_client_session.cc
@@ -521,7 +521,7 @@ DCHECK(connection()->connected()); QuicChromiumClientStream* stream = new QuicChromiumClientStream(GetNextOutgoingStreamId(), this, net_log_); - ActivateStream(stream); + ActivateStream(base::WrapUnique(stream)); ++num_total_streams_; UMA_HISTOGRAM_COUNTS("Net.QuicSession.NumOpenStreams", GetNumOpenOutgoingStreams()); @@ -738,7 +738,7 @@ QuicChromiumClientStream* stream = new QuicChromiumClientStream(id, this, net_log_); stream->CloseWriteSide(); - ActivateStream(stream); + ActivateStream(base::WrapUnique(stream)); ++num_total_streams_; return stream; } @@ -1240,7 +1240,7 @@ void QuicChromiumClientSession::CloseAllStreams(int net_error) { while (!dynamic_streams().empty()) { - ReliableQuicStream* stream = dynamic_streams().begin()->second; + ReliableQuicStream* stream = dynamic_streams().begin()->second.get(); QuicStreamId id = stream->id(); static_cast<QuicChromiumClientStream*>(stream)->OnError(net_error); CloseStream(id); @@ -1405,8 +1405,10 @@ bool QuicChromiumClientSession::HasNonMigratableStreams() const { for (const auto& stream : dynamic_streams()) { - if (!static_cast<QuicChromiumClientStream*>(stream.second)->can_migrate()) + if (!static_cast<QuicChromiumClientStream*>(stream.second.get()) + ->can_migrate()) { return true; + } } return false; } @@ -1430,7 +1432,9 @@ void QuicChromiumClientSession::OnPushStreamTimedOut(QuicStreamId stream_id) { QuicSpdyStream* stream = GetPromisedStream(stream_id); DCHECK(stream); - bytes_pushed_and_unclaimed_count_ += stream->stream_bytes_read(); + // TODO(zhongyi): re-enable metrics collection when crbug.com/656467 is + // solved. + // bytes_pushed_and_unclaimed_count_ += stream->stream_bytes_read(); } const LoadTimingInfo::ConnectTiming&
diff --git a/net/quic/chromium/quic_chromium_client_stream_test.cc b/net/quic/chromium/quic_chromium_client_stream_test.cc index 41e0ca5..84f97bf 100644 --- a/net/quic/chromium/quic_chromium_client_stream_test.cc +++ b/net/quic/chromium/quic_chromium_client_stream_test.cc
@@ -6,6 +6,7 @@ #include <string> +#include "base/memory/ptr_util.h" #include "base/run_loop.h" #include "base/strings/string_number_conversions.h" #include "net/base/io_buffer.h" @@ -174,7 +175,7 @@ &push_promise_index_) { stream_ = new QuicChromiumClientStream(kTestStreamId, &session_, NetLogWithSource()); - session_.ActivateStream(stream_); + session_.ActivateStream(base::WrapUnique(stream_)); stream_->SetDelegate(&delegate_); } @@ -624,7 +625,7 @@ // stream. QuicChromiumClientStream* stream = new QuicChromiumClientStream( kServerDataStreamId1, &session_, NetLogWithSource()); - session_.ActivateStream(stream); + session_.ActivateStream(base::WrapUnique(stream)); InitializeHeaders(); std::string uncompressed_headers =
diff --git a/net/quic/chromium/quic_http_stream.cc b/net/quic/chromium/quic_http_stream.cc index 059f7dd..d57b361 100644 --- a/net/quic/chromium/quic_http_stream.cc +++ b/net/quic/chromium/quic_http_stream.cc
@@ -306,6 +306,14 @@ CHECK(!user_buffer_.get()); CHECK_EQ(0, user_buffer_len_); + // Invalidate HttpRequestInfo pointer. This is to allow the stream to be + // shared across multiple transactions which might require this + // stream to outlive the request_info_'s owner. + // Only allowed when Read state machine starts. It is safe to reset it at + // this point since request_info_->upload_data_stream is also not needed + // anymore. + request_info_ = nullptr; + if (!stream_) { // If the stream is already closed, there is no body to read. return response_status_; @@ -694,7 +702,7 @@ if (rv < 0) return rv; - // If the stream is already closed, don't read the request the body. + // If the stream is already closed, don't read the request body. if (!stream_) return response_status_;
diff --git a/net/quic/chromium/quic_http_stream.h b/net/quic/chromium/quic_http_stream.h index 68bb916..5e1da7d 100644 --- a/net/quic/chromium/quic_http_stream.h +++ b/net/quic/chromium/quic_http_stream.h
@@ -150,7 +150,9 @@ // outlive this object, according to the HttpStream contract. // The request to send. + // Only valid before the response body is read. const HttpRequestInfo* request_info_; + // The request body to send, if any, owned by the caller. UploadDataStream* request_body_stream_; // Time the request was issued.
diff --git a/net/quic/chromium/quic_stream_factory_test.cc b/net/quic/chromium/quic_stream_factory_test.cc index e7c05d0..984674f 100644 --- a/net/quic/chromium/quic_stream_factory_test.cc +++ b/net/quic/chromium/quic_stream_factory_test.cc
@@ -5214,8 +5214,8 @@ // Clear cached states for the origin https://www.example.com:4433. GURL origin("https://www.example.com:4433"); - factory_->ClearCachedStatesInCryptoConfig( - base::Bind(&GURL::operator==, base::Unretained(&origin))); + factory_->ClearCachedStatesInCryptoConfig(base::Bind( + static_cast<bool (*)(const GURL&, const GURL&)>(::operator==), origin)); EXPECT_FALSE(test_cases[0].state->certs().empty()); EXPECT_FALSE(test_cases[1].state->certs().empty()); EXPECT_TRUE(test_cases[2].state->certs().empty());
diff --git a/net/quic/core/congestion_control/bbr_sender.cc b/net/quic/core/congestion_control/bbr_sender.cc index 91ab711..21b88b4c 100644 --- a/net/quic/core/congestion_control/bbr_sender.cc +++ b/net/quic/core/congestion_control/bbr_sender.cc
@@ -158,11 +158,9 @@ void BbrSender::OnCongestionEvent(bool /*rtt_updated*/, QuicByteCount prior_in_flight, + QuicTime event_time, const CongestionVector& acked_packets, const CongestionVector& lost_packets) { - // TODO(vasilvv): this should be passed from the SentPacketManager in order - // to minimize the number of Now() calls. - const QuicTime now = clock_->Now(); const QuicByteCount total_bytes_acked_before = sampler_.total_bytes_acked(); bool is_round_start = false; @@ -174,22 +172,22 @@ if (!acked_packets.empty()) { QuicPacketNumber last_acked_packet = acked_packets.rbegin()->first; is_round_start = UpdateRoundTripCounter(last_acked_packet); - min_rtt_expired = UpdateBandwidthAndMinRtt(now, acked_packets); + min_rtt_expired = UpdateBandwidthAndMinRtt(event_time, acked_packets); } // Handle logic specific to PROBE_BW mode. if (mode_ == PROBE_BW) { - UpdateGainCyclePhase(now, prior_in_flight, !lost_packets.empty()); + UpdateGainCyclePhase(event_time, prior_in_flight, !lost_packets.empty()); } // Handle logic specific to STARTUP and DRAIN modes. if (is_round_start && !is_at_full_bandwidth_) { CheckIfFullBandwidthReached(); } - MaybeExitStartupOrDrain(now); + MaybeExitStartupOrDrain(event_time); // Handle logic specific to PROBE_RTT. - MaybeEnterOrExitProbeRtt(now, is_round_start, min_rtt_expired); + MaybeEnterOrExitProbeRtt(event_time, is_round_start, min_rtt_expired); // After the model is updated, recalculate the pacing rate and congestion // window.
diff --git a/net/quic/core/congestion_control/bbr_sender.h b/net/quic/core/congestion_control/bbr_sender.h index c8fac9e..7e08423 100644 --- a/net/quic/core/congestion_control/bbr_sender.h +++ b/net/quic/core/congestion_control/bbr_sender.h
@@ -93,6 +93,7 @@ void SetNumEmulatedConnections(int num_connections) override {} void OnCongestionEvent(bool rtt_updated, QuicByteCount prior_in_flight, + QuicTime event_time, const CongestionVector& acked_packets, const CongestionVector& lost_packets) override; bool OnPacketSent(QuicTime sent_time,
diff --git a/net/quic/core/congestion_control/pacing_sender.cc b/net/quic/core/congestion_control/pacing_sender.cc index cc2c40b..8ce6e8a 100644 --- a/net/quic/core/congestion_control/pacing_sender.cc +++ b/net/quic/core/congestion_control/pacing_sender.cc
@@ -41,6 +41,7 @@ void PacingSender::OnCongestionEvent( bool rtt_updated, QuicByteCount bytes_in_flight, + QuicTime event_time, const SendAlgorithmInterface::CongestionVector& acked_packets, const SendAlgorithmInterface::CongestionVector& lost_packets) { DCHECK(sender_ != nullptr); @@ -48,8 +49,8 @@ // Clear any burst tokens when entering recovery. burst_tokens_ = 0; } - sender_->OnCongestionEvent(rtt_updated, bytes_in_flight, acked_packets, - lost_packets); + sender_->OnCongestionEvent(rtt_updated, bytes_in_flight, event_time, + acked_packets, lost_packets); } bool PacingSender::OnPacketSent(
diff --git a/net/quic/core/congestion_control/pacing_sender.h b/net/quic/core/congestion_control/pacing_sender.h index 21fbb4c..8e839c9a5 100644 --- a/net/quic/core/congestion_control/pacing_sender.h +++ b/net/quic/core/congestion_control/pacing_sender.h
@@ -43,6 +43,7 @@ void OnCongestionEvent( bool rtt_updated, QuicByteCount bytes_in_flight, + QuicTime event_time, const SendAlgorithmInterface::CongestionVector& acked_packets, const SendAlgorithmInterface::CongestionVector& lost_packets); bool OnPacketSent(QuicTime sent_time,
diff --git a/net/quic/core/congestion_control/pacing_sender_test.cc b/net/quic/core/congestion_control/pacing_sender_test.cc index 2a6073f..3a6ab93 100644 --- a/net/quic/core/congestion_control/pacing_sender_test.cc +++ b/net/quic/core/congestion_control/pacing_sender_test.cc
@@ -43,11 +43,12 @@ pacing_sender_->set_sender(mock_sender_.get()); EXPECT_CALL(*mock_sender_, PacingRate(_)).WillRepeatedly(Return(bandwidth)); if (burst_size == 0) { - EXPECT_CALL(*mock_sender_, OnCongestionEvent(_, _, _, _)); + EXPECT_CALL(*mock_sender_, OnCongestionEvent(_, _, _, _, _)); SendAlgorithmInterface::CongestionVector lost_packets; lost_packets.push_back(std::make_pair(1, kMaxPacketSize)); SendAlgorithmInterface::CongestionVector empty; - pacing_sender_->OnCongestionEvent(true, 1234, empty, lost_packets); + pacing_sender_->OnCongestionEvent(true, 1234, clock_.Now(), empty, + lost_packets); } else if (burst_size != kInitialBurstPackets) { LOG(FATAL) << "Unsupported burst_size " << burst_size << " specificied, only 0 and " << kInitialBurstPackets @@ -99,10 +100,11 @@ } void UpdateRtt() { - EXPECT_CALL(*mock_sender_, OnCongestionEvent(true, kBytesInFlight, _, _)); + EXPECT_CALL(*mock_sender_, + OnCongestionEvent(true, kBytesInFlight, _, _, _)); SendAlgorithmInterface::CongestionVector empty_map; - pacing_sender_->OnCongestionEvent(true, kBytesInFlight, empty_map, - empty_map); + pacing_sender_->OnCongestionEvent(true, kBytesInFlight, clock_.Now(), + empty_map, empty_map); } const QuicTime::Delta zero_time_; @@ -319,8 +321,9 @@ lost_packets.push_back(std::make_pair(1, kMaxPacketSize)); SendAlgorithmInterface::CongestionVector empty; EXPECT_CALL(*mock_sender_, - OnCongestionEvent(true, kMaxPacketSize, empty, lost_packets)); - pacing_sender_->OnCongestionEvent(true, kMaxPacketSize, empty, lost_packets); + OnCongestionEvent(true, kMaxPacketSize, _, empty, lost_packets)); + pacing_sender_->OnCongestionEvent(true, kMaxPacketSize, clock_.Now(), empty, + lost_packets); // One packet is sent immediately, because of 1ms pacing granularity. CheckPacketIsSentImmediately(); // Ensure packets are immediately paced.
diff --git a/net/quic/core/congestion_control/send_algorithm_interface.h b/net/quic/core/congestion_control/send_algorithm_interface.h index bdfb755b..99efdfa 100644 --- a/net/quic/core/congestion_control/send_algorithm_interface.h +++ b/net/quic/core/congestion_control/send_algorithm_interface.h
@@ -58,6 +58,7 @@ // packets considered acked or lost as a result of the congestion event. virtual void OnCongestionEvent(bool rtt_updated, QuicByteCount prior_in_flight, + QuicTime event_time, const CongestionVector& acked_packets, const CongestionVector& lost_packets) = 0;
diff --git a/net/quic/core/congestion_control/tcp_cubic_sender_base.cc b/net/quic/core/congestion_control/tcp_cubic_sender_base.cc index 0b21743..b545d680 100644 --- a/net/quic/core/congestion_control/tcp_cubic_sender_base.cc +++ b/net/quic/core/congestion_control/tcp_cubic_sender_base.cc
@@ -129,6 +129,7 @@ void TcpCubicSenderBase::OnCongestionEvent( bool rtt_updated, QuicByteCount prior_in_flight, + QuicTime /*event_time*/, const CongestionVector& acked_packets, const CongestionVector& lost_packets) { if (rtt_updated && InSlowStart() &&
diff --git a/net/quic/core/congestion_control/tcp_cubic_sender_base.h b/net/quic/core/congestion_control/tcp_cubic_sender_base.h index e49ba9a..6a7ef23 100644 --- a/net/quic/core/congestion_control/tcp_cubic_sender_base.h +++ b/net/quic/core/congestion_control/tcp_cubic_sender_base.h
@@ -50,6 +50,7 @@ void SetNumEmulatedConnections(int num_connections) override; void OnCongestionEvent(bool rtt_updated, QuicByteCount prior_in_flight, + QuicTime event_time, const CongestionVector& acked_packets, const CongestionVector& lost_packets) override; bool OnPacketSent(QuicTime sent_time,
diff --git a/net/quic/core/congestion_control/tcp_cubic_sender_bytes_test.cc b/net/quic/core/congestion_control/tcp_cubic_sender_bytes_test.cc index 5e15898..964cd006 100644 --- a/net/quic/core/congestion_control/tcp_cubic_sender_bytes_test.cc +++ b/net/quic/core/congestion_control/tcp_cubic_sender_bytes_test.cc
@@ -92,8 +92,8 @@ acked_packets.push_back( std::make_pair(acked_packet_number_, kDefaultTCPMSS)); } - sender_->OnCongestionEvent(true, bytes_in_flight_, acked_packets, - lost_packets); + sender_->OnCongestionEvent(true, bytes_in_flight_, clock_.Now(), + acked_packets, lost_packets); bytes_in_flight_ -= n * kDefaultTCPMSS; clock_.AdvanceTime(one_ms_); } @@ -108,8 +108,8 @@ lost_packets.push_back( std::make_pair(acked_packet_number_, packet_length)); } - sender_->OnCongestionEvent(false, bytes_in_flight_, acked_packets, - lost_packets); + sender_->OnCongestionEvent(false, bytes_in_flight_, clock_.Now(), + acked_packets, lost_packets); bytes_in_flight_ -= n * packet_length; } @@ -118,8 +118,8 @@ SendAlgorithmInterface::CongestionVector acked_packets; SendAlgorithmInterface::CongestionVector lost_packets; lost_packets.push_back(std::make_pair(packet_number, kDefaultTCPMSS)); - sender_->OnCongestionEvent(false, bytes_in_flight_, acked_packets, - lost_packets); + sender_->OnCongestionEvent(false, bytes_in_flight_, clock_.Now(), + acked_packets, lost_packets); bytes_in_flight_ -= kDefaultTCPMSS; } @@ -840,7 +840,7 @@ for (uint64_t i = 1; i < kDefaultMaxCongestionWindowPackets; ++i) { acked_packets.clear(); acked_packets.push_back(std::make_pair(i, 1350)); - sender->OnCongestionEvent(true, sender->GetCongestionWindow(), + sender->OnCongestionEvent(true, sender->GetCongestionWindow(), clock_.Now(), acked_packets, missing_packets); } EXPECT_EQ(kDefaultMaxCongestionWindowPackets,
diff --git a/net/quic/core/congestion_control/tcp_cubic_sender_packets_test.cc b/net/quic/core/congestion_control/tcp_cubic_sender_packets_test.cc index 757f81c..04f7649 100644 --- a/net/quic/core/congestion_control/tcp_cubic_sender_packets_test.cc +++ b/net/quic/core/congestion_control/tcp_cubic_sender_packets_test.cc
@@ -103,8 +103,8 @@ acked_packets.push_back( std::make_pair(acked_packet_number_, kDefaultTCPMSS)); } - sender_->OnCongestionEvent(true, bytes_in_flight_, acked_packets, - lost_packets); + sender_->OnCongestionEvent(true, bytes_in_flight_, clock_.Now(), + acked_packets, lost_packets); bytes_in_flight_ -= n * kDefaultTCPMSS; clock_.AdvanceTime(one_ms_); } @@ -119,8 +119,8 @@ lost_packets.push_back( std::make_pair(acked_packet_number_, packet_length)); } - sender_->OnCongestionEvent(false, bytes_in_flight_, acked_packets, - lost_packets); + sender_->OnCongestionEvent(false, bytes_in_flight_, clock_.Now(), + acked_packets, lost_packets); bytes_in_flight_ -= n * packet_length; } @@ -129,8 +129,8 @@ SendAlgorithmInterface::CongestionVector acked_packets; SendAlgorithmInterface::CongestionVector lost_packets; lost_packets.push_back(std::make_pair(packet_number, kDefaultTCPMSS)); - sender_->OnCongestionEvent(false, bytes_in_flight_, acked_packets, - lost_packets); + sender_->OnCongestionEvent(false, bytes_in_flight_, clock_.Now(), + acked_packets, lost_packets); bytes_in_flight_ -= kDefaultTCPMSS; } @@ -949,7 +949,7 @@ for (uint64_t i = 1; i < kDefaultMaxCongestionWindowPackets; ++i) { acked_packets.clear(); acked_packets.push_back(std::make_pair(i, 1350)); - sender->OnCongestionEvent(true, sender->GetCongestionWindow(), + sender->OnCongestionEvent(true, sender->GetCongestionWindow(), clock_.Now(), acked_packets, missing_packets); } EXPECT_EQ(kDefaultMaxCongestionWindowPackets,
diff --git a/net/quic/core/quic_client_session_base.cc b/net/quic/core/quic_client_session_base.cc index e8a66ee..14445ae 100644 --- a/net/quic/core/quic_client_session_base.cc +++ b/net/quic/core/quic_client_session_base.cc
@@ -181,7 +181,7 @@ } DynamicStreamMap::iterator it = dynamic_streams().find(id); if (it != dynamic_streams().end()) { - return static_cast<QuicSpdyStream*>(it->second); + return static_cast<QuicSpdyStream*>(it->second.get()); } QUIC_BUG << "Open promised stream " << id << " is missing!"; return nullptr;
diff --git a/net/quic/core/quic_connection_test.cc b/net/quic/core/quic_connection_test.cc index b3d1be9..7bc14d9 100644 --- a/net/quic/core/quic_connection_test.cc +++ b/net/quic/core/quic_connection_test.cc
@@ -1402,7 +1402,7 @@ // awaiting' is 4. The connection should then realize 1 will not be // retransmitted, and will remove it from the missing list. QuicAckFrame frame = InitAckFrame(1); - EXPECT_CALL(*send_algorithm_, OnCongestionEvent(_, _, _, _)); + EXPECT_CALL(*send_algorithm_, OnCongestionEvent(_, _, _, _, _)); ProcessAckPacket(6, &frame); // Force an ack to be sent. @@ -1454,7 +1454,7 @@ EXPECT_CALL(*loss_algorithm_, DetectLosses(_, _, _, _, _)); EXPECT_CALL(peer_entropy_calculator_, EntropyHash(511)) .WillOnce(Return(static_cast<QuicPacketEntropyHash>(0))); - EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _)); + EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); ProcessAckPacket(&frame); // A truncated ack will not have the true largest observed. @@ -1465,7 +1465,7 @@ // Removing one missing packet allows us to ack 192 and one more range, but // 192 has already been declared lost, so it doesn't register as an ack. EXPECT_CALL(*loss_algorithm_, DetectLosses(_, _, _, _, _)); - EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _)); + EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); ProcessAckPacket(&frame); EXPECT_EQ(num_packets, manager_->GetLargestObserved(frame.path_id)); } @@ -1515,7 +1515,7 @@ QuicAckFrame ack1 = InitAckFrame(1); QuicAckFrame ack2 = InitAckFrame(2); - EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _)); + EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); ProcessAckPacket(2, &ack2); // Should ack immediately since we have missing packets. EXPECT_EQ(2u, writer_->packets_write_attempts()); @@ -1540,7 +1540,7 @@ lost_packets.push_back(std::make_pair(1, kMaxPacketSize)); EXPECT_CALL(*loss_algorithm_, DetectLosses(_, _, _, _, _)) .WillOnce(SetArgPointee<4>(lost_packets)); - EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _)); + EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); QuicPacketNumber retransmission; EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, packet_size - kQuicVersionSize, _)) @@ -1550,7 +1550,7 @@ QuicAckFrame frame2 = InitAckFrame(retransmission); NackPacket(original, &frame2); - EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _)); + EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); EXPECT_CALL(*loss_algorithm_, DetectLosses(_, _, _, _, _)); ProcessAckPacket(&frame2); @@ -1589,7 +1589,7 @@ QuicAlarm* ack_alarm = QuicConnectionPeer::GetAckAlarm(&connection_); // But an ack with no missing packets will not send an ack. QuicAckFrame frame = InitAckFrame(1); - EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _)); + EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); for (int i = 0; i < 19; ++i) { ProcessAckPacket(&frame); EXPECT_FALSE(ack_alarm->IsSet()); @@ -1640,7 +1640,7 @@ } // Ack packet 1, which leaves more than the limit outstanding. - EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _)); + EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); if (GetParam().version <= QUIC_VERSION_33) { EXPECT_CALL(visitor_, OnConnectionClosed(QUIC_TOO_MANY_OUTSTANDING_SENT_PACKETS, _, @@ -1677,7 +1677,7 @@ SendStreamDataToPeer(1, "foo", 0, !kFin, nullptr); SendStreamDataToPeer(1, "bar", 3, !kFin, nullptr); SendStreamDataToPeer(1, "eep", 6, !kFin, nullptr); - EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _)); + EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); // Start out saying the largest observed is 2. QuicAckFrame frame1 = InitAckFrame(1); @@ -1728,7 +1728,7 @@ SendAckPacketToPeer(); // Packet 5 EXPECT_EQ(1u, least_unacked()); - EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _)); + EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); // Peer acks up to packet 3. QuicAckFrame frame = InitAckFrame(3); @@ -1739,7 +1739,7 @@ // ack for 4. EXPECT_EQ(4u, least_unacked()); - EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _)); + EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); // Peer acks up to packet 4, the last packet. QuicAckFrame frame2 = InitAckFrame(6); @@ -2029,7 +2029,7 @@ EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); // Don't lose a packet on an ack, and nothing is retransmitted. - EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _)); + EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); QuicAckFrame ack_one = InitAckFrame(1); ProcessAckPacket(&ack_one); @@ -2040,7 +2040,7 @@ lost_packets.push_back(std::make_pair(2, kMaxPacketSize)); EXPECT_CALL(*loss_algorithm_, DetectLosses(_, _, _, _, _)) .WillOnce(SetArgPointee<4>(lost_packets)); - EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _)); + EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, second_packet_size - kQuicVersionSize, _)) .Times(1); @@ -2099,7 +2099,7 @@ NackPacket(last_packet - 1, &nack_two); EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); EXPECT_CALL(*loss_algorithm_, DetectLosses(_, _, _, _, _)); - EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _)); + EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(0); ProcessAckPacket(&nack_two); } @@ -2122,7 +2122,7 @@ lost_packets.push_back(std::make_pair(last_packet - 1, kMaxPacketSize)); EXPECT_CALL(*loss_algorithm_, DetectLosses(_, _, _, _, _)) .WillOnce(SetArgPointee<4>(lost_packets)); - EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _)); + EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(AtLeast(1)); ProcessAckPacket(&nack_two); } @@ -2177,7 +2177,7 @@ NackPacket(last_packet - 1, &ack); EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); EXPECT_CALL(*loss_algorithm_, DetectLosses(_, _, _, _, _)); - EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _)); + EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(0); ProcessAckPacket(&ack); @@ -2209,7 +2209,7 @@ lost_packets.push_back(std::make_pair(last_packet - 1, kMaxPacketSize)); EXPECT_CALL(*loss_algorithm_, DetectLosses(_, _, _, _, _)) .WillOnce(SetArgPointee<4>(lost_packets)); - EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _)); + EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(0); ProcessAckPacket(&ack); @@ -2243,7 +2243,7 @@ lost_packets.push_back(std::make_pair(2, kMaxPacketSize)); EXPECT_CALL(*loss_algorithm_, DetectLosses(_, _, _, _, _)) .WillOnce(SetArgPointee<4>(lost_packets)); - EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _)); + EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); ProcessAckPacket(&nack_two); EXPECT_EQ(1u, connection_.NumQueuedPackets()); @@ -2281,7 +2281,7 @@ lost_packets.push_back(std::make_pair(1, kMaxPacketSize)); EXPECT_CALL(*loss_algorithm_, DetectLosses(_, _, _, _, _)) .WillOnce(SetArgPointee<4>(lost_packets)); - EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _)); + EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, packet_size - kQuicVersionSize, _)); ProcessAckPacket(&frame); @@ -2358,7 +2358,7 @@ // Ack the sent packet before the callback returns, which happens in // rare circumstances with write blocked sockets. QuicAckFrame ack = InitAckFrame(1); - EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _)); + EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); ProcessAckPacket(&ack); writer_->SetWritable(); @@ -2409,7 +2409,7 @@ } EXPECT_CALL(*loss_algorithm_, DetectLosses(_, _, _, _, _)) .WillOnce(SetArgPointee<4>(lost_packets)); - EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _)); + EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(14); ProcessAckPacket(&nack); } @@ -2430,14 +2430,14 @@ EXPECT_EQ(6u, last_packet); // Client will ack packets 1, 2, [!3], 4, 5. - EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _)); + EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); QuicAckFrame frame1 = InitAckFrame(5); NackPacket(3, &frame1); EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); ProcessAckPacket(&frame1); // Now the client implicitly acks 3, and explicitly acks 6. - EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _)); + EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); QuicAckFrame frame2 = InitAckFrame(6); ProcessAckPacket(&frame2); } @@ -2450,7 +2450,7 @@ SendAckPacketToPeer(); // Packet 2 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); - EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _)); + EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); QuicAckFrame frame = InitAckFrame(1); ProcessAckPacket(&frame); @@ -2459,7 +2459,7 @@ EXPECT_EQ(2u, stop_waiting()->least_unacked); - EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _)); + EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); frame = InitAckFrame(2); ProcessAckPacket(&frame); EXPECT_EQ(3u, stop_waiting()->least_unacked); @@ -2474,7 +2474,7 @@ EXPECT_EQ(3u, least_unacked()); // Ack the ack, which updates the rtt and raises the least unacked. - EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _)); + EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); frame = InitAckFrame(3); ProcessAckPacket(&frame); @@ -2494,7 +2494,7 @@ SendStreamDataToPeer(1, "bar", 6, false, nullptr); // Packet 6 SendStreamDataToPeer(1, "bar", 9, false, nullptr); // Packet 7 - EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _)); + EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); frame = InitAckFrame(7); NackPacket(5, &frame); NackPacket(6, &frame); @@ -2769,7 +2769,7 @@ // Advance the time right before the RTO, then receive an ack for the first // packet to delay the RTO. clock_.AdvanceTime(DefaultRetransmissionTime()); - EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _)); + EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); QuicAckFrame ack = InitAckFrame(1); ProcessAckPacket(&ack); // Now we have an RTT sample of DefaultRetransmissionTime(500ms), @@ -2860,7 +2860,7 @@ clock_.AdvanceTime(QuicTime::Delta::FromSeconds(3)); QuicAckFrame frame = InitAckFrame(1); EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); - EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _)); + EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); ProcessAckPacket(&frame); // Fire early to verify it wouldn't timeout yet. @@ -2904,7 +2904,7 @@ clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(5)); QuicAckFrame frame = InitAckFrame(1); EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); - EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _)); + EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); ProcessAckPacket(&frame); EXPECT_TRUE(connection_.GetPingAlarm()->IsSet()); // The ping timer is set slightly less than 15 seconds in the future, because @@ -2949,7 +2949,7 @@ clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(5)); QuicAckFrame frame = InitAckFrame(1); EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); - EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _)); + EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); ProcessAckPacket(&frame); EXPECT_TRUE(connection_.GetPingAlarm()->IsSet()); // The ping timer is set slightly less than 10 seconds in the future, because @@ -3000,7 +3000,7 @@ // Acknowledge all packets so far. QuicAckFrame probe_ack = InitAckFrame(3); EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); - EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _)); + EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); ProcessAckPacket(&probe_ack); EXPECT_EQ(new_mtu, connection_.max_packet_length()); @@ -3052,7 +3052,7 @@ // Acknowledge all packets sent so far. QuicAckFrame probe_ack = InitAckFrame(probe_packet_number); EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); - EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _)); + EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); ProcessAckPacket(&probe_ack); EXPECT_EQ(kMtuDiscoveryTargetPacketSizeHigh, connection_.max_packet_length()); EXPECT_EQ(0u, connection_.GetBytesInFlight(kDefaultPathId)); @@ -3094,7 +3094,7 @@ // Called by the first ack. EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); // Called on many acks. - EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _)) + EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)) .Times(AnyNumber()); for (QuicPacketCount i = 0; i < number_of_packets; i++) { SendStreamDataToPeer(3, "!", i, /*fin=*/false, nullptr); @@ -3169,7 +3169,7 @@ // Acknowledge all packets sent so far. QuicAckFrame probe_ack = InitAckFrame(probe_sequence_number); EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); - EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _)); + EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); ProcessAckPacket(&probe_ack); EXPECT_EQ(mtu_limit, connection_.max_packet_length()); EXPECT_EQ(0u, connection_.GetBytesInFlight(kDefaultPathId)); @@ -3221,7 +3221,7 @@ QuicAckFrame probe_ack = InitAckFrame(creator_->packet_number()); NackPacket(probe_number, &probe_ack); EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); - EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _)); + EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); ProcessAckPacket(&probe_ack); EXPECT_EQ(initial_mtu, connection_.max_packet_length()); @@ -3461,7 +3461,7 @@ // When we receive a packet, the timeout will change to 5ms + // kInitialIdleTimeoutSecs. QuicAckFrame ack = InitAckFrame(2); - EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _)); + EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); ProcessAckPacket(&ack); // The original alarm will fire. We should not time out because we had a @@ -3515,7 +3515,7 @@ // When we receive a packet, the timeout will change to 5ms + // kInitialIdleTimeoutSecs. QuicAckFrame ack = InitAckFrame(2); - EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _)); + EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); ProcessAckPacket(&ack); // The original alarm will fire. We should not time out because we had a @@ -4273,7 +4273,7 @@ lost_packets.push_back(std::make_pair(1, kMaxPacketSize)); EXPECT_CALL(*loss_algorithm_, DetectLosses(_, _, _, _, _)) .WillOnce(SetArgPointee<4>(lost_packets)); - EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _)); + EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); ProcessAckPacket(&ack); EXPECT_EQ(1u, writer_->frame_count()); EXPECT_EQ(1u, writer_->stream_frames().size()); @@ -4284,7 +4284,7 @@ ack = InitAckFrame(3); NackPacket(1, &ack); EXPECT_CALL(*loss_algorithm_, DetectLosses(_, _, _, _, _)); - EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _)); + EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); ProcessAckPacket(&ack); // Check that no packet is sent and the ack alarm isn't set. @@ -4683,7 +4683,7 @@ lost_packets.push_back(std::make_pair(3, kMaxPacketSize)); EXPECT_CALL(*loss_algorithm_, DetectLosses(_, _, _, _, _)) .WillOnce(SetArgPointee<4>(lost_packets)); - EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _)); + EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); EXPECT_CALL(visitor_, OnCanWrite()); EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); ProcessAckPacket(&nack_three); @@ -4801,7 +4801,7 @@ connection_.SendStreamDataWithString(1, "foo", 0, !kFin, listener.get()); // Process an ACK from the server which should trigger the callback. - EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _)); + EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); QuicAckFrame frame = InitAckFrame(1); ProcessAckPacket(&frame); } @@ -4829,7 +4829,7 @@ lost_packets.push_back(std::make_pair(1, kMaxPacketSize)); EXPECT_CALL(*loss_algorithm_, DetectLosses(_, _, _, _, _)) .WillOnce(SetArgPointee<4>(lost_packets)); - EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _)); + EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); ProcessAckPacket(&frame); } @@ -4854,14 +4854,14 @@ lost_packets.push_back(std::make_pair(2, kMaxPacketSize)); EXPECT_CALL(*loss_algorithm_, DetectLosses(_, _, _, _, _)) .WillOnce(SetArgPointee<4>(lost_packets)); - EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _)); + EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)); ProcessAckPacket(&frame); // Now we get an ACK for packet 5 (retransmitted packet 2), which should // trigger the callback. EXPECT_CALL(*loss_algorithm_, DetectLosses(_, _, _, _, _)); - EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _)); + EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); QuicAckFrame second_ack_frame = InitAckFrame(5); ProcessAckPacket(&second_ack_frame); } @@ -4895,12 +4895,12 @@ // Ack the original packet, which will revert the RTO. EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); EXPECT_CALL(*listener, OnPacketAcked(3, _)); - EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _)); + EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); QuicAckFrame ack_frame = InitAckFrame(1); ProcessAckPacket(&ack_frame); // listener is not notified again when the retransmit is acked. - EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _)); + EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); QuicAckFrame second_ack_frame = InitAckFrame(2); ProcessAckPacket(&second_ack_frame); } @@ -4927,7 +4927,7 @@ lost_packets.push_back(std::make_pair(2, kMaxPacketSize)); EXPECT_CALL(*loss_algorithm_, DetectLosses(_, _, _, _, _)) .WillOnce(SetArgPointee<4>(lost_packets)); - EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _)); + EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)); ProcessAckPacket(&frame); @@ -4940,7 +4940,7 @@ // Verify that the listener is not notified again when the // retransmit is acked. EXPECT_CALL(*loss_algorithm_, DetectLosses(_, _, _, _, _)); - EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _)); + EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); QuicAckFrame third_ack_frame = InitAckFrame(5); ProcessAckPacket(&third_ack_frame); } @@ -5038,7 +5038,7 @@ // Process an ack and the send alarm will be set to the new 2ms delay. QuicAckFrame ack = InitAckFrame(1); EXPECT_CALL(*loss_algorithm_, DetectLosses(_, _, _, _, _)); - EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _)); + EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); EXPECT_CALL(*send_algorithm_, TimeUntilSend(_, _)) .WillRepeatedly(Return(QuicTime::Delta::FromMilliseconds(2))); ProcessAckPacket(&ack);
diff --git a/net/quic/core/quic_sent_packet_manager.cc b/net/quic/core/quic_sent_packet_manager.cc index 992984b7..380448c 100644 --- a/net/quic/core/quic_sent_packet_manager.cc +++ b/net/quic/core/quic_sent_packet_manager.cc
@@ -214,7 +214,7 @@ if (consecutive_rto_count_ > 0 && !use_new_rto_) { packets_lost_.clear(); } - MaybeInvokeCongestionEvent(rtt_updated, prior_in_flight); + MaybeInvokeCongestionEvent(rtt_updated, prior_in_flight, ack_receive_time); unacked_packets_.RemoveObsoletePackets(); sustained_bandwidth_recorder_.RecordEstimate( @@ -273,15 +273,16 @@ void QuicSentPacketManager::MaybeInvokeCongestionEvent( bool rtt_updated, - QuicByteCount prior_in_flight) { + QuicByteCount prior_in_flight, + QuicTime event_time) { if (!rtt_updated && packets_acked_.empty() && packets_lost_.empty()) { return; } if (using_pacing_) { - pacing_sender_.OnCongestionEvent(rtt_updated, prior_in_flight, + pacing_sender_.OnCongestionEvent(rtt_updated, prior_in_flight, event_time, packets_acked_, packets_lost_); } else { - send_algorithm_->OnCongestionEvent(rtt_updated, prior_in_flight, + send_algorithm_->OnCongestionEvent(rtt_updated, prior_in_flight, event_time, packets_acked_, packets_lost_); } packets_acked_.clear(); @@ -589,8 +590,9 @@ case LOSS_MODE: { ++stats_->loss_timeout_count; QuicByteCount prior_in_flight = unacked_packets_.bytes_in_flight(); - InvokeLossDetection(clock_->Now()); - MaybeInvokeCongestionEvent(false, prior_in_flight); + const QuicTime now = clock_->Now(); + InvokeLossDetection(now); + MaybeInvokeCongestionEvent(false, prior_in_flight, now); return; } case TLP_MODE:
diff --git a/net/quic/core/quic_sent_packet_manager.h b/net/quic/core/quic_sent_packet_manager.h index 62a5fef..4da97b0a 100644 --- a/net/quic/core/quic_sent_packet_manager.h +++ b/net/quic/core/quic_sent_packet_manager.h
@@ -270,9 +270,12 @@ // Invokes OnCongestionEvent if |rtt_updated| is true, there are pending acks, // or pending losses. Clears pending acks and pending losses afterwards. // |prior_in_flight| is the number of bytes in flight before the losses or - // acks. + // acks, |event_time| is normally the timestamp of the ack packet which caused + // the event, although it can be the time at which loss detection was + // triggered. void MaybeInvokeCongestionEvent(bool rtt_updated, - QuicByteCount prior_in_flight); + QuicByteCount prior_in_flight, + QuicTime event_time); // Called when frames of |packet_number| has been received but the packet // itself has not been received by the peer. Currently, this method is not
diff --git a/net/quic/core/quic_sent_packet_manager_test.cc b/net/quic/core/quic_sent_packet_manager_test.cc index 23134bc2..62e5993a 100644 --- a/net/quic/core/quic_sent_packet_manager_test.cc +++ b/net/quic/core/quic_sent_packet_manager_test.cc
@@ -142,14 +142,14 @@ void ExpectAck(QuicPacketNumber largest_observed) { EXPECT_CALL( *send_algorithm_, - OnCongestionEvent(true, _, ElementsAre(Pair(largest_observed, _)), + OnCongestionEvent(true, _, _, ElementsAre(Pair(largest_observed, _)), IsEmpty())); EXPECT_CALL(*network_change_visitor_, OnCongestionChange()); } void ExpectUpdatedRtt(QuicPacketNumber largest_observed) { EXPECT_CALL(*send_algorithm_, - OnCongestionEvent(true, _, IsEmpty(), IsEmpty())); + OnCongestionEvent(true, _, _, IsEmpty(), IsEmpty())); EXPECT_CALL(*network_change_visitor_, OnCongestionChange()); } @@ -157,7 +157,7 @@ QuicPacketNumber largest_observed, QuicPacketNumber lost_packet) { EXPECT_CALL(*send_algorithm_, - OnCongestionEvent(rtt_updated, _, + OnCongestionEvent(rtt_updated, _, _, ElementsAre(Pair(largest_observed, _)), ElementsAre(Pair(lost_packet, _)))); EXPECT_CALL(*network_change_visitor_, OnCongestionChange()); @@ -179,7 +179,7 @@ } EXPECT_CALL( *send_algorithm_, - OnCongestionEvent(rtt_updated, _, Pointwise(KeyEq(), ack_vector), + OnCongestionEvent(rtt_updated, _, _, Pointwise(KeyEq(), ack_vector), Pointwise(KeyEq(), lost_vector))); EXPECT_CALL(*network_change_visitor_, OnCongestionChange()) .Times(AnyNumber()); @@ -774,7 +774,7 @@ NackPackets(0, 103, &ack_frame); EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true)); EXPECT_CALL(*send_algorithm_, - OnCongestionEvent(true, _, ElementsAre(Pair(103, _)), _)); + OnCongestionEvent(true, _, _, ElementsAre(Pair(103, _)), _)); EXPECT_CALL(*network_change_visitor_, OnCongestionChange()); manager_.OnIncomingAck(ack_frame, clock_.ApproximateNow()); // All packets before 103 should be lost. @@ -997,7 +997,7 @@ ack_frame.ack_delay_time = QuicTime::Delta::Zero(); // Ensure no packets are lost. EXPECT_CALL(*send_algorithm_, - OnCongestionEvent(true, _, ElementsAre(Pair(102, _)), + OnCongestionEvent(true, _, _, ElementsAre(Pair(102, _)), /*lost_packets=*/IsEmpty())); EXPECT_CALL(*network_change_visitor_, OnCongestionChange()); EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true)); @@ -1045,7 +1045,7 @@ ack_frame.ack_delay_time = QuicTime::Delta::Zero(); // This will include packets in the lost packet map. EXPECT_CALL(*send_algorithm_, - OnCongestionEvent(true, _, ElementsAre(Pair(102, _)), + OnCongestionEvent(true, _, _, ElementsAre(Pair(102, _)), /*lost_packets=*/Not(IsEmpty()))); EXPECT_CALL(*network_change_visitor_, OnCongestionChange()); manager_.OnIncomingAck(ack_frame, clock_.Now()); @@ -1598,7 +1598,7 @@ } auto loss_algorithm = base::MakeUnique<MockLossAlgorithm>(); QuicSentPacketManagerPeer::SetLossAlgorithm(&manager_, loss_algorithm.get()); - EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _)); + EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); EXPECT_CALL(*network_change_visitor_, OnCongestionChange()); SendAlgorithmInterface::CongestionVector lost_packets; for (size_t i = 1; i < kNumSentPackets; ++i) {
diff --git a/net/quic/core/quic_server_session_base_test.cc b/net/quic/core/quic_server_session_base_test.cc index 77ba4e2..501e0a9 100644 --- a/net/quic/core/quic_server_session_base_test.cc +++ b/net/quic/core/quic_server_session_base_test.cc
@@ -8,6 +8,7 @@ #include <memory> #include "base/macros.h" +#include "base/memory/ptr_util.h" #include "net/quic/core/crypto/quic_crypto_server_config.h" #include "net/quic/core/crypto/quic_random.h" #include "net/quic/core/proto/cached_network_parameters.pb.h" @@ -93,7 +94,7 @@ return nullptr; } QuicSpdyStream* stream = new QuicSimpleServerStream(id, this); - ActivateStream(stream); + ActivateStream(base::WrapUnique(stream)); return stream; } @@ -105,7 +106,7 @@ QuicSpdyStream* stream = new QuicSimpleServerStream(GetNextOutgoingStreamId(), this); stream->SetPriority(priority); - ActivateStream(stream); + ActivateStream(base::WrapUnique(stream)); return stream; }
diff --git a/net/quic/core/quic_session.cc b/net/quic/core/quic_session.cc index 4df0b42..0bdc5a8 100644 --- a/net/quic/core/quic_session.cc +++ b/net/quic/core/quic_session.cc
@@ -4,6 +4,7 @@ #include "net/quic/core/quic_session.h" +#include "base/memory/ptr_util.h" #include "base/stl_util.h" #include "base/strings/string_number_conversions.h" #include "base/strings/stringprintf.h" @@ -57,9 +58,6 @@ } QuicSession::~QuicSession() { - base::STLDeleteElements(&closed_streams_); - base::STLDeleteValues(&dynamic_stream_map_); - DLOG_IF(WARNING, num_locally_closed_incoming_streams_highest_offset() > max_open_incoming_streams_) << "Surprisingly high number of locally closed peer initiated streams" @@ -350,14 +348,14 @@ DVLOG(1) << ENDPOINT << "Stream is already closed: " << stream_id; return; } - ReliableQuicStream* stream = it->second; + ReliableQuicStream* stream = it->second.get(); // Tell the stream that a RST has been sent. if (locally_reset) { stream->set_rst_sent(true); } - closed_streams_.push_back(it->second); + closed_streams_.push_back(std::move(it->second)); // If we haven't received a FIN or RST for this stream, we need to keep track // of the how many bytes the stream's flow controller believes it has @@ -568,13 +566,14 @@ return &config_; } -void QuicSession::ActivateStream(ReliableQuicStream* stream) { +void QuicSession::ActivateStream(std::unique_ptr<ReliableQuicStream> stream) { + QuicStreamId stream_id = stream->id(); DVLOG(1) << ENDPOINT << "num_streams: " << dynamic_stream_map_.size() - << ". activating " << stream->id(); - DCHECK(!base::ContainsKey(dynamic_stream_map_, stream->id())); - DCHECK(!base::ContainsKey(static_stream_map_, stream->id())); - dynamic_stream_map_[stream->id()] = stream; - if (IsIncomingStream(stream->id())) { + << ". activating " << stream_id; + DCHECK(!base::ContainsKey(dynamic_stream_map_, stream_id)); + DCHECK(!base::ContainsKey(static_stream_map_, stream_id)); + dynamic_stream_map_[stream_id] = std::move(stream); + if (IsIncomingStream(stream_id)) { ++num_dynamic_incoming_streams_; } // Increase the number of streams being emulated when a new one is opened. @@ -655,7 +654,7 @@ DynamicStreamMap::iterator it = dynamic_stream_map_.find(stream_id); if (it != dynamic_stream_map_.end()) { - return it->second; + return it->second.get(); } if (IsClosedStream(stream_id)) { @@ -764,7 +763,6 @@ } void QuicSession::PostProcessAfterData() { - base::STLDeleteElements(&closed_streams_); closed_streams_.clear(); }
diff --git a/net/quic/core/quic_session.h b/net/quic/core/quic_session.h index 29b50033..74257329 100644 --- a/net/quic/core/quic_session.h +++ b/net/quic/core/quic_session.h
@@ -232,8 +232,11 @@ using StaticStreamMap = base::SmallMap<std::unordered_map<QuicStreamId, ReliableQuicStream*>, 2>; - using DynamicStreamMap = - base::SmallMap<std::unordered_map<QuicStreamId, ReliableQuicStream*>, 10>; + using DynamicStreamMap = base::SmallMap< + std::unordered_map<QuicStreamId, std::unique_ptr<ReliableQuicStream>>, + 10>; + + using ClosedStreams = std::vector<std::unique_ptr<ReliableQuicStream>>; // Creates a new stream to handle a peer-initiated stream. // Caller does not own the returned stream. @@ -250,8 +253,7 @@ virtual QuicCryptoStream* GetCryptoStream() = 0; // Adds |stream| to the dynamic stream map. - // Takes ownership of |stream|. - virtual void ActivateStream(ReliableQuicStream* stream); + virtual void ActivateStream(std::unique_ptr<ReliableQuicStream> stream); // Returns the stream ID for a new outgoing stream, and increments the // underlying counter. @@ -287,9 +289,7 @@ return dynamic_stream_map_; } - std::vector<ReliableQuicStream*>* closed_streams() { - return &closed_streams_; - } + ClosedStreams* closed_streams() { return &closed_streams_; } void set_max_open_incoming_streams(size_t max_open_incoming_streams); void set_max_open_outgoing_streams(size_t max_open_outgoing_streams); @@ -361,7 +361,7 @@ QuicConnection* connection_; - std::vector<ReliableQuicStream*> closed_streams_; + ClosedStreams closed_streams_; QuicConfig config_;
diff --git a/net/quic/core/quic_session_test.cc b/net/quic/core/quic_session_test.cc index 59250ee..fb2639a 100644 --- a/net/quic/core/quic_session_test.cc +++ b/net/quic/core/quic_session_test.cc
@@ -7,6 +7,7 @@ #include <set> #include <utility> +#include "base/memory/ptr_util.h" #include "base/rand_util.h" #include "base/stl_util.h" #include "base/strings/string_number_conversions.h" @@ -129,7 +130,7 @@ TestStream* CreateOutgoingDynamicStream(SpdyPriority priority) override { TestStream* stream = new TestStream(GetNextOutgoingStreamId(), this); stream->SetPriority(priority); - ActivateStream(stream); + ActivateStream(base::WrapUnique(stream)); return stream; } @@ -142,7 +143,7 @@ return nullptr; } else { TestStream* stream = new TestStream(id, this); - ActivateStream(stream); + ActivateStream(base::WrapUnique(stream)); return stream; } }
diff --git a/net/quic/core/quic_spdy_session.cc b/net/quic/core/quic_spdy_session.cc index c4b7b0e..1e8d82c 100644 --- a/net/quic/core/quic_spdy_session.cc +++ b/net/quic/core/quic_spdy_session.cc
@@ -23,11 +23,11 @@ QuicSpdySession::~QuicSpdySession() { // Set the streams' session pointers in closed and dynamic stream lists // to null to avoid subsequent use of this session. - for (auto* stream : *closed_streams()) { - static_cast<QuicSpdyStream*>(stream)->ClearSession(); + for (auto& stream : *closed_streams()) { + static_cast<QuicSpdyStream*>(stream.get())->ClearSession(); } for (auto const& kv : dynamic_streams()) { - static_cast<QuicSpdyStream*>(kv.second)->ClearSession(); + static_cast<QuicSpdyStream*>(kv.second.get())->ClearSession(); } }
diff --git a/net/quic/core/quic_spdy_stream_test.cc b/net/quic/core/quic_spdy_stream_test.cc index 870f3b8..90de294 100644 --- a/net/quic/core/quic_spdy_stream_test.cc +++ b/net/quic/core/quic_spdy_stream_test.cc
@@ -7,6 +7,7 @@ #include <memory> #include <utility> +#include "base/memory/ptr_util.h" #include "base/strings/string_number_conversions.h" #include "net/quic/core/quic_connection.h" #include "net/quic/core/quic_utils.h" @@ -103,10 +104,10 @@ session_.reset(new testing::StrictMock<MockQuicSpdySession>(connection_)); stream_ = new TestStream(kClientDataStreamId1, session_.get(), stream_should_process_data); - session_->ActivateStream(stream_); + session_->ActivateStream(base::WrapUnique(stream_)); stream2_ = new TestStream(kClientDataStreamId2, session_.get(), stream_should_process_data); - session_->ActivateStream(stream2_); + session_->ActivateStream(base::WrapUnique(stream2_)); } protected:
diff --git a/net/quic/core/reliable_quic_stream_test.cc b/net/quic/core/reliable_quic_stream_test.cc index ceeee843..c135476 100644 --- a/net/quic/core/reliable_quic_stream_test.cc +++ b/net/quic/core/reliable_quic_stream_test.cc
@@ -6,6 +6,7 @@ #include <memory> +#include "base/memory/ptr_util.h" #include "net/quic/core/quic_connection.h" #include "net/quic/core/quic_flags.h" #include "net/quic/core/quic_utils.h" @@ -117,7 +118,7 @@ stream_ = new TestStream(kTestStreamId, session_.get(), stream_should_process_data); // session_ now owns stream_. - session_->ActivateStream(stream_); + session_->ActivateStream(base::WrapUnique(stream_)); // Ignore resetting when session_ is terminated. EXPECT_CALL(*session_, SendRstStream(kTestStreamId, _, _)) .Times(AnyNumber());
diff --git a/net/quic/test_tools/quic_session_peer.cc b/net/quic/test_tools/quic_session_peer.cc index b4d49f7..f3d9f0d 100644 --- a/net/quic/test_tools/quic_session_peer.cc +++ b/net/quic/test_tools/quic_session_peer.cc
@@ -73,9 +73,10 @@ } // static -void QuicSessionPeer::ActivateStream(QuicSession* session, - ReliableQuicStream* stream) { - return session->ActivateStream(stream); +void QuicSessionPeer::ActivateStream( + QuicSession* session, + std::unique_ptr<ReliableQuicStream> stream) { + return session->ActivateStream(std::move(stream)); } // static
diff --git a/net/quic/test_tools/quic_session_peer.h b/net/quic/test_tools/quic_session_peer.h index 6edb50f..4b0e893 100644 --- a/net/quic/test_tools/quic_session_peer.h +++ b/net/quic/test_tools/quic_session_peer.h
@@ -8,6 +8,7 @@ #include <stdint.h> #include <map> +#include <memory> #include "base/macros.h" #include "net/quic/core/quic_protocol.h" @@ -41,7 +42,8 @@ static QuicSession::StaticStreamMap& static_streams(QuicSession* session); static std::unordered_set<QuicStreamId>* GetDrainingStreams( QuicSession* session); - static void ActivateStream(QuicSession* session, ReliableQuicStream* stream); + static void ActivateStream(QuicSession* session, + std::unique_ptr<ReliableQuicStream> stream); // Discern the state of a stream. Exactly one of these should be true at a // time for any stream id > 0 (other than the special streams 1 and 3).
diff --git a/net/quic/test_tools/quic_test_utils.h b/net/quic/test_tools/quic_test_utils.h index 767c384..368dbb2 100644 --- a/net/quic/test_tools/quic_test_utils.h +++ b/net/quic/test_tools/quic_test_utils.h
@@ -735,9 +735,10 @@ MOCK_METHOD1(SetNumEmulatedConnections, void(int num_connections)); MOCK_METHOD1(SetMaxCongestionWindow, void(QuicByteCount max_congestion_window)); - MOCK_METHOD4(OnCongestionEvent, + MOCK_METHOD5(OnCongestionEvent, void(bool rtt_updated, QuicByteCount bytes_in_flight, + QuicTime event_time, const CongestionVector& acked_packets, const CongestionVector& lost_packets)); MOCK_METHOD5(OnPacketSent,
diff --git a/net/spdy/spdy_frame_builder.h b/net/spdy/spdy_frame_builder.h index dbc4c3f..ab21e0a 100644 --- a/net/spdy/spdy_frame_builder.h +++ b/net/spdy/spdy_frame_builder.h
@@ -53,8 +53,8 @@ // Populates this frame with a SPDY control frame header using // version-specific information from the |framer| and length information from - // capacity_. The given type must be a control frame type. - // Used only for SPDY versions <4. + // |capacity_|. The given type must be a control frame type. + // Used only for SPDY3. bool WriteControlFrameHeader(const SpdyFramer& framer, SpdyFrameType type, uint8_t flags); @@ -66,9 +66,9 @@ uint8_t flags); // Populates this frame with a HTTP2 frame prefix using version-specific - // information from the |framer| and length information from |capacity_|. - // The given type must be a control frame type. Used only for SPDY versions - // >=4. + // information from the |framer| and length information from |capacity_|. The + // given type must be a control frame type. + // Used only for HTTP2. bool BeginNewFrame(const SpdyFramer& framer, SpdyFrameType type, uint8_t flags,
diff --git a/net/spdy/spdy_http_stream.cc b/net/spdy/spdy_http_stream.cc index 5f0da2f1..5dd1439 100644 --- a/net/spdy/spdy_http_stream.cc +++ b/net/spdy/spdy_http_stream.cc
@@ -120,6 +120,14 @@ int SpdyHttpStream::ReadResponseBody( IOBuffer* buf, int buf_len, const CompletionCallback& callback) { + // Invalidate HttpRequestInfo pointer. This is to allow the stream to be + // shared across multiple transactions which might require this + // stream to outlive the request_'s owner. + // Only allowed when Reading of response body starts. It is safe to reset it + // at this point since request_->upload_data_stream is also not needed + // anymore. + request_info_ = nullptr; + if (stream_.get()) CHECK(!stream_->IsIdle()); @@ -367,7 +375,7 @@ void SpdyHttpStream::OnClose(int status) { // Cancel any pending reads from the upload data stream. - if (request_info_->upload_data_stream) + if (request_info_ && request_info_->upload_data_stream) request_info_->upload_data_stream->Reset(); if (stream_.get()) {
diff --git a/net/spdy/spdy_http_stream.h b/net/spdy/spdy_http_stream.h index 8266c143..776dfeca 100644 --- a/net/spdy/spdy_http_stream.h +++ b/net/spdy/spdy_http_stream.h
@@ -156,6 +156,9 @@ int64_t closed_stream_sent_bytes_; // The request to send. + // Set to null when response body is starting to be read. This is to allow + // the stream to be shared for reading and to possibly outlive request_info_'s + // owner. const HttpRequestInfo* request_info_; // |response_info_| is the HTTP response data object which is filled in
diff --git a/net/ssl/ssl_config_service.cc b/net/ssl/ssl_config_service.cc index a00e03b..c80113c4 100644 --- a/net/ssl/ssl_config_service.cc +++ b/net/ssl/ssl_config_service.cc
@@ -74,7 +74,8 @@ } void SSLConfigService::NotifySSLConfigChange() { - FOR_EACH_OBSERVER(Observer, observer_list_, OnSSLConfigChanged()); + for (auto& observer : observer_list_) + observer.OnSSLConfigChanged(); } SSLConfigService::~SSLConfigService() {
diff --git a/net/test/embedded_test_server/http_response.cc b/net/test/embedded_test_server/http_response.cc index 51e75610..2ce3948 100644 --- a/net/test/embedded_test_server/http_response.cc +++ b/net/test/embedded_test_server/http_response.cc
@@ -78,5 +78,8 @@ send.Run(ToResponseString(), done); } +void HungResponse::SendResponse(const SendBytesCallback& send, + const SendCompleteCallback& done) {} + } // namespace test_server } // namespace net
diff --git a/net/test/embedded_test_server/http_response.h b/net/test/embedded_test_server/http_response.h index caca4bf1f..407a863 100644 --- a/net/test/embedded_test_server/http_response.h +++ b/net/test/embedded_test_server/http_response.h
@@ -96,6 +96,20 @@ DISALLOW_COPY_AND_ASSIGN(RawHttpResponse); }; +// "Response" where the server doesn't actually respond until the server is +// destroyed. +class HungResponse : public HttpResponse { + public: + HungResponse() {} + ~HungResponse() override {} + + void SendResponse(const SendBytesCallback& send, + const SendCompleteCallback& done) override; + + private: + DISALLOW_COPY_AND_ASSIGN(HungResponse); +}; + } // namespace test_server } // namespace net
diff --git a/net/tools/quic/end_to_end_test.cc b/net/tools/quic/end_to_end_test.cc index 9201152..2196187 100644 --- a/net/tools/quic/end_to_end_test.cc +++ b/net/tools/quic/end_to_end_test.cc
@@ -11,6 +11,7 @@ #include <utility> #include <vector> +#include "base/memory/ptr_util.h" #include "base/memory/singleton.h" #include "base/strings/string_number_conversions.h" #include "base/synchronization/waitable_event.h" @@ -2326,8 +2327,9 @@ ~ClientSessionThatDropsBody() override {} - QuicSpdyClientStream* CreateClientStream() override { - return new ClientStreamThatDropsBody(GetNextOutgoingStreamId(), this); + std::unique_ptr<QuicSpdyClientStream> CreateClientStream() override { + return base::MakeUnique<ClientStreamThatDropsBody>( + GetNextOutgoingStreamId(), this); } };
diff --git a/net/tools/quic/quic_client_session.cc b/net/tools/quic/quic_client_session.cc index 48ed1d0..e84d85b 100644 --- a/net/tools/quic/quic_client_session.cc +++ b/net/tools/quic/quic_client_session.cc
@@ -5,6 +5,7 @@ #include "net/tools/quic/quic_client_session.h" #include "base/logging.h" +#include "base/memory/ptr_util.h" #include "net/log/net_log_with_source.h" #include "net/quic/chromium/crypto/proof_verifier_chromium.h" #include "net/quic/core/crypto/crypto_protocol.h" @@ -63,14 +64,16 @@ if (!ShouldCreateOutgoingDynamicStream()) { return nullptr; } - QuicSpdyClientStream* stream = CreateClientStream(); + std::unique_ptr<QuicSpdyClientStream> stream = CreateClientStream(); stream->SetPriority(priority); - ActivateStream(stream); - return stream; + QuicSpdyClientStream* stream_ptr = stream.get(); + ActivateStream(std::move(stream)); + return stream_ptr; } -QuicSpdyClientStream* QuicClientSession::CreateClientStream() { - return new QuicSpdyClientStream(GetNextOutgoingStreamId(), this); +std::unique_ptr<QuicSpdyClientStream> QuicClientSession::CreateClientStream() { + return base::MakeUnique<QuicSpdyClientStream>(GetNextOutgoingStreamId(), + this); } QuicCryptoClientStreamBase* QuicClientSession::GetCryptoStream() { @@ -117,7 +120,7 @@ } QuicSpdyStream* stream = new QuicSpdyClientStream(id, this); stream->CloseWriteSide(); - ActivateStream(stream); + ActivateStream(base::WrapUnique(stream)); return stream; }
diff --git a/net/tools/quic/quic_client_session.h b/net/tools/quic/quic_client_session.h index af9ee09..031621b 100644 --- a/net/tools/quic/quic_client_session.h +++ b/net/tools/quic/quic_client_session.h
@@ -77,7 +77,7 @@ // this simply returns a new QuicSpdyClientStream. This may be used by // subclasses which want to use a subclass of QuicSpdyClientStream for streams // but wish to use the sanity checks in CreateOutgoingDynamicStream. - virtual QuicSpdyClientStream* CreateClientStream(); + virtual std::unique_ptr<QuicSpdyClientStream> CreateClientStream(); const QuicServerId& server_id() { return server_id_; } QuicCryptoClientConfig* crypto_config() { return crypto_config_; }
diff --git a/net/tools/quic/quic_client_session_test.cc b/net/tools/quic/quic_client_session_test.cc index 75d02cb..cdf3c3c5 100644 --- a/net/tools/quic/quic_client_session_test.cc +++ b/net/tools/quic/quic_client_session_test.cc
@@ -6,6 +6,7 @@ #include <vector> +#include "base/memory/ptr_util.h" #include "base/strings/stringprintf.h" #include "net/base/ip_endpoint.h" #include "net/quic/core/crypto/aes_128_gcm_12_encrypter.h" @@ -65,14 +66,15 @@ crypto_config, push_promise_index) {} - QuicSpdyClientStream* CreateClientStream() override { - return new MockQuicSpdyClientStream(GetNextOutgoingStreamId(), this); + std::unique_ptr<QuicSpdyClientStream> CreateClientStream() override { + return base::MakeUnique<MockQuicSpdyClientStream>(GetNextOutgoingStreamId(), + this); } MockQuicSpdyClientStream* CreateIncomingDynamicStream( QuicStreamId id) override { MockQuicSpdyClientStream* stream = new MockQuicSpdyClientStream(id, this); - ActivateStream(stream); + ActivateStream(base::WrapUnique(stream)); return stream; } };
diff --git a/net/tools/quic/quic_simple_server_session.cc b/net/tools/quic/quic_simple_server_session.cc index a845e2c..5d905ee6 100644 --- a/net/tools/quic/quic_simple_server_session.cc +++ b/net/tools/quic/quic_simple_server_session.cc
@@ -7,7 +7,7 @@ #include <utility> #include "base/logging.h" -#include "base/stl_util.h" +#include "base/memory/ptr_util.h" #include "net/quic/core/proto/cached_network_parameters.pb.h" #include "net/quic/core/quic_connection.h" #include "net/quic/core/quic_flags.h" @@ -96,7 +96,7 @@ } QuicSpdyStream* stream = new QuicSimpleServerStream(id, this); - ActivateStream(stream); + ActivateStream(base::WrapUnique(stream)); return stream; } @@ -109,7 +109,7 @@ QuicSimpleServerStream* stream = new QuicSimpleServerStream(GetNextOutgoingStreamId(), this); stream->SetPriority(priority); - ActivateStream(stream); + ActivateStream(base::WrapUnique(stream)); return stream; }
diff --git a/net/tools/quic/quic_simple_server_stream_test.cc b/net/tools/quic/quic_simple_server_stream_test.cc index eddc1a08..9ee0bb2 100644 --- a/net/tools/quic/quic_simple_server_stream_test.cc +++ b/net/tools/quic/quic_simple_server_stream_test.cc
@@ -6,6 +6,7 @@ #include <utility> +#include "base/memory/ptr_util.h" #include "base/strings/string_number_conversions.h" #include "base/strings/string_piece.h" #include "net/quic/core/quic_connection.h" @@ -210,7 +211,7 @@ stream_ = new QuicSimpleServerStreamPeer(::net::test::kClientDataStreamId1, &session_); // Register stream_ in dynamic_stream_map_ and pass ownership to session_. - session_.ActivateStream(stream_); + session_.ActivateStream(base::WrapUnique(stream_)); QuicInMemoryCachePeer::ResetForTests(); } @@ -377,7 +378,7 @@ // Create a new promised stream with even id(). QuicSimpleServerStreamPeer* promised_stream = new QuicSimpleServerStreamPeer(2, &session_); - session_.ActivateStream(promised_stream); + session_.ActivateStream(base::WrapUnique(promised_stream)); // Send a push response with response status 404, which will be regarded as // invalid server push response. @@ -481,7 +482,7 @@ // Create a server initiated stream and pass it to session_. QuicSimpleServerStreamPeer* server_initiated_stream = new QuicSimpleServerStreamPeer(kServerInitiatedStreamId, &session_); - session_.ActivateStream(server_initiated_stream); + session_.ActivateStream(base::WrapUnique(server_initiated_stream)); const string kHost = "www.foo.com"; const string kPath = "/bar";
diff --git a/net/tools/quic/test_tools/quic_test_server.cc b/net/tools/quic/test_tools/quic_test_server.cc index 6c400a5..6e3d6eb 100644 --- a/net/tools/quic/test_tools/quic_test_server.cc +++ b/net/tools/quic/test_tools/quic_test_server.cc
@@ -5,6 +5,7 @@ #include "net/tools/quic/test_tools/quic_test_server.h" #include "base/logging.h" +#include "base/memory/ptr_util.h" #include "base/run_loop.h" #include "base/synchronization/lock.h" #include "base/threading/thread_task_runner_handle.h" @@ -54,7 +55,7 @@ } if (stream_factory_) { QuicSpdyStream* stream = stream_factory_->CreateStream(id, this); - ActivateStream(stream); + ActivateStream(base::WrapUnique(stream)); return stream; } return QuicSimpleServerSession::CreateIncomingDynamicStream(id);
diff --git a/net/url_request/url_request_context_getter.cc b/net/url_request/url_request_context_getter.cc index 022aa0f..0bad748 100644 --- a/net/url_request/url_request_context_getter.cc +++ b/net/url_request/url_request_context_getter.cc
@@ -57,8 +57,8 @@ // Once shutdown starts, this must always return NULL. DCHECK(!GetURLRequestContext()); - FOR_EACH_OBSERVER(URLRequestContextGetterObserver, observer_list_, - OnContextShuttingDown()); + for (auto& observer : observer_list_) + observer.OnContextShuttingDown(); } TrivialURLRequestContextGetter::TrivialURLRequestContextGetter(
diff --git a/ppapi/nacl_irt/plugin_startup.cc b/ppapi/nacl_irt/plugin_startup.cc index b90f14ae..2e9392c7 100644 --- a/ppapi/nacl_irt/plugin_startup.cc +++ b/ppapi/nacl_irt/plugin_startup.cc
@@ -27,8 +27,15 @@ ManifestService* g_manifest_service = NULL; bool IsValidChannelHandle(IPC::ChannelHandle* handle) { - // ChannelMojo not yet supported. - return handle && handle->socket.fd != -1 && !handle->mojo_handle.is_valid(); + // In SFI mode the underlying handle is wrapped by a NaClIPCAdapter, which is + // exposed as an FD. Otherwise, the handle is the underlying mojo message + // pipe. + return handle && +#if defined(OS_NACL_SFI) + handle->socket.fd != -1; +#else + handle->is_mojo_channel_handle(); +#endif } // Creates the manifest service on IO thread so that its Listener's thread and
diff --git a/remoting/android/java/AndroidManifest.xml.jinja2 b/remoting/android/java/AndroidManifest.xml.jinja2 index b1fabcc0..aa5f41ca 100644 --- a/remoting/android/java/AndroidManifest.xml.jinja2 +++ b/remoting/android/java/AndroidManifest.xml.jinja2
@@ -5,6 +5,7 @@ android:targetSdkVersion="23"/> <uses-permission android:name="android.permission.GET_ACCOUNTS"/> <uses-permission android:name="android.permission.INTERNET"/> + <uses-feature android:glEsVersion="0x00020000" android:required="true" /> <application android:label="@string/product_name_android" android:name="org.chromium.chromoting.RemotingApplication"
diff --git a/remoting/android/java/src/org/chromium/chromoting/jni/JniInterface.java b/remoting/android/java/src/org/chromium/chromoting/jni/JniInterface.java index 565e70c..3a4fcf1 100644 --- a/remoting/android/java/src/org/chromium/chromoting/jni/JniInterface.java +++ b/remoting/android/java/src/org/chromium/chromoting/jni/JniInterface.java
@@ -50,8 +50,12 @@ public static void setAccountForLogging(String account) { sAccount = account; + fetchAuthToken(); } + /** + * Fetch the OAuth token and feed it to the native interface. + */ @CalledByNative private static void fetchAuthToken() { if (sAccount == null) {
diff --git a/remoting/host/BUILD.gn b/remoting/host/BUILD.gn index 9c9e9482..c71fd6c4 100644 --- a/remoting/host/BUILD.gn +++ b/remoting/host/BUILD.gn
@@ -100,8 +100,6 @@ "config_file_watcher.cc", "config_file_watcher.h", "config_watcher.h", - "constants_mac.cc", - "constants_mac.h", "continue_window.cc", "continue_window.h", "continue_window_chromeos.cc", @@ -675,22 +673,6 @@ ] } - if (is_mac) { - foreach(locale, remoting_locales_with_underscores) { - bundle_data("remoting_host_locale_${locale}_bundle_data") { - sources = [ - "$root_build_dir/remoting/resources/$locale.lproj/locale.pak", - ] - outputs = [ - "{{bundle_resources_dir}}/$locale.lproj/{{source_file_part}}", - ] - deps = [ - "//remoting/resources:copy_locales", - ] - } - } - } - action_foreach("remoting_infoplist_strings") { sources = [ "installer/mac/uninstaller/remoting_uninstaller-InfoPlist.strings.jinja2", @@ -791,97 +773,33 @@ ] } } else { - if (is_mac) { - app_target_type = "mac_app_bundle" - } else { - app_target_type = "executable" - } - - if (is_mac) { - # remoting_me2me_host-InfoPlist.strings - foreach(locale, remoting_locales_with_underscores) { - bundle_data("remoting_me2me_host_strings_${locale}_bundle_data") { - sources = [ - "$root_gen_dir/remoting/host/remoting_me2me_host-InfoPlist.strings/$locale.lproj/InfoPlist.strings", - ] - outputs = [ - "{{bundle_resources_dir}}/$locale.lproj/{{source_file_part}}", - ] - deps = [ - ":remoting_infoplist_strings", - ] - } - } - - mac_xib_bundle_data("remoting_host_xibs") { - sources = [ - "disconnect_window.xib", - ] - } - - bundle_data("remoting_host_resources") { - sources = [ - "$root_gen_dir/remoting/CREDITS.txt", - "remoting_me2me_host.icns", - ] - - outputs = [ - "{{bundle_resources_dir}}/{{source_file_part}}", - ] - - public_deps = [ - "//remoting/host/installer:credits", - ] - - if (icu_use_data_file) { - sources += [ "$root_out_dir/icudtl.dat" ] - public_deps += [ "//third_party/icu:icudata" ] - } - } - } - - target(app_target_type, "remoting_me2me_host") { - if (is_mac) { - extra_configs = [ "//remoting/build/config:version" ] - info_plist = "remoting_me2me_host-Info.plist" - extra_substitutions = [ - "BUNDLE_ID=$host_bundle_id", - "VERSION_FULL=$remoting_version_full", - "VERSION_SHORT=$remoting_version_short", - "MACOSX_DEPLOYMENT_TARGET=10.7", - ] - } else { - configs += [ "//remoting/build/config:version" ] - } - + source_set("main") { sources = [ "host_main.cc", "host_main.h", ] - - if (is_mac && is_chrome_branded && is_official_build) { - defines = [ "REMOTING_ENABLE_BREAKPAD" ] + } + if (is_mac) { + group("remoting_me2me_host") { + deps = [ + "//remoting/host/mac:remoting_me2me_host", + ] } + } else { + target("executable", "remoting_me2me_host") { + configs += [ "//remoting/build/config:version" ] - deps = [ - ":remoting_me2me_host_static", - "//build/config/sanitizers:deps", - "//remoting/base:breakpad", - "//remoting/host/installer:credits", - "//remoting/resources", - ] - if (is_mac) { - foreach(locale, remoting_locales_with_underscores) { - deps += [ - ":remoting_host_locale_${locale}_bundle_data", - ":remoting_me2me_host_strings_${locale}_bundle_data", - ] - } - deps += [ - ":remoting_host_resources", - ":remoting_host_xibs", - ":remoting_infoplist_strings", - "//remoting/resources:copy_locales", + sources = [ + "host_main.cc", + "host_main.h", + ] + + deps = [ + ":remoting_me2me_host_static", + "//build/config/sanitizers:deps", + "//remoting/base:breakpad", + "//remoting/host/installer:credits", + "//remoting/resources", ] } } @@ -916,70 +834,39 @@ } if (is_mac) { - # native_messaging_host-InfoPlist.strings - foreach(locale, remoting_locales_with_underscores) { - bundle_data("native_messaging_host_strings_${locale}_bundle_data") { - sources = [ - "$root_gen_dir/remoting/host/native_messaging_host-InfoPlist.strings/$locale.lproj/InfoPlist.strings", - ] - outputs = [ - "{{bundle_resources_dir}}/$locale.lproj/{{source_file_part}}", - ] - deps = [ - ":remoting_infoplist_strings", - ] - } - } - } - - target(app_target_type, "remoting_native_messaging_host") { - if (is_mac) { - info_plist = "setup/native_messaging_host-Info.plist" - extra_configs = [ "//build/config/compiler:wexit_time_destructors" ] - extra_substitutions = [ - "BUNDLE_ID=$native_messaging_host_bundle_id", - "VERSION_FULL=$remoting_version_full", - "VERSION_SHORT=$remoting_version_short", - "MACOSX_DEPLOYMENT_TARGET=10.7", + group("remoting_native_messaging_host") { + deps = [ + "//remoting/host/mac:remoting_native_messaging_host", ] - } else { + } + } else { + target("executable", "remoting_native_messaging_host") { configs += [ "//build/config/compiler:wexit_time_destructors" ] + + sources = [ + "setup/me2me_native_messaging_host_entry_point.cc", + "setup/me2me_native_messaging_host_main.cc", + "setup/me2me_native_messaging_host_main.h", + ] + + deps = [ + ":remoting_infoplist_strings", + "//base", + "//remoting/base:breakpad", + "//remoting/host", + "//remoting/host/native_messaging", + "//remoting/host/setup", + ] + + # The |major|, |build| and |patch| versions are inherited from Chrome. + # Since Chrome's |minor| version is always '0', we replace it with a + # Chromoting-specific patch version. + defines = [ "VERSION=" + "$chrome_version_major" + "." + + "$remoting_version_patch" + "." + "$chrome_version_build" + + "." + "$chrome_version_patch" ] } - - sources = [ - "setup/me2me_native_messaging_host_entry_point.cc", - "setup/me2me_native_messaging_host_main.cc", - "setup/me2me_native_messaging_host_main.h", - ] - - deps = [ - ":remoting_infoplist_strings", - "//base", - "//remoting/base:breakpad", - "//remoting/host", - "//remoting/host/native_messaging", - "//remoting/host/setup", - ] - - if (is_mac) { - foreach(locale, remoting_locales_with_underscores) { - deps += [ - ":native_messaging_host_strings_${locale}_bundle_data", - ":remoting_host_locale_${locale}_bundle_data", - ] - } - deps += [ "//remoting/resources:copy_locales" ] - } - - # The |major|, |build| and |patch| versions are inherited from Chrome. - # Since Chrome's |minor| version is always '0', we replace it with a - # Chromoting-specific patch version. - defines = [ "VERSION=" + "$chrome_version_major" + "." + - "$remoting_version_patch" + "." + "$chrome_version_build" + - "." + "$chrome_version_patch" ] } } - if (is_chrome_branded && enable_me2me_host && is_linux && !is_chromeos) { # TODO(GYP): add support for archive_chromoting_tests variable? @@ -1077,305 +964,9 @@ ] } } else if (is_mac) { - import("//build/config/zip.gni") - - copy("remoting_native_messaging_host_rename") { - sources = [ - "$root_build_dir/remoting_native_messaging_host.app", - ] - - outputs = [ - "$target_gen_dir/native_messaging_host.app", - ] - + group("remoting_me2me_host_archive") { deps = [ - ":remoting_native_messaging_host", - ] - } - - action("remoting_me2me_host_archive") { - # TODO(GYP) TODO(crbug.com/622415) This needs work and testing. - - # TODO(GYP) At the very least, we need to add in the localized strings. - - _installer_mac_files = [ - "installer/mac/do_signing.sh", - "installer/mac/do_signing.props", - "installer/mac/ChromotingHost.pkgproj", - "installer/mac/ChromotingHostService.pkgproj", - "installer/mac/ChromotingHostUninstaller.pkgproj", - "installer/mac/LaunchAgents/org.chromium.chromoting.plist", - "installer/mac/PrivilegedHelperTools/org.chromium.chromoting.me2me.sh", - "installer/mac/Scripts/keystone_install.sh", - "installer/mac/Scripts/remoting_postflight.sh", - "installer/mac/Scripts/remoting_preflight.sh", - "installer/mac/Keystone/GoogleSoftwareUpdate.pkg", - "//chrome/installer/mac/pkg-dmg", - ] - - inputs = _installer_mac_files - - zip_path = "$root_build_dir/remoting-me2me-host-mac.zip" - - outputs = [ - "$root_build_dir/remoting-me2me-host-mac.zip", - ] - - script = "installer/build-installer-archive.py" - - # TODO(GYP) TODO(crbug.com/622415): Fill these in. - host_name_nospace = host_name - host_service_name_nospace = host_service_name - host_uninstaller_name_nospace = host_uninstaller_name - - args = [ - rebase_path("$target_gen_dir/remoting_installation", - root_build_dir), - rebase_path(zip_path, root_build_dir), - "--source-file-roots", - rebase_path("installer/mac/", root_build_dir), - rebase_path("//chrome/installer/mac", root_build_dir), - "--source-files", - ] + rebase_path(_installer_mac_files, root_build_dir) + [ - "--generated-files", - "remoting_host_prefpane.prefPane", - "remoting_me2me_host.app", - rebase_path("$target_gen_dir/native_messaging_host.app", - root_build_dir), - "remote_assistance_host.app", - "remoting_host_uninstaller.app", - "remoting/com.google.chrome.remote_desktop.json", - "remoting/com.google.chrome.remote_assistance.json", - "--generated-files-dst", - "PreferencePanes/$prefpane_bundle_name", - "PrivilegedHelperTools/$host_bundle_name", - "PrivilegedHelperTools/$host_bundle_name/Contents/MacOS/$native_messaging_host_bundle_name", - "PrivilegedHelperTools/$host_bundle_name/Contents/MacOS/$remote_assistance_host_bundle_name", - "Applications/$host_uninstaller_name.app", - "Config/com.google.chrome.remote_desktop.json", - "Config/com.google.chrome.remote_assistance.json", - "--defs", - "VERSION=$chrome_version_full", - "VERSION_SHORT=$chrome_version_major.$chrome_version_minor.$chrome_version_build", - "VERSION_MAJOR=$chrome_version_major", - "VERSION_MINOR=$chrome_version_minor", - "HOST_NAME=$host_name", - "HOST_BUNDLE_NAME=$me2me_host_bundle_name", - "HOST_SERVICE_NAME=$host_service_name", - "HOST_UNINSTALLER_NAME=$host_uninstaller_name", - "HOST_PKG=$host_name", - "HOST_SERVICE_PKG=$host_service_name_nospace", - "HOST_UNINSTALLER_PKG=$host_uninstaller_name_nospace", - "BUNDLE_ID_HOST=$bundle_prefix.$host_name_nospace", - "BUNDLE_ID_HOST_SERVICE=$bundle_prefix.$host_service_name_nospace", - "BUNDLE_ID_HOST_UNINSTALLER=$bundle_prefix.$host_uninstaller_name_nospace", - "DMG_VOLUME_NAME=$host_name $chrome_version_full", - "DMG_FILE_NAME=$host_name_nospace-$chrome_version_full", - "NATIVE_MESSAGING_HOST_BUNDLE_NAME=$native_messaging_host_bundle_name", - "REMOTE_ASSISTANCE_HOST_BUNDLE_NAME=$remote_assistance_host_bundle_name", - "PREFPANE_BUNDLE_NAME=$prefpane_bundle_name", - ] - - deps = [ - ":remoting_host_prefpane.prefPane", - ":remoting_host_uninstaller", - ":remoting_me2me_host", - ":remoting_native_messaging_host", - ":remoting_native_messaging_host_rename", - ":remoting_native_messaging_manifests", - "//remoting/host/it2me:remote_assistance_host", - ] - } - - _uninstaller_plist = - "installer/mac/uninstaller/remoting_uninstaller-Info.plist" - - # remoting_uninstaller-InfoPlist.strings - foreach(locale, remoting_locales_with_underscores) { - bundle_data("remoting_uninstaller_strings_${locale}_bundle_data") { - sources = [ - "$root_gen_dir/remoting/host/remoting_uninstaller-InfoPlist.strings/$locale.lproj/InfoPlist.strings", - ] - outputs = [ - "{{bundle_resources_dir}}/$locale.lproj/{{source_file_part}}", - ] - deps = [ - ":remoting_infoplist_strings", - ] - } - } - - mac_app_bundle("remoting_host_uninstaller") { - info_plist = _uninstaller_plist - extra_substitutions = [ - "BUNDLE_ID=$uninstaller_bundle_id", - "VERSION_FULL=$remoting_version_full", - "VERSION_SHORT=$remoting_version_short", - "MACOSX_DEPLOYMENT_TARGET=10.7", - ] - - defines = [ - "HOST_BUNDLE_NAME=\"" + host_bundle_name + "\"", - "PREFPANE_BUNDLE_NAME=\"" + prefpane_bundle_name + "\"", - ] - - sources = [ - "constants_mac.cc", - "constants_mac.h", - "installer/mac/uninstaller/remoting_uninstaller.h", - "installer/mac/uninstaller/remoting_uninstaller.mm", - "installer/mac/uninstaller/remoting_uninstaller_app.h", - "installer/mac/uninstaller/remoting_uninstaller_app.mm", - ] - - libs = [ - "Cocoa.framework", - "CoreFoundation.framework", - "Security.framework", - ] - - deps = [ - ":remoting_host_uninstaller_resources", - ":remoting_host_uninstaller_xibs", - ":remoting_infoplist_strings", - "//base", - ] - foreach(locale, remoting_locales_with_underscores) { - deps += [ ":remoting_uninstaller_strings_${locale}_bundle_data" ] - } - } - - mac_xib_bundle_data("remoting_host_uninstaller_xibs") { - sources = [ - "installer/mac/uninstaller/remoting_uninstaller.xib", - ] - } - - bundle_data("remoting_host_uninstaller_resources") { - sources = [ - "installer/mac/uninstaller/remoting_uninstaller.icns", - ] - - outputs = [ - "{{bundle_resources_dir}}/{{source_file_part}}", - ] - } - - create_bundle("remoting_host_prefpane.prefPane") { - bundle_root_dir = "$root_build_dir/$target_name/Contents" - bundle_resources_dir = bundle_root_dir + "/Resources" - bundle_executable_dir = bundle_root_dir + "/MacOS" - - deps = [ - ":remoting_host_prefpane", - ":remoting_host_prefpane_bundle_data", - ":remoting_host_prefpane_plist_bundle_data", - ":remoting_host_prefpane_resources", - ":remoting_host_prefpane_xibs", - ":remoting_infoplist_strings", - ] - - foreach(locale, remoting_locales_with_underscores) { - deps += [ ":remoting_host_prefpane_strings_${locale}_bundle_data" ] - } - } - - bundle_data("remoting_host_prefpane_bundle_data") { - deps = [ - ":remoting_host_prefpane", - ] - sources = [ - "$root_build_dir/gen/remoting/host/remoting_host_prefpane", - ] - outputs = [ - "{{bundle_executable_dir}}/{{source_file_part}}", - ] - } - - bundle_data("remoting_host_prefpane_resources") { - sources = [ - "//remoting/resources/chromoting128.png", - ] - - outputs = [ - "{{bundle_resources_dir}}/{{source_file_part}}", - ] - } - - loadable_module("remoting_host_prefpane") { - output_dir = "$root_out_dir/gen/remoting/host" - output_extension = "" - - sources = [ - "mac/me2me_preference_pane.h", - "mac/me2me_preference_pane.mm", - "mac/me2me_preference_pane_confirm_pin.h", - "mac/me2me_preference_pane_confirm_pin.mm", - "mac/me2me_preference_pane_disable.h", - "mac/me2me_preference_pane_disable.mm", - ] - - libs = [ - "Cocoa.framework", - "CoreFoundation.framework", - "PreferencePanes.framework", - "Security.framework", - ] - - deps = [ - ":host", - ":remoting_infoplist_strings", - "//remoting/base", - "//remoting/resources:copy_locales", - "//third_party/jsoncpp", - ] - foreach(locale, remoting_locales_with_underscores) { - deps += [ ":remoting_host_prefpane_strings_${locale}_bundle_data" ] - } - } - - mac_info_plist("remoting_host_prefpane_plist") { - info_plist = "mac/me2me_preference_pane-Info.plist" - extra_substitutions = [ - "BUNDLE_ID=$prefpane_bundle_id", - "VERSION_FULL=$remoting_version_full", - "VERSION_SHORT=$remoting_version_short", - "MACOSX_DEPLOYMENT_TARGET=10.7", - ] - executable_name = "remoting_host_prefpane" - } - - bundle_data("remoting_host_prefpane_plist_bundle_data") { - sources = get_target_outputs(":remoting_host_prefpane_plist") - outputs = [ - "{{bundle_root_dir}}/Info.plist", - ] - public_deps = [ - ":remoting_host_prefpane_plist", - ] - } - - foreach(locale, remoting_locales_with_underscores) { - bundle_data("remoting_host_prefpane_strings_${locale}_bundle_data") { - sources = [ - "$root_gen_dir/remoting/host/me2me_preference_pane-InfoPlist.strings/$locale.lproj/InfoPlist.strings", - ] - outputs = [ - "{{bundle_resources_dir}}/$locale.lproj/{{source_file_part}}", - ] - deps = [ - ":remoting_infoplist_strings", - ] - } - } - - mac_xib_bundle_data("remoting_host_prefpane_xibs") { - sources = [ - "mac/me2me_preference_pane.xib", - "mac/me2me_preference_pane_confirm_pin.xib", - "mac/me2me_preference_pane_disable.xib", - - #"mac/me2me_preference_pane-Info.plist", + "//remoting/host/installer/mac:remoting_me2me_host_archive", ] } } else {
diff --git a/remoting/host/chromeos/aura_desktop_capturer.cc b/remoting/host/chromeos/aura_desktop_capturer.cc index f12a8ce..7274073 100644 --- a/remoting/host/chromeos/aura_desktop_capturer.cc +++ b/remoting/host/chromeos/aura_desktop_capturer.cc
@@ -41,7 +41,7 @@ DCHECK(callback_); } -void AuraDesktopCapturer::Capture(const webrtc::DesktopRegion&) { +void AuraDesktopCapturer::CaptureFrame() { std::unique_ptr<cc::CopyOutputRequest> request = cc::CopyOutputRequest::CreateBitmapRequest(base::Bind( &AuraDesktopCapturer::OnFrameCaptured, weak_factory_.GetWeakPtr()));
diff --git a/remoting/host/chromeos/aura_desktop_capturer.h b/remoting/host/chromeos/aura_desktop_capturer.h index d3618fc..7d185a3 100644 --- a/remoting/host/chromeos/aura_desktop_capturer.h +++ b/remoting/host/chromeos/aura_desktop_capturer.h
@@ -32,7 +32,7 @@ // webrtc::DesktopCapturer implementation. void Start(webrtc::DesktopCapturer::Callback* callback) override; - void Capture(const webrtc::DesktopRegion& region) override; + void CaptureFrame() override; private: friend class AuraDesktopCapturerTest;
diff --git a/remoting/host/chromoting_host.cc b/remoting/host/chromoting_host.cc index d2c0232..eb9e182 100644 --- a/remoting/host/chromoting_host.cc +++ b/remoting/host/chromoting_host.cc
@@ -94,8 +94,10 @@ session_manager_.reset(); // Notify observers. - if (started_) - FOR_EACH_OBSERVER(HostStatusObserver, status_observers_, OnShutdown()); + if (started_) { + for (auto& observer : status_observers_) + observer.OnShutdown(); + } } void ChromotingHost::Start(const std::string& host_owner_email) { @@ -104,8 +106,8 @@ HOST_LOG << "Starting host"; started_ = true; - FOR_EACH_OBSERVER(HostStatusObserver, status_observers_, - OnStart(host_owner_email)); + for (auto& observer : status_observers_) + observer.OnStart(host_owner_email); session_manager_->AcceptIncoming( base::Bind(&ChromotingHost::OnIncomingSession, base::Unretained(this))); @@ -175,62 +177,59 @@ login_backoff_.Reset(); - // Disconnect all other clients. |it| should be advanced before Disconnect() - // is called to avoid it becoming invalid when the client is removed from - // the list. - ClientList::iterator it = clients_.begin(); + // Disconnect all clients, except |client|. base::WeakPtr<ChromotingHost> self = weak_factory_.GetWeakPtr(); - while (it != clients_.end()) { - ClientSession* other_client = *it++; - if (other_client != client) { - other_client->DisconnectSession(protocol::OK); + while (clients_.size() > 1) { + clients_[(clients_.front().get() == client) ? 1 : 0]->DisconnectSession( + protocol::OK); - // Quit if the host was destroyed. - if (!self) - return; - } + // Quit if the host was destroyed. + if (!self) + return; } // Disconnects above must have destroyed all other clients. DCHECK_EQ(clients_.size(), 1U); + DCHECK(clients_.front().get() == client); // Notify observers that there is at least one authenticated client. - const std::string& jid = client->client_jid(); - - FOR_EACH_OBSERVER(HostStatusObserver, status_observers_, - OnClientAuthenticated(jid)); + for (auto& observer : status_observers_) + observer.OnClientAuthenticated(client->client_jid()); } void ChromotingHost::OnSessionChannelsConnected(ClientSession* client) { DCHECK(CalledOnValidThread()); // Notify observers. - FOR_EACH_OBSERVER(HostStatusObserver, status_observers_, - OnClientConnected(client->client_jid())); + for (auto& observer : status_observers_) + observer.OnClientConnected(client->client_jid()); } void ChromotingHost::OnSessionAuthenticationFailed(ClientSession* client) { DCHECK(CalledOnValidThread()); // Notify observers. - FOR_EACH_OBSERVER(HostStatusObserver, status_observers_, - OnAccessDenied(client->client_jid())); + for (auto& observer : status_observers_) + observer.OnAccessDenied(client->client_jid()); } void ChromotingHost::OnSessionClosed(ClientSession* client) { DCHECK(CalledOnValidThread()); - ClientList::iterator it = std::find(clients_.begin(), clients_.end(), client); + ClientSessions::iterator it = + std::find_if(clients_.begin(), clients_.end(), + [client](const std::unique_ptr<ClientSession>& item) { + return item.get() == client; + }); CHECK(it != clients_.end()); bool was_authenticated = client->is_authenticated(); std::string jid = client->client_jid(); clients_.erase(it); - delete client; if (was_authenticated) { - FOR_EACH_OBSERVER(HostStatusObserver, status_observers_, - OnClientDisconnected(jid)); + for (auto& observer : status_observers_) + observer.OnClientDisconnected(jid); } } @@ -239,9 +238,8 @@ const std::string& channel_name, const protocol::TransportRoute& route) { DCHECK(CalledOnValidThread()); - FOR_EACH_OBSERVER(HostStatusObserver, status_observers_, - OnClientRouteChange(session->client_jid(), channel_name, - route)); + for (auto& observer : status_observers_) + observer.OnClientRouteChange(session->client_jid(), channel_name, route); } void ChromotingHost::OnIncomingSession( @@ -276,11 +274,9 @@ } // Create a ClientSession object. - ClientSession* client = new ClientSession( + clients_.push_back(base::MakeUnique<ClientSession>( this, std::move(connection), desktop_environment_factory_, - max_session_duration_, pairing_registry_, extensions_.get()); - - clients_.push_back(client); + max_session_duration_, pairing_registry_, extensions_.get())); } void ChromotingHost::DisconnectAllClients() {
diff --git a/remoting/host/chromoting_host.h b/remoting/host/chromoting_host.h index 5186988..01a6d17 100644 --- a/remoting/host/chromoting_host.h +++ b/remoting/host/chromoting_host.h
@@ -5,9 +5,9 @@ #ifndef REMOTING_HOST_CHROMOTING_HOST_H_ #define REMOTING_HOST_CHROMOTING_HOST_H_ -#include <list> #include <memory> #include <string> +#include <vector> #include "base/macros.h" #include "base/memory/ref_counted.h" @@ -66,6 +66,8 @@ public ClientSession::EventHandler, public HostStatusMonitor { public: + typedef std::vector<std::unique_ptr<ClientSession>> ClientSessions; + // |desktop_environment_factory| must outlive this object. ChromotingHost( DesktopEnvironmentFactory* desktop_environment_factory, @@ -133,6 +135,8 @@ pairing_registry_ = pairing_registry; } + const ClientSessions& client_sessions_for_tests() { return clients_; } + base::WeakPtr<ChromotingHost> AsWeakPtr() { return weak_factory_.GetWeakPtr(); } @@ -140,7 +144,6 @@ private: friend class ChromotingHostTest; - typedef std::list<ClientSession*> ClientList; typedef ScopedVector<HostExtension> HostExtensionList; // Immediately disconnects all active clients. Host-internal components may @@ -162,7 +165,7 @@ base::ObserverList<HostStatusObserver> status_observers_; // The connections to remote clients. - ClientList clients_; + ClientSessions clients_; // True if the host has been started. bool started_;
diff --git a/remoting/host/chromoting_host_unittest.cc b/remoting/host/chromoting_host_unittest.cc index f01539b..5c631f0 100644 --- a/remoting/host/chromoting_host_unittest.cc +++ b/remoting/host/chromoting_host_unittest.cc
@@ -136,7 +136,7 @@ get_client(connection_index) = client_ptr; // |host| is responsible for deleting |client| from now on. - host_->clients_.push_back(client.release()); + host_->clients_.push_back(std::move(client)); if (authenticate) { client_ptr->OnConnectionAuthenticated(); @@ -244,11 +244,6 @@ return (connection_index == 0) ? client1_ : client2_; } - // Returns the list of clients of the host_. - std::list<ClientSession*>& get_clients_from_host() { - return host_->clients_; - } - const std::string& get_session_jid(int connection_index) { return (connection_index == 0) ? session_jid1_ : session_jid2_; } @@ -338,7 +333,8 @@ host_->OnIncomingSession(session_unowned1_.release(), &response); EXPECT_EQ(protocol::SessionManager::ACCEPT, response); - host_->OnSessionAuthenticating(get_clients_from_host().front()); + host_->OnSessionAuthenticating( + host_->client_sessions_for_tests().front().get()); host_->OnIncomingSession(session_unowned2_.get(), &response); EXPECT_EQ(protocol::SessionManager::OVERLOAD, response); } @@ -362,13 +358,15 @@ EXPECT_EQ(protocol::SessionManager::ACCEPT, response); // This will set the backoff. - host_->OnSessionAuthenticating(get_clients_from_host().front()); + host_->OnSessionAuthenticating( + host_->client_sessions_for_tests().front().get()); // This should disconnect client2. - host_->OnSessionAuthenticating(get_clients_from_host().back()); + host_->OnSessionAuthenticating( + host_->client_sessions_for_tests().back().get()); // Verify that the host only has 1 client at this point. - EXPECT_EQ(get_clients_from_host().size(), 1U); + EXPECT_EQ(host_->client_sessions_for_tests().size(), 1U); } TEST_F(ChromotingHostTest, OnSessionRouteChange) {
diff --git a/remoting/host/client_session.cc b/remoting/host/client_session.cc index dcb8704..f3fcbc3 100644 --- a/remoting/host/client_session.cc +++ b/remoting/host/client_session.cc
@@ -295,6 +295,9 @@ // Pause capturing if necessary. video_stream_->Pause(pause_video_); + + if (event_timestamp_source_for_tests_) + video_stream_->SetEventTimestampsSource(event_timestamp_source_for_tests_); } void ClientSession::OnConnectionChannelsConnected() { @@ -404,9 +407,17 @@ return this; } +void ClientSession::SetEventTimestampsSourceForTests( + scoped_refptr<protocol::InputEventTimestampsSource> + event_timestamp_source) { + DCHECK(CalledOnValidThread()); + event_timestamp_source_for_tests_ = event_timestamp_source; + if (video_stream_) + video_stream_->SetEventTimestampsSource(event_timestamp_source_for_tests_); +} + std::unique_ptr<protocol::ClipboardStub> ClientSession::CreateClipboardProxy() { DCHECK(CalledOnValidThread()); - return base::MakeUnique<protocol::ClipboardThreadProxy>( client_clipboard_factory_.GetWeakPtr(), base::ThreadTaskRunnerHandle::Get());
diff --git a/remoting/host/client_session.h b/remoting/host/client_session.h index 96e177f..8f10358 100644 --- a/remoting/host/client_session.h +++ b/remoting/host/client_session.h
@@ -140,6 +140,10 @@ return client_capabilities_.get(); } + void SetEventTimestampsSourceForTests( + scoped_refptr<protocol::InputEventTimestampsSource> + event_timestamp_source); + private: // Creates a proxy for sending clipboard events to the client. std::unique_ptr<protocol::ClipboardStub> CreateClipboardProxy(); @@ -237,6 +241,9 @@ // then it's stored in |pending_video_layout_message_|. std::unique_ptr<protocol::VideoLayout> pending_video_layout_message_; + scoped_refptr<protocol::InputEventTimestampsSource> + event_timestamp_source_for_tests_; + // Used to disable callbacks to |this| once DisconnectSession() has been // called. base::WeakPtrFactory<ClientSessionControl> weak_factory_;
diff --git a/remoting/host/daemon_process.cc b/remoting/host/daemon_process.cc index ad00c95..cc9f76c 100644 --- a/remoting/host/daemon_process.cc +++ b/remoting/host/daemon_process.cc
@@ -303,28 +303,29 @@ void DaemonProcess::OnAccessDenied(const std::string& jid) { DCHECK(caller_task_runner()->BelongsToCurrentThread()); - FOR_EACH_OBSERVER(HostStatusObserver, status_observers_, OnAccessDenied(jid)); + for (auto& observer : status_observers_) + observer.OnAccessDenied(jid); } void DaemonProcess::OnClientAuthenticated(const std::string& jid) { DCHECK(caller_task_runner()->BelongsToCurrentThread()); - FOR_EACH_OBSERVER(HostStatusObserver, status_observers_, - OnClientAuthenticated(jid)); + for (auto& observer : status_observers_) + observer.OnClientAuthenticated(jid); } void DaemonProcess::OnClientConnected(const std::string& jid) { DCHECK(caller_task_runner()->BelongsToCurrentThread()); - FOR_EACH_OBSERVER(HostStatusObserver, status_observers_, - OnClientConnected(jid)); + for (auto& observer : status_observers_) + observer.OnClientConnected(jid); } void DaemonProcess::OnClientDisconnected(const std::string& jid) { DCHECK(caller_task_runner()->BelongsToCurrentThread()); - FOR_EACH_OBSERVER(HostStatusObserver, status_observers_, - OnClientDisconnected(jid)); + for (auto& observer : status_observers_) + observer.OnClientDisconnected(jid); } void DaemonProcess::OnClientRouteChange(const std::string& jid, @@ -343,20 +344,22 @@ CHECK(local_ip.empty() || local_ip.IsValid()); parsed_route.local_address = net::IPEndPoint(local_ip, route.local_port); - FOR_EACH_OBSERVER(HostStatusObserver, status_observers_, - OnClientRouteChange(jid, channel_name, parsed_route)); + for (auto& observer : status_observers_) + observer.OnClientRouteChange(jid, channel_name, parsed_route); } void DaemonProcess::OnHostStarted(const std::string& xmpp_login) { DCHECK(caller_task_runner()->BelongsToCurrentThread()); - FOR_EACH_OBSERVER(HostStatusObserver, status_observers_, OnStart(xmpp_login)); + for (auto& observer : status_observers_) + observer.OnStart(xmpp_login); } void DaemonProcess::OnHostShutdown() { DCHECK(caller_task_runner()->BelongsToCurrentThread()); - FOR_EACH_OBSERVER(HostStatusObserver, status_observers_, OnShutdown()); + for (auto& observer : status_observers_) + observer.OnShutdown(); } void DaemonProcess::DeleteAllDesktopSessions() {
diff --git a/remoting/host/desktop_capturer_proxy.cc b/remoting/host/desktop_capturer_proxy.cc index b1bdc4b..6030a64 100644 --- a/remoting/host/desktop_capturer_proxy.cc +++ b/remoting/host/desktop_capturer_proxy.cc
@@ -40,7 +40,7 @@ void Start(); void SetSharedMemoryFactory( std::unique_ptr<webrtc::SharedMemoryFactory> shared_memory_factory); - void Capture(const webrtc::DesktopRegion& rect); + void CaptureFrame(); private: // webrtc::DesktopCapturer::Callback implementation. @@ -93,10 +93,10 @@ } } -void DesktopCapturerProxy::Core::Capture(const webrtc::DesktopRegion& rect) { +void DesktopCapturerProxy::Core::CaptureFrame() { DCHECK(thread_checker_.CalledOnValidThread()); if (capturer_) { - capturer_->Capture(rect); + capturer_->CaptureFrame(); } else { OnCaptureResult(webrtc::DesktopCapturer::Result::ERROR_PERMANENT, nullptr); } @@ -155,7 +155,7 @@ base::Passed(base::WrapUnique(shared_memory_factory.release())))); } -void DesktopCapturerProxy::Capture(const webrtc::DesktopRegion& rect) { +void DesktopCapturerProxy::CaptureFrame() { DCHECK(thread_checker_.CalledOnValidThread()); // Start() must be called before Capture(). @@ -163,7 +163,7 @@ capture_task_runner_->PostTask( FROM_HERE, - base::Bind(&Core::Capture, base::Unretained(core_.get()), rect)); + base::Bind(&Core::CaptureFrame, base::Unretained(core_.get()))); } void DesktopCapturerProxy::OnFrameCaptured(
diff --git a/remoting/host/desktop_capturer_proxy.h b/remoting/host/desktop_capturer_proxy.h index 61ff31d..1a680a3 100644 --- a/remoting/host/desktop_capturer_proxy.h +++ b/remoting/host/desktop_capturer_proxy.h
@@ -45,7 +45,7 @@ void Start(Callback* callback) override; void SetSharedMemoryFactory(std::unique_ptr<webrtc::SharedMemoryFactory> shared_memory_factory) override; - void Capture(const webrtc::DesktopRegion& rect) override; + void CaptureFrame() override; private: class Core;
diff --git a/remoting/host/desktop_session_agent.cc b/remoting/host/desktop_session_agent.cc index 11dac58..63daad8 100644 --- a/remoting/host/desktop_session_agent.cc +++ b/remoting/host/desktop_session_agent.cc
@@ -464,7 +464,7 @@ // |video_capture_task_runner()| task runner. If the client issues more // requests, pixel data in captured frames will likely be corrupted but // stability of webrtc::DesktopCapturer will not be affected. - video_capturer_->Capture(webrtc::DesktopRegion()); + video_capturer_->CaptureFrame(); } void DesktopSessionAgent::OnInjectClipboardEvent(
diff --git a/remoting/host/installer/mac/BUILD.gn b/remoting/host/installer/mac/BUILD.gn new file mode 100644 index 0000000..7bc5e89 --- /dev/null +++ b/remoting/host/installer/mac/BUILD.gn
@@ -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. + +import("//remoting/build/config/remoting_build.gni") + +import("//build/config/zip.gni") + +copy("remoting_native_messaging_host_rename") { + sources = [ + "$root_build_dir/remoting_native_messaging_host.app", + ] + + outputs = [ + "$target_gen_dir/native_messaging_host.app", + ] + + deps = [ + "//remoting/host/mac:remoting_native_messaging_host", + ] +} + +action("remoting_me2me_host_archive") { + # TODO(GYP) TODO(crbug.com/622415) This needs work and testing. + + # TODO(GYP) At the very least, we need to add in the localized strings. + + _installer_mac_files = [ + "do_signing.sh", + "do_signing.props", + "ChromotingHost.pkgproj", + "ChromotingHostService.pkgproj", + "ChromotingHostUninstaller.pkgproj", + "LaunchAgents/org.chromium.chromoting.plist", + "PrivilegedHelperTools/org.chromium.chromoting.me2me.sh", + "Scripts/keystone_install.sh", + "Scripts/remoting_postflight.sh", + "Scripts/remoting_preflight.sh", + "Keystone/GoogleSoftwareUpdate.pkg", + "//chrome/installer/mac/pkg-dmg", + ] + + inputs = _installer_mac_files + + zip_path = "$root_build_dir/remoting-me2me-host-mac.zip" + + outputs = [ + "$root_build_dir/remoting-me2me-host-mac.zip", + ] + + script = "//remoting/host/installer/build-installer-archive.py" + + args = [ + rebase_path("$target_gen_dir/remoting_installation", root_build_dir), + rebase_path(zip_path, root_build_dir), + "--source-file-roots", + rebase_path("//remoting/host/installer/mac/", root_build_dir), + rebase_path("//chrome/installer/mac", root_build_dir), + "--source-files", + ] + rebase_path(_installer_mac_files, root_build_dir) + [ + "--generated-files", + "remoting_host_prefpane.prefPane", + "remoting_me2me_host.app", + rebase_path("$target_gen_dir/native_messaging_host.app", + root_build_dir), + "remote_assistance_host.app", + "remoting_host_uninstaller.app", + "remoting/com.google.chrome.remote_desktop.json", + "remoting/com.google.chrome.remote_assistance.json", + "--generated-files-dst", + "PreferencePanes/$prefpane_bundle_name", + "PrivilegedHelperTools/$host_bundle_name", + "PrivilegedHelperTools/$host_bundle_name/Contents/MacOS/$native_messaging_host_bundle_name", + "PrivilegedHelperTools/$host_bundle_name/Contents/MacOS/$remote_assistance_host_bundle_name", + "Applications/$host_uninstaller_name.app", + "Config/com.google.chrome.remote_desktop.json", + "Config/com.google.chrome.remote_assistance.json", + "--defs", + "VERSION=$chrome_version_full", + "VERSION_SHORT=$chrome_version_major.$chrome_version_minor.$chrome_version_build", + "VERSION_MAJOR=$chrome_version_major", + "VERSION_MINOR=$chrome_version_minor", + "HOST_NAME=$host_name", + "HOST_BUNDLE_NAME=$me2me_host_bundle_name", + "HOST_SERVICE_NAME=$host_service_name", + "HOST_UNINSTALLER_NAME=$host_uninstaller_name", + "HOST_PKG=$host_name", + "HOST_SERVICE_PKG=$host_service_name_nospace", + "HOST_UNINSTALLER_PKG=$host_uninstaller_name_nospace", + "BUNDLE_ID_HOST=$bundle_prefix.$host_name_nospace", + "BUNDLE_ID_HOST_SERVICE=$bundle_prefix.$host_service_name_nospace", + "BUNDLE_ID_HOST_UNINSTALLER=$bundle_prefix.$host_uninstaller_name_nospace", + "DMG_VOLUME_NAME=$host_name $chrome_version_full", + "DMG_FILE_NAME=$host_name_nospace-$chrome_version_full", + "NATIVE_MESSAGING_HOST_BUNDLE_NAME=$native_messaging_host_bundle_name", + "REMOTE_ASSISTANCE_HOST_BUNDLE_NAME=$remote_assistance_host_bundle_name", + "PREFPANE_BUNDLE_NAME=$prefpane_bundle_name", + ] + + deps = [ + ":remoting_host_uninstaller", + ":remoting_native_messaging_host_rename", + "//remoting/host:remoting_me2me_host", + "//remoting/host:remoting_native_messaging_host", + "//remoting/host:remoting_native_messaging_manifests", + "//remoting/host/it2me:remote_assistance_host", + "//remoting/host/mac:remoting_host_prefpane.prefPane", + ] +} + +_uninstaller_plist = "uninstaller/remoting_uninstaller-Info.plist" + +# remoting_uninstaller-InfoPlist.strings +foreach(locale, remoting_locales_with_underscores) { + bundle_data("remoting_uninstaller_strings_${locale}_bundle_data") { + sources = [ + "$root_gen_dir/remoting/host/remoting_uninstaller-InfoPlist.strings/$locale.lproj/InfoPlist.strings", + ] + outputs = [ + "{{bundle_resources_dir}}/$locale.lproj/{{source_file_part}}", + ] + deps = [ + "//remoting/host:remoting_infoplist_strings", + ] + } +} + +mac_app_bundle("remoting_host_uninstaller") { + info_plist = _uninstaller_plist + extra_substitutions = [ + "BUNDLE_ID=$uninstaller_bundle_id", + "VERSION_FULL=$remoting_version_full", + "VERSION_SHORT=$remoting_version_short", + "MACOSX_DEPLOYMENT_TARGET=10.7", + ] + + sources = [ + "uninstaller/remoting_uninstaller.h", + "uninstaller/remoting_uninstaller.mm", + "uninstaller/remoting_uninstaller_app.h", + "uninstaller/remoting_uninstaller_app.mm", + ] + + libs = [ + "Cocoa.framework", + "CoreFoundation.framework", + "Security.framework", + ] + + deps = [ + ":remoting_host_uninstaller_resources", + ":remoting_host_uninstaller_xibs", + "//base", + "//remoting/host:remoting_infoplist_strings", + "//remoting/host/mac:constants", + ] + foreach(locale, remoting_locales_with_underscores) { + deps += [ ":remoting_uninstaller_strings_${locale}_bundle_data" ] + } +} + +mac_xib_bundle_data("remoting_host_uninstaller_xibs") { + sources = [ + "uninstaller/remoting_uninstaller.xib", + ] +} + +bundle_data("remoting_host_uninstaller_resources") { + sources = [ + "uninstaller/remoting_uninstaller.icns", + ] + + outputs = [ + "{{bundle_resources_dir}}/{{source_file_part}}", + ] +}
diff --git a/remoting/host/installer/mac/uninstaller/remoting_uninstaller.mm b/remoting/host/installer/mac/uninstaller/remoting_uninstaller.mm index 119f1b3..4396df194 100644 --- a/remoting/host/installer/mac/uninstaller/remoting_uninstaller.mm +++ b/remoting/host/installer/mac/uninstaller/remoting_uninstaller.mm
@@ -8,8 +8,7 @@ #include "base/mac/authorization_util.h" #include "base/mac/scoped_authorizationref.h" -#include "remoting/host/constants_mac.h" - +#include "remoting/host/mac/constants_mac.h" void logOutput(FILE* pipe) { char readBuffer[128];
diff --git a/remoting/host/ipc_desktop_environment_unittest.cc b/remoting/host/ipc_desktop_environment_unittest.cc index d256e85..6b27997 100644 --- a/remoting/host/ipc_desktop_environment_unittest.cc +++ b/remoting/host/ipc_desktop_environment_unittest.cc
@@ -556,7 +556,7 @@ this, &IpcDesktopEnvironmentTest::DeleteDesktopEnvironment)); // Capture a single frame. - video_capturer_->Capture(webrtc::DesktopRegion()); + video_capturer_->CaptureFrame(); } // Tests that attaching to a new desktop works.
diff --git a/remoting/host/ipc_video_frame_capturer.cc b/remoting/host/ipc_video_frame_capturer.cc index 396d83ce..9d061dd 100644 --- a/remoting/host/ipc_video_frame_capturer.cc +++ b/remoting/host/ipc_video_frame_capturer.cc
@@ -27,7 +27,7 @@ desktop_session_proxy_->SetVideoCapturer(weak_factory_.GetWeakPtr()); } -void IpcVideoFrameCapturer::Capture(const webrtc::DesktopRegion& region) { +void IpcVideoFrameCapturer::CaptureFrame() { DCHECK(!capture_pending_); capture_pending_ = true; desktop_session_proxy_->CaptureFrame();
diff --git a/remoting/host/ipc_video_frame_capturer.h b/remoting/host/ipc_video_frame_capturer.h index c96970c..2f21705 100644 --- a/remoting/host/ipc_video_frame_capturer.h +++ b/remoting/host/ipc_video_frame_capturer.h
@@ -26,7 +26,7 @@ // webrtc::DesktopCapturer interface. void Start(Callback* callback) override; - void Capture(const webrtc::DesktopRegion& region) override; + void CaptureFrame() override; // Called when a video |frame| has been captured. void OnCaptureResult(webrtc::DesktopCapturer::Result result,
diff --git a/remoting/host/it2me/BUILD.gn b/remoting/host/it2me/BUILD.gn index 0ab457b8..d2d84cf 100644 --- a/remoting/host/it2me/BUILD.gn +++ b/remoting/host/it2me/BUILD.gn
@@ -153,7 +153,7 @@ mac_xib_bundle_data("remote_assistance_host_xibs") { sources = [ - "//remoting/host/disconnect_window.xib", + "//remoting/host/mac/disconnect_window.xib", ] } @@ -214,7 +214,7 @@ foreach(locale, remoting_locales_with_underscores) { deps += [ ":remote_assistance_host_strings_${locale}_bundle_data", - "//remoting/host:remoting_host_locale_${locale}_bundle_data", + "//remoting/host/mac:remoting_host_locale_${locale}_bundle_data", ] } deps += [
diff --git a/remoting/host/mac/BUILD.gn b/remoting/host/mac/BUILD.gn new file mode 100644 index 0000000..1e01824 --- /dev/null +++ b/remoting/host/mac/BUILD.gn
@@ -0,0 +1,281 @@ +# 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("//remoting/build/config/remoting_build.gni") + +source_set("constants") { + defines = [ + "HOST_BUNDLE_NAME=\"" + host_bundle_name + "\"", + "PREFPANE_BUNDLE_NAME=\"" + prefpane_bundle_name + "\"", + ] + + sources = [ + "constants_mac.cc", + "constants_mac.h", + ] +} + +# remoting_me2me_host-InfoPlist.strings +foreach(locale, remoting_locales_with_underscores) { + bundle_data("remoting_me2me_host_strings_${locale}_bundle_data") { + sources = [ + "$root_gen_dir/remoting/host/remoting_me2me_host-InfoPlist.strings/$locale.lproj/InfoPlist.strings", + ] + outputs = [ + "{{bundle_resources_dir}}/$locale.lproj/{{source_file_part}}", + ] + deps = [ + "//remoting/host:remoting_infoplist_strings", + ] + } +} + +mac_xib_bundle_data("remoting_host_xibs") { + sources = [ + "disconnect_window.xib", + ] +} + +bundle_data("remoting_host_resources") { + sources = [ + "$root_gen_dir/remoting/CREDITS.txt", + "remoting_me2me_host.icns", + ] + + outputs = [ + "{{bundle_resources_dir}}/{{source_file_part}}", + ] + + public_deps = [ + "//remoting/host/installer:credits", + ] + + if (icu_use_data_file) { + sources += [ "$root_out_dir/icudtl.dat" ] + public_deps += [ "//third_party/icu:icudata" ] + } +} + +target("mac_app_bundle", "remoting_me2me_host") { + extra_configs = [ "//remoting/build/config:version" ] + info_plist = "remoting_me2me_host-Info.plist" + extra_substitutions = [ + "BUNDLE_ID=$host_bundle_id", + "VERSION_FULL=$remoting_version_full", + "VERSION_SHORT=$remoting_version_short", + "MACOSX_DEPLOYMENT_TARGET=10.7", + ] + + if (is_chrome_branded && is_official_build) { + defines = [ "REMOTING_ENABLE_BREAKPAD" ] + } + + deps = [ + "//build/config/sanitizers:deps", + "//remoting/base:breakpad", + "//remoting/host:main", + "//remoting/host:remoting_me2me_host_static", + "//remoting/host/installer:credits", + "//remoting/resources", + ] + + foreach(locale, remoting_locales_with_underscores) { + deps += [ + ":remoting_host_locale_${locale}_bundle_data", + ":remoting_me2me_host_strings_${locale}_bundle_data", + ] + } + deps += [ + ":remoting_host_resources", + ":remoting_host_xibs", + "//remoting/host:remoting_infoplist_strings", + "//remoting/resources:copy_locales", + ] +} + +create_bundle("remoting_host_prefpane.prefPane") { + bundle_root_dir = "$root_build_dir/$target_name/Contents" + bundle_resources_dir = bundle_root_dir + "/Resources" + bundle_executable_dir = bundle_root_dir + "/MacOS" + + deps = [ + ":remoting_host_prefpane", + ":remoting_host_prefpane_bundle_data", + ":remoting_host_prefpane_plist_bundle_data", + ":remoting_host_prefpane_resources", + ":remoting_host_prefpane_xibs", + "//remoting/host:remoting_infoplist_strings", + ] + + foreach(locale, remoting_locales_with_underscores) { + deps += [ ":remoting_host_prefpane_strings_${locale}_bundle_data" ] + } +} + +foreach(locale, remoting_locales_with_underscores) { + bundle_data("remoting_host_locale_${locale}_bundle_data") { + sources = [ + "$root_build_dir/remoting/resources/$locale.lproj/locale.pak", + ] + outputs = [ + "{{bundle_resources_dir}}/$locale.lproj/{{source_file_part}}", + ] + deps = [ + "//remoting/resources:copy_locales", + ] + } +} + +bundle_data("remoting_host_prefpane_bundle_data") { + deps = [ + ":remoting_host_prefpane", + ] + sources = [ + "$root_build_dir/gen/remoting/host/remoting_host_prefpane", + ] + outputs = [ + "{{bundle_executable_dir}}/{{source_file_part}}", + ] +} + +bundle_data("remoting_host_prefpane_resources") { + sources = [ + "//remoting/resources/chromoting128.png", + ] + + outputs = [ + "{{bundle_resources_dir}}/{{source_file_part}}", + ] +} + +# native_messaging_host-InfoPlist.strings +foreach(locale, remoting_locales_with_underscores) { + bundle_data("native_messaging_host_strings_${locale}_bundle_data") { + sources = [ + "$root_gen_dir/remoting/host/native_messaging_host-InfoPlist.strings/$locale.lproj/InfoPlist.strings", + ] + outputs = [ + "{{bundle_resources_dir}}/$locale.lproj/{{source_file_part}}", + ] + deps = [ + "//remoting/host:remoting_infoplist_strings", + ] + } +} + +target("mac_app_bundle", "remoting_native_messaging_host") { + info_plist = "../setup/native_messaging_host-Info.plist" + extra_configs = [ "//build/config/compiler:wexit_time_destructors" ] + extra_substitutions = [ + "BUNDLE_ID=$native_messaging_host_bundle_id", + "VERSION_FULL=$remoting_version_full", + "VERSION_SHORT=$remoting_version_short", + "MACOSX_DEPLOYMENT_TARGET=10.7", + ] + + sources = [ + "../setup/me2me_native_messaging_host_entry_point.cc", + "../setup/me2me_native_messaging_host_main.cc", + "../setup/me2me_native_messaging_host_main.h", + ] + + deps = [ + "//base", + "//remoting/base:breakpad", + "//remoting/host", + "//remoting/host:remoting_infoplist_strings", + "//remoting/host/native_messaging", + "//remoting/host/setup", + ] + foreach(locale, remoting_locales_with_underscores) { + deps += [ + ":native_messaging_host_strings_${locale}_bundle_data", + "//remoting/host/mac:remoting_host_locale_${locale}_bundle_data", + ] + } + deps += [ "//remoting/resources:copy_locales" ] + + # The |major|, |build| and |patch| versions are inherited from Chrome. + # Since Chrome's |minor| version is always '0', we replace it with a + # Chromoting-specific patch version. + defines = + [ "VERSION=" + "$chrome_version_major" + "." + "$remoting_version_patch" + + "." + "$chrome_version_build" + "." + "$chrome_version_patch" ] +} + +loadable_module("remoting_host_prefpane") { + output_dir = "$root_out_dir/gen/remoting/host" + output_extension = "" + + sources = [ + "me2me_preference_pane.h", + "me2me_preference_pane.mm", + "me2me_preference_pane_confirm_pin.h", + "me2me_preference_pane_confirm_pin.mm", + "me2me_preference_pane_disable.h", + "me2me_preference_pane_disable.mm", + ] + + libs = [ + "Cocoa.framework", + "CoreFoundation.framework", + "PreferencePanes.framework", + "Security.framework", + ] + + deps = [ + ":constants", + "//remoting/base", + "//remoting/host:host", + "//remoting/host:remoting_infoplist_strings", + "//remoting/resources:copy_locales", + "//third_party/jsoncpp", + ] + foreach(locale, remoting_locales_with_underscores) { + deps += [ ":remoting_host_prefpane_strings_${locale}_bundle_data" ] + } +} + +mac_info_plist("remoting_host_prefpane_plist") { + info_plist = "me2me_preference_pane-Info.plist" + extra_substitutions = [ + "BUNDLE_ID=$prefpane_bundle_id", + "VERSION_FULL=$remoting_version_full", + "VERSION_SHORT=$remoting_version_short", + "MACOSX_DEPLOYMENT_TARGET=10.7", + ] + executable_name = "remoting_host_prefpane" +} + +bundle_data("remoting_host_prefpane_plist_bundle_data") { + sources = get_target_outputs(":remoting_host_prefpane_plist") + outputs = [ + "{{bundle_root_dir}}/Info.plist", + ] + public_deps = [ + ":remoting_host_prefpane_plist", + ] +} + +foreach(locale, remoting_locales_with_underscores) { + bundle_data("remoting_host_prefpane_strings_${locale}_bundle_data") { + sources = [ + "$root_gen_dir/remoting/host/me2me_preference_pane-InfoPlist.strings/$locale.lproj/InfoPlist.strings", + ] + outputs = [ + "{{bundle_resources_dir}}/$locale.lproj/{{source_file_part}}", + ] + deps = [ + "//remoting/host:remoting_infoplist_strings", + ] + } +} + +mac_xib_bundle_data("remoting_host_prefpane_xibs") { + sources = [ + "me2me_preference_pane.xib", + "me2me_preference_pane_confirm_pin.xib", + "me2me_preference_pane_disable.xib", + ] +}
diff --git a/remoting/host/constants_mac.cc b/remoting/host/mac/constants_mac.cc similarity index 85% rename from remoting/host/constants_mac.cc rename to remoting/host/mac/constants_mac.cc index 4757482..3b2f48d 100644 --- a/remoting/host/constants_mac.cc +++ b/remoting/host/mac/constants_mac.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "remoting/host/constants_mac.h" +#include "remoting/host/mac/constants_mac.h" #if defined(GN_BUILD) #include "remoting/host/version.h" @@ -40,9 +40,9 @@ "/Library/Google/Chrome/NativeMessagingHosts/" "com.google.chrome.remote_desktop.json"; -const char kBrandedUninstallerPath[] = APPLICATIONS_DIR - "Chrome Remote Desktop Host Uninstaller.app"; -const char kUnbrandedUninstallerPath[] = APPLICATIONS_DIR - "Chromoting Host Uninstaller.app"; +const char kBrandedUninstallerPath[] = + APPLICATIONS_DIR "Chrome Remote Desktop Host Uninstaller.app"; +const char kUnbrandedUninstallerPath[] = + APPLICATIONS_DIR "Chromoting Host Uninstaller.app"; } // namespace remoting
diff --git a/remoting/host/constants_mac.h b/remoting/host/mac/constants_mac.h similarity index 97% rename from remoting/host/constants_mac.h rename to remoting/host/mac/constants_mac.h index 5d131d2..42099a8b 100644 --- a/remoting/host/constants_mac.h +++ b/remoting/host/mac/constants_mac.h
@@ -16,10 +16,9 @@ // These are #defines because they are used with CFSTR macro, which requires // string literals. #define UPDATE_SUCCEEDED_NOTIFICATION_NAME \ - "org.chromium.chromoting.update_succeeded" + "org.chromium.chromoting.update_succeeded" #define UPDATE_FAILED_NOTIFICATION_NAME "org.chromium.chromoting.update_failed" - // Chromoting's preference pane file. extern const char kPrefPaneFileName[]; extern const char kPrefPaneFilePath[];
diff --git a/remoting/host/disconnect_window.xib b/remoting/host/mac/disconnect_window.xib similarity index 100% rename from remoting/host/disconnect_window.xib rename to remoting/host/mac/disconnect_window.xib
diff --git a/remoting/host/mac/me2me_preference_pane.mm b/remoting/host/mac/me2me_preference_pane.mm index 0f300f4..cc17b67 100644 --- a/remoting/host/mac/me2me_preference_pane.mm +++ b/remoting/host/mac/me2me_preference_pane.mm
@@ -22,8 +22,8 @@ #include "base/mac/mac_logging.h" #include "base/mac/scoped_launch_data.h" #include "base/posix/eintr_wrapper.h" -#include "remoting/host/constants_mac.h" #include "remoting/host/host_config.h" +#include "remoting/host/mac/constants_mac.h" #import "remoting/host/mac/me2me_preference_pane_confirm_pin.h" #import "remoting/host/mac/me2me_preference_pane_disable.h" #include "remoting/host/pin_hash.h"
diff --git a/remoting/host/remoting_me2me_host-Info.plist b/remoting/host/mac/remoting_me2me_host-Info.plist similarity index 100% rename from remoting/host/remoting_me2me_host-Info.plist rename to remoting/host/mac/remoting_me2me_host-Info.plist
diff --git a/remoting/host/remoting_me2me_host.icns b/remoting/host/mac/remoting_me2me_host.icns similarity index 100% rename from remoting/host/remoting_me2me_host.icns rename to remoting/host/mac/remoting_me2me_host.icns Binary files differ
diff --git a/remoting/host/setup/BUILD.gn b/remoting/host/setup/BUILD.gn index 75926e68..d0e992e8 100644 --- a/remoting/host/setup/BUILD.gn +++ b/remoting/host/setup/BUILD.gn
@@ -43,6 +43,10 @@ "//remoting/host/native_messaging", ] + if (is_mac || is_ios) { + deps += [ "//remoting/host/mac:constants" ] + } + if (is_win) { deps += [ "//remoting/host/win:remoting_lib_idl" ] }
diff --git a/remoting/host/setup/daemon_controller_delegate_mac.mm b/remoting/host/setup/daemon_controller_delegate_mac.mm index 461d14dd..5c1eb9d 100644 --- a/remoting/host/setup/daemon_controller_delegate_mac.mm +++ b/remoting/host/setup/daemon_controller_delegate_mac.mm
@@ -26,8 +26,8 @@ #include "base/strings/sys_string_conversions.h" #include "base/time/time.h" #include "base/values.h" -#include "remoting/host/constants_mac.h" #include "remoting/host/host_config.h" +#include "remoting/host/mac/constants_mac.h" #include "remoting/host/usage_stats_consent.h" namespace remoting {
diff --git a/remoting/protocol/connection_unittest.cc b/remoting/protocol/connection_unittest.cc index 75318b3..8c81430 100644 --- a/remoting/protocol/connection_unittest.cc +++ b/remoting/protocol/connection_unittest.cc
@@ -76,7 +76,7 @@ void Start(Callback* callback) override { callback_ = callback; } - void Capture(const webrtc::DesktopRegion& region) override { + void CaptureFrame() override { // Return black 100x100 frame. std::unique_ptr<webrtc::DesktopFrame> frame( new webrtc::BasicDesktopFrame(webrtc::DesktopSize(100, 100)));
diff --git a/remoting/protocol/fake_desktop_capturer.cc b/remoting/protocol/fake_desktop_capturer.cc index f6042fd..17b25c4 100644 --- a/remoting/protocol/fake_desktop_capturer.cc +++ b/remoting/protocol/fake_desktop_capturer.cc
@@ -145,7 +145,7 @@ shared_memory_factory_ = std::move(shared_memory_factory); } -void FakeDesktopCapturer::Capture(const webrtc::DesktopRegion& region) { +void FakeDesktopCapturer::CaptureFrame() { base::Time capture_start_time = base::Time::Now(); std::unique_ptr<webrtc::DesktopFrame> frame = frame_generator_.Run(shared_memory_factory_.get());
diff --git a/remoting/protocol/fake_desktop_capturer.h b/remoting/protocol/fake_desktop_capturer.h index 84d3a019..074b5d60 100644 --- a/remoting/protocol/fake_desktop_capturer.h +++ b/remoting/protocol/fake_desktop_capturer.h
@@ -40,7 +40,7 @@ void Start(Callback* callback) override; void SetSharedMemoryFactory(std::unique_ptr<webrtc::SharedMemoryFactory> shared_memory_factory) override; - void Capture(const webrtc::DesktopRegion& rect) override; + void CaptureFrame() override; private: FrameGenerator frame_generator_;
diff --git a/remoting/protocol/video_frame_pump.cc b/remoting/protocol/video_frame_pump.cc index b9a94ba..8cb30e4 100644 --- a/remoting/protocol/video_frame_pump.cc +++ b/remoting/protocol/video_frame_pump.cc
@@ -146,7 +146,7 @@ event_timestamps_source_->TakeLastEventTimestamps(); } - capturer_->Capture(webrtc::DesktopRegion()); + capturer_->CaptureFrame(); } // static
diff --git a/remoting/protocol/video_frame_pump_unittest.cc b/remoting/protocol/video_frame_pump_unittest.cc index 19eea7ba..4c4c9a8 100644 --- a/remoting/protocol/video_frame_pump_unittest.cc +++ b/remoting/protocol/video_frame_pump_unittest.cc
@@ -110,7 +110,7 @@ callback_ = callback; } - void Capture(const webrtc::DesktopRegion& rect) override { + void CaptureFrame() override { EXPECT_TRUE(task_runner_->BelongsToCurrentThread()); std::unique_ptr<webrtc::DesktopFrame> frame(
diff --git a/remoting/protocol/webrtc_audio_source_adapter.cc b/remoting/protocol/webrtc_audio_source_adapter.cc index d9d9ca38..d89e38bc 100644 --- a/remoting/protocol/webrtc_audio_source_adapter.cc +++ b/remoting/protocol/webrtc_audio_source_adapter.cc
@@ -125,15 +125,17 @@ // Here |partial_frame_| always contains a full frame. DCHECK_EQ(partial_frame_.size(), bytes_per_frame); - FOR_EACH_OBSERVER(webrtc::AudioTrackSinkInterface, audio_sinks_, - OnData(&partial_frame_.front(), kBytesPerSample * 8, - sampling_rate_, kChannels, samples_per_frame)); + for (auto& observer : audio_sinks_) { + observer.OnData(&partial_frame_.front(), kBytesPerSample * 8, + sampling_rate_, kChannels, samples_per_frame); + } } while (position + bytes_per_frame <= data.size()) { - FOR_EACH_OBSERVER(webrtc::AudioTrackSinkInterface, audio_sinks_, - OnData(data.data() + position, kBytesPerSample * 8, - sampling_rate_, kChannels, samples_per_frame)); + for (auto& observer : audio_sinks_) { + observer.OnData(data.data() + position, kBytesPerSample * 8, + sampling_rate_, kChannels, samples_per_frame); + } position += bytes_per_frame; }
diff --git a/remoting/protocol/webrtc_video_stream.cc b/remoting/protocol/webrtc_video_stream.cc index d45430e14..46a6f7e 100644 --- a/remoting/protocol/webrtc_video_stream.cc +++ b/remoting/protocol/webrtc_video_stream.cc
@@ -190,7 +190,7 @@ event_timestamps_source_->TakeLastEventTimestamps(); } - capturer_->Capture(webrtc::DesktopRegion()); + capturer_->CaptureFrame(); } // static
diff --git a/remoting/remoting_version.gni b/remoting/remoting_version.gni index 565011b1..8a0df67 100644 --- a/remoting/remoting_version.gni +++ b/remoting/remoting_version.gni
@@ -77,4 +77,15 @@ prefpane_bundle_id = _result.prefpane_bundle_id remote_assistance_host_bundle_id = _result.remote_assistance_host_bundle_id uninstaller_bundle_id = _result.uninstaller_bundle_id + + host_name_nospace = exec_script("//remoting/tools/remove_spaces.py", + [ "$host_name" ], + "trim string") + host_service_name_nospace = exec_script("//remoting/tools/remove_spaces.py", + [ "$host_service_name" ], + "trim string") + host_uninstaller_name_nospace = + exec_script("//remoting/tools/remove_spaces.py", + [ "$host_uninstaller_name" ], + "trim string") }
diff --git a/remoting/resources/remoting_strings_am.xtb b/remoting/resources/remoting_strings_am.xtb index 5ac08fbd..dabdd582 100644 --- a/remoting/resources/remoting_strings_am.xtb +++ b/remoting/resources/remoting_strings_am.xtb
@@ -33,7 +33,6 @@ <translation id="177096447311351977">የሰርጥ አይ ፒ ለደንበኛ፦ <ph name="CLIENT_GAIA_IDENTIFIER" /> አይ ፒ=«<ph name="CLIENT_IP_ADDRESS_AND_PORT" />» የአስተናጋጅ አይ ፒ=«<ph name="HOST_IP_ADDRESS_AND_PORT" />» ሰርጥ=«<ph name="CHANNEL_TYPE" />» ግንኙነት=«<ph name="CONNECTION_TYPE" />»።</translation> <translation id="1779766957982586368">መስኮት ዝጋ</translation> <translation id="1841799852846221389">ለዚህ ኮምፒውተር የርቀት ግንኙነቶችን በማሰናከል ላይ…</translation> -<translation id="189172778771606813">የአሰሳ መሳቢያ ዝጋ</translation> <translation id="1897488610212723051">ሰርዝ</translation> <translation id="195619862187186579">የቁልፍ ሰሌዳ አቀማመጦች</translation> <translation id="1996161829609978754">Chrome የChromoting አስተናጋጅ ጫኚውን እያወረደ ነው። ውርዱ አንዴ ከተጠናቀቀ በኋላ እባክዎ ከመቀጠልዎ በፊት ጫኚውን ያሂዱት።</translation> @@ -114,6 +113,7 @@ አስተናጋጅ</translation> <translation id="3870154837782082782">Google Inc.</translation> <translation id="3884839335308961732">እባክዎ በChrome የርቀት ዴስክቶፕ መዳረሻ ለመፍቀድ መለያዎን እና ፒንዎን ከዚህ በታች ያረጋግጡ።</translation> +<translation id="3897092660631435901">ምናሌ</translation> <translation id="3905196214175737742">ልክ ያልሆነ የአስተናጋጅ ባለቤት ጎራ።</translation> <translation id="3908017899227008678">ለማመጣጠን አሳንስ</translation> <translation id="3931191050278863510">አስተናጋጅ ቆሟል።</translation> @@ -166,7 +166,6 @@ <translation id="5070121137485264635">የርቀት አስተናጋጁ ለሶስተኛ ወገን ድር ጣቢያ እንዲያረጋግጡ ይፈልጋል። ለመቀጠል Chrome የርቀት ዴስክቶፕ ይህን አድራሻ እንዲደርስበት ተጨማሪ ፍቃዶችን መስጠት አለብዎት፦</translation> <translation id="507204348399810022">ከ<ph name="HOSTNAME" /> ጋር ያሉ የርቀት ግንኙነቶችን ማሰናከል ይፈልጋሉ?</translation> <translation id="5156271271724754543">እባክዎ ተመሳሳዩን ፒን በሁለቱም ሳጥኖች ውስጥ ያስገቡ።</translation> -<translation id="5168917394043976756">የአሰሳ መሳቢያ ክፈት</translation> <translation id="5170982930780719864">ልክ ያልሆነ የአስተናጋጅ መታወቂያ።</translation> <translation id="518094545883702183">ይህ መረጃ ጥቅም ላይ የሚውለው ሪፖርት የሚያደርጉትን ችግር ለመመርመር ብቻ ነው፣ የሚገኘው ሪፖርትዎን ለሚመረምረው ሰው ብቻ ነው፣ እና ከ30 ቀኖች በላይ አይቆይም።</translation> <translation id="5222676887888702881">ዘግተህ ውጣ</translation>
diff --git a/remoting/resources/remoting_strings_ar.xtb b/remoting/resources/remoting_strings_ar.xtb index 5560a41..28faf01 100644 --- a/remoting/resources/remoting_strings_ar.xtb +++ b/remoting/resources/remoting_strings_ar.xtb
@@ -33,7 +33,6 @@ <translation id="177096447311351977">عنوان IP للقناة التابع للعميل: <ph name="CLIENT_GAIA_IDENTIFIER" /> ip='<ph name="CLIENT_IP_ADDRESS_AND_PORT" />' host_ip='<ph name="HOST_IP_ADDRESS_AND_PORT" />' channel='<ph name="CHANNEL_TYPE" />' connection='<ph name="CONNECTION_TYPE" />'.</translation> <translation id="1779766957982586368">إغلاق النافذة</translation> <translation id="1841799852846221389">جارٍ تعطيل الاتصالات عن بُعد لهذا الكمبيوتر...</translation> -<translation id="189172778771606813">إغلاق لائحة التنقل</translation> <translation id="1897488610212723051">حذف</translation> <translation id="195619862187186579">تخطيطات لوحة المفاتيح</translation> <translation id="1996161829609978754">يجري Chrome تنزيلاً لأداة تثبيت مضيف تطبيق التوافق مع نظام التشغيل Chrome. بعد اكتمال التنزيل، يرجى تشغيل أداة التثبيت قبل المتابعة.</translation> @@ -114,6 +113,7 @@ التوافق مع نظام التشغيل</translation> <translation id="3870154837782082782">Google Inc.</translation> <translation id="3884839335308961732">يُرجى التأكيد على حسابك ورقم تعريفك الشخصي أدناه للسماح بالدخول من خلال سطح المكتب البعيد من Chrome.</translation> +<translation id="3897092660631435901">قائمة</translation> <translation id="3905196214175737742">نطاق مالك المضيف غير صالح.</translation> <translation id="3908017899227008678">تقليص للملاءمة</translation> <translation id="3931191050278863510">المضيف توقف.</translation> @@ -167,7 +167,6 @@ <translation id="5070121137485264635">يتطلب منك المضيف البعيد مصادقة موقع ويب لجهة خارجية. للمتابعة، يجب منح تطبيق سطح المكتب البعيد من Chrome أذونات إضافية للدخول إلى هذا العنوان:</translation> <translation id="507204348399810022">هل تريد بالتأكيد تعطيل الاتصالات عن بُعد بـ <ph name="HOSTNAME" />؟</translation> <translation id="5156271271724754543">الرجاء إدخال رقم التعريف الشخصي نفسه في كلا المربعين.</translation> -<translation id="5168917394043976756">فتح لائحة التنقل</translation> <translation id="5170982930780719864">رقم تعريف المضيف غير صالح.</translation> <translation id="518094545883702183">ولا تستخدم هذه المعلومات سوى لتشخيص المشكلة التي قدمت عنها التقرير، كما أنها غير متاحة إلا للشخص الذي يحقق في تقريرك، ويتم الاحتفاظ بها لمدة لا تتجاوز 30 يومًا.</translation> <translation id="5222676887888702881">الخروج</translation>
diff --git a/remoting/resources/remoting_strings_bg.xtb b/remoting/resources/remoting_strings_bg.xtb index 47c6128..f383c59 100644 --- a/remoting/resources/remoting_strings_bg.xtb +++ b/remoting/resources/remoting_strings_bg.xtb
@@ -33,7 +33,6 @@ <translation id="177096447311351977">IP адрес на канала за клиентската програма: <ph name="CLIENT_GAIA_IDENTIFIER" /> ip='<ph name="CLIENT_IP_ADDRESS_AND_PORT" />' host_ip='<ph name="HOST_IP_ADDRESS_AND_PORT" />' channel='<ph name="CHANNEL_TYPE" />' connection='<ph name="CONNECTION_TYPE" />'.</translation> <translation id="1779766957982586368">Затваряне на прозореца</translation> <translation id="1841799852846221389">Отдалечените връзки за този компютър се деактивират…</translation> -<translation id="189172778771606813">Затваряне на слоя за навигация</translation> <translation id="1897488610212723051">Изтриване</translation> <translation id="195619862187186579">Клавиатурни подредби</translation> <translation id="1996161829609978754">Chrome изтегля инсталационната програма за хоста на Chromoting. След като процесът завърши, моля, стартирайте я, преди да продължите.</translation> @@ -114,6 +113,7 @@ Chromoting</translation> <translation id="3870154837782082782">Google Inc.</translation> <translation id="3884839335308961732">Моля, потвърдете профила и ПИН кода си по-долу, за да разрешите достъпа чрез отдалечения работен плот на Chrome.</translation> +<translation id="3897092660631435901">Меню</translation> <translation id="3905196214175737742">Невалиден домейн на собственика на хоста.</translation> <translation id="3908017899227008678">Намаляване за побиране</translation> <translation id="3931191050278863510">Хостът е спрян.</translation> @@ -166,7 +166,6 @@ <translation id="5070121137485264635">Отдалеченият хост изисква да удостоверите самоличността си пред уебсайт на трета страна. За да продължите, трябва да предоставите на отдалечения работен плот на Chrome допълнителни разрешения за достъп до този адрес:</translation> <translation id="507204348399810022">Наистина ли искате да деактивирате отдалечените връзки с/ъс <ph name="HOSTNAME" />?</translation> <translation id="5156271271724754543">Моля, въведете един и същ ПИН код и в двете полета.</translation> -<translation id="5168917394043976756">Отваряне на слоя за навигация</translation> <translation id="5170982930780719864">Невалиден идентификатор на хост.</translation> <translation id="518094545883702183">Тази информация служи единствено за диагностика на проблема, за който подавате сигнал. Тя е достъпна само за проучващото го лице и се съхранява най-много за 30 дни.</translation> <translation id="5222676887888702881">Изход</translation>
diff --git a/remoting/resources/remoting_strings_bn.xtb b/remoting/resources/remoting_strings_bn.xtb index fd86609..1aabef3 100644 --- a/remoting/resources/remoting_strings_bn.xtb +++ b/remoting/resources/remoting_strings_bn.xtb
@@ -33,7 +33,6 @@ <translation id="177096447311351977">এই ক্লায়েন্টের জন্য চ্যানেল IP: <ph name="CLIENT_GAIA_IDENTIFIER" /> ip='<ph name="CLIENT_IP_ADDRESS_AND_PORT" />' host_ip='<ph name="HOST_IP_ADDRESS_AND_PORT" />' channel='<ph name="CHANNEL_TYPE" />' connection='<ph name="CONNECTION_TYPE" />'.</translation> <translation id="1779766957982586368">উইন্ডো বন্ধ করুন</translation> <translation id="1841799852846221389">এই কম্পিউটারটিতে দূরবর্তী সংযোগ অক্ষম করা হচ্ছে...</translation> -<translation id="189172778771606813">নেভিগেশান ড্রয়ার বন্ধ করুন</translation> <translation id="1897488610212723051">মুছুন</translation> <translation id="195619862187186579">কীবোর্ড লেআউট</translation> <translation id="1996161829609978754">Chrome, Chromoting হোস্ট ইনস্টলার ডাউনলোড করছে৷ একবার ডাউনলোড সম্পন্ন হয়ে গেলে, অব্যাহত রাখার আগে দয়া করে ইনস্টলার চালনা করুন৷</translation> @@ -114,6 +113,7 @@ Host</translation> <translation id="3870154837782082782">Google Inc.</translation> <translation id="3884839335308961732">Chrome দূরবর্তী ডেস্কটপের মাধ্যমে অ্যাক্সেসের মঞ্জুরি দিতে দয়া করে নীচে আপনার অ্যাকাউন্ট এবং পিন নিশ্চিত করুন৷</translation> +<translation id="3897092660631435901">মেনু</translation> <translation id="3905196214175737742">অবৈধ হোস্ট মালিক ডোমেইন।</translation> <translation id="3908017899227008678">মানানসই করতে সঙ্কুচিত করুন</translation> <translation id="3931191050278863510">হোস্ট থেমে গেছে।</translation> @@ -166,7 +166,6 @@ <translation id="5070121137485264635">একটি তৃতীয়-পক্ষ ওয়েবসাইট প্রমাণীকরণ করতে রিমোট হোস্টটির আপনাকে প্রয়োজন। অবিরত রাখতে, এই ওয়েবসাইট অ্যাক্সেস করতে আপনাকে অবশ্যই Chrome দূরবর্তী ডেস্কটপ অতিরিক্ত অনুমতির মঞ্জুরি দিতে হবে:</translation> <translation id="507204348399810022">আপনি কি নিশ্চিত যে আপনি <ph name="HOSTNAME" /> এর সাথে দূরবর্তী সংযোগ অক্ষম করতে চান?</translation> <translation id="5156271271724754543">উভয় বক্সে দয়া করে একই পিন লিখুন৷</translation> -<translation id="5168917394043976756">নেভিগেশান ড্রয়ার খুলুন</translation> <translation id="5170982930780719864">অবৈধ হোস্ট আইডি।</translation> <translation id="518094545883702183">আপনার রিপোর্ট করা সমস্যার নির্ণয়ের জন্য এই তথ্য ব্যবহার করা হয়, যা কেবল আপনার রিপোর্ট অনুসন্ধান চালান এমন একজনের কাছে উপলব্ধ, এবং 30 দিনের বেশী রাখা হয় না।</translation> <translation id="5222676887888702881">প্রস্থান করুন</translation>
diff --git a/remoting/resources/remoting_strings_ca.xtb b/remoting/resources/remoting_strings_ca.xtb index d2fa3ce6..0f462cb 100644 --- a/remoting/resources/remoting_strings_ca.xtb +++ b/remoting/resources/remoting_strings_ca.xtb
@@ -33,7 +33,6 @@ <translation id="177096447311351977">IP del canal del client: <ph name="CLIENT_GAIA_IDENTIFIER" /> ip='<ph name="CLIENT_IP_ADDRESS_AND_PORT" />' host_ip='<ph name="HOST_IP_ADDRESS_AND_PORT" />' channel='<ph name="CHANNEL_TYPE" />' connection='<ph name="CONNECTION_TYPE" />'.</translation> <translation id="1779766957982586368">Tanca la finestra</translation> <translation id="1841799852846221389">S'estan desactivant les connexions remotes en aquest ordinador...</translation> -<translation id="189172778771606813">Tanca el tauler de navegació</translation> <translation id="1897488610212723051">Suprimeix</translation> <translation id="195619862187186579">Dissenys de teclat</translation> <translation id="1996161829609978754">Chrome està baixant l'instal·lador de l'amfitrió de Chromoting. Quan s'hagi completat la baixada, executeu l'instal·lador abans de continuar.</translation> @@ -114,6 +113,7 @@ Host</translation> <translation id="3870154837782082782">Google Inc.</translation> <translation id="3884839335308961732">Confirmeu el vostre compte i PIN a continuació per permetre l'accés per l'escriptori remot de Chrome.</translation> +<translation id="3897092660631435901">Menú</translation> <translation id="3905196214175737742">El domini del propietari de l'amfitrió no és vàlid.</translation> <translation id="3908017899227008678">Redueix per ajustar</translation> <translation id="3931191050278863510">S'ha aturat l'amfitrió.</translation> @@ -166,7 +166,6 @@ <translation id="5070121137485264635">L'amfitrió remot necessita que us autentiqueu en un lloc web de tercers. Per continuar, cal que concediu permisos addicionals a l'escriptori remot de Chrome per accedir a aquesta adreça:</translation> <translation id="507204348399810022">Confirmes que vols desactivar les connexions remotes a <ph name="HOSTNAME" />?</translation> <translation id="5156271271724754543">Introduïu el mateix PIN als dos quadres.</translation> -<translation id="5168917394043976756">Obre el tauler de navegació</translation> <translation id="5170982930780719864">L'identificador de l'amfitrió no és vàlid.</translation> <translation id="518094545883702183">Aquesta informació només s'utilitza per diagnosticar el problema de què esteu informant. Només hi poden accedir les persones que analitzen l'informe i es conserva com a màxim durant 30 dies.</translation> <translation id="5222676887888702881">Tanca la sessió</translation>
diff --git a/remoting/resources/remoting_strings_cs.xtb b/remoting/resources/remoting_strings_cs.xtb index 0572617..b53d7759 100644 --- a/remoting/resources/remoting_strings_cs.xtb +++ b/remoting/resources/remoting_strings_cs.xtb
@@ -33,7 +33,6 @@ <translation id="177096447311351977">IP adresa kanálu pro klienta: <ph name="CLIENT_GAIA_IDENTIFIER" /> ip='<ph name="CLIENT_IP_ADDRESS_AND_PORT" />' host_ip='<ph name="HOST_IP_ADDRESS_AND_PORT" />' channel='<ph name="CHANNEL_TYPE" />' connection='<ph name="CONNECTION_TYPE" />'.</translation> <translation id="1779766957982586368">Zavřít okno</translation> <translation id="1841799852846221389">Zakazování vzdálených připojení k tomuto počítači…</translation> -<translation id="189172778771606813">Zavřít vysouvací panel navigace</translation> <translation id="1897488610212723051">Smazat</translation> <translation id="195619862187186579">Rozložení klávesnice</translation> <translation id="1996161829609978754">Chrome stahuje instalační program hostitele funkce Chromoting. Po stažení instalační program spusťte a poté pokračujte.</translation> @@ -115,6 +114,7 @@ Chromoting</translation> <translation id="3870154837782082782">Google Inc.</translation> <translation id="3884839335308961732">K povolení přístupu prostřednictvím Vzdálené plochy Chrome je třeba potvrdit účet a kód PIN níže.</translation> +<translation id="3897092660631435901">Nabídka</translation> <translation id="3905196214175737742">Neplatná doména vlastníka hostitele.</translation> <translation id="3908017899227008678">Zmenšit dle místa</translation> <translation id="3931191050278863510">Hostitel byl zastaven.</translation> @@ -167,7 +167,6 @@ <translation id="5070121137485264635">Vzdálený hostitelský server vyžaduje, abyste provedli ověření na stránce třetí strany. Aby bylo možné pokračovat, je nutné udělit Vzdálené ploše Chrome dodatečná oprávnění k přístupu na tuto adresu:</translation> <translation id="507204348399810022">Opravdu chcete vzdálená připojení k počítači <ph name="HOSTNAME" /> zakázat?</translation> <translation id="5156271271724754543">Zadejte do obou polí stejný kód PIN.</translation> -<translation id="5168917394043976756">Otevřít vysouvací panel navigace</translation> <translation id="5170982930780719864">Neplatné ID hostitele.</translation> <translation id="518094545883702183">Tyto informace jsou využity pouze při diagnostikování problému, který jste nahlásili, jsou dostupné pouze osobě, která vaši zprávu prošetřuje, a nejsou uchovávány déle než 30 dní.</translation> <translation id="5222676887888702881">Odhlásit se</translation>
diff --git a/remoting/resources/remoting_strings_da.xtb b/remoting/resources/remoting_strings_da.xtb index 5efd8a38..c3a1291 100644 --- a/remoting/resources/remoting_strings_da.xtb +++ b/remoting/resources/remoting_strings_da.xtb
@@ -33,7 +33,6 @@ <translation id="177096447311351977">Kanal-IP for klient: <ph name="CLIENT_GAIA_IDENTIFIER" /> ip='<ph name="CLIENT_IP_ADDRESS_AND_PORT" />' host_ip='<ph name="HOST_IP_ADDRESS_AND_PORT" />' channel='<ph name="CHANNEL_TYPE" />' connection='<ph name="CONNECTION_TYPE" />'.</translation> <translation id="1779766957982586368">Luk vindue</translation> <translation id="1841799852846221389">Deaktiverer fjernforbindelserne for denne computer…</translation> -<translation id="189172778771606813">Luk sidemenuen</translation> <translation id="1897488610212723051">Slet</translation> <translation id="195619862187186579">Tastaturlayout</translation> <translation id="1996161829609978754">Chrome downloader installationsprogrammet Chromoting Host. Når overførslen er færdig, skal du køre installationsprogrammet, før du fortsætter.</translation> @@ -114,6 +113,7 @@ host</translation> <translation id="3870154837782082782">Google Inc.</translation> <translation id="3884839335308961732">Bekræft din konto og pinkode nedenfor for at tillade adgang via Chrome Fjernskrivebord.</translation> +<translation id="3897092660631435901">Menu</translation> <translation id="3905196214175737742">Ejerdomænet for hosten er ugyldigt.</translation> <translation id="3908017899227008678">Tilpas til vinduet</translation> <translation id="3931191050278863510">Hosten er stoppet.</translation> @@ -166,7 +166,6 @@ <translation id="5070121137485264635">Fjernværten kræver, at du bekræftes over for et tredjepartswebsite. Du skal give Chrome Fjernskrivebord yderligere tilladelser til at få adgang til denne adresse, før du kan fortsætte:</translation> <translation id="507204348399810022">Er du sikker på, at du vil deaktivere fjernforbindelserne til <ph name="HOSTNAME" />?</translation> <translation id="5156271271724754543">Indtast den samme pinkode i begge felter.</translation> -<translation id="5168917394043976756">Åbn sidemenuen</translation> <translation id="5170982930780719864">Ugyldigt host-id.</translation> <translation id="518094545883702183">Disse oplysninger bruges kun til diagnosticering af det problem, du rapporterer, de er kun tilgængelige for personer, der undersøger din rapport, og de tilbageholdes i højst 30 dage.</translation> <translation id="5222676887888702881">Log ud</translation>
diff --git a/remoting/resources/remoting_strings_de.xtb b/remoting/resources/remoting_strings_de.xtb index f2b98bf2..901393b 100644 --- a/remoting/resources/remoting_strings_de.xtb +++ b/remoting/resources/remoting_strings_de.xtb
@@ -33,15 +33,14 @@ <translation id="177096447311351977">Kanal-IP für Client: <ph name="CLIENT_GAIA_IDENTIFIER" /> IP="<ph name="CLIENT_IP_ADDRESS_AND_PORT" />" Host-IP="<ph name="HOST_IP_ADDRESS_AND_PORT" />" Kanal="<ph name="CHANNEL_TYPE" />" Verbindung="<ph name="CONNECTION_TYPE" />"</translation> <translation id="1779766957982586368">Fenster schließen</translation> <translation id="1841799852846221389">Remote-Verbindungen für diesen Computer werden deaktiviert…</translation> -<translation id="189172778771606813">Navigationsleiste schließen</translation> <translation id="1897488610212723051">Löschen</translation> <translation id="195619862187186579">Tastaturlayouts</translation> <translation id="1996161829609978754">Chrome lädt das Installationsprogramm für den Chromoting-Host herunter. Führen Sie nach dem Download das Installationsprogramm aus, bevor Sie fortfahren.</translation> <translation id="2009755455353575666">Fehler beim Herstellen der Verbindung</translation> <translation id="2013884659108657024">Chrome lädt das Installationsprogramm für den Chrome Remote Desktop-Host herunter. Führen Sie nach dem Download das Installationsprogramm aus, bevor Sie fortfahren.</translation> -<translation id="2013996867038862849">Alle Clients mit Pairing wurden gelöscht.</translation> +<translation id="2013996867038862849">Alle gekoppelten Clients wurden gelöscht.</translation> <translation id="2038229918502634450">Der Host wird neu gestartet, um eine Richtlinienänderung zu übernehmen.</translation> -<translation id="2046651113449445291">Für die folgenden Clients wurde ein Pairing mit diesem Computer durchgeführt. Die Clients können ohne PIN eine Verbindung herstellen. Sie können diese Berechtigung jederzeit aufheben, entweder einzeln oder für alle Clients.</translation> +<translation id="2046651113449445291">Die folgenden Clients wurden mit diesem Computer gekoppelt. Die Clients können ohne PIN eine Verbindung herstellen. Sie können diese Berechtigung jederzeit aufheben, entweder einzeln oder für alle Clients.</translation> <translation id="2078880767960296260">Host-Prozess</translation> <translation id="20876857123010370">Touchpadmodus</translation> <translation id="2089514346391228378">Die Remote-Verbindungen für diesen Computer wurden aktiviert.</translation> @@ -114,6 +113,7 @@ Host</translation> <translation id="3870154837782082782">Google Inc.</translation> <translation id="3884839335308961732">Bestätigen Sie unten Ihr Konto und Ihre PIN, um Zugriff über Chrome Remote Desktop zu gewähren.</translation> +<translation id="3897092660631435901">Menü</translation> <translation id="3905196214175737742">Ungültige Hostinhaberdomain</translation> <translation id="3908017899227008678">Größe anpassen</translation> <translation id="3931191050278863510">Host angehalten</translation> @@ -166,7 +166,6 @@ <translation id="5070121137485264635">Der Remote-Host verlangt, dass Sie sich über eine Drittanbieter-Website authentifizieren. Um fortfahren zu können, geben Sie Chrome Remote Desktop zusätzliche Berechtigungen für den Zugriff auf die folgende Adresse:</translation> <translation id="507204348399810022">Möchten Sie die Remote-Verbindungen zu <ph name="HOSTNAME" /> wirklich deaktivieren?</translation> <translation id="5156271271724754543">Die PIN muss in beiden Feldern identisch sein.</translation> -<translation id="5168917394043976756">Navigationsleiste öffnen</translation> <translation id="5170982930780719864">Ungültige Host-ID</translation> <translation id="518094545883702183">Diese Informationen werden nur zur Diagnose des gemeldeten Problems verwendet. Dabei kann nur die Person auf sie zugreifen, die Ihren Bericht untersucht. Die Informationen werden nach spätestens 30 Tagen gelöscht.</translation> <translation id="5222676887888702881">Abmelden</translation> @@ -186,7 +185,7 @@ <translation id="5625493749705183369">Greifen Sie sicher über das Internet auf andere Computer zu oder gewähren Sie anderen Nutzern Zugriff auf Ihren Computer.</translation> <translation id="5702987232842159181">Verbunden:</translation> <translation id="5708869785009007625">Ihr Desktop ist zurzeit für <ph name="USER" /> freigegeben.</translation> -<translation id="5773590752998175013">Pairing-Datum</translation> +<translation id="5773590752998175013">Datum der Kopplung</translation> <translation id="579702532610384533">Erneut verbinden</translation> <translation id="5843054235973879827">Warum ist dieser Vorgang sicher?</translation> <translation id="5859141382851488196">Neues Fenster...</translation>
diff --git a/remoting/resources/remoting_strings_el.xtb b/remoting/resources/remoting_strings_el.xtb index 4b29545d..0ff365bb 100644 --- a/remoting/resources/remoting_strings_el.xtb +++ b/remoting/resources/remoting_strings_el.xtb
@@ -33,7 +33,6 @@ <translation id="177096447311351977">Διεύθυνση IP καναλιού για υπολογιστή-πελάτη: <ph name="CLIENT_GAIA_IDENTIFIER" /> ip='<ph name="CLIENT_IP_ADDRESS_AND_PORT" />' host_ip='<ph name="HOST_IP_ADDRESS_AND_PORT" />' channel='<ph name="CHANNEL_TYPE" />' connection='<ph name="CONNECTION_TYPE" />'.</translation> <translation id="1779766957982586368">Κλείσιμο παραθύρου</translation> <translation id="1841799852846221389">Απενεργοποίηση απομακρυσμένων συνδέσεων για αυτόν τον υπολογιστή…</translation> -<translation id="189172778771606813">Κλείσιμο συρταριού πλοήγησης</translation> <translation id="1897488610212723051">Διαγραφή</translation> <translation id="195619862187186579">Διατάξεις πληκτρολογίου</translation> <translation id="1996161829609978754">Το Chrome πραγματοποιεί λήψη του προγράμματος εγκατάστασης κεντρικού υπολογιστή για το Chromoting. Αφού ολοκληρωθεί η λήψη, εκτελέστε το πρόγραμμα εγκατάστασης πριν να συνεχίσετε.</translation> @@ -114,6 +113,7 @@ Chromoting</translation> <translation id="3870154837782082782">Google Inc.</translation> <translation id="3884839335308961732">Επιβεβαιώστε το λογαριασμό σας και τον κωδικό σας PIN παρακάτω, για να επιτρέψετε την πρόσβαση μέσω Απομακρυσμένης επιφάνειας εργασίας Chrome.</translation> +<translation id="3897092660631435901">Μενού</translation> <translation id="3905196214175737742">Μη έγκυρος τομέας κατόχου κεντρικού υπολογιστή.</translation> <translation id="3908017899227008678">Σμίκρυνση για προσαρμογή</translation> <translation id="3931191050278863510">Ο κεντρικός υπολογιστής σταμάτησε.</translation> @@ -166,7 +166,6 @@ <translation id="5070121137485264635">Ο απομακρυσμένος κεντρικός υπολογιστής ζήτησε τον έλεγχο της ταυτότητάς σας στον ιστότοπο ενός τρίτου μέρους. Για να συνεχίσετε, θα πρέπει να παραχωρήσετε στην Απομακρυσμένη επιφάνεια εργασίας Chrome επιπλέον άδειες για πρόσβαση σε αυτήν τη διεύθυνση:</translation> <translation id="507204348399810022">Είστε βέβαιοι ότι θέλετε να απενεργοποιήσετε τις απομακρυσμένες συνδέσεις στον κεντρικό υπολογιστή <ph name="HOSTNAME" />;</translation> <translation id="5156271271724754543">Εισαγάγετε το ίδιο PIN και στα δύο πλαίσια.</translation> -<translation id="5168917394043976756">Άνοιγμα συρταριού πλοήγησης</translation> <translation id="5170982930780719864">Μη έγκυρο αναγνωριστικό κεντρικού υπολογιστή.</translation> <translation id="518094545883702183">Αυτές οι πληροφορίες χρησιμοποιούνται μόνο για τη διάγνωση του προβλήματος που αναφέρετε, είναι διαθέσιμες μόνο σε κάποιον που ερευνά την αναφορά σας και δεν διατηρούνται για περισσότερες από 30 ημέρες.</translation> <translation id="5222676887888702881">Έξοδος</translation>
diff --git a/remoting/resources/remoting_strings_en-GB.xtb b/remoting/resources/remoting_strings_en-GB.xtb index e4b56f2..b6e802f 100644 --- a/remoting/resources/remoting_strings_en-GB.xtb +++ b/remoting/resources/remoting_strings_en-GB.xtb
@@ -33,7 +33,6 @@ <translation id="177096447311351977">Channel IP for client: <ph name="CLIENT_GAIA_IDENTIFIER" /> ip='<ph name="CLIENT_IP_ADDRESS_AND_PORT" />' host_ip='<ph name="HOST_IP_ADDRESS_AND_PORT" />' channel='<ph name="CHANNEL_TYPE" />' connection='<ph name="CONNECTION_TYPE" />'.</translation> <translation id="1779766957982586368">Close window</translation> <translation id="1841799852846221389">Disabling remote connections for this computer…</translation> -<translation id="189172778771606813">Close navigation drawer</translation> <translation id="1897488610212723051">Delete</translation> <translation id="195619862187186579">Keyboard layouts</translation> <translation id="1996161829609978754">Chrome is downloading the Chromoting Host installer. Once the download is complete, please run the installer before continuing.</translation> @@ -114,6 +113,7 @@ Host</translation> <translation id="3870154837782082782">Google Inc.</translation> <translation id="3884839335308961732">Please confirm your account and PIN below to allow access by Chrome Remote Desktop.</translation> +<translation id="3897092660631435901">Menu</translation> <translation id="3905196214175737742">Invalid host owner domain.</translation> <translation id="3908017899227008678">Shrink to fit</translation> <translation id="3931191050278863510">Host stopped.</translation> @@ -166,7 +166,6 @@ <translation id="5070121137485264635">The remote host requires you to authenticate to a third-party website. To continue, you must grant Chrome Remote Desktop additional permissions to access this address:</translation> <translation id="507204348399810022">Are you sure that you want to disable remote connections to <ph name="HOSTNAME" />?</translation> <translation id="5156271271724754543">Please enter the same PIN in both boxes.</translation> -<translation id="5168917394043976756">Open navigation drawer</translation> <translation id="5170982930780719864">Invalid host id.</translation> <translation id="518094545883702183">This information is used only for diagnosing the problem that you are reporting, is available only to someone investigating your report, and is retained for no more than 30 days.</translation> <translation id="5222676887888702881">Sign out</translation>
diff --git a/remoting/resources/remoting_strings_es-419.xtb b/remoting/resources/remoting_strings_es-419.xtb index 73550ae..0945a00 100644 --- a/remoting/resources/remoting_strings_es-419.xtb +++ b/remoting/resources/remoting_strings_es-419.xtb
@@ -33,7 +33,6 @@ <translation id="177096447311351977">IP de canal para cliente: <ph name="CLIENT_GAIA_IDENTIFIER" /> ip='<ph name="CLIENT_IP_ADDRESS_AND_PORT" />' host_ip='<ph name="HOST_IP_ADDRESS_AND_PORT" />' channel='<ph name="CHANNEL_TYPE" />' connection='<ph name="CONNECTION_TYPE" />'.</translation> <translation id="1779766957982586368">Cerrar ventana</translation> <translation id="1841799852846221389">Inhabilitando conexiones remotas con esta computadora…</translation> -<translation id="189172778771606813">Cerrar panel lateral de navegación</translation> <translation id="1897488610212723051">Borrar</translation> <translation id="195619862187186579">Diseños de teclado</translation> <translation id="1996161829609978754">Chrome está descargando el instalador del host de Chromoting. Cuando termine la descarga, abre el instalador antes de continuar.</translation> @@ -114,6 +113,7 @@ Chromoting</translation> <translation id="3870154837782082782">Google Inc.</translation> <translation id="3884839335308961732">Confirma la cuenta y el PIN a continuación para permitir el acceso del Escritorio remoto de Chrome.</translation> +<translation id="3897092660631435901">Menú</translation> <translation id="3905196214175737742">Dominio del propietario del host no válido</translation> <translation id="3908017899227008678">Ajustar tamaño a ventana de navegador</translation> <translation id="3931191050278863510">Se detuvo el host.</translation> @@ -166,7 +166,6 @@ <translation id="5070121137485264635">El host remoto requiere la autenticación de un sitio web de terceros. Para continuar, debes otorgar permisos adicionales al Escritorio remoto de Chrome para acceder a la siguiente dirección:</translation> <translation id="507204348399810022">¿Seguro que deseas inhabilitar las conexiones remotas a <ph name="HOSTNAME" />?</translation> <translation id="5156271271724754543">Ingresa el mismo PIN en ambos cuadros.</translation> -<translation id="5168917394043976756">Abrir panel lateral de navegación</translation> <translation id="5170982930780719864">ID de host no válido</translation> <translation id="518094545883702183">Esta información solo se usa con el fin de diagnosticar el problema informado, solo está disponible para la persona que investiga el informe y se guarda por no más de 30 días.</translation> <translation id="5222676887888702881">Salir</translation>
diff --git a/remoting/resources/remoting_strings_es.xtb b/remoting/resources/remoting_strings_es.xtb index ac8bf45..98eddef3 100644 --- a/remoting/resources/remoting_strings_es.xtb +++ b/remoting/resources/remoting_strings_es.xtb
@@ -33,7 +33,6 @@ <translation id="177096447311351977">IP de canal de cliente: <ph name="CLIENT_GAIA_IDENTIFIER" /> ip='<ph name="CLIENT_IP_ADDRESS_AND_PORT" />' host_ip='<ph name="HOST_IP_ADDRESS_AND_PORT" />' channel='<ph name="CHANNEL_TYPE" />' connection='<ph name="CONNECTION_TYPE" />'.</translation> <translation id="1779766957982586368">Cerrar ventana</translation> <translation id="1841799852846221389">Inhabilitando conexiones remotas con este ordenador...</translation> -<translation id="189172778771606813">Cerrar panel de navegación</translation> <translation id="1897488610212723051">Eliminar</translation> <translation id="195619862187186579">Diseños de teclado</translation> <translation id="1996161829609978754">Chrome está descargando el archivo de instalación del host de Chromoting. Cuando se haya completado la descarga, ejecuta el archivo de instalación antes de continuar.</translation> @@ -114,6 +113,7 @@ Chromoting</translation> <translation id="3870154837782082782">Google Inc.</translation> <translation id="3884839335308961732">Confirma la cuenta y el PIN a continuación para permitir el acceso de Escritorio Remoto de Chrome.</translation> +<translation id="3897092660631435901">Menú</translation> <translation id="3905196214175737742">Dominio del propietario del host no válido.</translation> <translation id="3908017899227008678">Ajustar tamaño</translation> <translation id="3931191050278863510">Host detenido.</translation> @@ -166,7 +166,6 @@ <translation id="5070121137485264635">El host remoto requiere tu autenticación en un sitio web de terceros. Para continuar, debes conceder a la aplicación Escritorio Remoto de Chrome permisos adicionales para acceder a la siguiente dirección:</translation> <translation id="507204348399810022">¿Seguro que quieres inhabilitar las conexiones remotas a <ph name="HOSTNAME" />?</translation> <translation id="5156271271724754543">Debes introducir el mismo PIN en los dos cuadros.</translation> -<translation id="5168917394043976756">Abrir panel de navegación</translation> <translation id="5170982930780719864">Identificador del host no válido</translation> <translation id="518094545883702183">Esta información solo se utiliza para diagnosticar el problema del que has informado, solo está disponible para la persona que examine tu informe y se conserva durante un período de hasta 30 días.</translation> <translation id="5222676887888702881">Cerrar sesión</translation>
diff --git a/remoting/resources/remoting_strings_et.xtb b/remoting/resources/remoting_strings_et.xtb index 4b764c54..9163204 100644 --- a/remoting/resources/remoting_strings_et.xtb +++ b/remoting/resources/remoting_strings_et.xtb
@@ -33,7 +33,6 @@ <translation id="177096447311351977">Kanali IP kliendi jaoks: <ph name="CLIENT_GAIA_IDENTIFIER" /> ip='<ph name="CLIENT_IP_ADDRESS_AND_PORT" />' host_ip='<ph name="HOST_IP_ADDRESS_AND_PORT" />' channel='<ph name="CHANNEL_TYPE" />' connection='<ph name="CONNECTION_TYPE" />'.</translation> <translation id="1779766957982586368">Sulgeb akna</translation> <translation id="1841799852846221389">Arvuti kaugühenduste keelamine …</translation> -<translation id="189172778771606813">Sule navigeerimissahtel</translation> <translation id="1897488610212723051">Kustuta</translation> <translation id="195619862187186579">Klaviatuuri paigutused</translation> <translation id="1996161829609978754">Chrome laadib alla rakenduse Chromoting Host installerit. Kui allalaadimine on lõppenud, käitage enne jätkamist installerit.</translation> @@ -114,6 +113,7 @@ Host</translation> <translation id="3870154837782082782">Google Inc.</translation> <translation id="3884839335308961732">Chrome Remote Desktopi abil juurdepääsu lubamiseks kinnitage allpool oma konto ja PIN-kood.</translation> +<translation id="3897092660631435901">Menüü</translation> <translation id="3905196214175737742">Sobimatu hosti omaniku domeen.</translation> <translation id="3908017899227008678">Vähenda parajaks</translation> <translation id="3931191050278863510">Hostimine peatati.</translation> @@ -166,7 +166,6 @@ <translation id="5070121137485264635">Kaughost vajab autentimist kolmanda osapoole veebisaidil. Jätkamiseks peate andma Chrome Remote Desktopile täiendavad load juurdepääsuks sellele aadressile:</translation> <translation id="507204348399810022">Kas soovite kindlasti keelata kaugühendused hostiga <ph name="HOSTNAME" />?</translation> <translation id="5156271271724754543">Sisestage mõlemale väljale sama PIN-kood.</translation> -<translation id="5168917394043976756">Ava navigeerimissahtel</translation> <translation id="5170982930780719864">Sobimatu hosti ID.</translation> <translation id="518094545883702183">Seda teavet kasutatakse ainult teavitatud probleemi diagnoosimiseks, see on saadaval ainult probleemiga tegelejale ja seda ei säilitata üle 30 päeva.</translation> <translation id="5222676887888702881">Logi välja</translation>
diff --git a/remoting/resources/remoting_strings_fa.xtb b/remoting/resources/remoting_strings_fa.xtb index a0d3989..0075a74 100644 --- a/remoting/resources/remoting_strings_fa.xtb +++ b/remoting/resources/remoting_strings_fa.xtb
@@ -33,7 +33,6 @@ <translation id="177096447311351977">IP کانال برای کلاینت: <ph name="CLIENT_GAIA_IDENTIFIER" /> ip=«<ph name="CLIENT_IP_ADDRESS_AND_PORT" />» host_ip=«<ph name="HOST_IP_ADDRESS_AND_PORT" />» کانال=«<ph name="CHANNEL_TYPE" />» اتصال=«<ph name="CONNECTION_TYPE" />».</translation> <translation id="1779766957982586368">بستن پنجره</translation> <translation id="1841799852846221389">در حال غیرفعال کردن اتصالات راه دور برای این رایانه…</translation> -<translation id="189172778771606813">بستن کشوی پیمایش</translation> <translation id="1897488610212723051">حذف</translation> <translation id="195619862187186579">چیدمانهای صفحهکلید</translation> <translation id="1996161829609978754">Chrome در حال بارگیری نصبکننده میزبان کار با Chrome است. بعد از اینکه بارگیری انجام شد٬ قبل از ادامه٬ نصبکننده را اجرا کنید.</translation> @@ -113,6 +112,7 @@ <translation id="3785447812627779171">میزبان کار با Chrome</translation> <translation id="3870154837782082782">Google Inc.</translation> <translation id="3884839335308961732">برای اجازه دسترسی توسط برنامه کنترل دسکتاپ از راه دور Chrome، لطفاً حساب و پین خود را در زیر تأیید کنید.</translation> +<translation id="3897092660631435901">منو</translation> <translation id="3905196214175737742">دامنه مالک میزبان نامعتبر است.</translation> <translation id="3908017899227008678">کاهش اندازه</translation> <translation id="3931191050278863510">میزبان متوقف شد.</translation> @@ -165,7 +165,6 @@ <translation id="5070121137485264635">میزبان راه دور از شما میخواهد که در وب سایت شخص ثالثی تأیید هویت شوید. برای ادامه، باید با مجوزهای اضافی «کنترل کامپیوتر از راه دور Chrome» برای دستیابی به این آدرس موافقت کنید:</translation> <translation id="507204348399810022">مطمئنید میخواهید اتصالات راه دور به <ph name="HOSTNAME" /> را غیرفعال کنید؟</translation> <translation id="5156271271724754543">لطفاً یک پین یکسان را در هر دو کادر وارد کنید.</translation> -<translation id="5168917394043976756">بازکردن کشوی پیمایش</translation> <translation id="5170982930780719864">شناسه میزبان نامعتبر است.</translation> <translation id="518094545883702183">این اطلاعات فقط برای عیبیابی مشکل گزارش شده به کار میروند و فقط برای فردی که گزارش را بررسی میکند قابل دسترس هستند، و بیش از ۳۰ روز نگهداری نمیشوند.</translation> <translation id="5222676887888702881">خروج از سیستم</translation>
diff --git a/remoting/resources/remoting_strings_fi.xtb b/remoting/resources/remoting_strings_fi.xtb index 006873e..0fc24e2bc 100644 --- a/remoting/resources/remoting_strings_fi.xtb +++ b/remoting/resources/remoting_strings_fi.xtb
@@ -33,7 +33,6 @@ <translation id="177096447311351977">Asiakkaan kanavan IP-osoite: <ph name="CLIENT_GAIA_IDENTIFIER" /> ip='<ph name="CLIENT_IP_ADDRESS_AND_PORT" />' host_ip='<ph name="HOST_IP_ADDRESS_AND_PORT" />' channel='<ph name="CHANNEL_TYPE" />' connection='<ph name="CONNECTION_TYPE" />'.</translation> <translation id="1779766957982586368">Sulje ikkuna</translation> <translation id="1841799852846221389">Poistetaan tietokoneen etäyhteyksiä käytöstä…</translation> -<translation id="189172778771606813">Sulje navigoinnin vetopaneeli</translation> <translation id="1897488610212723051">Poista</translation> <translation id="195619862187186579">Näppäinasettelut</translation> <translation id="1996161829609978754">Chrome lataa Chromoting-isäntäsovelluksen asennusohjelmaa. Suorita asennusohjelma, kun lataus on valmis.</translation> @@ -114,6 +113,7 @@ isäntä</translation> <translation id="3870154837782082782">Google Inc.</translation> <translation id="3884839335308961732">Myönnä käyttöoikeus Chrome-etäkäytön kautta vahvistamalla tilisi ja PIN-koodisi alla.</translation> +<translation id="3897092660631435901">Valikko</translation> <translation id="3905196214175737742">Isännän omistajan verkkotunnus on virheellinen.</translation> <translation id="3908017899227008678">Sovita ikkunaan</translation> <translation id="3931191050278863510">Isäntä pysähtyi.</translation> @@ -166,7 +166,6 @@ <translation id="5070121137485264635">Etäisäntä edellyttää todennusta kolmannen osapuolen sivustossa. Jos haluat jatkaa, anna Chrome-etäkäytölle lisäkäyttölupia tämän osoitteen avaamiseksi:</translation> <translation id="507204348399810022">Haluatko varmasti poistaa käytöstä etäyhteydet kohteeseen <ph name="HOSTNAME" />?</translation> <translation id="5156271271724754543">Kirjoita sama PIN-koodi molempiin ruutuihin.</translation> -<translation id="5168917394043976756">Avaa navigoinnin vetopaneeli</translation> <translation id="5170982930780719864">Isännän tunnus on virheellinen.</translation> <translation id="518094545883702183">Näitä tietoja käytetään vain ilmoittamasi ongelman diagnosointiin, näytetään vain ongelmaasi selvittävälle henkilölle ja säilytetään korkeintaan 30 päivää.</translation> <translation id="5222676887888702881">Kirjaudu ulos</translation>
diff --git a/remoting/resources/remoting_strings_fil.xtb b/remoting/resources/remoting_strings_fil.xtb index 9d61753f..015fa169 100644 --- a/remoting/resources/remoting_strings_fil.xtb +++ b/remoting/resources/remoting_strings_fil.xtb
@@ -33,7 +33,6 @@ <translation id="177096447311351977">Channel IP para sa client: <ph name="CLIENT_GAIA_IDENTIFIER" /> ip='<ph name="CLIENT_IP_ADDRESS_AND_PORT" />' host_ip='<ph name="HOST_IP_ADDRESS_AND_PORT" />' channel='<ph name="CHANNEL_TYPE" />' koneksyon='<ph name="CONNECTION_TYPE" />'.</translation> <translation id="1779766957982586368">Isara ang window</translation> <translation id="1841799852846221389">Hindi pinapagana ang mga malayuang koneksyon para sa computer na ito…</translation> -<translation id="189172778771606813">Isara ang navigation drawer</translation> <translation id="1897488610212723051">I-delete</translation> <translation id="195619862187186579">Mga layout ng keyboard</translation> <translation id="1996161829609978754">Dina-download ng Chrome ang installer ng Host ng Chromoting. Sa sandaling makumpleto ang pag-download, mangyaring patakbuhin ang installer bago magpatuloy.</translation> @@ -114,6 +113,7 @@ Host</translation> <translation id="3870154837782082782">Google Inc.</translation> <translation id="3884839335308961732">Pakikumpirma ang iyong account at PIN sa ibaba upang payagan ang pag-access ng Remote na Desktop ng Chrome.</translation> +<translation id="3897092660631435901">Menu</translation> <translation id="3905196214175737742">Di-wastong domain ng may-ari ng host.</translation> <translation id="3908017899227008678">Paliitin upang magkasya</translation> <translation id="3931191050278863510">Huminto ang host.</translation> @@ -166,7 +166,6 @@ <translation id="5070121137485264635">Hinihiling sa iyo ng remote host na magpatunay sa isang website ng third-party. Upang makapagpatuloy, dapat mong bigyan ng mga karagdagang pahintulot ang Remote na Desktop ng Chrome upang ma-access ang address na ito:</translation> <translation id="507204348399810022">Sigurado ka bang gusto mong i-disable ang mga malayuang koneksyon sa <ph name="HOSTNAME" />?</translation> <translation id="5156271271724754543">Pakilagay ang parehong PIN sa parehong kahon.</translation> -<translation id="5168917394043976756">Buksan ang navigation drawer</translation> <translation id="5170982930780719864">Di-wastong host id.</translation> <translation id="518094545883702183">Ang impormasyong ito ay ginagamit lang para sa pagda-diagnose sa problemang inuulat mo, available lang sa isang taong nagsisiyasat ng iyong ulat, at pinapanatili sa loob ng hindi hihigit sa 30 araw.</translation> <translation id="5222676887888702881">Mag-sign out</translation>
diff --git a/remoting/resources/remoting_strings_fr.xtb b/remoting/resources/remoting_strings_fr.xtb index 75d85dd..1e7ff96f 100644 --- a/remoting/resources/remoting_strings_fr.xtb +++ b/remoting/resources/remoting_strings_fr.xtb
@@ -33,7 +33,6 @@ <translation id="177096447311351977">Version de l'IP pour le client : <ph name="CLIENT_GAIA_IDENTIFIER" /> adresse IP = "<ph name="CLIENT_IP_ADDRESS_AND_PORT" />" adresse IP de l'hôte = "<ph name="HOST_IP_ADDRESS_AND_PORT" />" channel='<ph name="CHANNEL_TYPE" />' connection='<ph name="CONNECTION_TYPE" />'.</translation> <translation id="1779766957982586368">Fermer la fenêtre</translation> <translation id="1841799852846221389">Désactivation des connexions à distance pour cet ordinateur en cours…</translation> -<translation id="189172778771606813">Fermer le panneau de navigation</translation> <translation id="1897488610212723051">Supprimer</translation> <translation id="195619862187186579">Dispositions de clavier</translation> <translation id="1996161829609978754">Le programme d'installation de l'hôte de Google Chromoting est en cours de téléchargement dans Google Chrome. Une fois le téléchargement terminé, veuillez lancer le programme d'installation avant de continuer.</translation> @@ -114,6 +113,7 @@ Chromoting</translation> <translation id="3870154837782082782">Google Inc.</translation> <translation id="3884839335308961732">Veuillez confirmer le compte et le code d'accès ci-dessous pour autoriser l'accès du Bureau à distance Google Chrome à votre compte.</translation> +<translation id="3897092660631435901">Menu</translation> <translation id="3905196214175737742">Domaine propriétaire de l'hôte incorrect.</translation> <translation id="3908017899227008678">Ajuster à la fenêtre</translation> <translation id="3931191050278863510">Hôte suspendu</translation> @@ -166,7 +166,6 @@ <translation id="5070121137485264635">L'hôte distant nécessite votre authentification auprès d'un site Web tiers. Pour continuer, vous devez accorder au Bureau à distance Chrome des autorisations supplémentaires afin d'accéder à l'adresse suivante :</translation> <translation id="507204348399810022">Voulez-vous vraiment désactiver les connexions à distance à <ph name="HOSTNAME" /> ?</translation> <translation id="5156271271724754543">Veuillez saisir le même code d'accès dans les deux champs.</translation> -<translation id="5168917394043976756">Ouvrir le panneau de navigation</translation> <translation id="5170982930780719864">ID d'hôte incorrect.</translation> <translation id="518094545883702183">Ces informations sont conservées 30 jours au maximum et mises à disposition uniquement de la personne chargée d'étudier votre rapport afin d'identifier le problème que vous avez relevé.</translation> <translation id="5222676887888702881">Déconnexion</translation>
diff --git a/remoting/resources/remoting_strings_gu.xtb b/remoting/resources/remoting_strings_gu.xtb index ae339117e..769b8c5 100644 --- a/remoting/resources/remoting_strings_gu.xtb +++ b/remoting/resources/remoting_strings_gu.xtb
@@ -33,7 +33,6 @@ <translation id="177096447311351977">ક્લાઇન્ટ માટે ચેનલ IP: <ph name="CLIENT_GAIA_IDENTIFIER" /> ip='<ph name="CLIENT_IP_ADDRESS_AND_PORT" />' host_ip='<ph name="HOST_IP_ADDRESS_AND_PORT" />' ચેનલ='<ph name="CHANNEL_TYPE" />' કનેક્શન='<ph name="CONNECTION_TYPE" />'.</translation> <translation id="1779766957982586368">વિન્ડો બંધ કરો</translation> <translation id="1841799852846221389">આ કમ્પ્યુટર માટે રીમોટ કનેક્શન્સ અક્ષમ કરી રહ્યાં છે...</translation> -<translation id="189172778771606813">નેવિગેશન ડ્રોઅર બંધ કરો</translation> <translation id="1897488610212723051">કાઢી નાખો</translation> <translation id="195619862187186579">કીબોર્ડ લેઆઉટ્સ</translation> <translation id="1996161829609978754">Chrome એ Chromoting હોસ્ટ ઇન્સ્ટોલરને ડાઉનલોડ કરે છે. એકવાર ડાઉનલોડ પૂર્ણ થઈ જાય તે પછી, કૃપા કરીને ચાલુ રાખતાં પહેલાં એક વાર ઇન્સ્ટોલરને ચલાવો.</translation> @@ -114,6 +113,7 @@ હોસ્ટ</translation> <translation id="3870154837782082782">Google Inc.</translation> <translation id="3884839335308961732">Chrome રીમોટ ડેસ્કટૉપ દ્વારા ઍક્સેસની મંજૂરી આપવા માટે કૃપા કરીને નીચે તમારા એકાઉન્ટ અને પિનની પુષ્ટિ કરો.</translation> +<translation id="3897092660631435901">મેનૂ</translation> <translation id="3905196214175737742">અમાન્ય હોસ્ટ માલિક ડોમેન.</translation> <translation id="3908017899227008678">ફીટ કરવા માટે સંકોચો</translation> <translation id="3931191050278863510">હોસ્ટ રોક્યું.</translation> @@ -166,7 +166,6 @@ <translation id="5070121137485264635">રીમોટ હોસ્ટને તમે તૃતીય-પક્ષ વેબસાઇટને અધિકૃત કરો તેની આવશ્યકતા છે. ચાલુ રાખવા માટે, તમારે આ સરનામાંને ઍક્સેસ કરવા માટે Chrome રીમોટ ડેસ્કટૉપને અતિરિક્ત પરવાનગીઓ આપવી પડશે:</translation> <translation id="507204348399810022">શું તમે ખરેખર <ph name="HOSTNAME" /> માટેના રિમોટ કનેક્શન્સને અક્ષમ કરવા માગો છો?</translation> <translation id="5156271271724754543">કૃપા કરીને બંને બૉક્સમાં સમાન PIN દાખલ કરો.</translation> -<translation id="5168917394043976756">નેવિગેશન ડ્રોઅર ખોલો</translation> <translation id="5170982930780719864">અમાન્ય હોસ્ટ id.</translation> <translation id="518094545883702183">આ માહિતીનો ઉપયોગ ફક્ત તમે જાણ કરી રહ્યાં છો તે સમસ્યાનું નિદાન કરવા માટે થાય છે, તે ફક્ત તમારી રિપોર્ટની તપાસ કરી રહેલ વ્યક્તિને ઉપલબ્ધ રહે છે અને તે 30 કરતાં વધુ દિવસ સુધી જાળવી રખાતી નથી.</translation> <translation id="5222676887888702881">સાઇન આઉટ</translation>
diff --git a/remoting/resources/remoting_strings_hi.xtb b/remoting/resources/remoting_strings_hi.xtb index e118191..1266f8c 100644 --- a/remoting/resources/remoting_strings_hi.xtb +++ b/remoting/resources/remoting_strings_hi.xtb
@@ -33,7 +33,6 @@ <translation id="177096447311351977">क्लाइंट के लिए चैनल IP: <ph name="CLIENT_GAIA_IDENTIFIER" /> ip='<ph name="CLIENT_IP_ADDRESS_AND_PORT" />' host_ip='<ph name="HOST_IP_ADDRESS_AND_PORT" />' channel='<ph name="CHANNEL_TYPE" />' connection='<ph name="CONNECTION_TYPE" />'.</translation> <translation id="1779766957982586368">विंडो बंद करें</translation> <translation id="1841799852846221389">इस कंप्यूटर के लिए दूरस्थ कनेक्शन अक्षम किए जा रहे हैं…</translation> -<translation id="189172778771606813">मार्गदर्शक ड्रॉवर बंद करें</translation> <translation id="1897488610212723051">हटाएं</translation> <translation id="195619862187186579">कीबोर्ड लेआउट</translation> <translation id="1996161829609978754">Chrome, Chromoting होस्ट इंस्टॉलर को डाउनलोड कर रहा है. डाउनलोड पूरा हो जाने पर, कृपया आगे बढ़ने से पहले इंस्टॉलर चलाएं.</translation> @@ -113,6 +112,7 @@ <translation id="3785447812627779171">Chromoting होस्ट</translation> <translation id="3870154837782082782">Google Inc.</translation> <translation id="3884839335308961732">Chrome दूरस्थ डेस्कटॉप द्वारा एक्सेस की अनुमति देने के लिए कृपया नीचे अपने खाते और PIN की दुबारा पूछें.</translation> +<translation id="3897092660631435901">मेनू</translation> <translation id="3905196214175737742">अमान्य होस्ट मालिक डोमेन.</translation> <translation id="3908017899227008678">फ़िट करने के लिए सिकोड़ें</translation> <translation id="3931191050278863510">होस्ट बंद हो गया है.</translation> @@ -165,7 +165,6 @@ <translation id="5070121137485264635">दूरस्थ होस्ट के लिए आवश्यक है कि आप किसी तृतीय-पक्ष की वेबसाइट प्रमाणीकृत करें. जारी रखने के लिए, आपको Chrome दूरस्थ डेस्कटॉप को इस पते को एक्सेस करने के लिए अतिरिक्त अनुमतियां देनी होंगी:</translation> <translation id="507204348399810022">क्या आप वाकई <ph name="HOSTNAME" /> के दूरस्थ कनेक्शन अक्षम करना चाहते हैं?</translation> <translation id="5156271271724754543">कृपया दोनों बॉक्स में समान पिन दर्ज करें.</translation> -<translation id="5168917394043976756">मार्गदर्शक ड्रॉवर खोलें</translation> <translation id="5170982930780719864">अमान्य होस्ट आईडी.</translation> <translation id="518094545883702183">इस जानकारी का उपयोग आपके द्वारा रिपोर्ट की जा रही समस्या का निदान करने के लिए ही किया जाता है, यह आपकी रिपोर्ट की जांच कर रहे व्यक्ति के लिए ही उपलब्ध होती है, और इसे 30 दिन से अधिक समय तक नहीं रखा जाता.</translation> <translation id="5222676887888702881">प्रस्थान करें</translation>
diff --git a/remoting/resources/remoting_strings_hr.xtb b/remoting/resources/remoting_strings_hr.xtb index 110227f..8a1da78 100644 --- a/remoting/resources/remoting_strings_hr.xtb +++ b/remoting/resources/remoting_strings_hr.xtb
@@ -33,7 +33,6 @@ <translation id="177096447311351977">IP kanal za klijenta: <ph name="CLIENT_GAIA_IDENTIFIER" /> ip='<ph name="CLIENT_IP_ADDRESS_AND_PORT" />' host_ip='<ph name="HOST_IP_ADDRESS_AND_PORT" />' channel='<ph name="CHANNEL_TYPE" />' connection='<ph name="CONNECTION_TYPE" />'.</translation> <translation id="1779766957982586368">Zatvori prozor</translation> <translation id="1841799852846221389">Onemogućavanje daljinskih veza za ovo računalo…</translation> -<translation id="189172778771606813">Zatvori ladicu za navigaciju</translation> <translation id="1897488610212723051">Izbriši</translation> <translation id="195619862187186579">Rasporedi tipkovnice</translation> <translation id="1996161829609978754">Chrome preuzima instalacijski program hosta za Chromoting. Nakon završetka preuzimanja pokrenite alat za instalaciju prije nego što nastavite.</translation> @@ -114,6 +113,7 @@ Chromoting</translation> <translation id="3870154837782082782">Google Inc.</translation> <translation id="3884839335308961732">Potvrdite svoj račun i PIN u nastavku da biste usluzi Udaljena radna površina Chrome dozvolili pristup.</translation> +<translation id="3897092660631435901">Izbornik</translation> <translation id="3905196214175737742">Nevažeća domena vlasnika hosta.</translation> <translation id="3908017899227008678">Smanji da stane u prozor</translation> <translation id="3931191050278863510">Host je zaustavljen.</translation> @@ -166,7 +166,6 @@ <translation id="5070121137485264635">Udaljeni host zahtijeva autentifikaciju web-lokacije treće strane. Da biste nastavili, morate dati Udaljenoj radnoj površini Chrome dodatne dozvole za pristup ovoj adresi:</translation> <translation id="507204348399810022">Jeste li sigurni da želite onemogućiti daljinske veze s hostom <ph name="HOSTNAME" />?</translation> <translation id="5156271271724754543">Unesite isti PIN u oba polja.</translation> -<translation id="5168917394043976756">Otvori ladicu za navigaciju</translation> <translation id="5170982930780719864">Nevažeći ID hosta.</translation> <translation id="518094545883702183">Informacije se upotrebljavaju samo za dijagnosticiranje problema koji prijavljujete, dostupne su samo osobi koja istražuje vaše izvješće i ne zadržavaju se dulje od 30 dana.</translation> <translation id="5222676887888702881">Odjava</translation>
diff --git a/remoting/resources/remoting_strings_hu.xtb b/remoting/resources/remoting_strings_hu.xtb index 7e23e836..82daac7 100644 --- a/remoting/resources/remoting_strings_hu.xtb +++ b/remoting/resources/remoting_strings_hu.xtb
@@ -33,7 +33,6 @@ <translation id="177096447311351977">Kliens csatorna-IP-je: <ph name="CLIENT_GAIA_IDENTIFIER" /> ip='<ph name="CLIENT_IP_ADDRESS_AND_PORT" />' host_ip='<ph name="HOST_IP_ADDRESS_AND_PORT" />' channel='<ph name="CHANNEL_TYPE" />' connection='<ph name="CONNECTION_TYPE" />'.</translation> <translation id="1779766957982586368">Ablak bezárása</translation> <translation id="1841799852846221389">Távoli kapcsolatok letiltása ezen a számítógépen...</translation> -<translation id="189172778771606813">Navigációs fiók bezárása</translation> <translation id="1897488610212723051">Törlés</translation> <translation id="195619862187186579">Billentyűzetkiosztások</translation> <translation id="1996161829609978754">A Chrome letölti a Chromoting gazdagépekhez való telepítőjét. Miután a letöltés befejeződött, futtassa a telepítőt a folytatás előtt.</translation> @@ -114,6 +113,7 @@ gazdagép</translation> <translation id="3870154837782082782">Google Inc.</translation> <translation id="3884839335308961732">Kérjük, erősítse meg a fiókot és a PIN kódot alább a Chrome távoliasztal-szolgáltatás hozzáférésének engedélyezéséhez.</translation> +<translation id="3897092660631435901">Menü</translation> <translation id="3905196214175737742">A gazdagép tulajdonosi domainje érvénytelen.</translation> <translation id="3908017899227008678">Méretre igazítás</translation> <translation id="3931191050278863510">Gazdagép leállítva.</translation> @@ -166,7 +166,6 @@ <translation id="5070121137485264635">A távoli gazdagép hitelesítést kér egy harmadik féltől származó webhelyhez. A folytatáshoz további engedélyeket kell adnia a Chrome távoliasztal-szolgáltatásnak a cím eléréséhez:</translation> <translation id="507204348399810022">Biztosan szeretné letiltani a távoli kapcsolatokat a(z) <ph name="HOSTNAME" /> gazdagéppel?</translation> <translation id="5156271271724754543">Kérjük, ugyanazt a PIN kódot adja meg mindkét mezőben.</translation> -<translation id="5168917394043976756">Navigációs fiók megnyitása</translation> <translation id="5170982930780719864">Érvénytelen gazdagép-azonosító</translation> <translation id="518094545883702183">Ezt az információt csak az Ön által jelentett probléma diagnosztizálására használjuk. Az adatok csak a jelentés vizsgálója számára érhetők el, és a rendszerünk nem őrzi meg őket 30 napnál tovább.</translation> <translation id="5222676887888702881">Kijelentkezés</translation>
diff --git a/remoting/resources/remoting_strings_id.xtb b/remoting/resources/remoting_strings_id.xtb index b09f320..ea00e30 100644 --- a/remoting/resources/remoting_strings_id.xtb +++ b/remoting/resources/remoting_strings_id.xtb
@@ -33,7 +33,6 @@ <translation id="177096447311351977">IP saluran untuk klien: <ph name="CLIENT_GAIA_IDENTIFIER" /> ip='<ph name="CLIENT_IP_ADDRESS_AND_PORT" />' host_ip='<ph name="HOST_IP_ADDRESS_AND_PORT" />' channel='<ph name="CHANNEL_TYPE" />' connection='<ph name="CONNECTION_TYPE" />'.</translation> <translation id="1779766957982586368">Tutup jendela</translation> <translation id="1841799852846221389">Menonaktifkan sambungan jarak jauh untuk komputer ini...</translation> -<translation id="189172778771606813">Tutup panel samping navigasi</translation> <translation id="1897488610212723051">Hapus</translation> <translation id="195619862187186579">Layout keyboard</translation> <translation id="1996161829609978754">Chrome sedang mengunduh pemasang Inang Chromoting. Setelah unduhan selesai, jalankan pemasang sebelum melanjutkan.</translation> @@ -114,6 +113,7 @@ Chromoting</translation> <translation id="3870154837782082782">Google Inc.</translation> <translation id="3884839335308961732">Konfirmasi akun dan PIN Anda di bawah guna mengizinkan akses oleh Chrome Desktop Jarak Jauh</translation> +<translation id="3897092660631435901">Menu</translation> <translation id="3905196214175737742">Domain pemilik host tidak valid.</translation> <translation id="3908017899227008678">Susutkan agar sesuai</translation> <translation id="3931191050278863510">Host berhenti.</translation> @@ -166,7 +166,6 @@ <translation id="5070121137485264635">Hosting jarak jauh mewajibkan Anda mengautentikasi ke situs web pihak ketiga. Untuk melanjutkan, Anda harus memberikan izin tambahan ke Chrome Desktop Jarak Jauh untuk mengakses alamat ini:</translation> <translation id="507204348399810022">Yakin ingin menonaktifkan sambungan jarak jauh ke <ph name="HOSTNAME" />?</translation> <translation id="5156271271724754543">Masukkan PIN yang sama di kedua kotak.</translation> -<translation id="5168917394043976756">Buka panel samping navigasi</translation> <translation id="5170982930780719864">ID host tidak valid.</translation> <translation id="518094545883702183">Informasi ini hanya digunakan untuk mendiagnosis masalah yang Anda laporkan, hanya tersedia untuk orang yang menyelidiki laporan, dan dipertahankan selama tidak lebih dari 30 hari.</translation> <translation id="5222676887888702881">Keluar</translation>
diff --git a/remoting/resources/remoting_strings_it.xtb b/remoting/resources/remoting_strings_it.xtb index 95b0a45..e6c1e87 100644 --- a/remoting/resources/remoting_strings_it.xtb +++ b/remoting/resources/remoting_strings_it.xtb
@@ -33,7 +33,6 @@ <translation id="177096447311351977">IP canale per client: <ph name="CLIENT_GAIA_IDENTIFIER" /> ip="<ph name="CLIENT_IP_ADDRESS_AND_PORT" />" ip_host="<ph name="HOST_IP_ADDRESS_AND_PORT" />" canale="<ph name="CHANNEL_TYPE" />" connessione="<ph name="CONNECTION_TYPE" />".</translation> <translation id="1779766957982586368">Chiudi finestra</translation> <translation id="1841799852846221389">Disattivazione connessioni remote per questo computer in corso…</translation> -<translation id="189172778771606813">Chiudi riquadro di navigazione a scomparsa</translation> <translation id="1897488610212723051">Elimina</translation> <translation id="195619862187186579">Layout tastiera</translation> <translation id="1996161829609978754">Chrome sta scaricando il programma di installazione di Chromoting Host. Al termine del download esegui il programma di installazione prima di continuare.</translation> @@ -114,6 +113,7 @@ Chromoting</translation> <translation id="3870154837782082782">Google Inc.</translation> <translation id="3884839335308961732">Conferma il tuo account e il PIN per consentire l'accesso tramite Chrome Remote Desktop.</translation> +<translation id="3897092660631435901">Menu</translation> <translation id="3905196214175737742">Dominio proprietario host non valido.</translation> <translation id="3908017899227008678">Riduci e adatta</translation> <translation id="3931191050278863510">Host interrotto.</translation> @@ -166,7 +166,6 @@ <translation id="5070121137485264635">L'host remoto richiede l'autenticazione su un sito web di terze parti. Per continuare, devi concedere a Chrome Remote Desktop ulteriori autorizzazioni per accedere a questo indirizzo:</translation> <translation id="507204348399810022">Vuoi disattivare le connessioni remote a <ph name="HOSTNAME" />?</translation> <translation id="5156271271724754543">Inserisci lo stesso PIN in entrambe le caselle.</translation> -<translation id="5168917394043976756">Apri riquadro di navigazione a scomparsa</translation> <translation id="5170982930780719864">ID host non valido.</translation> <translation id="518094545883702183">Queste informazioni vengono utilizzate soltanto per identificare il problema segnalato, sono disponibili soltanto a chi effettua accertamenti in merito alla tua segnalazione e vengono conservate per massimo 30 giorni.</translation> <translation id="5222676887888702881">Esci</translation>
diff --git a/remoting/resources/remoting_strings_iw.xtb b/remoting/resources/remoting_strings_iw.xtb index a2ee708..44abc61 100644 --- a/remoting/resources/remoting_strings_iw.xtb +++ b/remoting/resources/remoting_strings_iw.xtb
@@ -33,7 +33,6 @@ <translation id="177096447311351977">IP הערוץ של הלקוח: <ph name="CLIENT_GAIA_IDENTIFIER" /> ip='<ph name="CLIENT_IP_ADDRESS_AND_PORT" />' host_ip='<ph name="HOST_IP_ADDRESS_AND_PORT" />' ערוץ='<ph name="CHANNEL_TYPE" />' חיבור='<ph name="CONNECTION_TYPE" />'.</translation> <translation id="1779766957982586368">סגור חלון</translation> <translation id="1841799852846221389">משבית חיבורים מרוחקים למחשב זה...</translation> -<translation id="189172778771606813">סגור את חלונית ההזזה לניווט</translation> <translation id="1897488610212723051">מחק</translation> <translation id="195619862187186579">פריסות מקלדת</translation> <translation id="1996161829609978754">Chrome מוריד את מתקין המארח של Chromoting. בסיום ההורדה, הפעל את המתקין לפני שתמשיך.</translation> @@ -114,6 +113,7 @@ Chromoting</translation> <translation id="3870154837782082782">Google Inc.</translation> <translation id="3884839335308961732">אשר את החשבון ומספר ה-PIN שלך שמפורטים למטה כדי לאפשר גישה באמצעות שולחן העבודה המרוחק של Chrome.</translation> +<translation id="3897092660631435901">תפריט</translation> <translation id="3905196214175737742">דומיין לא חוקי של בעל המארח.</translation> <translation id="3908017899227008678">הקטן להתאמה</translation> <translation id="3931191050278863510">המארח הופסק.</translation> @@ -166,7 +166,6 @@ <translation id="5070121137485264635">המארח המרוחק דורש שתבצע אימות מול אתר של צד שלישי. כדי להמשיך, עליך להעניק לשולחן העבודה המרוחק של Chrome הרשאות נוספות כדי לגשת לכתובת זו:</translation> <translation id="507204348399810022">האם אתה בטוח שברצונך להשבית את החיבורים המרוחקים אל <ph name="HOSTNAME" />?</translation> <translation id="5156271271724754543">הזן את אותו PIN בשתי התיבות.</translation> -<translation id="5168917394043976756">פתח את חלונית ההזזה לניווט</translation> <translation id="5170982930780719864">מזהה מארח לא חוקי.</translation> <translation id="518094545883702183">המידע הזה משמש רק לאבחון הבעיה שדיווחת עליה. הוא זמין רק למי שבוחן את הדוח, ונשמר למשך זמן של 30 ימים לכל היותר.</translation> <translation id="5222676887888702881">יציאה</translation>
diff --git a/remoting/resources/remoting_strings_ja.xtb b/remoting/resources/remoting_strings_ja.xtb index 68f7432..252e549 100644 --- a/remoting/resources/remoting_strings_ja.xtb +++ b/remoting/resources/remoting_strings_ja.xtb
@@ -33,7 +33,6 @@ <translation id="177096447311351977">クライアントのチャンネル IP: <ph name="CLIENT_GAIA_IDENTIFIER" /> ip='<ph name="CLIENT_IP_ADDRESS_AND_PORT" />' host_ip='<ph name="HOST_IP_ADDRESS_AND_PORT" />' channel='<ph name="CHANNEL_TYPE" />' connection='<ph name="CONNECTION_TYPE" />'</translation> <translation id="1779766957982586368">ウィンドウを閉じる</translation> <translation id="1841799852846221389">このパソコンのリモート接続を無効にしています...</translation> -<translation id="189172778771606813">操作パネルを閉じる</translation> <translation id="1897488610212723051">削除</translation> <translation id="195619862187186579">キーボード配列</translation> <translation id="1996161829609978754">Chromoting ホスト インストーラをダウンロードしています。ダウンロードが完了したら、続行する前にインストーラを実行してください。</translation> @@ -114,6 +113,7 @@ ホスト</translation> <translation id="3870154837782082782">Google Inc.</translation> <translation id="3884839335308961732">Chrome リモート デスクトップによるアクセスを許可するには、下記でアカウントと PIN の確認を行ってください。</translation> +<translation id="3897092660631435901">メニュー</translation> <translation id="3905196214175737742">ホストの所有者ドメインが無効です。</translation> <translation id="3908017899227008678">ウィンドウに合わせて縮小</translation> <translation id="3931191050278863510">ホストが停止しました。</translation> @@ -166,7 +166,6 @@ <translation id="5070121137485264635">リモート ホストで、サードパーティ ウェブサイトへの認証が求められています。続行するには、次のアドレスにアクセスできるように Chrome リモート デスクトップに追加の権限を与える必要があります:</translation> <translation id="507204348399810022"><ph name="HOSTNAME" /> へのリモート接続を無効にしてもよろしいですか?</translation> <translation id="5156271271724754543">両方のボックスに同じ PIN を入力してください。</translation> -<translation id="5168917394043976756">操作パネルを開く</translation> <translation id="5170982930780719864">ホスト ID が無効です。</translation> <translation id="518094545883702183">この情報は、報告していただいた問題を診断する目的にのみ使用され、調査担当者のみに利用可能となります。この情報が 30 日間を過ぎて保持されることはありません。</translation> <translation id="5222676887888702881">ログアウト</translation>
diff --git a/remoting/resources/remoting_strings_kn.xtb b/remoting/resources/remoting_strings_kn.xtb index 6f83c488..788f5e0 100644 --- a/remoting/resources/remoting_strings_kn.xtb +++ b/remoting/resources/remoting_strings_kn.xtb
@@ -33,7 +33,6 @@ <translation id="177096447311351977">ಕ್ಲೈಂಟ್ಗಾಗಿ ಚಾನಲ್ IP: <ph name="CLIENT_GAIA_IDENTIFIER" /> ip='<ph name="CLIENT_IP_ADDRESS_AND_PORT" />' host_ip='<ph name="HOST_IP_ADDRESS_AND_PORT" />' channel='<ph name="CHANNEL_TYPE" />' connection='<ph name="CONNECTION_TYPE" />'.</translation> <translation id="1779766957982586368">ವಿಂಡೋ ಮುಚ್ಚು</translation> <translation id="1841799852846221389">ಈ ಕಂಪ್ಯೂಟರ್ನ ರಿಮೋಟ್ ಸಂಪರ್ಕಗಳನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗುತ್ತಿದೆ...</translation> -<translation id="189172778771606813">ನ್ಯಾವಿಗೇಶನ್ ಡ್ರಾಯರ್ ಮುಚ್ಚಿರಿ</translation> <translation id="1897488610212723051">ಅಳಿಸು</translation> <translation id="195619862187186579">ಕೀಬೋರ್ಡ್ ವಿನ್ಯಾಸಗಳು</translation> <translation id="1996161829609978754">ಕ್ರೊಮೊಟಿಂಗ್ ಹೋಸ್ಟ್ ಸ್ಥಾಪಕವನ್ನು Chrome ಡೌನ್ಲೋಡ್ ಮಾಡುತ್ತಿದೆ. ಡೌನ್ಲೋಡ್ ಒಮ್ಮೆ ಪೂರ್ಣಗೊಂಡ ನಂತರ, ಮುಂದುವರೆಯುವ ಮೊದಲು ಸ್ಥಾಪಕವನ್ನು ಚಾಲನೆ ಮಾಡಿ.</translation> @@ -114,6 +113,7 @@ ಹೋಸ್ಟ್</translation> <translation id="3870154837782082782">Google Inc.</translation> <translation id="3884839335308961732">Chrome ರಿಮೋಟ್ ಡೆಸ್ಕ್ಟಾಪ್ ಮೂಲಕ ಪ್ರವೇಶವನ್ನು ಅನುಮತಿಸಲು, ಕೆಳಗೆ ನಿಮ್ಮ ಖಾತೆ ಮತ್ತು PIN ಅನ್ನು ದೃಢೀಕರಿಸಿ.</translation> +<translation id="3897092660631435901">ಮೆನು</translation> <translation id="3905196214175737742">ಅಮಾನ್ಯ ಹೋಸ್ಟ್ ಮಾಲೀಕರ ಡೊಮೇನ್.</translation> <translation id="3908017899227008678">ಹೊಂದಿಸಲು ಕುಗ್ಗಿಸಿ</translation> <translation id="3931191050278863510">ಹೋಸ್ಟ್ ನಿಲ್ಲಿಸಲಾಗಿದೆ.</translation> @@ -166,7 +166,6 @@ <translation id="5070121137485264635">ರಿಮೋಟ್ ಹೋಸ್ಟ್ಗೆ ಮೂರನೇ-ವ್ಯಕ್ತಿಯ ವೆಬ್ಸೈಟ್ಗೆ ನೀವು ದೃಢೀಕರಣ ನೀಡುವ ಅಗತ್ಯವಿದೆ. ಮುಂದುವರಿಯಲು, ಈ ವಿಳಾಸಕ್ಕೆ ಪ್ರವೇಶಿಸಲು ನೀವು Chrome ರಿಮೋಟ್ ಡೆಸ್ಕ್ಟಾಪ್ ಹೆಚ್ಚುವರಿ ಅನುಮತಿಗಳನ್ನು ನೀಡಬೇಕಾಗುತ್ತದೆ:</translation> <translation id="507204348399810022">ನೀವು <ph name="HOSTNAME" /> ಗೆ ರಿಮೋಟ್ ಸಂಪರ್ಕವನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲು ಖಚಿತವಾಗಿ ಬಯಸುವಿರಾ?</translation> <translation id="5156271271724754543">ಎರಡು ಪೆಟ್ಟಿಗೆಗಳಲ್ಲಿಯೂ ಒಂದೇ PIN ಅನ್ನು ನಮೂದಿಸಿ.</translation> -<translation id="5168917394043976756">ನ್ಯಾವಿಗೇಶನ್ ಡ್ರಾಯರ್ ತೆರೆಯಿರಿ</translation> <translation id="5170982930780719864">ಅಮಾನ್ಯ ಹೋಸ್ಟ್ ಐಡಿ.</translation> <translation id="518094545883702183">ನೀವು ವರದಿ ಮಾಡುತ್ತಿರುವ ಸಮಸ್ಯೆಯನ್ನು ವಿಶ್ಲೇಷಿಸಲು ಮಾತ್ರ ಈ ಮಾಹಿತಿಯನ್ನು ಬಳಸಲಾಗುವುದು, ಇದು ನಿಮ್ಮ ವರದಿಯನ್ನು ಪರಿಶೀಲಿಸುತ್ತಿರುವವರಿಗೆ ಮಾತ್ರ ಲಭ್ಯವಾಗಿರುತ್ತದೆ ಮತ್ತು ಇದನ್ನು 30 ಕ್ಕಿಂತ ಹೆಚ್ಚು ದಿನಗಳವರೆಗೆ ಉಳಿಸಿಕೊಳ್ಳಲಾಗುವುದಿಲ್ಲ.</translation> <translation id="5222676887888702881">ಸೈನ್ ಔಟ್</translation> @@ -225,7 +224,7 @@ <translation id="6640610550128933069"><ph name="DATE" /> ರಂದು ಕೊನೆಯ ಬಾರಿ ಆನ್ಲೈನ್</translation> <translation id="6668065415969892472">ನಿಮ್ಮ PIN ಅನ್ನು ನವೀಕರಿಸಲಾಗಿದೆ.</translation> <translation id="6681800064886881394">ಹಕ್ಕುಸ್ವಾಮ್ಯ 2013 Google Inc. ಎಲ್ಲಾ ಹಕ್ಕುಗಳನ್ನು ಕಾಯ್ದಿರಿಸಲಾಗಿದೆ.</translation> -<translation id="6746493157771801606">ಇತಿಹಾಸವನ್ನು ತೆರವುಗೊಳಿಸಿ</translation> +<translation id="6746493157771801606">ಇತಿಹಾಸ ತೆರವುಗೊಳಿಸಿ</translation> <translation id="6748108480210050150">ಇವರಿಂದ</translation> <translation id="677755392401385740">ಈ ಬಳಕೆದಾರರಿಗಾಗಿ ಹೋಸ್ಟ್ ಪ್ರಾರಂಭಿಸಲಾಗಿದೆ: <ph name="HOST_USERNAME" />.</translation> <translation id="6865175692670882333">ವೀಕ್ಷಿಸಿ/ಎಡಿಟ್ ಮಾಡಿ</translation>
diff --git a/remoting/resources/remoting_strings_ko.xtb b/remoting/resources/remoting_strings_ko.xtb index 6326c10..307f589 100644 --- a/remoting/resources/remoting_strings_ko.xtb +++ b/remoting/resources/remoting_strings_ko.xtb
@@ -33,7 +33,6 @@ <translation id="177096447311351977">클라이언트용 채널 IP: <ph name="CLIENT_GAIA_IDENTIFIER" /> ip='<ph name="CLIENT_IP_ADDRESS_AND_PORT" />' host_ip='<ph name="HOST_IP_ADDRESS_AND_PORT" />' channel='<ph name="CHANNEL_TYPE" />' connection='<ph name="CONNECTION_TYPE" />'</translation> <translation id="1779766957982586368">창 닫기</translation> <translation id="1841799852846221389">컴퓨터의 원격 연결을 사용중지하는 중...</translation> -<translation id="189172778771606813">탐색 창 닫기</translation> <translation id="1897488610212723051">삭제</translation> <translation id="195619862187186579">키보드 레이아웃</translation> <translation id="1996161829609978754">Chrome에서 Chromoting 호스트 설치 프로그램을 다운로드 중입니다. 다운로드가 완료되면 설치 프로그램을 실행하고 계속하세요.</translation> @@ -114,6 +113,7 @@ 호스트</translation> <translation id="3870154837782082782">Google Inc.</translation> <translation id="3884839335308961732">Chrome 원격 데스크톱스으로 액세스할 수 있도록 아래 계정 및 PIN을 확인하세요.</translation> +<translation id="3897092660631435901">메뉴</translation> <translation id="3905196214175737742">잘못된 호스트 소유자 도메인입니다.</translation> <translation id="3908017899227008678">크기에 맞게 축소</translation> <translation id="3931191050278863510">호스트가 중지되었습니다.</translation> @@ -166,7 +166,6 @@ <translation id="5070121137485264635">원격 호스트는 타사 웹사이트에 대한 인증이 필요합니다. 계속하려면 이 주소에 액세스할 수 있도록 Chrome 원격 데스크톱에 추가 권한을 허용해야 합니다.</translation> <translation id="507204348399810022"><ph name="HOSTNAME" /> 원격 연결을 사용 중지하시겠습니까?</translation> <translation id="5156271271724754543">두 입력란에 같은 PIN을 입력하세요.</translation> -<translation id="5168917394043976756">탐색 창 열기</translation> <translation id="5170982930780719864">호스트 ID가 잘못되었습니다.</translation> <translation id="518094545883702183">이 정보는 보고된 문제를 진단하는 데만 사용되고 보고서 조사 담당자만 볼 수 있으며, 30일 이내에 폐기됩니다.</translation> <translation id="5222676887888702881">로그아웃</translation>
diff --git a/remoting/resources/remoting_strings_lt.xtb b/remoting/resources/remoting_strings_lt.xtb index 0274c440..dbb091b 100644 --- a/remoting/resources/remoting_strings_lt.xtb +++ b/remoting/resources/remoting_strings_lt.xtb
@@ -33,7 +33,6 @@ <translation id="177096447311351977">Kliento kanalo IP: <ph name="CLIENT_GAIA_IDENTIFIER" /> ip='<ph name="CLIENT_IP_ADDRESS_AND_PORT" />' host_ip='<ph name="HOST_IP_ADDRESS_AND_PORT" />' channel='<ph name="CHANNEL_TYPE" />' connection='<ph name="CONNECTION_TYPE" />'.</translation> <translation id="1779766957982586368">Uždaryti langą</translation> <translation id="1841799852846221389">Neleidžiamas nuotolinis ryšys šiame kompiuteryje…</translation> -<translation id="189172778771606813">Uždaryti naršymo skydelį</translation> <translation id="1897488610212723051">Ištrinti</translation> <translation id="195619862187186579">Klaviatūros išdėstymai</translation> <translation id="1996161829609978754">„Chrome“ atsisiunčiama „Chrome“ nuotolinio ryšio prieglobos diegimo programa. Kai atsisiuntimas bus baigtas, prieš tęsdami paleiskite ją.</translation> @@ -114,6 +113,7 @@ priegloba</translation> <translation id="3870154837782082782">„Google Inc.“</translation> <translation id="3884839335308961732">Kad leistumėte prieigą naudojant „Chrome“ nuotolinį kompiuterio valdymą, toliau patvirtinkite savo paskyrą ir PIN kodą.</translation> +<translation id="3897092660631435901">Meniu</translation> <translation id="3905196214175737742">Netinkamas prieglobos savininko domenas.</translation> <translation id="3908017899227008678">Sumažinti, kad tilptų</translation> <translation id="3931191050278863510">Priegloba sustabdyta.</translation> @@ -166,7 +166,6 @@ <translation id="5070121137485264635">Nuotolinė priegloba reikalauja autentifikuoti trečiosios šalies svetainę. Jei norite tęsti, turite suteikti „Chrome“ nuotolinio kompiuterio valdymo programai papildomas teises pasiekti šį adresą</translation> <translation id="507204348399810022">Ar tikrai norite išjungti nuotolinį ryšį su „<ph name="HOSTNAME" />“?</translation> <translation id="5156271271724754543">Įveskite tą patį PIN kodą abiejuose laukeliuose.</translation> -<translation id="5168917394043976756">Atidaryti naršymo skydelį</translation> <translation id="5170982930780719864">Netinkamas prieglobos ID.</translation> <translation id="518094545883702183">Ši informacija naudojama tik problemos, apie kurią pranešate, diagnozavimo tikslais, ji pasiekiama tik ataskaitą nagrinėjančiam asmeniui ir saugoma ne ilgiau nei 30 dienų.</translation> <translation id="5222676887888702881">Atsijungti</translation>
diff --git a/remoting/resources/remoting_strings_lv.xtb b/remoting/resources/remoting_strings_lv.xtb index 513ce86..e3ab13a5 100644 --- a/remoting/resources/remoting_strings_lv.xtb +++ b/remoting/resources/remoting_strings_lv.xtb
@@ -33,7 +33,6 @@ <translation id="177096447311351977">Klienta kanāla IP: <ph name="CLIENT_GAIA_IDENTIFIER" /> ip='<ph name="CLIENT_IP_ADDRESS_AND_PORT" />' host_ip='<ph name="HOST_IP_ADDRESS_AND_PORT" />' channel='<ph name="CHANNEL_TYPE" />' connection='<ph name="CONNECTION_TYPE" />'.</translation> <translation id="1779766957982586368">Aizvērt logu</translation> <translation id="1841799852846221389">Notiek attālo savienojumu atspējošana šim datoram…</translation> -<translation id="189172778771606813">Aizvērt navigācijas atvilktni</translation> <translation id="1897488610212723051">Dzēst</translation> <translation id="195619862187186579">Tastatūras izkārtojumi</translation> <translation id="1996161829609978754">No pārlūka Chrome tiek lejupielādēta Chrome saites saimniekdatoram paredzētā instalēšanas programma. Kad lejupielāde būs pabeigta, lūdzu, vispirms palaidiet instalēšanas programmu.</translation> @@ -114,6 +113,7 @@ saimniekdators</translation> <translation id="3870154837782082782">Google Inc.</translation> <translation id="3884839335308961732">Lai atļautu piekļuvi, izmantojot Chrome attālo darbvirsmu, lūdzu, apstipriniet kontu un PIN kodu.</translation> +<translation id="3897092660631435901">Izvēlne</translation> <translation id="3905196214175737742">Saimniekdatora īpašnieka domēns nav derīgs.</translation> <translation id="3908017899227008678">Samazināt, lai ietilptu</translation> <translation id="3931191050278863510">Saimniekdatora darbība ir apturēta.</translation> @@ -166,7 +166,6 @@ <translation id="5070121137485264635">Attālajā saimniekdatorā tiek pieprasīts, lai veicat autentificēšanu trešās puses vietnē. Lai turpinātu, jums jāpiešķir Chrome attālajai darbvirsmai papildu atļaujas piekļūt šai adresei:</translation> <translation id="507204348399810022">Vai tiešām vēlaties atspējot attālos savienojumus ar saimniekdatoru <ph name="HOSTNAME" />?</translation> <translation id="5156271271724754543">Lūdzu, ievadiet vienu un to pašu PIN abos lodziņos.</translation> -<translation id="5168917394043976756">Atvērt navigācijas atvilktni</translation> <translation id="5170982930780719864">Saimniekdatora ID nav derīgs.</translation> <translation id="518094545883702183">Šī informācija tiek izmantota tikai tās problēmas diagnosticēšanai, par kuru ziņojat, un tā ir pieejama tikai personai, kura izskata jūsu ziņojumu, kā arī tiek saglabāta ne ilgāk kā 30 dienas.</translation> <translation id="5222676887888702881">Izrakstīties</translation>
diff --git a/remoting/resources/remoting_strings_ml.xtb b/remoting/resources/remoting_strings_ml.xtb index d2cb862..98e3235 100644 --- a/remoting/resources/remoting_strings_ml.xtb +++ b/remoting/resources/remoting_strings_ml.xtb
@@ -33,7 +33,6 @@ <translation id="177096447311351977">ക്ലയന്റിനായുള്ള ചാനൽ IP: <ph name="CLIENT_GAIA_IDENTIFIER" /> ip='<ph name="CLIENT_IP_ADDRESS_AND_PORT" />' host_ip='<ph name="HOST_IP_ADDRESS_AND_PORT" />' channel='<ph name="CHANNEL_TYPE" />' connection='<ph name="CONNECTION_TYPE" />'.</translation> <translation id="1779766957982586368">വിന്ഡോ അടയ്ക്കുക</translation> <translation id="1841799852846221389">ഈ കമ്പ്യൂട്ടറിനായി വിദൂര കണക്ഷനുകൾ അപ്രാപ്തമാക്കുന്നു...</translation> -<translation id="189172778771606813">നാവിഗേഷൻ ഡ്രോയർ അടയ്ക്കുക</translation> <translation id="1897488610212723051">ഇല്ലാതാക്കുക</translation> <translation id="195619862187186579">കീബോർഡ് ലേഔട്ടുകൾ</translation> <translation id="1996161829609978754">Chrome, ക്രോമോട്ടിംഗ് വിദൂര ഡെസ്ക്ടോപ്പ് ഹോസ്റ്റ് ഇൻസ്റ്റാളർ ഡൗൺലോഡുചെയ്യുന്നു. ഡൗൺലോഡുചെയ്യൽ പൂർത്തിയായാൽ തുടരുന്നതിന് മുമ്പായി ഇൻസ്റ്റാളർ പ്രവർത്തിപ്പിക്കുക.</translation> @@ -113,6 +112,7 @@ ഹോസ്റ്റ്</translation> <translation id="3870154837782082782">Google Inc.</translation> <translation id="3884839335308961732">Chrome വിദൂര ഡെസ്ക്ടോപ്പിലൂടെ ആക്സസ്സ് അനുവദിക്കുന്നതിന് ചുവടെയുള്ള നിങ്ങളുടെ അക്കൗണ്ടും PIN-ഉം സ്ഥിരീകരിക്കുക.</translation> +<translation id="3897092660631435901">മെനു</translation> <translation id="3905196214175737742">ഹോസ്റ്റ് ഉടമ ഡൊമെയ്ൻ അസാധുവാണ്.</translation> <translation id="3908017899227008678">യുക്തമാക്കുന്നതിനായി ചുരുക്കുക</translation> <translation id="3931191050278863510">ഹോസ്റ്റ് നിർത്തി.</translation> @@ -165,7 +165,6 @@ <translation id="5070121137485264635">റിമോട്ട് ഹോസ്റ്റിന് നിങ്ങളെ ഒരു മൂന്നാംകക്ഷി വെബ്സൈറ്റിലേക്ക് പ്രാമാണീകരിക്കേണ്ടത് ആവശ്യമാണ്. തുടരുന്നതിന്, ഇനിപ്പറയുന്ന വിലാസം ആക്സസ്സുചെയ്യുന്നതിനായി നിങ്ങൾ Chrome വിദൂര ഡെസ്ക്ടോപ്പ് അധിക അനുമതികൾ അനുവദിക്കണം:</translation> <translation id="507204348399810022"><ph name="HOSTNAME" /> എന്നതിലേക്കുള്ള റിമോട്ട് കണക്ഷനുകൾ പ്രവർത്തനരഹിതമാക്കണമെന്ന് തീർച്ചയാണോ?</translation> <translation id="5156271271724754543">രണ്ട് ബോക്സുകളിലും സമാന PIN നൽകുക.</translation> -<translation id="5168917394043976756">നാവിഗേഷൻ ഡ്രോയർ തുറക്കുക</translation> <translation id="5170982930780719864">ഹോസ്റ്റ് ഐഡി അസാധുവാണ്.</translation> <translation id="518094545883702183">നിങ്ങൾ റിപ്പോർട്ടുചെയ്യുന്ന പ്രശ്നം പരിഹരിക്കാനായി മാത്രമേ ഈ വിവരങ്ങൾ ഉപയോഗിക്കൂ, ഇത് നിങ്ങളുടെ റിപ്പോർട്ട് അന്വേഷിക്കുന്നവർക്ക് മാത്രമേ ലഭ്യമാകൂ ഒപ്പം 30 ദിവസത്തിൽ കൂടുതൽ നിലനിർത്തുകയുമില്ല.</translation> <translation id="5222676887888702881">പുറത്തുകടക്കുക</translation>
diff --git a/remoting/resources/remoting_strings_mr.xtb b/remoting/resources/remoting_strings_mr.xtb index 548bcb4..c271cca 100644 --- a/remoting/resources/remoting_strings_mr.xtb +++ b/remoting/resources/remoting_strings_mr.xtb
@@ -33,7 +33,6 @@ <translation id="177096447311351977">क्लायंट साठी चॅनेल IP: <ph name="CLIENT_GAIA_IDENTIFIER" /> ip='<ph name="CLIENT_IP_ADDRESS_AND_PORT" />' host_ip='<ph name="HOST_IP_ADDRESS_AND_PORT" />' channel='<ph name="CHANNEL_TYPE" />' connection='<ph name="CONNECTION_TYPE" />'.</translation> <translation id="1779766957982586368">विंडो बंद करा</translation> <translation id="1841799852846221389">या संगणकासाठी दूरस्थ कनेक्शन अक्षम करीत आहे...</translation> -<translation id="189172778771606813">नेव्हिगेशन ड्रॉवर बंद करा</translation> <translation id="1897488610212723051">हटवा</translation> <translation id="195619862187186579">कीबोर्ड लेआउट</translation> <translation id="1996161829609978754">Chrome हे Chromoting होस्ट इन्स्टॉलर डाउनलोड करीत आहे. एकदा डाउनलोड पूर्ण झाल्यानंतर, कृपया सुरु ठेवण्यापूर्वी इन्स्टॉलर चालवा.</translation> @@ -114,6 +113,7 @@ होस्ट</translation> <translation id="3870154837782082782">Google Inc.</translation> <translation id="3884839335308961732">कृपया Chrome दूरस्थ डेस्कटॉपद्वारे प्रवेश करण्यास अनुमती देण्यासाठी आपल्या खात्याची आणि PIN ची खाली पुष्टी करा.</translation> +<translation id="3897092660631435901">मेनू</translation> <translation id="3905196214175737742">अवैध होस्ट मालक डोमेन.</translation> <translation id="3908017899227008678">फिट करण्यासाठी संकुचित करा</translation> <translation id="3931191050278863510">होस्ट थांबले.</translation> @@ -166,7 +166,6 @@ <translation id="5070121137485264635">दूरस्थ होस्टसाठी आपण एका तृतीय-पक्ष वेबसाइटवर प्रमाणीकृत करणे आवश्यक आहे. सुरू ठेवण्यासाठी, या पत्त्यामध्ये प्रवेश करण्यासाठी आपण Chrome दूरस्थ डेस्कटॉपला अतिरिक्त परवानग्या मंजूर करणे आवश्यक आहे:</translation> <translation id="507204348399810022">आपल्याला खात्री आहे की आपण <ph name="HOSTNAME" /> शी असलेले दूरस्थ कनेक्शन अक्षम करू इच्छिता?</translation> <translation id="5156271271724754543">कृपया दोन्ही बॉक्सेसमध्ये सारखाच PIN प्रविष्ट करा.</translation> -<translation id="5168917394043976756">नेव्हिगेशन ड्रॉवर उघडा</translation> <translation id="5170982930780719864">अवैध होस्ट id.</translation> <translation id="518094545883702183">ही माहिती केवळ आपण अहवाल देत असलेल्या समस्येचे निदान करण्यासाठी वापरली जाते, ही आपल्या अहवालाचे अन्वेषण करणार्या केवळ एखाद्या व्यक्तीसाठी उपलब्ध असते आणि ही 30 दिवसांपेक्षा जास्त ठेवली जात नाही.</translation> <translation id="5222676887888702881">साइन आउट करा</translation>
diff --git a/remoting/resources/remoting_strings_ms.xtb b/remoting/resources/remoting_strings_ms.xtb index 6144de9..d84d1fe 100644 --- a/remoting/resources/remoting_strings_ms.xtb +++ b/remoting/resources/remoting_strings_ms.xtb
@@ -33,7 +33,6 @@ <translation id="177096447311351977">IP Saluran untuk klien: <ph name="CLIENT_GAIA_IDENTIFIER" /> ip='<ph name="CLIENT_IP_ADDRESS_AND_PORT" />' host_ip='<ph name="HOST_IP_ADDRESS_AND_PORT" />' channel='<ph name="CHANNEL_TYPE" />' connection='<ph name="CONNECTION_TYPE" />'.</translation> <translation id="1779766957982586368">Tutup tetingkap</translation> <translation id="1841799852846221389">Melumpuhkan sambungan jauh untuk komputer ini…</translation> -<translation id="189172778771606813">Tutup laci navigasi</translation> <translation id="1897488610212723051">Padam</translation> <translation id="195619862187186579">Reka letak papan kekunci</translation> <translation id="1996161829609978754">Chrome sedang memuat turun pemasang Hos Chromoting. Setelah muat turun selesai, sila jalankan pemasang sebelum meneruskan.</translation> @@ -114,6 +113,7 @@ Chromoting</translation> <translation id="3870154837782082782">Google Inc.</translation> <translation id="3884839335308961732">Sila sahkan akaun dan PIN anda di bawah untuk membenarkan akses melalui Desktop Jauh Chrome.</translation> +<translation id="3897092660631435901">Menu</translation> <translation id="3905196214175737742">Domain pemilik hos tidak sah.</translation> <translation id="3908017899227008678">Kecilkan supaya muat</translation> <translation id="3931191050278863510">Hos dihentikan.</translation> @@ -166,7 +166,6 @@ <translation id="5070121137485264635">Hos jauh memerlukan anda membuat pengesahan pada tapak web pihak ketiga. Untuk meneruskan, anda hendaklah memberikan Desktop Jauh Chrome kebenaran tambahan untuk mengakses alamat ini:</translation> <translation id="507204348399810022">Adakah anda pasti mahu melumpuhkan sambungan jauh ke <ph name="HOSTNAME" />?</translation> <translation id="5156271271724754543">Sila masukkan PIN yang sama dalam kedua-dua kotak.</translation> -<translation id="5168917394043976756">Buka laci navigasi</translation> <translation id="5170982930780719864">Id hos tidak sah.</translation> <translation id="518094545883702183">Maklumat ini hanya digunakan untuk mendiagnosis masalah yang anda laporkan, hanya tersedia kepada seseorang yang menyiasat laporan anda dan dikekalkan selama tidak lebih daripada 30 hari.</translation> <translation id="5222676887888702881">Log keluar</translation>
diff --git a/remoting/resources/remoting_strings_nl.xtb b/remoting/resources/remoting_strings_nl.xtb index 6385031f..ee4477b 100644 --- a/remoting/resources/remoting_strings_nl.xtb +++ b/remoting/resources/remoting_strings_nl.xtb
@@ -33,7 +33,6 @@ <translation id="177096447311351977">Kanaal-IP voor client: <ph name="CLIENT_GAIA_IDENTIFIER" /> ip='<ph name="CLIENT_IP_ADDRESS_AND_PORT" />' host_ip='<ph name="HOST_IP_ADDRESS_AND_PORT" />' channel='<ph name="CHANNEL_TYPE" />' connection='<ph name="CONNECTION_TYPE" />'.</translation> <translation id="1779766957982586368">Venster sluiten</translation> <translation id="1841799852846221389">Externe verbindingen voor deze computer uitschakelen…</translation> -<translation id="189172778771606813">Zijmenu sluiten</translation> <translation id="1897488610212723051">Verwijderen</translation> <translation id="195619862187186579">Toetsenbordindeling</translation> <translation id="1996161829609978754">Chrome downloadt het installatieprogramma voor de Chromoting-host. Zodra het downloaden is voltooid, voer je het installatieprogramma uit voordat je doorgaat.</translation> @@ -114,6 +113,7 @@ host</translation> <translation id="3870154837782082782">Google Inc.</translation> <translation id="3884839335308961732">Bevestig je account en pincode hieronder om toegang door Chrome Remote Desktop toe te staan.</translation> +<translation id="3897092660631435901">Menu</translation> <translation id="3905196214175737742">Ongeldig domein voor hosteigenaar.</translation> <translation id="3908017899227008678">Aanpassen aan venster</translation> <translation id="3931191050278863510">Host is gestopt.</translation> @@ -166,7 +166,6 @@ <translation id="5070121137485264635">De externe host vereist dat je op een website van derden wordt geverifieerd. Als je wilt doorgaan, moet je Chrome Remote Desktop aanvullende machtigingen geven om toegang tot dit adres te krijgen:</translation> <translation id="507204348399810022">Weet je zeker dat je externe verbindingen met <ph name="HOSTNAME" /> wilt uitschakelen?</translation> <translation id="5156271271724754543">Geef dezelfde pincode in beide vakken op.</translation> -<translation id="5168917394043976756">Zijmenu openen</translation> <translation id="5170982930780719864">Ongeldige host-ID.</translation> <translation id="518094545883702183">Deze informatie wordt alleen gebruikt voor een diagnose van het probleem dat je meldt, is alleen beschikbaar voor iemand die je melding onderzoekt en wordt maximaal 30 dagen bewaard.</translation> <translation id="5222676887888702881">Uitloggen</translation>
diff --git a/remoting/resources/remoting_strings_no.xtb b/remoting/resources/remoting_strings_no.xtb index e1d45934..151779e 100644 --- a/remoting/resources/remoting_strings_no.xtb +++ b/remoting/resources/remoting_strings_no.xtb
@@ -33,7 +33,6 @@ <translation id="177096447311351977">Kanal-IP for klienten: <ph name="CLIENT_GAIA_IDENTIFIER" /> ip='<ph name="CLIENT_IP_ADDRESS_AND_PORT" />' host_ip='<ph name="HOST_IP_ADDRESS_AND_PORT" />' channel='<ph name="CHANNEL_TYPE" />' connection='<ph name="CONNECTION_TYPE" />'.</translation> <translation id="1779766957982586368">Lukk vindu</translation> <translation id="1841799852846221389">Slår av eksterne tilkoblinger for denne datamaskinen …</translation> -<translation id="189172778771606813">Lukk uttrekksmenyen</translation> <translation id="1897488610212723051">Slett</translation> <translation id="195619862187186579">Tastaturoppsett</translation> <translation id="1996161829609978754">Chrome laster ned installasjonsprogrammet for Chromoting-verten. Når nedlastingen er ferdig, må du kjøre installasjonsprogrammet før du fortsetter.</translation> @@ -114,6 +113,7 @@ Vert</translation> <translation id="3870154837782082782">Google Inc.</translation> <translation id="3884839335308961732">Bekreft kontoen og PIN-koden din nedenfor for å tillate tilgang via Chrome Eksternt skrivebord.</translation> +<translation id="3897092660631435901">Meny</translation> <translation id="3905196214175737742">Ugyldig domene for vertseieren.</translation> <translation id="3908017899227008678">Forminsk til den passer</translation> <translation id="3931191050278863510">Verten stoppet.</translation> @@ -166,7 +166,6 @@ <translation id="5070121137485264635">Den eksterne verten krever at du godkjenner via et tredjepartsnettsted. For å fortsette må du gi Chrome Eksternt skrivebord ytterligere tillatelser til å åpne denne adressen:</translation> <translation id="507204348399810022">Er du sikker på at du vil deaktivere eksterne forbindelser til <ph name="HOSTNAME" />?</translation> <translation id="5156271271724754543">Skriv inn samme PIN-kode i begge feltene.</translation> -<translation id="5168917394043976756">Åpne uttrekksmenyen</translation> <translation id="5170982930780719864">Ugyldig verts-ID.</translation> <translation id="518094545883702183">Denne informasjonen brukes bare til å diagnostisere problemet du rapporterer om. Informasjonen er bare tilgjengelig for personer som går gjennom rapporten, og den slettes etter maksimalt 30 dager.</translation> <translation id="5222676887888702881">Logg av</translation>
diff --git a/remoting/resources/remoting_strings_pl.xtb b/remoting/resources/remoting_strings_pl.xtb index dc31cde..a183dab 100644 --- a/remoting/resources/remoting_strings_pl.xtb +++ b/remoting/resources/remoting_strings_pl.xtb
@@ -33,7 +33,6 @@ <translation id="177096447311351977">Adres IP kanału dla klienta: <ph name="CLIENT_GAIA_IDENTIFIER" /> ip='<ph name="CLIENT_IP_ADDRESS_AND_PORT" />' host_ip='<ph name="HOST_IP_ADDRESS_AND_PORT" />' channel='<ph name="CHANNEL_TYPE" />' connection='<ph name="CONNECTION_TYPE" />'.</translation> <translation id="1779766957982586368">Zamknij okno</translation> <translation id="1841799852846221389">Wyłączam połączenia zdalne z tym komputerem…</translation> -<translation id="189172778771606813">Zamknij panel nawigacji</translation> <translation id="1897488610212723051">Usuń</translation> <translation id="195619862187186579">Układy klawiatury</translation> <translation id="1996161829609978754">Chrome pobiera instalatora hosta Chromoting. Po zakończeniu pobierania uruchom instalatora.</translation> @@ -114,6 +113,7 @@ Chromoting</translation> <translation id="3870154837782082782">Google Inc.</translation> <translation id="3884839335308961732">Potwierdź poniżej swoje konto i kod PIN, by pozwolić na dostęp przez Pulpit zdalny Chrome.</translation> +<translation id="3897092660631435901">Menu</translation> <translation id="3905196214175737742">Nieprawidłowa domena właściciela hosta.</translation> <translation id="3908017899227008678">Zmniejsz, by dopasować</translation> <translation id="3931191050278863510">Host został zatrzymany.</translation> @@ -166,7 +166,6 @@ <translation id="5070121137485264635">Host zdalny wymaga uwierzytelnienia w witrynie innej firmy. Aby kontynuować, musisz udzielić Pulpitowi zdalnemu Chrome dodatkowych uprawnień dostępu do tego adresu:</translation> <translation id="507204348399810022">Na pewno chcesz wyłączyć połączenia zdalne z: <ph name="HOSTNAME" />?</translation> <translation id="5156271271724754543">Wpisz ten sam PIN w obu polach.</translation> -<translation id="5168917394043976756">Otwórz panel nawigacji</translation> <translation id="5170982930780719864">Nieprawidłowy identyfikator hosta.</translation> <translation id="518094545883702183">Użyjemy tych informacji jedynie do zdiagnozowania zgłoszonego problemu, udostępnimy je tylko osobie sprawdzającej zgłoszenie i usuniemy w ciągu 30 dni.</translation> <translation id="5222676887888702881">Wyloguj się</translation>
diff --git a/remoting/resources/remoting_strings_pt-BR.xtb b/remoting/resources/remoting_strings_pt-BR.xtb index 856e242..262be92 100644 --- a/remoting/resources/remoting_strings_pt-BR.xtb +++ b/remoting/resources/remoting_strings_pt-BR.xtb
@@ -33,7 +33,6 @@ <translation id="177096447311351977">IP do canal do cliente: <ph name="CLIENT_GAIA_IDENTIFIER" /> ip='<ph name="CLIENT_IP_ADDRESS_AND_PORT" />' ip_host='<ph name="HOST_IP_ADDRESS_AND_PORT" />' canal='<ph name="CHANNEL_TYPE" />' conexão='<ph name="CONNECTION_TYPE" />'.</translation> <translation id="1779766957982586368">Fechar janela</translation> <translation id="1841799852846221389">Desativando conexões remotas para este computador...</translation> -<translation id="189172778771606813">Fechar gaveta de navegação</translation> <translation id="1897488610212723051">Excluir</translation> <translation id="195619862187186579">Layouts de teclado</translation> <translation id="1996161829609978754">O Google Chrome está fazendo download do instalador do host do Chromoting. Quando o download estiver concluído, execute o instalador antes de continuar.</translation> @@ -114,6 +113,7 @@ Chromoting</translation> <translation id="3870154837782082782">Google Inc.</translation> <translation id="3884839335308961732">Confirme sua conta e seu PIN abaixo para permitir acesso pela Área de trabalho remota do Google Chrome.</translation> +<translation id="3897092660631435901">Menu</translation> <translation id="3905196214175737742">Domínio de proprietário de host inválido.</translation> <translation id="3908017899227008678">Reduzir para ajustar</translation> <translation id="3931191050278863510">O host parou.</translation> @@ -166,7 +166,6 @@ <translation id="5070121137485264635">O host remoto requer a autenticação em um website de terceiros. Para continuar, você deve conceder à Área de trabalho remota do Google Chrome acesso a permissões adicionais para acessar este endereço:</translation> <translation id="507204348399810022">Tem certeza de que deseja desativar conexões remotas para <ph name="HOSTNAME" />?</translation> <translation id="5156271271724754543">Digite o mesmo PIN nas duas caixas.</translation> -<translation id="5168917394043976756">Abrir gaveta de navegação</translation> <translation id="5170982930780719864">ID de host inválido.</translation> <translation id="518094545883702183">Essa informação é usada apenas para diagnosticar o problema que você está relatando, está disponível apenas para as pessoas que estão investigando seu relatório e só fica retida por até 30 dias.</translation> <translation id="5222676887888702881">Sair</translation>
diff --git a/remoting/resources/remoting_strings_pt-PT.xtb b/remoting/resources/remoting_strings_pt-PT.xtb index 2c54d8dc..ea97969 100644 --- a/remoting/resources/remoting_strings_pt-PT.xtb +++ b/remoting/resources/remoting_strings_pt-PT.xtb
@@ -33,7 +33,6 @@ <translation id="177096447311351977">IP do canal para o cliente: <ph name="CLIENT_GAIA_IDENTIFIER" /> ip="<ph name="CLIENT_IP_ADDRESS_AND_PORT" />" ip_anfitrião="<ph name="HOST_IP_ADDRESS_AND_PORT" />" canal="<ph name="CHANNEL_TYPE" />" ligação="<ph name="CONNECTION_TYPE" />".</translation> <translation id="1779766957982586368">Fechar janela</translation> <translation id="1841799852846221389">A desativar as ligações remotas neste computador…</translation> -<translation id="189172778771606813">Fechar a gaveta de navegação</translation> <translation id="1897488610212723051">Eliminar</translation> <translation id="195619862187186579">Esquemas do teclado</translation> <translation id="1996161829609978754">O Chrome está a transferir o ficheiro de instalação do Anfitrião do Chromoting. Concluída a transferência, execute o ficheiro de instalação antes de continuar.</translation> @@ -114,6 +113,7 @@ Chromoting</translation> <translation id="3870154837782082782">Google Inc.</translation> <translation id="3884839335308961732">Confirme a sua conta e PIN abaixo para permitir o acesso do Ambiente de Trabalho Remoto do Chrome.</translation> +<translation id="3897092660631435901">Menu</translation> <translation id="3905196214175737742">Domínio do proprietário do anfitrião inválido.</translation> <translation id="3908017899227008678">Ajustar texto</translation> <translation id="3931191050278863510">O anfitrião parou.</translation> @@ -166,7 +166,6 @@ <translation id="5070121137485264635">O anfitrião remoto requer que efetue a autenticação num Website de terceiros. Para continuar, necessita de conceder permissões adicionais ao Ambiente de Trabalho Remoto do Chrome para aceder a este endereço:</translation> <translation id="507204348399810022">Tem a certeza de que pretende desativar as ligações remotas a <ph name="HOSTNAME" />?</translation> <translation id="5156271271724754543">Introduza o mesmo PIN em ambas as caixas.</translation> -<translation id="5168917394043976756">Abrir a gaveta de navegação</translation> <translation id="5170982930780719864">ID de anfitrião inválido.</translation> <translation id="518094545883702183">Estas informações apenas são utilizadas para diagnosticar o problema que está a comunicar, apenas estão disponíveis para quem está a investigar o relatório e não são mantidas por mais de 30 dias.</translation> <translation id="5222676887888702881">Terminar sessão</translation>
diff --git a/remoting/resources/remoting_strings_ro.xtb b/remoting/resources/remoting_strings_ro.xtb index d97e355..2db088f 100644 --- a/remoting/resources/remoting_strings_ro.xtb +++ b/remoting/resources/remoting_strings_ro.xtb
@@ -33,7 +33,6 @@ <translation id="177096447311351977">IP canal pentru client: <ph name="CLIENT_GAIA_IDENTIFIER" /> ip=„<ph name="CLIENT_IP_ADDRESS_AND_PORT" />” host_ip=„<ph name="HOST_IP_ADDRESS_AND_PORT" />” channel=„<ph name="CHANNEL_TYPE" />” connection=„<ph name="CONNECTION_TYPE" />”.</translation> <translation id="1779766957982586368">Închide fereastra</translation> <translation id="1841799852846221389">Se dezactivează conexiunile la distanță pentru acest computer…</translation> -<translation id="189172778771606813">Închide panoul de navigare</translation> <translation id="1897488610212723051">Șterge</translation> <translation id="195619862187186579">Aspecte de tastatură</translation> <translation id="1996161829609978754">Chrome descarcă programul de instalare a gazdei pentru Chromoting. După ce se descarcă, rulați programul de instalare înainte de a continua.</translation> @@ -114,6 +113,7 @@ Chromoting</translation> <translation id="3870154837782082782">Google Inc.</translation> <translation id="3884839335308961732">Confirmați mai jos contul și codul PIN pentru a permite accesarea prin intermediul aplicației Desktop la distanță Chrome.</translation> +<translation id="3897092660631435901">Meniu</translation> <translation id="3905196214175737742">Domeniu nevalid pentru proprietarul gazdei.</translation> <translation id="3908017899227008678">Potriviți prin micșorare</translation> <translation id="3931191050278863510">Gazda s-a oprit.</translation> @@ -166,7 +166,6 @@ <translation id="5070121137485264635">Gazda la distanță solicită să vă autentificați pe un site terță parte. Pentru a continua, trebuie să acordați permisiuni suplimentare aplicației Desktop la distanță Chrome pentru a accesa această adresă:</translation> <translation id="507204348399810022">Sigur dorești să dezactivezi conexiunile la distanță la <ph name="HOSTNAME" />?</translation> <translation id="5156271271724754543">Introduceți același cod PIN în ambele casete.</translation> -<translation id="5168917394043976756">Deschide panoul de navigare</translation> <translation id="5170982930780719864">ID de gazdă nevalid.</translation> <translation id="518094545883702183">Această informație este folosită numai pentru diagnosticarea problemei pe care o raportezi, este disponibilă numai pentru persoana care îți examinează raportul și nu este păstrată pentru mai mult de 30 de zile.</translation> <translation id="5222676887888702881">Deconectează-te</translation>
diff --git a/remoting/resources/remoting_strings_ru.xtb b/remoting/resources/remoting_strings_ru.xtb index c72f1d5..db411bc 100644 --- a/remoting/resources/remoting_strings_ru.xtb +++ b/remoting/resources/remoting_strings_ru.xtb
@@ -33,7 +33,6 @@ <translation id="177096447311351977">IP-адрес канала для клиента: <ph name="CLIENT_GAIA_IDENTIFIER" /> ip='<ph name="CLIENT_IP_ADDRESS_AND_PORT" />' host_ip='<ph name="HOST_IP_ADDRESS_AND_PORT" />' channel='<ph name="CHANNEL_TYPE" />' connection='<ph name="CONNECTION_TYPE" />'.</translation> <translation id="1779766957982586368">Закрыть окно</translation> <translation id="1841799852846221389">Блокировка удаленных подключений…</translation> -<translation id="189172778771606813">Закрыть панель навигации</translation> <translation id="1897488610212723051">Удалить</translation> <translation id="195619862187186579">Раскладка клавиатуры</translation> <translation id="1996161829609978754">Программа установки хоста для Пульта Chrome скачивается. Запустите ее после скачивания.</translation> @@ -114,6 +113,7 @@ Пульта Chrome</translation> <translation id="3870154837782082782">Google Inc.</translation> <translation id="3884839335308961732">Для доступа через Удаленный рабочий стол Chrome подтвердите свой аккаунт и PIN-код.</translation> +<translation id="3897092660631435901">Меню</translation> <translation id="3905196214175737742">Владелец хоста использует недопустимый домен</translation> <translation id="3908017899227008678">Уменьшить до размера окна</translation> <translation id="3931191050278863510">Хост остановлен.</translation> @@ -166,7 +166,6 @@ <translation id="5070121137485264635">Для удаленного доступа к сайту требуется пройти аутентификацию. Дайте Удаленному рабочему столу Chrome дополнительные разрешения для доступа к следующему адресу:</translation> <translation id="507204348399810022">Заблокировать удаленные подключения к "<ph name="HOSTNAME" />"?</translation> <translation id="5156271271724754543">Введите в обоих полях одинаковый PIN-код.</translation> -<translation id="5168917394043976756">Открыть панель навигации</translation> <translation id="5170982930780719864">Недопустимый идентификатор хоста</translation> <translation id="518094545883702183">Эти сведения помогут диагностировать возникшую проблему. Они будут доступны только специалисту, работающему над ее решением, на срок не более 30 дней.</translation> <translation id="5222676887888702881">Выйти</translation>
diff --git a/remoting/resources/remoting_strings_sk.xtb b/remoting/resources/remoting_strings_sk.xtb index b2e42a8..af1e3be 100644 --- a/remoting/resources/remoting_strings_sk.xtb +++ b/remoting/resources/remoting_strings_sk.xtb
@@ -33,7 +33,6 @@ <translation id="177096447311351977">Adresa IP kanála pre klient: <ph name="CLIENT_GAIA_IDENTIFIER" /> ip='<ph name="CLIENT_IP_ADDRESS_AND_PORT" />' host_ip='<ph name="HOST_IP_ADDRESS_AND_PORT" />' channel='<ph name="CHANNEL_TYPE" />' connection='<ph name="CONNECTION_TYPE" />'.</translation> <translation id="1779766957982586368">Zavrieť okno</translation> <translation id="1841799852846221389">Prebieha zakazovanie vzdialených pripojení pre tento počítač...</translation> -<translation id="189172778771606813">Zavrieť navigačný vysúvací panel</translation> <translation id="1897488610212723051">Odstrániť</translation> <translation id="195619862187186579">Rozloženia klávesnice</translation> <translation id="1996161829609978754">Chrome sťahuje inštalátor hostiteľa Vzdialenej plochy Chrome. Inštalátor po stiahnutí najprv spustite a pokračujte až potom.</translation> @@ -114,6 +113,7 @@ Hostiteľ</translation> <translation id="3870154837782082782">Spoločnosť Google Inc.</translation> <translation id="3884839335308961732">Ak chcete povoliť prístup k Vzdialenej ploche Chrome, potvrďte svoj účet a kód PIN nižšie.</translation> +<translation id="3897092660631435901">Ponuka</translation> <translation id="3905196214175737742">Neplatná doména vlastníka hostiteľa</translation> <translation id="3908017899227008678">Zmenšiť a prispôsobiť</translation> <translation id="3931191050278863510">Hostenie bolo zastavené.</translation> @@ -166,7 +166,6 @@ <translation id="5070121137485264635">Vzdialený hostiteľ od vás vyžaduje overenie na webových stránkach tretej strany. Ak chcete pokračovať, musíte vzdialenej ploche Chrome udeliť dodatočné oprávnenie na prístup k tejto adrese:</translation> <translation id="507204348399810022">Naozaj chcete zakázať vzdialené pripojenia k zariadeniu <ph name="HOSTNAME" />?</translation> <translation id="5156271271724754543">Do obidvoch polí zadajte rovnaký kód PIN.</translation> -<translation id="5168917394043976756">Otvoriť navigačný vysúvací panel</translation> <translation id="5170982930780719864">Neplatný identifikátor hostiteľa</translation> <translation id="518094545883702183">K týmto informáciám, ktoré sa používajú iba na diagnostiku vami nahláseného problému, má prístup výhradne osoba prešetrujúca vaše hlásenie. Tieto informácie budú uchovávané maximálne 30 dní.</translation> <translation id="5222676887888702881">Odhlásiť sa</translation>
diff --git a/remoting/resources/remoting_strings_sl.xtb b/remoting/resources/remoting_strings_sl.xtb index 1d4cc21..0e8b2b07 100644 --- a/remoting/resources/remoting_strings_sl.xtb +++ b/remoting/resources/remoting_strings_sl.xtb
@@ -33,7 +33,6 @@ <translation id="177096447311351977">IP kanala za odjemalca: <ph name="CLIENT_GAIA_IDENTIFIER" /> ip='<ph name="CLIENT_IP_ADDRESS_AND_PORT" />' host_ip='<ph name="HOST_IP_ADDRESS_AND_PORT" />' channel='<ph name="CHANNEL_TYPE" />' connection='<ph name="CONNECTION_TYPE" />'.</translation> <translation id="1779766957982586368">Zapre okno</translation> <translation id="1841799852846221389">Onemogočanje oddaljenih povezav za ta računalnik ...</translation> -<translation id="189172778771606813">Zapri predal za krmarjenje</translation> <translation id="1897488610212723051">Izbriši</translation> <translation id="195619862187186579">Postavitve tipkovnice</translation> <translation id="1996161829609978754">Chrome prenaša namestitveni program za gostitelja Oddaljenega povezovanja s Chromom. Po končanem prenosu zaženite namestitveni program, preden nadaljujete.</translation> @@ -114,6 +113,7 @@ povezovanje s Chromom</translation> <translation id="3870154837782082782">Google Inc.</translation> <translation id="3884839335308961732">Če želite dovoliti dostop prek Oddaljenega namizja za Chrome, spodaj potrdite račun in PIN.</translation> +<translation id="3897092660631435901">Meni</translation> <translation id="3905196214175737742">Neveljavna domena lastnika gostitelja.</translation> <translation id="3908017899227008678">Skrči na ustrezno velikost</translation> <translation id="3931191050278863510">Gostitelj se je ustavil.</translation> @@ -166,7 +166,6 @@ <translation id="5070121137485264635">Oddaljeni gostitelj zahteva, da previte pristnost na spletnem mestu tretje osebe. Če želite nadaljevati, morate Oddaljenemu namizju za Chrome dodeliti dodatna dovoljenja za dostop do tega naslova:</translation> <translation id="507204348399810022">Ali ste prepričani, da želite onemogočiti oddaljene povezave z gostiteljem <ph name="HOSTNAME" />?</translation> <translation id="5156271271724754543">V polji vnesite isto kodo PIN.</translation> -<translation id="5168917394043976756">Odpri predal za krmarjenje</translation> <translation id="5170982930780719864">Neveljaven ID gostitelja.</translation> <translation id="518094545883702183">Te informacije uporabljamo samo za diagnosticiranje težave, ki ste jo prijavili, na voljo so samo osebi, ki preučuje vašo prijavo, in hranimo jih največ 30 dni.</translation> <translation id="5222676887888702881">Odjava</translation>
diff --git a/remoting/resources/remoting_strings_sr.xtb b/remoting/resources/remoting_strings_sr.xtb index ef0a498..a76d792 100644 --- a/remoting/resources/remoting_strings_sr.xtb +++ b/remoting/resources/remoting_strings_sr.xtb
@@ -33,7 +33,6 @@ <translation id="177096447311351977">IP адреса канала за клијента: <ph name="CLIENT_GAIA_IDENTIFIER" /> ip=„<ph name="CLIENT_IP_ADDRESS_AND_PORT" />“ host_ip=„<ph name="HOST_IP_ADDRESS_AND_PORT" />“ channel=„<ph name="CHANNEL_TYPE" />“ connection=„<ph name="CONNECTION_TYPE" />“.</translation> <translation id="1779766957982586368">Затварање прозора</translation> <translation id="1841799852846221389">Онемогућавање даљинског повезивања за овај рачунар…</translation> -<translation id="189172778771606813">Затвори фиоку за навигацију</translation> <translation id="1897488610212723051">Избриши</translation> <translation id="195619862187186579">Распоред тастера на тастатури</translation> <translation id="1996161829609978754">Chrome преузима инсталациони програм Хост за Chromoting. Када се преузимање заврши, покрените инсталациони програм пре него што наставите.</translation> @@ -81,10 +80,10 @@ <translation id="2894654864775534701">Овај рачунар се тренутно дели у склопу другог налога.</translation> <translation id="2919669478609886916">Тренутно делите овај уређај са још једним корисником. Да ли желите да наставите дељење?</translation> <translation id="2921543551052660690">Претходно сте се пријавили као <ph name="USER_NAME" /> (<ph name="USER_EMAIL" />). Да бисте приступили рачунарима преко тог налога, <ph name="LINK_BEGIN" />пријавите се на Chromium<ph name="LINK_END" /> помоћу тог налога и поново инсталирајте Chromoting.</translation> -<translation id="2926340305933667314">Онемогућавање даљинског приступа овом рачунару није успело. Покушајте поново касније.</translation> +<translation id="2926340305933667314">Онемогућавање даљинског приступа овом рачунару није успело. Пробајте поново касније.</translation> <translation id="2930135165929238380">Недостају неке неопходне компоненте. Идите на chrome://plugins и уверите се да је Native Client омогућен.</translation> <translation id="2939145106548231838">Потврдите аутентичност на хосту</translation> -<translation id="3020807351229499221">Ажурирање PIN-а није успело. Покушајте поново касније.</translation> +<translation id="3020807351229499221">Ажурирање PIN-а није успело. Пробајте поново касније.</translation> <translation id="3025388528294795783">Да бисте нам помогли да решимо проблем, реците нам шта није у реду:</translation> <translation id="3027681561976217984">Режим додира</translation> <translation id="3106379468611574572">Удаљени рачунар не одговара на захтеве за повезивање. Проверите да ли је на мрежи и покушајте поново.</translation> @@ -113,6 +112,7 @@ <translation id="3785447812627779171">Хост за Chromoting</translation> <translation id="3870154837782082782">Google Inc.</translation> <translation id="3884839335308961732">Потврдите налог и PIN у наставку да бисте омогућили приступ за Chrome удаљени рачунар.</translation> +<translation id="3897092660631435901">Мени</translation> <translation id="3905196214175737742">Домен власника хоста је неважећи.</translation> <translation id="3908017899227008678">Умањи према величини прозора</translation> <translation id="3931191050278863510">Хост је заустављен.</translation> @@ -130,7 +130,7 @@ <translation id="4227991223508142681">Услужни програм за доделу хостова</translation> <translation id="4240294130679914010">Алатка за деинсталацију хоста за Chromoting</translation> <translation id="4277463233460010382">Овај рачунар је конфигурисан тако да омогућава да се један клијент или више њих повезују без уношења PIN-а.</translation> -<translation id="4277736576214464567">Приступни кôд је неважећи. Покушајте поново.</translation> +<translation id="4277736576214464567">Приступни кôд је неважећи. Пробајте поново.</translation> <translation id="4361728918881830843">Да бисте омогућили даљинско повезивање са неким другим рачунаром, инсталирајте Chrome удаљени рачунар на њега и кликните на „<ph name="BUTTON_NAME" />“.</translation> <translation id="4368630973089289038">Желите да нам помогнете да побољшамо Chromoting? <ph name="LINK_BEGIN" />Попуните анкету.<ph name="LINK_END" /></translation> <translation id="4394049700291259645">Онемогући</translation> @@ -164,7 +164,6 @@ <translation id="5070121137485264635">Удаљени хост захтева да потврдите аутентичност на веб-сајту треће стране. Да бисте наставили, морате да дате Chrome удаљеном рачунару додатне дозволе за приступ овој адреси:</translation> <translation id="507204348399810022">Желите ли стварно да онемогућите даљинско повезивање са хостом <ph name="HOSTNAME" />?</translation> <translation id="5156271271724754543">Унесите исти PIN у оба оквира.</translation> -<translation id="5168917394043976756">Отвори фиоку за навигацију</translation> <translation id="5170982930780719864">ИД хоста је неважећи.</translation> <translation id="518094545883702183">Ови подаци се користе само за откривање проблема који пријављујете, доступни су само особи која истражује извештај и не задржавамо их дуже од 30 дана.</translation> <translation id="5222676887888702881">Одјави ме</translation> @@ -178,7 +177,7 @@ <translation id="544077782045763683">Хост се искључио.</translation> <translation id="5510035215749041527">Прекини везу одмах</translation> <translation id="5537725057119320332">Пребацуј</translation> -<translation id="5593560073513909978">Услуга је привремено недоступна. Покушајте поново касније.</translation> +<translation id="5593560073513909978">Услуга је привремено недоступна. Пробајте поново касније.</translation> <translation id="5601503069213153581">PIN</translation> <translation id="5619148062500147964">Са овим рачунаром</translation> <translation id="5625493749705183369">Приступајте другим рачунарима или омогућите другом кориснику да безбедно приступа вашем рачунару преко интернета.</translation> @@ -230,7 +229,7 @@ <translation id="6930242544192836755">Трајање</translation> <translation id="6939719207673461467">Прикажи/сакриј тастатуру.</translation> <translation id="6944854424004126054">Вратите прозор</translation> -<translation id="6963936880795878952">Повезивање са удаљеним рачунаром је привремено блокирано зато што је неко покушавао да се повеже са њим помоћу неважећег PIN-а. Покушајте поново касније.</translation> +<translation id="6963936880795878952">Повезивање са удаљеним рачунаром је привремено блокирано зато што је неко покушавао да се повеже са њим помоћу неважећег PIN-а. Пробајте поново касније.</translation> <translation id="6965382102122355670">Потврди</translation> <translation id="6985691951107243942">Желите ли стварно да онемогућите даљинско повезивање са хостом <ph name="HOSTNAME" />? Ако се предомислите, треба да посетите тај рачунар да бисте поново омогућили везе.</translation> <translation id="6998989275928107238">До</translation> @@ -238,7 +237,7 @@ <translation id="701976023053394610">Даљинска помоћ</translation> <translation id="7038683108611689168">Помозите нам да побољшамо Chromoting тако што ћете нам дозволити да прикупљамо статистику коришћења и извештаје о отказивању.</translation> <translation id="712467900648340229">Повезивање са уређајем за пребацивање није успело.</translation> -<translation id="7144878232160441200">Покушај поново</translation> +<translation id="7144878232160441200">Пробај поново</translation> <translation id="7149517134817561223">Апликација издаје команде хосту за Chrome удаљени рачунар.</translation> <translation id="7215059001581613786">Унесите PIN који се састоји од шест или више цифара.</translation> <translation id="7312846573060934304">Хост је офлајн.</translation>
diff --git a/remoting/resources/remoting_strings_sv.xtb b/remoting/resources/remoting_strings_sv.xtb index c0f1687d..1673edc3 100644 --- a/remoting/resources/remoting_strings_sv.xtb +++ b/remoting/resources/remoting_strings_sv.xtb
@@ -33,7 +33,6 @@ <translation id="177096447311351977">IP-adress för kanal för klient: <ph name="CLIENT_GAIA_IDENTIFIER" /> ip='<ph name="CLIENT_IP_ADDRESS_AND_PORT" />' host_ip='<ph name="HOST_IP_ADDRESS_AND_PORT" />' channel='<ph name="CHANNEL_TYPE" />' connection='<ph name="CONNECTION_TYPE" />'.</translation> <translation id="1779766957982586368">Stäng fönstret</translation> <translation id="1841799852846221389">Fjärranslutningar inaktiveras för den här datorn ...</translation> -<translation id="189172778771606813">Stäng navigeringspanelen</translation> <translation id="1897488610212723051">Radera</translation> <translation id="195619862187186579">Tangentbordslayouter</translation> <translation id="1996161829609978754">Chrome laddar ned installationsprogrammet för fjärranslutningsvärden Chromoting Host. Kör installationsprogrammet när nedladdningen är klar.</translation> @@ -114,6 +113,7 @@ Host</translation> <translation id="3870154837782082782">Google Inc.</translation> <translation id="3884839335308961732">Bekräfta ditt konto och pinkoden nedan för att tillåta åtkomst via Chrome Remote Desktop.</translation> +<translation id="3897092660631435901">Meny</translation> <translation id="3905196214175737742">Ogiltig domän för värdens ägare.</translation> <translation id="3908017899227008678">Krymp den så att den passar in</translation> <translation id="3931191050278863510">Värden stoppades.</translation> @@ -166,7 +166,6 @@ <translation id="5070121137485264635">Fjärrvärden kräver att du autentiserar via en tredje parts webbplats. Om du vill fortsätta måste du ge Chrome Remote Desktop ytterligare behörigheter att komma åt den här adressen:</translation> <translation id="507204348399810022">Är du säker på att du vill inaktivera fjärranslutningar till <ph name="HOSTNAME" />?</translation> <translation id="5156271271724754543">Ange samma PIN-kod i båda rutorna.</translation> -<translation id="5168917394043976756">Öppna navigeringspanelen</translation> <translation id="5170982930780719864">Ogiltigt värd-id.</translation> <translation id="518094545883702183">Den här informationen används bara för att diagnostisera det som felrapporten gäller. Bara den som arbetar med ärendet kan se den och den sparas i högst 30 dagar.</translation> <translation id="5222676887888702881">Logga ut</translation>
diff --git a/remoting/resources/remoting_strings_sw.xtb b/remoting/resources/remoting_strings_sw.xtb index 2c9ed8ac..67d8339 100644 --- a/remoting/resources/remoting_strings_sw.xtb +++ b/remoting/resources/remoting_strings_sw.xtb
@@ -33,7 +33,6 @@ <translation id="177096447311351977">IP ya Kituo cha kiteja: <ph name="CLIENT_GAIA_IDENTIFIER" /> ip='<ph name="CLIENT_IP_ADDRESS_AND_PORT" />' ip ya mpangishi='<ph name="HOST_IP_ADDRESS_AND_PORT" />' kituo='<ph name="CHANNEL_TYPE" />' muunganisho='<ph name="CONNECTION_TYPE" />'.</translation> <translation id="1779766957982586368">Funga dirisha</translation> <translation id="1841799852846221389">Inafunga miunganisho ya mbali ya kompyuta hii...</translation> -<translation id="189172778771606813">Funga droo ya kusogeza</translation> <translation id="1897488610212723051">Futa</translation> <translation id="195619862187186579">Mipangilio ya kibodi</translation> <translation id="1996161829609978754">Chrome inapakua kisakinishi cha Seva pangishi cha Eneo-kazi la Chromoting. Mara tu upakuaji unapokamilika, tafadhali endesha kisakinishi kabla ya kuendelea.</translation> @@ -114,6 +113,7 @@ Chromoting</translation> <translation id="3870154837782082782">Google Inc.</translation> <translation id="3884839335308961732">Tafadhali thibitisha akaunti yako na PIN hapa chini ili kuruhusu ufikiaji kwa Kompyuta ya Mbali ya Chrome</translation> +<translation id="3897092660631435901">Menyu</translation> <translation id="3905196214175737742">Kikoa cha mmiliki wa seva pangishi si sahihi.</translation> <translation id="3908017899227008678">Punguza ili itoshe</translation> <translation id="3931191050278863510">Mpangishi amesimamishwa.</translation> @@ -166,7 +166,6 @@ <translation id="5070121137485264635">Seva pangishi ya mbali inakuhitaji uhalalishe hadi kwenye tovuti nyingine. Ili kuendelea, sharti uipe Chrome Remote Desktop idhini za ziada ili ifikie anwani hii:</translation> <translation id="507204348399810022">Una uhakika ungependa kuzima miunganisho ya mbali kwenye <ph name="HOSTNAME" />?</translation> <translation id="5156271271724754543">Tafadhali ingiza PIN ile ile katika vikasha vyote viwili.</translation> -<translation id="5168917394043976756">Fungua droo ya kusogeza</translation> <translation id="5170982930780719864">Kitambulisho cha seva pangishi si sahihi.</translation> <translation id="518094545883702183">Maelezo haya yanatumika tu kwa kutambua tatizo unaloripoti, yanapatikana tu kwa mtu anayechunguza ripoti yako, na yanahifadhiwa kwa siku zisizozidi 30.</translation> <translation id="5222676887888702881">Ondoka</translation>
diff --git a/remoting/resources/remoting_strings_ta.xtb b/remoting/resources/remoting_strings_ta.xtb index 926b4da..1ddaeb9 100644 --- a/remoting/resources/remoting_strings_ta.xtb +++ b/remoting/resources/remoting_strings_ta.xtb
@@ -33,7 +33,6 @@ <translation id="177096447311351977">க்ளையன்ட்டிற்கான சேனல் IP: <ph name="CLIENT_GAIA_IDENTIFIER" /> ip='<ph name="CLIENT_IP_ADDRESS_AND_PORT" />' host_ip='<ph name="HOST_IP_ADDRESS_AND_PORT" />' channel='<ph name="CHANNEL_TYPE" />' connection='<ph name="CONNECTION_TYPE" />'.</translation> <translation id="1779766957982586368">சாளரத்தை மூடுக</translation> <translation id="1841799852846221389">இந்தக் கணினிக்கான தொலைநிலை இணைப்புகளை முடக்குகிறது...</translation> -<translation id="189172778771606813">வழிசெலுத்தல் டிராயரை மூடும்</translation> <translation id="1897488610212723051">நீக்கு</translation> <translation id="195619862187186579">விசைப்பலகைத் தளவமைப்புகள்</translation> <translation id="1996161829609978754">Chrome ஆனது குரோமோட்டிங் ஹோஸ்ட் நிறுவியைப் பதிவிறக்குகிறது. பதிவிறக்கம் முடிந்ததும், தொடர்வதற்கு முன் நிறுவியை இயக்கவும்.</translation> @@ -114,6 +113,7 @@ புரவன்</translation> <translation id="3870154837782082782">Google Inc.</translation> <translation id="3884839335308961732">Chrome தொலைநிலை டெஸ்க்டாப் மூலம் அணுகலை அனுமதிக்க, கீழே உங்கள் கணக்கையும், PIN ஐயும் உறுதிப்படுத்தவும்.</translation> +<translation id="3897092660631435901">மெனு</translation> <translation id="3905196214175737742">தவறான ஹோஸ்ட் உரிமையாளர் டொமைன்.</translation> <translation id="3908017899227008678">பொருத்தமாகச் சுருக்கு</translation> <translation id="3931191050278863510">ஹோஸ்ட் நிறுத்தப்பட்டது.</translation> @@ -166,7 +166,6 @@ <translation id="5070121137485264635">ஒரு மூன்றாம் தரப்பு இணையதளத்தை நீங்கள் அங்கீகரிக்க வேண்டும் என்று தொலைநிலை ஹோஸ்ட் கேட்கிறது. தொடர்வதற்கு, இந்த முகவரியை அணுக Chrome தொலைநிலை டெஸ்க்டாப்பிற்கு கூடுதல் அனுமதிகளை நீங்கள் வழங்க வேண்டும்:</translation> <translation id="507204348399810022"><ph name="HOSTNAME" />க்கான ரிமோட் இணைப்புகளை முடக்க விரும்புகிறீர்களா?</translation> <translation id="5156271271724754543">இரண்டு பெட்டிகளிலும் ஒரே PIN ஐ உள்ளிடுக.</translation> -<translation id="5168917394043976756">வழிசெலுத்தல் டிராயரைத் திறக்கும்</translation> <translation id="5170982930780719864">ஹோஸ்ட் ஐடி தவறு.</translation> <translation id="518094545883702183">இந்தத் தகவல் நீங்கள் புகாரளித்த சிக்கலைக் கண்டறிவதற்காக மட்டுமே பயன்படுத்தப்படும், உங்கள் புகாரை விசாரணை செய்பவர் மட்டுமே இந்தத் தகவலை பார்க்க முடியும் மற்றும் இந்தத் தகவல் 30 நாட்களுக்கு மேல் வைத்துக்கொள்ளப்படாது.</translation> <translation id="5222676887888702881">வெளியேறு</translation>
diff --git a/remoting/resources/remoting_strings_te.xtb b/remoting/resources/remoting_strings_te.xtb index 8852758..72fe784 100644 --- a/remoting/resources/remoting_strings_te.xtb +++ b/remoting/resources/remoting_strings_te.xtb
@@ -33,7 +33,6 @@ <translation id="177096447311351977">ఈ క్లయింట్ కోసం ఛానెల్ IP: <ph name="CLIENT_GAIA_IDENTIFIER" /> ip='<ph name="CLIENT_IP_ADDRESS_AND_PORT" />' host_ip='<ph name="HOST_IP_ADDRESS_AND_PORT" />' channel='<ph name="CHANNEL_TYPE" />' connection='<ph name="CONNECTION_TYPE" />'.</translation> <translation id="1779766957982586368">విండోను ముసివేయి</translation> <translation id="1841799852846221389">ఈ కంప్యూటర్ కోసం రిమోట్ కనెక్షన్లను నిలిపివేస్తోంది...</translation> -<translation id="189172778771606813">నావిగేషన్ డ్రాయర్ను మూసివేయి</translation> <translation id="1897488610212723051">తొలగించు</translation> <translation id="195619862187186579">కీబోర్డ్ లేఅవుట్లు</translation> <translation id="1996161829609978754">Chromoting హోస్ట్ ఇన్స్టాలర్ను Chrome డౌన్లోడ్ చేస్తోంది. డౌన్లోడ్ పూర్తయిన తర్వాత, దయచేసి కొనసాగడానికి ముందు ఇన్స్టాలర్ను అమలు చేయండి.</translation> @@ -114,6 +113,7 @@ హోస్ట్</translation> <translation id="3870154837782082782">Google Inc.</translation> <translation id="3884839335308961732">దయచేసి Chrome రిమోట్ డెస్క్టాప్ ద్వారా ప్రాప్యతను అనుమతించడానికి దిగువ మీ ఖాతా మరియు PINను నిర్ధారించండి.</translation> +<translation id="3897092660631435901">మెను</translation> <translation id="3905196214175737742">చెల్లని హోస్ట్ యజమాని డొమైన్.</translation> <translation id="3908017899227008678">సరిపోయేలా కుదించు</translation> <translation id="3931191050278863510">హోస్ట్ ఆపివేయబడింది.</translation> @@ -166,7 +166,6 @@ <translation id="5070121137485264635">మీరు మూడవ పక్ష వెబ్సైట్కు ప్రామాణీకరించాలని రిమోట్ హోస్ట్ కోరుతోంది. కొనసాగడానికి, మీరు తప్పనిసరిగా Chrome రిమోట్ డెస్క్టాప్కు ఈ చిరునామాను ప్రాప్యత చేయడానికి అదనపు అనుమతులను మంజూరు చేయాలి:</translation> <translation id="507204348399810022">మీరు ఖచ్చితంగా <ph name="HOSTNAME" />కి గల రిమోట్ కనెక్షన్లను నిలిపివేయాలనుకుంటున్నారా?</translation> <translation id="5156271271724754543">దయచేసి రెండు పెట్టెల్లోనూ ఒకే PINను నమోదు చేయండి.</translation> -<translation id="5168917394043976756">నావిగేషన్ డ్రాయర్ను తెరువు</translation> <translation id="5170982930780719864">చెల్లని హోస్ట్ id.</translation> <translation id="518094545883702183">ఈ సమాచారం మీరు నివేదిస్తున్న సమస్యను విశ్లేషించడానికి మాత్రమే ఉపయోగించబడుతుంది, ఇది మీ నివేదికను దర్యాప్తు చేసే వ్యక్తికి మాత్రమే అందుబాటులో ఉంటుంది మరియు 30 రోజుల కంటే ఎక్కువ కాలం ఉంచబడదు.</translation> <translation id="5222676887888702881">సైన్ ఔట్</translation>
diff --git a/remoting/resources/remoting_strings_th.xtb b/remoting/resources/remoting_strings_th.xtb index 6b22339..6ccb198 100644 --- a/remoting/resources/remoting_strings_th.xtb +++ b/remoting/resources/remoting_strings_th.xtb
@@ -33,7 +33,6 @@ <translation id="177096447311351977">IP ช่องสำหรับไคลเอ็นต์: <ph name="CLIENT_GAIA_IDENTIFIER" /> ip='<ph name="CLIENT_IP_ADDRESS_AND_PORT" />' host_ip='<ph name="HOST_IP_ADDRESS_AND_PORT" />' channel='<ph name="CHANNEL_TYPE" />' connection='<ph name="CONNECTION_TYPE" />'.</translation> <translation id="1779766957982586368">ปิดหน้าต่าง</translation> <translation id="1841799852846221389">กำลังปิดใช้งานการเชื่อมต่อระยะไกลสำหรับคอมพิวเตอร์เครื่องนี้…</translation> -<translation id="189172778771606813">ปิดลิ้นชักการนำทาง</translation> <translation id="1897488610212723051">ลบ</translation> <translation id="195619862187186579">การจัดวางแป้นพิมพ์</translation> <translation id="1996161829609978754">Chrome กำลังดาวน์โหลดตัวติดตั้ง Chromoting Host เมื่อดาวน์โหลดเสร็จแล้ว โปรดเรียกใช้โปรแกรมติดตั้งก่อนดำเนินการต่อ</translation> @@ -114,6 +113,7 @@ Host</translation> <translation id="3870154837782082782">Google Inc.</translation> <translation id="3884839335308961732">โปรดยืนยันบัญชีและ PIN ของคุณด้านล่างเพื่ออนุญาตให้ Chrome Remote Desktop สามารถเข้าถึง</translation> +<translation id="3897092660631435901">เมนู</translation> <translation id="3905196214175737742">โดเมนเจ้าของโฮสต์ไม่ถูกต้อง</translation> <translation id="3908017899227008678">ลดขนาดให้พอดี</translation> <translation id="3931191050278863510">หยุดโฮสต์แล้ว</translation> @@ -166,7 +166,6 @@ <translation id="5070121137485264635">โฮสต์ระยะไกลกำหนดให้คุณตรวจสอบสิทธิ์กับเว็บไซต์ของบุคคลที่สาม หากต้องการดำเนินการต่อ คุณต้องให้สิทธิ์อนุญาตเพิ่มเติมแก่ Chrome Remote Desktop เพื่อเข้าถึงที่อยู่นี้:</translation> <translation id="507204348399810022">คุณแน่ใจไหมว่าต้องการปิดใช้การเชื่อมต่อระยะไกลกับ <ph name="HOSTNAME" /></translation> <translation id="5156271271724754543">โปรดป้อน PIN เดียวกันลงในทั้งสองช่อง</translation> -<translation id="5168917394043976756">เปิดลิ้นชักการนำทาง</translation> <translation id="5170982930780719864">รหัสโฮสต์ไม่ถูกต้อง</translation> <translation id="518094545883702183">ข้อมูลนี้จะใช้เพื่อวินิจฉัยปัญหาที่คุณรายงานเท่านั้น โดยจะมีเพียงผู้ตรวจสอบรายงานเท่านั้นที่ใช้งานได้ และจะมีการเก็บรักษาไว้ไม่เกิน 30 วัน</translation> <translation id="5222676887888702881">ออกจากระบบ</translation>
diff --git a/remoting/resources/remoting_strings_tr.xtb b/remoting/resources/remoting_strings_tr.xtb index 19d1338..f06ddfe 100644 --- a/remoting/resources/remoting_strings_tr.xtb +++ b/remoting/resources/remoting_strings_tr.xtb
@@ -33,7 +33,6 @@ <translation id="177096447311351977">İstemci için kanal IP'si: <ph name="CLIENT_GAIA_IDENTIFIER" /> ip="<ph name="CLIENT_IP_ADDRESS_AND_PORT" />" host_ip="<ph name="HOST_IP_ADDRESS_AND_PORT" />" channel="<ph name="CHANNEL_TYPE" />" connection="<ph name="CONNECTION_TYPE" />".</translation> <translation id="1779766957982586368">Pencereyi kapat</translation> <translation id="1841799852846221389">Bu bilgisayara uzaktan bağlantılar devre dışı bırakılıyor…</translation> -<translation id="189172778771606813">Gezinme çekmecesini kapat</translation> <translation id="1897488610212723051">Sil</translation> <translation id="195619862187186579">Klavye düzenleri</translation> <translation id="1996161829609978754">Chrome, Chromoting Ana Bilgisayar yükleyicisini indiriyor. İndirme işlemi tamamlandığında, devam etmeden önce lütfen yükleyiciyi çalıştırın.</translation> @@ -114,6 +113,7 @@ Ana Makinesi</translation> <translation id="3870154837782082782">Google Inc.</translation> <translation id="3884839335308961732">Chrome Uzaktan Masaüstü tarafından erişime izin vermek için lütfen aşağıda hesabınızı ve PIN kodunuzu onaylayın.</translation> +<translation id="3897092660631435901">Menü</translation> <translation id="3905196214175737742">Ana makinenin sahip alan adı geçersiz.</translation> <translation id="3908017899227008678">Sığacak şekilde küçült</translation> <translation id="3931191050278863510">Ana makine durdu.</translation> @@ -166,7 +166,6 @@ <translation id="5070121137485264635">Uzak ana makine üçüncü taraf bir web sitesine kimlik doğrulama işlemi yapmanızı gerektiriyor. Devam etmek üzere şu adrese erişim için Chrome Uzaktan Masaüstü'ne ek izinler vermelisiniz:</translation> <translation id="507204348399810022"><ph name="HOSTNAME" /> adlı ana bilgisayara uzaktan bağlantıları devre dışı bırakmak istediğinizden emin misiniz?</translation> <translation id="5156271271724754543">Lütfen her iki kutuya da aynı PIN'i girin.</translation> -<translation id="5168917394043976756">Gezinme çekmecesini aç</translation> <translation id="5170982930780719864">Ana makine kimliği geçersiz.</translation> <translation id="518094545883702183">Bu bilgi yalnızca bildirdiğiniz sorunun teşhisi için kullanılır, yalnızca raporunuzu araştıran kişi tarafından görülebilir ve en fazla 30 gün tutulur.</translation> <translation id="5222676887888702881">Çıkış</translation>
diff --git a/remoting/resources/remoting_strings_uk.xtb b/remoting/resources/remoting_strings_uk.xtb index 4b10de69..84fc3ce 100644 --- a/remoting/resources/remoting_strings_uk.xtb +++ b/remoting/resources/remoting_strings_uk.xtb
@@ -33,7 +33,6 @@ <translation id="177096447311351977">IP-адреса каналу клієнта: <ph name="CLIENT_GAIA_IDENTIFIER" /> ip='<ph name="CLIENT_IP_ADDRESS_AND_PORT" />' host_ip='<ph name="HOST_IP_ADDRESS_AND_PORT" />' channel='<ph name="CHANNEL_TYPE" />' connection='<ph name="CONNECTION_TYPE" />'.</translation> <translation id="1779766957982586368">Закрити вікно</translation> <translation id="1841799852846221389">Вимкнення віддалених з’єднань для цього комп’ютера…</translation> -<translation id="189172778771606813">Закрити панель навігації</translation> <translation id="1897488610212723051">Видалити</translation> <translation id="195619862187186579">Розкладки клавіатури</translation> <translation id="1996161829609978754">Chrome завантажує програму встановлення хосту Віддаленого доступу ОС Chrome. Коли завантаження закінчиться, запустіть програму встановлення, перш ніж продовжити.</translation> @@ -114,6 +113,7 @@ доступу ОС Chrome</translation> <translation id="3870154837782082782">Google Inc.</translation> <translation id="3884839335308961732">Підтвердьте свій обліковий запис і PIN-код нижче, щоб дозволити Віддалене керування Chrome.</translation> +<translation id="3897092660631435901">Меню</translation> <translation id="3905196214175737742">Недійсний домен власника хосту.</translation> <translation id="3908017899227008678">Зменшити до розмірів вікна</translation> <translation id="3931191050278863510">Хост не працює.</translation> @@ -166,7 +166,6 @@ <translation id="5070121137485264635">Віддалений хост вимагає, щоб ви автентифікувалися на веб-сайті третьої сторони. Щоб продовжити, програмі Віддалене керування Chrome потрібно надати додаткові дозволи для доступу до цієї адреси:</translation> <translation id="507204348399810022">Вимкнути віддалене з’єднання з хостом "<ph name="HOSTNAME" />"?</translation> <translation id="5156271271724754543">Введіть однаковий PIN-код в обох полях.</translation> -<translation id="5168917394043976756">Відкрити панель навігації</translation> <translation id="5170982930780719864">Недійсний ідентифікатор хосту.</translation> <translation id="518094545883702183">Ці дані потрібні лише для діагностики вашої проблеми. Вони надаються лише особі, яка розглядає вашу заявку, і зберігаються до 30 днів.</translation> <translation id="5222676887888702881">Вийти</translation>
diff --git a/remoting/resources/remoting_strings_vi.xtb b/remoting/resources/remoting_strings_vi.xtb index bc3d03b..e342e30 100644 --- a/remoting/resources/remoting_strings_vi.xtb +++ b/remoting/resources/remoting_strings_vi.xtb
@@ -33,7 +33,6 @@ <translation id="177096447311351977">IP kênh dành cho ứng dụng khách: <ph name="CLIENT_GAIA_IDENTIFIER" /> ip='<ph name="CLIENT_IP_ADDRESS_AND_PORT" />' host_ip='<ph name="HOST_IP_ADDRESS_AND_PORT" />' kênh='<ph name="CHANNEL_TYPE" />' kết nối='<ph name="CONNECTION_TYPE" />'.</translation> <translation id="1779766957982586368">Đóng cửa sổ</translation> <translation id="1841799852846221389">Đang tắt kết nối từ xa cho máy tính này…</translation> -<translation id="189172778771606813">Đóng ngăn điều hướng</translation> <translation id="1897488610212723051">Xóa</translation> <translation id="195619862187186579">Bố cục bàn phím</translation> <translation id="1996161829609978754">Chrome đang tải xuống trình cài đặt máy chủ Kết nối từ xa trên Chrome. Sau khi quá trình tải xuống hoàn tất, vui lòng chạy trình cài đặt trước khi tiếp tục.</translation> @@ -114,6 +113,7 @@ trên Chrome</translation> <translation id="3870154837782082782">Google Inc.</translation> <translation id="3884839335308961732">Vui lòng xác nhận tài khoản và mã PIN của bạn bên dưới để cho phép Chrome Remote Desktop truy cập.</translation> +<translation id="3897092660631435901">Menu</translation> <translation id="3905196214175737742">Miền của chủ sở hữu máy chủ không hợp lệ.</translation> <translation id="3908017899227008678">Co lại cho vừa</translation> <translation id="3931191050278863510">Máy chủ đã dừng lại.</translation> @@ -166,7 +166,6 @@ <translation id="5070121137485264635">Máy chủ lưu trữ từ xa yêu cầu bạn xác thực với một trang web của bên thứ ba. Để tiếp tục, bạn phải cấp cho Chrome Remote Desktop thêm quyền truy cập vào địa chỉ sau:</translation> <translation id="507204348399810022">Bạn có chắc chắn muốn tắt kết nối từ xa với <ph name="HOSTNAME" /> không?</translation> <translation id="5156271271724754543">Vui lòng nhập cùng một mã PIN vào cả hai hộp.</translation> -<translation id="5168917394043976756">Mở ngăn điều hướng</translation> <translation id="5170982930780719864">Id máy chủ không hợp lệ.</translation> <translation id="518094545883702183">Thông tin này chỉ được sử dụng để chẩn đoán sự cố bạn đang báo cáo, chỉ khả dụng đối với người điều tra báo cáo của bạn và được giữ lại tối đa 30 ngày.</translation> <translation id="5222676887888702881">Đăng xuất</translation>
diff --git a/remoting/resources/remoting_strings_zh-CN.xtb b/remoting/resources/remoting_strings_zh-CN.xtb index 05e8357..ebf927a 100644 --- a/remoting/resources/remoting_strings_zh-CN.xtb +++ b/remoting/resources/remoting_strings_zh-CN.xtb
@@ -33,7 +33,6 @@ <translation id="177096447311351977">客户端信道 IP:<ph name="CLIENT_GAIA_IDENTIFIER" /> ip='<ph name="CLIENT_IP_ADDRESS_AND_PORT" />' host_ip='<ph name="HOST_IP_ADDRESS_AND_PORT" />' channel='<ph name="CHANNEL_TYPE" />' connection='<ph name="CONNECTION_TYPE" />'。</translation> <translation id="1779766957982586368">关闭窗口</translation> <translation id="1841799852846221389">正在对此计算机停用远程连接…</translation> -<translation id="189172778771606813">关闭抽屉式导航栏</translation> <translation id="1897488610212723051">删除</translation> <translation id="195619862187186579">键盘布局</translation> <translation id="1996161829609978754">Chrome 正在下载 Chrome 远程访问主机安装程序。下载完成后,请先运行该安装程序,再继续操作。</translation> @@ -114,6 +113,7 @@ 访问主机</translation> <translation id="3870154837782082782">Google Inc.</translation> <translation id="3884839335308961732">请在下方确认您的帐户和 PIN,以便允许通过 Chrome 远程桌面进行访问。</translation> +<translation id="3897092660631435901">菜单</translation> <translation id="3905196214175737742">主机所有者所在网域无效。</translation> <translation id="3908017899227008678">缩小以适合浏览器窗口大小</translation> <translation id="3931191050278863510">主机已停止运行。</translation> @@ -166,7 +166,6 @@ <translation id="5070121137485264635">远程主机要求您对第三方网站进行身份验证。要继续操作,您必须向 Chrome 远程桌面授予访问以下地址的额外权限:</translation> <translation id="507204348399810022">确定要停用与“<ph name="HOSTNAME" />”的远程连接吗?</translation> <translation id="5156271271724754543">请在两个框中输入相同的 PIN。</translation> -<translation id="5168917394043976756">打开抽屉式导航栏</translation> <translation id="5170982930780719864">主机 ID 无效。</translation> <translation id="518094545883702183">这些信息仅用于诊断您报告的问题,并且只有负责对您报告的问题进行调查的人员才可使用。这些信息的保留时间不会超过 30 天。</translation> <translation id="5222676887888702881">退出</translation>
diff --git a/remoting/resources/remoting_strings_zh-TW.xtb b/remoting/resources/remoting_strings_zh-TW.xtb index e376549..f6a55f8 100644 --- a/remoting/resources/remoting_strings_zh-TW.xtb +++ b/remoting/resources/remoting_strings_zh-TW.xtb
@@ -33,7 +33,6 @@ <translation id="177096447311351977">用戶端版本 IP:<ph name="CLIENT_GAIA_IDENTIFIER" /> ip='<ph name="CLIENT_IP_ADDRESS_AND_PORT" />' host_ip='<ph name="HOST_IP_ADDRESS_AND_PORT" />' channel='<ph name="CHANNEL_TYPE" />' connection='<ph name="CONNECTION_TYPE" />'。</translation> <translation id="1779766957982586368">關閉視窗</translation> <translation id="1841799852846221389">正在停用這台電腦的遠端連線...</translation> -<translation id="189172778771606813">關閉導覽匣</translation> <translation id="1897488610212723051">刪除</translation> <translation id="195619862187186579">鍵盤配置</translation> <translation id="1996161829609978754">Chrome 正在下載 Chromoting 主機安裝程式。下載完成後,請先執行安裝程式,然後再繼續操作。</translation> @@ -114,6 +113,7 @@ 主機</translation> <translation id="3870154837782082782">Google Inc.</translation> <translation id="3884839335308961732">請在下方確認您的帳戶和 PIN,以便授予 Chrome 遠端桌面存取權限。</translation> +<translation id="3897092660631435901">選單</translation> <translation id="3905196214175737742">主機擁有者網域無效。</translation> <translation id="3908017899227008678">縮小以符合視窗大小</translation> <translation id="3931191050278863510">主機已停止。</translation> @@ -166,7 +166,6 @@ <translation id="5070121137485264635">遠端主機要求您向第三方網站進行驗證。如要繼續,您必須授予額外權限,讓 Chrome 遠端桌面能夠存取這個位址:</translation> <translation id="507204348399810022">您確定要停用與「<ph name="HOSTNAME" />」之間的遠端連線嗎?</translation> <translation id="5156271271724754543">請在兩個方塊中輸入相同的 PIN。</translation> -<translation id="5168917394043976756">開啟導覽匣</translation> <translation id="5170982930780719864">主機 ID 無效。</translation> <translation id="518094545883702183">這些資訊只會用於診斷您所回報的問題,並且僅供相關調查人員存取。此外,系統會在 30 天後刪除這些資訊。</translation> <translation id="5222676887888702881">登出</translation>
diff --git a/remoting/signaling/delegating_signal_strategy.cc b/remoting/signaling/delegating_signal_strategy.cc index d1a374a..693eab38 100644 --- a/remoting/signaling/delegating_signal_strategy.cc +++ b/remoting/signaling/delegating_signal_strategy.cc
@@ -46,8 +46,8 @@ void DelegatingSignalStrategy::Connect() { DCHECK(client_task_runner_->BelongsToCurrentThread()); - FOR_EACH_OBSERVER(Listener, listeners_, - OnSignalStrategyStateChange(CONNECTED)); + for (auto& observer : listeners_) + observer.OnSignalStrategyStateChange(CONNECTED); } void DelegatingSignalStrategy::Disconnect() {
diff --git a/remoting/signaling/fake_signal_strategy.cc b/remoting/signaling/fake_signal_strategy.cc index 69af43d7..fffc0476 100644 --- a/remoting/signaling/fake_signal_strategy.cc +++ b/remoting/signaling/fake_signal_strategy.cc
@@ -65,14 +65,14 @@ void FakeSignalStrategy::Connect() { DCHECK(CalledOnValidThread()); - FOR_EACH_OBSERVER(Listener, listeners_, - OnSignalStrategyStateChange(CONNECTED)); + for (auto& observer : listeners_) + observer.OnSignalStrategyStateChange(CONNECTED); } void FakeSignalStrategy::Disconnect() { DCHECK(CalledOnValidThread()); - FOR_EACH_OBSERVER(Listener, listeners_, - OnSignalStrategyStateChange(DISCONNECTED)); + for (auto& observer : listeners_) + observer.OnSignalStrategyStateChange(DISCONNECTED); } SignalStrategy::State FakeSignalStrategy::GetState() const {
diff --git a/remoting/signaling/xmpp_signal_strategy.cc b/remoting/signaling/xmpp_signal_strategy.cc index 591dac2..8a019e4 100644 --- a/remoting/signaling/xmpp_signal_strategy.cc +++ b/remoting/signaling/xmpp_signal_strategy.cc
@@ -174,8 +174,8 @@ error_ = OK; - FOR_EACH_OBSERVER(Listener, listeners_, - OnSignalStrategyStateChange(CONNECTING)); + for (auto& observer : listeners_) + observer.OnSignalStrategyStateChange(CONNECTING); socket_.reset(new jingle_glue::ProxyResolvingClientSocket( socket_factory_, request_context_getter_, net::SSLConfig(), @@ -203,8 +203,8 @@ tls_state_ = TlsState::NOT_REQUESTED; read_pending_ = false; - FOR_EACH_OBSERVER(Listener, listeners_, - OnSignalStrategyStateChange(DISCONNECTED)); + for (auto& observer : listeners_) + observer.OnSignalStrategyStateChange(DISCONNECTED); } } @@ -336,8 +336,8 @@ // Don't need |login_handler_| anymore. login_handler_.reset(); - FOR_EACH_OBSERVER(Listener, listeners_, - OnSignalStrategyStateChange(CONNECTED)); + for (auto& observer : listeners_) + observer.OnSignalStrategyStateChange(CONNECTED); } void XmppSignalStrategy::Core::OnLoginHandlerError(
diff --git a/remoting/test/cyclic_frame_generator.cc b/remoting/test/cyclic_frame_generator.cc index 11c8bc5..ef59810e 100644 --- a/remoting/test/cyclic_frame_generator.cc +++ b/remoting/test/cyclic_frame_generator.cc
@@ -48,6 +48,7 @@ std::unique_ptr<webrtc::DesktopFrame> CyclicFrameGenerator::GenerateFrame( webrtc::SharedMemoryFactory* shared_memory_factory) { base::TimeTicks now = clock_->NowTicks(); + int frame_id = (now - started_time_) / cursor_blink_period_; int reference_frame = ((now - started_time_) / frame_cycle_period_) % reference_frames_.size(); @@ -80,20 +81,15 @@ last_frame_type_ = ChangeType::NO_CHANGES; } - if (draw_barcode_) - DrawBarcode(frame_id, frame_id != last_frame_id_, frame.get()); - last_reference_frame_ = reference_frame; last_cursor_state_ = cursor_state; - last_frame_id_ = frame_id; return frame; } CyclicFrameGenerator::ChangeInfoList CyclicFrameGenerator::GetChangeList( - webrtc::DesktopFrame* frame) { - CHECK(draw_barcode_); - int frame_id = ReadBarcode(*frame); + base::TimeTicks timestamp) { + int frame_id = (timestamp - started_time_) / cursor_blink_period_; CHECK_GE(frame_id, last_identifier_frame_); ChangeInfoList result; @@ -110,5 +106,10 @@ return result; } +protocol::InputEventTimestamps CyclicFrameGenerator::TakeLastEventTimestamps() { + base::TimeTicks now = clock_->NowTicks(); + return protocol::InputEventTimestamps{now, now}; +} + } // namespace test } // namespace remoting
diff --git a/remoting/test/cyclic_frame_generator.h b/remoting/test/cyclic_frame_generator.h index d03118a7..4c2fa45 100644 --- a/remoting/test/cyclic_frame_generator.h +++ b/remoting/test/cyclic_frame_generator.h
@@ -9,8 +9,10 @@ #include <memory> #include <vector> +#include "base/callback.h" #include "base/memory/ref_counted.h" #include "base/time/default_tick_clock.h" +#include "remoting/protocol/input_event_timestamps.h" #include "third_party/webrtc/modules/desktop_capture/desktop_capturer.h" namespace remoting { @@ -21,8 +23,7 @@ // loads a sequence of reference frames and switches between them with the // specified frequency (every 2 seconds by default). Between reference frames it // also generate frames with small changes which simulate a blinking cursor. -class CyclicFrameGenerator - : public base::RefCountedThreadSafe<CyclicFrameGenerator> { +class CyclicFrameGenerator : public protocol::InputEventTimestampsSource { public: enum class ChangeType { // No changes. @@ -60,25 +61,22 @@ void SetTickClock(base::TickClock* tick_clock); - // When |draw_barcode| is set to true a barcode is drawn on each generated - // frame. This makes it possible to call GetChangeList() to identify the frame - // by its content. - void set_draw_barcode(bool draw_barcode) { draw_barcode_ = draw_barcode; } - std::unique_ptr<webrtc::DesktopFrame> GenerateFrame( webrtc::SharedMemoryFactory* shared_memory_factory); ChangeType last_frame_type() { return last_frame_type_; } - // Identifies |frame| by its content and returns list of ChangeInfo for all - // changes between the frame passed to the previous GetChangeList() call and - // this one. GetChangeList() must be called for the frames in the order in - // which they were received, which is expected to match the order in which - // they are generated. - ChangeInfoList GetChangeList(webrtc::DesktopFrame* frame); + // Returns list of changes for the frame with the specified |timestamp|, which + // should be an event timestamp generated by InputEventTimestampsSource + // implemented in this class. Must be called in the same order in which frames + // were generated. + ChangeInfoList GetChangeList(base::TimeTicks timestamp); + + // InputEventTimestampsSource interface. + protocol::InputEventTimestamps TakeLastEventTimestamps() override; private: - ~CyclicFrameGenerator(); + ~CyclicFrameGenerator() override; friend class base::RefCountedThreadSafe<CyclicFrameGenerator>; std::vector<std::unique_ptr<webrtc::DesktopFrame>> reference_frames_; @@ -92,9 +90,6 @@ // By default blink the cursor 4 times per seconds. base::TimeDelta cursor_blink_period_ = base::TimeDelta::FromMilliseconds(250); - // Id of the last frame encoded on the barcode. - int last_frame_id_ = -1; - // Index of the reference frame used to render the last generated frame. int last_reference_frame_ = -1; @@ -103,8 +98,6 @@ ChangeType last_frame_type_ = ChangeType::NO_CHANGES; - bool draw_barcode_ = false; - base::TimeTicks started_time_; // frame_id of the frame passed to the last GetChangeList() call.
diff --git a/remoting/test/frame_generator_util.cc b/remoting/test/frame_generator_util.cc index c84115a..bf78b0f 100644 --- a/remoting/test/frame_generator_util.cc +++ b/remoting/test/frame_generator_util.cc
@@ -15,14 +15,6 @@ namespace remoting { namespace test { -namespace { -const int kBarcodeCellWidth = 8; -const int kBarcodeCellHeight = 8; -const int kBarcodeBits = 10; -const int kBarcodeBlackThreshold = 85; -const int kBarcodeWhiteThreshold = 170; -} // namespace - std::unique_ptr<webrtc::DesktopFrame> LoadDesktopFrameFromPng( const char* name) { base::FilePath file_path; @@ -59,47 +51,5 @@ } } -void DrawBarcode(int value, bool changed, webrtc::DesktopFrame* frame) { - CHECK(value < (1 << kBarcodeBits)); - for (int i = 0; i < kBarcodeBits; ++i) { - DrawRect(frame, webrtc::DesktopRect::MakeXYWH(i * kBarcodeCellWidth, 0, - kBarcodeCellWidth, - kBarcodeCellHeight), - (value & 1) ? 0xffffffff : 0xff000000); - value >>= 1; - } - if (changed) { - frame->mutable_updated_region()->AddRect(webrtc::DesktopRect::MakeXYWH( - 0, 0, kBarcodeCellWidth * kBarcodeBits, kBarcodeCellHeight)); - } -} - -int ReadBarcode(const webrtc::DesktopFrame& frame) { - int result = 0; - for (int i = kBarcodeBits - 1; i >= 0; --i) { - // Sample barcode in the center of the cell for each bit. - int x = i * kBarcodeCellWidth + kBarcodeCellWidth / 2; - int y = kBarcodeCellHeight / 2; - uint8_t* data = frame.GetFrameDataAtPos(webrtc::DesktopVector(x, y)); - int b = data[0]; - int g = data[1]; - int r = data[2]; - bool bit = 0; - if (b > kBarcodeWhiteThreshold && g > kBarcodeWhiteThreshold && - r > kBarcodeWhiteThreshold) { - bit = 1; - } else if (b < kBarcodeBlackThreshold && g < kBarcodeBlackThreshold && - r < kBarcodeBlackThreshold) { - bit = 0; - } else { - LOG(FATAL) << "Invalid barcode."; - } - result <<= 1; - if (bit) - result |= 1; - } - return result; -} - } // namespace test } // namespace remoting
diff --git a/remoting/test/frame_generator_util.h b/remoting/test/frame_generator_util.h index e0f7c53..719ce33e 100644 --- a/remoting/test/frame_generator_util.h +++ b/remoting/test/frame_generator_util.h
@@ -24,13 +24,6 @@ webrtc::DesktopRect rect, uint32_t color); -// Draws barcode that encodes |value| on the |frame|. If |changed| is true then -// frame->updated_region() will be updated as well. -void DrawBarcode(int value, bool changed, webrtc::DesktopFrame* frame); - -// Reads barcode from the frame. -int ReadBarcode(const webrtc::DesktopFrame& frame); - } // namespace test } // namespace remoting
diff --git a/remoting/test/protocol_perftest.cc b/remoting/test/protocol_perftest.cc index f243cfb4..f7d0907a 100644 --- a/remoting/test/protocol_perftest.cc +++ b/remoting/test/protocol_perftest.cc
@@ -163,6 +163,10 @@ // FrameStatsConsumer interface. void OnVideoFrameStats(const protocol::FrameStats& frame_stats) override { + // Ignore store stats for empty frames. + if (!frame_stats.host_stats.frame_size) + return; + frame_stats_.push_back(frame_stats); if (waiting_frame_stats_loop_ && @@ -172,6 +176,14 @@ } // HostStatusObserver interface. + void OnClientAuthenticated(const std::string& jid) override { + if (event_timestamp_source_) { + auto& session = host_->client_sessions_for_tests().front(); + session->SetEventTimestampsSourceForTests( + std::move(event_timestamp_source_)); + } + } + void OnClientConnected(const std::string& jid) override { message_loop_.task_runner()->PostTask( FROM_HERE, base::Bind(&ProtocolPerfTest::OnHostConnectedMainThread, @@ -360,6 +372,8 @@ base::Thread decode_thread_; std::unique_ptr<FakeDesktopEnvironmentFactory> desktop_environment_factory_; + scoped_refptr<protocol::InputEventTimestampsSource> event_timestamp_source_; + FakeCursorShapeStub cursor_shape_stub_; std::unique_ptr<protocol::CandidateSessionConfig> protocol_config_; @@ -436,58 +450,76 @@ void ProtocolPerfTest::MeasureTotalLatency(bool use_webrtc) { scoped_refptr<test::CyclicFrameGenerator> frame_generator = test::CyclicFrameGenerator::Create(); - frame_generator->set_draw_barcode(true); - desktop_environment_factory_->set_frame_generator( base::Bind(&test::CyclicFrameGenerator::GenerateFrame, frame_generator)); + event_timestamp_source_ = frame_generator; StartHostAndClient(use_webrtc); ASSERT_NO_FATAL_FAILURE(WaitConnected()); - int skipped_frames = 0; - while (skipped_frames < 10) { - std::unique_ptr<webrtc::DesktopFrame> frame = ReceiveFrame(); - test::CyclicFrameGenerator::ChangeInfoList changes = - frame_generator->GetChangeList(frame.get()); - skipped_frames += changes.size(); + int total_frames = 0; + + const base::TimeDelta kWarmUpTime = base::TimeDelta::FromSeconds(2); + const base::TimeDelta kTestTime = base::TimeDelta::FromSeconds(5); + + base::TimeTicks start_time = base::TimeTicks::Now(); + while ((base::TimeTicks::Now() - start_time) < (kWarmUpTime + kTestTime)) { + ReceiveFrame(); + ++total_frames; } - base::TimeDelta total_latency_big_frames; - int big_frame_count = 0; - base::TimeDelta total_latency_small_frames; - int small_frame_count = 0; + WaitFrameStats(total_frames); - while (big_frame_count + small_frame_count < 30) { - std::unique_ptr<webrtc::DesktopFrame> frame = ReceiveFrame(); - base::TimeTicks frame_received_time = base::TimeTicks::Now(); + int warm_up_frames = 0; + + int big_update_count = 0; + base::TimeDelta total_latency_big_updates; + int small_update_count = 0; + base::TimeDelta total_latency_small_updates; + for (int i = 0; i < total_frames; ++i) { + const protocol::FrameStats& stats = frame_stats_[i]; + + // CyclicFrameGenerator::TakeLastEventTimestamps() always returns non-null + // timestamps. + CHECK(!stats.host_stats.latest_event_timestamp.is_null()); + test::CyclicFrameGenerator::ChangeInfoList changes = - frame_generator->GetChangeList(frame.get()); + frame_generator->GetChangeList(stats.host_stats.latest_event_timestamp); + + // Allow 2 seconds for the connection to warm-up, e.g. to get bandwidth + // estimate, etc. These frames are ignored when calculating stats below. + if (stats.client_stats.time_rendered < (start_time + kWarmUpTime)) { + ++warm_up_frames; + continue; + } + for (auto& change_info : changes) { - base::TimeDelta latency = frame_received_time - change_info.timestamp; + base::TimeDelta latency = + stats.client_stats.time_rendered - change_info.timestamp; switch (change_info.type) { case test::CyclicFrameGenerator::ChangeType::NO_CHANGES: NOTREACHED(); break; case test::CyclicFrameGenerator::ChangeType::FULL: - total_latency_big_frames += latency; - ++big_frame_count; + total_latency_big_updates += latency; + ++big_update_count; break; case test::CyclicFrameGenerator::ChangeType::CURSOR: - total_latency_small_frames += latency; - ++small_frame_count; + total_latency_small_updates += latency; + ++small_update_count; break; } } } - CHECK(big_frame_count); - VLOG(0) << "Average latency for big frames: " - << (total_latency_big_frames / big_frame_count).InMillisecondsF(); + CHECK(big_update_count); + VLOG(0) << "Average latency for big updates: " + << (total_latency_big_updates / big_update_count).InMillisecondsF(); - if (small_frame_count) { + if (small_update_count) { VLOG(0) - << "Average latency for small frames: " - << (total_latency_small_frames / small_frame_count).InMillisecondsF(); + << "Average latency for small updates: " + << (total_latency_small_updates / small_update_count).InMillisecondsF(); } } @@ -504,34 +536,29 @@ void ProtocolPerfTest::MeasureScrollPerformance(bool use_webrtc) { scoped_refptr<test::ScrollFrameGenerator> frame_generator = new test::ScrollFrameGenerator(); - desktop_environment_factory_->set_frame_generator( base::Bind(&test::ScrollFrameGenerator::GenerateFrame, frame_generator)); + event_timestamp_source_ = frame_generator; StartHostAndClient(use_webrtc); ASSERT_NO_FATAL_FAILURE(WaitConnected()); - int warm_up_frames = 0; - - base::TimeTicks start_time = base::TimeTicks::Now(); const base::TimeDelta kWarmUpTime = base::TimeDelta::FromSeconds(2); - while ((base::TimeTicks::Now() - start_time) < kWarmUpTime) { - ReceiveFrame(); - ++warm_up_frames; - } - - client_socket_factory_->ResetStats(); - - // Run the test for 2 seconds. const base::TimeDelta kTestTime = base::TimeDelta::FromSeconds(2); int num_frames = 0; - base::TimeDelta latency_sum; - start_time = base::TimeTicks::Now(); - while ((base::TimeTicks::Now() - start_time) < kTestTime) { - std::unique_ptr<webrtc::DesktopFrame> frame = ReceiveFrame(); + int warm_up_frames = 0; + base::TimeTicks start_time = base::TimeTicks::Now(); + while ((base::TimeTicks::Now() - start_time) < (kTestTime + kWarmUpTime)) { + ReceiveFrame(); ++num_frames; - latency_sum += frame_generator->GetFrameLatency(*frame); + + // Allow 2 seconds for the connection to warm-up, e.g. to get bandwidth + // estimate, etc. These frames are ignored when calculating stats below. + if ((base::TimeTicks::Now() - start_time) < kWarmUpTime) { + ++warm_up_frames; + client_socket_factory_->ResetStats(); + } } base::TimeDelta total_time = (base::TimeTicks::Now() - start_time); @@ -545,6 +572,14 @@ return sum + stats.host_stats.frame_size; }); + base::TimeDelta latency_sum = std::accumulate( + frame_stats_.begin() + warm_up_frames, + frame_stats_.begin() + warm_up_frames + num_frames, base::TimeDelta(), + [](base::TimeDelta sum, const protocol::FrameStats& stats) { + return sum + (stats.client_stats.time_rendered - + stats.host_stats.latest_event_timestamp); + }); + VLOG(0) << "FPS: " << num_frames / total_time.InSecondsF(); VLOG(0) << "Average latency: " << latency_sum.InMillisecondsF() / num_frames << " ms";
diff --git a/remoting/test/scroll_frame_generator.cc b/remoting/test/scroll_frame_generator.cc index 1a6a1ec..01e0af2 100644 --- a/remoting/test/scroll_frame_generator.cc +++ b/remoting/test/scroll_frame_generator.cc
@@ -41,19 +41,12 @@ result->mutable_updated_region()->SetRect( webrtc::DesktopRect::MakeSize(result->size())); - ++last_frame_id_; - frame_timestamp_[last_frame_id_] = now; - DrawBarcode(last_frame_id_, true, result.get()); - return result; } -base::TimeDelta ScrollFrameGenerator::GetFrameLatency( - const webrtc::DesktopFrame& frame) { - int frame_id = ReadBarcode(frame); - if (!frame_timestamp_.count(frame_id)) - LOG(FATAL) << "Unknown frame_id."; - return base::TimeTicks::Now() - frame_timestamp_[frame_id]; +protocol::InputEventTimestamps ScrollFrameGenerator::TakeLastEventTimestamps() { + base::TimeTicks now = base::TimeTicks::Now(); + return protocol::InputEventTimestamps{now, now}; } } // namespace test
diff --git a/remoting/test/scroll_frame_generator.h b/remoting/test/scroll_frame_generator.h index 762ad7bd..e7605971 100644 --- a/remoting/test/scroll_frame_generator.h +++ b/remoting/test/scroll_frame_generator.h
@@ -10,33 +10,30 @@ #include "base/memory/ref_counted.h" #include "base/time/time.h" +#include "remoting/protocol/input_event_timestamps.h" #include "third_party/webrtc/modules/desktop_capture/desktop_capturer.h" namespace remoting { namespace test { -class ScrollFrameGenerator - : public base::RefCountedThreadSafe<ScrollFrameGenerator> { +class ScrollFrameGenerator : public protocol::InputEventTimestampsSource { public: ScrollFrameGenerator(); std::unique_ptr<webrtc::DesktopFrame> GenerateFrame( webrtc::SharedMemoryFactory* shared_memory_factory); - base::TimeDelta GetFrameLatency(const webrtc::DesktopFrame& frame); + // InputEventTimestampsSource interface. + protocol::InputEventTimestamps TakeLastEventTimestamps() override; private: - ~ScrollFrameGenerator(); - friend class base::RefCountedThreadSafe<ScrollFrameGenerator>; + ~ScrollFrameGenerator() override; std::unique_ptr<webrtc::DesktopFrame> base_frame_; base::TimeTicks start_time_; std::unordered_map<int, base::TimeTicks> frame_timestamp_; - // Id of the last frame encoded on the barcode. - int last_frame_id_ = -1; - DISALLOW_COPY_AND_ASSIGN(ScrollFrameGenerator); };
diff --git a/remoting/test/test_chromoting_client.cc b/remoting/test/test_chromoting_client.cc index 4e5eb324..cdbb8d9 100644 --- a/remoting/test/test_chromoting_client.cc +++ b/remoting/test/test_chromoting_client.cc
@@ -197,16 +197,16 @@ connection_error_code_ = error_code; connection_to_host_state_ = state; - FOR_EACH_OBSERVER(RemoteConnectionObserver, connection_observers_, - ConnectionStateChanged(state, error_code)); + for (auto& observer : connection_observers_) + observer.ConnectionStateChanged(state, error_code); } void TestChromotingClient::OnConnectionReady(bool ready) { VLOG(1) << "TestChromotingClient::OnConnectionReady(" << "ready:" << ready << ") Called"; - FOR_EACH_OBSERVER(RemoteConnectionObserver, connection_observers_, - ConnectionReady(ready)); + for (auto& observer : connection_observers_) + observer.ConnectionReady(ready); } void TestChromotingClient::OnRouteChanged( @@ -217,16 +217,16 @@ << "route:" << protocol::TransportRoute::GetTypeString(route.type) << ") Called"; - FOR_EACH_OBSERVER(RemoteConnectionObserver, connection_observers_, - RouteChanged(channel_name, route)); + for (auto& observer : connection_observers_) + observer.RouteChanged(channel_name, route); } void TestChromotingClient::SetCapabilities(const std::string& capabilities) { VLOG(1) << "TestChromotingClient::SetCapabilities(" << "capabilities: " << capabilities << ") Called"; - FOR_EACH_OBSERVER(RemoteConnectionObserver, connection_observers_, - CapabilitiesSet(capabilities)); + for (auto& observer : connection_observers_) + observer.CapabilitiesSet(capabilities); } void TestChromotingClient::SetPairingResponse( @@ -236,8 +236,8 @@ << "shared_secret: " << pairing_response.shared_secret() << ") Called"; - FOR_EACH_OBSERVER(RemoteConnectionObserver, connection_observers_, - PairingResponseSet(pairing_response)); + for (auto& observer : connection_observers_) + observer.PairingResponseSet(pairing_response); } void TestChromotingClient::DeliverHostMessage( @@ -246,8 +246,8 @@ << "type: " << message.type() << ", " << "data: " << message.data() << ") Called"; - FOR_EACH_OBSERVER(RemoteConnectionObserver, connection_observers_, - HostMessageReceived(message)); + for (auto& observer : connection_observers_) + observer.HostMessageReceived(message); } void TestChromotingClient::SetDesktopSize(const webrtc::DesktopSize& size,
diff --git a/remoting/tools/remove_spaces.py b/remoting/tools/remove_spaces.py new file mode 100755 index 0000000..7eefb387 --- /dev/null +++ b/remoting/tools/remove_spaces.py
@@ -0,0 +1,21 @@ +#!/usr/bin/env python +# +# 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. + +"""Removes spaces from a given string.""" + +import sys + +def main(): + if len(sys.argv) < 1: + print 'Usage: %s <string>' % sys.argv[0] + sys.exit(1) + + # Takes all arguments passed in, joins as one string, and removes spaces. + nospace = "".join(sys.argv[1:]).replace(" ", "") + print(nospace) + +if __name__ == '__main__': + sys.exit(main())
diff --git a/services/catalog/data/capabilities b/services/catalog/data/connection_spec similarity index 100% rename from services/catalog/data/capabilities rename to services/catalog/data/connection_spec
diff --git a/services/catalog/entry.cc b/services/catalog/entry.cc index 72a0ff5..3032a0b 100644 --- a/services/catalog/entry.cc +++ b/services/catalog/entry.cc
@@ -35,55 +35,59 @@ return ReadStringSet(*list_value, string_set); } -bool BuildCapabilities(const base::DictionaryValue& value, - service_manager::CapabilitySpec* capabilities) { - DCHECK(capabilities); - const base::DictionaryValue* provided_value = nullptr; - if (value.HasKey(Store::kCapabilities_ProvidedKey) && - !value.GetDictionary(Store::kCapabilities_ProvidedKey, - &provided_value)) { - LOG(ERROR) << "Entry::Deserialize: " << Store::kCapabilities_ProvidedKey +bool BuildInterfaceProviderSpecs( + const base::DictionaryValue& value, + service_manager::InterfaceProviderSpec* interface_provider_specs) { + DCHECK(interface_provider_specs); + const base::DictionaryValue* provides_value = nullptr; + if (value.HasKey(Store::kInterfaceProviderSpecs_ProvidesKey) && + !value.GetDictionary(Store::kInterfaceProviderSpecs_ProvidesKey, + &provides_value)) { + LOG(ERROR) << "Entry::Deserialize: " + << Store::kInterfaceProviderSpecs_ProvidesKey << " must be a dictionary."; return false; } - if (provided_value) { - base::DictionaryValue::Iterator it(*provided_value); + if (provides_value) { + base::DictionaryValue::Iterator it(*provides_value); for(; !it.IsAtEnd(); it.Advance()) { - service_manager::Interfaces interfaces; + service_manager::InterfaceSet interfaces; if (!ReadStringSetFromValue(it.value(), &interfaces)) { LOG(ERROR) << "Entry::Deserialize: Invalid interface list in provided " - << " classes dictionary"; + << " capabilities dictionary"; return false; } - capabilities->provided[it.key()] = interfaces; + interface_provider_specs->provides[it.key()] = interfaces; } } - const base::DictionaryValue* required_value = nullptr; - if (value.HasKey(Store::kCapabilities_RequiredKey) && - !value.GetDictionary(Store::kCapabilities_RequiredKey, - &required_value)) { - LOG(ERROR) << "Entry::Deserialize: " << Store::kCapabilities_RequiredKey + const base::DictionaryValue* requires_value = nullptr; + if (value.HasKey(Store::kInterfaceProviderSpecs_RequiresKey) && + !value.GetDictionary(Store::kInterfaceProviderSpecs_RequiresKey, + &requires_value)) { + LOG(ERROR) << "Entry::Deserialize: " + << Store::kInterfaceProviderSpecs_RequiresKey << " must be a dictionary."; return false; } - if (required_value) { - base::DictionaryValue::Iterator it(*required_value); + if (requires_value) { + base::DictionaryValue::Iterator it(*requires_value); for (; !it.IsAtEnd(); it.Advance()) { - service_manager::Classes classes; + service_manager::CapabilitySet capabilities; const base::ListValue* entry_value = nullptr; if (!it.value().GetAsList(&entry_value)) { - LOG(ERROR) << "Entry::Deserialize: " << Store::kCapabilities_RequiredKey + LOG(ERROR) << "Entry::Deserialize: " + << Store::kInterfaceProviderSpecs_RequiresKey << " entry must be a list."; return false; } - if (!ReadStringSet(*entry_value, &classes)) { - LOG(ERROR) << "Entry::Deserialize: Invalid classes list in required " - << "capabilities dictionary."; + if (!ReadStringSet(*entry_value, &capabilities)) { + LOG(ERROR) << "Entry::Deserialize: Invalid capabilities list in " + << "requires dictionary."; return false; } - capabilities->required[it.key()] = classes; + interface_provider_specs->requires[it.key()] = capabilities; } } return true; @@ -106,25 +110,25 @@ value->SetString(Store::kQualifierKey, qualifier_); std::unique_ptr<base::DictionaryValue> spec(new base::DictionaryValue); - std::unique_ptr<base::DictionaryValue> provided(new base::DictionaryValue); - for (const auto& i : capabilities_.provided) { + std::unique_ptr<base::DictionaryValue> provides(new base::DictionaryValue); + for (const auto& i : connection_spec_.provides) { std::unique_ptr<base::ListValue> interfaces(new base::ListValue); for (const auto& interface_name : i.second) interfaces->AppendString(interface_name); - provided->Set(i.first, std::move(interfaces)); + provides->Set(i.first, std::move(interfaces)); } - spec->Set(Store::kCapabilities_ProvidedKey, std::move(provided)); + spec->Set(Store::kInterfaceProviderSpecs_ProvidesKey, std::move(provides)); - std::unique_ptr<base::DictionaryValue> required(new base::DictionaryValue); - for (const auto& i : capabilities_.required) { - std::unique_ptr<base::ListValue> classes(new base::ListValue); + std::unique_ptr<base::DictionaryValue> requires(new base::DictionaryValue); + for (const auto& i : connection_spec_.requires) { + std::unique_ptr<base::ListValue> capabilities(new base::ListValue); for (const auto& class_name : i.second) - classes->AppendString(class_name); - required->Set(i.first, std::move(classes)); + capabilities->AppendString(class_name); + requires->Set(i.first, std::move(capabilities)); } - spec->Set(Store::kCapabilities_RequiredKey, std::move(required)); + spec->Set(Store::kInterfaceProviderSpecs_RequiresKey, std::move(requires)); - value->Set(Store::kCapabilitiesKey, std::move(spec)); + value->Set(Store::kInterfaceProviderSpecsKey, std::move(spec)); return value; } @@ -181,21 +185,22 @@ } entry->set_display_name(display_name); - // Capability spec. - const base::DictionaryValue* capabilities = nullptr; - if (!value.GetDictionary(Store::kCapabilitiesKey, &capabilities)) { + // InterfaceProvider specs. + const base::DictionaryValue* interface_provider_specs = nullptr; + if (!value.GetDictionary(Store::kInterfaceProviderSpecsKey, + &interface_provider_specs)) { LOG(ERROR) << "Entry::Deserialize: dictionary has no " - << Store::kCapabilitiesKey << " key"; + << Store::kInterfaceProviderSpecsKey << " key"; return nullptr; } - service_manager::CapabilitySpec spec; - if (!BuildCapabilities(*capabilities, &spec)) { - LOG(ERROR) << "Entry::Deserialize: failed to build capability spec for " - << entry->name(); + service_manager::InterfaceProviderSpec spec; + if (!BuildInterfaceProviderSpecs(*interface_provider_specs, &spec)) { + LOG(ERROR) << "Entry::Deserialize: failed to build InterfaceProvider spec " + << "for " << entry->name(); return nullptr; } - entry->set_capabilities(spec); + entry->set_connection_spec(spec); if (value.HasKey(Store::kServicesKey)) { const base::ListValue* services = nullptr; @@ -216,19 +221,20 @@ } bool Entry::ProvidesClass(const std::string& clazz) const { - return capabilities_.provided.find(clazz) != capabilities_.provided.end(); + return connection_spec_.provides.find(clazz) != + connection_spec_.provides.end(); } bool Entry::operator==(const Entry& other) const { return other.name_ == name_ && other.qualifier_ == qualifier_ && other.display_name_ == display_name_ && - other.capabilities_ == capabilities_; + other.connection_spec_ == connection_spec_; } bool Entry::operator<(const Entry& other) const { - return std::tie(name_, qualifier_, display_name_, capabilities_) < + return std::tie(name_, qualifier_, display_name_, connection_spec_) < std::tie(other.name_, other.qualifier_, other.display_name_, - other.capabilities_); + other.connection_spec_); } } // catalog @@ -245,7 +251,7 @@ const catalog::Entry& package = input.package() ? *input.package() : input; result->resolved_name = package.name(); result->qualifier = input.qualifier(); - result->capabilities = input.capabilities(); + result->connection_spec = input.connection_spec(); result->package_path = package.path(); return result; }
diff --git a/services/catalog/entry.h b/services/catalog/entry.h index fc4b714..c57e498 100644 --- a/services/catalog/entry.h +++ b/services/catalog/entry.h
@@ -11,7 +11,7 @@ #include "base/files/file_path.h" #include "services/catalog/public/interfaces/catalog.mojom.h" -#include "services/service_manager/public/cpp/capabilities.h" +#include "services/service_manager/public/cpp/interface_provider_spec.h" #include "services/service_manager/public/interfaces/resolver.mojom.h" namespace base { @@ -49,11 +49,12 @@ void set_display_name(const std::string& display_name) { display_name_ = display_name; } - const service_manager::CapabilitySpec& capabilities() const { - return capabilities_; + const service_manager::InterfaceProviderSpec& connection_spec() const { + return connection_spec_; } - void set_capabilities(const service_manager::CapabilitySpec& capabilities) { - capabilities_ = capabilities; + void set_connection_spec( + const service_manager::InterfaceProviderSpec& connection_spec) { + connection_spec_ = connection_spec; } const Entry* package() const { return package_; } void set_package(Entry* package) { package_ = package; } @@ -67,7 +68,7 @@ base::FilePath path_; std::string qualifier_; std::string display_name_; - service_manager::CapabilitySpec capabilities_; + service_manager::InterfaceProviderSpec connection_spec_; Entry* package_ = nullptr; std::vector<std::unique_ptr<Entry>> children_; };
diff --git a/services/catalog/entry_unittest.cc b/services/catalog/entry_unittest.cc index 0df809c..4d0a46b 100644 --- a/services/catalog/entry_unittest.cc +++ b/services/catalog/entry_unittest.cc
@@ -9,7 +9,7 @@ #include "base/macros.h" #include "base/path_service.h" #include "base/values.h" -#include "services/service_manager/public/cpp/capabilities.h" +#include "services/service_manager/public/cpp/interface_provider_spec.h" #include "services/service_manager/public/cpp/names.h" #include "testing/gtest/include/gtest/gtest.h" @@ -67,17 +67,17 @@ EXPECT_EQ("Foo", entry->display_name()); } -TEST_F(EntryTest, Capabilities) { - std::unique_ptr<Entry> entry = ReadEntry("capabilities", nullptr); +TEST_F(EntryTest, ConnectionSpec) { + std::unique_ptr<Entry> entry = ReadEntry("connection_spec", nullptr); EXPECT_EQ("service:foo", entry->name()); EXPECT_EQ("bar", entry->qualifier()); EXPECT_EQ("Foo", entry->display_name()); - service_manager::CapabilitySpec spec; - service_manager::Classes classes; - classes.insert("bar:bar"); - spec.required["service:bar"] = classes; - EXPECT_EQ(spec, entry->capabilities()); + service_manager::InterfaceProviderSpec spec; + service_manager::CapabilitySet capabilities; + capabilities.insert("bar:bar"); + spec.requires["service:bar"] = capabilities; + EXPECT_EQ(spec, entry->connection_spec()); } TEST_F(EntryTest, Serialization) {
diff --git a/services/catalog/instance.cc b/services/catalog/instance.cc index dbedda96..7ac21f8 100644 --- a/services/catalog/instance.cc +++ b/services/catalog/instance.cc
@@ -68,7 +68,7 @@ std::unique_ptr<Entry> entry(new Entry(mojo_name)); service_manager::mojom::ResolveResultPtr result = service_manager::mojom::ResolveResult::From(*entry); - result->capabilities = base::nullopt; + result->connection_spec = base::nullopt; callback.Run(std::move(result)); return; }
diff --git a/services/catalog/store.cc b/services/catalog/store.cc index 40a593e5..d50757de 100644 --- a/services/catalog/store.cc +++ b/services/catalog/store.cc
@@ -15,11 +15,11 @@ // static const char Store::kDisplayNameKey[] = "display_name"; // static -const char Store::kCapabilitiesKey[] = "capabilities"; +const char Store::kInterfaceProviderSpecsKey[] = "capabilities"; // static -const char Store::kCapabilities_ProvidedKey[] = "provided"; +const char Store::kInterfaceProviderSpecs_ProvidesKey[] = "provided"; // static -const char Store::kCapabilities_RequiredKey[] = "required"; +const char Store::kInterfaceProviderSpecs_RequiresKey[] = "required"; // static const char Store::kServicesKey[] = "services";
diff --git a/services/catalog/store.h b/services/catalog/store.h index c91e870..cd1a237 100644 --- a/services/catalog/store.h +++ b/services/catalog/store.h
@@ -25,11 +25,11 @@ // Value is a string. static const char kDisplayNameKey[]; // Value is a dictionary. - static const char kCapabilitiesKey[]; + static const char kInterfaceProviderSpecsKey[]; // Value is a dictionary. - static const char kCapabilities_ProvidedKey[]; + static const char kInterfaceProviderSpecs_ProvidesKey[]; // Value is a dictionary. - static const char kCapabilities_RequiredKey[]; + static const char kInterfaceProviderSpecs_RequiresKey[]; // Value is a list. static const char kServicesKey[];
diff --git a/services/service_manager/background/tests/test_catalog_store.cc b/services/service_manager/background/tests/test_catalog_store.cc index 6fedf7a5..13b5c26 100644 --- a/services/service_manager/background/tests/test_catalog_store.cc +++ b/services/service_manager/background/tests/test_catalog_store.cc
@@ -37,7 +37,7 @@ provided_classes_list->AppendString("service_manager::mojom::TestService"); provided_classes->Set("service_manager:test_service", std::move(provided_classes_list)); - capabilities->Set(Store::kCapabilities_ProvidedKey, + capabilities->Set(Store::kInterfaceProviderSpecs_ProvidesKey, std::move(provided_classes)); std::unique_ptr<base::DictionaryValue> required_capabilities( new base::DictionaryValue); @@ -47,9 +47,9 @@ classes_list->AppendString("service_manager:test_service"); classes_dictionary->Set("classes", std::move(classes_list)); required_capabilities->Set("*", std::move(classes_dictionary)); - capabilities->Set(Store::kCapabilities_RequiredKey, + capabilities->Set(Store::kInterfaceProviderSpecs_RequiresKey, std::move(required_capabilities)); - app->Set(Store::kCapabilitiesKey, std::move(capabilities)); + app->Set(Store::kInterfaceProviderSpecsKey, std::move(capabilities)); return app; }
diff --git a/services/service_manager/public/cpp/BUILD.gn b/services/service_manager/public/cpp/BUILD.gn index 34f7e89..d10cc06 100644 --- a/services/service_manager/public/cpp/BUILD.gn +++ b/services/service_manager/public/cpp/BUILD.gn
@@ -11,7 +11,6 @@ # TODO(rockot): Rename this to "cpp". static_library("sources") { sources = [ - "capabilities.h", "connect.h", "connection.h", "connector.h", @@ -20,10 +19,10 @@ "interface_factory.h", "interface_factory_impl.h", "interface_provider.h", + "interface_provider_spec.h", "interface_registry.h", "lib/callback_binder.cc", "lib/callback_binder.h", - "lib/capabilities.cc", "lib/connection_impl.cc", "lib/connection_impl.h", "lib/connector_impl.cc", @@ -31,6 +30,7 @@ "lib/identity.cc", "lib/interface_factory_binder.h", "lib/interface_provider.cc", + "lib/interface_provider_spec.cc", "lib/interface_registry.cc", "lib/names.cc", "lib/service.cc",
diff --git a/services/service_manager/public/cpp/capabilities.h b/services/service_manager/public/cpp/capabilities.h deleted file mode 100644 index f82e908e..0000000 --- a/services/service_manager/public/cpp/capabilities.h +++ /dev/null
@@ -1,35 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef SERVICES_SERVICE_MANAGER_PUBLIC_CPP_CAPABILITIES_H_ -#define SERVICES_SERVICE_MANAGER_PUBLIC_CPP_CAPABILITIES_H_ - -#include <map> -#include <set> -#include <string> - -namespace service_manager { - -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 -// services/service_manager/public/interfaces/capabilities.mojom for a -// description of CapabilitySpec. -struct CapabilitySpec { - CapabilitySpec(); - CapabilitySpec(const CapabilitySpec& other); - ~CapabilitySpec(); - bool operator==(const CapabilitySpec& other) const; - bool operator<(const CapabilitySpec& other) const; - std::map<Class, Interfaces> provided; - std::map<Name, Classes> required; -}; - -} // namespace service_manager - -#endif // SERVICES_SERVICE_MANAGER_PUBLIC_CPP_CAPABILITIES_H_
diff --git a/services/service_manager/public/cpp/capabilities.typemap b/services/service_manager/public/cpp/capabilities.typemap deleted file mode 100644 index 8994c7d..0000000 --- a/services/service_manager/public/cpp/capabilities.typemap +++ /dev/null
@@ -1,15 +0,0 @@ -# Copyright 2016 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -mojom = "//services/service_manager/public/interfaces/capabilities.mojom" -public_headers = [ "//services/service_manager/public/cpp/capabilities.h" ] -traits_headers = - [ "//services/service_manager/public/cpp/capabilities_struct_traits.h" ] - -type_mappings = [ - "service_manager.mojom.CapabilityRequest=::service_manager::CapabilityRequest", - "service_manager.mojom.CapabilitySpec=::service_manager::CapabilitySpec", - "service_manager.mojom.Interfaces=::service_manager::Interfaces", - "service_manager.mojom.Classes=::service_manager::Classes", -]
diff --git a/services/service_manager/public/cpp/capabilities_struct_traits.h b/services/service_manager/public/cpp/capabilities_struct_traits.h deleted file mode 100644 index 21d8a52..0000000 --- a/services/service_manager/public/cpp/capabilities_struct_traits.h +++ /dev/null
@@ -1,81 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef SERVICES_SERVICE_MANAGER_PUBLIC_CPP_CAPABILITIES_STRUCT_TRAITS_H_ -#define SERVICES_SERVICE_MANAGER_PUBLIC_CPP_CAPABILITIES_STRUCT_TRAITS_H_ - -#include "services/service_manager/public/cpp/capabilities.h" -#include "services/service_manager/public/interfaces/capabilities.mojom.h" - -namespace mojo { - -template <> -struct StructTraits<service_manager::mojom::CapabilitySpec::DataView, - service_manager::CapabilitySpec> { - static const std::map<service_manager::Class, service_manager::Interfaces>& - provided(const service_manager::CapabilitySpec& spec) { - return spec.provided; - } - static const std::map<service_manager::Name, service_manager::Classes>& - required(const service_manager::CapabilitySpec& spec) { - return spec.required; - } - static bool Read(service_manager::mojom::CapabilitySpecDataView data, - service_manager::CapabilitySpec* out) { - return data.ReadProvided(&out->provided) && - data.ReadRequired(&out->required); - } -}; - -template <> -struct StructTraits<service_manager::mojom::Interfaces::DataView, - service_manager::Interfaces> { - static std::vector<std::string> interfaces( - const service_manager::Interfaces& spec) { - std::vector<std::string> vec; - for (const auto& interface_name : spec) - vec.push_back(interface_name); - return vec; - } - static bool Read(service_manager::mojom::InterfacesDataView data, - service_manager::Interfaces* out) { - ArrayDataView<StringDataView> interfaces_data_view; - data.GetInterfacesDataView(&interfaces_data_view); - for (size_t i = 0; i < interfaces_data_view.size(); ++i) { - std::string interface_name; - if (!interfaces_data_view.Read(i, &interface_name)) - return false; - out->insert(std::move(interface_name)); - } - return true; - } -}; - -template <> -struct StructTraits<service_manager::mojom::Classes::DataView, - service_manager::Classes> { - static std::vector<std::string> classes( - const service_manager::Classes& spec) { - std::vector<std::string> vec; - for (const auto& class_name : spec) - vec.push_back(class_name); - return vec; - } - static bool Read(service_manager::mojom::ClassesDataView data, - service_manager::Classes* out) { - ArrayDataView<StringDataView> classes_data_view; - data.GetClassesDataView(&classes_data_view); - for (size_t i = 0; i < classes_data_view.size(); ++i) { - std::string class_name; - if (!classes_data_view.Read(i, &class_name)) - return false; - out->insert(std::move(class_name)); - } - return true; - } -}; - -} // namespace mojo - -#endif // SERVICES_SERVICE_MANAGER_PUBLIC_CPP_CAPABILITIES_STRUCT_TRAITS_H_
diff --git a/services/service_manager/public/cpp/interface_provider_spec.h b/services/service_manager/public/cpp/interface_provider_spec.h new file mode 100644 index 0000000..2e430aa --- /dev/null +++ b/services/service_manager/public/cpp/interface_provider_spec.h
@@ -0,0 +1,35 @@ +// 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 SERVICES_SERVICE_MANAGER_PUBLIC_CPP_INTERFACE_PROVIDER_SPEC_H_ +#define SERVICES_SERVICE_MANAGER_PUBLIC_CPP_INTERFACE_PROVIDER_SPEC_H_ + +#include <map> +#include <set> +#include <string> + +namespace service_manager { + +using Capability = std::string; +using CapabilitySet = std::set<std::string>; +using Interface = std::string; +using InterfaceSet = std::set<std::string>; +using Name = std::string; + +// See comments in +// services/service_manager/public/interfaces/interface_provider_spec.mojom for +// a description of InterfaceProviderSpec. +struct InterfaceProviderSpec { + InterfaceProviderSpec(); + InterfaceProviderSpec(const InterfaceProviderSpec& other); + ~InterfaceProviderSpec(); + bool operator==(const InterfaceProviderSpec& other) const; + bool operator<(const InterfaceProviderSpec& other) const; + std::map<Capability, InterfaceSet> provides; + std::map<Name, CapabilitySet> requires; +}; + +} // namespace service_manager + +#endif // SERVICES_SERVICE_MANAGER_PUBLIC_CPP_INTERFACE_PROVIDER_SPEC_H_
diff --git a/services/service_manager/public/cpp/interface_provider_spec.typemap b/services/service_manager/public/cpp/interface_provider_spec.typemap new file mode 100644 index 0000000..407d1e55 --- /dev/null +++ b/services/service_manager/public/cpp/interface_provider_spec.typemap
@@ -0,0 +1,15 @@ +# Copyright 2016 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +mojom = + "//services/service_manager/public/interfaces/interface_provider_spec.mojom" +public_headers = + [ "//services/service_manager/public/cpp/interface_provider_spec.h" ] +traits_headers = [ "//services/service_manager/public/cpp/interface_provider_spec_struct_traits.h" ] + +type_mappings = [ + "service_manager.mojom.InterfaceProviderSpec=::service_manager::InterfaceProviderSpec", + "service_manager.mojom.InterfaceSet=::service_manager::InterfaceSet", + "service_manager.mojom.CapabilitySet=::service_manager::CapabilitySet", +]
diff --git a/services/service_manager/public/cpp/interface_provider_spec_struct_traits.h b/services/service_manager/public/cpp/interface_provider_spec_struct_traits.h new file mode 100644 index 0000000..ef5b8b5b --- /dev/null +++ b/services/service_manager/public/cpp/interface_provider_spec_struct_traits.h
@@ -0,0 +1,82 @@ +// 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 SERVICES_SERVICE_MANAGER_PUBLIC_CPP_INTERFACE_PROVIDER_SPEC_STRUCT_TRAITS_H_ +#define SERVICES_SERVICE_MANAGER_PUBLIC_CPP_INTERFACE_PROVIDER_SPEC_STRUCT_TRAITS_H_ + +#include "services/service_manager/public/cpp/interface_provider_spec.h" +#include "services/service_manager/public/interfaces/interface_provider_spec.mojom.h" + +namespace mojo { + +template <> +struct StructTraits<service_manager::mojom::InterfaceProviderSpec::DataView, + service_manager::InterfaceProviderSpec> { + static const std::map<service_manager::Capability, + service_manager::InterfaceSet>& + provides(const service_manager::InterfaceProviderSpec& spec) { + return spec.provides; + } + static const std::map<service_manager::Name, service_manager::CapabilitySet>& + requires(const service_manager::InterfaceProviderSpec& spec) { + return spec.requires; + } + static bool Read(service_manager::mojom::InterfaceProviderSpecDataView data, + service_manager::InterfaceProviderSpec* out) { + return data.ReadProvides(&out->provides) && + data.ReadRequires(&out->requires); + } +}; + +template <> +struct StructTraits<service_manager::mojom::InterfaceSet::DataView, + service_manager::InterfaceSet> { + static std::vector<std::string> interfaces( + const service_manager::InterfaceSet& spec) { + std::vector<std::string> vec; + for (const auto& interface_name : spec) + vec.push_back(interface_name); + return vec; + } + static bool Read(service_manager::mojom::InterfaceSetDataView data, + service_manager::InterfaceSet* out) { + ArrayDataView<StringDataView> interfaces_data_view; + data.GetInterfacesDataView(&interfaces_data_view); + for (size_t i = 0; i < interfaces_data_view.size(); ++i) { + std::string interface_name; + if (!interfaces_data_view.Read(i, &interface_name)) + return false; + out->insert(std::move(interface_name)); + } + return true; + } +}; + +template <> +struct StructTraits<service_manager::mojom::CapabilitySet::DataView, + service_manager::CapabilitySet> { + static std::vector<std::string> capabilities( + const service_manager::CapabilitySet& spec) { + std::vector<std::string> vec; + for (const auto& capability : spec) + vec.push_back(capability); + return vec; + } + static bool Read(service_manager::mojom::CapabilitySetDataView data, + service_manager::CapabilitySet* out) { + ArrayDataView<StringDataView> capabilities_data_view; + data.GetCapabilitiesDataView(&capabilities_data_view); + for (size_t i = 0; i < capabilities_data_view.size(); ++i) { + std::string capability; + if (!capabilities_data_view.Read(i, &capability)) + return false; + out->insert(std::move(capability)); + } + return true; + } +}; + +} // namespace mojo + +#endif // SERVICES_SERVICE_MANAGER_PUBLIC_CPP_INTERFACE_PROVIDER_SPEC_STRUCT_TRAITS_H_
diff --git a/services/service_manager/public/cpp/interface_registry.h b/services/service_manager/public/cpp/interface_registry.h index 757c5a7..fe05a6cf 100644 --- a/services/service_manager/public/cpp/interface_registry.h +++ b/services/service_manager/public/cpp/interface_registry.h
@@ -13,8 +13,8 @@ #include "base/callback.h" #include "base/memory/ptr_util.h" #include "mojo/public/cpp/bindings/binding.h" -#include "services/service_manager/public/cpp/capabilities.h" #include "services/service_manager/public/cpp/identity.h" +#include "services/service_manager/public/cpp/interface_provider_spec.h" #include "services/service_manager/public/cpp/lib/callback_binder.h" #include "services/service_manager/public/cpp/lib/interface_factory_binder.h" #include "services/service_manager/public/interfaces/interface_provider.mojom.h" @@ -83,7 +83,7 @@ // |allowed_interfaces| to |remote_identity|. InterfaceRegistry(const Identity& local_identity, const Identity& remote_identity, - const Interfaces& allowed_interfaces); + const InterfaceSet& allowed_interfaces); ~InterfaceRegistry() override; // Sets a default handler for incoming interface requests which are allowed by @@ -165,7 +165,7 @@ mojo::Binding<mojom::InterfaceProvider> binding_; const Identity local_identity_; const Identity remote_identity_; - const Interfaces allowed_interfaces_; + const InterfaceSet allowed_interfaces_; const bool allow_all_interfaces_; NameToInterfaceBinderMap name_to_binder_;
diff --git a/services/service_manager/public/cpp/lib/capabilities.cc b/services/service_manager/public/cpp/lib/capabilities.cc deleted file mode 100644 index 639ce7d9..0000000 --- a/services/service_manager/public/cpp/lib/capabilities.cc +++ /dev/null
@@ -1,24 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "services/service_manager/public/cpp/capabilities.h" - -#include <tuple> - -namespace service_manager { - -CapabilitySpec::CapabilitySpec() {} -CapabilitySpec::CapabilitySpec(const CapabilitySpec& other) = default; -CapabilitySpec::~CapabilitySpec() {} - -bool CapabilitySpec::operator==(const CapabilitySpec& other) const { - return other.provided == provided && other.required == required; -} - -bool CapabilitySpec::operator<(const CapabilitySpec& other) const { - return std::tie(provided, required) < - std::tie(other.provided, other.required); -} - -} // namespace service_manager
diff --git a/services/service_manager/public/cpp/lib/connection_impl.h b/services/service_manager/public/cpp/lib/connection_impl.h index 2861c25f..a1fabf5 100644 --- a/services/service_manager/public/cpp/lib/connection_impl.h +++ b/services/service_manager/public/cpp/lib/connection_impl.h
@@ -12,9 +12,9 @@ #include "base/callback.h" #include "mojo/public/cpp/bindings/binding.h" -#include "services/service_manager/public/cpp/capabilities.h" #include "services/service_manager/public/cpp/connection.h" #include "services/service_manager/public/cpp/identity.h" +#include "services/service_manager/public/cpp/interface_provider_spec.h" #include "services/service_manager/public/interfaces/connector.mojom.h" #include "services/service_manager/public/interfaces/interface_provider.mojom.h"
diff --git a/services/service_manager/public/cpp/lib/interface_provider_spec.cc b/services/service_manager/public/cpp/lib/interface_provider_spec.cc new file mode 100644 index 0000000..0fe73ac --- /dev/null +++ b/services/service_manager/public/cpp/lib/interface_provider_spec.cc
@@ -0,0 +1,27 @@ +// 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 "services/service_manager/public/cpp/interface_provider_spec.h" + +#include <tuple> + +namespace service_manager { + +InterfaceProviderSpec::InterfaceProviderSpec() {} +InterfaceProviderSpec::InterfaceProviderSpec( + const InterfaceProviderSpec& other) = default; +InterfaceProviderSpec::~InterfaceProviderSpec() {} + +bool InterfaceProviderSpec::operator==( + const InterfaceProviderSpec& other) const { + return other.provides == provides && other.requires == requires; +} + +bool InterfaceProviderSpec::operator<( + const InterfaceProviderSpec& other) const { + return std::tie(provides, requires) < + std::tie(other.provides, other.requires); +} + +} // namespace service_manager
diff --git a/services/service_manager/public/cpp/lib/interface_registry.cc b/services/service_manager/public/cpp/lib/interface_registry.cc index 3a38210..71640d0 100644 --- a/services/service_manager/public/cpp/lib/interface_registry.cc +++ b/services/service_manager/public/cpp/lib/interface_registry.cc
@@ -17,7 +17,7 @@ InterfaceRegistry::InterfaceRegistry( const Identity& local_identity, const Identity& remote_identity, - const Interfaces& allowed_interfaces) + const InterfaceSet& allowed_interfaces) : binding_(this), local_identity_(local_identity), remote_identity_(remote_identity),
diff --git a/services/service_manager/public/cpp/lib/service_context.cc b/services/service_manager/public/cpp/lib/service_context.cc index aff187f..1460291 100644 --- a/services/service_manager/public/cpp/lib/service_context.cc +++ b/services/service_manager/public/cpp/lib/service_context.cc
@@ -9,7 +9,7 @@ #include "base/message_loop/message_loop.h" #include "mojo/public/cpp/bindings/interface_ptr.h" #include "mojo/public/cpp/bindings/interface_request.h" -#include "services/service_manager/public/cpp/capabilities.h" +#include "services/service_manager/public/cpp/interface_provider_spec.h" #include "services/service_manager/public/cpp/interface_registry.h" #include "services/service_manager/public/cpp/lib/connector_impl.h" #include "services/service_manager/public/cpp/service.h" @@ -63,9 +63,9 @@ void ServiceContext::OnConnect( const Identity& source, mojom::InterfaceProviderRequest interfaces, - const Interfaces& allowed_interfaces, - const Classes& allowed_classes) { - // TODO(beng): do something with |allowed_classes|. + const InterfaceSet& allowed_interfaces, + const CapabilitySet& allowed_capabilities) { + // TODO(beng): do something with |allowed_capabilities|. std::unique_ptr<InterfaceRegistry> registry( new InterfaceRegistry(identity_, source, allowed_interfaces)); registry->Bind(std::move(interfaces));
diff --git a/services/service_manager/public/cpp/service_context.h b/services/service_manager/public/cpp/service_context.h index 79ac6933..218c1ae 100644 --- a/services/service_manager/public/cpp/service_context.h +++ b/services/service_manager/public/cpp/service_context.h
@@ -70,8 +70,8 @@ const OnStartCallback& callback) override; void OnConnect(const Identity& source, mojom::InterfaceProviderRequest interfaces, - const Interfaces& allowed_interfaces, - const Classes& allowed_classes) override; + const InterfaceSet& allowed_interfaces, + const CapabilitySet& allowed_capabilities) override; void OnConnectionError();
diff --git a/services/service_manager/public/cpp/typemaps.gni b/services/service_manager/public/cpp/typemaps.gni index a1deb8a..9a3ccd2 100644 --- a/services/service_manager/public/cpp/typemaps.gni +++ b/services/service_manager/public/cpp/typemaps.gni
@@ -1,4 +1,4 @@ typemaps = [ - "//services/service_manager/public/cpp/capabilities.typemap", "//services/service_manager/public/cpp/identity.typemap", + "//services/service_manager/public/cpp/interface_provider_spec.typemap", ]
diff --git a/services/service_manager/public/interfaces/BUILD.gn b/services/service_manager/public/interfaces/BUILD.gn index d9f8daa6..25a2e18 100644 --- a/services/service_manager/public/interfaces/BUILD.gn +++ b/services/service_manager/public/interfaces/BUILD.gn
@@ -6,9 +6,9 @@ mojom("interfaces") { sources = [ - "capabilities.mojom", "connector.mojom", "interface_provider.mojom", + "interface_provider_spec.mojom", "resolver.mojom", "service.mojom", "service_factory.mojom",
diff --git a/services/service_manager/public/interfaces/capabilities.mojom b/services/service_manager/public/interfaces/capabilities.mojom deleted file mode 100644 index cb1ddbb..0000000 --- a/services/service_manager/public/interfaces/capabilities.mojom +++ /dev/null
@@ -1,47 +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. - -module service_manager.mojom; - -// Capabilities ---------------------------------------------------------------- -// -// Services expose interfaces and capability classes to one another. -// -// In a CapabilitySpec, an interface is represented by its fully qualified name, -// which is serialized based on the interface name and module path: -// module::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. - -// Defines a collection of interfaces. We don't represent this as a bare array -// in-situ in mojom because we rely on type maps to generate a set container in -// C++ which is unavailable for a bare array. -struct Interfaces { - array<string> interfaces; -}; - -// Defines a collection of classes. See note above about not just using a bare -// array. -struct Classes { - array<string> classes; -}; - -// Describes the capabilities offered and requested by an service. -// This struct is populated from the service manifest. -struct CapabilitySpec { - // The classes offered by this service, 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, Interfaces> provided; - - // The services this service needs to speak to, and the classes it requires. - // A map of service name -> collection of required classes. "*" is also - // supported as the key, which supplies a set of classes required from all - // services in addition to specific ones specified. - map<string, Classes> required; -};
diff --git a/services/service_manager/public/interfaces/interface_provider_spec.mojom b/services/service_manager/public/interfaces/interface_provider_spec.mojom new file mode 100644 index 0000000..1609dbf --- /dev/null +++ b/services/service_manager/public/interfaces/interface_provider_spec.mojom
@@ -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. + +module service_manager.mojom; + +// Defines a set of Mojo interfaces. The string value is the fully qualified +// name of the interface in the form "module::path::InterfaceName". We don't +// represent this as a bare array in-situ in mojom because we rely on type maps +// to generate a set container in C++ which is unavailable for a bare array. +struct InterfaceSet { + array<string> interfaces; +}; + +// Defines a set of capability names. A "capability" can be a collection of Mojo +// interface names, or just some control bit that affects behavior in the +// service that provides it. See note above about not just using a bare array. +struct CapabilitySet { + array<string> capabilities; +}; + +// An InterfaceProviderSpec is the static definition of a collection of +// capabilities that a service provides to other services and a collection of +// capabilities that it requires from other services. +struct InterfaceProviderSpec { + // The capabilities provided by this service, and for each class an array of + // interfaces. If no interfaces are granted with a capability, 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, InterfaceSet> provides; + + // The services this service needs to speak to, and the capabilities it + // requires from each. + // A map of service name -> collection of required capabilities. "*" is also + // supported as the key, which supplies a set of capabilities required from + // all services in addition to specific ones specified. + map<string, CapabilitySet> requires; +};
diff --git a/services/service_manager/public/interfaces/resolver.mojom b/services/service_manager/public/interfaces/resolver.mojom index 17234f9..1c6a9a2 100644 --- a/services/service_manager/public/interfaces/resolver.mojom +++ b/services/service_manager/public/interfaces/resolver.mojom
@@ -5,7 +5,7 @@ module service_manager.mojom; import "mojo/common/common_custom_types.mojom"; -import "services/service_manager/public/interfaces/capabilities.mojom"; +import "services/service_manager/public/interfaces/interface_provider_spec.mojom"; // The result of a Resolve operation via Resolver. struct ResolveResult { @@ -23,7 +23,8 @@ string qualifier; // The set of capabilities provided and required by |name|. - CapabilitySpec? capabilities; + // TODO(beng): Fix comment. + InterfaceProviderSpec? connection_spec; // A path to the package file specified by |name|. mojo.common.mojom.FilePath package_path;
diff --git a/services/service_manager/public/interfaces/service.mojom b/services/service_manager/public/interfaces/service.mojom index 4a697b3..a9493327 100644 --- a/services/service_manager/public/interfaces/service.mojom +++ b/services/service_manager/public/interfaces/service.mojom
@@ -4,9 +4,9 @@ module service_manager.mojom; -import "services/service_manager/public/interfaces/capabilities.mojom"; import "services/service_manager/public/interfaces/connector.mojom"; import "services/service_manager/public/interfaces/interface_provider.mojom"; +import "services/service_manager/public/interfaces/interface_provider_spec.mojom"; // Implemented by any service which is known to the Service Manager, for which // instances may be tracked. It allows the implementor to receive lifecycle @@ -50,14 +50,20 @@ // A request for an InterfaceProvider by which the source service may // seek to bind interface implementations exported by the target. // - // allowed_capabilities - // A whitelist of interface names and capability classes that should be - // made available to the source, according to the security policy described - // by the source and target's manifests. Attempts to bind interfaces not in - // this whitelist must not be fulfilled. + // required_interfaces + // A whitelist of interface names that should be made available to the + // source that initiated the connection, in accordance to policy described + // in the source & target's service manifests. Attempts to bind interfaces + // not in this whitelist must not be fulfilled. + // + // required_capabilities + // A set of the capability names required by the source initiating the + // connection. |required_interfaces| controls interface binding, so this + // is useful mostly if the target wishes to control behavior based on the + // presence of a value in this set. // OnConnect(Identity source, InterfaceProvider&? interfaces, - Interfaces required_interfaces, - Classes required_classes); + InterfaceSet required_interfaces, + CapabilitySet required_capabilities); };
diff --git a/services/service_manager/service_manager.cc b/services/service_manager/service_manager.cc index f37531b..aa46c32 100644 --- a/services/service_manager/service_manager.cc +++ b/services/service_manager/service_manager.cc
@@ -35,13 +35,12 @@ const char kCatalogName[] = "service:catalog"; const char kServiceManagerName[] = "service:service_manager"; -const char kCapabilityClass_UserID[] = "service_manager:user_id"; -const char kCapabilityClass_ClientProcess[] = "service_manager:client_process"; -const char kCapabilityClass_InstanceName[] = "service_manager:instance_name"; -const char kCapabilityClass_AllUsers[] = "service_manager:all_users"; -const char kCapabilityClass_ExplicitClass[] = "service_manager:explicit_class"; -const char kCapabilityClass_ServiceManager[] = - "service_manager:service_manager"; +const char kCapability_UserID[] = "service_manager:user_id"; +const char kCapability_ClientProcess[] = "service_manager:client_process"; +const char kCapability_InstanceName[] = "service_manager:instance_name"; +const char kCapability_AllUsers[] = "service_manager:all_users"; +const char kCapability_ExplicitClass[] = "service_manager:explicit_class"; +const char kCapability_ServiceManager[] = "service_manager:service_manager"; } // namespace @@ -53,58 +52,59 @@ return Identity(kCatalogName, mojom::kRootUserID); } -CapabilitySpec GetPermissiveCapabilities() { - CapabilitySpec capabilities; - Interfaces interfaces; +InterfaceProviderSpec GetPermissiveInterfaceProviderSpec() { + InterfaceProviderSpec spec; + InterfaceSet interfaces; interfaces.insert("*"); - capabilities.required["*"] = interfaces; - return capabilities; + spec.requires["*"] = interfaces; + return spec; } -Classes GetRequestedClasses(const CapabilitySpec& source_spec, - const Identity& target) { - Classes classes; +CapabilitySet GetRequestedCapabilities(const InterfaceProviderSpec& source_spec, + const Identity& target) { + CapabilitySet capabilities; // Start by looking for specs specific to the supplied identity. - auto it = source_spec.required.find(target.name()); - if (it != source_spec.required.end()) { + auto it = source_spec.requires.find(target.name()); + if (it != source_spec.requires.end()) { std::copy(it->second.begin(), it->second.end(), - std::inserter(classes, classes.begin())); + std::inserter(capabilities, capabilities.begin())); } // Apply wild card rules too. - it = source_spec.required.find("*"); - if (it != source_spec.required.end()) { + it = source_spec.requires.find("*"); + if (it != source_spec.requires.end()) { std::copy(it->second.begin(), it->second.end(), - std::inserter(classes, classes.begin())); + std::inserter(capabilities, capabilities.begin())); } - return classes; + return capabilities; } -void GetClassesAndInterfacesForConnection( - const CapabilitySpec& source_spec, +void GetCapabilitiesAndInterfacesForConnection( + const InterfaceProviderSpec& source_spec, const Identity& target, - const CapabilitySpec& target_spec, - Classes* classes, - Interfaces* interfaces) { - DCHECK(classes && interfaces); - *classes = GetRequestedClasses(source_spec, target); - // Flatten all interfaces from classes requested by the source into the + const InterfaceProviderSpec& target_spec, + CapabilitySet* capabilities, + InterfaceSet* interfaces) { + DCHECK(capabilities && interfaces); + *capabilities = GetRequestedCapabilities(source_spec, target); + // Flatten all interfaces from capabilities requested by the source into the // allowed interface set in the request. - for (const auto& class_name : *classes) { - auto it = target_spec.provided.find(class_name); - if (it != target_spec.provided.end()) { + for (const auto& capability : *capabilities) { + auto it = target_spec.provides.find(capability); + if (it != target_spec.provides.end()) { for (const auto& interface_name : it->second) interfaces->insert(interface_name); } } } -bool HasClass(const CapabilitySpec& spec, const std::string& class_name) { - auto it = spec.required.find(kServiceManagerName); - if (it == spec.required.end()) +bool HasCapability(const InterfaceProviderSpec& spec, + const std::string& capability) { + auto it = spec.requires.find(kServiceManagerName); + if (it == spec.requires.end()) return false; - return it->second.find(class_name) != it->second.end(); + return it->second.find(capability) != it->second.end(); } // Encapsulates a connection to an instance of a service, tracked by the @@ -118,12 +118,12 @@ public: Instance(service_manager::ServiceManager* service_manager, const Identity& identity, - const CapabilitySpec& capability_spec) + const InterfaceProviderSpec& connection_spec) : service_manager_(service_manager), id_(GenerateUniqueID()), identity_(identity), - capability_spec_(capability_spec), - allow_any_application_(capability_spec.required.count("*") == 1), + connection_spec_(connection_spec), + allow_any_application_(connection_spec.requires.count("*") == 1), pid_receiver_binding_(this), weak_factory_(this) { if (identity_.name() == kServiceManagerName || @@ -177,26 +177,26 @@ identity_.user_id()); } - Classes classes; - Interfaces interfaces; + CapabilitySet capabilities; + InterfaceSet interfaces; Instance* source = service_manager_->GetExistingInstance(params->source()); if (source) { - GetClassesAndInterfacesForConnection(source->capability_spec_, - identity_, capability_spec_, - &classes, &interfaces); + GetCapabilitiesAndInterfacesForConnection(source->connection_spec_, + identity_, connection_spec_, + &capabilities, &interfaces); } else { interfaces.insert("*"); } // The target has specified that sources must request one of its provided // classes instead of specifying a wild-card for interfaces. - if (HasClass(capability_spec_, kCapabilityClass_ExplicitClass) && + if (HasCapability(connection_spec_, kCapability_ExplicitClass) && (interfaces.count("*") != 0)) { interfaces.erase("*"); } service_->OnConnect(params->source(), params->TakeRemoteInterfaces(), - interfaces, classes); + interfaces, capabilities); return true; } @@ -240,8 +240,8 @@ return info; } - const CapabilitySpec& capability_spec() const { - return capability_spec_; + const InterfaceProviderSpec& connection_spec() const { + return connection_spec_; } const Identity& identity() const { return identity_; } uint32_t id() const { return id_; } @@ -251,7 +251,7 @@ InterfaceRegistry* registry) override { Instance* source = service_manager_->GetExistingInstance(remote_identity); DCHECK(source); - if (HasClass(source->capability_spec_, kCapabilityClass_ServiceManager)) { + if (HasCapability(source->connection_spec_, kCapability_ServiceManager)) { registry->AddInterface<mojom::ServiceManager>(this); return true; } @@ -274,7 +274,7 @@ callback)) { return; } - if (!ValidateCapabilities(target, callback)) + if (!ValidateConnectionSpec(target, callback)) return; std::unique_ptr<ConnectParams> params(new ConnectParams); @@ -331,7 +331,7 @@ const Identity& target, const ConnectCallback& callback) { if (!client_process_connection->is_null()) { - if (!HasClass(capability_spec_, kCapabilityClass_ClientProcess)) { + if (!HasCapability(connection_spec_, kCapability_ClientProcess)) { LOG(ERROR) << "Instance: " << identity_.name() << " attempting " << "to register an instance for a process it created for " << "target: " << target.name() << " without the " @@ -363,43 +363,42 @@ return true; } - bool ValidateCapabilities(const Identity& target, - const ConnectCallback& callback) { + bool ValidateConnectionSpec(const Identity& target, + const ConnectCallback& callback) { // TODO(beng): Need to do the following additional policy validation of // whether this instance is allowed to connect using: // - a non-null client_process_connection. if (target.user_id() != identity_.user_id() && target.user_id() != mojom::kRootUserID && - !HasClass(capability_spec_, kCapabilityClass_UserID)) { + !HasCapability(connection_spec_, kCapability_UserID)) { LOG(ERROR) << "Instance: " << identity_.name() << " running as: " << identity_.user_id() << " attempting to connect to: " << target.name() << " as: " << target.user_id() << " without " - << " the service:service_manager{user_id} capability class."; + << " the service:service_manager{user_id} capability."; callback.Run(mojom::ConnectResult::ACCESS_DENIED, mojom::kInheritUserID); return false; } if (!target.instance().empty() && target.instance() != GetNamePath(target.name()) && - !HasClass(capability_spec_, kCapabilityClass_InstanceName)) { + !HasCapability(connection_spec_, kCapability_InstanceName)) { LOG(ERROR) << "Instance: " << identity_.name() << " attempting to " << "connect to " << target.name() << " using Instance name: " << target.instance() << " without the " - << "service:service_manager{instance_name} capability class."; + << "service:service_manager{instance_name} capability."; callback.Run(mojom::ConnectResult::ACCESS_DENIED, mojom::kInheritUserID); return false; - } if (allow_any_application_ || - capability_spec_.required.find(target.name()) != - capability_spec_.required.end()) { + connection_spec_.requires.find(target.name()) != + connection_spec_.requires.end()) { return true; } - LOG(ERROR) << "Capabilities prevented connection from: " << - identity_.name() << " to: " << target.name(); + LOG(ERROR) << "InterfaceProviderSpec prevented connection from: " + << identity_.name() << " to: " << target.name(); callback.Run(mojom::ConnectResult::ACCESS_DENIED, mojom::kInheritUserID); return false; } @@ -462,7 +461,7 @@ // process is launched. const uint32_t id_; const Identity identity_; - const CapabilitySpec capability_spec_; + const InterfaceProviderSpec connection_spec_; const bool allow_any_application_; std::unique_ptr<NativeRunner> runner_; mojom::ServicePtr service_; @@ -502,11 +501,11 @@ mojom::ServicePtr service; mojom::ServiceRequest request = mojo::GetProxy(&service); - CapabilitySpec spec; - spec.provided[kCapabilityClass_ServiceManager].insert( + InterfaceProviderSpec spec; + spec.provides[kCapability_ServiceManager].insert( "service_manager::mojom::ServiceManager"); - spec.required["*"].insert("service_manager:service_factory"); - spec.required["service:catalog"].insert("service_manager:resolver"); + spec.requires["*"].insert("service_manager:service_factory"); + spec.requires["service:catalog"].insert("service_manager:resolver"); service_manager_instance_ = CreateInstance(Identity(), CreateServiceManagerIdentity(), spec); @@ -585,12 +584,12 @@ void ServiceManager::InitCatalog(mojom::ServicePtr catalog) { // TODO(beng): It'd be great to build this from the manifest, however there's // a bit of a chicken-and-egg problem. - CapabilitySpec spec; - spec.provided["app"].insert("filesystem::mojom::Directory"); - spec.provided["catalog:catalog"].insert("catalog::mojom::Catalog"); - spec.provided["service_manager:resolver"].insert( + InterfaceProviderSpec spec; + spec.provides["app"].insert("filesystem::mojom::Directory"); + spec.provides["catalog:catalog"].insert("catalog::mojom::Catalog"); + spec.provides["service_manager:resolver"].insert( "service_manager::mojom::Resolver"); - spec.provided["control"].insert("catalog::mojom::CatalogControl"); + spec.provides["control"].insert("catalog::mojom::CatalogControl"); Instance* instance = CreateInstance( CreateServiceManagerIdentity(), CreateCatalogIdentity(), spec); singletons_.insert(kCatalogName); @@ -709,10 +708,11 @@ ServiceManager::Instance* ServiceManager::CreateInstance( const Identity& source, const Identity& target, - const CapabilitySpec& spec) { + const InterfaceProviderSpec& connection_spec) { CHECK(target.user_id() != mojom::kInheritUserID); - std::unique_ptr<Instance> instance(new Instance(this, target, spec)); + std::unique_ptr<Instance> instance( + new Instance(this, target, connection_spec)); Instance* raw_instance = instance.get(); Instance* source_instance = GetExistingInstance(source); @@ -794,15 +794,15 @@ result->qualifier != GetNamePath(result->resolved_name)) { instance_name = result->qualifier; } - // |result->capabilities| can be null when there is no manifest, e.g. for URL - // types not resolvable by the resolver. - CapabilitySpec capabilities = GetPermissiveCapabilities(); - if (result->capabilities.has_value()) - capabilities = result->capabilities.value(); + // |result->connection_spec| can be null when there is no manifest, e.g. for + // URL types not resolvable by the resolver. + InterfaceProviderSpec connection_spec = GetPermissiveInterfaceProviderSpec(); + if (result->connection_spec.has_value()) + connection_spec = result->connection_spec.value(); - const std::string user_id = HasClass(capabilities, kCapabilityClass_AllUsers) - ? base::GenerateGUID() - : params->target().user_id(); + const std::string user_id = + HasCapability(connection_spec, kCapability_AllUsers) + ? base::GenerateGUID() : params->target().user_id(); const Identity target(params->target().name(), user_id, instance_name); params->set_target(target); @@ -821,7 +821,7 @@ // the lifetime of the service that started them, instead they are owned by // the Service Manager. Identity source_identity_for_creation; - if (HasClass(capabilities, kCapabilityClass_AllUsers)) { + if (HasCapability(connection_spec, kCapability_AllUsers)) { singletons_.insert(target.name()); source_identity_for_creation = CreateServiceManagerIdentity(); } else { @@ -831,7 +831,7 @@ mojom::ClientProcessConnectionPtr client_process_connection = params->TakeClientProcessConnection(); Instance* instance = CreateInstance(source_identity_for_creation, - target, capabilities); + target, connection_spec); // Below are various paths through which a new Instance can be bound to a // Service proxy. @@ -847,7 +847,7 @@ } else { // Otherwise we create a new Service pipe. mojom::ServiceRequest request = GetProxy(&service); - CHECK(!result->package_path.empty() && result->capabilities.has_value()); + CHECK(!result->package_path.empty() && result->connection_spec.has_value()); if (target.name() != result->resolved_name) { instance->StartWithService(std::move(service));
diff --git a/services/service_manager/service_manager.h b/services/service_manager/service_manager.h index 7d0edff..0c2a4da 100644 --- a/services/service_manager/service_manager.h +++ b/services/service_manager/service_manager.h
@@ -15,9 +15,9 @@ #include "mojo/public/cpp/bindings/interface_ptr_set.h" #include "services/service_manager/connect_params.h" #include "services/service_manager/native_runner.h" -#include "services/service_manager/public/cpp/capabilities.h" #include "services/service_manager/public/cpp/identity.h" #include "services/service_manager/public/cpp/interface_factory.h" +#include "services/service_manager/public/cpp/interface_provider_spec.h" #include "services/service_manager/public/cpp/service.h" #include "services/service_manager/public/interfaces/connector.mojom.h" #include "services/service_manager/public/interfaces/interface_provider.mojom.h" @@ -131,7 +131,7 @@ Instance* CreateInstance(const Identity& source, const Identity& target, - const CapabilitySpec& spec); + const InterfaceProviderSpec& connection_spec); // Called from the instance implementing mojom::ServiceManager. void AddListener(mojom::ServiceManagerListenerPtr listener);
diff --git a/services/ui/display/platform_screen_ozone.cc b/services/ui/display/platform_screen_ozone.cc index 0660e2d7..664402847 100644 --- a/services/ui/display/platform_screen_ozone.cc +++ b/services/ui/display/platform_screen_ozone.cc
@@ -65,6 +65,7 @@ void PlatformScreenOzone::AddInterfaces( service_manager::InterfaceRegistry* registry) { registry->AddInterface<mojom::DisplayController>(this); + registry->AddInterface<mojom::TestDisplayController>(this); } void PlatformScreenOzone::Init(PlatformScreenDelegate* delegate) { @@ -74,6 +75,8 @@ std::unique_ptr<ui::NativeDisplayDelegate> native_display_delegate = ui::OzonePlatform::GetInstance()->CreateNativeDisplayDelegate(); + // The FakeDisplayController gives us a way to make the NativeDisplayDelegate + // pretend something display related has happened. if (!base::SysInfo::IsRunningOnChromeOS()) { fake_display_controller_ = native_display_delegate->GetFakeDisplayController(); @@ -104,7 +107,7 @@ return primary_display_id_; } -void PlatformScreenOzone::ToggleVirtualDisplay() { +void PlatformScreenOzone::ToggleAddRemoveDisplay() { if (!fake_display_controller_ || wait_for_display_config_update_) return; @@ -121,6 +124,45 @@ } } +void PlatformScreenOzone::SwapPrimaryDisplay() { + const size_t num_displays = cached_displays_.size(); + if (num_displays <= 1) + return; + + // Find index of current primary display. + size_t primary_display_index = 0; + for (size_t i = 0; i < num_displays; i++) { + if (cached_displays_[i].id == primary_display_id_) { + primary_display_index = i; + break; + } + } + + // Set next display index as primary, or loop back to first display if last. + if (primary_display_index + 1 == num_displays) { + primary_display_id_ = cached_displays_[0].id; + } else { + primary_display_id_ = cached_displays_[primary_display_index + 1].id; + } + + // TODO(kylechar): Update ws::DisplayManager. +} + +void PlatformScreenOzone::SetDisplayWorkArea(int64_t display_id, + const gfx::Size& size, + const gfx::Insets& insets) { + CachedDisplayIterator iter = GetCachedDisplayIterator(display_id); + if (iter == cached_displays_.end()) { + NOTREACHED() << display_id; + return; + } + + DisplayInfo& display_info = *iter; + if (display_info.bounds.size() == size) { + // TODO(kylechar): Change workarea and update ws::DisplayManager. + } +} + void PlatformScreenOzone::ProcessRemovedDisplays( const ui::DisplayConfigurator::DisplayStateList& snapshots) { std::vector<int64_t> current_ids; @@ -266,7 +308,13 @@ void PlatformScreenOzone::Create( const service_manager::Identity& remote_identity, mojom::DisplayControllerRequest request) { - bindings_.AddBinding(this, std::move(request)); + controller_bindings_.AddBinding(this, std::move(request)); +} + +void PlatformScreenOzone::Create( + const service_manager::Identity& remote_identity, + mojom::TestDisplayControllerRequest request) { + test_bindings_.AddBinding(this, std::move(request)); } } // namespace display
diff --git a/services/ui/display/platform_screen_ozone.h b/services/ui/display/platform_screen_ozone.h index bcdbdcb4..b60b8e6 100644 --- a/services/ui/display/platform_screen_ozone.h +++ b/services/ui/display/platform_screen_ozone.h
@@ -17,6 +17,7 @@ #include "services/service_manager/public/cpp/interface_factory.h" #include "services/ui/display/platform_screen.h" #include "services/ui/public/interfaces/display/display_controller.mojom.h" +#include "services/ui/public/interfaces/display/test_display_controller.mojom.h" #include "ui/display/chromeos/display_configurator.h" #include "ui/display/display.h" #include "ui/display/types/fake_display_controller.h" @@ -29,7 +30,9 @@ : public PlatformScreen, public ui::DisplayConfigurator::Observer, public service_manager::InterfaceFactory<mojom::DisplayController>, - public mojom::DisplayController { + public service_manager::InterfaceFactory<mojom::TestDisplayController>, + public mojom::DisplayController, + public mojom::TestDisplayController { public: PlatformScreenOzone(); ~PlatformScreenOzone() override; @@ -40,8 +43,14 @@ void RequestCloseDisplay(int64_t display_id) override; int64_t GetPrimaryDisplayId() const override; + // mojom::TestDisplayController: + void ToggleAddRemoveDisplay() override; + // mojom::DisplayController: - void ToggleVirtualDisplay() override; + void SwapPrimaryDisplay() override; + void SetDisplayWorkArea(int64_t display_id, + const gfx::Size& size, + const gfx::Insets& insets) override; private: // TODO(kylechar): This struct is just temporary until we migrate @@ -105,6 +114,10 @@ void Create(const service_manager::Identity& remote_identity, mojom::DisplayControllerRequest request) override; + // mojo::InterfaceFactory<mojom::TestDisplayController>: + void Create(const service_manager::Identity& remote_identity, + mojom::TestDisplayControllerRequest request) override; + ui::DisplayConfigurator display_configurator_; PlatformScreenDelegate* delegate_ = nullptr; @@ -121,7 +134,8 @@ std::vector<DisplayInfo> cached_displays_; gfx::Point next_display_origin_; - mojo::BindingSet<mojom::DisplayController> bindings_; + mojo::BindingSet<mojom::DisplayController> controller_bindings_; + mojo::BindingSet<mojom::TestDisplayController> test_bindings_; DISALLOW_COPY_AND_ASSIGN(PlatformScreenOzone); };
diff --git a/services/ui/ime/ime_unittest.cc b/services/ui/ime/ime_unittest.cc index 9c23549..da199c0 100644 --- a/services/ui/ime/ime_unittest.cc +++ b/services/ui/ime/ime_unittest.cc
@@ -19,35 +19,25 @@ : binding_(this, std::move(request)) {} ui::mojom::CompositionEventPtr WaitUntilCompositionEvent() { - run_loop_.reset(new base::RunLoop); - run_loop_->Run(); - run_loop_.reset(); + if (!receieved_composition_event_) { + run_loop_.reset(new base::RunLoop); + run_loop_->Run(); + run_loop_.reset(); + } return std::move(receieved_composition_event_); } - ui::Event* WaitUntilUnhandledEvent() { - run_loop_.reset(new base::RunLoop); - run_loop_->Run(); - run_loop_.reset(); - - return unhandled_event_.get(); - } - private: void OnCompositionEvent(ui::mojom::CompositionEventPtr event) override { receieved_composition_event_ = std::move(event); - run_loop_->Quit(); - } - void OnUnhandledEvent(std::unique_ptr<ui::Event> char_event) override { - unhandled_event_ = std::move(char_event); - run_loop_->Quit(); + if (run_loop_) + run_loop_->Quit(); } mojo::Binding<ui::mojom::TextInputClient> binding_; std::unique_ptr<base::RunLoop> run_loop_; ui::mojom::CompositionEventPtr receieved_composition_event_; - std::unique_ptr<ui::Event> unhandled_event_; DISALLOW_COPY_AND_ASSIGN(TestTextInputClient); }; @@ -65,9 +55,29 @@ connector()->ConnectToInterface("service:ui", &ime_server_); } + bool ProcessKeyEvent(ui::mojom::InputMethodPtr* input_method, + std::unique_ptr<ui::Event> event) { + (*input_method) + ->ProcessKeyEvent(std::move(event), + base::Bind(&IMEAppTest::ProcessKeyEventCallback, + base::Unretained(this))); + + run_loop_.reset(new base::RunLoop); + run_loop_->Run(); + run_loop_.reset(); + + return handled_; + } + protected: + void ProcessKeyEventCallback(bool handled) { + handled_ = handled; + run_loop_->Quit(); + } + ui::mojom::IMEServerPtr ime_server_; std::unique_ptr<base::RunLoop> run_loop_; + bool handled_; DISALLOW_COPY_AND_ASSIGN(IMEAppTest); }; @@ -82,7 +92,7 @@ // Send character key event. ui::KeyEvent char_event('A', ui::VKEY_A, 0); - input_method->ProcessKeyEvent(ui::Event::Clone(char_event)); + EXPECT_TRUE(ProcessKeyEvent(&input_method, ui::Event::Clone(char_event))); ui::mojom::CompositionEventPtr composition_event = client.WaitUntilCompositionEvent(); @@ -99,13 +109,5 @@ // Send non-character key event. ui::KeyEvent nonchar_event(ui::ET_KEY_PRESSED, ui::VKEY_LEFT, 0); - input_method->ProcessKeyEvent(ui::Event::Clone(nonchar_event)); - - ui::Event* unhandled_event = client.WaitUntilUnhandledEvent(); - EXPECT_TRUE(unhandled_event); - EXPECT_TRUE(unhandled_event->IsKeyEvent()); - EXPECT_FALSE(unhandled_event->AsKeyEvent()->is_char()); - EXPECT_EQ(ui::ET_KEY_PRESSED, unhandled_event->type()); - EXPECT_EQ(nonchar_event.key_code(), - unhandled_event->AsKeyEvent()->key_code()); + EXPECT_FALSE(ProcessKeyEvent(&input_method, ui::Event::Clone(nonchar_event))); }
diff --git a/services/ui/ime/test_ime_driver/test_ime_driver.cc b/services/ui/ime/test_ime_driver/test_ime_driver.cc index 97aa702..3d47dc08 100644 --- a/services/ui/ime/test_ime_driver/test_ime_driver.cc +++ b/services/ui/ime/test_ime_driver/test_ime_driver.cc
@@ -20,7 +20,8 @@ void OnTextInputModeChanged(mojom::TextInputMode text_input_mode) override {} void OnTextInputTypeChanged(mojom::TextInputType text_input_type) override {} void OnCaretBoundsChanged(const gfx::Rect& caret_bounds) override {} - void ProcessKeyEvent(std::unique_ptr<Event> key_event) override { + void ProcessKeyEvent(std::unique_ptr<Event> key_event, + const ProcessKeyEventCallback& callback) override { DCHECK(key_event->IsKeyEvent()); if (key_event->AsKeyEvent()->is_char()) { @@ -29,10 +30,11 @@ composition_event->type = mojom::CompositionEventType::INSERT_CHAR; composition_event->key_event = std::move(key_event); client_->OnCompositionEvent(std::move(composition_event)); + callback.Run(true); } else { - client_->OnUnhandledEvent(std::move(key_event)); + callback.Run(false); } - }; + } void CancelComposition() override {} mojom::TextInputClientPtr client_;
diff --git a/services/ui/manifest.json b/services/ui/manifest.json index 0e5d2d0..efcc7d7 100644 --- a/services/ui/manifest.json +++ b/services/ui/manifest.json
@@ -34,6 +34,7 @@ ], "ui:window_manager": [ "display::mojom::DisplayController", + "display::mojom::TestDisplayController", "ui::mojom::AccessibilityManager", "ui::mojom::WindowManagerWindowTreeFactory" ],
diff --git a/services/ui/public/interfaces/display/BUILD.gn b/services/ui/public/interfaces/display/BUILD.gn index e46e418a..02e9cc0a 100644 --- a/services/ui/public/interfaces/display/BUILD.gn +++ b/services/ui/public/interfaces/display/BUILD.gn
@@ -8,13 +8,12 @@ sources = [ "display.mojom", "display_controller.mojom", + "test_display_controller.mojom", ] public_deps = [ "//ui/gfx/geometry/mojo", ] - - use_new_wrapper_types = false } mojom("test_interfaces") { @@ -25,6 +24,4 @@ public_deps = [ ":display", ] - - use_new_wrapper_types = false }
diff --git a/services/ui/public/interfaces/display/display_controller.mojom b/services/ui/public/interfaces/display/display_controller.mojom index b9ae186d..c4e126d 100644 --- a/services/ui/public/interfaces/display/display_controller.mojom +++ b/services/ui/public/interfaces/display/display_controller.mojom
@@ -4,13 +4,20 @@ module display.mojom; +import "ui/gfx/geometry/mojo/geometry.mojom"; + // An interface for clients that are allowed to make changes to the display // state. interface DisplayController { - // Toggles adding or removing a virtual display. If there is only one display - // a second display is added. If there is more than one display then the last - // display is removed. - ToggleVirtualDisplay(); + + // Swap the primary display and the next display. + SwapPrimaryDisplay(); + + // Sets the display work area with the provided insets. The display size is + // included to ensure that the insets are for the current display size. + SetDisplayWorkArea(int64 display_id, + gfx.mojom.Size size, + gfx.mojom.Insets insets); // TODO(kylechar): This interface will need to be expanded to provide // additional functionality for the display settings page and other ash
diff --git a/services/ui/public/interfaces/display/test_display_controller.mojom b/services/ui/public/interfaces/display/test_display_controller.mojom new file mode 100644 index 0000000..adebf27 --- /dev/null +++ b/services/ui/public/interfaces/display/test_display_controller.mojom
@@ -0,0 +1,15 @@ +// 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 display.mojom; + +// Provides a way to modify the display state at runtime. Will only work when +// running off device with fake displays. +interface TestDisplayController { + + // Toggles adding or removing a fake display. If there is only one display + // a second display is added. If there is more than one display then the last + // display is removed. + ToggleAddRemoveDisplay(); +};
diff --git a/services/ui/public/interfaces/ime.mojom b/services/ui/public/interfaces/ime.mojom index 17d9107..af86e21 100644 --- a/services/ui/public/interfaces/ime.mojom +++ b/services/ui/public/interfaces/ime.mojom
@@ -93,11 +93,11 @@ // Mus translates it to global coordinates and sends it to IME app. OnCaretBoundsChanged(gfx.mojom.Rect caret_bounds); - // Called to process a key event. If InputMethod handles the event, it will - // notify the client of the resulting composition events (there might be none) - // by calling TextInputClient::OnCompositionEvent(). If the event is not - // handled by InputMethod, TextInputClient::OnUnhandledEvent() is called. - ProcessKeyEvent(ui.mojom.Event key_event); + // Called to process a key event. The callback function will be called to + // notify the client if the event was handled or not. A handled event may + // generate zero or more composition events which will be sent to the client + // by calling TextInputClient::OnCompositionEvent(). + ProcessKeyEvent(ui.mojom.Event key_event) => (bool handled); CancelComposition(); }; @@ -108,9 +108,6 @@ // See comments for InputMethod::ProcessKeyEvent() for when this is called. OnCompositionEvent(CompositionEvent event); - // See comments for InputMethod::ProcessKeyEvent() for when this is called. - OnUnhandledEvent(ui.mojom.Event key_event); - // TODO(moshayedi): Add functions corresponding to ui::TextInputClient for: // - Input text confirmation // - Document content operations
diff --git a/storage/browser/database/database_tracker.cc b/storage/browser/database/database_tracker.cc index 42041c7..1539b0cd 100644 --- a/storage/browser/database/database_tracker.cc +++ b/storage/browser/database/database_tracker.cc
@@ -614,8 +614,8 @@ storage::GetOriginFromIdentifier(origin_id), storage::kStorageTypeTemporary, new_size - old_size); - FOR_EACH_OBSERVER(Observer, observers_, OnDatabaseSizeChanged( - origin_id, name, new_size)); + for (auto& observer : observers_) + observer.OnDatabaseSizeChanged(origin_id, name, new_size); } return new_size; } @@ -626,8 +626,8 @@ DCHECK(database_connections_.IsDatabaseOpened(origin_identifier, database_name)); dbs_to_be_deleted_[origin_identifier].insert(database_name); - FOR_EACH_OBSERVER(Observer, observers_, OnDatabaseScheduledForDeletion( - origin_identifier, database_name)); + for (auto& observer : observers_) + observer.OnDatabaseScheduledForDeletion(origin_identifier, database_name); } void DatabaseTracker::ScheduleDatabasesForDeletion(
diff --git a/storage/browser/quota/special_storage_policy.cc b/storage/browser/quota/special_storage_policy.cc index 6e774505..40125ac 100644 --- a/storage/browser/quota/special_storage_policy.cc +++ b/storage/browser/quota/special_storage_policy.cc
@@ -22,17 +22,20 @@ void SpecialStoragePolicy::NotifyGranted(const GURL& origin, int change_flags) { scoped_refptr<SpecialStoragePolicy> protect(this); - FOR_EACH_OBSERVER(Observer, observers_, OnGranted(origin, change_flags)); + for (auto& observer : observers_) + observer.OnGranted(origin, change_flags); } void SpecialStoragePolicy::NotifyRevoked(const GURL& origin, int change_flags) { scoped_refptr<SpecialStoragePolicy> protect(this); - FOR_EACH_OBSERVER(Observer, observers_, OnRevoked(origin, change_flags)); + for (auto& observer : observers_) + observer.OnRevoked(origin, change_flags); } void SpecialStoragePolicy::NotifyCleared() { scoped_refptr<SpecialStoragePolicy> protect(this); - FOR_EACH_OBSERVER(Observer, observers_, OnCleared()); + for (auto& observer : observers_) + observer.OnCleared(); } } // namespace storage
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json index a5ff710c..f68c05567 100644 --- a/testing/buildbot/chromium.fyi.json +++ b/testing/buildbot/chromium.fyi.json
@@ -894,6 +894,11 @@ }, "test": "vr_shell_unittests" } + ], + "instrumentation_tests": [ + { + "test": "chrome_public_test_apk" + } ] }, "Blimp Android Client": {
diff --git a/testing/variations/PRESUBMIT.py b/testing/variations/PRESUBMIT.py index 22fae12..605c08e 100644 --- a/testing/variations/PRESUBMIT.py +++ b/testing/variations/PRESUBMIT.py
@@ -14,6 +14,7 @@ from collections import OrderedDict VALID_EXPERIMENT_KEYS = ['name', + 'forcing_flag', 'params', 'enable_features', 'disable_features', @@ -50,6 +51,7 @@ # 'groups': [ # { # name: ... + # forcing_flag: "forcing flag string" # params: {sorted dict} # enable_features: [sorted features] # disable_features: [sorted features] @@ -78,6 +80,8 @@ if comment_key in experiment: ordered_experiment[comment_key] = experiment[comment_key] ordered_experiment['name'] = experiment['name'] + if 'forcing_flag' in experiment: + ordered_experiment['forcing_flag'] = experiment['forcing_flag'] if 'params' in experiment: ordered_experiment['params'] = OrderedDict( sorted(experiment['params'].items(), key=lambda t: t[0]))
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json index 538e7ed2..c896cf8 100644 --- a/testing/variations/fieldtrial_testing_config.json +++ b/testing/variations/fieldtrial_testing_config.json
@@ -182,28 +182,6 @@ ] } ], - "BrowserScheduler": [ - { - "platforms": [ - "chromeos", - "linux", - "mac", - "win" - ], - "experiments": [ - { - "name": "Enabled", - "params": { - "Background": "3;8;0.1;0;30000", - "BackgroundFileIO": "3;8;0.1;0;30000", - "Foreground": "8;32;0.3;0;30000", - "ForegroundFileIO": "8;32;0.3;0;30000", - "RedirectSequencedWorkerPools": "true" - } - } - ] - } - ], "CaptivePortalInterstitial": [ { "platforms": [ @@ -913,6 +891,7 @@ { "name": "Enabled", "params": { + "content_suggestions_backend": "https://chromecontentsuggestions-pa.googleapis.com/v1/suggestions/fetch", "quota_SuggestionFetcher": "2" }, "enable_features": [ @@ -1695,6 +1674,21 @@ ] } ], + "SaveAsMenuText": [ + { + "platforms": [ + "chromeos", + "linux", + "mac", + "win" + ], + "experiments": [ + { + "name": "download" + } + ] + } + ], "SchedulerExpensiveTaskBlocking": [ { "platforms": [
diff --git a/third_party/WebKit/LayoutTests/FlagExpectations/enable-slimming-paint-v2 b/third_party/WebKit/LayoutTests/FlagExpectations/enable-slimming-paint-v2 index 57370ba..fc9128fb 100644 --- a/third_party/WebKit/LayoutTests/FlagExpectations/enable-slimming-paint-v2 +++ b/third_party/WebKit/LayoutTests/FlagExpectations/enable-slimming-paint-v2
@@ -315,6 +315,7 @@ Bug(none) compositing/overflow/overflow-scrollbar-layers.html [ Failure ] Bug(none) compositing/overflow/reparented-scrollbars-non-sc-anc.html [ Failure ] Bug(none) compositing/overflow/resize-painting.html [ Failure ] +Bug(none) compositing/overflow/scaled-overflow.html [ Failure ] Bug(none) compositing/overflow/scroller-with-border-radius.html [ Failure ] Bug(none) compositing/overflow/scroll-ancestor-update.html [ Failure ] Bug(none) compositing/overflow/scroll-parent-absolute-with-backdrop-filter.html [ Failure ]
diff --git a/third_party/WebKit/LayoutTests/SlowTests b/third_party/WebKit/LayoutTests/SlowTests index d097585..cf32058 100644 --- a/third_party/WebKit/LayoutTests/SlowTests +++ b/third_party/WebKit/LayoutTests/SlowTests
@@ -319,6 +319,7 @@ crbug.com/647192 fast/css3-text/css3-word-break/word-break-all-ascii.html [ Slow ] crbug.com/647192 virtual/mojo-loading/webexposed/global-interface-listing.html [ Slow ] +crbug.com/520619 [ Win Debug ] webexposed/global-interface-listing.html [ Slow ] # These tests are slow with our MESA backend. They may be less slow when we have # bots running tests on real hardware or maybe when using SwiftShader.
diff --git a/third_party/WebKit/LayoutTests/TestExpectations b/third_party/WebKit/LayoutTests/TestExpectations index ef00f975..49ebe81 100644 --- a/third_party/WebKit/LayoutTests/TestExpectations +++ b/third_party/WebKit/LayoutTests/TestExpectations
@@ -260,7 +260,6 @@ crbug.com/520188 [ Win ] http/tests/local/fileapi/file-last-modified-after-delete.html [ Failure Pass ] crbug.com/520611 [ Debug ] fast/filesystem/workers/file-writer-events-shared-worker.html [ Failure Pass ] crbug.com/520613 http/tests/cache/freshness-header.html [ Failure Pass ] -crbug.com/520619 [ Android Mac Linux Win7 ] webexposed/global-interface-listing.html [ Pass Timeout ] crbug.com/520194 http/tests/xmlhttprequest/timeout/xmlhttprequest-timeout-worker-overridesexpires.html [ Failure Pass ] crbug.com/410974 fast/scroll-behavior/scroll-customization/scrollstate-basic.html [ Pass Failure ] @@ -1131,18 +1130,6 @@ crbug.com/610464 [ Linux Win7 Debug ] inspector/components/throttler.html [ Failure Pass ] -# TODO(alph): Rebaseline once v8 part lands. -crbug.com/655430 inspector/tracing/timeline-js/timeline-script-tag-1.html [ NeedsManualRebaseline ] -crbug.com/655430 inspector/tracing/timeline-js/timeline-script-tag-2.html [ NeedsManualRebaseline ] -crbug.com/655430 inspector/tracing/timeline-misc/timeline-receive-response-event.html [ NeedsManualRebaseline ] -crbug.com/655430 inspector/tracing/timeline-time/timeline-time.html [ NeedsManualRebaseline ] -crbug.com/655430 inspector/tracing/timeline-time/timeline-timer.html [ NeedsManualRebaseline ] -crbug.com/655430 virtual/threaded/inspector/tracing/timeline-js/timeline-script-tag-1.html [ NeedsManualRebaseline ] -crbug.com/655430 virtual/threaded/inspector/tracing/timeline-js/timeline-script-tag-2.html [ NeedsManualRebaseline ] -crbug.com/655430 virtual/threaded/inspector/tracing/timeline-misc/timeline-receive-response-event.html [ NeedsManualRebaseline ] -crbug.com/655430 virtual/threaded/inspector/tracing/timeline-time/timeline-time.html [ NeedsManualRebaseline ] -crbug.com/655430 virtual/threaded/inspector/tracing/timeline-time/timeline-timer.html [ NeedsManualRebaseline ] - # TODO(jlebel): Remove when methods are implemented. crbug.com/624019 [ Mac ] bluetooth/notifications/add-multiple-event-listeners.html [ Skip ] crbug.com/624019 [ Mac ] bluetooth/notifications/concurrent-stops.html [ Skip ] @@ -1195,6 +1182,8 @@ crbug.com/624430 [ Win10 ] fast/text/font-features/caps-casemapping.html [ Failure ] +crbug.com/655955 [ Win Linux ] fast/transforms/transform-update-frame-overflow.html [ Pass Failure ] + crbug.com/620432 accessibility/aria-activedescendant.html [ Failure ] crbug.com/399507 [ Mac Linux Win10 ] virtual/threaded/inspector/tracing/timeline-paint/layer-tree.html [ Skip ] @@ -1284,3 +1273,5 @@ crbug.com/655458 imported/wpt/workers/semantics/structured-clone/dedicated.html [ Crash Failure Timeout ] crbug.com/655458 imported/wpt/workers/semantics/structured-clone/shared.html [ Crash Failure Timeout ] + +crbug.com/656622 inspector/sources/debugger-pause/debugger-eval-while-paused-throws.html [ NeedsManualRebaseline ]
diff --git a/third_party/WebKit/LayoutTests/compositing/overflow/fractional-sized-scrolling-layer-expected.png b/third_party/WebKit/LayoutTests/compositing/overflow/fractional-sized-scrolling-layer-expected.png new file mode 100644 index 0000000..e044ebf --- /dev/null +++ b/third_party/WebKit/LayoutTests/compositing/overflow/fractional-sized-scrolling-layer-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/compositing/overflow/fractional-sized-scrolling-layer-expected.txt b/third_party/WebKit/LayoutTests/compositing/overflow/fractional-sized-scrolling-layer-expected.txt new file mode 100644 index 0000000..0ef6df8c --- /dev/null +++ b/third_party/WebKit/LayoutTests/compositing/overflow/fractional-sized-scrolling-layer-expected.txt
@@ -0,0 +1,10 @@ +layer at (0,0) size 800x600 + LayoutView at (0,0) size 800x600 +layer at (0,0) size 800x8 + LayoutBlockFlow {HTML} at (0,0) size 800x8 + LayoutBlockFlow {BODY} at (8,8) size 784x0 +layer at (0,8) size 615x200 + LayoutBlockFlow (positioned) {DIV} at (0,8) size 615.05x200 [bgcolor=#000000] +layer at (40,8) size 288x200 clip at (40,8) size 273x200 scrollHeight 500 + LayoutBlockFlow {DIV} at (40,0) size 287.52x200 [bgcolor=#FF0000] + LayoutBlockFlow {DIV} at (0,0) size 272.52x500 [bgcolor=#00FF00]
diff --git a/third_party/WebKit/LayoutTests/compositing/overflow/fractional-sized-scrolling-layer.html b/third_party/WebKit/LayoutTests/compositing/overflow/fractional-sized-scrolling-layer.html new file mode 100644 index 0000000..66c3ec4 --- /dev/null +++ b/third_party/WebKit/LayoutTests/compositing/overflow/fractional-sized-scrolling-layer.html
@@ -0,0 +1,27 @@ +<!DOCTYPE html> +<style> + #contents { + height: 500px; + background-color: rgb(0,255,0); + } + #container { + overflow-y: scroll; + height: 200px; + width: 50%; + background-color: red; + } + #outercontainer { + position: absolute; + left: 0px; + width: 575.06px; + padding-left: 40px; + padding-right: 0px; + background-color: black; + } +</style> +<div id="outercontainer"> + <div id="container"> + <div id="contents"> + </div> + </div> +</div>
diff --git a/third_party/WebKit/LayoutTests/compositing/overflow/scaled-overflow-expected.png b/third_party/WebKit/LayoutTests/compositing/overflow/scaled-overflow-expected.png new file mode 100644 index 0000000..c1c4d7ff --- /dev/null +++ b/third_party/WebKit/LayoutTests/compositing/overflow/scaled-overflow-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/compositing/overflow/scaled-overflow-expected.txt b/third_party/WebKit/LayoutTests/compositing/overflow/scaled-overflow-expected.txt new file mode 100644 index 0000000..476a2a9 --- /dev/null +++ b/third_party/WebKit/LayoutTests/compositing/overflow/scaled-overflow-expected.txt
@@ -0,0 +1,15 @@ +layer at (0,0) size 800x600 + LayoutView at (0,0) size 800x600 +layer at (0,0) size 800x466 + LayoutBlockFlow {HTML} at (0,0) size 800x466 +layer at (8,8) size 784x450 + LayoutBlockFlow {BODY} at (8,8) size 784x450 [bgcolor=#000000] +layer at (8,8) size 150x150 clip at (8,8) size 135x135 scrollHeight 400 + LayoutBlockFlow (relative positioned) {DIV} at (0,0) size 150x150 [bgcolor=#FFFFFF] + LayoutBlockFlow {DIV} at (0,0) size 135x400 +layer at (9,168) size 150x150 clip at (9,168) size 135x135 scrollHeight 400 + LayoutBlockFlow (relative positioned) {DIV} at (0,150) size 150x150 [bgcolor=#FFFFFF] + LayoutBlockFlow {DIV} at (0,0) size 135x400 +layer at (10,328) size 150x150 clip at (10,328) size 135x135 scrollHeight 400 + LayoutBlockFlow (relative positioned) {DIV} at (0,300) size 150x150 [bgcolor=#FFFFFF] + LayoutBlockFlow {DIV} at (0,0) size 135x400
diff --git a/third_party/WebKit/LayoutTests/compositing/overflow/scaled-overflow.html b/third_party/WebKit/LayoutTests/compositing/overflow/scaled-overflow.html new file mode 100644 index 0000000..0c6d989 --- /dev/null +++ b/third_party/WebKit/LayoutTests/compositing/overflow/scaled-overflow.html
@@ -0,0 +1,33 @@ +<!DOCTYPE html> +<style> + body { + background: black; + transform: scale(0.75); + transform-origin: top left; + } + + .scroller { + position: relative; + overflow: scroll; + width: 150px; + height: 150px; + background: white local; + } + + .b { + left: 1px; + top: 10px; + } + + .c { + left: 2px; + top: 20px; + } + + .spacer { + height: 400px; + } +</style> +<div class="scroller"><div class="spacer"></div></div> +<div class="scroller b"><div class="spacer"></div></div> +<div class="scroller c"><div class="spacer"></div></div>
diff --git a/third_party/WebKit/LayoutTests/css3/condition-cssom.html b/third_party/WebKit/LayoutTests/css3/condition-cssom.html new file mode 100644 index 0000000..66b965e8 --- /dev/null +++ b/third_party/WebKit/LayoutTests/css3/condition-cssom.html
@@ -0,0 +1,62 @@ +<!DOCTYPE html> +<script src="../resources/testharness.js"></script> +<script src="../resources/testharnessreport.js"></script> +<style> + @media screen and (min-width: 480px) { + body { background-color: lightgreen; } + } + @media { + body { background-color: red; } + } + @supports (width: 0) { + s { width: 0; } + } +</style> +<p>Test for @media CSSOM <a href="http://crbug.com/651792">bug 651792</a>.</p> +<script> + test(function(){ + assert_equals(Object.getPrototypeOf(CSSMediaRule.prototype), CSSConditionRule.prototype); + assert_equals(Object.getPrototypeOf(CSSSupportsRule.prototype), CSSConditionRule.prototype); + }, "CSSConditionRule protype chain."); + + var rules = document.styleSheets[0].cssRules; + test(function(){ + assert_equals(CSSRule.STYLE_RULE,1); + assert_equals(CSSRule.MEDIA_RULE,4); + assert_equals(rules.length, 3); + assert_equals(rules[0].type, 4); + assert_equals(rules[0].cssRules.length, 1); + assert_equals(rules[0].cssRules[0].type, 1); + assert_equals(rules[0].media.mediaText, "screen and (min-width: 480px)"); + assert_equals(rules[0].conditionText, "screen and (min-width: 480px)"); + assert_equals(rules[0].media.mediaText,rules[0].conditionText); + assert_equals(rules[0].cssText, + "@media screen and (min-width: 480px) { \n" + + " body { background-color: lightgreen; }\n" + + "}"); + }, "@media inherited from CSSConditionRule."); + + test(function(){ + assert_equals(rules.length, 3); + assert_equals(rules[1].type, 4); + assert_equals(rules[1].cssRules.length, 1); + assert_equals(rules[1].cssRules[0].type, 1); + assert_equals(rules[1].media.mediaText, ""); + assert_equals(rules[1].conditionText, ""); + assert_equals(rules[1].media.mediaText,rules[1].conditionText); + assert_equals(rules[1].cssText, + "@media { \n" + + " body { background-color: red; }\n" + + "}"); + }, "@media inherited from CSSConditionRule, empty media."); + + test(function(){ + assert_equals(rules.length, 3); + assert_equals(rules[2].cssRules.length, 1); + assert_equals(rules[2].conditionText, "(width: 0)"); + assert_equals(rules[2].cssText, + "@supports (width: 0) {\n" + + " s { width: 0px; }\n" + + "}"); + }, "@supports inherited from CSSConditionRule."); +</script>
diff --git a/third_party/WebKit/LayoutTests/css3/supports-cssom-expected.txt b/third_party/WebKit/LayoutTests/css3/supports-cssom-expected.txt index 45a7252..135a18549a 100644 --- a/third_party/WebKit/LayoutTests/css3/supports-cssom-expected.txt +++ b/third_party/WebKit/LayoutTests/css3/supports-cssom-expected.txt
@@ -18,9 +18,9 @@ PASS rules[0].cssText is "@supports (width: 0) {\n s { width: 0px; }\n @supports (width: 1) {\n s { color: rgb(0, 0, 0); }\n}\n}" Missing argument exceptions. -PASS rules[0].insertRule() threw exception TypeError: Failed to execute 'insertRule' on 'CSSSupportsRule': 2 arguments required, but only 0 present.. -PASS rules[0].insertRule('@media all {}') threw exception TypeError: Failed to execute 'insertRule' on 'CSSSupportsRule': 2 arguments required, but only 1 present.. -PASS rules[0].deleteRule() threw exception TypeError: Failed to execute 'deleteRule' on 'CSSSupportsRule': 1 argument required, but only 0 present.. +PASS rules[0].insertRule() threw exception TypeError: Failed to execute 'insertRule' on 'CSSGroupingRule': 2 arguments required, but only 0 present.. +PASS rules[0].insertRule('@media all {}') threw exception TypeError: Failed to execute 'insertRule' on 'CSSGroupingRule': 2 arguments required, but only 1 present.. +PASS rules[0].deleteRule() threw exception TypeError: Failed to execute 'deleteRule' on 'CSSGroupingRule': 1 argument required, but only 0 present.. Inserting and deleting rules. rules[0].insertRule('@media all { #s { width: 0px; } }', 2) @@ -36,9 +36,9 @@ PASS rules[0].cssRules.length is 2 @charset, @namespace, @import rules are not allowed inside @supports. -PASS rules[0].insertRule('@charset "UTF-8"', 2) threw exception SyntaxError: Failed to execute 'insertRule' on 'CSSSupportsRule': the rule '@charset "UTF-8"' is invalid and cannot be parsed.. -PASS rules[0].insertRule('@namespace ""', 2) threw exception HierarchyRequestError: Failed to execute 'insertRule' on 'CSSSupportsRule': '@namespace' rules cannot be inserted inside a group rule.. -PASS rules[0].insertRule('@import url("../fast/cssom/resources/import.css")', 2) threw exception HierarchyRequestError: Failed to execute 'insertRule' on 'CSSSupportsRule': '@import' rules cannot be inserted inside a group rule.. +PASS rules[0].insertRule('@charset "UTF-8"', 2) threw exception SyntaxError: Failed to execute 'insertRule' on 'CSSGroupingRule': the rule '@charset "UTF-8"' is invalid and cannot be parsed.. +PASS rules[0].insertRule('@namespace ""', 2) threw exception HierarchyRequestError: Failed to execute 'insertRule' on 'CSSGroupingRule': '@namespace' rules cannot be inserted inside a group rule.. +PASS rules[0].insertRule('@import url("../fast/cssom/resources/import.css")', 2) threw exception HierarchyRequestError: Failed to execute 'insertRule' on 'CSSGroupingRule': '@import' rules cannot be inserted inside a group rule.. Whitespace and formatting should be preserved within the condition, whitespace outside the condition should be trimmed. PASS rules[1].conditionText is "(( ( padding: 0) and (display: none)) or (display: rainbow))"
diff --git a/third_party/WebKit/LayoutTests/css3/supports-cssom.html b/third_party/WebKit/LayoutTests/css3/supports-cssom.html index 2dec649..33e7169 100644 --- a/third_party/WebKit/LayoutTests/css3/supports-cssom.html +++ b/third_party/WebKit/LayoutTests/css3/supports-cssom.html
@@ -95,9 +95,9 @@ shouldEvaluateTo("rules[0].cssRules.length", 2); debug("\n@charset, @namespace, @import rules are not allowed inside @supports.") - shouldThrow("rules[0].insertRule('@charset \"UTF-8\"', 2)", '"SyntaxError: Failed to execute \'insertRule\' on \'CSSSupportsRule\': the rule \'@charset \\"UTF-8\\"\' is invalid and cannot be parsed."'); - shouldThrow("rules[0].insertRule('@namespace \"\"', 2)", '"HierarchyRequestError: Failed to execute \'insertRule\' on \'CSSSupportsRule\': \'@namespace\' rules cannot be inserted inside a group rule."'); - shouldThrow("rules[0].insertRule('@import url(\"../fast/cssom/resources/import.css\")', 2)", '"HierarchyRequestError: Failed to execute \'insertRule\' on \'CSSSupportsRule\': \'@import\' rules cannot be inserted inside a group rule."'); + shouldThrow("rules[0].insertRule('@charset \"UTF-8\"', 2)", '"SyntaxError: Failed to execute \'insertRule\' on \'CSSGroupingRule\': the rule \'@charset \\"UTF-8\\"\' is invalid and cannot be parsed."'); + shouldThrow("rules[0].insertRule('@namespace \"\"', 2)", '"HierarchyRequestError: Failed to execute \'insertRule\' on \'CSSGroupingRule\': \'@namespace\' rules cannot be inserted inside a group rule."'); + shouldThrow("rules[0].insertRule('@import url(\"../fast/cssom/resources/import.css\")', 2)", '"HierarchyRequestError: Failed to execute \'insertRule\' on \'CSSGroupingRule\': \'@import\' rules cannot be inserted inside a group rule."'); debug("\nWhitespace and formatting should be preserved within the condition, whitespace outside the condition should be trimmed.");
diff --git a/third_party/WebKit/LayoutTests/csspaint/registered-properties-in-custom-paint-expected.txt b/third_party/WebKit/LayoutTests/csspaint/registered-properties-in-custom-paint-expected.txt new file mode 100644 index 0000000..6c0dda2 --- /dev/null +++ b/third_party/WebKit/LayoutTests/csspaint/registered-properties-in-custom-paint-expected.txt
@@ -0,0 +1,11 @@ +CONSOLE MESSAGE: line 14: --length: [CSSSimpleLength=10px] +CONSOLE MESSAGE: line 14: --length-initial: [CSSSimpleLength=20px] +CONSOLE MESSAGE: line 14: --number: [CSSNumberValue=10] +This tests the style information in the paint callback. + +See the devtools console for test output. The console should log: + +--length: [CSSSimpleLength=10px] +--length-initial: [CSSSimpleLength=20px] +--number: [CSSNumberValue=10] +
diff --git a/third_party/WebKit/LayoutTests/csspaint/registered-properties-in-custom-paint.html b/third_party/WebKit/LayoutTests/csspaint/registered-properties-in-custom-paint.html new file mode 100644 index 0000000..1615ed1 --- /dev/null +++ b/third_party/WebKit/LayoutTests/csspaint/registered-properties-in-custom-paint.html
@@ -0,0 +1,42 @@ +<!DOCTYPE html> +<html> +<head> +<script src="../resources/run-after-layout-and-paint.js"></script> +<script src="resources/test-runner-paint-worklet.js"></script> +<script src="resources/generate-paint-style-logging.js"></script> +<style> + div { + width: 100px; + height: 100px; + + background-image: paint(test); + + --length: 10px; + --number: 10; + } +</style> +</head> +<body> +<div></div> +<script> + if (window.testRunner) + testRunner.dumpAsText(); + + CSS.registerProperty({name: '--length', syntax: '<length>', initialValue: '0px'}); + CSS.registerProperty({name: '--length-initial', syntax: '<length>', initialValue: '20px'}); + CSS.registerProperty({name: '--number', syntax: '<number>', initialValue: '0'}); + + importPaintWorkletAndTerminateTestAfterAsyncPaint( + generatePaintStyleLogging([ + '--length', + '--length-initial', + '--number', + ])); +</script> +<p>This tests the style information in the paint callback.</p> +<p>See the devtools console for test output. The console should log:</p> +--length: [CSSSimpleLength=10px]<br> +--length-initial: [CSSSimpleLength=20px]<br> +--number: [CSSNumberValue=10]<br> + +</html>
diff --git a/third_party/WebKit/LayoutTests/csspaint/resources/generate-paint-style-logging.js b/third_party/WebKit/LayoutTests/csspaint/resources/generate-paint-style-logging.js index fd142c2..7f114ba 100644 --- a/third_party/WebKit/LayoutTests/csspaint/resources/generate-paint-style-logging.js +++ b/third_party/WebKit/LayoutTests/csspaint/resources/generate-paint-style-logging.js
@@ -16,7 +16,13 @@ const properties = styleMap.getProperties().sort(); for (let i = 0; i < properties.length; i++) { const value = styleMap.get(properties[i]); - console.log(properties[i] + ': ' + (value ? value.cssText: '[null]')); + let serialized; + if (value) { + serialized = '[' + value.constructor.name + '=' + value.cssText + ']'; + } else { + serialized = '[null]'; + } + console.log(properties[i] + ': ' + serialized); } } });
diff --git a/third_party/WebKit/LayoutTests/csspaint/style-background-image-expected.txt b/third_party/WebKit/LayoutTests/csspaint/style-background-image-expected.txt index 72ad1701..54ea2db 100644 --- a/third_party/WebKit/LayoutTests/csspaint/style-background-image-expected.txt +++ b/third_party/WebKit/LayoutTests/csspaint/style-background-image-expected.txt
@@ -1,12 +1,12 @@ -CONSOLE MESSAGE: line 8: --bar: [null] -CONSOLE MESSAGE: line 8: --foo: bar -CONSOLE MESSAGE: line 8: align-items: normal -CONSOLE MESSAGE: line 8: border-radius: 2px +CONSOLE MESSAGE: line 14: --bar: [null] +CONSOLE MESSAGE: line 14: --foo: [CSSStyleValue= bar] +CONSOLE MESSAGE: line 14: align-items: [CSSStyleValue=normal] +CONSOLE MESSAGE: line 14: border-radius: [CSSStyleValue=2px] This tests the style information in the paint callback. See the devtools console for test output. The console should log: --bar: [null] ---foo: bar -align-items: normal -border-radius: 2px +--foo: [CSSStyleValue= bar] +align-items: [CSSStyleValue=normal] +border-radius: [CSSStyleValue=2px]
diff --git a/third_party/WebKit/LayoutTests/csspaint/style-background-image.html b/third_party/WebKit/LayoutTests/csspaint/style-background-image.html index 5bf668a..edb2d78 100644 --- a/third_party/WebKit/LayoutTests/csspaint/style-background-image.html +++ b/third_party/WebKit/LayoutTests/csspaint/style-background-image.html
@@ -32,8 +32,8 @@ <p>This tests the style information in the paint callback.</p> <p>See the devtools console for test output. The console should log:</p> --bar: [null]<br> ---foo: bar<br> -align-items: normal<br> -border-radius: 2px +--foo: [CSSStyleValue= bar]<br> +align-items: [CSSStyleValue=normal]<br> +border-radius: [CSSStyleValue=2px] </body> </html>
diff --git a/third_party/WebKit/LayoutTests/csspaint/style-before-pseudo-expected.txt b/third_party/WebKit/LayoutTests/csspaint/style-before-pseudo-expected.txt index 6eb69100..15d12f2 100644 --- a/third_party/WebKit/LayoutTests/csspaint/style-before-pseudo-expected.txt +++ b/third_party/WebKit/LayoutTests/csspaint/style-before-pseudo-expected.txt
@@ -1,10 +1,10 @@ -CONSOLE MESSAGE: line 8: --bar: [null] -CONSOLE MESSAGE: line 8: --foo: bar -CONSOLE MESSAGE: line 8: border-radius: 2px +CONSOLE MESSAGE: line 14: --bar: [null] +CONSOLE MESSAGE: line 14: --foo: [CSSStyleValue= bar] +CONSOLE MESSAGE: line 14: border-radius: [CSSStyleValue=2px] This tests the style information in the paint callback. See the devtools console for test output. The console should log: --bar: [null] ---foo: bar -border-radius: 2px +--foo: [CSSStyleValue= bar] +border-radius: [CSSStyleValue=2px]
diff --git a/third_party/WebKit/LayoutTests/csspaint/style-before-pseudo.html b/third_party/WebKit/LayoutTests/csspaint/style-before-pseudo.html index 6b4a0889..4a4b00b 100644 --- a/third_party/WebKit/LayoutTests/csspaint/style-before-pseudo.html +++ b/third_party/WebKit/LayoutTests/csspaint/style-before-pseudo.html
@@ -36,7 +36,7 @@ <p>This tests the style information in the paint callback.</p> <p>See the devtools console for test output. The console should log:</p> --bar: [null]<br> ---foo: bar<br> -border-radius: 2px +--foo: [CSSStyleValue= bar]<br> +border-radius: [CSSStyleValue=2px] </body> </html>
diff --git a/third_party/WebKit/LayoutTests/csspaint/style-first-letter-pseudo-expected.txt b/third_party/WebKit/LayoutTests/csspaint/style-first-letter-pseudo-expected.txt index 45afdd91..9dbd9a0 100644 --- a/third_party/WebKit/LayoutTests/csspaint/style-first-letter-pseudo-expected.txt +++ b/third_party/WebKit/LayoutTests/csspaint/style-first-letter-pseudo-expected.txt
@@ -1,10 +1,10 @@ -CONSOLE MESSAGE: line 8: color: rgb(255, 0, 0) -CONSOLE MESSAGE: line 8: line-height: 2px +CONSOLE MESSAGE: line 14: color: [CSSStyleValue=rgb(255, 0, 0)] +CONSOLE MESSAGE: line 14: line-height: [CSSSimpleLength=2px] Foo This tests the style information in the paint callback. See the devtools console for test output. The console should log: -color: rgb(255, 0, 0) -line-height: 2px +color: [CSSStyleValue=rgb(255, 0, 0)] +line-height: [CSSSimpleLength=2px]
diff --git a/third_party/WebKit/LayoutTests/csspaint/style-first-letter-pseudo.html b/third_party/WebKit/LayoutTests/csspaint/style-first-letter-pseudo.html index dcfcaa7d..2c16510 100644 --- a/third_party/WebKit/LayoutTests/csspaint/style-first-letter-pseudo.html +++ b/third_party/WebKit/LayoutTests/csspaint/style-first-letter-pseudo.html
@@ -31,7 +31,7 @@ </script> <p>This tests the style information in the paint callback.</p> <p>See the devtools console for test output. The console should log:</p> -color: rgb(255, 0, 0)<br> -line-height: 2px<br> +color: [CSSStyleValue=rgb(255, 0, 0)]<br> +line-height: [CSSSimpleLength=2px]<br> </body> </html>
diff --git a/third_party/WebKit/LayoutTests/fast/css-grid-layout/grid-auto-repeat-intrinsic.html b/third_party/WebKit/LayoutTests/fast/css-grid-layout/grid-auto-repeat-intrinsic.html new file mode 100644 index 0000000..fb3af19 --- /dev/null +++ b/third_party/WebKit/LayoutTests/fast/css-grid-layout/grid-auto-repeat-intrinsic.html
@@ -0,0 +1,107 @@ +<!DOCTYPE html> + +<link href="../css-intrinsic-dimensions/resources/width-keyword-classes.css" rel="stylesheet"> +<link href="resources/grid.css" rel="stylesheet"> + +<style> +.grid { + border: 2px solid black; + position: relative; + padding-top: 10px; + justify-items: start; +} + +.item { + background: cyan; + height: 20px; +} + +.gridAutoFillFixed { grid-template-columns: repeat(auto-fill, 20px) minmax(min-content, 40px); } +.gridAutoFillAuto { grid-template-columns: repeat(auto-fill, 10px) minmax(60px, auto); } +.gridAutoFitFixed { grid-template-columns: repeat(auto-fit, 20px) minmax(min-content, 40px); } +.gridAutoFitAuto { grid-template-columns: repeat(auto-fit, 10px) minmax(60px, auto); } + +.paddingTop { padding-top: 10px; } + +.abs { + height: 5px; + position: absolute; + width: 100%; +} +</style> + +<script src="../../resources/testharness.js"></script> +<script src="../../resources/testharnessreport.js"></script> +<script src="../../resources/check-layout-th.js"></script> + +<body onload="checkLayout('.grid')"> + +<p>This test checks that auto repeat tracks are properly recomputed and items are properly repositioned when grids have intrinsic inline sizes.</p> + +<div class="grid gridAutoFillFixed paddingTop max-content" data-expected-width="104" data-expected-height="34"> + <div class="item" style="grid-column: 1 / -1; width: 100px;" data-expected-width="100" data-expected-height="20" data-expected-x="0" data-expected-y="0"></div> + <div class="abs" style="grid-column: 1 / 2; background: purple;" data-expected-width="20" data-expected-height="5" data-expected-x="0" data-expected-y="0"></div> + <div class="abs" style="grid-column: 2 / 3; background: orange;" data-expected-width="20" data-expected-height="5" data-expected-x="20" data-expected-y="0"></div> + <div class="abs" style="grid-column: 3 / 4; background: yellow;" data-expected-width="20" data-expected-height="5" data-expected-x="40" data-expected-y="0"></div> + <div class="abs" style="grid-column: 4 / 5; background: green;" data-expected-width="40" data-expected-height="5" data-expected-x="60" data-expected-y="0"></div> +</div> + +<div class="grid gridAutoFillFixed paddingTop min-content" data-expected-width="104" data-expected-height="34"> + <div class="item" style="grid-column: 1 / -1; width: 100px;" data-expected-width="100" data-expected-height="20" data-expected-x="0" data-expected-y="0"></div> + <div class="abs" style="grid-column: 1 / 2; background: purple;" data-expected-width="20" data-expected-height="5" data-expected-x="0" data-expected-y="0"></div> + <div class="abs" style="grid-column: 2 / 3; background: orange;" data-expected-width="20" data-expected-height="5" data-expected-x="20" data-expected-y="0"></div> + <div class="abs" style="grid-column: 3 / 4; background: yellow;" data-expected-width="20" data-expected-height="5" data-expected-x="40" data-expected-y="0"></div> + <div class="abs" style="grid-column: 4 / 5; background: green;" data-expected-width="40" data-expected-height="5" data-expected-x="60" data-expected-y="0"></div> +</div> + +<div class="grid gridAutoFillAuto paddingTop max-content" data-expected-width="104" data-expected-height="34"> + <div class="item" style="grid-column: 1 / -1; width: 100px;" data-expected-width="100" data-expected-height="20" data-expected-x="0" data-expected-y="0"></div> + <div class="abs" style="grid-column: 1 / 2; background: purple;" data-expected-width="10" data-expected-height="5" data-expected-x="0" data-expected-y="0"></div> + <div class="abs" style="grid-column: 2 / 3; background: orange;" data-expected-width="10" data-expected-height="5" data-expected-x="20" data-expected-y="0"></div> + <div class="abs" style="grid-column: 3 / 4; background: yellow;" data-expected-width="10" data-expected-height="5" data-expected-x="40" data-expected-y="0"></div> + <div class="abs" style="grid-column: 4 / 5; background: green;" data-expected-width="10" data-expected-height="5" data-expected-x="60" data-expected-y="0"></div> +</div> + +<div class="grid gridAutoFillAuto paddingTop min-content" data-expected-width="74" data-expected-height="34"> + <div class="item" style="grid-column: 1 / -1; width: 100px;" data-expected-width="100" data-expected-height="20" data-expected-x="0" data-expected-y="0"></div> + <div class="abs" style="grid-column: 1 / 2; background: purple;" data-expected-width="10" data-expected-height="5" data-expected-x="0" data-expected-y="0"></div> + <div class="abs" style="grid-column: 2 / 3; background: orange;" data-expected-width="60" data-expected-height="5" data-expected-x="20" data-expected-y="0"></div> + <div class="abs" style="grid-column: 3 / 4; background: yellow;" data-expected-width="0" data-expected-height="5" data-expected-x="40" data-expected-y="0"></div> + <div class="abs" style="grid-column: 4 / 5; background: green;" data-expected-width="70" data-expected-height="5" data-expected-x="60" data-expected-y="0"></div> +</div> + +<!-- auto-fill --> + +<div class="grid gridAutoFitFixed paddingTop max-content" data-expected-width="104" data-expected-height="34"> + <div class="item" style="grid-column: 1 / -1; width: 100px;" data-expected-width="100" data-expected-height="20" data-expected-x="0" data-expected-y="0"></div> + <div class="abs" style="grid-column: 1 / 2; background: purple;" data-expected-width="20" data-expected-height="5" data-expected-x="0" data-expected-y="0"></div> + <div class="abs" style="grid-column: 2 / 3; background: orange;" data-expected-width="20" data-expected-height="5" data-expected-x="20" data-expected-y="0"></div> + <div class="abs" style="grid-column: 3 / 4; background: yellow;" data-expected-width="20" data-expected-height="5" data-expected-x="40" data-expected-y="0"></div> + <div class="abs" style="grid-column: 4 / 5; background: green;" data-expected-width="40" data-expected-height="5" data-expected-x="60" data-expected-y="0"></div> +</div> + +<div class="grid gridAutoFitFixed paddingTop min-content" data-expected-width="104" data-expected-height="34"> + <div class="item" style="grid-column: 1 / -1; width: 100px;" data-expected-width="100" data-expected-height="20" data-expected-x="0" data-expected-y="0"></div> + <div class="abs" style="grid-column: 1 / 2; background: purple;" data-expected-width="20" data-expected-height="5" data-expected-x="0" data-expected-y="0"></div> + <div class="abs" style="grid-column: 2 / 3; background: orange;" data-expected-width="20" data-expected-height="5" data-expected-x="20" data-expected-y="0"></div> + <div class="abs" style="grid-column: 3 / 4; background: yellow;" data-expected-width="20" data-expected-height="5" data-expected-x="40" data-expected-y="0"></div> + <div class="abs" style="grid-column: 4 / 5; background: green;" data-expected-width="40" data-expected-height="5" data-expected-x="60" data-expected-y="0"></div> +</div> + +<div class="grid gridAutoFitAuto paddingTop max-content" data-expected-width="104" data-expected-height="34"> + <div class="item" style="grid-column: 1 / -1; width: 100px;" data-expected-width="100" data-expected-height="20" data-expected-x="0" data-expected-y="0"></div> + <div class="abs" style="grid-column: 1 / 2; background: purple;" data-expected-width="10" data-expected-height="5" data-expected-x="0" data-expected-y="0"></div> + <div class="abs" style="grid-column: 2 / 3; background: orange;" data-expected-width="10" data-expected-height="5" data-expected-x="20" data-expected-y="0"></div> + <div class="abs" style="grid-column: 3 / 4; background: yellow;" data-expected-width="10" data-expected-height="5" data-expected-x="40" data-expected-y="0"></div> + <div class="abs" style="grid-column: 4 / 5; background: green;" data-expected-width="10" data-expected-height="5" data-expected-x="60" data-expected-y="0"></div> +</div> + +<div class="grid gridAutoFitAuto paddingTop min-content" data-expected-width="74" data-expected-height="34"> + <div class="item" style="grid-column: 1 / -1; width: 100px;" data-expected-width="100" data-expected-height="20" data-expected-x="0" data-expected-y="0"></div> + <div class="abs" style="grid-column: 1 / 2; background: purple;" data-expected-width="10" data-expected-height="5" data-expected-x="0" data-expected-y="0"></div> + <div class="abs" style="grid-column: 2 / 3; background: orange;" data-expected-width="60" data-expected-height="5" data-expected-x="20" data-expected-y="0"></div> + <div class="abs" style="grid-column: 3 / 4; background: yellow;" data-expected-width="0" data-expected-height="5" data-expected-x="40" data-expected-y="0"></div> + <div class="abs" style="grid-column: 4 / 5; background: green;" data-expected-width="70" data-expected-height="5" data-expected-x="60" data-expected-y="0"></div> +</div> + +</body>
diff --git a/third_party/WebKit/LayoutTests/fast/css-grid-layout/grid-change-intrinsic-size-with-auto-repeat-tracks-expected.txt b/third_party/WebKit/LayoutTests/fast/css-grid-layout/grid-change-intrinsic-size-with-auto-repeat-tracks-expected.txt new file mode 100644 index 0000000..fbba5d0 --- /dev/null +++ b/third_party/WebKit/LayoutTests/fast/css-grid-layout/grid-change-intrinsic-size-with-auto-repeat-tracks-expected.txt
@@ -0,0 +1,9 @@ +This test checks that changing the min|max-content contributions of grid items properly recomputes both track sizes and grid positions in grids with auto repeat tracks. +PASS +PASS +PASS +PASS +PASS +PASS +PASS +PASS
diff --git a/third_party/WebKit/LayoutTests/fast/css-grid-layout/grid-change-intrinsic-size-with-auto-repeat-tracks.html b/third_party/WebKit/LayoutTests/fast/css-grid-layout/grid-change-intrinsic-size-with-auto-repeat-tracks.html new file mode 100644 index 0000000..fadfc0b9 --- /dev/null +++ b/third_party/WebKit/LayoutTests/fast/css-grid-layout/grid-change-intrinsic-size-with-auto-repeat-tracks.html
@@ -0,0 +1,144 @@ +<!DOCTYPE html> +<link href="resources/grid.css" rel="stylesheet"> +<link href="../css-intrinsic-dimensions/resources/width-keyword-classes.css" rel="stylesheet"> +<style> +.grid { + border: 2px solid black; + position: relative; + min-width: 30px; + + grid-auto-columns: 20px; + + padding-top: 10px; + margin-bottom: 10px; +} + +.gridAutoFillAndMinContentFixed { grid-template-columns: repeat(auto-fill, 20px) minmax(min-content, 40px); } + +.abs { height: 5px; position: absolute; width: 100%; } + +</style> +<!-- Explicitly not using layout-th because it does not allow multiple checkLayout(). --> +<script src="../../resources/check-layout.js"></script> +<script> +function setGridTemplate(id, gridTemplateRows, gridTemplateColumns) +{ + var gridElement = document.getElementById(id); + gridElement.style.gridTemplateRows = gridTemplateRows; + gridElement.style.gridTemplateColumns = gridTemplateColumns; +} + +function setItemSize(id, width, height) +{ + var gridElement = document.getElementById(id); + gridElement.style.width = width; + gridElement.style.height = height; +} + +function testGridDefinitions(gridItemsData) +{ + var length = gridItemsData.length; + for (i = 0; i < length; ++i) { + var item = document.getElementById(gridItemsData[i].id); + item.setAttribute("data-expected-width", gridItemsData[i].width); + item.setAttribute("data-expected-height", gridItemsData[i].height); + item.setAttribute("data-offset-x", gridItemsData[i].x); + item.setAttribute("data-offset-y", gridItemsData[i].y); + } + + checkLayout(".grid"); +} + +function testChangingGridDefinitions() +{ + setGridTemplate('grid1', 'none', 'repeat(auto-fill, 20px) minmax(min-content, 40px)'); + + setItemSize('item', '100px', '30px'); + testGridDefinitions([ + { 'id': 'item', 'width': '100', 'height': '30', 'x': '0', 'y': '10' }, + { 'id': 'a1', 'width': '20', 'height': '5', 'x': '0', 'y': '0' }, + { 'id': 'a2', 'width': '20', 'height': '5', 'x': '20', 'y': '0' }, + { 'id': 'a3', 'width': '20', 'height': '5', 'x': '40', 'y': '0' }, + { 'id': 'a4', 'width': '40', 'height': '5', 'x': '60', 'y': '0' } + ]); + + setItemSize('item', '80px', '30px'); + testGridDefinitions([ + { 'id': 'item', 'width': '80', 'height': '30', 'x': '0', 'y': '10' }, + { 'id': 'a1', 'width': '20', 'height': '5', 'x': '0', 'y': '0' }, + { 'id': 'a2', 'width': '20', 'height': '5', 'x': '20', 'y': '0' }, + { 'id': 'a3', 'width': '40', 'height': '5', 'x': '40', 'y': '0' }, + { 'id': 'a4', 'width': '0', 'height': '5', 'x': '80', 'y': '0' } + ]); + + setItemSize('item', '15px', '30px'); + testGridDefinitions([ + { 'id': 'item', 'width': '15', 'height': '30', 'x': '0', 'y': '10' }, + { 'id': 'a1', 'width': '20', 'height': '5', 'x': '0', 'y': '0' }, + { 'id': 'a2', 'width': '40', 'height': '5', 'x': '20', 'y': '0' }, + { 'id': 'a3', 'width': '0', 'height': '5', 'x': '60', 'y': '0' }, + { 'id': 'a4', 'width': '60', 'height': '5', 'x': '0', 'y': '0' } + ]); + + setItemSize('item', '120px', '30px'); + testGridDefinitions([ + { 'id': 'item', 'width': '120', 'height': '30', 'x': '0', 'y': '10' }, + { 'id': 'a1', 'width': '20', 'height': '5', 'x': '0', 'y': '0' }, + { 'id': 'a2', 'width': '20', 'height': '5', 'x': '20', 'y': '0' }, + { 'id': 'a3', 'width': '20', 'height': '5', 'x': '40', 'y': '0' }, + { 'id': 'a4', 'width': '20', 'height': '5', 'x': '60', 'y': '0' } + ]); + + var grid = document.getElementById('grid1'); + grid.className = grid.className.replace('max-content', 'min-content'); + + setItemSize('item', '100px', '30px'); + testGridDefinitions([ + { 'id': 'item', 'width': '100', 'height': '30', 'x': '0', 'y': '10' }, + { 'id': 'a1', 'width': '20', 'height': '5', 'x': '0', 'y': '0' }, + { 'id': 'a2', 'width': '20', 'height': '5', 'x': '20', 'y': '0' }, + { 'id': 'a3', 'width': '20', 'height': '5', 'x': '40', 'y': '0' }, + { 'id': 'a4', 'width': '40', 'height': '5', 'x': '60', 'y': '0' } + ]); + + setItemSize('item', '80px', '30px'); + testGridDefinitions([ + { 'id': 'item', 'width': '80', 'height': '30', 'x': '0', 'y': '10' }, + { 'id': 'a1', 'width': '20', 'height': '5', 'x': '0', 'y': '0' }, + { 'id': 'a2', 'width': '20', 'height': '5', 'x': '20', 'y': '0' }, + { 'id': 'a3', 'width': '40', 'height': '5', 'x': '40', 'y': '0' }, + { 'id': 'a4', 'width': '0', 'height': '5', 'x': '80', 'y': '0' } + ]); + + setItemSize('item', '15px', '30px'); + testGridDefinitions([ + { 'id': 'item', 'width': '15', 'height': '30', 'x': '0', 'y': '10' }, + { 'id': 'a1', 'width': '20', 'height': '5', 'x': '0', 'y': '0' }, + { 'id': 'a2', 'width': '10', 'height': '5', 'x': '20', 'y': '0' }, + { 'id': 'a3', 'width': '0', 'height': '5', 'x': '30', 'y': '0' }, + { 'id': 'a4', 'width': '30', 'height': '5', 'x': '0', 'y': '0' } + ]); + + setItemSize('item', '120px', '30px'); + testGridDefinitions([ + { 'id': 'item', 'width': '120', 'height': '30', 'x': '0', 'y': '10' }, + { 'id': 'a1', 'width': '20', 'height': '5', 'x': '0', 'y': '0' }, + { 'id': 'a2', 'width': '20', 'height': '5', 'x': '20', 'y': '0' }, + { 'id': 'a3', 'width': '20', 'height': '5', 'x': '40', 'y': '0' }, + { 'id': 'a4', 'width': '20', 'height': '5', 'x': '60', 'y': '0' } + ]); +} + +window.addEventListener("load", testChangingGridDefinitions, false); +</script> + +<div>This test checks that changing the min|max-content contributions of grid items properly recomputes both track sizes and grid positions in grids with auto repeat tracks.</div> +<div id="log"></div> + +<div id="grid1" class="grid max-content"> + <div id="item" style="grid-column: 1 / -1; background: cyan;"></div> + <div id="a1" class="abs" style="grid-column: 1 / 2; background: purple;"></div> + <div id="a2" class="abs" style="grid-column: 2 / 3; background: orange;"></div> + <div id="a3" class="abs" style="grid-column: 3 / 4; background: yellow;"></div> + <div id="a4" class="abs" style="grid-column: 4 / 5; background: magenta;"></div> +</div>
diff --git a/third_party/WebKit/LayoutTests/fast/css-grid-layout/mozilla/grid-repeat-auto-fill-fit-001-expected.html b/third_party/WebKit/LayoutTests/fast/css-grid-layout/mozilla/grid-repeat-auto-fill-fit-001-expected.html index ea2feba5..58e80a30 100644 --- a/third_party/WebKit/LayoutTests/fast/css-grid-layout/mozilla/grid-repeat-auto-fill-fit-001-expected.html +++ b/third_party/WebKit/LayoutTests/fast/css-grid-layout/mozilla/grid-repeat-auto-fill-fit-001-expected.html
@@ -101,8 +101,8 @@ <div class="grid r1 xw80"><x></x><x></x><a></a><b></b><x></x></div> <div class="grid r1 xw50 c2"><x></x><x></x><a></a><b></b><x></x></div> <div class="grid r1 w100 xw80"><x></x><x></x><a></a><b></b><x></x></div> -<div class="grid r1 mw50 float c2"><x></x><x></x><a></a><b></b><x></x></div> -<div class="grid r1 mw80 float"><x></x><x></x><a></a><b></b><x></x></div> +<div class="grid r1 mw50 float"><x></x><x></x><a></a><b></b><x></x></div> +<div class="grid r1 mw80 float c4"><x></x><x></x><a></a><b></b><x></x></div> <div class="grid r1 w100 mw50 float c4"><x></x><x></x><a></a><b></b><x></x></div> <div class="grid r1 mw100 w50 float c4"><x></x><x></x><a></a><b></b><x></x></div> @@ -118,7 +118,7 @@ <div class="grid r2 xw50 c1"><x></x><x></x><a></a><b></b><x></x></div> <div class="grid r2 w100 xw80 c2"><x></x><x></x><a></a><b></b><x></x></div> <div class="grid r2 mw50 float c1"><x></x><x></x><a></a><b></b><x></x></div> -<div class="grid r2 mw80 float c2"><x></x><x></x><a></a><b></b><x></x></div> +<div class="grid r2 mw80 float"><x></x><x></x><a></a><b></b><x></x></div> <div class="grid r2 w100 mw50 float"><x></x><x></x><a></a><b></b><x></x></div> <div class="grid r2 mw100 w50 float"><x></x><x></x><a></a><b></b><x></x></div> @@ -150,7 +150,7 @@ <div class="grid r1 xw80"><x></x><x></x><a></a><b></b><x></x></div> <div class="grid r1 xw50 c2"><x></x><x></x><a></a><b></b><x></x></div> <div class="grid r1 w100 xw80"><x></x><x></x><a></a><b></b><x></x></div> -<div class="grid r1 mw50 float c2"><x></x><x></x><a></a><b></b><x></x></div> +<div class="grid r1 mw50 float"><x></x><x></x><a></a><b></b><x></x></div> <div class="grid r1 mw80 float"><x></x><x></x><a></a><b></b><x></x></div> <div class="grid r1 w100 mw50 float"><x></x><x></x><a></a><b></b><x></x></div> <div class="grid r1 mw100 w50 float"><x></x><x></x><a></a><b></b><x></x></div> @@ -167,7 +167,7 @@ <div class="grid r2 xw50 c1"><x></x><x></x><a></a><b></b><x></x></div> <div class="grid r2 w100 xw80 c2"><x></x><x></x><a></a><b></b><x></x></div> <div class="grid r2 mw50 float c1"><x></x><x></x><a></a><b></b><x></x></div> -<div class="grid r2 mw80 float c2"><x></x><x></x><a></a><b></b><x></x></div> +<div class="grid r2 mw80 float"><x></x><x></x><a></a><b></b><x></x></div> <div class="grid r2 w100 mw50 float"><x></x><x></x><a></a><b></b><x></x></div> <div class="grid r2 mw100 w50 float"><x></x><x></x><a></a><b></b><x></x></div>
diff --git a/third_party/WebKit/LayoutTests/fast/css-grid-layout/setting-node-properties-to-null-during-layout-should-not-crash-expected.txt b/third_party/WebKit/LayoutTests/fast/css-grid-layout/setting-node-properties-to-null-during-layout-should-not-crash-expected.txt new file mode 100644 index 0000000..4900486 --- /dev/null +++ b/third_party/WebKit/LayoutTests/fast/css-grid-layout/setting-node-properties-to-null-during-layout-should-not-crash-expected.txt
@@ -0,0 +1,3 @@ +This test passes if it does not crash. + +
diff --git a/third_party/WebKit/LayoutTests/fast/css-grid-layout/setting-node-properties-to-null-during-layout-should-not-crash.html b/third_party/WebKit/LayoutTests/fast/css-grid-layout/setting-node-properties-to-null-during-layout-should-not-crash.html new file mode 100644 index 0000000..889a280 --- /dev/null +++ b/third_party/WebKit/LayoutTests/fast/css-grid-layout/setting-node-properties-to-null-during-layout-should-not-crash.html
@@ -0,0 +1,32 @@ +<!DOCTYPE html> +<link href="resources/grid.css" rel="stylesheet"> +<link href="../css-intrinsic-dimensions/resources/width-keyword-classes.css" rel="stylesheet"> +<script> +if (window.testRunner) { + testRunner.dumpAsText(); +} +</script> +<script> +function nullifyNodeProperties(node) { + for (var key in node) { + try { + var a = node[key]; + node[key] = null; + } catch (e) { + } + } +} + +function runTest() { + document.body.offsetLeft; + + var element = document.getElementById("node"); + nullifyNodeProperties(element); +} +</script> +<body onload="runTest();"> +<p>This test passes if it does not crash.</p> +<div class="grid verticalRL fit-content"> + <div id="node" class="horizontalTB"></div> +</div> +</body>
diff --git a/third_party/WebKit/LayoutTests/fast/events/constructors/security-policy-violation-event-constructor-expected.txt b/third_party/WebKit/LayoutTests/fast/events/constructors/security-policy-violation-event-constructor-expected.txt index c824a64b..ffef2bf 100644 --- a/third_party/WebKit/LayoutTests/fast/events/constructors/security-policy-violation-event-constructor-expected.txt +++ b/third_party/WebKit/LayoutTests/fast/events/constructors/security-policy-violation-event-constructor-expected.txt
@@ -3,7 +3,7 @@ On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". -PASS new SecurityPolicyViolationEvent('eventType').bubbles is false +PASS new SecurityPolicyViolationEvent('eventType').bubbles is true PASS new SecurityPolicyViolationEvent('eventType').cancelable is false PASS new SecurityPolicyViolationEvent('eventType').documentURI is "" PASS new SecurityPolicyViolationEvent('eventType').referrer is "" @@ -16,10 +16,10 @@ PASS new SecurityPolicyViolationEvent('eventType').lineNumber is 0 PASS new SecurityPolicyViolationEvent('eventType').columnNumber is 0 PASS new SecurityPolicyViolationEvent('eventType').statusCode is 0 -PASS new SecurityPolicyViolationEvent('eventType', { bubbles: false }).bubbles is false +PASS new SecurityPolicyViolationEvent('eventType', { bubbles: false }).bubbles is true PASS new SecurityPolicyViolationEvent('eventType', { bubbles: true }).bubbles is true PASS new SecurityPolicyViolationEvent('eventType', { cancelable: false }).cancelable is false -PASS new SecurityPolicyViolationEvent('eventType', { cancelable: true }).cancelable is true +PASS new SecurityPolicyViolationEvent('eventType', { cancelable: true }).cancelable is false PASS new SecurityPolicyViolationEvent('eventType', { documentURI: 'foo' }).documentURI is "foo" PASS new SecurityPolicyViolationEvent('eventType', { referrer: 'foo' }).referrer is "foo" PASS new SecurityPolicyViolationEvent('eventType', { blockedURI: 'foo' }).blockedURI is "foo"
diff --git a/third_party/WebKit/LayoutTests/fast/events/constructors/security-policy-violation-event-constructor.html b/third_party/WebKit/LayoutTests/fast/events/constructors/security-policy-violation-event-constructor.html index 14b3a56..424af49 100644 --- a/third_party/WebKit/LayoutTests/fast/events/constructors/security-policy-violation-event-constructor.html +++ b/third_party/WebKit/LayoutTests/fast/events/constructors/security-policy-violation-event-constructor.html
@@ -12,7 +12,7 @@ var testDiv = document.createElement("div"); // No initializer is passed. -shouldBeFalse("new SecurityPolicyViolationEvent('eventType').bubbles"); +shouldBeTrue("new SecurityPolicyViolationEvent('eventType').bubbles"); shouldBeFalse("new SecurityPolicyViolationEvent('eventType').cancelable"); shouldBeEmptyString("new SecurityPolicyViolationEvent('eventType').documentURI"); shouldBeEmptyString("new SecurityPolicyViolationEvent('eventType').referrer"); @@ -26,13 +26,13 @@ shouldBe("new SecurityPolicyViolationEvent('eventType').columnNumber", "0"); shouldBe("new SecurityPolicyViolationEvent('eventType').statusCode", "0"); -// bubbles is passed. -shouldBeFalse("new SecurityPolicyViolationEvent('eventType', { bubbles: false }).bubbles"); +// bubbles is always true. +shouldBeTrue("new SecurityPolicyViolationEvent('eventType', { bubbles: false }).bubbles"); shouldBeTrue("new SecurityPolicyViolationEvent('eventType', { bubbles: true }).bubbles"); -// cancelable is passed. +// cancelable is always false. shouldBeFalse("new SecurityPolicyViolationEvent('eventType', { cancelable: false }).cancelable"); -shouldBeTrue("new SecurityPolicyViolationEvent('eventType', { cancelable: true }).cancelable"); +shouldBeFalse("new SecurityPolicyViolationEvent('eventType', { cancelable: true }).cancelable"); // String members are passed. ["documentURI", "referrer", "blockedURI", "violatedDirective", "effectiveDirective", "originalPolicy", "sourceFile"].forEach(function(member) {
diff --git a/third_party/WebKit/LayoutTests/fast/forms/form-submission-crash-successful-submit-button.html b/third_party/WebKit/LayoutTests/fast/forms/form-submission-crash-successful-submit-button.html index d44e8cb..97d665d7 100644 --- a/third_party/WebKit/LayoutTests/fast/forms/form-submission-crash-successful-submit-button.html +++ b/third_party/WebKit/LayoutTests/fast/forms/form-submission-crash-successful-submit-button.html
@@ -16,6 +16,7 @@ form1.action = 'javascript:removeImage()'; form1.appendChild(submit1); form1.appendChild(submit2); + document.body.appendChild(form1); submit1.click(); testPassed('if not crashed.'); finishJSTest();
diff --git a/third_party/WebKit/LayoutTests/fast/forms/form-submission-crash.html b/third_party/WebKit/LayoutTests/fast/forms/form-submission-crash.html index b8b42b33..b361f675 100644 --- a/third_party/WebKit/LayoutTests/fast/forms/form-submission-crash.html +++ b/third_party/WebKit/LayoutTests/fast/forms/form-submission-crash.html
@@ -13,6 +13,7 @@ form1.addEventListener('submit', handleSubmit, false); form1.action = 'javascript:gc()'; form1.appendChild(submit1); + document.body.appendChild(form1); submit1.click(); testPassed('if not crashed.'); finishJSTest();
diff --git a/third_party/WebKit/LayoutTests/fast/forms/submit-form-not-attached-to-document.html b/third_party/WebKit/LayoutTests/fast/forms/submit-form-not-attached-to-document.html new file mode 100644 index 0000000..08353c8e8 --- /dev/null +++ b/third_party/WebKit/LayoutTests/fast/forms/submit-form-not-attached-to-document.html
@@ -0,0 +1,40 @@ +<!DOCTYPE html> +<script src="../../resources/testharness.js"></script> +<script src="../../resources/testharnessreport.js"></script> +<body> + <form action="javascript: redirect()"></form> +<script> +var f1 = document.forms[0]; +test(function() { + f1.parentNode.removeChild(f1); + f1.submit(); +}, 'Submitting a form that has been removed.'); + +var f2 = document.createElement('form'); +f2.action = "javascript: redirect()"; +test(function() { + f2.submit(); +}, 'Submitting a form that has never been attached to the document.'); + +document.body.appendChild(f2); +var f3 = f2.cloneNode(true); +f2.action = "javascript: submit_success()"; +f3.action = "javascript: redirect()"; +test(function() { + f2.submit(); +}, 'Submitting a form that is attached to the document.'); + +test(function() { + f3.submit(); +}, 'Submitting a form cloned from a form that is attached to the document.'); + +function redirect() { + assert_unreached('A form should never be submitted if it is not attached to the document.'); +} + +function submit_success() { + assert_true(true, 'A form that is attached to the document should be submitted.'); +} + +</script> +</body>
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=TraceWrappables/fast/dom/NodeList/nodelist-reachable-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=TraceWrappables/fast/dom/NodeList/nodelist-reachable-expected.txt new file mode 100644 index 0000000..50943e4 --- /dev/null +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=TraceWrappables/fast/dom/NodeList/nodelist-reachable-expected.txt
@@ -0,0 +1,10 @@ +PASS document.body.childNodes.customProperty is 1 +PASS document.getElementsByClassName("class").customProperty is 2 +PASS document.getElementsByName("name").customProperty is 3 +PASS document.getElementsByTagName("body").customProperty is 4 +PASS document.querySelector("form").elements["radios"].customProperty is 5 +PASS document.querySelector("input").labels.customProperty is 6 +PASS successfullyParsed is true + +TEST COMPLETE +
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=TraceWrappables/fast/xmlhttprequest/xmlhttprequest-responsetype-arraybuffer-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=TraceWrappables/fast/xmlhttprequest/xmlhttprequest-responsetype-arraybuffer-expected.txt new file mode 100644 index 0000000..1971f8d0 --- /dev/null +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=TraceWrappables/fast/xmlhttprequest/xmlhttprequest-responsetype-arraybuffer-expected.txt
@@ -0,0 +1,30 @@ +Tests XMLHttpRequest 'arraybuffer' loading with the .responseType and .response attributes. + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + +PASS 'arraybuffer' .response does not exist when .readyState is 1. +PASS responseType property exists. +PASS response property exists. +PASS xhr.responseType is initially set to default value of empty string. +PASS xhr.responseType has been correctly set to ''. +PASS xhr.responseType has been correctly set to 'text'. +PASS xhr.responseType has been correctly set to 'document'. +PASS xhr.responseType has been correctly set to 'arraybuffer'. +PASS 'arraybuffer' .response does not exist when .readyState is 2. +PASS 'arraybuffer' .response does not exist when .readyState is 3. +PASS 'arraybuffer' .response exists when .readyState is 4. +PASS DONE LOADING +PASS received response object : [object ArrayBuffer]. +PASS exception correctly thrown when xhr.responseType is set to valid value too late in the loading process : InvalidStateError: Failed to set the 'responseType' property on 'XMLHttpRequest': The response type cannot be set if the object's state is LOADING or DONE.. +response length : 670184. +bytes at offset 0 : 46 4f 52 4d 0 a 39 e0 +bytes at offset 356874 : a 91 f 5f 8 2f e fd +bytes at offset 670166 : 8 be 3 c 6 91 2 8 +checksum : 84637740 +PASS exception correctly thrown when xhr.responseText is accessed but responseType is 'arraybuffer' : InvalidStateError: Failed to read the 'responseText' property from 'XMLHttpRequest': The value is only accessible if the object's 'responseType' is '' or 'text' (was 'arraybuffer').. +PASS exception correctly thrown when xhr.responseXML is accessed but responseType is 'arraybuffer' : InvalidStateError: Failed to read the 'responseXML' property from 'XMLHttpRequest': The value is only accessible if the object's 'responseType' is '' or 'document' (was 'arraybuffer').. +PASS xhr.response.foo is 'bar' +PASS successfullyParsed is true + +TEST COMPLETE +
diff --git a/third_party/WebKit/LayoutTests/fragmentation/fragmented-table-with-fixed-height-expected.html b/third_party/WebKit/LayoutTests/fragmentation/fragmented-table-with-fixed-height-expected.html new file mode 100644 index 0000000..463eefa --- /dev/null +++ b/third_party/WebKit/LayoutTests/fragmentation/fragmented-table-with-fixed-height-expected.html
@@ -0,0 +1,5 @@ +<!DOCTYPE html> +<p>Below there should be a blue square snapped to the blue line above it.</p> +<div style="width:300px; border-top:1px solid blue;"> + <div style="margin-left:100px; width:80px; height:80px; background:blue;"></div> +</div>
diff --git a/third_party/WebKit/LayoutTests/fragmentation/fragmented-table-with-fixed-height.html b/third_party/WebKit/LayoutTests/fragmentation/fragmented-table-with-fixed-height.html new file mode 100644 index 0000000..067c2786 --- /dev/null +++ b/third_party/WebKit/LayoutTests/fragmentation/fragmented-table-with-fixed-height.html
@@ -0,0 +1,24 @@ +<!DOCTYPE html> +<p>Below there should be a blue square snapped to the blue line above it.</p> +<div style="columns:3; column-gap:0; column-fill:auto; width:300px; line-height:20px; height:90px; border-top:1px solid blue; orphans:1; widows:1;"> + <div style="height:40px;"></div> + <table cellpadding="0" cellspacing="0" style="height:200px;"> + <tr> + <td><br><br></td> + </tr> + <tr> + <td> + <!-- Need an empty first block, so that there's a break + opportunity before the second one. There's no break + opportunity before a first child block. --> + <div></div> + <div style="width:80px; background:blue;"> + <br><br><br> + </div> + </td> + </tr> + </table> + <div style="width:80px; background:blue;"> + <br> + </div> +</div>
diff --git a/third_party/WebKit/LayoutTests/http/tests/cookies/same-site/popup-cross-site-post.html b/third_party/WebKit/LayoutTests/http/tests/cookies/same-site/popup-cross-site-post.html index ec32a89..44be2fbe 100644 --- a/third_party/WebKit/LayoutTests/http/tests/cookies/same-site/popup-cross-site-post.html +++ b/third_party/WebKit/LayoutTests/http/tests/cookies/same-site/popup-cross-site-post.html
@@ -2,6 +2,7 @@ <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="/cookies/resources/testharness-helpers.js"></script> +<body> <script> // Set cookies on ORIGINAL_HOST, then move ourselves to TEST_ROOT so // we can verify cross-origin behavior. @@ -29,6 +30,8 @@ f.method = "POST"; f.target = "_blank" window.onload = t.step_func(f.submit.bind(f)); + document.body.appendChild(f); }, "'" + ORIGINAL_HOST + "' is not same-site with '" + TEST_HOST + "', so samesite cookies are not sent via POST."); } </script> +</body>
diff --git a/third_party/WebKit/LayoutTests/http/tests/cookies/same-site/popup-same-site-post.html b/third_party/WebKit/LayoutTests/http/tests/cookies/same-site/popup-same-site-post.html index eee74be..dc68018 100644 --- a/third_party/WebKit/LayoutTests/http/tests/cookies/same-site/popup-same-site-post.html +++ b/third_party/WebKit/LayoutTests/http/tests/cookies/same-site/popup-same-site-post.html
@@ -2,6 +2,7 @@ <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="/cookies/resources/testharness-helpers.js"></script> +<body> <script> if (window.location.hostname == "127.0.0.1") { window.location.hostname = ORIGINAL_HOST; @@ -25,6 +26,8 @@ f.method = "POST"; f.target = "_blank"; window.onload = t.step_func(f.submit.bind(f)); + document.body.appendChild(f); }, "'" + ORIGINAL_HOST + "' is same-site with itself, so samesite cookies are sent."); } </script> +</body>
diff --git a/third_party/WebKit/LayoutTests/http/tests/inspector/security/blocked-mixed-content-and-subresources-with-cert-errors-expected.txt b/third_party/WebKit/LayoutTests/http/tests/inspector/security/blocked-mixed-content-and-subresources-with-cert-errors-expected.txt index 0b59204..76247f8 100644 --- a/third_party/WebKit/LayoutTests/http/tests/inspector/security/blocked-mixed-content-and-subresources-with-cert-errors-expected.txt +++ b/third_party/WebKit/LayoutTests/http/tests/inspector/security/blocked-mixed-content-and-subresources-with-cert-errors-expected.txt
@@ -20,7 +20,7 @@ Blocked mixed content </DIV> <DIV > -Your page requested insecure resources that were blocked. +Your page requested non-secure resources that were blocked. </DIV> <DIV class=security-mixed-content link > View 1 request in Network Panel
diff --git a/third_party/WebKit/LayoutTests/http/tests/inspector/security/mixed-content-and-subresources-with-cert-errors-expected.txt b/third_party/WebKit/LayoutTests/http/tests/inspector/security/mixed-content-and-subresources-with-cert-errors-expected.txt index 68ab4f9..a3fe7db 100644 --- a/third_party/WebKit/LayoutTests/http/tests/inspector/security/mixed-content-and-subresources-with-cert-errors-expected.txt +++ b/third_party/WebKit/LayoutTests/http/tests/inspector/security/mixed-content-and-subresources-with-cert-errors-expected.txt
@@ -8,7 +8,7 @@ Active Mixed Content </DIV> <DIV > -You have recently allowed insecure content (such as scripts or iframes) to run on this site. +You have recently allowed non-secure content (such as scripts or iframes) to run on this site. </DIV> <DIV class=security-mixed-content link > View requests in Network Panel
diff --git a/third_party/WebKit/LayoutTests/http/tests/inspector/security/security-blocked-mixed-content-expected.txt b/third_party/WebKit/LayoutTests/http/tests/inspector/security/security-blocked-mixed-content-expected.txt index 2183d198..116e297f 100644 --- a/third_party/WebKit/LayoutTests/http/tests/inspector/security/security-blocked-mixed-content-expected.txt +++ b/third_party/WebKit/LayoutTests/http/tests/inspector/security/security-blocked-mixed-content-expected.txt
@@ -20,7 +20,7 @@ Blocked mixed content </DIV> <DIV > -Your page requested insecure resources that were blocked. +Your page requested non-secure resources that were blocked. </DIV> <DIV class=security-mixed-content link > View 1 request in Network Panel
diff --git a/third_party/WebKit/LayoutTests/http/tests/media/video-play-stall.html b/third_party/WebKit/LayoutTests/http/tests/media/video-play-stall.html index 0e99c95..8ab9dcf 100644 --- a/third_party/WebKit/LayoutTests/http/tests/media/video-play-stall.html +++ b/third_party/WebKit/LayoutTests/http/tests/media/video-play-stall.html
@@ -11,12 +11,16 @@ let log_console = document.getElementById('log_console'); // For debugging. - function logEvent(e) { + function logMessage(msg) { let span = document.createElement("span"); - span.innerHTML = 'event: ' + e.type + '<br>'; + span.innerHTML = msg + '<br>'; log_console.appendChild(span); }; + function logEvent(e) { + logMessage('event: ' + e.type); + }; + playback_ew = new EventWatcher(t, video, [ 'canplay', 'canplaythrough', @@ -46,6 +50,25 @@ return promise; } + // Monitor timeupdate w.r.t. readyState throughout test. Time should not + // advance while readyState <= HAVE_CURRENT_DATA. + let timeAtStartOfWaiting = null; + video.addEventListener('timeupdate', t.step_func(function(e) { + logMessage('event: timeupdate at time: ' + e.target.currentTime +' readystate:' + e.target.readyState); + if (e.target.readyState <= HTMLMediaElement.HAVE_CURRENT_DATA) { + if (timeAtStartOfWaiting == null) { + // Note the time when waiting begins. + timeAtStartOfWaiting = e.target.currentTime; + } else { + // Verify that current time is not advancing while waiting. + assert_equals(e.target.currentTime, timeAtStartOfWaiting); + } + } else if (timeAtStartOfWaiting != null) { + // Waiting has ended, so clear timeAtStartOfWaiting. + timeAtStartOfWaiting = null; + } + })); + // NOTE: Event sequence verification is achieved by chaining together // promises via then(). To verify separate parallel event sequences (e.g. // playback vs network), we setup separate chains of promises. Promise.all @@ -73,7 +96,7 @@ // Now observe waiting event and verify readyState .then(() => playback_ew.wait_for('waiting')).then(logEvent) .then(t.step_func(function(){ - assert_equals(HTMLMediaElement.HAVE_CURRENT_DATA, video.readyState); + assert_equals(video.readyState, HTMLMediaElement.HAVE_CURRENT_DATA); })), // timeupdate should fire throughout playback. Make sure we see one.
diff --git a/third_party/WebKit/LayoutTests/http/tests/push_messaging/application-server-key-format-test.html b/third_party/WebKit/LayoutTests/http/tests/push_messaging/application-server-key-format-test.html new file mode 100644 index 0000000..a8fe21c --- /dev/null +++ b/third_party/WebKit/LayoutTests/http/tests/push_messaging/application-server-key-format-test.html
@@ -0,0 +1,73 @@ +<!DOCTYPE html> +<html> + <head> + <title> + Subscribing with applicationServerKey should succeed only when the + applicationServerKey is valid. + </title> + <script src="resources/push-constants.js"></script> + <script src="resources/test-helpers.js"></script> + <script src="../resources/testharness.js"></script> + <script src="../resources/testharnessreport.js"></script> + <script src="../resources/testharness-helpers.js"></script> + <script src="../serviceworker/resources/test-helpers.js"></script> + </head> + <body> + <script> + // Subscribe should succeed given a valid numeric sender ID. + promise_test(function(test) { + return registerAndSubscribePushWithString(test, '0123456789') + .then(function(pushSubscription) { + assert_true( + pushSubscription.endpoint.includes('LayoutTestEndpoint')); + }); + }, 'Subscribing with a valid numeric sender ID should succeed'); + + // Subscribe should succeed given a valid p256 key. + promise_test(function(test) { + return registerAndSubscribePush(test, new Uint8Array(PUBLIC_KEY)) + .then(function(pushSubscription) { + assert_true( + pushSubscription.endpoint.includes('StandardizedEndpoint')); + }); + }, 'Subscribing with a valid p256 applicationServerKey should succeed'); + + // Subscribe should fail given a non-numeric sender ID. + promise_test(function(test) { + return registerAndSubscribePushWithString(test, '01234a56789') + .then(function(pushSubscription) { + assert_unreached('Subscribe should have failed.'); + }) + .catch (function(e) { + assert_true(e.message.includes( + 'The provided applicationServerKey is not valid.')); + }); + }, 'Subscribing with a non-numeric sender ID should fail'); + + // Subscribe should fail given an empty applicationServerKey. + promise_test(function(test) { + return registerAndSubscribePushWithString(test, '') + .then(function(pushSubscription) { + assert_unreached('Subscribe should have failed.'); + }) + .catch (function(e) { + assert_true(e.message.includes( + 'The provided applicationServerKey is not valid.')); + }); + }, 'Subscribing with an empty applicationServerKey should fail'); + + // Subscribe should fail given a too long applicationServerKey. + promise_test(function(test) { + const longKey = new Uint8Array(300); + return registerAndSubscribePush(test, longKey) + .then(function(pushSubscription) { + assert_unreached('Subscribe should have failed.'); + }) + .catch (function(e) { + assert_true(e.message.includes( + 'The provided applicationServerKey is not valid.')); + }); + }, 'Subscribing with a too long applicationServerKey should fail'); + </script> + </body> +</html>
diff --git a/third_party/WebKit/LayoutTests/http/tests/push_messaging/application-server-key-standard-endpoint.html b/third_party/WebKit/LayoutTests/http/tests/push_messaging/application-server-key-standard-endpoint.html index a19b648..e7c8dad9 100644 --- a/third_party/WebKit/LayoutTests/http/tests/push_messaging/application-server-key-standard-endpoint.html +++ b/third_party/WebKit/LayoutTests/http/tests/push_messaging/application-server-key-standard-endpoint.html
@@ -2,6 +2,7 @@ <html> <head> <title>Subscribing with an applicationServerKey should return a standardized endpoint</title> + <script src="resources/push-constants.js"></script> <script src="../resources/testharness.js"></script> <script src="../resources/testharnessreport.js"></script> <script src="../resources/testharness-helpers.js"></script> @@ -9,15 +10,6 @@ </head> <body> <script> - const PUBLIC_KEY = [ - 0x04, 0x56, 0x23, 0xC0, 0x45, 0xD7, 0x6C, 0x5D, 0x45, 0x1A, 0x29, - 0x19, 0xAA, 0xE5, 0x02, 0x2F, 0x43, 0x55, 0xC2, 0x5C, 0x59, 0x86, - 0x69, 0xA0, 0xAD, 0xD7, 0x2D, 0x54, 0x22, 0xD8, 0x43, 0xB6, 0xCD, - 0xE3, 0x33, 0xB4, 0xBB, 0x66, 0x2F, 0x47, 0xE5, 0xE6, 0x20, 0xFF, - 0x0E, 0x10, 0x7F, 0xCD, 0xA3, 0x44, 0x8C, 0x65, 0x54, 0x64, 0x7E, - 0x25, 0xF3, 0x67, 0xF4, 0x7C, 0x4B, 0x0C, 0xBD, 0xCF, 0xF4 - ]; - // When running this test manually, grant permission when prompted. // This test verifies that push subscriptions made with a valid P-256 // applicationServerKey return the standardized endpoint. @@ -47,4 +39,4 @@ }, 'Subscribing with an applicationServerKey should return the standardized endpoint'); </script> </body> - </html> \ No newline at end of file + </html>
diff --git a/third_party/WebKit/LayoutTests/http/tests/push_messaging/push-subscription-options.html b/third_party/WebKit/LayoutTests/http/tests/push_messaging/push-subscription-options.html index 1425c98..6507cde 100644 --- a/third_party/WebKit/LayoutTests/http/tests/push_messaging/push-subscription-options.html +++ b/third_party/WebKit/LayoutTests/http/tests/push_messaging/push-subscription-options.html
@@ -3,6 +3,7 @@ <head> <title>PushSubscriptionOptions should be correctly reflected on PushSubscription objects</title> <link rel="manifest" href="resources/push_manifest.json"> + <script src="resources/push-constants.js"></script> <script src="../resources/testharness.js"></script> <script src="../resources/testharnessreport.js"></script> <script src="../serviceworker/resources/test-helpers.js"></script> @@ -62,14 +63,6 @@ } } - const PUBLIC_KEY = [ - 0x04, 0x56, 0x23, 0xC0, 0x45, 0xD7, 0x6C, 0x5D, 0x45, 0x1A, 0x29, - 0x19, 0xAA, 0xE5, 0x02, 0x2F, 0x43, 0x55, 0xC2, 0x5C, 0x59, 0x86, - 0x69, 0xA0, 0xAD, 0xD7, 0x2D, 0x54, 0x22, 0xD8, 0x43, 0xB6, 0xCD, - 0xE3, 0x33, 0xB4, 0xBB, 0x66, 0x2F, 0x47, 0xE5, 0xE6, 0x20, 0xFF, - 0x0E, 0x10, 0x7F, 0xCD, 0xA3, 0x44, 0x8C, 0x65, 0x54, 0x64, 0x7E, - 0x25, 0xF3, 0x67, 0xF4, 0x7C, 0x4B, 0x0C, 0xBD, 0xCF, 0xF4 - ]; const VAPID_OPTIONS = { userVisibleOnly: true, applicationServerKey: new Uint8Array(PUBLIC_KEY) @@ -142,4 +135,4 @@ }, "PushSubscriptionOptions should be correctly reflected on PushSubscription objects"); </script> </body> -</html> \ No newline at end of file +</html>
diff --git a/third_party/WebKit/LayoutTests/http/tests/push_messaging/resources/push-constants.js b/third_party/WebKit/LayoutTests/http/tests/push_messaging/resources/push-constants.js new file mode 100644 index 0000000..4a2aead --- /dev/null +++ b/third_party/WebKit/LayoutTests/http/tests/push_messaging/resources/push-constants.js
@@ -0,0 +1,14 @@ +// 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. + +// NIST P-256 public key made available to tests. Must be an uncompressed +// point in accordance with SEC1 2.3.3. +const PUBLIC_KEY = [ + 0x04, 0x56, 0x23, 0xC0, 0x45, 0xD7, 0x6C, 0x5D, 0x45, 0x1A, 0x29, + 0x19, 0xAA, 0xE5, 0x02, 0x2F, 0x43, 0x55, 0xC2, 0x5C, 0x59, 0x86, + 0x69, 0xA0, 0xAD, 0xD7, 0x2D, 0x54, 0x22, 0xD8, 0x43, 0xB6, 0xCD, + 0xE3, 0x33, 0xB4, 0xBB, 0x66, 0x2F, 0x47, 0xE5, 0xE6, 0x20, 0xFF, + 0x0E, 0x10, 0x7F, 0xCD, 0xA3, 0x44, 0x8C, 0x65, 0x54, 0x64, 0x7E, + 0x25, 0xF3, 0x67, 0xF4, 0x7C, 0x4B, 0x0C, 0xBD, 0xCF, 0xF4 +];
diff --git a/third_party/WebKit/LayoutTests/http/tests/push_messaging/resources/test-helpers.js b/third_party/WebKit/LayoutTests/http/tests/push_messaging/resources/test-helpers.js index 32ea3dc5..01a820e 100644 --- a/third_party/WebKit/LayoutTests/http/tests/push_messaging/resources/test-helpers.js +++ b/third_party/WebKit/LayoutTests/http/tests/push_messaging/resources/test-helpers.js
@@ -1,43 +1,76 @@ "use strict"; -// Subscribes and unsubscribes to push once so that the manifest details are stored in service -// worker storage. After this, subscribe can succeed from inside the service worker. -// This triggers an infobar unless a permission decision was previously set. +// Subscribes and unsubscribes to push once so that the manifest details are +// stored in service worker storage. After this, subscribe can succeed from +// inside the service worker. This triggers an infobar unless a permission +// decision was previously set. function subscribeAndUnsubscribePush(registration) { - return new Promise(function(resolve, reject) { - // 1. Call subscribe in document context. The manifest details are stored in the service - // worker storage for later use in a service worker context where there is no manifest. - registration.pushManager.subscribe() - .then(function(subscription) { - // 2. Call unsubscribe so we can subscribe again later inside a service worker. - return subscription.unsubscribe(); - }) - .then(function(unsubscription_result) { - resolve(); - }) - .catch(function(e) { - reject(e); - }); + return new Promise(function(resolve, reject) { + // 1. Call subscribe in document context. The manifest details are stored + // in the service worker storage for later use in a service worker context + // where there is no manifest. + registration.pushManager.subscribe().then(function(subscription) { + // 2. Call unsubscribe so we can subscribe again later inside a + // service worker. + return subscription.unsubscribe(); + }) + .then(function(unsubscription_result) { + resolve(); + }) + .catch(function(e) { + reject(e); }); + }); } -// Runs |command| in the service worker connected to |port|. Returns a promise that will be resolved -// with the response data of the command. -function runCommandInServiceWorker(port, command) { - return new Promise(function(resolve, reject) { - port.addEventListener('message', function listener(event) { - // To make this listener a oneshot, remove it the first time it runs. - port.removeEventListener('message', listener); +// Registers a service worker and subscribes to push using the given string +// as an applicationServerKey. +function registerAndSubscribePushWithString(test, serverKeyString) { + return registerAndSubscribePush(test, + new TextEncoder().encode(serverKeyString)); +} - if (typeof event.data != 'object' || !event.data.command) - assert_unreached('Invalid message from the service worker'); +// Subscribes to push with the given application server key. serverKey should be +// a Uint8Array. +function registerAndSubscribePush(test, serverKey) { + const workerUrl = 'resources/empty_worker.js'; + const workerScope = 'resources/scope/' + location.pathname; + let swRegistration; - assert_equals(event.data.command, command); - if (event.data.success) - resolve(event.data); - else - reject(new Error(event.data.errorMessage)); - }); - port.postMessage({command: command}); + return service_worker_unregister_and_register(test, workerUrl, workerScope) + .then(function(serviceWorkerRegistration) { + swRegistration = serviceWorkerRegistration; + return wait_for_state(test, swRegistration.installing, 'activated'); + }) + .then(function() { + if (window.testRunner) { + testRunner.setPermission('push-messaging', 'granted', location.origin, + location.origin); + } + return swRegistration.pushManager.subscribe({ + userVisibleOnly: true, + applicationServerKey: serverKey }); + }); +} + +// Runs |command| in the service worker connected to |port|. Returns a promise +// that will be resolved with the response data of the command. +function runCommandInServiceWorker(port, command) { + return new Promise(function(resolve, reject) { + port.addEventListener('message', function listener(event) { + // To make this listener a oneshot, remove it the first time it runs. + port.removeEventListener('message', listener); + + if (typeof event.data != 'object' || !event.data.command) + assert_unreached('Invalid message from the service worker'); + + assert_equals(event.data.command, command); + if (event.data.success) + resolve(event.data); + else + reject(new Error(event.data.errorMessage)); + }); + port.postMessage({command: command}); + }); }
diff --git a/third_party/WebKit/LayoutTests/http/tests/push_messaging/subscribe-failure-no-manifest-in-service-worker.html b/third_party/WebKit/LayoutTests/http/tests/push_messaging/subscribe-failure-no-manifest-in-service-worker.html index bfe9ed86..efa132e 100644 --- a/third_party/WebKit/LayoutTests/http/tests/push_messaging/subscribe-failure-no-manifest-in-service-worker.html +++ b/third_party/WebKit/LayoutTests/http/tests/push_messaging/subscribe-failure-no-manifest-in-service-worker.html
@@ -20,9 +20,10 @@ getActiveServiceWorkerWithMessagePort(test, script, scope) .then(function(workerInfo) { - // Call subscribe in service worker context. It will fail because although the sender - // id has been specified in the manifest, the manifest cannot be read in a service - // worker context, and no previous subscription will exist from a document context. + // Call subscribe in service worker context. It will fail because + // although the sender id has been specified in the manifest, the + // manifest cannot be read in a service worker context, and no + // previous subscription will exist from a document context. workerInfo.port.postMessage({command: 'subscribe'}); workerInfo.port.addEventListener('message', function(event) {
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/1.1/scripthash-handler-allowed.html b/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/1.1/scripthash-handler-allowed.html index e37a963e..c740defd 100644 --- a/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/1.1/scripthash-handler-allowed.html +++ b/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/1.1/scripthash-handler-allowed.html
@@ -16,7 +16,7 @@ async_test(function (t) { window.expectFailure = t.unreached_func("Handler should not execute."); document.addEventListener('securitypolicyviolation', t.step_func_done(function (e) { - assert_equals(e.target, document); + assert_equals(e.target, document.querySelector('#fail')); })); window.addEventListener('load', t.step_func(function () { document.querySelector('#fail').click();
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/1.1/scripthash-handler-blocked.html b/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/1.1/scripthash-handler-blocked.html index b5e21d1..56f4cd61 100644 --- a/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/1.1/scripthash-handler-blocked.html +++ b/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/1.1/scripthash-handler-blocked.html
@@ -10,7 +10,7 @@ document.querySelector('#pass').click(); })); document.addEventListener('securitypolicyviolation', t.step_func_done(function (e) { - assert_equals(e.target, document); + assert_equals(e.target, document.querySelector('#pass')); })); }, 'Inline event handlers whitelisted by the policy should not fire, as \'unsafe-hash-attributes\' is not present.'); </script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/embeddedEnforcement/allow_csp_from-header.html b/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/embeddedEnforcement/allow_csp_from-header.html new file mode 100644 index 0000000..6c5d8c6 --- /dev/null +++ b/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/embeddedEnforcement/allow_csp_from-header.html
@@ -0,0 +1,91 @@ +<!DOCTYPE html> +<html> +<head> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <script src="/security/contentSecurityPolicy/resources/child-csp-test.js"></script> +</head> +<body> + <script> + var imgLineNumber = 20; + var scriptAbcLineNumber = 21; + + async_test(t => { + csp = "img-src 'none'; script-src 'unsafe-inline';"; + url = generateUrlWithAllowCSPFrom(SAME_ORIGIN, ""); + injectIframeWithCSP(url, EXPECT_LOAD, csp, t, "0"); + }, "Same origin iframes are always allowed."); + + async_test(t => { + csp = "script-src 'unsafe-inline'; img-src 'none'"; + url = generateUrlWithAllowCSPFrom(CROSS_ORIGIN, ""); + injectIframeWithCSP(url, EXPECT_BLOCK, csp, t, "1"); + }, "Cross origin iframe with requiredCSP but without Allow-CSP-From header gets blocked.") + + async_test(t => { + csp = "script-src 'unsafe-inline'"; + url = generateUrlWithAllowCSPFrom(CROSS_ORIGIN, "http://127.0.0.1:8000"); + injectIframeWithCSP(url, EXPECT_LOAD, csp, t, "2"); + }, "iframe from cross origin does not load without Allow-CSP-From header."); + + async_test(t => { + csp = "script-src 'unsafe-inline'; img-src 'none'"; + url = generateUrlWithAllowCSPFrom(CROSS_ORIGIN, "* ¢¥§"); + injectIframeWithCSP(url, EXPECT_BLOCK, csp, t, "3"); + }, "Iframe with improper Allow-CSP-From header gets blocked."); + + async_test(t => { + csp = "script-src 'unsafe-inline'; img-src 'none'"; + url = generateUrlWithAllowCSPFrom(CROSS_ORIGIN, "*") + "&csp=img-src *"; + injectIframeWithCSP(url, EXPECT_LOAD, csp, t, "4"); + }, "Star Allow-CSP-From header can be returned."); + + async_test(t => { + csp = "script-src 'nonce-123';"; + url = generateUrlWithAllowCSPFrom(CROSS_ORIGIN, "http://127.0.0.1:8000"); + var i = document.createElement('iframe'); + i.csp = csp; + i.src = url + "&id=5"; + + window.addEventListener('message', t.step_func(e => { + if (e.source != i.contentWindow || e.data["securitypolicyviolation"] != true) + return; + assert_equals(e.data["blockedURI"], "inline"); + assert_equals(e.data["lineNumber"], scriptAbcLineNumber); + t.done(); + })); + + document.body.appendChild(i); + }, "Allow-CSP-From header enforces EmbeddingCSP."); + + async_test(t => { + csp = "script-src 'unsafe-inline'; img-src 'none'"; + url = generateUrlWithAllowCSPFrom(CROSS_ORIGIN, "*") + "&csp=img-src *"; + var i = document.createElement('iframe'); + i.csp = csp; + i.src = url + "&id=6"; + + window.addEventListener('message', t.step_func(e => { + if (e.source != i.contentWindow || e.data["securitypolicyviolation"] != true) + return; + assert_equals(e.data["blockedURI"], + "http://localhost:8000/security/contentSecurityPolicy/resources/green250x50.png"); + assert_equals(e.data["lineNumber"], imgLineNumber); + t.done(); + })); + + document.body.appendChild(i); + }, "Star Allow-CSP-From header allows the parent to enforce its Embedding CSP."); + + async_test(t => { + csp = "script-src 'unsafe-inline'; img-src 'none'"; + url = "http://localhost:8000/security/contentSecurityPolicy/resources/respond-with-allow-csp-from-multiple-headers.php?allow_csp_from="; + var i = document.createElement('iframe'); + i.csp = csp; + i.src = url + "http://localhost:8000" + "&allow_csp_from_2=*"; + + injectIframeWithCSP(url, EXPECT_BLOCK, csp, t, "7"); + }, "Only first Allow-CSP-From header is considered."); + </script> +</body> +</html>
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/embeddedEnforcement/embedding_csp-header.html b/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/embeddedEnforcement/embedding_csp-header.html index 7ed2e2d..45c3620 100644 --- a/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/embeddedEnforcement/embedding_csp-header.html +++ b/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/embeddedEnforcement/embedding_csp-header.html
@@ -29,14 +29,14 @@ async_test(t => { var i = document.createElement('iframe'); - i.csp = 'value'; + i.csp = "script-src 'unsafe-inline'"; i.src = src; window.addEventListener('message', t.step_func(e => { if (e.source != i.contentWindow) return; assert_equals(src, e.data['src']); - assert_equals('value', e.data['embedding_csp']); + assert_equals("script-src 'unsafe-inline'", e.data['embedding_csp']); t.done(); })); @@ -45,31 +45,31 @@ async_test(t => { var i = document.createElement('iframe'); - i.csp = 'value'; + i.csp = "script-src 'unsafe-inline'"; i.src = src; document.body.appendChild(i); - i.contentWindow.location = new_src; + i.contentWindow.location = new_src + "?csp=" + i.csp; window.addEventListener('message', t.step_func(e => { if (e.source != i.contentWindow || new_src != e.data['src']) return; - assert_equals('value', e.data['embedding_csp']); + assert_equals("script-src 'unsafe-inline'", e.data['embedding_csp']); t.done(); })); }, "Set Embedding-CSP Header on change of window's location."); async_test(t => { var i = document.createElement('iframe'); - i.csp = 'value'; + i.csp = "script-src 'unsafe-inline'"; i.src = src; document.body.appendChild(i); - i.csp = 'value 2'; - i.src = new_src; + i.csp = "default-src 'unsafe-inline'"; + i.src = new_src + "?csp=" + i.csp; window.addEventListener('message', t.step_func(e => { if (e.source != i.contentWindow || new_src != e.data['src']) return; - assert_equals('value 2', e.data['embedding_csp']); + assert_equals("default-src 'unsafe-inline'", e.data['embedding_csp']); t.done(); })); }, "Set Embedding-CSP Header on change of src attribute on iframe."); @@ -77,8 +77,8 @@ async_test(t => { var i = document.createElement('iframe'); - i.csp = 'value'; - redirect_url = 'http://localhost:8000/security/contentSecurityPolicy/resources/get-embedding-csp-header.php'; + i.csp = "script-src 'unsafe-inline'"; + redirect_url = 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/get-embedding-csp-header.php'; i.src = generateRedirect(redirect_url); document.body.appendChild(i); @@ -87,26 +87,26 @@ return; } assert_equals(src, e.data['src']); - assert_equals('value', e.data['embedding_csp']); + assert_equals("script-src 'unsafe-inline'", e.data['embedding_csp']); t.done(); })); }, "Set Embedding-CSP Header on redirect in <iframe>."); async_test(t => { var i = document.createElement('iframe'); - i.csp = 'value'; - redirect_url = 'http://localhost:8000/security/contentSecurityPolicy/resources/get-embedding-csp-header.php'; + i.csp = "script-src 'unsafe-inline'"; + redirect_url = 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/get-embedding-csp-header.php'; i.src = generateRedirect(redirect_url); document.body.appendChild(i); - redirect_url = 'http://localhost:8000/security/contentSecurityPolicy/resources/get-embedding-csp-header-and-respond.php'; + redirect_url = 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/get-embedding-csp-header-and-respond.php'; new_redirect = generateRedirect(redirect_url); - i.csp = 'value 2'; + i.csp = "default-src 'unsafe-inline'"; i.src = new_redirect; window.addEventListener('message', t.step_func(e => { if (e.source != i.contentWindow || new_src != e.data['src']) return; - assert_equals('value 2', e.data['embedding_csp']); + assert_equals("default-src 'unsafe-inline'", e.data['embedding_csp']); t.done(); })); }, "Set Embedding-CSP Header on change of csp attribte and redirect.");
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/nonces/script-enforce-blocked.php b/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/nonces/script-enforce-blocked.php index 11ce01d8..da20db81 100644 --- a/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/nonces/script-enforce-blocked.php +++ b/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/nonces/script-enforce-blocked.php
@@ -5,87 +5,65 @@ <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script nonce="abc"> - async_test(t => { - var watcher = new EventWatcher(t, document, ['securitypolicyviolation', 'securitypolicyviolation','securitypolicyviolation', 'securitypolicyviolation','securitypolicyviolation','securitypolicyviolation', 'securitypolicyviolation', 'securitypolicyviolation']); - watcher - .wait_for('securitypolicyviolation') - .then(t.step_func(e => { - assert_equals(e.blockedURI, "inline"); - assert_equals(e.lineNumber, 58); - return watcher.wait_for('securitypolicyviolation'); - })) - .then(t.step_func(e => { - assert_equals(e.blockedURI, "inline"); - assert_equals(e.lineNumber, 61); - return watcher.wait_for('securitypolicyviolation'); - })) - .then(t.step_func(e => { - assert_equals(e.blockedURI, "inline"); - assert_equals(e.lineNumber, 64); - return watcher.wait_for('securitypolicyviolation'); - })) - .then(t.step_func(e => { - assert_equals(e.blockedURI, "inline"); - assert_equals(e.lineNumber, 67); - return watcher.wait_for('securitypolicyviolation'); - })) - .then(t.step_func(e => { - assert_equals(e.blockedURI, "inline"); - assert_equals(e.lineNumber, 70); - return watcher.wait_for('securitypolicyviolation'); - })) - .then(t.step_func(e => { - assert_equals(e.blockedURI, "https://evil.example.test/yay1.js"); - assert_equals(e.lineNumber, 0); - return watcher.wait_for('securitypolicyviolation'); - })) - .then(t.step_func(e => { - assert_equals(e.blockedURI, "https://evil.example.test/yay2.js"); - assert_equals(e.lineNumber, 0); - return watcher.wait_for('securitypolicyviolation'); - })) - .then(t.step_func(e => { - assert_equals(e.blockedURI, "https://evil.example.test/yay3.js"); - assert_equals(e.lineNumber, 0); - return watcher.wait_for('securitypolicyviolation'); - })) - .then(t.step_func_done(e => { - assert_equals(e.blockedURI, "https://evil.example.test/yay4.js"); - assert_equals(e.lineNumber, 0); - })); - }, "Unnonced script blocks generate reports."); + var t = async_test("Unnonced scripts generate reports."); + var events = 0; + var expectations = { + 37: true, + 40: true, + 43: true, + 46: true, + 49: true, + "https://evil.example.test/yay1.js": true, + "https://evil.example.test/yay2.js": true, + "https://evil.example.test/yay3.js": true, + "https://evil.example.test/yay4.js": true + }; - var executed_test = async_test("Nonced script executes, and does not generate a violation report."); + document.addEventListener('securitypolicyviolation', t.step_func(e => { + if (e.lineNumber) { + // Verify that the line is expected, then clear the expectation: + assert_true(expectations[e.lineNumber]); + expectations[e.lineNumber] = false; + assert_equals(e.blockedURI, "inline"); + } else { + // Otherwise, verify that the URL is expected, then clear the expectation: + assert_true(expectations[e.blockedURI]); + expectations[e.blockedURI] = false; + } + events++;console.log(events + " : " + e.lineNumber + " : " + e.blockedURI); + if (events == 9) + t.done(); + })); + var unexecuted_test = async_test("Blocks without correct nonce do not execute, and generate violation reports"); </script> <script> - unexecuted_test.assert_unreached("This code block should not execute."); + unexecuted_test.unreached_func("This code block should not execute.")(); </script> <script nonce="xyz"> - unexecuted_test.assert_unreached("This code block should not execute."); + unexecuted_test.unreached_func("This code block should not execute.")(); </script> <script <script nonce="abc"> - unexecuted_test.assert_unreached("This code block should not execute."); + unexecuted_test.unreached_func("This code block should not execute.")(); </script> <script attribute<script nonce="abc"> - unexecuted_test.assert_unreached("This code block should not execute."); + unexecuted_test.unreached_func("This code block should not execute.")(); </script> <script attribute=<script nonce="abc"> - unexecuted_test.assert_unreached("This code block should not execute."); + unexecuted_test.unreached_func("This code block should not execute.")(); </script> <script src=https://evil.example.test/yay1.js <script nonce="abc"> - unexecuted_test.assert_unreached("This code block should not execute."); + unexecuted_test.unreached_func("This code block should not execute.")(); </script> <script src=https://evil.example.test/yay2.js attribute=<script nonce="abc"> - unexecuted_test.assert_unreached("This code block should not execute."); + unexecuted_test.unreached_func("This code block should not execute.")(); </script> <script src=https://evil.example.test/yay3.js <style nonce="abc"> - unexecuted_test.assert_unreached("This code block should not execute."); + unexecuted_test.unreached_func("This code block should not execute.")(); </style></script> <script src=https://evil.example.test/yay4.js attribute=<style nonce="abc"> - unexecuted_test.assert_unreached("This code block should not execute."); + unexecuted_test.unreached_func("This code block should not execute.")(); </style></script> <script nonce="abc"> - executed_test.done(); unexecuted_test.done(); </script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/resources/child-csp-test.js b/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/resources/child-csp-test.js new file mode 100644 index 0000000..77f8228 --- /dev/null +++ b/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/resources/child-csp-test.js
@@ -0,0 +1,46 @@ +var CROSS_ORIGIN_URL = "http://localhost:8000/security/contentSecurityPolicy/resources/respond-with-allow-csp-from-header.php"; +var SAME_ORIGIN_URL = "http://127.0.0.1:8000/security/contentSecurityPolicy/resources/respond-with-allow-csp-from-header.php"; + +var EXPECT_BLOCK = true; +var EXPECT_LOAD = false; + +var CROSS_ORIGIN = true; +var SAME_ORIGIN = false; + +function injectIframeWithCSP(url, shouldBlock, csp, t, urlId) { + var i = document.createElement('iframe'); + i.src = url + "&id=" + urlId; + i.csp = csp; + + var loaded = {}; + window.addEventListener("message", function (e) { + if (e.source != i.contentWindow) + return; + if (e.data["loaded"]) + loaded[e.data["id"]] = true; + }); + + if (shouldBlock) { + window.onmessage = t.unreached_func('No message should be sent from the frame.'); + i.onload = t.step_func(function () { + // Delay the check until after the postMessage has a chance to execute. + setTimeout(t.step_func_done(function () { + assert_equals(loaded[urlId], undefined); + }), 1); + }); + } else { + document.addEventListener("securitypolicyviolation", + t.unreached_func("There should not be any violations.")); + i.onload = t.step_func(function () { + // Delay the check until after the postMessage has a chance to execute. + setTimeout(t.step_func_done(function () { + assert_true(loaded[urlId]); + }), 1); + }); + } + document.body.appendChild(i); +} +function generateUrlWithAllowCSPFrom(useCrossOrigin, allowCspFrom) { + var url = useCrossOrigin ? CROSS_ORIGIN_URL : SAME_ORIGIN_URL; + return url + "?allow_csp_from=" + allowCspFrom; +}
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/resources/respond-with-allow-csp-from-header.php b/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/resources/respond-with-allow-csp-from-header.php new file mode 100644 index 0000000..0345c43 --- /dev/null +++ b/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/resources/respond-with-allow-csp-from-header.php
@@ -0,0 +1,37 @@ +<?php + $allow_csp_from = isset($_GET['allow_csp_from']) ? $_GET['allow_csp_from'] : null; + if ($allow_csp_from) + header('Allow-CSP-From: ' . $allow_csp_from); + $csp = isset($_GET['csp']) ? $_GET['csp'] : null; + if ($csp) + header('Content-Security-Policy: ' . $csp); + $msg = isset($_GET['id']) ? $_GET['id'] : null; +?> + +<!DOCTYPE html> +<html> +<head> + <title>This page enforces embedder's policies</title> + <script nonce="123"> + document.addEventListener("securitypolicyviolation", function(e) { + var response = {}; + response["id"] = "<?php echo $msg; ?>"; + response["securitypolicyviolation"] = true; + response["blockedURI"] = e.blockedURI; + response["lineNumber"] = e.lineNumber; + window.top.postMessage(response, '*'); + }); + </script> +</head> +<body> + Hello World. + <iframe src="/cross-site/b.com/title2.html"></iframe> + <img src="green250x50.png" /> + <script nonce="abc"> + var response = {}; + response["loaded"] = true; + response["id"] = "<?php echo $msg; ?>"; + window.onload = window.top.postMessage(response, '*'); + </script> +</body> +</html> \ No newline at end of file
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/resources/respond-with-allow-csp-from-multiple-headers.php b/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/resources/respond-with-allow-csp-from-multiple-headers.php new file mode 100644 index 0000000..c5ab350 --- /dev/null +++ b/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/resources/respond-with-allow-csp-from-multiple-headers.php
@@ -0,0 +1,21 @@ +<?php + $allow_csp_from = isset($_GET['allow_csp_from']) ? $_GET['allow_csp_from'] : null; + if ($allow_csp_from) + header('Allow-CSP-From: ' . $allow_csp_from, false); + $allow_csp_from_2 = isset($_GET['allow_csp_from_2']) ? $_GET['allow_csp_from_2'] : null; + if ($allow_csp_from_2) + header('Allow-CSP-From: ' . $allow_csp_from_2, false); +?> +<!DOCTYPE html> +<html> +<head> + <title>This page enforces embedder's policies</title> +</head> +<body> + Hello World. + <iframe src="/cross-site/b.com/title2.html"></iframe> + <img src="green250x50.png" /> + <script> alert("Hello from iframe");</script> + <script> window.top.postMessage('loaded', '*'); </script> +</body> +</html>
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/resources/securitypolicyviolation-helper.js b/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/resources/securitypolicyviolation-helper.js new file mode 100644 index 0000000..a2b5194 --- /dev/null +++ b/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/resources/securitypolicyviolation-helper.js
@@ -0,0 +1,25 @@ +function generateURL(type) { + return 'http://localhost:8000/security/contentSecurityPolicy/resources/loaded.js?' + type; +} + +function assert_script_failed(t, url, line) { + window.addEventListener('message', t.step_func(e => { + if (e.data == url) + t.unreached_func("Script should not have loaded."); + })); + document.addEventListener('securitypolicyviolation', t.step_func(e => { + if (e.lineNumber == line) + t.done(); + })); +} + +function assert_script_loads(t, url, line) { + window.addEventListener('message', t.step_func(e => { + if (e.data == url) + t.done(); + })); + document.addEventListener('securitypolicyviolation', t.step_func(e => { + if (e.lineNumber == line) + t.unreached_func("Script should not have failed."); + })); +}
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/securitypolicyviolation/targeting.html b/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/securitypolicyviolation/targeting.html new file mode 100644 index 0000000..1464f4e --- /dev/null +++ b/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/securitypolicyviolation/targeting.html
@@ -0,0 +1,160 @@ +<!doctype html> +<meta http-equiv="Content-Security-Policy" content="script-src 'nonce-abc'; style-src 'self'"> +<script nonce="abc" src="/resources/testharness.js"></script> +<script nonce="abc" src="/resources/testharnessreport.js"></script> +<script nonce="abc"> + var unexecuted_test = async_test("These tests should not fail."); + + async_test(t => { + var watcher = new EventWatcher(t, document, ['securitypolicyviolation']) + watcher.wait_for('securitypolicyviolation') + .then(t.step_func(e => { + assert_equals(e.blockedURI, "inline"); + assert_equals(e.target, document.querySelector('#block1')); + return watcher.wait_for('securitypolicyviolation'); + })) + .then(t.step_func(e => { + assert_equals(e.blockedURI, "inline"); + assert_equals(e.target, document.querySelector('#block2')); + return watcher.wait_for('securitypolicyviolation'); + })) + .then(t.step_func(e => { + assert_equals(e.blockedURI, "inline"); + assert_equals(e.target, document.querySelector('#block3')); + return watcher.wait_for('securitypolicyviolation'); + })) + .then(t.step_func(e => { + assert_equals(e.blockedURI, "inline"); + assert_equals(e.target, document.querySelector('#block4')); + return watcher.wait_for('securitypolicyviolation'); + })) + .then(t.step_func(e => { + assert_equals(e.blockedURI, "inline"); + assert_equals(e.target, document.querySelector('#block5')); + return watcher.wait_for('securitypolicyviolation'); + })) + .then(t.step_func(e => { + assert_equals(e.blockedURI, "inline"); + assert_equals(e.lineNumber, 132); + assert_equals(e.target, document, "Disconnected elements target the document"); + return watcher.wait_for('securitypolicyviolation'); + })) + .then(t.step_func(e => { + assert_equals(e.blockedURI, "inline"); + assert_equals(e.lineNumber, 143); + assert_equals(e.target, document, "Elements disconnected after triggering target the document."); + return watcher.wait_for('securitypolicyviolation'); + })) + .then(t.step_func(e => { + assert_equals(e.blockedURI, "inline"); + assert_equals(e.lineNumber, 157); + assert_equals(e.target, document, "Elements in DocumentFragments target the document"); + })) + .then(t.step_func_done(_ => { + unexecuted_test.done(); + })); + }, "Inline violations target the right element."); + +</script> +<!-- Inline block with no nonce. --> +<script id="block1"> + unexecuted_test.assert_unreached("This code block should not execute."); +</script> + +<!-- Inline event handler. --> +<a id="block2" onclick="void(0)">Click me!</a> +<script nonce='abc'>document.querySelector('#block2').click();</script> + +<!-- Style block. --> +<style id="block3"> + p { color: red !important; } +</style> + +<!-- Inline event handler inside Shadow DOM --> +<div id="block4"></div> +<script nonce='abc'> + async_test(t => { + var shadow = document.querySelector('#block4').attachShadow({"mode":"closed"}); + shadow.innerHTML = "<a id='block4a' onclick='void(0)'>Click!</a>"; + var a = shadow.querySelector('#block4a'); + a.addEventListener('securitypolicyviolation', t.step_func_done(e => { + assert_equals(e.blockedURI, "inline"); + assert_equals(e.target, a); + })); + a.click(); + }, "Correct targeting inside shadow tree (inline handler)."); +</script> + +<!-- Inline event handler inside Shadow DOM --> +<div id="block5"></div> +<script nonce='abc'> + async_test(t => { + var shadow = document.querySelector('#block5').attachShadow({"mode":"closed"}); + var style = document.createElement('style'); + style.innerText = 'p { color: red; }'; + style.addEventListener('securitypolicyviolation', t.step_func_done(e => { + assert_equals(e.blockedURI, "inline"); + assert_equals(e.target, style); + })); + shadow.appendChild(style); + }, "Correct targeting inside shadow tree (style)."); +</script> + +<!-- Pushed into a same-origin Document that isn't this Document --> +<iframe id="block6"></iframe> +<script nonce="abc"> + async_test(t => { + var d = document.createElement("div"); + d.setAttribute("onclick", "void(0);"); + var events = 0; + d.addEventListener('securitypolicyviolation', t.step_func(e => { + events++; + assert_equals(e.blockedURI, "inline"); + assert_equals(e.target, d); + })); + document.querySelector('#block6').contentDocument.addEventListener('securitypolicyviolation', t.step_func_done(e => { + events++; + assert_equals(e.blockedURI, "inline"); + assert_equals(e.target, d); + assert_equals(events, 2); + })); + document.querySelector('#block6').contentDocument.body.appendChild(d); + d.click(); + }, "Elements created in this document, but pushed into a same-origin frame trigger on that frame's document, not on this frame's document."); +</script> + +<!-- Disconnected inline event handler --> +<script nonce="abc"> + async_test(t => { + var d = document.createElement("div"); + d.setAttribute("onclick", "void(0);"); + d.addEventListener('securitypolicyviolation', t.unreached_func()); + d.click(); + t.done(); + }, "Inline event handlers for disconnected elements target the document."); +</script> + +<!-- Inline event handler, disconnected after click. --> +<a id="block8" onclick="void(0)">Click me also!</a> +<script nonce="abc"> + async_test(t => { + var a = document.querySelector('#block8'); + a.addEventListener('securitypolicyviolation', t.unreached_func()); + a.click(); + a.parentNode.removeChild(a); + t.done(); + }, "Inline event handlers for elements disconnected after triggering target the document."); +</script> + +<!-- Disconnected in a DocumentFragment --> +<script nonce="abc"> + async_test(t => { + var f = new DocumentFragment(); + var d = document.createElement('div'); + d.setAttribute('onclick', 'void(0)'); + d.addEventListener('securitypolicyviolation', t.unreached_func()); + f.appendChild(d); + d.click(); + t.done(); + }, "Inline event handlers for elements in a DocumentFragment target the document."); +</script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/strict-dynamic/script-src-multiple-allowed.php b/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/strict-dynamic/script-src-multiple-allowed.php index 8d40497..d13a31a 100644 --- a/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/strict-dynamic/script-src-multiple-allowed.php +++ b/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/strict-dynamic/script-src-multiple-allowed.php
@@ -6,34 +6,16 @@ <head> <script src="/resources/testharness.js" nonce="abcdefg"></script> <script src="/resources/testharnessreport.js" nonce="abcdefg"></script> + <script src="../resources/securitypolicyviolation-helper.js" nonce="abcdefg"></script> </head> <body> - <script nonce="abcdefg"> - function generateURL(type) { - return 'http://localhost:8000/security/contentSecurityPolicy/resources/loaded.js?' + type; - } - - var loaded = {}; - var blocked = {}; - window.addEventListener("message", function (e) { - loaded[e.data] = true; - }); - document.addEventListener("securitypolicyviolation", function (e) { - blocked[e.lineNumber] = true; - }); - </script> <!-- Need to individually wrap test cases in script blocks. Violation reports triggered by document.write() calls while the parser is waiting on blocking scipts are missing line numbers. See: https://crbug.com/649085. --> <script nonce="abcdefg"> async_test(function (t) { var e = document.createElement('script'); e.src = generateURL("append"); - e.onload = t.step_func(function () { - // Delay the check until after the postMessage has a chance to execute. - setTimeout(t.step_func_done(function () { - assert_true(loaded[generateURL("append")]); - }), 1); - }); e.onerror = t.unreached_func("Error should not be triggered."); + assert_script_loads(t, generateURL("append"), 16); document.body.appendChild(e); }, "Script injected via 'appendChild' is allowed with 'strict-dynamic'."); </script> @@ -42,13 +24,8 @@ var e = document.createElement('script'); e.src = generateURL("append-async"); e.async = true; - e.onload = t.step_func(function () { - // Delay the check until after the postMessage has a chance to execute. - setTimeout(t.step_func_done(function () { - assert_true(loaded[generateURL("append-async")]); - }), 1); - }); e.onerror = t.unreached_func("Error should not be triggered."); + assert_script_loads(t, generateURL("append-async"), 26); document.body.appendChild(e); }, "Async script injected via 'appendChild' is allowed with 'strict-dynamic'."); </script> @@ -57,55 +34,35 @@ var e = document.createElement('script'); e.src = generateURL("append-defer"); e.defer = true; - e.onload = t.step_func(function () { - // Delay the check until after the postMessage has a chance to execute. - setTimeout(t.step_func_done(function () { - assert_true(loaded[generateURL("append-defer")]); - }), 1); - }); e.onerror = t.unreached_func("Error should not be triggered."); + assert_script_loads(t, generateURL("append-defer"), 26); document.body.appendChild(e); }, "Deferred script injected via 'appendChild' is allowed with 'strict-dynamic'."); </script> <script nonce="abcdefg"> async_test(function (t) { + assert_script_failed(t, generateURL("write"), 42); document.write("<scr" + "ipt src='" + generateURL("write") + "'></scr" + "ipt>"); - setTimeout(t.step_func_done(function () { - assert_equals(loaded[generateURL("write")], undefined); - assert_true(blocked[69]); - }), 1); }, "Script injected via 'document.write' is not allowed with 'strict-dynamic'."); </script> <script nonce="abcdefg"> async_test(function (t) { + assert_script_failed(t, generateURL("write-defer"), 48); document.write("<scr" + "ipt defer src='" + generateURL("write-defer") + "'></scr" + "ipt>"); - setTimeout(t.step_func_done(function () { - assert_equals(loaded[generateURL("write-defer")], undefined); - assert_true(blocked[78]); - }), 1); }, "Deferred script injected via 'document.write' is not allowed with 'strict-dynamic'."); </script> <script nonce="abcdefg"> async_test(function (t) { + assert_script_failed(t, generateURL("write-async"), 54); document.write("<scr" + "ipt async src='" + generateURL("write-async") + "'></scr" + "ipt>"); - setTimeout(t.step_func_done(function () { - assert_equals(loaded[generateURL("write-async")], undefined); - assert_true(blocked[87]); - }), 1); }, "Async script injected via 'document.write' is not allowed with 'strict-dynamic'."); </script> <script nonce="abcdefg" defer> async_test(function (t) { var e = document.createElement('script'); e.src = generateURL("defer-append"); - e.onload = t.step_func(function () { - // Delay the check until after the postMessage has a chance to execute. - setTimeout(t.step_func_done(function () { - assert_true(loaded[generateURL("defer-append")]); - assert_equals(blocked[generateURL("defer-append")], undefined); - }), 1); - }); e.onerror = t.unreached_func("Error should not be triggered."); + assert_script_loads(t, generateURL("defer-append"), 63); document.body.appendChild(e); }, "Script injected via deferred 'appendChild' is allowed with 'strict-dynamic'."); </script> @@ -114,14 +71,8 @@ var e = document.createElement('script'); e.src = generateURL("defer-append-async"); e.async = true; - e.onload = t.step_func(function () { - // Delay the check until after the postMessage has a chance to execute. - setTimeout(t.step_func_done(function () { - assert_true(loaded[generateURL("defer-append-async")]); - assert_equals(blocked[generateURL("defer-append-async")], undefined); - }), 1); - }); e.onerror = t.unreached_func("Error should not be triggered."); + assert_script_loads(t, generateURL("defer-append-async"), 73); document.body.appendChild(e); }, "Async script injected via deferred 'appendChild' is allowed with 'strict-dynamic'."); </script> @@ -130,42 +81,27 @@ var e = document.createElement('script'); e.src = generateURL("defer-append-defer"); e.defer = true; - e.onload = t.step_func(function () { - // Delay the check until after the postMessage has a chance to execute. - setTimeout(t.step_func_done(function () { - assert_true(loaded[generateURL("defer-append-defer")]); - assert_equals(blocked[generateURL("defer-append-defer")], undefined); - }), 1); - }); e.onerror = t.unreached_func("Error should not be triggered."); + assert_script_loads(t, generateURL("defer-append-defer"), 83); document.body.appendChild(e); }, "Deferred script injected via deferred 'appendChild' is allowed with 'strict-dynamic'."); </script> <script nonce="abcdefg" defer> async_test(function (t) { + assert_script_failed(t, generateURL("defer-write"), 89); document.write("<scr" + "ipt src='" + generateURL("defer-write") + "'></scr" + "ipt>"); - setTimeout(t.step_func_done(function () { - assert_equals(loaded[generateURL("defer-write")], undefined); - assert_true(blocked[143]); - }), 1); }, "Script injected via deferred 'document.write' is not allowed with 'strict-dynamic'."); </script> <script nonce="abcdefg" defer> async_test(function (t) { + assert_script_failed(t, generateURL("defer-write-defer"), 95); document.write("<scr" + "ipt defer src='" + generateURL("defer-write-defer") + "'></scr" + "ipt>"); - setTimeout(t.step_func_done(function () { - assert_equals(loaded[generateURL("defer-write-defer")], undefined); - assert_true(blocked[152]); - }), 1); }, "Deferred script injected via deferred 'document.write' is not allowed with 'strict-dynamic'."); </script> <script nonce="abcdefg" defer> async_test(function (t) { + assert_script_failed(t, generateURL("defer-write-async"), 101); document.write("<scr" + "ipt async src='" + generateURL("defer-write-async") + "'></scr" + "ipt>"); - setTimeout(t.step_func_done(function () { - assert_equals(loaded[generateURL("defer-write-async")], undefined); - assert_true(blocked[161]); - }), 1); }, "Async script injected via deferred 'document.write' is not allowed with 'strict-dynamic'."); </script> </body>
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/strict-dynamic/script-src-strict-dynamic-whitelist.html b/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/strict-dynamic/script-src-strict-dynamic-whitelist.html index 6b441c29..954d507 100644 --- a/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/strict-dynamic/script-src-strict-dynamic-whitelist.html +++ b/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/strict-dynamic/script-src-strict-dynamic-whitelist.html
@@ -4,48 +4,26 @@ <meta http-equiv="Content-Security-Policy" content="script-src 'nonce-abcdefg' 'strict-dynamic' http://localhost:8000"> <script src="/resources/testharness.js" nonce="abcdefg"></script> <script src="/resources/testharnessreport.js" nonce="abcdefg"></script> + <script src="../resources/securitypolicyviolation-helper.js" nonce="abcdefg"></script> </head> <body> - <script nonce="abcdefg"> - function generateURL(type) { - return 'http://localhost:8000/security/contentSecurityPolicy/resources/loaded.js?' + type; - } - - var loaded = {}; - var blocked = {}; - window.addEventListener("message", function (e) { - loaded[e.data] = true; - }); - document.addEventListener("securitypolicyviolation", function (e) { - blocked[e.lineNumber] = true; - }); - </script> <!-- Need to individually wrap test cases in script blocks. Violation reports triggered by document.write() calls while the parser is waiting on blocking scipts are missing line numbers. See: https://crbug.com/649085. --> <script nonce="abcdefg"> async_test(function (t) { + assert_script_failed(t, generateURL("write"), 14); document.write("<scr" + "ipt src='" + generateURL("write") + "'></scr" + "ipt>"); - setTimeout(t.step_func_done(function () { - assert_equals(loaded[generateURL("write")], undefined); - assert_true(blocked[26]); - }), 1); }, "Script injected via 'document.write' is not allowed with 'strict-dynamic', even if whitelisted."); </script> <script nonce="abcdefg"> async_test(function (t) { + assert_script_failed(t, generateURL("write-defer"), 20); document.write("<scr" + "ipt defer src='" + generateURL("write-defer") + "'></scr" + "ipt>"); - setTimeout(t.step_func_done(function () { - assert_equals(loaded[generateURL("write-defer")], undefined); - assert_true(blocked[35]); - }), 1); }, "Deferred script injected via 'document.write' is not allowed with 'strict-dynamic', even if whitelisted."); </script> <script nonce="abcdefg"> async_test(function (t) { + assert_script_failed(t, generateURL("write-async"), 26); document.write("<scr" + "ipt async src='" + generateURL("write-async") + "'></scr" + "ipt>"); - setTimeout(t.step_func_done(function () { - assert_equals(loaded[generateURL("write-async")], undefined); - assert_true(blocked[44]); - }), 1); }, "Async script injected via 'document.write' is not allowed with 'strict-dynamic', even if whitelisted."); </script> </body>
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/strict-dynamic/script-src-strict-dynamic.html b/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/strict-dynamic/script-src-strict-dynamic.html index 81e21f8..6c484e4 100644 --- a/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/strict-dynamic/script-src-strict-dynamic.html +++ b/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/strict-dynamic/script-src-strict-dynamic.html
@@ -4,34 +4,16 @@ <meta http-equiv="Content-Security-Policy" content="script-src 'nonce-abcdefg' 'strict-dynamic'"> <script src="/resources/testharness.js" nonce="abcdefg"></script> <script src="/resources/testharnessreport.js" nonce="abcdefg"></script> + <script src="../resources/securitypolicyviolation-helper.js" nonce="abcdefg"></script> </head> <body> - <script nonce="abcdefg"> - function generateURL(type) { - return 'http://localhost:8000/security/contentSecurityPolicy/resources/loaded.js?' + type; - } - - var loaded = {}; - var blocked = {}; - window.addEventListener("message", function (e) { - loaded[e.data] = true; - }); - document.addEventListener("securitypolicyviolation", function (e) { - blocked[e.lineNumber] = true; - }); - </script> <!-- Need to individually wrap test cases in script blocks. Violation reports triggered by document.write() calls while the parser is waiting on blocking scipts are missing line numbers. See: https://crbug.com/649085. --> <script nonce="abcdefg"> async_test(function (t) { var e = document.createElement('script'); e.src = generateURL("append"); - e.onload = t.step_func(function () { - // Delay the check until after the postMessage has a chance to execute. - setTimeout(t.step_func_done(function () { - assert_true(loaded[generateURL("append")]); - }), 1); - }); e.onerror = t.unreached_func("Error should not be triggered."); + assert_script_loads(t, generateURL("append"), 17); document.body.appendChild(e); }, "Script injected via 'appendChild' is allowed with 'strict-dynamic'."); </script> @@ -40,13 +22,8 @@ var e = document.createElement('script'); e.src = generateURL("append-async"); e.async = true; - e.onload = t.step_func(function () { - // Delay the check until after the postMessage has a chance to execute. - setTimeout(t.step_func_done(function () { - assert_true(loaded[generateURL("append-async")]); - }), 1); - }); e.onerror = t.unreached_func("Error should not be triggered."); + assert_script_loads(t, generateURL("append-async"), 27); document.body.appendChild(e); }, "Async script injected via 'appendChild' is allowed with 'strict-dynamic'."); </script> @@ -55,55 +32,35 @@ var e = document.createElement('script'); e.src = generateURL("append-defer"); e.defer = true; - e.onload = t.step_func(function () { - // Delay the check until after the postMessage has a chance to execute. - setTimeout(t.step_func_done(function () { - assert_true(loaded[generateURL("append-defer")]); - }), 1); - }); e.onerror = t.unreached_func("Error should not be triggered."); + assert_script_loads(t, generateURL("append-defer"), 37); document.body.appendChild(e); }, "Deferred script injected via 'appendChild' is allowed with 'strict-dynamic'."); </script> <script nonce="abcdefg"> async_test(function (t) { + assert_script_failed(t, generateURL("write"), 43); document.write("<scr" + "ipt src='" + generateURL("write") + "'></scr" + "ipt>"); - setTimeout(t.step_func_done(function () { - assert_equals(loaded[generateURL("write")], undefined); - assert_true(blocked[70]); - }), 1); }, "Script injected via 'document.write' is not allowed with 'strict-dynamic'."); </script> <script nonce="abcdefg"> async_test(function (t) { + assert_script_failed(t, generateURL("write-defer"), 49); document.write("<scr" + "ipt defer src='" + generateURL("write-defer") + "'></scr" + "ipt>"); - setTimeout(t.step_func_done(function () { - assert_equals(loaded[generateURL("write-defer")], undefined); - assert_true(blocked[79]); - }), 1); }, "Deferred script injected via 'document.write' is not allowed with 'strict-dynamic'."); </script> <script nonce="abcdefg"> async_test(function (t) { + assert_script_failed(t, generateURL("write-async"), 55); document.write("<scr" + "ipt async src='" + generateURL("write-async") + "'></scr" + "ipt>"); - setTimeout(t.step_func_done(function () { - assert_equals(loaded[generateURL("write-async")], undefined); - assert_true(blocked[88]); - }), 1); }, "Async script injected via 'document.write' is not allowed with 'strict-dynamic'."); </script> <script nonce="abcdefg" defer> async_test(function (t) { var e = document.createElement('script'); e.src = generateURL("defer-append"); - e.onload = t.step_func(function () { - // Delay the check until after the postMessage has a chance to execute. - setTimeout(t.step_func_done(function () { - assert_true(loaded[generateURL("defer-append")]); - assert_equals(blocked[generateURL("defer-append")], undefined); - }), 1); - }); e.onerror = t.unreached_func("Error should not be triggered."); + assert_script_loads(t, generateURL("defer-append"), 64); document.body.appendChild(e); }, "Script injected via deferred 'appendChild' is allowed with 'strict-dynamic'."); </script> @@ -112,14 +69,8 @@ var e = document.createElement('script'); e.src = generateURL("defer-append-async"); e.async = true; - e.onload = t.step_func(function () { - // Delay the check until after the postMessage has a chance to execute. - setTimeout(t.step_func_done(function () { - assert_true(loaded[generateURL("defer-append-async")]); - assert_equals(blocked[generateURL("defer-append-async")], undefined); - }), 1); - }); e.onerror = t.unreached_func("Error should not be triggered."); + assert_script_loads(t, generateURL("defer-append-async"), 74); document.body.appendChild(e); }, "Async script injected via deferred 'appendChild' is allowed with 'strict-dynamic'."); </script> @@ -128,42 +79,27 @@ var e = document.createElement('script'); e.src = generateURL("defer-append-defer"); e.defer = true; - e.onload = t.step_func(function () { - // Delay the check until after the postMessage has a chance to execute. - setTimeout(t.step_func_done(function () { - assert_true(loaded[generateURL("defer-append-defer")]); - assert_equals(blocked[generateURL("defer-append-defer")], undefined); - }), 1); - }); e.onerror = t.unreached_func("Error should not be triggered."); + assert_script_loads(t, generateURL("defer-append-defer"), 84); document.body.appendChild(e); }, "Deferred script injected via deferred 'appendChild' is allowed with 'strict-dynamic'."); </script> <script nonce="abcdefg" defer> async_test(function (t) { + assert_script_failed(t, generateURL("defer-write"), 90); document.write("<scr" + "ipt src='" + generateURL("defer-write") + "'></scr" + "ipt>"); - setTimeout(t.step_func_done(function () { - assert_equals(loaded[generateURL("defer-write")], undefined); - assert_true(blocked[144]); - }), 1); }, "Script injected via deferred 'document.write' is not allowed with 'strict-dynamic'."); </script> <script nonce="abcdefg" defer> async_test(function (t) { + assert_script_failed(t, generateURL("defer-write-defer"), 96); document.write("<scr" + "ipt defer src='" + generateURL("defer-write-defer") + "'></scr" + "ipt>"); - setTimeout(t.step_func_done(function () { - assert_equals(loaded[generateURL("defer-write-defer")], undefined); - assert_true(blocked[153]); - }), 1); }, "Deferred script injected via deferred 'document.write' is not allowed with 'strict-dynamic'."); </script> <script nonce="abcdefg" defer> async_test(function (t) { + assert_script_failed(t, generateURL("defer-write-async"), 102); document.write("<scr" + "ipt async src='" + generateURL("defer-write-async") + "'></scr" + "ipt>"); - setTimeout(t.step_func_done(function () { - assert_equals(loaded[generateURL("defer-write-async")], undefined); - assert_true(blocked[162]); - }), 1); }, "Async script injected via deferred 'document.write' is not allowed with 'strict-dynamic'."); </script> </body>
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/frameNavigation/xss-DENIED-top-navigation-without-user-gesture.html b/third_party/WebKit/LayoutTests/http/tests/security/frameNavigation/xss-DENIED-top-navigation-without-user-gesture.html index 723733f..a2cdc94 100644 --- a/third_party/WebKit/LayoutTests/http/tests/security/frameNavigation/xss-DENIED-top-navigation-without-user-gesture.html +++ b/third_party/WebKit/LayoutTests/http/tests/security/frameNavigation/xss-DENIED-top-navigation-without-user-gesture.html
@@ -6,6 +6,8 @@ testRunner.dumpChildFramesAsText(); testRunner.setDumpConsoleMessages(false); } +if (window.internals) + internals.runtimeFlags.setFramebustingNeedsSameOriginOrUserGesture(true); </script> </head> <body>
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/img-crossorigin-redirect-credentials-expected.txt b/third_party/WebKit/LayoutTests/http/tests/security/img-crossorigin-redirect-credentials-expected.txt deleted file mode 100644 index d408427..0000000 --- a/third_party/WebKit/LayoutTests/http/tests/security/img-crossorigin-redirect-credentials-expected.txt +++ /dev/null
@@ -1,22 +0,0 @@ -CONSOLE ERROR: Access to Image at 'http://localhost:8000/security/resources/abe.png' from origin 'http://127.0.0.1:8000' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://127.0.0.1:8000' is therefore not allowed access. -CONSOLE ERROR: Access to Image at 'http://127.0.0.1:8080/security/resources/abe-allow-credentials.php' from origin 'null' has been blocked by CORS policy: The 'Access-Control-Allow-Origin' header has a value 'http://127.0.0.1:8000' that is not equal to the supplied origin. Origin 'null' is therefore not allowed access. -CONSOLE ERROR: Access to Image at 'http://localhost:8000/security/resources/abe-allow-star.php' from origin 'http://127.0.0.1:8000' has been blocked by CORS policy: A wildcard '*' cannot be used in the 'Access-Control-Allow-Origin' header when the credentials flag is true. Origin 'http://127.0.0.1:8000' is therefore not allowed access. -CONSOLE ERROR: Access to Image at 'http://127.0.0.1:8000/security/resources/abe-allow-star.php' from origin 'null' has been blocked by CORS policy: A wildcard '*' cannot be used in the 'Access-Control-Allow-Origin' header when the credentials flag is true. Origin 'null' is therefore not allowed access. -Testing the handling of CORS-enabled fetch in the presence of 'credentialled' redirects. - -On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". - - -PASS/FAIL descriptions are of the form, 'CORS request type': 'redirect CORS type' => 'resource' - -PASS: Anonymous request: credentialled => no-CORS image resource. -PASS: Anonymous request: credentialled => anonymous CORS image resource (same origin.) -PASS: Anonymous request: credentialled => anonymous CORS image resource (cross origin.) -PASS: Credentialled request: credentialled => credentialled-CORS image resource (same origin.) -PASS: Credentialled request: credentialled => credentialled-CORS image resource (cross origin.) -PASS: Credentialled request: credentialled => anonymous-CORS image resource (same origin.) -PASS: Credentialled request: credentialled => anonymous-CORS image resource (cross origin.) -PASS successfullyParsed is true - -TEST COMPLETE -
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/img-crossorigin-redirect-credentials.html b/third_party/WebKit/LayoutTests/http/tests/security/img-crossorigin-redirect-credentials.html index 8f2530b..e3632519 100644 --- a/third_party/WebKit/LayoutTests/http/tests/security/img-crossorigin-redirect-credentials.html +++ b/third_party/WebKit/LayoutTests/http/tests/security/img-crossorigin-redirect-credentials.html
@@ -1,86 +1,160 @@ <!DOCTYPE HTML> -<script src="/js-test-resources/js-test.js"></script> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/get-host-info.js?pipe=sub"></script> <script> -description("Testing the handling of CORS-enabled fetch in the presence of 'credentialled' redirects."); - -// Explain the short form descriptions ('=>' representing the redirect.) -debug("PASS/FAIL descriptions are of the form, 'CORS request type': 'redirect CORS type' => 'resource'"); -debug(""); - -var redirect_cors = "use-credentials"; - -window.jsTestIsAsync = true; if (window.testRunner) - testRunner.dumpAsText(); + testRunner.setBlockThirdPartyCookies(false); -function finish() { - if (window.testRunner) - finishJSTest(); +const host_info = get_host_info(); + +document.cookie = "TestCookie=same"; + +const ANOTHER_REMOTE_ORIGIN = 'http://127.0.0.1:8080'; + +const SET_COOKIE_PATH = '/security/resources/set-cookie.php'; + +const set_cookie_promise = Promise.all([ + fetch( + host_info['HTTP_REMOTE_ORIGIN'] + SET_COOKIE_PATH + '?name=TestCookie&value=cross', + {mode: 'no-cors', credentials: 'include'}), + fetch( + ANOTHER_REMOTE_ORIGIN + SET_COOKIE_PATH + '?name=TestCookie&value=cross', + {mode: 'no-cors', credentials: 'include'}) +]); + +let count = 0; + +function load_image(url, crossOriginAttribute, expectLoad, expectCookie) { + return new Promise((resolve, reject) => { + set_cookie_promise.then(() => { + const img = new Image(); + + img.onload = () => { + if (expectLoad) { + resolve(); + } else { + reject('Image loaded unexpectedly'); + } + }; + + img.onerror = () => { + if (expectLoad) { + reject('Image not loaded unexpectedly'); + } else { + resolve(); + } + }; + + img.crossOrigin = crossOriginAttribute; + + const destination_params = new URLSearchParams(); + destination_params.append('count', count); + ++count; + if (expectCookie) { + destination_params.append('Cookie', expectCookie); + } + + const params = new URLSearchParams(); + params.append('mode', 'use-credentials'); + params.append('url', url + '?' + destination_params.toString()); + + img.src = host_info['HTTP_REMOTE_ORIGIN'] + '/security/resources/cors-redirect.php?' + params.toString(); + + document.body.appendChild(img); + }); + }); } -function fail() { - debug("FAIL: " + this.description); - runNextTest(); -} +promise_test(() => { + return load_image( + host_info['HTTP_REMOTE_ORIGIN'] + '/security/resources/abe.png', + 'anonymous', + false, + undefined); +}, 'From a remote origin to the same remote origin. crossOrigin set to anonymous. Response includes no CORS header. Fails due to CORS check.'); -function pass() { - debug("PASS: " + this.description); - runNextTest(); -} +promise_test(() => { + return load_image( + host_info['HTTP_REMOTE_ORIGIN'] + '/security/resources/abe.png', + 'use-credentials', + false, + undefined); +}, 'From a remote origin to the same remote origin. crossOrigin set to use-credentials. Response includes no CORS header. Fails due to CORS check.'); -var tests = [ - { description: "Anonymous request: credentialled => no-CORS image resource.", - url: "http://localhost:8000/security/resources/abe.png", - // Redirect is allowed, but fails access check on the non-CORS resource. - success: false, - access: "anonymous"}, - { description: "Anonymous request: credentialled => anonymous CORS image resource (same origin.)", - url: "http://localhost:8000/security/resources/abe-allow-star.php", - // Redirect is allowed, as is access to the anonymous CORS resource. - success: true, - access: "anonymous"}, - { description: "Anonymous request: credentialled => anonymous CORS image resource (cross origin.)", - url: "http://localhost:8080/security/resources/abe-allow-star.php", - // Redirect is allowed, as is access (with origin 'null') to the CORS resource. - success: true, - access: "anonymous"}, - { description: "Credentialled request: credentialled => credentialled-CORS image resource (same origin.)", - url: "http://localhost:8000/security/resources/abe-allow-credentials.php", - // Redirect is allowed, as is access (with original origin) to the CORS resource. - success: true, - access: "use-credentials"}, - { description: "Credentialled request: credentialled => credentialled-CORS image resource (cross origin.)", - url: "http://127.0.0.1:8080/security/resources/abe-allow-credentials.php", - // Redirect is allowed, source origin mutates to 'null', so credentialled resource not accessible. - success: false, - access: "use-credentials"}, - { description: "Credentialled request: credentialled => anonymous-CORS image resource (same origin.)", - url: "http://localhost:8000/security/resources/abe-allow-star.php", - // Redirect is allowed, but anonymous resource with * as allowed origins is not accessible. - success: false, - access: "use-credentials"}, - { description: "Credentialled request: credentialled => anonymous-CORS image resource (cross origin.)", - url: "http://127.0.0.1:8000/security/resources/abe-allow-star.php", - // Redirect is allowed, source origin mutates to 'null', so anonymous resource with * as allowed origins is not accessible. - success: false, - access: "use-credentials"}, - ]; +promise_test(() => { + return load_image( + host_info['HTTP_REMOTE_ORIGIN'] + '/security/resources/abe-allow-star.php', + 'anonymous', + true, + 'NotSet'); +}, 'From a remote origin to the same remote origin. crossOrigin set to anonymous. Response includes wildcard Access-Control-Allow-Origin.'); -function runNextTest() { - if (!tests.length) { - finish(); - return; - } - var test = tests.shift(); - var img = new Image(); - img.onload = test.success ? pass : fail; - img.onerror = test.success ? fail : pass; - img.crossOrigin = test.access; - img.description = test.description; - var args = [ "mode=" + redirect_cors, - "url=" + test.url]; - img.src = "http://localhost:8000/security/resources/cors-redirect.php?" + args.join("&"); - document.body.appendChild(img); -} -window.onload = runNextTest; +promise_test(() => { + return load_image( + host_info['HTTP_REMOTE_ORIGIN'] + '/security/resources/abe-allow-star.php', + 'use-credentials', + false, + undefined); +}, 'From a remote origin to the same remote origin. crossOrigin set to use-credentials. Response includes wildcard Access-Control-Allow-Origin. Fails due to absence of Access-Control-Allow-Credentials.'); + +promise_test(() => { + return load_image( + host_info['HTTP_REMOTE_ORIGIN'] + '/security/resources/abe-allow-credentials.php', + 'use-credentials', + true, + 'cross'); +}, 'From a remote origin to the same remote origin. crossOrigin set to use-credentials. Response includes Access-Control-Allow-Credentials.'); + +// Origin is set to null on remote to another remote redirect. + +promise_test(() => { + return load_image( + ANOTHER_REMOTE_ORIGIN + '/security/resources/abe-allow-star.php', + 'anonymous', + true, + 'NotSet'); +}, 'From a remote origin to another remote origin. crossOrigin set to anonymous. Response includes wildcard Access-Control-Allow-Origin.'); + +promise_test(() => { + return load_image( + ANOTHER_REMOTE_ORIGIN + '/security/resources/abe-allow-star.php', + 'use-credentials', + false, + undefined); +}, 'From a remote origin to another remote origin. crossOrigin set to use-credentials. Response includes wildcard Access-Control-Allow-Origin. Fails due to absence of Access-Control-Allow-Credentials.'); + +promise_test(() => { + return load_image( + ANOTHER_REMOTE_ORIGIN + '/security/resources/abe-allow-credentials.php', + 'use-credentials', + false, + undefined); +}, 'From a remote origin to another remote origin. crossOrigin set to use-credentials. Response includes Access-Control-Allow-Credentials. Fails due to allowed origin mismatch.'); + +// Origin is set to null on remote to another redirect even if the destination is the same origin as this document. + +promise_test(() => { + return load_image( + host_info['HTTP_ORIGIN'] + '/security/resources/abe-allow-star.php', + 'anonymous', + true, + 'NotSet'); +}, 'From a remote origin to the origin of this document. crossOrigin set to anonymous. Response includes wildcard Access-Control-Allow-Origin.'); + +promise_test(() => { + return load_image( + host_info['HTTP_ORIGIN'] + '/security/resources/abe-allow-star.php', + 'use-credentials', + false, + undefined); +}, 'From a remote origin to the origin of this document. crossOrigin set to use-credentials. Response includes wildcard Access-Control-Allow-Origin. Fails due to absence of Access-Control-Allow-Credentials.'); + +promise_test(() => { + return load_image( + host_info['HTTP_ORIGIN'] + '/security/resources/abe-allow-credentials.php', + 'use-credentials', + false, + undefined); +}, 'From a remote origin to the origin of this document. crossOrigin set to use-credentials. Response includes Access-Control-Allow-Credentials. Fails due to allowed origin mismatch.'); </script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/img-redirect-to-crossorigin-credentials.html b/third_party/WebKit/LayoutTests/http/tests/security/img-redirect-to-crossorigin-credentials.html new file mode 100644 index 0000000..157a3f6 --- /dev/null +++ b/third_party/WebKit/LayoutTests/http/tests/security/img-redirect-to-crossorigin-credentials.html
@@ -0,0 +1,100 @@ +<!DOCTYPE HTML> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/get-host-info.js?pipe=sub"></script> +<script> +if (window.testRunner) + testRunner.setBlockThirdPartyCookies(false); + +const host_info = get_host_info(); + +document.cookie = 'TestCookie=same'; + +const set_cookie_promise = fetch( + host_info['HTTP_REMOTE_ORIGIN'] + '/security/resources/set-cookie.php?name=TestCookie&value=cross', + {mode: 'no-cors', credentials: 'include'}); + +let count = 0; + +function load_image(url, crossOriginAttribute, expectLoad, expectCookie) { + return new Promise((resolve, reject) => { + set_cookie_promise.then(() => { + const img = new Image(); + + img.onload = () => { + if (expectLoad) { + resolve(); + } else { + reject('Image loaded unexpectedly'); + } + }; + + img.onerror = () => { + if (expectLoad) { + reject('Image not loaded unexpectedly'); + } else { + resolve(); + } + }; + + img.crossOrigin = crossOriginAttribute; + + const destination_params = new URLSearchParams(); + destination_params.append('count', count); + ++count; + if (expectCookie) { + destination_params.append('Cookie', expectCookie); + } + + const params = new URLSearchParams(); + params.append('url', url + '?' + destination_params.toString()); + + img.src = '/resources/redirect.php?' + params.toString(); + + document.body.appendChild(img); + }); + }); +} + +promise_test(() => { + return load_image( + host_info['HTTP_ORIGIN'] + '/security/resources/abe-cookie-check.php', + 'anonymous', + true, + 'same'); +}, 'Same origin destination. crossOrigin set to anonymous'); + +promise_test(() => { + return load_image( + host_info['HTTP_ORIGIN'] + '/security/resources/abe-cookie-check.php', + 'use-credentials', + true, + 'same'); +}, 'Same origin destination. crossOrigin set to use-credentials'); + +// TODO(tyoshino): Blink must not send a cookie for this case. Fix the resource +// fetcher, and update this to expect Cookie=NotSet. +promise_test(() => { + return load_image( + host_info['HTTP_REMOTE_ORIGIN'] + '/security/resources/abe-allow-star.php', + 'anonymous', + true, + 'cross'); +}, 'Cross origin destination. crossOrigin set to anonymous. Response includes wildcard Access-Control-Allow-Origin.'); + +promise_test(() => { + return load_image( + host_info['HTTP_REMOTE_ORIGIN'] + '/security/resources/abe-allow-star.php', + 'use-credentials', + false, + undefined); +}, 'Cross origin destination. crossOrigin set to use-credentials. Response includes wildcard Access-Control-Allow-Origin. Fails due to absence of Access-Control-Allow-Credentials.'); + +promise_test(() => { + return load_image( + host_info['HTTP_REMOTE_ORIGIN'] + '/security/resources/abe-allow-credentials.php', + 'use-credentials', + true, + 'cross'); +}, 'Cross origin destination. crossOrigin set to use-credentials. Response includes Access-Control-Allow-Credentials.'); +</script>
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/layout-fonts/generic-system-ui.html b/third_party/WebKit/LayoutTests/inspector-protocol/layout-fonts/generic-system-ui.html new file mode 100644 index 0000000..1ce9b7a --- /dev/null +++ b/third_party/WebKit/LayoutTests/inspector-protocol/layout-fonts/generic-system-ui.html
@@ -0,0 +1,17 @@ +<!DOCTYPE html> +<script type="text/javascript" src="../../http/tests/inspector-protocol/inspector-protocol-test.js"></script> +<script type="text/javascript" src="../../http/tests/inspector-protocol/css-protocol-test.js"></script> +<script type="text/javascript" src="../../http/tests/inspector-protocol/dom-protocol-test.js"></script> +<script type="text/javascript" src="resources/layout-font-test.js"></script> +<style> +.test { + font-family: system-ui; +} +#system-ui-20pt { + font-size: 20pt; +} +</style> +<div class="test"> + <div id="system-ui">This text should use the system font.</div> + <div id="system-ui-20pt">This text should use the system font.</div> +</div>
diff --git a/third_party/WebKit/LayoutTests/inspector/tracing/timeline-js/timeline-script-tag-1-expected.txt b/third_party/WebKit/LayoutTests/inspector/tracing/timeline-js/timeline-script-tag-1-expected.txt index 3afcf38..fa7747d 100644 --- a/third_party/WebKit/LayoutTests/inspector/tracing/timeline-js/timeline-script-tag-1-expected.txt +++ b/third_party/WebKit/LayoutTests/inspector/tracing/timeline-js/timeline-script-tag-1-expected.txt
@@ -3,6 +3,15 @@ EvaluateScript +EvaluateScript Properties: +{ + data : { + } + endTime : <number> + startTime : <number> + type : "EvaluateScript" +} +EvaluateScript ----> Timestamp: SCRIPT TAG EvaluateScript Properties: {
diff --git a/third_party/WebKit/LayoutTests/inspector/tracing/timeline-js/timeline-script-tag-2-expected.txt b/third_party/WebKit/LayoutTests/inspector/tracing/timeline-js/timeline-script-tag-2-expected.txt index a7feeef9..53ba8939 100644 --- a/third_party/WebKit/LayoutTests/inspector/tracing/timeline-js/timeline-script-tag-2-expected.txt +++ b/third_party/WebKit/LayoutTests/inspector/tracing/timeline-js/timeline-script-tag-2-expected.txt
@@ -4,6 +4,14 @@ EvaluateScript Properties: { data : { + } + endTime : <number> + startTime : <number> + type : "EvaluateScript" +} +EvaluateScript Properties: +{ + data : { columnNumber : <number> frame : <string> lineNumber : <number>
diff --git a/third_party/WebKit/LayoutTests/inspector/tracing/timeline-misc/timeline-receive-response-event-expected.txt b/third_party/WebKit/LayoutTests/inspector/tracing/timeline-misc/timeline-receive-response-event-expected.txt index c0dac66..21f3a531 100644 --- a/third_party/WebKit/LayoutTests/inspector/tracing/timeline-misc/timeline-receive-response-event-expected.txt +++ b/third_party/WebKit/LayoutTests/inspector/tracing/timeline-misc/timeline-receive-response-event-expected.txt
@@ -1,6 +1,6 @@ Tests the Timeline API instrumentation of a SendRequest, ReceiveResponse etc. - ResourceSendRequest + ResourceSendRequest ResourceReceiveResponse ResourceReceivedData ResourceFinish
diff --git a/third_party/WebKit/LayoutTests/inspector/tracing/timeline-time/timeline-time-expected.txt b/third_party/WebKit/LayoutTests/inspector/tracing/timeline-time/timeline-time-expected.txt index 6c78afe..12d37a0f 100644 --- a/third_party/WebKit/LayoutTests/inspector/tracing/timeline-time/timeline-time-expected.txt +++ b/third_party/WebKit/LayoutTests/inspector/tracing/timeline-time/timeline-time-expected.txt
@@ -8,7 +8,7 @@ Running: testUnbalancedConsoleTime Running: testConsoleTimeWithoutConsoleTimeEnd -----> Timestamp: Foo -----> Timestamp: Bar -----> Timestamp: Baz +--------> Timestamp: Foo +--------> Timestamp: Bar +--------> Timestamp: Baz
diff --git a/third_party/WebKit/LayoutTests/inspector/tracing/timeline-time/timeline-timer-expected.txt b/third_party/WebKit/LayoutTests/inspector/tracing/timeline-time/timeline-timer-expected.txt index 747ec425..ec5b64b 100644 --- a/third_party/WebKit/LayoutTests/inspector/tracing/timeline-time/timeline-timer-expected.txt +++ b/third_party/WebKit/LayoutTests/inspector/tracing/timeline-time/timeline-timer-expected.txt
@@ -113,6 +113,15 @@ EvaluateScript Properties: { data : { + } + endTime : <number> + startTime : <number> + type : "EvaluateScript" +} +Text details for EvaluateScript: undefined +EvaluateScript Properties: +{ + data : { columnNumber : <number> frame : <string> lineNumber : <number>
diff --git a/third_party/WebKit/LayoutTests/inspector/tracing/worker-js-frames-expected.txt b/third_party/WebKit/LayoutTests/inspector/tracing/worker-js-frames-expected.txt index 670bfb51..b0f4608 100644 --- a/third_party/WebKit/LayoutTests/inspector/tracing/worker-js-frames-expected.txt +++ b/third_party/WebKit/LayoutTests/inspector/tracing/worker-js-frames-expected.txt
@@ -1,6 +1,14 @@ Tests js cpu profile in timeline. Main Thread +EvaluateScript Properties: +{ + data : { + } + endTime : <number> + startTime : <number> + type : "EvaluateScript" +} DedicatedWorker Thread DedicatedWorker Thread EvaluateScript Properties:
diff --git a/third_party/WebKit/LayoutTests/media/remoteplayback/availability-callback-gc.html b/third_party/WebKit/LayoutTests/media/remoteplayback/availability-callback-gc.html new file mode 100644 index 0000000..da2e209e --- /dev/null +++ b/third_party/WebKit/LayoutTests/media/remoteplayback/availability-callback-gc.html
@@ -0,0 +1,36 @@ +<!DOCTYPE html> +<html> + <head> + <title>Test that the callback is not garbage collected if registered.</title> + <script src="../../resources/testharness.js"></script> + <script src="../../resources/testharnessreport.js"></script> + <script src="../media-file.js"></script> + </head> + <body> + <script> + function gc() { + if (window.GCController) + GCController.collect(); + else { + for (var i = 0; i < 10000; ++i) { + ({ }); + } + } + } + + async_test(function(t) + { + var v = document.createElement('video'); + v.src = findMediaFile('video', 'content/test'); + document.body.appendChild(v); + + function callback(available) {} + var callbackRef = t.step_func_done(callback); + + v.remote.watchAvailability(callbackRef).then( + function() { callbackRef = null; gc(); }, + t.unreached_func()); + }, 'Test that the callback is not garbage collected if registered.'); + </script> + </body> +</html>
diff --git a/third_party/WebKit/LayoutTests/media/remoteplayback/cancel-watch-availability.html b/third_party/WebKit/LayoutTests/media/remoteplayback/cancel-watch-availability.html new file mode 100644 index 0000000..1043a99 --- /dev/null +++ b/third_party/WebKit/LayoutTests/media/remoteplayback/cancel-watch-availability.html
@@ -0,0 +1,61 @@ +<!DOCTYPE html> +<html> + <head> + <title>Tests various ways to call cancelWatchAvailability()</title> + <script src="../../resources/testharness.js"></script> + <script src="../../resources/testharnessreport.js"></script> + <script src="../media-file.js"></script> + </head> + <body> + <script> + var notFoundErrorException = new DOMException( + 'A callback with the given id is not found.', + 'NotFoundError'); + + async_test(function(t) { + var v = document.createElement('video'); + v.src = findMediaFile('video', 'content/test'); + document.body.appendChild(v); + + v.remote.watchAvailability(function() {}) + .then(t.step_func(function(id) { + v.remote.cancelWatchAvailability(id).then(t.step_func(function() { + v.remote.cancelWatchAvailability(id).then( + t.unreached_func(), t.step_func_done(function(e) { + assert_equals(e.name, notFoundErrorException.name); + assert_equals(e.message, notFoundErrorException.message); + }) + ); + }), + t.unreached_func()); + }), + t.unreached_func()); + }, 'Test that calling cancelWatchAvailability() with an id does remove the callback.'); + + async_test(function(t) { + var v = document.createElement('video'); + v.src = findMediaFile('video', 'content/test'); + document.body.appendChild(v); + + Promise.all([ + v.remote.watchAvailability(function() {}), + v.remote.watchAvailability(function() {}) + ]).then(t.step_func(function(ids) { + v.remote.cancelWatchAvailability().then(t.step_func(function() { + v.remote.cancelWatchAvailability(ids[0]).then(t.unreached_func(), t.step_func(function(e) { + assert_equals(e.name, notFoundErrorException.name); + assert_equals(e.message, notFoundErrorException.message); + v.remote.cancelWatchAvailability(ids[1]) + .then(t.unreached_func(), t.step_func_done(function(e) { + assert_equals(e.name, notFoundErrorException.name); + assert_equals(e.message, notFoundErrorException.message); + })); + })); + }), + t.unreached_func()); + }), + t.unreached_func()); + }, 'Test that calling cancelWatchAvailability() without an id removes all the callbacks.'); + </script> + </body> +</html>
diff --git a/third_party/WebKit/LayoutTests/media/remoteplayback/disable-remote-playback-cancel-watch-availability-throws.html b/third_party/WebKit/LayoutTests/media/remoteplayback/disable-remote-playback-cancel-watch-availability-throws.html new file mode 100644 index 0000000..ad63fa9 --- /dev/null +++ b/third_party/WebKit/LayoutTests/media/remoteplayback/disable-remote-playback-cancel-watch-availability-throws.html
@@ -0,0 +1,41 @@ +<!DOCTYPE html> +<html> + <head> + <title>Test that calling cancelWatchAvailability() when disableRemotePlayback attribute is set throws an exception</title> + <script src="../../resources/testharness.js"></script> + <script src="../../resources/testharnessreport.js"></script> + <script src="../media-file.js"></script> + </head> + <body> + <script> + async_test(function(t) + { + var v = document.createElement('video'); + var invalidStateErrorException = new DOMException( + 'disableRemotePlayback attribute is present.', + 'InvalidStateError'); + v.src = findMediaFile('video', 'content/test'); + document.body.appendChild(v); + + v.remote.watchAvailability(function() {}) + .then(function(id) { + v.disableRemotePlayback = true; + v.remote.cancelWatchAvailability(id).then( + t.unreached_func(), + t.step_func(function(e) { + assert_equals(e.name, invalidStateErrorException.name); + assert_equals(e.message, invalidStateErrorException.message); + v.remote.cancelWatchAvailability().then( + t.unreached_func(), + t.step_func_done(function(e) { + assert_equals(e.name, invalidStateErrorException.name); + assert_equals(e.message, invalidStateErrorException.message); + }) + ); + })); + }, + t.unreached_func()); + }, 'Test that calling cancelWatchAvailability() when disableRemotePlayback attribute is set throws an exception.'); + </script> + </body> +</html>
diff --git a/third_party/WebKit/LayoutTests/media/remoteplayback/disable-remote-playback-prompt-throws.html b/third_party/WebKit/LayoutTests/media/remoteplayback/disable-remote-playback-prompt-throws.html index 1434565..115d807 100644 --- a/third_party/WebKit/LayoutTests/media/remoteplayback/disable-remote-playback-prompt-throws.html +++ b/third_party/WebKit/LayoutTests/media/remoteplayback/disable-remote-playback-prompt-throws.html
@@ -12,7 +12,7 @@ { var v = document.createElement('video'); v.src = findMediaFile('video', 'content/test'); - v.disableRemotePlayback = true + v.disableRemotePlayback = true; document.body.appendChild(v); return promise_rejects(
diff --git a/third_party/WebKit/LayoutTests/media/remoteplayback/disable-remote-playback-watch-availability-throws.html b/third_party/WebKit/LayoutTests/media/remoteplayback/disable-remote-playback-watch-availability-throws.html new file mode 100644 index 0000000..4c360256 --- /dev/null +++ b/third_party/WebKit/LayoutTests/media/remoteplayback/disable-remote-playback-watch-availability-throws.html
@@ -0,0 +1,25 @@ +<!DOCTYPE html> +<html> + <head> + <title>Test that calling watchAvailability() when disableRemotePlayback attribute is set throws an exception</title> + <script src="../../resources/testharness.js"></script> + <script src="../../resources/testharnessreport.js"></script> + <script src="../media-file.js"></script> + </head> + <body> + <script> + promise_test(function(test) + { + var v = document.createElement('video'); + v.src = findMediaFile('video', 'content/test'); + v.disableRemotePlayback = true; + document.body.appendChild(v); + + return promise_rejects( + test, + new DOMException('disableRemotePlayback attribute is present.', 'InvalidStateError'), + v.remote.watchAvailability(function() {})); + }, 'Test that calling watchAvailability() when disableRemotePlayback attribute is set throws an exception.'); + </script> + </body> +</html>
diff --git a/third_party/WebKit/LayoutTests/media/remoteplayback/watch-availability-initial-callback.html b/third_party/WebKit/LayoutTests/media/remoteplayback/watch-availability-initial-callback.html new file mode 100644 index 0000000..67ffcd9a --- /dev/null +++ b/third_party/WebKit/LayoutTests/media/remoteplayback/watch-availability-initial-callback.html
@@ -0,0 +1,30 @@ +<!DOCTYPE html> +<html> + <head> + <title>Test that the callback is called once watchAvailability() resolves.</title> + <script src="../../resources/testharness.js"></script> + <script src="../../resources/testharnessreport.js"></script> + <script src="../media-file.js"></script> + </head> + <body> + <script> + async_test(function(t) + { + var v = document.createElement('video'); + v.src = findMediaFile('video', 'content/test'); + document.body.appendChild(v); + + var promiseResolved = false; + + function callback(available) { + assert_false(available); + assert_true(promiseResolved); + } + + v.remote.watchAvailability(t.step_func_done(callback)).then( + function() { promiseResolved = true; }, + t.unreached_func()); + }, 'Test that the callback is called once watchAvailability() resolves.'); + </script> + </body> +</html>
diff --git a/third_party/WebKit/LayoutTests/media/video-controls-overflow-menu-hide-on-resize.html b/third_party/WebKit/LayoutTests/media/video-controls-overflow-menu-hide-on-resize.html new file mode 100644 index 0000000..e3c6b13 --- /dev/null +++ b/third_party/WebKit/LayoutTests/media/video-controls-overflow-menu-hide-on-resize.html
@@ -0,0 +1,49 @@ +<!DOCTYPE html> +<title>Ensure overflow menu buttons are hidden when resizing.</title> +<style> + #content { + width: 1000px; + height: 1000px; + } +</style> +<script src="../resources/testharness.js"></script> +<script src="../resources/testharnessreport.js"></script> +<script src="media-controls.js"></script> +<script src="media-file.js"></script> +<script src="overflow-menu.js"></script> + +<!--Padding ensures the overflow menu is visible for the tests. --> +<body style="padding-top: 200px; padding-left: 100px"> +<video controls></video> +<script> +async_test(function(t) { + if (window.testRunner) + testRunner.useUnfortunateSynchronousResizeMode(); + + // Set up video + var video = document.querySelector("video"); + video.src = findMediaFile("video", "content/test"); + video.setAttribute("width", "60"); + // Add captions + var track = video.addTextTrack("captions"); + // Pretend we have a cast device + internals.mediaPlayerRemoteRouteAvailabilityChanged(video, true); + + video.onloadeddata = t.step_func(function() { + var overflowList = getOverflowList(video); + var overflowMenu = getOverflowMenuButton(video); + + // Clicking on the overflow menu button should make the overflow list visible + var coords = elementCoordinates(overflowMenu); + clickAtCoordinates(coords[0], coords[1]); + assert_not_equals(getComputedStyle(overflowList).display, "none"); + + // Resizing should hide the overflow list. + window.onresize = t.step_func_done(_ => { + assert_equals(getComputedStyle(overflowList).display, "none"); + }); + window.resizeTo(500, 500); + }); +}); +</script> +</body>
diff --git a/third_party/WebKit/LayoutTests/mhtml/content_transfer_encoding_none.mht b/third_party/WebKit/LayoutTests/mhtml/content_transfer_encoding_none.mht index fb83350b..8c4d3348 100644 --- a/third_party/WebKit/LayoutTests/mhtml/content_transfer_encoding_none.mht +++ b/third_party/WebKit/LayoutTests/mhtml/content_transfer_encoding_none.mht
@@ -1,36 +1,36 @@ -From: <Saved by UnMHT Ver.6.3.3 with manual conversion of first part into binary encoding> -Subject: MHTML Tests -Date: Wed, 14 Aug 2013 11:21:04 +0200 -MIME-Version: 1.0 -Content-Type: multipart/related; - boundary="----=_Part_ADD9911_9D32DCC.1376472064834"; - type="text/html" - -------=_Part_ADD9911_9D32DCC.1376472064834 -Content-Location: http://localhost/content_transfer_encoding_none.html -Content-Type: text/html; - charset="UTF-8" - -<!DOCTYPE html> -<html lang='en'> - <head> - <title>MHTML Content-Transfer-Encoding none test</title> - </head> - <body> - This is a red square:<br> - <img src="resources/red_square.png"> - </body> -</html> - -------=_Part_ADD9911_9D32DCC.1376472064834 -Content-Location: http://localhost/resources/red_square.png -Content-Transfer-Encoding: base64 -Content-Type: image/png - -iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAAAXNSR0IArs4c6QAAAARnQU1BAACx -jwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAACESURBVEhL7ZYxDoAwCEXB2LGTo46ewXj/zXgV -PQKgexP/Ai6l889/6Stp4HtZjYKOiRCpEpfSEIYgJqxNMFTkFUjVXiZhT6qGirwCqdrLJOxJ1VCR -V6A/1XxNc9jqQ6JkpjTU2rwQR+5c4769YCM5zn/BX4PY33Dljb0+JtiTqqEir8ADWEIY6dz7d1cA -AAAASUVORK5CYII= - -------=_Part_ADD9911_9D32DCC.1376472064834-- +From: <Saved by UnMHT Ver.6.3.3 with manual conversion of first part into binary encoding> +Subject: MHTML Tests +Date: Wed, 14 Aug 2013 11:21:04 +0200 +MIME-Version: 1.0 +Content-Type: multipart/related; + boundary="----=_Part_ADD9911_9D32DCC.1376472064834"; + type="text/html" + +------=_Part_ADD9911_9D32DCC.1376472064834 +Content-Location: http://localhost/content_transfer_encoding_none.html +Content-Type: text/html; + charset="UTF-8" + +<!DOCTYPE html> +<html lang='en'> + <head> + <title>MHTML Content-Transfer-Encoding none test</title> + </head> + <body> + This is a red square:<br> + <img src="resources/red_square.png"> + </body> +</html> + +------=_Part_ADD9911_9D32DCC.1376472064834 +Content-Location: http://localhost/resources/red_square.png +Content-Transfer-Encoding: base64 +Content-Type: image/png + +iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAAAXNSR0IArs4c6QAAAARnQU1BAACx +jwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAACESURBVEhL7ZYxDoAwCEXB2LGTo46ewXj/zXgV +PQKgexP/Ai6l889/6Stp4HtZjYKOiRCpEpfSEIYgJqxNMFTkFUjVXiZhT6qGirwCqdrLJOxJ1VCR +V6A/1XxNc9jqQ6JkpjTU2rwQR+5c4769YCM5zn/BX4PY33Dljb0+JtiTqqEir8ADWEIY6dz7d1cA +AAAASUVORK5CYII= + +------=_Part_ADD9911_9D32DCC.1376472064834--
diff --git a/third_party/WebKit/LayoutTests/mhtml/invalid-bad-boundary.mht b/third_party/WebKit/LayoutTests/mhtml/invalid-bad-boundary.mht index 292d6d1..af611fa 100644 --- a/third_party/WebKit/LayoutTests/mhtml/invalid-bad-boundary.mht +++ b/third_party/WebKit/LayoutTests/mhtml/invalid-bad-boundary.mht
@@ -1,18 +1,18 @@ -From: <Saved by WebKit> -Subject: Google -Date: Fri, 20 Jun 2013 14:36:21 -0700 -MIME-Version: 1.0 -Content-Type: multipart/related; - type="text/html"; - boundary="----=_NextPart_000_CA35_2BC72789.A73F63D7" - -BadBoundary------=_NextPart_000_CA35_2BC72789.A73F63D7 -Content-Type: text/html -Content-Transfer-Encoding: quoted-printable -Content-Location: http://localhost/invalid-bad-boundary.html - -<body> -<script> if (window.testRunner) { testRunner.dumpAsText() } </script> -This tests that we don't crash if the MHTML is invalid (bad boundary). -</body> -------=_NextPart_000_CA35_2BC72789.A73F63D7-- +From: <Saved by WebKit> +Subject: Google +Date: Fri, 20 Jun 2013 14:36:21 -0700 +MIME-Version: 1.0 +Content-Type: multipart/related; + type="text/html"; + boundary="----=_NextPart_000_CA35_2BC72789.A73F63D7" + +BadBoundary------=_NextPart_000_CA35_2BC72789.A73F63D7 +Content-Type: text/html +Content-Transfer-Encoding: quoted-printable +Content-Location: http://localhost/invalid-bad-boundary.html + +<body> +<script> if (window.testRunner) { testRunner.dumpAsText() } </script> +This tests that we don't crash if the MHTML is invalid (bad boundary). +</body> +------=_NextPart_000_CA35_2BC72789.A73F63D7--
diff --git a/third_party/WebKit/LayoutTests/mhtml/invalid-bad-boundary2.mht b/third_party/WebKit/LayoutTests/mhtml/invalid-bad-boundary2.mht index fd9d657f..dd3a2db6 100644 --- a/third_party/WebKit/LayoutTests/mhtml/invalid-bad-boundary2.mht +++ b/third_party/WebKit/LayoutTests/mhtml/invalid-bad-boundary2.mht
@@ -1,41 +1,41 @@ -From: <Saved by UnMHT Ver.6.3.3 with manual conversion of first part into binary encoding> -Subject: MHTML Tests -Date: Wed, 14 Aug 2013 11:21:04 +0200 -MIME-Version: 1.0 -Content-Type: multipart/related; - boundary="----=_Part_ADD9911_9D32DCC.1376472064834"; - type="text/html" - ------=_Part_ADD9911_9D32DCC.1376472064834 -Content-Location: http://localhost/content_transfer_encoding_none.html -Content-Type: text/html; - charset="UTF-8" - -<!DOCTYPE html> -<html lang='en'> - <head> - <title>MHTML Content-Transfer-Encoding none test</title> - <script> - if (window.testRunner) - testRunner.dumpAsText(); - </script> - </head> - <body> - This is a red square:<br> - <img src="resources/red_square.png" onerror="document.getElementById('error').innerHTML+='Failed to load image!'"> - <div id="error"></div> - </body> -</html> - -------=_Part_ADD9911_9D32DCC.1376472064834 -Content-Location: http://localhost/resources/red_square.png -Content-Transfer-Encoding: base64 -Content-Type: image/png - -iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAAAXNSR0IArs4c6QAAAARnQU1BAACx -jwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAACESURBVEhL7ZYxDoAwCEXB2LGTo46ewXj/zXgV -PQKgexP/Ai6l889/6Stp4HtZjYKOiRCpEpfSEIYgJqxNMFTkFUjVXiZhT6qGirwCqdrLJOxJ1VCR -V6A/1XxNc9jqQ6JkpjTU2rwQR+5c4769YCM5zn/BX4PY33Dljb0+JtiTqqEir8ADWEIY6dz7d1cA -AAAASUVORK5CYII= - -------=_Part_ADD9911_9D32DCC.1376472064834-- +From: <Saved by UnMHT Ver.6.3.3 with manual conversion of first part into binary encoding> +Subject: MHTML Tests +Date: Wed, 14 Aug 2013 11:21:04 +0200 +MIME-Version: 1.0 +Content-Type: multipart/related; + boundary="----=_Part_ADD9911_9D32DCC.1376472064834"; + type="text/html" + +-----=_Part_ADD9911_9D32DCC.1376472064834 +Content-Location: http://localhost/content_transfer_encoding_none.html +Content-Type: text/html; + charset="UTF-8" + +<!DOCTYPE html> +<html lang='en'> + <head> + <title>MHTML Content-Transfer-Encoding none test</title> + <script> + if (window.testRunner) + testRunner.dumpAsText(); + </script> + </head> + <body> + This is a red square:<br> + <img src="resources/red_square.png" onerror="document.getElementById('error').innerHTML+='Failed to load image!'"> + <div id="error"></div> + </body> +</html> + +------=_Part_ADD9911_9D32DCC.1376472064834 +Content-Location: http://localhost/resources/red_square.png +Content-Transfer-Encoding: base64 +Content-Type: image/png + +iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAAAXNSR0IArs4c6QAAAARnQU1BAACx +jwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAACESURBVEhL7ZYxDoAwCEXB2LGTo46ewXj/zXgV +PQKgexP/Ai6l889/6Stp4HtZjYKOiRCpEpfSEIYgJqxNMFTkFUjVXiZhT6qGirwCqdrLJOxJ1VCR +V6A/1XxNc9jqQ6JkpjTU2rwQR+5c4769YCM5zn/BX4PY33Dljb0+JtiTqqEir8ADWEIY6dz7d1cA +AAAASUVORK5CYII= + +------=_Part_ADD9911_9D32DCC.1376472064834--
diff --git a/third_party/WebKit/LayoutTests/mhtml/mhtml-with-capital-mimetype-loading.mht b/third_party/WebKit/LayoutTests/mhtml/mhtml-with-capital-mimetype-loading.mht index a5e344c..233c4dfe4 100644 --- a/third_party/WebKit/LayoutTests/mhtml/mhtml-with-capital-mimetype-loading.mht +++ b/third_party/WebKit/LayoutTests/mhtml/mhtml-with-capital-mimetype-loading.mht
@@ -1,22 +1,22 @@ -From: <Saved by WebKit> -Subject: -Date: Mon, 5 Apr 2015 18:24:52 -0000 -MIME-Version: 1.0 -Content-Type: MULTIPART/RELATED; - type="text/html"; - boundary="----=_NextPart_000_47B2_8E62210C.84C5CCF5" - -------=_NextPart_000_47B2_8E62210C.84C5CCF5 -Content-Type: text/html -Content-Transfer-Encoding: quoted-printable -Content-Location: http://localhost/mhtml-with-capital-mimetype-loading-expected.html - -<!DOCTYPE html><html><head><meta charset=3D"ISO-8859-1"> -</head> -<body> -<p> Archive page should be loaded irrespective of case sensitive mimetype</= -p> - - -</body></html> -------=_NextPart_000_47B2_8E62210C.84C5CCF5-- +From: <Saved by WebKit> +Subject: +Date: Mon, 5 Apr 2015 18:24:52 -0000 +MIME-Version: 1.0 +Content-Type: MULTIPART/RELATED; + type="text/html"; + boundary="----=_NextPart_000_47B2_8E62210C.84C5CCF5" + +------=_NextPart_000_47B2_8E62210C.84C5CCF5 +Content-Type: text/html +Content-Transfer-Encoding: quoted-printable +Content-Location: http://localhost/mhtml-with-capital-mimetype-loading-expected.html + +<!DOCTYPE html><html><head><meta charset=3D"ISO-8859-1"> +</head> +<body> +<p> Archive page should be loaded irrespective of case sensitive mimetype</= +p> + + +</body></html> +------=_NextPart_000_47B2_8E62210C.84C5CCF5--
diff --git a/third_party/WebKit/LayoutTests/mhtml/multi_frames_ie.mht b/third_party/WebKit/LayoutTests/mhtml/multi_frames_ie.mht index 04bc9ba..f6db80c 100644 --- a/third_party/WebKit/LayoutTests/mhtml/multi_frames_ie.mht +++ b/third_party/WebKit/LayoutTests/mhtml/multi_frames_ie.mht
@@ -1,103 +1,103 @@ -From: "Saved by Windows Internet Explorer 9" -Subject: A page that contains multiple nested frames -Date: Wed, 18 May 2011 16:50:17 -0700 -MIME-Version: 1.0 -Content-Type: multipart/related; - type="multipart/alternative"; - boundary="----=_NextPart_000_0020_01CC157B.AAC3EF70" -X-MimeOLE: Produced By Microsoft MimeOLE V6.1.7600.16776 - -This is a multi-part message in MIME format. - -------=_NextPart_000_0020_01CC157B.AAC3EF70 -Content-Type: image/png -Content-Transfer-Encoding: base64 -Content-Location: http://localhost/resources/red_square.png - -iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAAAXNSR0IArs4c6QAAAARnQU1BAACx -jwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAACESURBVEhL7ZYxDoAwCEXB2LGTo46ewXj/zXgV -PQKgexP/Ai6l889/6Stp4HtZjYKOiRCpEpfSEIYgJqxNMFTkFUjVXiZhT6qGirwCqdrLJOxJ1VCR -V6A/1XxNc9jqQ6JkpjTU2rwQR+5c4769YCM5zn/BX4PY33Dljb0+JtiTqqEir8ADWEIY6dz7d1cA -AAAASUVORK5CYII= - -------=_NextPart_000_0020_01CC157B.AAC3EF70 -Content-Type: multipart/alternative; - boundary="----=_NextPart_001_0023_01CC157B.AAC41680" - - -------=_NextPart_001_0023_01CC157B.AAC41680 -Content-Type: text/html; - charset="Windows-1252" -Content-Transfer-Encoding: quoted-printable -Content-Location: http://localhost/top_frame.html - -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> -<HTML><HEAD><TITLE>A page that contains multiple nested frames</TITLE> -<META content=3D"text/html; charset=3Dwindows-1252" = -http-equiv=3DContent-Type> - -<META name=3DGENERATOR content=3D"MSHTML 9.00.8112.16421"></HEAD> -<BODY>This page contains several frames.<BR><IFRAME=20 -src=3D"http://localhost/frame_0.html"></IFRAME><BR><IFRAME=20 -src=3D"http://localhost/frame_1.html"></IFRAME><BR><IFRAME=20 -src=3D"http://localhost/frame_2.html"></IFRAME><BR>And a red = -square:<BR><IMG=20 -src=3D"http://localhost/resources/red_square.png">=20 -</BODY></HTML> - -------=_NextPart_001_0023_01CC157B.AAC41680 -Content-Type: text/html; - charset="Windows-1252" -Content-Transfer-Encoding: 7bit -Content-Location: http://localhost/frame_0.html - -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> -<HTML><HEAD> -<META content="text/html; charset=windows-1252" http-equiv=Content-Type> -<META name=GENERATOR content="MSHTML 9.00.8112.16421"></HEAD> -<BODY>The first frame! </BODY></HTML> - -------=_NextPart_001_0023_01CC157B.AAC41680-- - -------=_NextPart_000_0020_01CC157B.AAC3EF70 -Content-Type: text/html; - charset="Windows-1252" -Content-Transfer-Encoding: 7bit -Content-Location: http://localhost/frame_1.html - -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> -<HTML><HEAD> -<META content="text/html; charset=windows-1252" http-equiv=Content-Type> -<META name=GENERATOR content="MSHTML 9.00.8112.16421"></HEAD> -<BODY>The second frame! </BODY></HTML> - -------=_NextPart_000_0020_01CC157B.AAC3EF70 -Content-Type: text/html; - charset="Windows-1252" -Content-Transfer-Encoding: quoted-printable -Content-Location: http://localhost/frame_4.html - -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> -<HTML><HEAD> -<META content=3D"text/html; charset=3Dwindows-1252" = -http-equiv=3DContent-Type> -<META name=3DGENERATOR content=3D"MSHTML 9.00.8112.16421"></HEAD> -<BODY>This is frame 4!<BR><IMG=20 - src=3D"http://localhost/resources/red_square.png">=20 -</BODY></HTML> - -------=_NextPart_000_0020_01CC157B.AAC3EF70 -Content-Type: text/html; - charset="Windows-1252" -Content-Transfer-Encoding: 7bit -Content-Location: http://localhost/frame_2.html - -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> -<HTML><HEAD> -<META content="text/html; charset=windows-1252" http-equiv=Content-Type> -<META name=GENERATOR content="MSHTML 9.00.8112.16421"></HEAD> -<BODY>The third frame!<BR>This one contains yet another frame. What a -twist!<BR><IFRAME -src="http://localhost/frame_4.html"></IFRAME></BODY></HTML> - -------=_NextPart_000_0020_01CC157B.AAC3EF70-- +From: "Saved by Windows Internet Explorer 9" +Subject: A page that contains multiple nested frames +Date: Wed, 18 May 2011 16:50:17 -0700 +MIME-Version: 1.0 +Content-Type: multipart/related; + type="multipart/alternative"; + boundary="----=_NextPart_000_0020_01CC157B.AAC3EF70" +X-MimeOLE: Produced By Microsoft MimeOLE V6.1.7600.16776 + +This is a multi-part message in MIME format. + +------=_NextPart_000_0020_01CC157B.AAC3EF70 +Content-Type: image/png +Content-Transfer-Encoding: base64 +Content-Location: http://localhost/resources/red_square.png + +iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAAAXNSR0IArs4c6QAAAARnQU1BAACx +jwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAACESURBVEhL7ZYxDoAwCEXB2LGTo46ewXj/zXgV +PQKgexP/Ai6l889/6Stp4HtZjYKOiRCpEpfSEIYgJqxNMFTkFUjVXiZhT6qGirwCqdrLJOxJ1VCR +V6A/1XxNc9jqQ6JkpjTU2rwQR+5c4769YCM5zn/BX4PY33Dljb0+JtiTqqEir8ADWEIY6dz7d1cA +AAAASUVORK5CYII= + +------=_NextPart_000_0020_01CC157B.AAC3EF70 +Content-Type: multipart/alternative; + boundary="----=_NextPart_001_0023_01CC157B.AAC41680" + + +------=_NextPart_001_0023_01CC157B.AAC41680 +Content-Type: text/html; + charset="Windows-1252" +Content-Transfer-Encoding: quoted-printable +Content-Location: http://localhost/top_frame.html + +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> +<HTML><HEAD><TITLE>A page that contains multiple nested frames</TITLE> +<META content=3D"text/html; charset=3Dwindows-1252" = +http-equiv=3DContent-Type> + +<META name=3DGENERATOR content=3D"MSHTML 9.00.8112.16421"></HEAD> +<BODY>This page contains several frames.<BR><IFRAME=20 +src=3D"http://localhost/frame_0.html"></IFRAME><BR><IFRAME=20 +src=3D"http://localhost/frame_1.html"></IFRAME><BR><IFRAME=20 +src=3D"http://localhost/frame_2.html"></IFRAME><BR>And a red = +square:<BR><IMG=20 +src=3D"http://localhost/resources/red_square.png">=20 +</BODY></HTML> + +------=_NextPart_001_0023_01CC157B.AAC41680 +Content-Type: text/html; + charset="Windows-1252" +Content-Transfer-Encoding: 7bit +Content-Location: http://localhost/frame_0.html + +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> +<HTML><HEAD> +<META content="text/html; charset=windows-1252" http-equiv=Content-Type> +<META name=GENERATOR content="MSHTML 9.00.8112.16421"></HEAD> +<BODY>The first frame! </BODY></HTML> + +------=_NextPart_001_0023_01CC157B.AAC41680-- + +------=_NextPart_000_0020_01CC157B.AAC3EF70 +Content-Type: text/html; + charset="Windows-1252" +Content-Transfer-Encoding: 7bit +Content-Location: http://localhost/frame_1.html + +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> +<HTML><HEAD> +<META content="text/html; charset=windows-1252" http-equiv=Content-Type> +<META name=GENERATOR content="MSHTML 9.00.8112.16421"></HEAD> +<BODY>The second frame! </BODY></HTML> + +------=_NextPart_000_0020_01CC157B.AAC3EF70 +Content-Type: text/html; + charset="Windows-1252" +Content-Transfer-Encoding: quoted-printable +Content-Location: http://localhost/frame_4.html + +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> +<HTML><HEAD> +<META content=3D"text/html; charset=3Dwindows-1252" = +http-equiv=3DContent-Type> +<META name=3DGENERATOR content=3D"MSHTML 9.00.8112.16421"></HEAD> +<BODY>This is frame 4!<BR><IMG=20 + src=3D"http://localhost/resources/red_square.png">=20 +</BODY></HTML> + +------=_NextPart_000_0020_01CC157B.AAC3EF70 +Content-Type: text/html; + charset="Windows-1252" +Content-Transfer-Encoding: 7bit +Content-Location: http://localhost/frame_2.html + +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> +<HTML><HEAD> +<META content="text/html; charset=windows-1252" http-equiv=Content-Type> +<META name=GENERATOR content="MSHTML 9.00.8112.16421"></HEAD> +<BODY>The third frame!<BR>This one contains yet another frame. What a +twist!<BR><IFRAME +src="http://localhost/frame_4.html"></IFRAME></BODY></HTML> + +------=_NextPart_000_0020_01CC157B.AAC3EF70--
diff --git a/third_party/WebKit/LayoutTests/mhtml/multi_frames_unmht.mht b/third_party/WebKit/LayoutTests/mhtml/multi_frames_unmht.mht index 1cbb5de0..a376398d 100644 --- a/third_party/WebKit/LayoutTests/mhtml/multi_frames_unmht.mht +++ b/third_party/WebKit/LayoutTests/mhtml/multi_frames_unmht.mht
@@ -1,86 +1,86 @@ -From: <Saved by UnMHT> -Subject: =?iso-2022-jp?B?QSBwYWdlIHRoYXQgY29udGFpbnMgbXVsdGlwbGUgbmVzdGVkIGZyYW1lcw==?= -Date: Wed, May 18 2011 15:20:34 GMT-0700 -MIME-Version: 1.0 -Content-Type: multipart/related; - boundary="----=_NextPart_000_0000_58874EE0.2096A571"; - type="text/html" - -------=_NextPart_000_0000_58874EE0.2096A571 -Content-Type: text/html; charset="ISO-8859-1" -Content-Transfer-Encoding: quoted-printable -Content-Location: http://localhost/top_frame.html - -<html><head><meta http-equiv=3D"Content-Type" content=3D"text/html; charset= -=3Diso-8859-1"> - - -<title>A page that contains multiple nested frames</title> -<base href=3D"http://localhost/"></base></head><body> -This page contains several frames.<br> -<iframe src=3D"http://localhost/frame_0.html"></iframe><br> -<iframe src=3D"http://localhost/frame_1.html"></iframe><br> -<iframe src=3D"http://localhost/frame_2.html"></iframe><br> -And a red square:<br> -<img src=3D"resources/red_square.png"> -</body></html> -------=_NextPart_000_0000_58874EE0.2096A571 -Content-Type: text/html; charset="ISO-8859-1" -Content-Transfer-Encoding: quoted-printable -Content-Location: http://localhost/frame_0.html - -<html><head><meta http-equiv=3D"Content-Type" content=3D"text/html; charset= -=3Diso-8859-1"> - -<base href=3D"http://localhost/"></base></head><body> -The first frame! -</body></html> -------=_NextPart_000_0000_58874EE0.2096A571 -Content-Type: text/html; charset="ISO-8859-1" -Content-Transfer-Encoding: quoted-printable -Content-Location: http://localhost/frame_1.html - -<html><head><meta http-equiv=3D"Content-Type" content=3D"text/html; charset= -=3Diso-8859-1"> - -<base href=3D"http://localhost/"></base></head><body> -The second frame! -</body></html> -------=_NextPart_000_0000_58874EE0.2096A571 -Content-Type: text/html; charset="ISO-8859-1" -Content-Transfer-Encoding: quoted-printable -Content-Location: http://localhost/frame_2.html - -<html><head><meta http-equiv=3D"Content-Type" content=3D"text/html; charset= -=3Diso-8859-1"> - -<base href=3D"http://localhost/"></base></head><body> -The third frame!<br> -This one contains yet another frame. What a twist!<br> -<iframe src=3D"http://localhost/frame_4.html"></iframe> - - -</body></html> -------=_NextPart_000_0000_58874EE0.2096A571 -Content-Type: text/html; charset="ISO-8859-1" -Content-Transfer-Encoding: quoted-printable -Content-Location: http://localhost/frame_4.html - -<html><head><meta http-equiv=3D"Content-Type" content=3D"text/html; charset= -=3Diso-8859-1"> - -<base href=3D"http://localhost/"></base></head><body> -This is frame 4!<br> -<img src=3D"resources/red_square.png"> -</body></html> -------=_NextPart_000_0000_58874EE0.2096A571 -Content-Type: image/png -Content-Transfer-Encoding: base64 -Content-Location: http://localhost/resources/red_square.png - -iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAAAXNSR0IArs4c6QAAAARnQU1BAACx -jwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAACESURBVEhL7ZYxDoAwCEXB2LGTo46ewXj/zXgV -PQKgexP/Ai6l889/6Stp4HtZjYKOiRCpEpfSEIYgJqxNMFTkFUjVXiZhT6qGirwCqdrLJOxJ1VCR -V6A/1XxNc9jqQ6JkpjTU2rwQR+5c4769YCM5zn/BX4PY33Dljb0+JtiTqqEir8ADWEIY6dz7d1cA -AAAASUVORK5CYII= -------=_NextPart_000_0000_58874EE0.2096A571-- +From: <Saved by UnMHT> +Subject: =?iso-2022-jp?B?QSBwYWdlIHRoYXQgY29udGFpbnMgbXVsdGlwbGUgbmVzdGVkIGZyYW1lcw==?= +Date: Wed, May 18 2011 15:20:34 GMT-0700 +MIME-Version: 1.0 +Content-Type: multipart/related; + boundary="----=_NextPart_000_0000_58874EE0.2096A571"; + type="text/html" + +------=_NextPart_000_0000_58874EE0.2096A571 +Content-Type: text/html; charset="ISO-8859-1" +Content-Transfer-Encoding: quoted-printable +Content-Location: http://localhost/top_frame.html + +<html><head><meta http-equiv=3D"Content-Type" content=3D"text/html; charset= +=3Diso-8859-1"> + + +<title>A page that contains multiple nested frames</title> +<base href=3D"http://localhost/"></base></head><body> +This page contains several frames.<br> +<iframe src=3D"http://localhost/frame_0.html"></iframe><br> +<iframe src=3D"http://localhost/frame_1.html"></iframe><br> +<iframe src=3D"http://localhost/frame_2.html"></iframe><br> +And a red square:<br> +<img src=3D"resources/red_square.png"> +</body></html> +------=_NextPart_000_0000_58874EE0.2096A571 +Content-Type: text/html; charset="ISO-8859-1" +Content-Transfer-Encoding: quoted-printable +Content-Location: http://localhost/frame_0.html + +<html><head><meta http-equiv=3D"Content-Type" content=3D"text/html; charset= +=3Diso-8859-1"> + +<base href=3D"http://localhost/"></base></head><body> +The first frame! +</body></html> +------=_NextPart_000_0000_58874EE0.2096A571 +Content-Type: text/html; charset="ISO-8859-1" +Content-Transfer-Encoding: quoted-printable +Content-Location: http://localhost/frame_1.html + +<html><head><meta http-equiv=3D"Content-Type" content=3D"text/html; charset= +=3Diso-8859-1"> + +<base href=3D"http://localhost/"></base></head><body> +The second frame! +</body></html> +------=_NextPart_000_0000_58874EE0.2096A571 +Content-Type: text/html; charset="ISO-8859-1" +Content-Transfer-Encoding: quoted-printable +Content-Location: http://localhost/frame_2.html + +<html><head><meta http-equiv=3D"Content-Type" content=3D"text/html; charset= +=3Diso-8859-1"> + +<base href=3D"http://localhost/"></base></head><body> +The third frame!<br> +This one contains yet another frame. What a twist!<br> +<iframe src=3D"http://localhost/frame_4.html"></iframe> + + +</body></html> +------=_NextPart_000_0000_58874EE0.2096A571 +Content-Type: text/html; charset="ISO-8859-1" +Content-Transfer-Encoding: quoted-printable +Content-Location: http://localhost/frame_4.html + +<html><head><meta http-equiv=3D"Content-Type" content=3D"text/html; charset= +=3Diso-8859-1"> + +<base href=3D"http://localhost/"></base></head><body> +This is frame 4!<br> +<img src=3D"resources/red_square.png"> +</body></html> +------=_NextPart_000_0000_58874EE0.2096A571 +Content-Type: image/png +Content-Transfer-Encoding: base64 +Content-Location: http://localhost/resources/red_square.png + +iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAAAXNSR0IArs4c6QAAAARnQU1BAACx +jwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAACESURBVEhL7ZYxDoAwCEXB2LGTo46ewXj/zXgV +PQKgexP/Ai6l889/6Stp4HtZjYKOiRCpEpfSEIYgJqxNMFTkFUjVXiZhT6qGirwCqdrLJOxJ1VCR +V6A/1XxNc9jqQ6JkpjTU2rwQR+5c4769YCM5zn/BX4PY33Dljb0+JtiTqqEir8ADWEIY6dz7d1cA +AAAASUVORK5CYII= +------=_NextPart_000_0000_58874EE0.2096A571--
diff --git a/third_party/WebKit/LayoutTests/mhtml/page_with_css_and_js_ie.mht b/third_party/WebKit/LayoutTests/mhtml/page_with_css_and_js_ie.mht index ffd4e99..e92c741 100644 --- a/third_party/WebKit/LayoutTests/mhtml/page_with_css_and_js_ie.mht +++ b/third_party/WebKit/LayoutTests/mhtml/page_with_css_and_js_ie.mht
@@ -1,75 +1,75 @@ -From: "Saved by Windows Internet Explorer 9" -Subject: -Date: Wed, 18 May 2011 16:49:23 -0700 -MIME-Version: 1.0 -Content-Type: multipart/related; - type="text/html"; - boundary="----=_NextPart_000_0012_01CC157B.8AA06570" -X-MimeOLE: Produced By Microsoft MimeOLE V6.1.7600.16776 - -This is a multi-part message in MIME format. - -------=_NextPart_000_0012_01CC157B.8AA06570 -Content-Type: text/html; - charset="Windows-1252" -Content-Transfer-Encoding: quoted-printable -Content-Location: http://localhost/page_with_css_and_js.html - -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> -<HTML><HEAD> -<META content=3D"text/html; charset=3Dwindows-1252" = -http-equiv=3DContent-Type><LINK=20 -rel=3Dstylesheet type=3Dtext/css = -href=3D"http://localhost/resources/hide_image.css"> -<SCRIPT type=3Dtext/javascript=20 -src=3D"http://localhost/resources/remove_image_script.js"></SCRIPT> - -<META name=3DGENERATOR content=3D"MSHTML 9.00.8112.16421"></HEAD> -<BODY onload=3DonLoad()>This page tests that CSS and JavaScript = -resources are=20 -retrieved correctly for MHTML files.<BR><BR>There should be only 2 red = -squares=20 -below:=20 -<DIV id=3DfirstDiv><IMG=20 -src=3D"http://localhost/resources/red_square.png"><BR><BR></DIV> -<DIV id=3DsecondDiv>The red square below should be hidden by way of = -CSS.<BR><IMG=20 -src=3D"http://localhost/resources/red_square.png"><BR><BR></DIV> -<DIV id=3DthirdDiv>The red square below should be hidden by way of=20 -JavaScript (with JS disabled in MHTML, it still should show).<BR><IMG=20 -src=3D"http://localhost/resources/red_square.png"><BR><BR></DIV></BODY><= -/HTML> - -------=_NextPart_000_0012_01CC157B.8AA06570 -Content-Type: image/png -Content-Transfer-Encoding: base64 -Content-Location: http://localhost/resources/red_square.png - -iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAAAXNSR0IArs4c6QAAAARnQU1BAACx -jwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAACESURBVEhL7ZYxDoAwCEXB2LGTo46ewXj/zXgV -PQKgexP/Ai6l889/6Stp4HtZjYKOiRCpEpfSEIYgJqxNMFTkFUjVXiZhT6qGirwCqdrLJOxJ1VCR -V6A/1XxNc9jqQ6JkpjTU2rwQR+5c4769YCM5zn/BX4PY33Dljb0+JtiTqqEir8ADWEIY6dz7d1cA -AAAASUVORK5CYII= - -------=_NextPart_000_0012_01CC157B.8AA06570 -Content-Type: text/css; - charset="iso-8859-1" -Content-Transfer-Encoding: 7bit -Content-Location: http://localhost/resources/hide_image.css - -#secondDiv { - DISPLAY: none -} - -------=_NextPart_000_0012_01CC157B.8AA06570 -Content-Type: application/octet-stream -Content-Transfer-Encoding: quoted-printable -Content-Location: http://localhost/resources/remove_image_script.js - -function onLoad() {=0A= - divToRemove =3D document.getElementById("thirdDiv");=0A= - divToRemove.parentNode.removeChild(divToRemove);=0A= - if (window.testRunner)=0A= - testRunner.notifyDone();=0A= -} -------=_NextPart_000_0012_01CC157B.8AA06570-- +From: "Saved by Windows Internet Explorer 9" +Subject: +Date: Wed, 18 May 2011 16:49:23 -0700 +MIME-Version: 1.0 +Content-Type: multipart/related; + type="text/html"; + boundary="----=_NextPart_000_0012_01CC157B.8AA06570" +X-MimeOLE: Produced By Microsoft MimeOLE V6.1.7600.16776 + +This is a multi-part message in MIME format. + +------=_NextPart_000_0012_01CC157B.8AA06570 +Content-Type: text/html; + charset="Windows-1252" +Content-Transfer-Encoding: quoted-printable +Content-Location: http://localhost/page_with_css_and_js.html + +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> +<HTML><HEAD> +<META content=3D"text/html; charset=3Dwindows-1252" = +http-equiv=3DContent-Type><LINK=20 +rel=3Dstylesheet type=3Dtext/css = +href=3D"http://localhost/resources/hide_image.css"> +<SCRIPT type=3Dtext/javascript=20 +src=3D"http://localhost/resources/remove_image_script.js"></SCRIPT> + +<META name=3DGENERATOR content=3D"MSHTML 9.00.8112.16421"></HEAD> +<BODY onload=3DonLoad()>This page tests that CSS and JavaScript = +resources are=20 +retrieved correctly for MHTML files.<BR><BR>There should be only 2 red = +squares=20 +below:=20 +<DIV id=3DfirstDiv><IMG=20 +src=3D"http://localhost/resources/red_square.png"><BR><BR></DIV> +<DIV id=3DsecondDiv>The red square below should be hidden by way of = +CSS.<BR><IMG=20 +src=3D"http://localhost/resources/red_square.png"><BR><BR></DIV> +<DIV id=3DthirdDiv>The red square below should be hidden by way of=20 +JavaScript (with JS disabled in MHTML, it still should show).<BR><IMG=20 +src=3D"http://localhost/resources/red_square.png"><BR><BR></DIV></BODY><= +/HTML> + +------=_NextPart_000_0012_01CC157B.8AA06570 +Content-Type: image/png +Content-Transfer-Encoding: base64 +Content-Location: http://localhost/resources/red_square.png + +iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAAAXNSR0IArs4c6QAAAARnQU1BAACx +jwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAACESURBVEhL7ZYxDoAwCEXB2LGTo46ewXj/zXgV +PQKgexP/Ai6l889/6Stp4HtZjYKOiRCpEpfSEIYgJqxNMFTkFUjVXiZhT6qGirwCqdrLJOxJ1VCR +V6A/1XxNc9jqQ6JkpjTU2rwQR+5c4769YCM5zn/BX4PY33Dljb0+JtiTqqEir8ADWEIY6dz7d1cA +AAAASUVORK5CYII= + +------=_NextPart_000_0012_01CC157B.8AA06570 +Content-Type: text/css; + charset="iso-8859-1" +Content-Transfer-Encoding: 7bit +Content-Location: http://localhost/resources/hide_image.css + +#secondDiv { + DISPLAY: none +} + +------=_NextPart_000_0012_01CC157B.8AA06570 +Content-Type: application/octet-stream +Content-Transfer-Encoding: quoted-printable +Content-Location: http://localhost/resources/remove_image_script.js + +function onLoad() {=0A= + divToRemove =3D document.getElementById("thirdDiv");=0A= + divToRemove.parentNode.removeChild(divToRemove);=0A= + if (window.testRunner)=0A= + testRunner.notifyDone();=0A= +} +------=_NextPart_000_0012_01CC157B.8AA06570--
diff --git a/third_party/WebKit/LayoutTests/mhtml/page_with_css_and_js_unmht.mht b/third_party/WebKit/LayoutTests/mhtml/page_with_css_and_js_unmht.mht index 2bc27235..a67f98e 100644 --- a/third_party/WebKit/LayoutTests/mhtml/page_with_css_and_js_unmht.mht +++ b/third_party/WebKit/LayoutTests/mhtml/page_with_css_and_js_unmht.mht
@@ -1,70 +1,70 @@ -From: <Saved by UnMHT> -Subject: =?iso-2022-jp?B??= -Date: Wed, May 18 2011 15:21:05 GMT-0700 -MIME-Version: 1.0 -Content-Type: multipart/related; - boundary="----=_NextPart_000_0000_C2ECC76E.5EC79255"; - type="text/html" - -------=_NextPart_000_0000_C2ECC76E.5EC79255 -Content-Type: text/html; charset="ISO-8859-1" -Content-Transfer-Encoding: quoted-printable -Content-Location: http://localhost/page_with_css_and_js.html - -<html><head><meta http-equiv=3D"Content-Type" content=3D"text/html; charset= -=3Diso-8859-1"> - - - <link type=3D"text/css" rel=3D"stylesheet" href=3D"resources/hide_image.c= -ss"></link> - =20 - <script src=3D"resources/remove_image_script.js" type=3D"text/javascript"= -></script> -<base href=3D"http://localhost/"></base></head><body onload=3D"onLoad()"> -This page tests that CSS and JavaScript resources are retrieved correctly= - for MHTML files.<br><br> -There should be only 2 red squares below: -<div id=3D"firstDiv"> -<img src=3D"resources/red_square.png"><br><br> -</div> -<div id=3D"secondDiv"> -The red square below should be hidden by way of CSS.<br> -<img src=3D"resources/red_square.png"><br><br> -</div> -<div id=3D"thirdDiv"> -The red square below should be hidden by way of JavaScript (with JS disab= -led in MHTML, it still should show).<br> -<img src=3D"resources/red_square.png"><br><br> -</div> - - =20 -</body></html> -------=_NextPart_000_0000_C2ECC76E.5EC79255 -Content-Type: text/css -Content-Transfer-Encoding: quoted-printable -Content-Location: http://localhost/resources/hide_image.css - -#secondDiv { display: none; } - -------=_NextPart_000_0000_C2ECC76E.5EC79255 -Content-Type: text/javascript -Content-Transfer-Encoding: quoted-printable -Content-Location: http://localhost/resources/remove_image_script.js - -function onLoad() { - divToRemove =3D document.getElementById("thirdDiv"); - divToRemove.parentNode.removeChild(divToRemove); - if (window.testRunner) - testRunner.notifyDone(); -} -------=_NextPart_000_0000_C2ECC76E.5EC79255 -Content-Type: image/png -Content-Transfer-Encoding: base64 -Content-Location: http://localhost/resources/red_square.png - -iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAAAXNSR0IArs4c6QAAAARnQU1BAACx -jwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAACESURBVEhL7ZYxDoAwCEXB2LGTo46ewXj/zXgV -PQKgexP/Ai6l889/6Stp4HtZjYKOiRCpEpfSEIYgJqxNMFTkFUjVXiZhT6qGirwCqdrLJOxJ1VCR -V6A/1XxNc9jqQ6JkpjTU2rwQR+5c4769YCM5zn/BX4PY33Dljb0+JtiTqqEir8ADWEIY6dz7d1cA -AAAASUVORK5CYII= -------=_NextPart_000_0000_C2ECC76E.5EC79255-- +From: <Saved by UnMHT> +Subject: =?iso-2022-jp?B??= +Date: Wed, May 18 2011 15:21:05 GMT-0700 +MIME-Version: 1.0 +Content-Type: multipart/related; + boundary="----=_NextPart_000_0000_C2ECC76E.5EC79255"; + type="text/html" + +------=_NextPart_000_0000_C2ECC76E.5EC79255 +Content-Type: text/html; charset="ISO-8859-1" +Content-Transfer-Encoding: quoted-printable +Content-Location: http://localhost/page_with_css_and_js.html + +<html><head><meta http-equiv=3D"Content-Type" content=3D"text/html; charset= +=3Diso-8859-1"> + + + <link type=3D"text/css" rel=3D"stylesheet" href=3D"resources/hide_image.c= +ss"></link> + =20 + <script src=3D"resources/remove_image_script.js" type=3D"text/javascript"= +></script> +<base href=3D"http://localhost/"></base></head><body onload=3D"onLoad()"> +This page tests that CSS and JavaScript resources are retrieved correctly= + for MHTML files.<br><br> +There should be only 2 red squares below: +<div id=3D"firstDiv"> +<img src=3D"resources/red_square.png"><br><br> +</div> +<div id=3D"secondDiv"> +The red square below should be hidden by way of CSS.<br> +<img src=3D"resources/red_square.png"><br><br> +</div> +<div id=3D"thirdDiv"> +The red square below should be hidden by way of JavaScript (with JS disab= +led in MHTML, it still should show).<br> +<img src=3D"resources/red_square.png"><br><br> +</div> + + =20 +</body></html> +------=_NextPart_000_0000_C2ECC76E.5EC79255 +Content-Type: text/css +Content-Transfer-Encoding: quoted-printable +Content-Location: http://localhost/resources/hide_image.css + +#secondDiv { display: none; } + +------=_NextPart_000_0000_C2ECC76E.5EC79255 +Content-Type: text/javascript +Content-Transfer-Encoding: quoted-printable +Content-Location: http://localhost/resources/remove_image_script.js + +function onLoad() { + divToRemove =3D document.getElementById("thirdDiv"); + divToRemove.parentNode.removeChild(divToRemove); + if (window.testRunner) + testRunner.notifyDone(); +} +------=_NextPart_000_0000_C2ECC76E.5EC79255 +Content-Type: image/png +Content-Transfer-Encoding: base64 +Content-Location: http://localhost/resources/red_square.png + +iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAAAXNSR0IArs4c6QAAAARnQU1BAACx +jwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAACESURBVEhL7ZYxDoAwCEXB2LGTo46ewXj/zXgV +PQKgexP/Ai6l889/6Stp4HtZjYKOiRCpEpfSEIYgJqxNMFTkFUjVXiZhT6qGirwCqdrLJOxJ1VCR +V6A/1XxNc9jqQ6JkpjTU2rwQR+5c4769YCM5zn/BX4PY33Dljb0+JtiTqqEir8ADWEIY6dz7d1cA +AAAASUVORK5CYII= +------=_NextPart_000_0000_C2ECC76E.5EC79255--
diff --git a/third_party/WebKit/LayoutTests/mhtml/page_with_image_ie.mht b/third_party/WebKit/LayoutTests/mhtml/page_with_image_ie.mht index 812e55b..306297b1 100644 --- a/third_party/WebKit/LayoutTests/mhtml/page_with_image_ie.mht +++ b/third_party/WebKit/LayoutTests/mhtml/page_with_image_ie.mht
@@ -1,39 +1,39 @@ -From: "Saved by Windows Internet Explorer 9" -Subject: Page with square -Date: Wed, 18 May 2011 16:49:44 -0700 -MIME-Version: 1.0 -Content-Type: multipart/related; - type="text/html"; - boundary="----=_NextPart_000_001B_01CC157B.96F808A0" -X-MimeOLE: Produced By Microsoft MimeOLE V6.1.7600.16776 - -This is a multi-part message in MIME format. - -------=_NextPart_000_001B_01CC157B.96F808A0 -Content-Type: text/html; - charset="Windows-1252" -Content-Transfer-Encoding: quoted-printable -Content-Location: http://localhost/page_with_image.html - -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> -<HTML><HEAD><TITLE>Page with square</TITLE> -<META content=3D"text/html; charset=3Dwindows-1252" = -http-equiv=3DContent-Type> - -<META name=3DGENERATOR content=3D"MSHTML 9.00.8112.16421"></HEAD> -<BODY>This is a red square:<BR><IMG=20 -src=3D"http://localhost/resources/red_square.png">=20 -</BODY></HTML> - -------=_NextPart_000_001B_01CC157B.96F808A0 -Content-Type: image/png -Content-Transfer-Encoding: base64 -Content-Location: http://localhost/resources/red_square.png - -iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAAAXNSR0IArs4c6QAAAARnQU1BAACx -jwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAACESURBVEhL7ZYxDoAwCEXB2LGTo46ewXj/zXgV -PQKgexP/Ai6l889/6Stp4HtZjYKOiRCpEpfSEIYgJqxNMFTkFUjVXiZhT6qGirwCqdrLJOxJ1VCR -V6A/1XxNc9jqQ6JkpjTU2rwQR+5c4769YCM5zn/BX4PY33Dljb0+JtiTqqEir8ADWEIY6dz7d1cA -AAAASUVORK5CYII= - -------=_NextPart_000_001B_01CC157B.96F808A0-- +From: "Saved by Windows Internet Explorer 9" +Subject: Page with square +Date: Wed, 18 May 2011 16:49:44 -0700 +MIME-Version: 1.0 +Content-Type: multipart/related; + type="text/html"; + boundary="----=_NextPart_000_001B_01CC157B.96F808A0" +X-MimeOLE: Produced By Microsoft MimeOLE V6.1.7600.16776 + +This is a multi-part message in MIME format. + +------=_NextPart_000_001B_01CC157B.96F808A0 +Content-Type: text/html; + charset="Windows-1252" +Content-Transfer-Encoding: quoted-printable +Content-Location: http://localhost/page_with_image.html + +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> +<HTML><HEAD><TITLE>Page with square</TITLE> +<META content=3D"text/html; charset=3Dwindows-1252" = +http-equiv=3DContent-Type> + +<META name=3DGENERATOR content=3D"MSHTML 9.00.8112.16421"></HEAD> +<BODY>This is a red square:<BR><IMG=20 +src=3D"http://localhost/resources/red_square.png">=20 +</BODY></HTML> + +------=_NextPart_000_001B_01CC157B.96F808A0 +Content-Type: image/png +Content-Transfer-Encoding: base64 +Content-Location: http://localhost/resources/red_square.png + +iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAAAXNSR0IArs4c6QAAAARnQU1BAACx +jwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAACESURBVEhL7ZYxDoAwCEXB2LGTo46ewXj/zXgV +PQKgexP/Ai6l889/6Stp4HtZjYKOiRCpEpfSEIYgJqxNMFTkFUjVXiZhT6qGirwCqdrLJOxJ1VCR +V6A/1XxNc9jqQ6JkpjTU2rwQR+5c4769YCM5zn/BX4PY33Dljb0+JtiTqqEir8ADWEIY6dz7d1cA +AAAASUVORK5CYII= + +------=_NextPart_000_001B_01CC157B.96F808A0--
diff --git a/third_party/WebKit/LayoutTests/mhtml/page_with_image_unmht.mht b/third_party/WebKit/LayoutTests/mhtml/page_with_image_unmht.mht index d7e8ad5..ed29dfb8 100644 --- a/third_party/WebKit/LayoutTests/mhtml/page_with_image_unmht.mht +++ b/third_party/WebKit/LayoutTests/mhtml/page_with_image_unmht.mht
@@ -1,33 +1,33 @@ -From: <Saved by UnMHT> -Subject: =?iso-2022-jp?B?UGFnZSB3aXRoIHNxdWFyZQ==?= -Date: Wed, May 18 2011 16:38:33 GMT-0700 -MIME-Version: 1.0 -Content-Type: multipart/related; - boundary="----=_NextPart_000_0000_02C8A5EE.D896CA6B"; - type="text/html" - -------=_NextPart_000_0000_02C8A5EE.D896CA6B -Content-Type: text/html; charset="ISO-8859-1" -Content-Transfer-Encoding: quoted-printable -Content-Location: http://localhost/page_with_image.html - -<html><head><meta http-equiv=3D"Content-Type" content=3D"text/html; charset= -=3Diso-8859-1"> - - -<title>Page with square</title> -<base href=3D"http://localhost/"></base></head><body> -This is a red square:<br> -<img src=3D"resources/red_square.png"> -</body></html> -------=_NextPart_000_0000_02C8A5EE.D896CA6B -Content-Type: image/png -Content-Transfer-Encoding: base64 -Content-Location: http://localhost/resources/red_square.png - -iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAAAXNSR0IArs4c6QAAAARnQU1BAACx -jwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAACESURBVEhL7ZYxDoAwCEXB2LGTo46ewXj/zXgV -PQKgexP/Ai6l889/6Stp4HtZjYKOiRCpEpfSEIYgJqxNMFTkFUjVXiZhT6qGirwCqdrLJOxJ1VCR -V6A/1XxNc9jqQ6JkpjTU2rwQR+5c4769YCM5zn/BX4PY33Dljb0+JtiTqqEir8ADWEIY6dz7d1cA -AAAASUVORK5CYII= -------=_NextPart_000_0000_02C8A5EE.D896CA6B-- +From: <Saved by UnMHT> +Subject: =?iso-2022-jp?B?UGFnZSB3aXRoIHNxdWFyZQ==?= +Date: Wed, May 18 2011 16:38:33 GMT-0700 +MIME-Version: 1.0 +Content-Type: multipart/related; + boundary="----=_NextPart_000_0000_02C8A5EE.D896CA6B"; + type="text/html" + +------=_NextPart_000_0000_02C8A5EE.D896CA6B +Content-Type: text/html; charset="ISO-8859-1" +Content-Transfer-Encoding: quoted-printable +Content-Location: http://localhost/page_with_image.html + +<html><head><meta http-equiv=3D"Content-Type" content=3D"text/html; charset= +=3Diso-8859-1"> + + +<title>Page with square</title> +<base href=3D"http://localhost/"></base></head><body> +This is a red square:<br> +<img src=3D"resources/red_square.png"> +</body></html> +------=_NextPart_000_0000_02C8A5EE.D896CA6B +Content-Type: image/png +Content-Transfer-Encoding: base64 +Content-Location: http://localhost/resources/red_square.png + +iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAAAXNSR0IArs4c6QAAAARnQU1BAACx +jwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAACESURBVEhL7ZYxDoAwCEXB2LGTo46ewXj/zXgV +PQKgexP/Ai6l889/6Stp4HtZjYKOiRCpEpfSEIYgJqxNMFTkFUjVXiZhT6qGirwCqdrLJOxJ1VCR +V6A/1XxNc9jqQ6JkpjTU2rwQR+5c4769YCM5zn/BX4PY33Dljb0+JtiTqqEir8ADWEIY6dz7d1cA +AAAASUVORK5CYII= +------=_NextPart_000_0000_02C8A5EE.D896CA6B--
diff --git a/third_party/WebKit/LayoutTests/mhtml/page_with_javascript.mht b/third_party/WebKit/LayoutTests/mhtml/page_with_javascript.mht index c9aebcb6..403f59b 100644 --- a/third_party/WebKit/LayoutTests/mhtml/page_with_javascript.mht +++ b/third_party/WebKit/LayoutTests/mhtml/page_with_javascript.mht
@@ -1,29 +1,29 @@ -From: <Saved by UnMHT> -Subject: =?iso-2022-jp?B?QSBzaW1wbGUgcGFnZQ==?= -Date: Wed, May 11 2011 15:36:36 GMT-0700 -MIME-Version: 1.0 -Content-Type: multipart/related; - boundary="----=_NextPart_000_0000_87206557.D2C008B0"; - type="text/html" - -------=_NextPart_000_0000_87206557.D2C008B0 -Content-Type: text/html; charset="ISO-8859-1" -Content-Transfer-Encoding: quoted-printable -Content-Location: http://localhost/page_with_javascript.html - -<html><head><meta http-equiv=3D"Content-Type" content=3D"text/html; charset= -=3Diso-8859-1"> - - -<title>A page with JavaScript</title> -<h1>This page has content generated by JavaScript</h1> -Javascript is not run, so that dynamic content should not show. -<div id=3D"myDiv"></div> - -<script> - document.getElementById('myDiv').innerHTML =3D - "JavaScript is in the house!"; -</script> - -</body></html> -------=_NextPart_000_0000_87206557.D2C008B0-- +From: <Saved by UnMHT> +Subject: =?iso-2022-jp?B?QSBzaW1wbGUgcGFnZQ==?= +Date: Wed, May 11 2011 15:36:36 GMT-0700 +MIME-Version: 1.0 +Content-Type: multipart/related; + boundary="----=_NextPart_000_0000_87206557.D2C008B0"; + type="text/html" + +------=_NextPart_000_0000_87206557.D2C008B0 +Content-Type: text/html; charset="ISO-8859-1" +Content-Transfer-Encoding: quoted-printable +Content-Location: http://localhost/page_with_javascript.html + +<html><head><meta http-equiv=3D"Content-Type" content=3D"text/html; charset= +=3Diso-8859-1"> + + +<title>A page with JavaScript</title> +<h1>This page has content generated by JavaScript</h1> +Javascript is not run, so that dynamic content should not show. +<div id=3D"myDiv"></div> + +<script> + document.getElementById('myDiv').innerHTML =3D + "JavaScript is in the house!"; +</script> + +</body></html> +------=_NextPart_000_0000_87206557.D2C008B0--
diff --git a/third_party/WebKit/LayoutTests/mhtml/relative_url.mht b/third_party/WebKit/LayoutTests/mhtml/relative_url.mht index c4a3f9a..3eac22c 100644 --- a/third_party/WebKit/LayoutTests/mhtml/relative_url.mht +++ b/third_party/WebKit/LayoutTests/mhtml/relative_url.mht
@@ -1,42 +1,42 @@ -From: "Saved by Windows Internet Explorer 9" -Subject: Page with square -Date: Wed, 18 May 2011 16:49:44 -0700 -MIME-Version: 1.0 -Content-Type: multipart/related; - type="text/html"; - boundary="----=_NextPart_000_001B_01CC157B.96F808A0" -X-MimeOLE: Produced By Microsoft MimeOLE V6.1.7600.16776 - -This is a multi-part message in MIME format. - -------=_NextPart_000_001B_01CC157B.96F808A0 -Content-Type: text/html; - charset="Windows-1252" -Content-Transfer-Encoding: quoted-printable -Content-Location: http://localhost/page_with_image.html - -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> -<HTML><HEAD><TITLE>Page with square</TITLE> -<META content=3D"text/html; charset=3Dwindows-1252" = -http-equiv=3DContent-Type> - -<META name=3DGENERATOR content=3D"MSHTML 9.00.8112.16421"></HEAD> -<BODY> -Image with an absolute URL:<BR><IMG=20 -src=3D"http://localhost/resources/red_square.png"/>=20 -<br>Image with a relative URL:<BR><IMG=20 -src=3D"resources/red_square.png"/>=20 -</BODY></HTML> - -------=_NextPart_000_001B_01CC157B.96F808A0 -Content-Type: image/png -Content-Transfer-Encoding: base64 -Content-Location: http://localhost/resources/red_square.png - -iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAAAXNSR0IArs4c6QAAAARnQU1BAACx -jwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAACESURBVEhL7ZYxDoAwCEXB2LGTo46ewXj/zXgV -PQKgexP/Ai6l889/6Stp4HtZjYKOiRCpEpfSEIYgJqxNMFTkFUjVXiZhT6qGirwCqdrLJOxJ1VCR -V6A/1XxNc9jqQ6JkpjTU2rwQR+5c4769YCM5zn/BX4PY33Dljb0+JtiTqqEir8ADWEIY6dz7d1cA -AAAASUVORK5CYII= - -------=_NextPart_000_001B_01CC157B.96F808A0-- +From: "Saved by Windows Internet Explorer 9" +Subject: Page with square +Date: Wed, 18 May 2011 16:49:44 -0700 +MIME-Version: 1.0 +Content-Type: multipart/related; + type="text/html"; + boundary="----=_NextPart_000_001B_01CC157B.96F808A0" +X-MimeOLE: Produced By Microsoft MimeOLE V6.1.7600.16776 + +This is a multi-part message in MIME format. + +------=_NextPart_000_001B_01CC157B.96F808A0 +Content-Type: text/html; + charset="Windows-1252" +Content-Transfer-Encoding: quoted-printable +Content-Location: http://localhost/page_with_image.html + +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> +<HTML><HEAD><TITLE>Page with square</TITLE> +<META content=3D"text/html; charset=3Dwindows-1252" = +http-equiv=3DContent-Type> + +<META name=3DGENERATOR content=3D"MSHTML 9.00.8112.16421"></HEAD> +<BODY> +Image with an absolute URL:<BR><IMG=20 +src=3D"http://localhost/resources/red_square.png"/>=20 +<br>Image with a relative URL:<BR><IMG=20 +src=3D"resources/red_square.png"/>=20 +</BODY></HTML> + +------=_NextPart_000_001B_01CC157B.96F808A0 +Content-Type: image/png +Content-Transfer-Encoding: base64 +Content-Location: http://localhost/resources/red_square.png + +iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAAAXNSR0IArs4c6QAAAARnQU1BAACx +jwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAACESURBVEhL7ZYxDoAwCEXB2LGTo46ewXj/zXgV +PQKgexP/Ai6l889/6Stp4HtZjYKOiRCpEpfSEIYgJqxNMFTkFUjVXiZhT6qGirwCqdrLJOxJ1VCR +V6A/1XxNc9jqQ6JkpjTU2rwQR+5c4769YCM5zn/BX4PY33Dljb0+JtiTqqEir8ADWEIY6dz7d1cA +AAAASUVORK5CYII= + +------=_NextPart_000_001B_01CC157B.96F808A0--
diff --git a/third_party/WebKit/LayoutTests/mhtml/relaxed-content-type-parameters.mht b/third_party/WebKit/LayoutTests/mhtml/relaxed-content-type-parameters.mht index 5946d197..063b9fb 100644 --- a/third_party/WebKit/LayoutTests/mhtml/relaxed-content-type-parameters.mht +++ b/third_party/WebKit/LayoutTests/mhtml/relaxed-content-type-parameters.mht
@@ -1,24 +1,24 @@ -Content-Type: multipart/related; start=<op.mhtml.1234567891234.1234567890abcdef@1111:ffff:2222:ee:3333:dddd:4444:cccc>; boundary=----------LHWAs1iPsCI2GBNY69BX16 -Content-Location: file://localhost/relaxed-content-type-parameters.mhtml_original -Subject: =?utf-8?Q?MHTML=20Tests?= -MIME-Version: 1.0 - -------------LHWAs1iPsCI2GBNY69BX16 -Content-Disposition: inline; filename=relaxed-content-type-parameters.mhtml_original -Content-Type: text/html; name=relaxed-content-type-parameters.mhtml_original -Content-ID: <op.mhtml.1234567891234.1234567890abcdef@1111:ffff:2222:ee:3333:dddd:4444:cccc> -Content-Location: file://localhost/relaxed-content-type-parameters.mhtml_original -Content-Transfer-Encoding: 7bit - -<!DOCTYPE html> -<html lang='en'> - <head> - <meta charset='utf-8'> - <title>MHTML Tests</title> - </head> - <body> - <h1>MHTML Relaxed Content-Type parameters test</h1> - </body> -</html> - -------------LHWAs1iPsCI2GBNY69BX16-- +Content-Type: multipart/related; start=<op.mhtml.1234567891234.1234567890abcdef@1111:ffff:2222:ee:3333:dddd:4444:cccc>; boundary=----------LHWAs1iPsCI2GBNY69BX16 +Content-Location: file://localhost/relaxed-content-type-parameters.mhtml_original +Subject: =?utf-8?Q?MHTML=20Tests?= +MIME-Version: 1.0 + +------------LHWAs1iPsCI2GBNY69BX16 +Content-Disposition: inline; filename=relaxed-content-type-parameters.mhtml_original +Content-Type: text/html; name=relaxed-content-type-parameters.mhtml_original +Content-ID: <op.mhtml.1234567891234.1234567890abcdef@1111:ffff:2222:ee:3333:dddd:4444:cccc> +Content-Location: file://localhost/relaxed-content-type-parameters.mhtml_original +Content-Transfer-Encoding: 7bit + +<!DOCTYPE html> +<html lang='en'> + <head> + <meta charset='utf-8'> + <title>MHTML Tests</title> + </head> + <body> + <h1>MHTML Relaxed Content-Type parameters test</h1> + </body> +</html> + +------------LHWAs1iPsCI2GBNY69BX16--
diff --git a/third_party/WebKit/LayoutTests/mhtml/shared_buffer_bug.mht b/third_party/WebKit/LayoutTests/mhtml/shared_buffer_bug.mht index ad0300ed..2fcc1c1 100644 --- a/third_party/WebKit/LayoutTests/mhtml/shared_buffer_bug.mht +++ b/third_party/WebKit/LayoutTests/mhtml/shared_buffer_bug.mht
@@ -1,171 +1,171 @@ -From: <Saved by WebKit> -Subject: -Date: Sat, 12 Oct 2012 10:15:17 -0700 -MIME-Version: 1.0 -Content-Type: multipart/related; - type="text/html"; - boundary="----=_NextPart_000_7387_D22A981E.ADD1887E" - -------=_NextPart_000_7387_D22A981E.ADD1887E -Content-Type: text/html -Content-Transfer-Encoding: quoted-printable -Content-Location: http://localhost/sharred_buffer_bug.html - -<html><head><meta charset=3D"ISO-8859-1"> -<link rel=3D"stylesheet" type=3D"text/css" href=3D"http://localhost/resourc= -es/style.css"> - -</head> - -<body> - This is a test for a bug in SharedBuffer. - <h1>This text should not be shown</h1> - - - -</body></html> -------=_NextPart_000_7387_D22A981E.ADD1887E -Content-Type: text/css -Content-Transfer-Encoding: quoted-printable -Content-Location: http://localhost/resources/style.css - -/* -The point is to reach a size of n * 4096 bytes (with n > 1) -followed by a blank line to trigger a bug in SharredBuffer. - -Let's go: -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -012345678901234567890123456789012345678901234567890123456789 -*/ - - -h1 { visibility: hidden; } - -------=_NextPart_000_7387_D22A981E.ADD1887E-- +From: <Saved by WebKit> +Subject: +Date: Sat, 12 Oct 2012 10:15:17 -0700 +MIME-Version: 1.0 +Content-Type: multipart/related; + type="text/html"; + boundary="----=_NextPart_000_7387_D22A981E.ADD1887E" + +------=_NextPart_000_7387_D22A981E.ADD1887E +Content-Type: text/html +Content-Transfer-Encoding: quoted-printable +Content-Location: http://localhost/sharred_buffer_bug.html + +<html><head><meta charset=3D"ISO-8859-1"> +<link rel=3D"stylesheet" type=3D"text/css" href=3D"http://localhost/resourc= +es/style.css"> + +</head> + +<body> + This is a test for a bug in SharedBuffer. + <h1>This text should not be shown</h1> + + + +</body></html> +------=_NextPart_000_7387_D22A981E.ADD1887E +Content-Type: text/css +Content-Transfer-Encoding: quoted-printable +Content-Location: http://localhost/resources/style.css + +/* +The point is to reach a size of n * 4096 bytes (with n > 1) +followed by a blank line to trigger a bug in SharredBuffer. + +Let's go: +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +012345678901234567890123456789012345678901234567890123456789 +*/ + + +h1 { visibility: hidden; } + +------=_NextPart_000_7387_D22A981E.ADD1887E--
diff --git a/third_party/WebKit/LayoutTests/mhtml/simple_page_ie.mht b/third_party/WebKit/LayoutTests/mhtml/simple_page_ie.mht index cf0d82f..f0afef3 100644 --- a/third_party/WebKit/LayoutTests/mhtml/simple_page_ie.mht +++ b/third_party/WebKit/LayoutTests/mhtml/simple_page_ie.mht
@@ -1,19 +1,19 @@ -From: "Saved by Windows Internet Explorer 9" -Subject: A simple page -Date: Wed, 18 May 2011 16:50:01 -0700 -MIME-Version: 1.0 -Content-Type: text/html; - charset="Windows-1252" -Content-Transfer-Encoding: quoted-printable -Content-Location: http://localhost/simple_page.html -X-MimeOLE: Produced By Microsoft MimeOLE V6.1.7600.16776 - -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> -<HTML><HEAD><TITLE>A simple page</TITLE> -<META content=3D"text/html; charset=3Dwindows-1252" = -http-equiv=3DContent-Type> - -<META name=3DGENERATOR content=3D"MSHTML 9.00.8112.16421"></HEAD> -<BODY> -<H1>This is a very simple page</H1>Very <B>basic</B> page. = -</BODY></HTML> +From: "Saved by Windows Internet Explorer 9" +Subject: A simple page +Date: Wed, 18 May 2011 16:50:01 -0700 +MIME-Version: 1.0 +Content-Type: text/html; + charset="Windows-1252" +Content-Transfer-Encoding: quoted-printable +Content-Location: http://localhost/simple_page.html +X-MimeOLE: Produced By Microsoft MimeOLE V6.1.7600.16776 + +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> +<HTML><HEAD><TITLE>A simple page</TITLE> +<META content=3D"text/html; charset=3Dwindows-1252" = +http-equiv=3DContent-Type> + +<META name=3DGENERATOR content=3D"MSHTML 9.00.8112.16421"></HEAD> +<BODY> +<H1>This is a very simple page</H1>Very <B>basic</B> page. = +</BODY></HTML>
diff --git a/third_party/WebKit/LayoutTests/mhtml/simple_page_unmht.mht b/third_party/WebKit/LayoutTests/mhtml/simple_page_unmht.mht index 93524ce..f93adf6 100644 --- a/third_party/WebKit/LayoutTests/mhtml/simple_page_unmht.mht +++ b/third_party/WebKit/LayoutTests/mhtml/simple_page_unmht.mht
@@ -1,23 +1,23 @@ -From: <Saved by UnMHT> -Subject: =?iso-2022-jp?B?QSBzaW1wbGUgcGFnZQ==?= -Date: Wed, May 11 2011 15:36:36 GMT-0700 -MIME-Version: 1.0 -Content-Type: multipart/related; - boundary="----=_NextPart_000_0000_87206557.D2C008B0"; - type="text/html" - -------=_NextPart_000_0000_87206557.D2C008B0 -Content-Type: text/html; charset="ISO-8859-1" -Content-Transfer-Encoding: quoted-printable -Content-Location: http://localhost/simple_page.html - -<html><head><meta http-equiv=3D"Content-Type" content=3D"text/html; charset= -=3Diso-8859-1"> - - -<title>A simple page</title> -<base href=3D"http://localhost/"></base></head><body> -<h1>This is a very simple page</h1> -Very <b>basic</b> page. -</body></html> -------=_NextPart_000_0000_87206557.D2C008B0-- +From: <Saved by UnMHT> +Subject: =?iso-2022-jp?B?QSBzaW1wbGUgcGFnZQ==?= +Date: Wed, May 11 2011 15:36:36 GMT-0700 +MIME-Version: 1.0 +Content-Type: multipart/related; + boundary="----=_NextPart_000_0000_87206557.D2C008B0"; + type="text/html" + +------=_NextPart_000_0000_87206557.D2C008B0 +Content-Type: text/html; charset="ISO-8859-1" +Content-Transfer-Encoding: quoted-printable +Content-Location: http://localhost/simple_page.html + +<html><head><meta http-equiv=3D"Content-Type" content=3D"text/html; charset= +=3Diso-8859-1"> + + +<title>A simple page</title> +<base href=3D"http://localhost/"></base></head><body> +<h1>This is a very simple page</h1> +Very <b>basic</b> page. +</body></html> +------=_NextPart_000_0000_87206557.D2C008B0--
diff --git a/third_party/WebKit/LayoutTests/mhtml/transfer_encoding_7bit.mht b/third_party/WebKit/LayoutTests/mhtml/transfer_encoding_7bit.mht index 099064c96..20326d4e 100644 --- a/third_party/WebKit/LayoutTests/mhtml/transfer_encoding_7bit.mht +++ b/third_party/WebKit/LayoutTests/mhtml/transfer_encoding_7bit.mht
@@ -1,22 +1,22 @@ -Content-Type: multipart/related; boundary="===============6683215525243774815==" -MIME-Version: 1.0 -Content-Location: transfer_encoding_7bit.html_original - ---===============6683215525243774815== -Content-Type: text/html -MIME-Version: 1.0 -Content-Location: transfer_encoding_7bit.html_original -Content-Transfer-Encoding: 7bit - -<!DOCTYPE html> -<html lang='en'> - <head> - <meta charset='utf-8'> - <title>MHTML Tests</title> - </head> - <body> - <h1>MHTML Content-Transfer-Encoding 7-bit test - ;)</h1> - </body> -</html> - ---===============6683215525243774815==-- +Content-Type: multipart/related; boundary="===============6683215525243774815==" +MIME-Version: 1.0 +Content-Location: transfer_encoding_7bit.html_original + +--===============6683215525243774815== +Content-Type: text/html +MIME-Version: 1.0 +Content-Location: transfer_encoding_7bit.html_original +Content-Transfer-Encoding: 7bit + +<!DOCTYPE html> +<html lang='en'> + <head> + <meta charset='utf-8'> + <title>MHTML Tests</title> + </head> + <body> + <h1>MHTML Content-Transfer-Encoding 7-bit test - ;)</h1> + </body> +</html> + +--===============6683215525243774815==--
diff --git a/third_party/WebKit/LayoutTests/mhtml/transfer_encoding_8bit.mht b/third_party/WebKit/LayoutTests/mhtml/transfer_encoding_8bit.mht index d2815274..9166d0f4 100644 --- a/third_party/WebKit/LayoutTests/mhtml/transfer_encoding_8bit.mht +++ b/third_party/WebKit/LayoutTests/mhtml/transfer_encoding_8bit.mht
@@ -1,26 +1,26 @@ -Content-Type: multipart/related; boundary="===============0861565773462052241==" -MIME-Version: 1.0 -Content-Location: transfer_encoding_8bit.html_original - ---===============0861565773462052241== -Content-Type: text/html -MIME-Version: 1.0 -Content-Location: transfer_encoding_8bit.html_original -Content-Transfer-Encoding: 8bit - -<!DOCTYPE html> -<html lang='en'> - <head> - <meta charset='utf-8'> - <title>MHTML Tests</title> - <script> - if (window.testRunner) - testRunner.dumpAsText(); - </script> - </head> - <body> - <h1>MHTML Content-Transfer-Encoding 8-bit test - 😉</h1> - </body> -</html> - ---===============0861565773462052241==-- +Content-Type: multipart/related; boundary="===============0861565773462052241==" +MIME-Version: 1.0 +Content-Location: transfer_encoding_8bit.html_original + +--===============0861565773462052241== +Content-Type: text/html +MIME-Version: 1.0 +Content-Location: transfer_encoding_8bit.html_original +Content-Transfer-Encoding: 8bit + +<!DOCTYPE html> +<html lang='en'> + <head> + <meta charset='utf-8'> + <title>MHTML Tests</title> + <script> + if (window.testRunner) + testRunner.dumpAsText(); + </script> + </head> + <body> + <h1>MHTML Content-Transfer-Encoding 8-bit test - 😉</h1> + </body> +</html> + +--===============0861565773462052241==--
diff --git a/third_party/WebKit/LayoutTests/platform/linux/inspector-protocol/layout-fonts/generic-system-ui-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/inspector-protocol/layout-fonts/generic-system-ui-expected.txt new file mode 100644 index 0000000..7b35296d0 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/linux/inspector-protocol/layout-fonts/generic-system-ui-expected.txt
@@ -0,0 +1,9 @@ +This text should use the system font. +#system-ui: +"Times New Roman" : 37 + +This text should use the system font. +#system-ui-20pt: +"Times New Roman" : 37 + +
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.10/inspector-protocol/layout-fonts/generic-system-ui-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.10/inspector-protocol/layout-fonts/generic-system-ui-expected.txt new file mode 100644 index 0000000..71c83da --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.10/inspector-protocol/layout-fonts/generic-system-ui-expected.txt
@@ -0,0 +1,9 @@ +This text should use the system font. +#system-ui: +".Helvetica Neue DeskInterface" : 37 + +This text should use the system font. +#system-ui-20pt: +".Helvetica Neue DeskInterface" : 37 + +
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.9/inspector-protocol/layout-fonts/generic-system-ui-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/inspector-protocol/layout-fonts/generic-system-ui-expected.txt new file mode 100644 index 0000000..81f0cc8 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/inspector-protocol/layout-fonts/generic-system-ui-expected.txt
@@ -0,0 +1,9 @@ +This text should use the system font. +#system-ui: +"Lucida Grande" : 37 + +This text should use the system font. +#system-ui-20pt: +"Lucida Grande" : 37 + +
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.9/paint/invalidation/invalidate-caret-in-composited-scrolling-container-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/paint/invalidation/invalidate-caret-in-composited-scrolling-container-expected.txt index cb61bd2..922a2fe9 100644 --- a/third_party/WebKit/LayoutTests/platform/mac-mac10.9/paint/invalidation/invalidate-caret-in-composited-scrolling-container-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/paint/invalidation/invalidate-caret-in-composited-scrolling-container-expected.txt
@@ -39,7 +39,7 @@ }, { "name": "Scrolling Contents Layer", - "bounds": [67, 13], + "bounds": [68, 13], "drawsContent": true, "paintInvalidations": [ {
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.9/paint/invalidation/selection/selection-in-composited-scrolling-container-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/paint/invalidation/selection/selection-in-composited-scrolling-container-expected.txt index 0782d8c..6e14194 100644 --- a/third_party/WebKit/LayoutTests/platform/mac-mac10.9/paint/invalidation/selection/selection-in-composited-scrolling-container-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/paint/invalidation/selection/selection-in-composited-scrolling-container-expected.txt
@@ -27,7 +27,7 @@ }, { "name": "Scrolling Contents Layer", - "bounds": [67, 13], + "bounds": [68, 13], "drawsContent": true, "paintInvalidations": [ {
diff --git a/third_party/WebKit/LayoutTests/platform/mac/inspector-protocol/layout-fonts/generic-system-ui-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/inspector-protocol/layout-fonts/generic-system-ui-expected.txt new file mode 100644 index 0000000..f392c35 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/mac/inspector-protocol/layout-fonts/generic-system-ui-expected.txt
@@ -0,0 +1,9 @@ +This text should use the system font. +#system-ui: +".SF NS Text" : 37 + +This text should use the system font. +#system-ui-20pt: +".SF NS Display" : 37 + +
diff --git a/third_party/WebKit/LayoutTests/platform/mac/paint/invalidation/invalidate-caret-in-composited-scrolling-container-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/paint/invalidation/invalidate-caret-in-composited-scrolling-container-expected.txt index 69453bf..fe87cd4 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/paint/invalidation/invalidate-caret-in-composited-scrolling-container-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/mac/paint/invalidation/invalidate-caret-in-composited-scrolling-container-expected.txt
@@ -39,7 +39,7 @@ }, { "name": "Scrolling Contents Layer", - "bounds": [66, 13], + "bounds": [67, 13], "drawsContent": true, "paintInvalidations": [ {
diff --git a/third_party/WebKit/LayoutTests/platform/mac/paint/invalidation/selection/selection-in-composited-scrolling-container-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/paint/invalidation/selection/selection-in-composited-scrolling-container-expected.txt index c2761d2..9914b8b 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/paint/invalidation/selection/selection-in-composited-scrolling-container-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/mac/paint/invalidation/selection/selection-in-composited-scrolling-container-expected.txt
@@ -27,7 +27,7 @@ }, { "name": "Scrolling Contents Layer", - "bounds": [66, 13], + "bounds": [67, 13], "drawsContent": true, "paintInvalidations": [ {
diff --git a/third_party/WebKit/LayoutTests/platform/win/fast/overflow/overflow-rtl-expected.png b/third_party/WebKit/LayoutTests/platform/win/fast/overflow/overflow-rtl-expected.png index 5b3f766c..ac05f48 100644 --- a/third_party/WebKit/LayoutTests/platform/win/fast/overflow/overflow-rtl-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/fast/overflow/overflow-rtl-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/fast/overflow/overflow-rtl-vertical-expected.png b/third_party/WebKit/LayoutTests/platform/win/fast/overflow/overflow-rtl-vertical-expected.png index 83fe486..8228e42 100644 --- a/third_party/WebKit/LayoutTests/platform/win/fast/overflow/overflow-rtl-vertical-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/fast/overflow/overflow-rtl-vertical-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/inspector-protocol/layout-fonts/generic-system-ui-expected.txt b/third_party/WebKit/LayoutTests/platform/win/inspector-protocol/layout-fonts/generic-system-ui-expected.txt new file mode 100644 index 0000000..cf8adec --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/win/inspector-protocol/layout-fonts/generic-system-ui-expected.txt
@@ -0,0 +1,9 @@ +This text should use the system font. +#system-ui: +"Segoe UI" : 37 + +This text should use the system font. +#system-ui-20pt: +"Segoe UI" : 37 + +
diff --git a/third_party/WebKit/LayoutTests/storage/indexeddb/idbcursor-advance-exception-order.html b/third_party/WebKit/LayoutTests/storage/indexeddb/idbcursor-advance-exception-order.html new file mode 100644 index 0000000..0daeb742 --- /dev/null +++ b/third_party/WebKit/LayoutTests/storage/indexeddb/idbcursor-advance-exception-order.html
@@ -0,0 +1,91 @@ +<!DOCTYPE html> +<title>IndexedDB: IDBCursor advance() Exception Ordering</title> +<meta charset=utf-8> +<link rel="help" href="https://w3c.github.io/IndexedDB/#dom-idbcursor-advance"> +<script src="../../resources/testharness.js"></script> +<script src="../../resources/testharnessreport.js"></script> +<script src="resources/testharness-helpers.js"></script> +<script> + +indexeddb_test( + (t, db) => { + const store = db.createObjectStore('s'); + store.put('value', 'key'); + }, + (t, db) => { + const tx = db.transaction('s'); + const store = tx.objectStore('s'); + + const r = store.openKeyCursor(); + r.onsuccess = t.step_func(() => { + r.onsuccess = null; + + const cursor = r.result; + + setTimeout(t.step_func(() => { + assert_throws(new TypeError, () => { cursor.advance(0); }, + '"zero" check (TypeError) should precede ' + + '"not active" check (TransactionInactiveError)'); + t.done(); + }), 0); + }); + }, + 'IDBCursor.advance exception order: TypeError vs. TransactionInactiveError' +); + +indexeddb_test( + (t, db) => { + const store = db.createObjectStore('s'); + + const s = db.createObjectStore('s2'); + s.put('value', 'key'); + + const r = s.openKeyCursor(); + r.onsuccess = t.step_func(() => { + r.onsuccess = null; + + const cursor = r.result; + db.deleteObjectStore('s2'); + + setTimeout(t.step_func(() => { + assert_throws('TransactionInactiveError', () => { cursor.advance(1); }, + '"not active" check (TransactionInactiveError) ' + + 'should precede "deleted" check (InvalidStateError)'); + t.done(); + }), 0); + }); + }, + (t, db) => {}, + 'IDBCursor.advance exception order: ' + + 'TransactionInactiveError vs. InvalidStateError #1' +); + +indexeddb_test( + (t, db) => { + const store = db.createObjectStore('s'); + store.put('value', 'key'); + }, + (t, db) => { + const tx = db.transaction('s'); + const store = tx.objectStore('s'); + + const r = store.openKeyCursor(); + r.onsuccess = t.step_func(() => { + r.onsuccess = null; + + const cursor = r.result; + cursor.advance(1); + + setTimeout(t.step_func(() => { + assert_throws('TransactionInactiveError', () => { cursor.advance(1); }, + '"not active" check (TransactionInactiveError) ' + + 'should precede "got value" check (InvalidStateError)'); + t.done(); + }), 0); + }); + }, + 'IDBCursor.advance exception order: ' + + 'TransactionInactiveError vs. InvalidStateError #2' +); + +</script>
diff --git a/third_party/WebKit/LayoutTests/storage/indexeddb/idbcursor-continue-exception-order.html b/third_party/WebKit/LayoutTests/storage/indexeddb/idbcursor-continue-exception-order.html index 02317e5..726addaa 100644 --- a/third_party/WebKit/LayoutTests/storage/indexeddb/idbcursor-continue-exception-order.html +++ b/third_party/WebKit/LayoutTests/storage/indexeddb/idbcursor-continue-exception-order.html
@@ -1,81 +1,81 @@ <!DOCTYPE html> <title>IndexedDB: IDBCursor continue() Exception Ordering</title> +<meta charset=utf-8> <link rel="help" href="https://w3c.github.io/IndexedDB/#dom-idbcursor-continue"> <script src="../../resources/testharness.js"></script> <script src="../../resources/testharnessreport.js"></script> <script src="resources/testharness-helpers.js"></script> - <script> indexeddb_test( - function(t, db) { - var s = db.createObjectStore('s'); - s.put('value', 'key'); - }, - function(t, db) { - var s = db.transaction('s', 'readonly').objectStore('s'); - var r = s.openKeyCursor(); - r.onsuccess = t.step_func(function() { - r.onsuccess = null; - var cursor = r.result; - setTimeout(t.step_func(function() { - assert_throws('TransactionInactiveError', function() { - cursor.continue({not: "a valid key"}); - }, '"Transaction inactive" check (TransactionInactiveError) ' + - 'should precede "invalid key" check (DataError)'); - t.done(); - }), 0); - }); - }, - 'IDBCursor.continue exception order: TransactionInactiveError vs. DataError' + (t, db) => { + const s = db.createObjectStore('s'); + s.put('value', 'key'); + }, + (t, db) => { + const s = db.transaction('s', 'readonly').objectStore('s'); + const r = s.openKeyCursor(); + r.onsuccess = t.step_func(() => { + r.onsuccess = null; + const cursor = r.result; + setTimeout(t.step_func(() => { + assert_throws('TransactionInactiveError', () => { + cursor.continue({not: "a valid key"}); + }, '"Transaction inactive" check (TransactionInactiveError) ' + + 'should precede "invalid key" check (DataError)'); + t.done(); + }), 0); + }); + }, + 'IDBCursor.continue exception order: TransactionInactiveError vs. DataError' ); indexeddb_test( - function(t, db) { - var s = db.createObjectStore('s'); - s.put('value', 'key'); - }, - function(t, db) { - var s = db.transaction('s', 'readonly').objectStore('s'); - var r = s.openKeyCursor(); - r.onsuccess = t.step_func(function() { - r.onsuccess = null; - var cursor = r.result; + (t, db) => { + const s = db.createObjectStore('s'); + s.put('value', 'key'); + }, + (t, db) => { + const s = db.transaction('s', 'readonly').objectStore('s'); + const r = s.openKeyCursor(); + r.onsuccess = t.step_func(() => { + r.onsuccess = null; + const cursor = r.result; + cursor.continue(); + r.onsuccess = t.step_func(() => { + setTimeout(t.step_func(() => { + assert_throws('TransactionInactiveError', () => { cursor.continue(); - r.onsuccess = t.step_func(function() { - setTimeout(t.step_func(function() { - assert_throws('TransactionInactiveError', function() { - cursor.continue(); - }, '"Transaction inactive" check (TransactionInactiveError) ' + - 'should precede "got value flag" check (InvalidStateError)'); - t.done(); - }), 0); - }); - }); - }, - 'IDBCursor.continue exception order: TransactionInactiveError vs. InvalidStateError' + }, '"Transaction inactive" check (TransactionInactiveError) ' + + 'should precede "got value flag" check (InvalidStateError)'); + t.done(); + }), 0); + }); + }); + }, + 'IDBCursor.continue exception order: TransactionInactiveError vs. InvalidStateError' ); indexeddb_test( - function(t, db) { - var s = db.createObjectStore('s'); - s.put('value', 'key'); - }, - function(t, db) { - var s = db.transaction('s', 'readonly').objectStore('s'); - var r = s.openKeyCursor(); - r.onsuccess = t.step_func(function() { - r.onsuccess = null; - var cursor = r.result; - cursor.continue(); - assert_throws('InvalidStateError', function() { - cursor.continue({not: "a valid key"}); - }, '"got value flag" check (InvalidStateError) should precede ' + - '"invalid key" check (DataError)'); - t.done(); - }); - }, - 'IDBCursor.continue exception order: InvalidStateError vs. DataError' + (t, db) => { + const s = db.createObjectStore('s'); + s.put('value', 'key'); + }, + (t, db) => { + const s = db.transaction('s', 'readonly').objectStore('s'); + const r = s.openKeyCursor(); + r.onsuccess = t.step_func(() => { + r.onsuccess = null; + const cursor = r.result; + cursor.continue(); + assert_throws('InvalidStateError', () => { + cursor.continue({not: "a valid key"}); + }, '"got value flag" check (InvalidStateError) should precede ' + + '"invalid key" check (DataError)'); + t.done(); + }); + }, + 'IDBCursor.continue exception order: InvalidStateError vs. DataError' ); </script>
diff --git a/third_party/WebKit/LayoutTests/storage/indexeddb/idbcursor-delete-exception-order.html b/third_party/WebKit/LayoutTests/storage/indexeddb/idbcursor-delete-exception-order.html index fc04645..b2d0d5bd 100644 --- a/third_party/WebKit/LayoutTests/storage/indexeddb/idbcursor-delete-exception-order.html +++ b/third_party/WebKit/LayoutTests/storage/indexeddb/idbcursor-delete-exception-order.html
@@ -1,77 +1,76 @@ <!DOCTYPE html> <title>IndexedDB: IDBCursor delete() Exception Ordering</title> +<meta charset=utf-8> <link rel="help" href="https://w3c.github.io/IndexedDB/#dom-idbcursor-delete"> <script src="../../resources/testharness.js"></script> <script src="../../resources/testharnessreport.js"></script> <script src="resources/testharness-helpers.js"></script> - <script> indexeddb_test( - function(t, db) { - var s = db.createObjectStore('s'); - s.put('value', 'key'); - }, - function(t, db) { - var s = db.transaction('s', 'readonly').objectStore('s'); - var r = s.openCursor(); - r.onsuccess = t.step_func(function() { - r.onsuccess = null; - var cursor = r.result; - setTimeout(t.step_func(function() { - assert_throws('TransactionInactiveError', function() { - cursor.delete(); - }, '"Transaction inactive" check (TransactionInactivError) ' + - 'should precede "read only" check (ReadOnlyError)'); - t.done(); - }), 0); - }); - }, - 'IDBCursor.delete exception order: TransactionInactiveError vs. ReadOnlyError' + (t, db) => { + const s = db.createObjectStore('s'); + s.put('value', 'key'); + }, + (t, db) => { + const s = db.transaction('s', 'readonly').objectStore('s'); + const r = s.openCursor(); + r.onsuccess = t.step_func(() => { + r.onsuccess = null; + const cursor = r.result; + setTimeout(t.step_func(() => { + assert_throws('TransactionInactiveError', () => { + cursor.delete(); + }, '"Transaction inactive" check (TransactionInactivError) ' + + 'should precede "read only" check (ReadOnlyError)'); + t.done(); + }), 0); + }); + }, + 'IDBCursor.delete exception order: TransactionInactiveError vs. ReadOnlyError' ); indexeddb_test( - function(t, db) { - var s = db.createObjectStore('s'); - s.put('value', 'key'); - }, - function(t, db) { - var s = db.transaction('s', 'readonly').objectStore('s'); - var r = s.openCursor(); - r.onsuccess = t.step_func(function() { - r.onsuccess = null; - var cursor = r.result; - cursor.continue(); - assert_throws('ReadOnlyError', function() { - cursor.delete(); - }, '"Read only" check (ReadOnlyError) should precede ' + - '"got value flag" (InvalidStateError) check'); - t.done(); - }); - }, - 'IDBCursor.delete exception order: ReadOnlyError vs. InvalidStateError #1' + (t, db) => { + const s = db.createObjectStore('s'); + s.put('value', 'key'); + }, + (t, db) => { + const s = db.transaction('s', 'readonly').objectStore('s'); + const r = s.openCursor(); + r.onsuccess = t.step_func(() => { + r.onsuccess = null; + const cursor = r.result; + cursor.continue(); + assert_throws('ReadOnlyError', () => { + cursor.delete(); + }, '"Read only" check (ReadOnlyError) should precede ' + + '"got value flag" (InvalidStateError) check'); + t.done(); + }); + }, + 'IDBCursor.delete exception order: ReadOnlyError vs. InvalidStateError #1' ); indexeddb_test( - function(t, db) { - var s = db.createObjectStore('s'); - s.put('value', 'key'); - }, - function(t, db) { - var s = db.transaction('s', 'readonly').objectStore('s'); - var r = s.openKeyCursor(); - r.onsuccess = t.step_func(function() { - r.onsuccess = null; - var cursor = r.result; - cursor.continue(); - assert_throws('ReadOnlyError', function() { - cursor.delete(); - }, '"Read only" check (ReadOnlyError) should precede ' + - '"key only flag" (InvalidStateError) check'); - t.done(); - }); - }, - 'IDBCursor.delete exception order: ReadOnlyError vs. InvalidStateError #2' + (t, db) => { + const s = db.createObjectStore('s'); + s.put('value', 'key'); + }, + (t, db) => { + const s = db.transaction('s', 'readonly').objectStore('s'); + const r = s.openKeyCursor(); + r.onsuccess = t.step_func(() => { + r.onsuccess = null; + const cursor = r.result; + assert_throws('ReadOnlyError', () => { + cursor.delete(); + }, '"Read only" check (ReadOnlyError) should precede ' + + '"key only flag" (InvalidStateError) check'); + t.done(); + }); + }, + 'IDBCursor.delete exception order: ReadOnlyError vs. InvalidStateError #2' ); </script>
diff --git a/third_party/WebKit/LayoutTests/storage/indexeddb/idbcursor-update-exception-order.html b/third_party/WebKit/LayoutTests/storage/indexeddb/idbcursor-update-exception-order.html index e0cdf807..cceee010 100644 --- a/third_party/WebKit/LayoutTests/storage/indexeddb/idbcursor-update-exception-order.html +++ b/third_party/WebKit/LayoutTests/storage/indexeddb/idbcursor-update-exception-order.html
@@ -1,99 +1,98 @@ <!DOCTYPE html> <title>IndexedDB: IDBCursor update() Exception Ordering</title> +<meta charset=utf-8> <link rel="help" href="https://w3c.github.io/IndexedDB/#dom-idbcursor-update"> <script src="../../resources/testharness.js"></script> <script src="../../resources/testharnessreport.js"></script> <script src="resources/testharness-helpers.js"></script> - <script> indexeddb_test( - function(t, db) { - var s = db.createObjectStore('s'); - s.put('value', 'key'); - }, - function(t, db) { - var s = db.transaction('s', 'readonly').objectStore('s'); - var r = s.openCursor(); - r.onsuccess = t.step_func(function() { - r.onsuccess = null; - var cursor = r.result; - setTimeout(t.step_func(function() { - assert_throws('TransactionInactiveError', function() { - cursor.update('value2'); - }, '"Transaction inactive" check (TransactionInactiveError) ' + - 'should precede "read only" check (ReadOnlyError)'); - t.done(); - }), 0); - }); - }, - 'IDBCursor.update exception order: TransactionInactiveError vs. ReadOnlyError' + (t, db) => { + const s = db.createObjectStore('s'); + s.put('value', 'key'); + }, + (t, db) => { + const s = db.transaction('s', 'readonly').objectStore('s'); + const r = s.openCursor(); + r.onsuccess = t.step_func(() => { + r.onsuccess = null; + const cursor = r.result; + setTimeout(t.step_func(() => { + assert_throws('TransactionInactiveError', () => { + cursor.update('value2'); + }, '"Transaction inactive" check (TransactionInactiveError) ' + + 'should precede "read only" check (ReadOnlyError)'); + t.done(); + }), 0); + }); + }, + 'IDBCursor.update exception order: TransactionInactiveError vs. ReadOnlyError' ); indexeddb_test( - function(t, db) { - var s = db.createObjectStore('s'); - s.put('value', 'key'); - }, - function(t, db) { - var s = db.transaction('s', 'readonly').objectStore('s'); - var r = s.openCursor(); - r.onsuccess = t.step_func(function() { - r.onsuccess = null; - var cursor = r.result; - cursor.continue(); - assert_throws('ReadOnlyError', function() { - cursor.update('value2'); - }, '"Read only" check (ReadOnlyError) should precede '+ - '"got value flag" check (InvalidStateError)'); - t.done(); - }); - }, - 'IDBCursor.update exception order: ReadOnlyError vs. InvalidStateError #1' + (t, db) => { + const s = db.createObjectStore('s'); + s.put('value', 'key'); + }, + (t, db) => { + const s = db.transaction('s', 'readonly').objectStore('s'); + const r = s.openCursor(); + r.onsuccess = t.step_func(() => { + r.onsuccess = null; + const cursor = r.result; + cursor.continue(); + assert_throws('ReadOnlyError', () => { + cursor.update('value2'); + }, '"Read only" check (ReadOnlyError) should precede '+ + '"got value flag" check (InvalidStateError)'); + t.done(); + }); + }, + 'IDBCursor.update exception order: ReadOnlyError vs. InvalidStateError #1' ); indexeddb_test( - function(t, db) { - var s = db.createObjectStore('s'); - s.put('value', 'key'); - }, - function(t, db) { - var s = db.transaction('s', 'readonly').objectStore('s'); - var r = s.openKeyCursor(); - r.onsuccess = t.step_func(function() { - r.onsuccess = null; - var cursor = r.result; - cursor.continue(); - assert_throws('ReadOnlyError', function() { - cursor.update('value2'); - }, '"Read only" check (ReadOnlyError) should precede '+ - '"key only flag" check (InvalidStateError)'); - t.done(); - }); - }, - 'IDBCursor.update exception order: ReadOnlyError vs. InvalidStateError #2' + (t, db) => { + const s = db.createObjectStore('s'); + s.put('value', 'key'); + }, + (t, db) => { + const s = db.transaction('s', 'readonly').objectStore('s'); + const r = s.openKeyCursor(); + r.onsuccess = t.step_func(() => { + r.onsuccess = null; + const cursor = r.result; + assert_throws('ReadOnlyError', () => { + cursor.update('value2'); + }, '"Read only" check (ReadOnlyError) should precede '+ + '"key only flag" check (InvalidStateError)'); + t.done(); + }); + }, + 'IDBCursor.update exception order: ReadOnlyError vs. InvalidStateError #2' ); indexeddb_test( - function(t, db) { - var s = db.createObjectStore('s', {keyPath: 'id'}); - s.put({id: 123, data: 'value'}); - }, - function(t, db) { - var s = db.transaction('s', 'readwrite').objectStore('s'); - var r = s.openCursor(); - r.onsuccess = t.step_func(function() { - r.onsuccess = null; - var cursor = r.result; - cursor.continue(); - assert_throws('InvalidStateError', function() { - cursor.update({id: 123, data: 'value2'}); - }, '"Got value flag" check (InvalidStateError) should precede ' + - '"modified key" check (DataError)'); - t.done(); - }); - }, - 'IDBCursor.update exception order: InvalidStateError vs. DataError' + (t, db) => { + const s = db.createObjectStore('s', {keyPath: 'id'}); + s.put({id: 123, data: 'value'}); + }, + (t, db) => { + const s = db.transaction('s', 'readwrite').objectStore('s'); + const r = s.openCursor(); + r.onsuccess = t.step_func(() => { + r.onsuccess = null; + const cursor = r.result; + cursor.continue(); + assert_throws('InvalidStateError', () => { + cursor.update({id: 123, data: 'value2'}); + }, '"Got value flag" check (InvalidStateError) should precede ' + + '"modified key" check (DataError)'); + t.done(); + }); + }, + 'IDBCursor.update exception order: InvalidStateError vs. DataError' ); </script>
diff --git a/third_party/WebKit/LayoutTests/storage/indexeddb/idbdatabase-createObjectStore-exception-order.html b/third_party/WebKit/LayoutTests/storage/indexeddb/idbdatabase-createObjectStore-exception-order.html index 2c92366..5de8ed6 100644 --- a/third_party/WebKit/LayoutTests/storage/indexeddb/idbdatabase-createObjectStore-exception-order.html +++ b/third_party/WebKit/LayoutTests/storage/indexeddb/idbdatabase-createObjectStore-exception-order.html
@@ -1,23 +1,80 @@ <!DOCTYPE html> <title>IndexedDB: IDBDatabase createObjectStore() Exception Ordering</title> +<meta charset=utf-8> <link rel="help" href="https://w3c.github.io/IndexedDB/#dom-idbdatabase-createobjectstore"> <script src="../../resources/testharness.js"></script> <script src="../../resources/testharnessreport.js"></script> <script src="resources/testharness-helpers.js"></script> - <script> indexeddb_test( - function(t, db) { - db.createObjectStore('s'); - assert_throws('SyntaxError', function() { - db.createObjectStore('s', {keyPath: 'not a valid key path'}); - }, '"Invalid keyath" check (SyntaxError) should precede ' + - '"duplicate store name" check (ConstraintError)'); - t.done(); - }, - function(t, db) {}, - 'IDBDatabase.createObjectStore exception order: ConstraintError vs. SyntaxError' + (t, db, req) => { + db.createObjectStore('s'); + + req.transaction.abort(); + req.onerror = null; + + setTimeout(t.step_func(() => { + assert_throws( + 'InvalidStateError', () => { db.createObjectStore('s2'); }, + '"running an upgrade transaction" check (InvalidStateError) ' + + 'should precede "not active" check (TransactionInactiveError)'); + + t.done(); + }), 0); + }, + (t, db) => { t.assert_unreached('open should fail'); }, + 'IDBDatabase.createObjectStore exception order: ' + + 'InvalidStateError vs. TransactionInactiveError' +); + +indexeddb_test( + (t, db, req) => { + const store = db.createObjectStore('s'); + + req.transaction.abort(); + req.onerror = null; + + assert_throws( + 'TransactionInactiveError', + () => { db.createObjectStore('s2', {keyPath: '-invalid-'}); }, + '"not active" check (TransactionInactiveError) should precede ' + + '"valid key path" check (SyntaxError)'); + + t.done(); + }, + (t, db) => { t.assert_unreached('open should fail'); }, + 'IDBDatabase.createObjectStore exception order: ' + + 'TransactionInactiveError vs. SyntaxError' +); + +indexeddb_test( + (t, db) => { + db.createObjectStore('s'); + assert_throws('SyntaxError', () => { + db.createObjectStore('s', {keyPath: 'not a valid key path'}); + }, '"Invalid key path" check (SyntaxError) should precede ' + + '"duplicate store name" check (ConstraintError)'); + t.done(); + }, + (t, db) => {}, + 'IDBDatabase.createObjectStore exception order: ' + + 'SyntaxError vs. ConstraintError' +); + +indexeddb_test( + (t, db) => { + db.createObjectStore('s'); + assert_throws('ConstraintError', () => { + db.createObjectStore('s', {autoIncrement: true, + keyPath: ''}); + }, '"already exists" check (ConstraintError) should precede ' + + '"autoIncrement vs. keyPath" check (InvalidAccessError)'); + t.done(); + }, + (t, db) => {}, + 'IDBDatabase.createObjectStore exception order: ' + + 'ConstraintError vs. InvalidAccessError' ); </script>
diff --git a/third_party/WebKit/LayoutTests/storage/indexeddb/idbdatabase-deleteObjectStore-exception-order.html b/third_party/WebKit/LayoutTests/storage/indexeddb/idbdatabase-deleteObjectStore-exception-order.html new file mode 100644 index 0000000..a45190c0 --- /dev/null +++ b/third_party/WebKit/LayoutTests/storage/indexeddb/idbdatabase-deleteObjectStore-exception-order.html
@@ -0,0 +1,43 @@ +<!DOCTYPE html> +<title>IndexedDB: IDBDatabase deleteObjectStore() Exception Ordering</title> +<meta charset=utf-8> +<link rel="help" href="https://w3c.github.io/IndexedDB/#dom-idbdatabase-deleteobjectstore"> +<script src="../../resources/testharness.js"></script> +<script src="../../resources/testharnessreport.js"></script> +<script src="resources/testharness-helpers.js"></script> +<script> + +indexeddb_test( + (t, db, req) => { + db.createObjectStore('s'); + req.transaction.abort(); + req.onerror = null; + setTimeout(t.step_func(() => { + assert_throws( + 'InvalidStateError', () => { db.deleteObjectStore('s'); }, + '"running an upgrade transaction" check (InvalidStateError) ' + + 'should precede "not active" check (TransactionInactiveError)'); + t.done(); + }), 0); + }, + (t, db) => { t.assert_unreached('open should fail'); }, + 'IDBDatabase.deleteObjectStore exception order: ' + + 'InvalidStateError vs. TransactionInactiveError' +); + +indexeddb_test( + (t, db, req) => { + req.transaction.abort(); + req.onerror = null; + assert_throws( + 'TransactionInactiveError', () => { db.deleteObjectStore('nope'); }, + '"not active" check (TransactionInactiveError) should precede ' + + '"name in database" check (NotFoundError)'); + t.done(); + }, + (t, db) => { t.assert_unreached('open should fail'); }, + 'IDBDatabase.deleteObjectStore exception order: ' + + 'TransactionInactiveError vs. NotFoundError' +); + +</script>
diff --git a/third_party/WebKit/LayoutTests/storage/indexeddb/idbdatabase-transaction-exception-order.html b/third_party/WebKit/LayoutTests/storage/indexeddb/idbdatabase-transaction-exception-order.html index b42e79d..e8d184b 100644 --- a/third_party/WebKit/LayoutTests/storage/indexeddb/idbdatabase-transaction-exception-order.html +++ b/third_party/WebKit/LayoutTests/storage/indexeddb/idbdatabase-transaction-exception-order.html
@@ -1,54 +1,54 @@ <!DOCTYPE html> <title>IndexedDB: IDBDatabase transaction() Exception Ordering</title> +<meta charset=utf-8> <link rel="help" href="https://w3c.github.io/IndexedDB/#dom-idbdatabase-transaction"> <script src="../../resources/testharness.js"></script> <script src="../../resources/testharnessreport.js"></script> <script src="resources/testharness-helpers.js"></script> - <script> indexeddb_test( - function(t, db) { - db.createObjectStore('s'); - }, - function(t, db) { - db.close(); - assert_throws('InvalidStateError', function() { - db.transaction('no-such-store'); - }, '"Connection is closed" check (InvalidStateError) should precede ' + - '"store names" check (NotFoundError)'); - t.done(); - }, - 'IDBDatabase.transaction exception order: InvalidStateError vs. NotFoundError' + (t, db) => { + db.createObjectStore('s'); + }, + (t, db) => { + db.close(); + assert_throws('InvalidStateError', () => { + db.transaction('no-such-store'); + }, '"Connection is closed" check (InvalidStateError) should precede ' + + '"store names" check (NotFoundError)'); + t.done(); + }, + 'IDBDatabase.transaction exception order: InvalidStateError vs. NotFoundError' ); indexeddb_test( - function(t, db) { - db.createObjectStore('s'); - }, - function(t, db) { - db.close(); - assert_throws('InvalidStateError', function() { - db.transaction([]); - }, '"Connection is closed" check (InvalidStateError) should precede ' + - '"stores is empty" check (InvalidAccessError)'); - t.done(); - }, - 'IDBDatabase.transaction exception order: InvalidStateError vs. InvalidAccessError' + (t, db) => { + db.createObjectStore('s'); + }, + (t, db) => { + db.close(); + assert_throws('InvalidStateError', () => { + db.transaction([]); + }, '"Connection is closed" check (InvalidStateError) should precede ' + + '"stores is empty" check (InvalidAccessError)'); + t.done(); + }, + 'IDBDatabase.transaction exception order: InvalidStateError vs. InvalidAccessError' ); indexeddb_test( - function(t, db) { - db.createObjectStore('s'); - }, - function(t, db) { - assert_throws('NotFoundError', function() { - db.transaction('no-such-store', 'versionchange'); - }, '"No such store" check (NotFoundError) should precede ' + - '"invalid mode" check (InvalidAccessError)'); - t.done(); - }, - 'IDBDatabase.transaction exception order: NotFoundError vs. InvalidAccessError' + (t, db) => { + db.createObjectStore('s'); + }, + (t, db) => { + assert_throws('NotFoundError', () => { + db.transaction('no-such-store', 'versionchange'); + }, '"No such store" check (NotFoundError) should precede ' + + '"invalid mode" check (InvalidAccessError)'); + t.done(); + }, + 'IDBDatabase.transaction exception order: NotFoundError vs. InvalidAccessError' ); </script>
diff --git a/third_party/WebKit/LayoutTests/storage/indexeddb/idbindex-query-exception-order.html b/third_party/WebKit/LayoutTests/storage/indexeddb/idbindex-query-exception-order.html new file mode 100644 index 0000000..ab479f3 --- /dev/null +++ b/third_party/WebKit/LayoutTests/storage/indexeddb/idbindex-query-exception-order.html
@@ -0,0 +1,67 @@ +<!DOCTYPE html> +<title>IndexedDB: IDBIndex query method Ordering</title> +<meta charset=utf-8> +<link rel="help" href="https://w3c.github.io/IndexedDB/#dom-idbindex-get"> +<link rel="help" href="https://w3c.github.io/IndexedDB/#dom-idbindex-getall"> +<link rel="help" href="https://w3c.github.io/IndexedDB/#dom-idbindex-getallkeys"> +<link rel="help" href="https://w3c.github.io/IndexedDB/#dom-idbindex-count"> +<link rel="help" href="https://w3c.github.io/IndexedDB/#dom-idbindex-opencursor"> +<link rel="help" href="https://w3c.github.io/IndexedDB/#dom-idbindex-openkeycursor"> +<script src="../../resources/testharness.js"></script> +<script src="../../resources/testharnessreport.js"></script> +<script src="resources/testharness-helpers.js"></script> +<script> + +['get', + 'getAll', + 'getAllKeys', + 'count', + 'openCursor', + 'openKeyCursor' +].forEach(method => { + + indexeddb_test( + (t, db) => { + const store = db.createObjectStore('s'); + const store2 = db.createObjectStore('s2'); + const index = store2.createIndex('i', 'keyPath'); + + store2.deleteIndex('i'); + + setTimeout(t.step_func(() => { + assert_throws( + 'InvalidStateError', () => { index[method]('key'); }, + '"has been deleted" check (InvalidStateError) should precede ' + + '"not active" check (TransactionInactiveError)'); + t.done(); + }), 0); + }, + (t, db) => {}, + `IDBIndex.${method} exception order: ` + + 'InvalidStateError vs. TransactionInactiveError' + ); + + indexeddb_test( + (t, db) => { + const store = db.createObjectStore('s'); + const index = store.createIndex('i', 'keyPath'); + }, + (t, db) => { + const tx = db.transaction('s'); + const store = tx.objectStore('s'); + const index = store.index('i'); + + setTimeout(t.step_func(() => { + assert_throws( + 'TransactionInactiveError', () => { index[method]({}); }, + '"not active" check (TransactionInactiveError) should precede ' + + 'query check (DataError)'); + t.done(); + }), 0); + }, + `IDBIndex.${method} exception order: ` + + 'TransactionInactiveError vs. DataError' + ); +}); + +</script>
diff --git a/third_party/WebKit/LayoutTests/storage/indexeddb/idbobjectstore-add-put-exception-order.html b/third_party/WebKit/LayoutTests/storage/indexeddb/idbobjectstore-add-put-exception-order.html new file mode 100644 index 0000000..d9dcc414 --- /dev/null +++ b/third_party/WebKit/LayoutTests/storage/indexeddb/idbobjectstore-add-put-exception-order.html
@@ -0,0 +1,74 @@ +<!DOCTYPE html> +<title>IndexedDB: IDBObjectStore add()/put() Exception Ordering</title> +<meta charset=utf-8> +<link rel="help" href="https://w3c.github.io/IndexedDB/#dom-idbobjectstore-add"> +<link rel="help" href="https://w3c.github.io/IndexedDB/#dom-idbobjectstore-put"> +<script src="../../resources/testharness.js"></script> +<script src="../../resources/testharnessreport.js"></script> +<script src="resources/testharness-helpers.js"></script> +<script> + +['add', 'put'].forEach(method => { + indexeddb_test( + (t, db) => { + const store = db.createObjectStore('s'); + const store2 = db.createObjectStore('s2'); + + db.deleteObjectStore('s2'); + + setTimeout(t.step_func(() => { + assert_throws( + 'InvalidStateError', () => { store2[method]('key', 'value'); }, + '"has been deleted" check (InvalidStateError) should precede ' + + '"not active" check (TransactionInactiveError)'); + t.done(); + }), 0); + }, + (t, db) => {}, + `IDBObjectStore.${method} exception order: ` + + 'InvalidStateError vs. TransactionInactiveError' + ); + + indexeddb_test( + (t, db) => { + const store = db.createObjectStore('s'); + }, + (t, db) => { + const tx = db.transaction('s', 'readonly'); + const store = tx.objectStore('s'); + + setTimeout(t.step_func(() => { + assert_throws( + 'TransactionInactiveError', () => { store[method]('key', 'value'); }, + '"not active" check (TransactionInactiveError) should precede ' + + '"read only" check (ReadOnlyError)'); + t.done(); + }), 0); + }, + + `IDBObjectStore.${method} exception order: ` + + 'TransactionInactiveError vs. ReadOnlyError' + ); + + indexeddb_test( + (t, db) => { + const store = db.createObjectStore('s'); + }, + (t, db) => { + const tx = db.transaction('s', 'readonly'); + const store = tx.objectStore('s'); + + assert_throws( + 'ReadOnlyError', () => { store[method]({}, 'value'); }, + '"read only" check (ReadOnlyError) should precede ' + + 'key/data check (DataError)'); + + t.done(); + }, + + `IDBObjectStore.${method} exception order: ` + + 'ReadOnlyError vs. DataError' + ); +}); + +</script>
diff --git a/third_party/WebKit/LayoutTests/storage/indexeddb/idbobjectstore-clear-exception-order.html b/third_party/WebKit/LayoutTests/storage/indexeddb/idbobjectstore-clear-exception-order.html new file mode 100644 index 0000000..dfc93e8 --- /dev/null +++ b/third_party/WebKit/LayoutTests/storage/indexeddb/idbobjectstore-clear-exception-order.html
@@ -0,0 +1,51 @@ +<!DOCTYPE html> +<title>IndexedDB: IDBObjectStore clear() Exception Ordering</title> +<meta charset=utf-8> +<link rel="help" href="https://w3c.github.io/IndexedDB/#dom-idbobjectstore-clear"> +<script src="../../resources/testharness.js"></script> +<script src="../../resources/testharnessreport.js"></script> +<script src="resources/testharness-helpers.js"></script> +<script> + +indexeddb_test( + (t, db) => { + const store = db.createObjectStore('s'); + const store2 = db.createObjectStore('s2'); + + db.deleteObjectStore('s2'); + + setTimeout(t.step_func(() => { + assert_throws( + 'InvalidStateError', () => { store2.clear(); }, + '"has been deleted" check (InvalidStateError) should precede ' + + '"not active" check (TransactionInactiveError)'); + t.done(); + }), 0); + }, + (t, db) => {}, + 'IDBObjectStore.clear exception order: ' + + 'InvalidStateError vs. TransactionInactiveError' +); + +indexeddb_test( + (t, db) => { + const store = db.createObjectStore('s'); + }, + (t, db) => { + const tx = db.transaction('s', 'readonly'); + const store = tx.objectStore('s'); + + setTimeout(t.step_func(() => { + assert_throws( + 'TransactionInactiveError', () => { store.clear(); }, + '"not active" check (TransactionInactiveError) should precede ' + + '"read only" check (ReadOnlyError)'); + t.done(); + }), 0); + }, + + 'IDBObjectStore.clear exception order: ' + + 'TransactionInactiveError vs. ReadOnlyError' +); + +</script>
diff --git a/third_party/WebKit/LayoutTests/storage/indexeddb/idbobjectstore-delete-exception-order.html b/third_party/WebKit/LayoutTests/storage/indexeddb/idbobjectstore-delete-exception-order.html new file mode 100644 index 0000000..e0b2bea --- /dev/null +++ b/third_party/WebKit/LayoutTests/storage/indexeddb/idbobjectstore-delete-exception-order.html
@@ -0,0 +1,69 @@ +<!DOCTYPE html> +<title>IndexedDB: IDBObjectStore delete() Exception Ordering</title> +<meta charset=utf-8> +<link rel="help" href="https://w3c.github.io/IndexedDB/#dom-idbobjectstore-delete"> +<script src="../../resources/testharness.js"></script> +<script src="../../resources/testharnessreport.js"></script> +<script src="resources/testharness-helpers.js"></script> +<script> + +indexeddb_test( + (t, db) => { + const store = db.createObjectStore('s'); + const store2 = db.createObjectStore('s2'); + + db.deleteObjectStore('s2'); + + setTimeout(t.step_func(() => { + assert_throws( + 'InvalidStateError', () => { store2.delete('key'); }, + '"has been deleted" check (InvalidStateError) should precede ' + + '"not active" check (TransactionInactiveError)'); + t.done(); + }), 0); + }, + (t, db) => {}, + 'IDBObjectStore.delete exception order: ' + + 'InvalidStateError vs. TransactionInactiveError' +); + +indexeddb_test( + (t, db) => { + const store = db.createObjectStore('s'); + }, + (t, db) => { + const tx = db.transaction('s', 'readonly'); + const store = tx.objectStore('s'); + + setTimeout(t.step_func(() => { + assert_throws( + 'TransactionInactiveError', () => { store.delete('key'); }, + '"not active" check (TransactionInactiveError) should precede ' + + '"read only" check (ReadOnlyError)'); + t.done(); + }), 0); + }, + 'IDBObjectStore.delete exception order: ' + + 'TransactionInactiveError vs. ReadOnlyError' +); + +indexeddb_test( + (t, db) => { + const store = db.createObjectStore('s'); + }, + (t, db) => { + const tx = db.transaction('s', 'readonly'); + const store = tx.objectStore('s'); + + assert_throws( + 'ReadOnlyError', () => { store.delete({}); }, + '"read only" check (ReadOnlyError) should precede ' + + 'key/data check (DataError)'); + + t.done(); + }, + 'IDBObjectStore.delete exception order: ' + + 'ReadOnlyError vs. DataError' +); + +</script>
diff --git a/third_party/WebKit/LayoutTests/storage/indexeddb/idbobjectstore-deleteIndex-exception-order.html b/third_party/WebKit/LayoutTests/storage/indexeddb/idbobjectstore-deleteIndex-exception-order.html new file mode 100644 index 0000000..d8af3f97 --- /dev/null +++ b/third_party/WebKit/LayoutTests/storage/indexeddb/idbobjectstore-deleteIndex-exception-order.html
@@ -0,0 +1,68 @@ +<!DOCTYPE html> +<title>IndexedDB: IDBObjectStore deleteIndex() Exception Ordering</title> +<meta charset=utf-8> +<link rel="help" href="https://w3c.github.io/IndexedDB/#dom-idbobjectstore-deleteindex"> +<script src="../../resources/testharness.js"></script> +<script src="../../resources/testharnessreport.js"></script> +<script src="resources/testharness-helpers.js"></script> +<script> + +indexeddb_test( + (t, db) => { + const store = db.createObjectStore('s'); + store.createIndex('i', 'keyPath'); + }, + (t, db) => { + const tx = db.transaction('s'); + const store = tx.objectStore('s'); + + setTimeout(t.step_func(() => { + assert_throws( + 'InvalidStateError', () => { store.deleteIndex('i'); }, + '"running an upgrade transaction" check (InvalidStateError) ' + + 'should precede "not active" check (TransactionInactiveError)'); + t.done(); + }), 0); + }, + 'IDBObjectStore.deleteIndex exception order: ' + + 'InvalidStateError #1 vs. TransactionInactiveError' +); + +indexeddb_test( + (t, db) => { + const store = db.createObjectStore('s'); + const index = store.createIndex('i', 'keyPath'); + + db.deleteObjectStore('s'); + + setTimeout(t.step_func(() => { + assert_throws( + 'InvalidStateError', () => { store.deleteIndex('i'); }, + '"deleted" check (InvalidStateError) ' + + 'should precede "not active" check (TransactionInactiveError)'); + t.done(); + }), 0); + }, + (t, db) => {}, + 'IDBObjectStore.deleteIndex exception order: ' + + 'InvalidStateError #2 vs. TransactionInactiveError' +); + +indexeddb_test( + (t, db) => { + const store = db.createObjectStore('s'); + + setTimeout(t.step_func(() => { + assert_throws( + 'TransactionInactiveError', () => { store.deleteIndex('nope'); }, + '"not active" check (TransactionInactiveError) should precede ' + + '"name in store" check (NotFoundError)'); + t.done(); + }), 0); + }, + (t, db) => {}, + 'IDBObjectStore.deleteIndex exception order: ' + + 'TransactionInactiveError vs. NotFoundError' +); + +</script>
diff --git a/third_party/WebKit/LayoutTests/storage/indexeddb/idbobjectstore-query-exception-order.html b/third_party/WebKit/LayoutTests/storage/indexeddb/idbobjectstore-query-exception-order.html new file mode 100644 index 0000000..79040f8 --- /dev/null +++ b/third_party/WebKit/LayoutTests/storage/indexeddb/idbobjectstore-query-exception-order.html
@@ -0,0 +1,65 @@ +<!DOCTYPE html> +<title>IndexedDB: IDBObjectStore query method Ordering</title> +<meta charset=utf-8> +<link rel="help" href="https://w3c.github.io/IndexedDB/#dom-idbobjectstore-get"> +<link rel="help" href="https://w3c.github.io/IndexedDB/#dom-idbobjectstore-getall"> +<link rel="help" href="https://w3c.github.io/IndexedDB/#dom-idbobjectstore-getallkeys"> +<link rel="help" href="https://w3c.github.io/IndexedDB/#dom-idbobjectstore-count"> +<link rel="help" href="https://w3c.github.io/IndexedDB/#dom-idbobjectstore-opencursor"> +<link rel="help" href="https://w3c.github.io/IndexedDB/#dom-idbobjectstore-openkeycursor"> +<script src="../../resources/testharness.js"></script> +<script src="../../resources/testharnessreport.js"></script> +<script src="resources/testharness-helpers.js"></script> +<script> + +['get', + 'getAll', + 'getAllKeys', + 'count', + 'openCursor', + 'openKeyCursor' +].forEach(method => { + + indexeddb_test( + (t, db) => { + const store = db.createObjectStore('s'); + const store2 = db.createObjectStore('s2'); + + db.deleteObjectStore('s2'); + + setTimeout(t.step_func(() => { + assert_throws( + 'InvalidStateError', () => { store2[method]('key'); }, + '"has been deleted" check (InvalidStateError) should precede ' + + '"not active" check (TransactionInactiveError)'); + + t.done(); + }), 0); + }, + (t, db) => {}, + `IDBObjectStore.${method} exception order: ` + + 'InvalidStateError vs. TransactionInactiveError' + ); + + indexeddb_test( + (t, db) => { + const store = db.createObjectStore('s'); + }, + (t, db) => { + const tx = db.transaction('s'); + const store = tx.objectStore('s'); + + setTimeout(t.step_func(() => { + assert_throws( + 'TransactionInactiveError', () => { store[method]({}); }, + '"not active" check (TransactionInactiveError) should precede ' + + 'query check (DataError)'); + t.done(); + }), 0); + }, + `IDBObjectStore.${method} exception order: ` + + 'TransactionInactiveError vs. DataError' + ); +}); + +</script>
diff --git a/third_party/WebKit/LayoutTests/storage/indexeddb/idbtransaction-objectStore-exception-order.html b/third_party/WebKit/LayoutTests/storage/indexeddb/idbtransaction-objectStore-exception-order.html new file mode 100644 index 0000000..31a9ed92 --- /dev/null +++ b/third_party/WebKit/LayoutTests/storage/indexeddb/idbtransaction-objectStore-exception-order.html
@@ -0,0 +1,26 @@ +<!DOCTYPE html> +<title>IndexedDB: IDBTransaction objectStore() Exception Ordering</title> +<meta charset=utf-8> +<link rel="help" href="https://w3c.github.io/IndexedDB/#dom-idbtransaction-objectstore"> +<script src="../../resources/testharness.js"></script> +<script src="../../resources/testharnessreport.js"></script> +<script src="resources/testharness-helpers.js"></script> +<script> + +indexeddb_test( + (t, db) => { + const store = db.createObjectStore('s'); + }, + (t, db) => { + const tx = db.transaction('s'); + tx.oncomplete = t.step_func(() => { + assert_throws('InvalidStateError', () => { tx.objectStore('nope'); }, + '"finished" check (InvalidStateError) should precede ' + + '"name in scope" check (NotFoundError)'); + t.done(); + }); + }, + 'IDBTransaction.objectStore exception order: InvalidStateError vs. NotFoundError' +); + +</script>
diff --git a/third_party/WebKit/LayoutTests/storage/indexeddb/resources/testharness-helpers.js b/third_party/WebKit/LayoutTests/storage/indexeddb/resources/testharness-helpers.js index 846481f5..a6051db9 100644 --- a/third_party/WebKit/LayoutTests/storage/indexeddb/resources/testharness-helpers.js +++ b/third_party/WebKit/LayoutTests/storage/indexeddb/resources/testharness-helpers.js
@@ -1,23 +1,23 @@ function indexeddb_test(upgrade_func, body_func, description) { - async_test(function(t) { - var dbName = 'db' + self.location.pathname + '-' + description; - var delete_request = indexedDB.deleteDatabase(dbName); - delete_request.onerror = t.unreached_func('deleteDatabase should not fail'); - delete_request.onsuccess = t.step_func(function(e) { - var open_request = indexedDB.open(dbName); - open_request.onerror = t.unreached_func('open should not fail'); - open_request.onupgradeneeded = t.step_func(function(e) { - upgrade_func(t, open_request.result); - }); - open_request.onsuccess = t.step_func(function(e) { - body_func(t, open_request.result); - }); - }); - }, description); + async_test(function(t) { + var dbName = 'db' + self.location.pathname + '-' + description; + var delete_request = indexedDB.deleteDatabase(dbName); + delete_request.onerror = t.unreached_func('deleteDatabase should not fail'); + delete_request.onsuccess = t.step_func(function(e) { + var open_request = indexedDB.open(dbName); + open_request.onerror = t.unreached_func('open should not fail'); + open_request.onupgradeneeded = t.step_func(function(e) { + upgrade_func(t, open_request.result, open_request); + }); + open_request.onsuccess = t.step_func(function(e) { + body_func(t, open_request.result); + }); + }); + }, description); } function assert_key_equals(a, b, message) { - assert_equals(indexedDB.cmp(a, b), 0, message); + assert_equals(indexedDB.cmp(a, b), 0, message); } // Call with a Test and an array of expected results in order. Returns @@ -25,12 +25,12 @@ // expected number appear the order will be asserted and test // completed. function expect(t, expected) { - var results = []; - return result => { - results.push(result); - if (results.length === expected.length) { - assert_array_equals(results, expected); - t.done(); - } - }; + var results = []; + return result => { + results.push(result); + if (results.length === expected.length) { + assert_array_equals(results, expected); + t.done(); + } + }; }
diff --git a/third_party/WebKit/LayoutTests/virtual/prefer_compositing_to_lcd_text/compositing/overflow/fractional-sized-scrolling-layer-expected.png b/third_party/WebKit/LayoutTests/virtual/prefer_compositing_to_lcd_text/compositing/overflow/fractional-sized-scrolling-layer-expected.png new file mode 100644 index 0000000..e044ebf --- /dev/null +++ b/third_party/WebKit/LayoutTests/virtual/prefer_compositing_to_lcd_text/compositing/overflow/fractional-sized-scrolling-layer-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/virtual/prefer_compositing_to_lcd_text/compositing/overflow/fractional-sized-scrolling-layer-expected.txt b/third_party/WebKit/LayoutTests/virtual/prefer_compositing_to_lcd_text/compositing/overflow/fractional-sized-scrolling-layer-expected.txt new file mode 100644 index 0000000..0ef6df8c --- /dev/null +++ b/third_party/WebKit/LayoutTests/virtual/prefer_compositing_to_lcd_text/compositing/overflow/fractional-sized-scrolling-layer-expected.txt
@@ -0,0 +1,10 @@ +layer at (0,0) size 800x600 + LayoutView at (0,0) size 800x600 +layer at (0,0) size 800x8 + LayoutBlockFlow {HTML} at (0,0) size 800x8 + LayoutBlockFlow {BODY} at (8,8) size 784x0 +layer at (0,8) size 615x200 + LayoutBlockFlow (positioned) {DIV} at (0,8) size 615.05x200 [bgcolor=#000000] +layer at (40,8) size 288x200 clip at (40,8) size 273x200 scrollHeight 500 + LayoutBlockFlow {DIV} at (40,0) size 287.52x200 [bgcolor=#FF0000] + LayoutBlockFlow {DIV} at (0,0) size 272.52x500 [bgcolor=#00FF00]
diff --git a/third_party/WebKit/LayoutTests/virtual/prefer_compositing_to_lcd_text/compositing/overflow/scaled-overflow-expected.png b/third_party/WebKit/LayoutTests/virtual/prefer_compositing_to_lcd_text/compositing/overflow/scaled-overflow-expected.png new file mode 100644 index 0000000..c1c4d7ff --- /dev/null +++ b/third_party/WebKit/LayoutTests/virtual/prefer_compositing_to_lcd_text/compositing/overflow/scaled-overflow-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/virtual/prefer_compositing_to_lcd_text/compositing/overflow/scaled-overflow-expected.txt b/third_party/WebKit/LayoutTests/virtual/prefer_compositing_to_lcd_text/compositing/overflow/scaled-overflow-expected.txt new file mode 100644 index 0000000..476a2a9 --- /dev/null +++ b/third_party/WebKit/LayoutTests/virtual/prefer_compositing_to_lcd_text/compositing/overflow/scaled-overflow-expected.txt
@@ -0,0 +1,15 @@ +layer at (0,0) size 800x600 + LayoutView at (0,0) size 800x600 +layer at (0,0) size 800x466 + LayoutBlockFlow {HTML} at (0,0) size 800x466 +layer at (8,8) size 784x450 + LayoutBlockFlow {BODY} at (8,8) size 784x450 [bgcolor=#000000] +layer at (8,8) size 150x150 clip at (8,8) size 135x135 scrollHeight 400 + LayoutBlockFlow (relative positioned) {DIV} at (0,0) size 150x150 [bgcolor=#FFFFFF] + LayoutBlockFlow {DIV} at (0,0) size 135x400 +layer at (9,168) size 150x150 clip at (9,168) size 135x135 scrollHeight 400 + LayoutBlockFlow (relative positioned) {DIV} at (0,150) size 150x150 [bgcolor=#FFFFFF] + LayoutBlockFlow {DIV} at (0,0) size 135x400 +layer at (10,328) size 150x150 clip at (10,328) size 135x135 scrollHeight 400 + LayoutBlockFlow (relative positioned) {DIV} at (0,300) size 150x150 [bgcolor=#FFFFFF] + LayoutBlockFlow {DIV} at (0,0) size 135x400
diff --git a/third_party/WebKit/LayoutTests/virtual/stable/webexposed/global-interface-listing-expected.txt b/third_party/WebKit/LayoutTests/virtual/stable/webexposed/global-interface-listing-expected.txt index 2fbda10..7fd46d4 100644 --- a/third_party/WebKit/LayoutTests/virtual/stable/webexposed/global-interface-listing-expected.txt +++ b/third_party/WebKit/LayoutTests/virtual/stable/webexposed/global-interface-listing-expected.txt
@@ -248,6 +248,10 @@ static method supports attribute @@toStringTag method constructor +interface CSSConditionRule : CSSGroupingRule + attribute @@toStringTag + getter conditionText + method constructor interface CSSFontFaceRule : CSSRule attribute @@toStringTag getter style @@ -279,7 +283,7 @@ method deleteRule method findRule setter name -interface CSSMediaRule : CSSGroupingRule +interface CSSMediaRule : CSSConditionRule attribute @@toStringTag getter media method constructor @@ -352,13 +356,9 @@ method deleteRule method insertRule method removeRule -interface CSSSupportsRule : CSSRule +interface CSSSupportsRule : CSSConditionRule attribute @@toStringTag - getter conditionText - getter cssRules method constructor - method deleteRule - method insertRule interface CSSViewportRule : CSSRule attribute @@toStringTag getter style
diff --git a/third_party/WebKit/LayoutTests/webaudio/audionode-disconnect-expected.txt b/third_party/WebKit/LayoutTests/webaudio/audionode-disconnect-expected.txt index 8173276..78035cc 100644 --- a/third_party/WebKit/LayoutTests/webaudio/audionode-disconnect-expected.txt +++ b/third_party/WebKit/LayoutTests/webaudio/audionode-disconnect-expected.txt
@@ -18,6 +18,7 @@ PASS splitter.disconnect(gain1, 0) threw InvalidAccessError: Failed to execute 'disconnect' on 'AudioNode': output (0) is not connected to the given destination.. PASS splitter.disconnect(gain3, 0, 0) threw InvalidAccessError: Failed to execute 'disconnect' on 'AudioNode': output (0) is not connected to the input (0) of the destination.. PASS splitter.disconnect(merger, 3, 0) threw IndexSizeError: Failed to execute 'disconnect' on 'AudioNode': The output index provided (3) is outside the range [0, 1].. +PASS Disabled outputs handled correctly. PASS successfullyParsed is true TEST COMPLETE
diff --git a/third_party/WebKit/LayoutTests/webaudio/audionode-disconnect.html b/third_party/WebKit/LayoutTests/webaudio/audionode-disconnect.html index 220529a7..e9a8062 100644 --- a/third_party/WebKit/LayoutTests/webaudio/audionode-disconnect.html +++ b/third_party/WebKit/LayoutTests/webaudio/audionode-disconnect.html
@@ -255,20 +255,29 @@ done(); }); + audit.defineTask('disabled-outputs', function (taskDone) { + // See crbug.com/656652 + var context = new OfflineAudioContext(2, 1024, 44100); + var g1 = context.createGain(); + var g2 = context.createGain(); + g1.connect(g2); + g1.disconnect(g2); + var g3 = context.createGain(); + g2.connect(g3); + g1.connect(g2); + context.startRendering().then(function () { + // If we make it here, we passed. + Should("Disabled outputs handled", true) + .summarize("correctly", "inccorrectly"); + }).then(taskDone); + }); + audit.defineTask('finish', function (done) { finishJSTest(); done(); }); - audit.runTasks( - 'disconnect()', - 'disconnect(output)', - 'disconnect(AudioNode)', - 'disconnect(AudioNode, output)', - 'disconnect(AudioNode, output, input)', - 'exceptions', - 'finish' - ); + audit.runTasks(); successfullyParsed = true; </script>
diff --git a/third_party/WebKit/LayoutTests/webaudio/constructor/channelsplitter.html b/third_party/WebKit/LayoutTests/webaudio/constructor/channelsplitter.html index 79f7982c..cba6edd 100644 --- a/third_party/WebKit/LayoutTests/webaudio/constructor/channelsplitter.html +++ b/third_party/WebKit/LayoutTests/webaudio/constructor/channelsplitter.html
@@ -59,9 +59,9 @@ success = Should("node.numberOfOutputs", node.numberOfOutputs) .beEqualTo(6) && success; success = Should("node.channelCount", node.channelCount) - .beEqualTo(2) && success; + .beEqualTo(node.numberOfOutputs) && success; success = Should("node.channelCountMode", node.channelCountMode) - .beEqualTo("max") && success; + .beEqualTo("explicit") && success; success = Should("node.channelInterpretation", node.channelInterpretation) .beEqualTo("speakers") && success; @@ -74,7 +74,17 @@ }); audit.defineTask("test AudioNodeOptions", function (taskDone) { - testAudioNodeOptions(context, "ChannelSplitterNode"); + testAudioNodeOptions(context, "ChannelSplitterNode", { + expectedChannelCount: { + value: 6, + isFixed: true, + errorType: "InvalidStateError" + }, + expectedChannelCountMode: { + value: "explicit", + isFixed: true + } + }); taskDone(); }); @@ -110,7 +120,7 @@ function () { node = new ChannelSplitterNode(context, options); }) - .notThrow() && success; + .throw("InvalidStateError") && success; options = { channelCountMode: "max"}; success = Should("new ChannelSplitterNode(c, " + JSON.stringify(options) + ")", @@ -119,7 +129,7 @@ channelCountMode: "max" }); }) - .notThrow() && success; + .throw("InvalidStateError") && success; Should("new ChannelSplitterNode() with options", success) .summarize(
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 00b37ad..a3cd9451 100644 --- a/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt +++ b/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt
@@ -421,6 +421,10 @@ getter vmin getter vw method constructor +interface CSSConditionRule : CSSGroupingRule + attribute @@toStringTag + getter conditionText + method constructor interface CSSFontFaceRule : CSSRule attribute @@toStringTag getter style @@ -495,7 +499,7 @@ getter m43 getter m44 method constructor -interface CSSMediaRule : CSSGroupingRule +interface CSSMediaRule : CSSConditionRule attribute @@toStringTag getter media method constructor @@ -614,13 +618,9 @@ attribute @@toStringTag getter cssText method constructor -interface CSSSupportsRule : CSSRule +interface CSSSupportsRule : CSSConditionRule attribute @@toStringTag - getter conditionText - getter cssRules method constructor - method deleteRule - method insertRule interface CSSTransformComponent attribute @@toStringTag getter cssText @@ -4835,18 +4835,13 @@ getter onconnecting getter ondisconnect getter state + method cancelWatchAvailability method constructor - method getAvailability method prompt + method watchAvailability setter onconnect setter onconnecting setter ondisconnect -interface RemotePlaybackAvailability : EventTarget - attribute @@toStringTag - getter onchange - getter value - method constructor - setter onchange interface Request attribute @@toStringTag getter bodyUsed
diff --git a/third_party/WebKit/Source/bindings/bindings.gni b/third_party/WebKit/Source/bindings/bindings.gni index 30b87b7..bd49bc8 100644 --- a/third_party/WebKit/Source/bindings/bindings.gni +++ b/third_party/WebKit/Source/bindings/bindings.gni
@@ -132,6 +132,7 @@ "core/v8/SharedPersistent.h", "core/v8/SourceLocation.cpp", "core/v8/SourceLocation.h", + "core/v8/TraceWrapperMember.h", "core/v8/Transferables.h", "core/v8/ToV8.cpp", "core/v8/ToV8.h", @@ -233,6 +234,7 @@ "core/v8/ScriptWrappableVisitorTest.cpp", "core/v8/SerializedScriptValueTest.cpp", "core/v8/ToV8Test.cpp", + "core/v8/TraceWrapperMemberTest.cpp", "core/v8/V8BindingForTesting.cpp", "core/v8/V8BindingForTesting.h", "core/v8/V8BindingTest.cpp",
diff --git a/third_party/WebKit/Source/bindings/core/v8/ScriptController.cpp b/third_party/WebKit/Source/bindings/core/v8/ScriptController.cpp index 3f4d6b33e..c32e0ed 100644 --- a/third_party/WebKit/Source/bindings/core/v8/ScriptController.cpp +++ b/third_party/WebKit/Source/bindings/core/v8/ScriptController.cpp
@@ -331,7 +331,8 @@ return allowed; } -bool ScriptController::executeScriptIfJavaScriptURL(const KURL& url) { +bool ScriptController::executeScriptIfJavaScriptURL(const KURL& url, + Element* element) { if (!protocolIsJavaScript(url)) return false; @@ -340,8 +341,10 @@ if (!frame()->page() || (!shouldBypassMainWorldContentSecurityPolicy && !frame()->document()->contentSecurityPolicy()->allowJavaScriptURLs( - frame()->document()->url(), eventHandlerPosition().m_line))) + element, frame()->document()->url(), + eventHandlerPosition().m_line))) { return true; + } bool progressNotificationsNeeded = frame()->loader().stateMachine()->isDisplayingInitialEmptyDocument() &&
diff --git a/third_party/WebKit/Source/bindings/core/v8/ScriptController.h b/third_party/WebKit/Source/bindings/core/v8/ScriptController.h index 4a2b220..80a098d 100644 --- a/third_party/WebKit/Source/bindings/core/v8/ScriptController.h +++ b/third_party/WebKit/Source/bindings/core/v8/ScriptController.h
@@ -47,6 +47,7 @@ namespace blink { class DOMWrapperWorld; +class Element; class ExecutionContext; class HTMLDocument; class HTMLPlugInElement; @@ -113,7 +114,7 @@ Vector<v8::Local<v8::Value>>* results); // Returns true if argument is a JavaScript URL. - bool executeScriptIfJavaScriptURL(const KURL&); + bool executeScriptIfJavaScriptURL(const KURL&, Element*); // Returns true if the current world is isolated, and has its own Content // Security Policy. In this case, the policy of the main world should be
diff --git a/third_party/WebKit/Source/bindings/core/v8/ScriptWrappableVisitor.h b/third_party/WebKit/Source/bindings/core/v8/ScriptWrappableVisitor.h index eea3eeec..cc77cf1 100644 --- a/third_party/WebKit/Source/bindings/core/v8/ScriptWrappableVisitor.h +++ b/third_party/WebKit/Source/bindings/core/v8/ScriptWrappableVisitor.h
@@ -257,71 +257,6 @@ v8::EmbedderReachableReferenceReporter* m_reporter = nullptr; }; -/** - * TraceWrapperMember is used for Member fields that should participate in - * wrapper tracing, i.e., strongly hold a ScriptWrappable alive. All - * TraceWrapperMember fields must be traced in the class' traceWrappers method. - */ -template <class T> -class TraceWrapperMember : public Member<T> { - DISALLOW_NEW_EXCEPT_PLACEMENT_NEW(); +} // namespace blink - public: - TraceWrapperMember(void* parent, T* raw) : Member<T>(raw), m_parent(parent) { -#if DCHECK_IS_ON() - DCHECK(!m_parent || HeapObjectHeader::fromPayload(m_parent)->checkHeader()); -#endif - ScriptWrappableVisitor::writeBarrier(m_parent, raw); - } - TraceWrapperMember(WTF::HashTableDeletedValueType x) - : Member<T>(x), m_parent(nullptr) {} - - /** - * Copying a TraceWrapperMember means that its backpointer will also be - * copied. - */ - TraceWrapperMember(const TraceWrapperMember& other) { *this = other; } - - template <typename U> - TraceWrapperMember& operator=(const TraceWrapperMember<U>& other) { - DCHECK(other.m_parent); - m_parent = other.m_parent; - Member<T>::operator=(other); - ScriptWrappableVisitor::writeBarrier(m_parent, other); - return *this; - } - - template <typename U> - TraceWrapperMember& operator=(const Member<U>& other) { - DCHECK(!traceWrapperMemberIsNotInitialized()); - Member<T>::operator=(other); - ScriptWrappableVisitor::writeBarrier(m_parent, other); - return *this; - } - - template <typename U> - TraceWrapperMember& operator=(U* other) { - DCHECK(!traceWrapperMemberIsNotInitialized()); - Member<T>::operator=(other); - ScriptWrappableVisitor::writeBarrier(m_parent, other); - return *this; - } - - TraceWrapperMember& operator=(std::nullptr_t) { - // No need for a write barrier when assigning nullptr. - Member<T>::operator=(nullptr); - return *this; - } - - void* parent() { return m_parent; } - - private: - bool traceWrapperMemberIsNotInitialized() { return !m_parent; } - - /** - * The parent object holding strongly onto the actual Member. - */ - void* m_parent; -}; -} -#endif +#endif // ScriptWrappableVisitor_h
diff --git a/third_party/WebKit/Source/bindings/core/v8/ScriptWrappableVisitorTest.cpp b/third_party/WebKit/Source/bindings/core/v8/ScriptWrappableVisitorTest.cpp index 261f23d..090e36c 100644 --- a/third_party/WebKit/Source/bindings/core/v8/ScriptWrappableVisitorTest.cpp +++ b/third_party/WebKit/Source/bindings/core/v8/ScriptWrappableVisitorTest.cpp
@@ -287,41 +287,4 @@ visitor->getVerifierDeque()->clear(); } -template <typename T> -static void swap(HeapVector<TraceWrapperMember<T>>& a, - HeapVector<TraceWrapperMember<T>>& b, - void* parentForA, - void* parentForB) { - HeapVector<TraceWrapperMember<T>> temp(a.size()); - for (size_t i = 0; i < a.size(); ++i) { - temp[i] = TraceWrapperMember<T>(parentForB, a[i].get()); - } - a.resize(b.size()); - for (size_t i = 0; i < b.size(); ++i) { - a[i] = TraceWrapperMember<T>(parentForA, b[i].get()); - } - b.resize(temp.size()); - for (size_t i = 0; i < temp.size(); ++i) { - b[i] = TraceWrapperMember<T>(parentForB, temp[i].get()); - } -} - -TEST(ScriptWrappableVisitorTest, HeapVectorSwap) { - typedef TraceWrapperMember<DeathAwareScriptWrappable> Wrapper; - - HeapVector<Wrapper> vector1; - DeathAwareScriptWrappable* parent1 = DeathAwareScriptWrappable::create(); - DeathAwareScriptWrappable* child1 = DeathAwareScriptWrappable::create(); - vector1.append(Wrapper(parent1, child1)); - - HeapVector<Wrapper> vector2; - DeathAwareScriptWrappable* parent2 = DeathAwareScriptWrappable::create(); - DeathAwareScriptWrappable* child2 = DeathAwareScriptWrappable::create(); - vector2.append(Wrapper(parent2, child2)); - - swap(vector1, vector2, parent1, parent2); - EXPECT_EQ(parent1, vector1.first().parent()); - EXPECT_EQ(parent2, vector2.first().parent()); -} - } // namespace blink
diff --git a/third_party/WebKit/Source/bindings/core/v8/TraceWrapperMember.h b/third_party/WebKit/Source/bindings/core/v8/TraceWrapperMember.h new file mode 100644 index 0000000..611f028 --- /dev/null +++ b/third_party/WebKit/Source/bindings/core/v8/TraceWrapperMember.h
@@ -0,0 +1,140 @@ +// 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 TraceWrapperMember_h +#define TraceWrapperMember_h + +#include "bindings/core/v8/ScriptWrappableVisitor.h" +#include "platform/heap/HeapAllocator.h" + +namespace blink { + +class HeapObjectHeader; +template <typename T> +class Member; + +/** + * TraceWrapperMember is used for Member fields that should participate in + * wrapper tracing, i.e., strongly hold a ScriptWrappable alive. All + * TraceWrapperMember fields must be traced in the class' traceWrappers method. + */ +template <class T> +class TraceWrapperMember : public Member<T> { + DISALLOW_NEW_EXCEPT_PLACEMENT_NEW(); + + public: + TraceWrapperMember(void* parent, T* raw) : Member<T>(raw), m_parent(parent) { +#if DCHECK_IS_ON() + DCHECK(!m_parent || HeapObjectHeader::fromPayload(m_parent)->checkHeader()); +#endif + ScriptWrappableVisitor::writeBarrier(m_parent, raw); + } + TraceWrapperMember(WTF::HashTableDeletedValueType x) + : Member<T>(x), m_parent(nullptr) {} + + /** + * Copying a TraceWrapperMember means that its backpointer will also be + * copied. + */ + TraceWrapperMember(const TraceWrapperMember& other) { *this = other; } + + template <typename U> + TraceWrapperMember& operator=(const TraceWrapperMember<U>& other) { + DCHECK(other.m_parent); + m_parent = other.m_parent; + Member<T>::operator=(other); + ScriptWrappableVisitor::writeBarrier(m_parent, other); + return *this; + } + + template <typename U> + TraceWrapperMember& operator=(const Member<U>& other) { + DCHECK(!traceWrapperMemberIsNotInitialized()); + Member<T>::operator=(other); + ScriptWrappableVisitor::writeBarrier(m_parent, other); + return *this; + } + + template <typename U> + TraceWrapperMember& operator=(U* other) { + DCHECK(!traceWrapperMemberIsNotInitialized()); + Member<T>::operator=(other); + ScriptWrappableVisitor::writeBarrier(m_parent, other); + return *this; + } + + TraceWrapperMember& operator=(std::nullptr_t) { + // No need for a write barrier when assigning nullptr. + Member<T>::operator=(nullptr); + return *this; + } + + void* parent() { return m_parent; } + + private: + bool traceWrapperMemberIsNotInitialized() { return !m_parent; } + + /** + * The parent object holding strongly onto the actual Member. + */ + void* m_parent; +}; + +/** + * Swaps two HeapVectors specialized for TraceWrapperMember. The custom swap + * function is required as TraceWrapperMember contains ownership information + * which is not copyable but has to be explicitly specified. + */ +template <typename T> +void swap(HeapVector<TraceWrapperMember<T>>& a, + HeapVector<TraceWrapperMember<T>>& b, + void* parentForA, + void* parentForB) { + HeapVector<TraceWrapperMember<T>> temp; + temp.reserveCapacity(a.size()); + for (auto item : a) { + temp.append(TraceWrapperMember<T>(parentForB, item.get())); + } + a.clear(); + a.reserveCapacity(b.size()); + for (auto item : b) { + a.append(TraceWrapperMember<T>(parentForA, item.get())); + } + b.clear(); + b.reserveCapacity(temp.size()); + for (auto item : temp) { + b.append(TraceWrapperMember<T>(parentForB, item.get())); + } +} + +/** + * Swaps two HeapVectors, one containing TraceWrapperMember and one with + * regular Members. The custom swap function is required as + * TraceWrapperMember contains ownership information which is not copyable + * but has to be explicitly specified. + */ +template <typename T> +void swap(HeapVector<TraceWrapperMember<T>>& a, + HeapVector<Member<T>>& b, + void* parentForA) { + HeapVector<TraceWrapperMember<T>> temp; + temp.reserveCapacity(a.size()); + for (auto item : a) { + temp.append(TraceWrapperMember<T>(nullptr, item.get())); + } + a.clear(); + a.reserveCapacity(b.size()); + for (auto item : b) { + a.append(TraceWrapperMember<T>(parentForA, item.get())); + } + b.clear(); + b.reserveCapacity(temp.size()); + for (auto item : temp) { + b.append(item.get()); + } +} + +} // namespace blink + +#endif // TraceWrapperMember_h
diff --git a/third_party/WebKit/Source/bindings/core/v8/TraceWrapperMemberTest.cpp b/third_party/WebKit/Source/bindings/core/v8/TraceWrapperMemberTest.cpp new file mode 100644 index 0000000..5991a3f --- /dev/null +++ b/third_party/WebKit/Source/bindings/core/v8/TraceWrapperMemberTest.cpp
@@ -0,0 +1,50 @@ +// 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 "bindings/core/v8/TraceWrapperMember.h" + +#include "core/testing/DeathAwareScriptWrappable.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace blink { + +TEST(TraceWrapperMemberTest, HeapVectorSwap) { + typedef TraceWrapperMember<DeathAwareScriptWrappable> Wrapper; + + HeapVector<Wrapper> vector1; + DeathAwareScriptWrappable* parent1 = DeathAwareScriptWrappable::create(); + DeathAwareScriptWrappable* child1 = DeathAwareScriptWrappable::create(); + vector1.append(Wrapper(parent1, child1)); + + HeapVector<Wrapper> vector2; + DeathAwareScriptWrappable* parent2 = DeathAwareScriptWrappable::create(); + DeathAwareScriptWrappable* child2 = DeathAwareScriptWrappable::create(); + vector2.append(Wrapper(parent2, child2)); + + swap(vector1, vector2, parent1, parent2); + EXPECT_EQ(parent1, vector1.first().parent()); + EXPECT_EQ(parent2, vector2.first().parent()); +} + +TEST(TraceWrapperMemberTest, HeapVectorSwap2) { + typedef TraceWrapperMember<DeathAwareScriptWrappable> Wrapper; + + HeapVector<Wrapper> vector1; + DeathAwareScriptWrappable* parent1 = DeathAwareScriptWrappable::create(); + DeathAwareScriptWrappable* child1 = DeathAwareScriptWrappable::create(); + vector1.append(Wrapper(parent1, child1)); + + HeapVector<Member<DeathAwareScriptWrappable>> vector2; + DeathAwareScriptWrappable* child2 = DeathAwareScriptWrappable::create(); + vector2.append(child2); + + swap(vector1, vector2, parent1); + EXPECT_EQ(1u, vector1.size()); + EXPECT_EQ(child2, vector1.first().get()); + EXPECT_EQ(parent1, vector1.first().parent()); + EXPECT_EQ(1u, vector2.size()); + EXPECT_EQ(child1, vector2.first().get()); +} + +} // namespace blink
diff --git a/third_party/WebKit/Source/bindings/core/v8/V8EventListener.cpp b/third_party/WebKit/Source/bindings/core/v8/V8EventListener.cpp index fa788f05..9acda71 100644 --- a/third_party/WebKit/Source/bindings/core/v8/V8EventListener.cpp +++ b/third_party/WebKit/Source/bindings/core/v8/V8EventListener.cpp
@@ -62,6 +62,12 @@ if (isAttribute()) return v8::Local<v8::Function>(); + // Getting the handleEvent property can runs script in the getter. + if (ScriptForbiddenScope::isScriptForbidden()) { + V8ThrowException::throwError(isolate(), "Script execution is forbidden."); + return v8::Local<v8::Function>(); + } + if (listener->IsObject()) { // Check that no exceptions were thrown when getting the // handleEvent property and that the value is a function.
diff --git a/third_party/WebKit/Source/bindings/modules/v8/custom/V8RemotePlaybackCustom.cpp b/third_party/WebKit/Source/bindings/modules/v8/custom/V8RemotePlaybackCustom.cpp new file mode 100644 index 0000000..cb1c1994 --- /dev/null +++ b/third_party/WebKit/Source/bindings/modules/v8/custom/V8RemotePlaybackCustom.cpp
@@ -0,0 +1,20 @@ +// 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 "bindings/modules/v8/V8RemotePlayback.h" + +#include "bindings/core/v8/V8DOMWrapper.h" +#include "modules/remoteplayback/RemotePlayback.h" + +namespace blink { + +void V8RemotePlayback::visitDOMWrapperCustom( + v8::Isolate* isolate, + ScriptWrappable* scriptWrappable, + const v8::Persistent<v8::Object>& wrapper) { + RemotePlayback* remotePlayback = scriptWrappable->toImpl<RemotePlayback>(); + remotePlayback->setV8ReferencesForCallbacks(isolate, wrapper); +} + +} // namespace blink
diff --git a/third_party/WebKit/Source/bindings/modules/v8/custom/custom.gni b/third_party/WebKit/Source/bindings/modules/v8/custom/custom.gni index f0078aa..249329a8 100644 --- a/third_party/WebKit/Source/bindings/modules/v8/custom/custom.gni +++ b/third_party/WebKit/Source/bindings/modules/v8/custom/custom.gni
@@ -9,6 +9,7 @@ "V8DeviceMotionEventCustom.cpp", "V8ExtendableMessageEventCustom.cpp", "V8IDBObserverCustom.cpp", + "V8RemotePlaybackCustom.cpp", "V8ServiceWorkerMessageEventCustom.cpp", "V8WebGLRenderingContextCustom.cpp", "V8WebGL2RenderingContextCustom.cpp",
diff --git a/third_party/WebKit/Source/bindings/modules/v8/generated.gni b/third_party/WebKit/Source/bindings/modules/v8/generated.gni index 863d0f6e3..0d8f27d 100644 --- a/third_party/WebKit/Source/bindings/modules/v8/generated.gni +++ b/third_party/WebKit/Source/bindings/modules/v8/generated.gni
@@ -67,6 +67,8 @@ generated_modules_callback_function_files = [ "$bindings_modules_v8_output_dir/IDBObserverCallback.cpp", "$bindings_modules_v8_output_dir/IDBObserverCallback.h", + "$bindings_modules_v8_output_dir/RemotePlaybackAvailabilityCallback.cpp", + "$bindings_modules_v8_output_dir/RemotePlaybackAvailabilityCallback.h", ] bindings_modules_generated_interface_files =
diff --git a/third_party/WebKit/Source/core/animation/css/CSSAnimations.cpp b/third_party/WebKit/Source/core/animation/css/CSSAnimations.cpp index 7697301..e2ad788 100644 --- a/third_party/WebKit/Source/core/animation/css/CSSAnimations.cpp +++ b/third_party/WebKit/Source/core/animation/css/CSSAnimations.cpp
@@ -746,8 +746,7 @@ if (!animatingElement) return; - if (animatingElement->document().printing() || - animatingElement->document().wasPrinting()) + if (animatingElement->document().finishingOrIsPrinting()) return; ElementAnimations* elementAnimations = animatingElement->elementAnimations();
diff --git a/third_party/WebKit/Source/core/core_idl_files.gni b/third_party/WebKit/Source/core/core_idl_files.gni index 655387b..ebce9c4 100644 --- a/third_party/WebKit/Source/core/core_idl_files.gni +++ b/third_party/WebKit/Source/core/core_idl_files.gni
@@ -37,6 +37,7 @@ "clipboard/DataTransfer.idl", "clipboard/DataTransferItemList.idl", "css/CSS.idl", + "css/CSSConditionRule.idl", "css/CSSFontFaceRule.idl", "css/CSSGroupingRule.idl", "css/CSSImportRule.idl",
diff --git a/third_party/WebKit/Source/core/css/BUILD.gn b/third_party/WebKit/Source/core/css/BUILD.gn index b8cac9cc..70cacc2 100644 --- a/third_party/WebKit/Source/core/css/BUILD.gn +++ b/third_party/WebKit/Source/core/css/BUILD.gn
@@ -22,6 +22,8 @@ "CSSColorValue.cpp", "CSSColorValue.h", "CSSComputedStyleDeclaration.cpp", + "CSSConditionRule.cpp", + "CSSConditionRule.h", "CSSContentDistributionValue.cpp", "CSSContentDistributionValue.h", "CSSCounterValue.cpp",
diff --git a/third_party/WebKit/Source/core/css/CSSConditionRule.cpp b/third_party/WebKit/Source/core/css/CSSConditionRule.cpp new file mode 100644 index 0000000..5a1d54d --- /dev/null +++ b/third_party/WebKit/Source/core/css/CSSConditionRule.cpp
@@ -0,0 +1,21 @@ +// 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 "core/css/CSSConditionRule.h" + +#include "core/css/CSSStyleSheet.h" + +namespace blink { + +CSSConditionRule::CSSConditionRule(StyleRuleCondition* conditionRule, + CSSStyleSheet* parent) + : CSSGroupingRule(conditionRule, parent) {} + +CSSConditionRule::~CSSConditionRule() {} + +String CSSConditionRule::conditionText() const { + return static_cast<StyleRuleCondition*>(m_groupRule.get())->conditionText(); +} + +} // namespace blink
diff --git a/third_party/WebKit/Source/core/css/CSSConditionRule.h b/third_party/WebKit/Source/core/css/CSSConditionRule.h new file mode 100644 index 0000000..689e4db --- /dev/null +++ b/third_party/WebKit/Source/core/css/CSSConditionRule.h
@@ -0,0 +1,26 @@ +// 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 CSSConditionRule_h +#define CSSConditionRule_h + +#include "core/css/CSSGroupingRule.h" + +namespace blink { + +class CSSConditionRule : public CSSGroupingRule { + DEFINE_WRAPPERTYPEINFO(); + + public: + ~CSSConditionRule() override; + + virtual String conditionText() const; + + protected: + CSSConditionRule(StyleRuleCondition* conditionRule, CSSStyleSheet* parent); +}; + +} // namespace blink + +#endif // CSSConditionRule_h
diff --git a/third_party/WebKit/Source/core/css/CSSConditionRule.idl b/third_party/WebKit/Source/core/css/CSSConditionRule.idl new file mode 100644 index 0000000..824a340d --- /dev/null +++ b/third_party/WebKit/Source/core/css/CSSConditionRule.idl
@@ -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. + +// https://drafts.csswg.org/css-conditional/#the-cssconditionrule-interface + +interface CSSConditionRule : CSSGroupingRule { + // TODO(xing.xu): readonly should be removed. + readonly attribute DOMString conditionText; +};
diff --git a/third_party/WebKit/Source/core/css/CSSMediaRule.cpp b/third_party/WebKit/Source/core/css/CSSMediaRule.cpp index fcc0e77..b00cc319 100644 --- a/third_party/WebKit/Source/core/css/CSSMediaRule.cpp +++ b/third_party/WebKit/Source/core/css/CSSMediaRule.cpp
@@ -28,7 +28,7 @@ namespace blink { CSSMediaRule::CSSMediaRule(StyleRuleMedia* mediaRule, CSSStyleSheet* parent) - : CSSGroupingRule(mediaRule, parent) {} + : CSSConditionRule(mediaRule, parent) {} CSSMediaRule::~CSSMediaRule() {} @@ -49,6 +49,12 @@ return result.toString(); } +String CSSMediaRule::conditionText() const { + if (!mediaQueries()) + return String(); + return mediaQueries()->mediaText(); +} + MediaList* CSSMediaRule::media() const { if (!mediaQueries()) return nullptr; @@ -59,13 +65,13 @@ } void CSSMediaRule::reattach(StyleRuleBase* rule) { - CSSGroupingRule::reattach(rule); + CSSConditionRule::reattach(rule); if (m_mediaCSSOMWrapper && mediaQueries()) m_mediaCSSOMWrapper->reattach(mediaQueries()); } DEFINE_TRACE(CSSMediaRule) { visitor->trace(m_mediaCSSOMWrapper); - CSSGroupingRule::trace(visitor); + CSSConditionRule::trace(visitor); } } // namespace blink
diff --git a/third_party/WebKit/Source/core/css/CSSMediaRule.h b/third_party/WebKit/Source/core/css/CSSMediaRule.h index 06b5a653..228200e8 100644 --- a/third_party/WebKit/Source/core/css/CSSMediaRule.h +++ b/third_party/WebKit/Source/core/css/CSSMediaRule.h
@@ -23,14 +23,14 @@ #ifndef CSSMediaRule_h #define CSSMediaRule_h -#include "core/css/CSSGroupingRule.h" +#include "core/css/CSSConditionRule.h" #include "core/css/MediaList.h" namespace blink { class StyleRuleMedia; -class CSSMediaRule final : public CSSGroupingRule { +class CSSMediaRule final : public CSSConditionRule { DEFINE_WRAPPERTYPEINFO(); public: @@ -42,6 +42,7 @@ void reattach(StyleRuleBase*) override; String cssText() const override; + String conditionText() const override; MediaList* media() const;
diff --git a/third_party/WebKit/Source/core/css/CSSMediaRule.idl b/third_party/WebKit/Source/core/css/CSSMediaRule.idl index 53021c3f..4bc0b731 100644 --- a/third_party/WebKit/Source/core/css/CSSMediaRule.idl +++ b/third_party/WebKit/Source/core/css/CSSMediaRule.idl
@@ -20,7 +20,7 @@ // http://dev.w3.org/csswg/cssom/#the-cssmediarule-interface -interface CSSMediaRule : CSSGroupingRule { +interface CSSMediaRule : CSSConditionRule { // TODO(foolip): media should have [PutForwards=mediaText]. [SameObject] readonly attribute MediaList media; };
diff --git a/third_party/WebKit/Source/core/css/CSSSupportsRule.cpp b/third_party/WebKit/Source/core/css/CSSSupportsRule.cpp index 09d9a1a8..22d1550 100644 --- a/third_party/WebKit/Source/core/css/CSSSupportsRule.cpp +++ b/third_party/WebKit/Source/core/css/CSSSupportsRule.cpp
@@ -36,7 +36,7 @@ CSSSupportsRule::CSSSupportsRule(StyleRuleSupports* supportsRule, CSSStyleSheet* parent) - : CSSGroupingRule(supportsRule, parent) {} + : CSSConditionRule(supportsRule, parent) {} String CSSSupportsRule::cssText() const { StringBuilder result; @@ -50,8 +50,4 @@ return result.toString(); } -String CSSSupportsRule::conditionText() const { - return toStyleRuleSupports(m_groupRule.get())->conditionText(); -} - } // namespace blink
diff --git a/third_party/WebKit/Source/core/css/CSSSupportsRule.h b/third_party/WebKit/Source/core/css/CSSSupportsRule.h index ad78da9..e883b250 100644 --- a/third_party/WebKit/Source/core/css/CSSSupportsRule.h +++ b/third_party/WebKit/Source/core/css/CSSSupportsRule.h
@@ -29,13 +29,13 @@ #ifndef CSSSupportsRule_h #define CSSSupportsRule_h -#include "core/css/CSSGroupingRule.h" +#include "core/css/CSSConditionRule.h" namespace blink { class StyleRuleSupports; -class CSSSupportsRule final : public CSSGroupingRule { +class CSSSupportsRule final : public CSSConditionRule { DEFINE_WRAPPERTYPEINFO(); public: @@ -48,10 +48,6 @@ String cssText() const override; - String conditionText() const; - - DEFINE_INLINE_VIRTUAL_TRACE() { CSSGroupingRule::trace(visitor); } - private: CSSSupportsRule(StyleRuleSupports*, CSSStyleSheet*);
diff --git a/third_party/WebKit/Source/core/css/CSSSupportsRule.idl b/third_party/WebKit/Source/core/css/CSSSupportsRule.idl index ce57469..778a66fd8 100644 --- a/third_party/WebKit/Source/core/css/CSSSupportsRule.idl +++ b/third_party/WebKit/Source/core/css/CSSSupportsRule.idl
@@ -28,13 +28,5 @@ // http://dev.w3.org/csswg/css-conditional/#the-csssupportsrule-interface -// TODO(foolip): CSSSupportsRule should inherit from CSSConditionRule and -// inherit all members. -interface CSSSupportsRule : CSSRule { - // http://dev.w3.org/csswg/css-conditional/#the-cssconditionrule-interface - readonly attribute DOMString conditionText; - // http://dev.w3.org/csswg/cssom/#the-cssgroupingrule-interface - [SameObject] readonly attribute CSSRuleList cssRules; - [RaisesException] unsigned long insertRule(DOMString rule, unsigned long index); - [RaisesException] void deleteRule(unsigned long index); +interface CSSSupportsRule : CSSConditionRule { };
diff --git a/third_party/WebKit/Source/core/css/StyleRule.cpp b/third_party/WebKit/Source/core/css/StyleRule.cpp index ba0557f..9bb6e3e 100644 --- a/third_party/WebKit/Source/core/css/StyleRule.cpp +++ b/third_party/WebKit/Source/core/css/StyleRule.cpp
@@ -298,32 +298,45 @@ StyleRuleBase::traceAfterDispatch(visitor); } +StyleRuleCondition::StyleRuleCondition( + RuleType type, + HeapVector<Member<StyleRuleBase>>& adoptRules) + : StyleRuleGroup(type, adoptRules) {} + +StyleRuleCondition::StyleRuleCondition( + RuleType type, + const String& conditionText, + HeapVector<Member<StyleRuleBase>>& adoptRules) + : StyleRuleGroup(type, adoptRules), m_conditionText(conditionText) {} + +StyleRuleCondition::StyleRuleCondition(const StyleRuleCondition& condition) + : StyleRuleGroup(condition), m_conditionText(condition.m_conditionText) {} + StyleRuleMedia::StyleRuleMedia(MediaQuerySet* media, HeapVector<Member<StyleRuleBase>>& adoptRules) - : StyleRuleGroup(Media, adoptRules), m_mediaQueries(media) {} + : StyleRuleCondition(Media, adoptRules), m_mediaQueries(media) {} -StyleRuleMedia::StyleRuleMedia(const StyleRuleMedia& o) : StyleRuleGroup(o) { - if (o.m_mediaQueries) - m_mediaQueries = o.m_mediaQueries->copy(); +StyleRuleMedia::StyleRuleMedia(const StyleRuleMedia& media) + : StyleRuleCondition(media) { + if (media.m_mediaQueries) + m_mediaQueries = media.m_mediaQueries->copy(); } DEFINE_TRACE_AFTER_DISPATCH(StyleRuleMedia) { visitor->trace(m_mediaQueries); - StyleRuleGroup::traceAfterDispatch(visitor); + StyleRuleCondition::traceAfterDispatch(visitor); } StyleRuleSupports::StyleRuleSupports( const String& conditionText, bool conditionIsSupported, HeapVector<Member<StyleRuleBase>>& adoptRules) - : StyleRuleGroup(Supports, adoptRules), - m_conditionText(conditionText), + : StyleRuleCondition(Supports, conditionText, adoptRules), m_conditionIsSupported(conditionIsSupported) {} -StyleRuleSupports::StyleRuleSupports(const StyleRuleSupports& o) - : StyleRuleGroup(o), - m_conditionText(o.m_conditionText), - m_conditionIsSupported(o.m_conditionIsSupported) {} +StyleRuleSupports::StyleRuleSupports(const StyleRuleSupports& supports) + : StyleRuleCondition(supports), + m_conditionIsSupported(supports.m_conditionIsSupported) {} StyleRuleViewport::StyleRuleViewport(StylePropertySet* properties) : StyleRuleBase(Viewport), m_properties(properties) {}
diff --git a/third_party/WebKit/Source/core/css/StyleRule.h b/third_party/WebKit/Source/core/css/StyleRule.h index db4533d..63c8721a 100644 --- a/third_party/WebKit/Source/core/css/StyleRule.h +++ b/third_party/WebKit/Source/core/css/StyleRule.h
@@ -195,7 +195,24 @@ HeapVector<Member<StyleRuleBase>> m_childRules; }; -class CORE_EXPORT StyleRuleMedia : public StyleRuleGroup { +class CORE_EXPORT StyleRuleCondition : public StyleRuleGroup { + public: + String conditionText() const { return m_conditionText; } + + DEFINE_INLINE_TRACE_AFTER_DISPATCH() { + StyleRuleGroup::traceAfterDispatch(visitor); + } + + protected: + StyleRuleCondition(RuleType, HeapVector<Member<StyleRuleBase>>& adoptRule); + StyleRuleCondition(RuleType, + const String& conditionText, + HeapVector<Member<StyleRuleBase>>& adoptRule); + StyleRuleCondition(const StyleRuleCondition&); + String m_conditionText; +}; + +class CORE_EXPORT StyleRuleMedia : public StyleRuleCondition { public: static StyleRuleMedia* create(MediaQuerySet* media, HeapVector<Member<StyleRuleBase>>& adoptRules) { @@ -215,7 +232,7 @@ Member<MediaQuerySet> m_mediaQueries; }; -class StyleRuleSupports : public StyleRuleGroup { +class StyleRuleSupports : public StyleRuleCondition { public: static StyleRuleSupports* create( const String& conditionText, @@ -225,12 +242,11 @@ adoptRules); } - String conditionText() const { return m_conditionText; } bool conditionIsSupported() const { return m_conditionIsSupported; } StyleRuleSupports* copy() const { return new StyleRuleSupports(*this); } DEFINE_INLINE_TRACE_AFTER_DISPATCH() { - StyleRuleGroup::traceAfterDispatch(visitor); + StyleRuleCondition::traceAfterDispatch(visitor); } private:
diff --git a/third_party/WebKit/Source/core/css/StyleSheetList.cpp b/third_party/WebKit/Source/core/css/StyleSheetList.cpp index 3d90339..7d61ed5 100644 --- a/third_party/WebKit/Source/core/css/StyleSheetList.cpp +++ b/third_party/WebKit/Source/core/css/StyleSheetList.cpp
@@ -33,8 +33,8 @@ StyleSheetList::StyleSheetList(TreeScope* treeScope) : m_treeScope(treeScope) {} -inline const HeapVector<Member<StyleSheet>>& StyleSheetList::styleSheets() - const { +inline const HeapVector<TraceWrapperMember<StyleSheet>>& +StyleSheetList::styleSheets() const { return document()->styleEngine().styleSheetsForStyleSheetList(*m_treeScope); } @@ -43,7 +43,7 @@ } StyleSheet* StyleSheetList::item(unsigned index) { - const HeapVector<Member<StyleSheet>>& sheets = styleSheets(); + const HeapVector<TraceWrapperMember<StyleSheet>>& sheets = styleSheets(); return index < sheets.size() ? sheets[index].get() : nullptr; }
diff --git a/third_party/WebKit/Source/core/css/StyleSheetList.h b/third_party/WebKit/Source/core/css/StyleSheetList.h index 3dcd4be..fb06a5c 100644 --- a/third_party/WebKit/Source/core/css/StyleSheetList.h +++ b/third_party/WebKit/Source/core/css/StyleSheetList.h
@@ -21,7 +21,7 @@ #ifndef StyleSheetList_h #define StyleSheetList_h -#include "bindings/core/v8/ScriptWrappable.h" +#include "bindings/core/v8/TraceWrapperMember.h" #include "core/css/CSSStyleSheet.h" #include "core/dom/TreeScope.h" #include "platform/heap/Handle.h" @@ -57,7 +57,7 @@ private: explicit StyleSheetList(TreeScope*); - const HeapVector<Member<StyleSheet>>& styleSheets() const; + const HeapVector<TraceWrapperMember<StyleSheet>>& styleSheets() const; Member<TreeScope> m_treeScope; };
diff --git a/third_party/WebKit/Source/core/css/cssom/CSSCalcLength.cpp b/third_party/WebKit/Source/core/css/cssom/CSSCalcLength.cpp index c01581d0..bc8c179 100644 --- a/third_party/WebKit/Source/core/css/cssom/CSSCalcLength.cpp +++ b/third_party/WebKit/Source/core/css/cssom/CSSCalcLength.cpp
@@ -40,28 +40,30 @@ CSSCalcLength* result = new CSSCalcLength(); int numSet = 0; -#define setFromDictValue(name, camelName, primitiveName) \ +#define SET_FROM_DICT_VALUE(name, camelName, primitiveName) \ if (dictionary.has##camelName()) { \ result->set(dictionary.name(), \ CSSPrimitiveValue::UnitType::primitiveName); \ numSet++; \ } - setFromDictValue(px, Px, Pixels) - setFromDictValue(percent, Percent, Percentage) - setFromDictValue(em, Em, Ems) setFromDictValue(ex, Ex, Exs) - setFromDictValue(ch, Ch, Chs) setFromDictValue(rem, Rem, Rems) - setFromDictValue(vw, Vw, ViewportWidth) - setFromDictValue(vh, Vh, ViewportHeight) setFromDictValue( - vmin, Vmin, ViewportMin) - setFromDictValue(vmax, Vmax, ViewportMax) - setFromDictValue(cm, Cm, Centimeters) - setFromDictValue(mm, Mm, Millimeters) - setFromDictValue(in, In, Inches) - setFromDictValue(pc, Pc, Picas) - setFromDictValue(pt, Pt, Points) + SET_FROM_DICT_VALUE(px, Px, Pixels) + SET_FROM_DICT_VALUE(percent, Percent, Percentage) + SET_FROM_DICT_VALUE(em, Em, Ems) + SET_FROM_DICT_VALUE(ex, Ex, Exs) + SET_FROM_DICT_VALUE(ch, Ch, Chs) + SET_FROM_DICT_VALUE(rem, Rem, Rems) + SET_FROM_DICT_VALUE(vw, Vw, ViewportWidth) + SET_FROM_DICT_VALUE(vh, Vh, ViewportHeight) + SET_FROM_DICT_VALUE(vmin, Vmin, ViewportMin) + SET_FROM_DICT_VALUE(vmax, Vmax, ViewportMax) + SET_FROM_DICT_VALUE(cm, Cm, Centimeters) + SET_FROM_DICT_VALUE(mm, Mm, Millimeters) + SET_FROM_DICT_VALUE(in, In, Inches) + SET_FROM_DICT_VALUE(pc, Pc, Picas) + SET_FROM_DICT_VALUE(pt, Pt, Points) - if (numSet == 0) { + if (numSet == 0) { exceptionState.throwTypeError( "Must specify at least one value in CSSCalcDictionary for creating a " "CSSCalcLength.");
diff --git a/third_party/WebKit/Source/core/css/cssom/CSSResourceValue.h b/third_party/WebKit/Source/core/css/cssom/CSSResourceValue.h index ce6d262..783fad71 100644 --- a/third_party/WebKit/Source/core/css/cssom/CSSResourceValue.h +++ b/third_party/WebKit/Source/core/css/cssom/CSSResourceValue.h
@@ -18,8 +18,6 @@ public: virtual ~CSSResourceValue() {} - StyleValueType type() const override { return ResourceType; } - const String state() const { switch (status()) { case Resource::Status::NotStarted:
diff --git a/third_party/WebKit/Source/core/css/cssom/CSSResourceValueTest.cpp b/third_party/WebKit/Source/core/css/cssom/CSSResourceValueTest.cpp index ecac71d..ddc1cb16 100644 --- a/third_party/WebKit/Source/core/css/cssom/CSSResourceValueTest.cpp +++ b/third_party/WebKit/Source/core/css/cssom/CSSResourceValueTest.cpp
@@ -13,15 +13,17 @@ class FakeCSSResourceValue : public CSSResourceValue { public: FakeCSSResourceValue(Resource::Status status) : m_status(status) {} + Resource::Status status() const override { return m_status; } CSSValue* toCSSValue() const override { return nullptr; } - - Resource::Status status() const override { return m_status; } + StyleValueType type() const override { return Unknown; } private: Resource::Status m_status; }; +} // namespace + TEST(CSSResourceValueTest, TestStatus) { EXPECT_EQ((new FakeCSSResourceValue(Resource::NotStarted))->state(), "unloaded"); @@ -32,6 +34,4 @@ "error"); } -} // namespace - } // namespace blink
diff --git a/third_party/WebKit/Source/core/css/cssom/CSSStyleImageValue.cpp b/third_party/WebKit/Source/core/css/cssom/CSSStyleImageValue.cpp index d0d3873..ac8e99b 100644 --- a/third_party/WebKit/Source/core/css/cssom/CSSStyleImageValue.cpp +++ b/third_party/WebKit/Source/core/css/cssom/CSSStyleImageValue.cpp
@@ -22,10 +22,7 @@ double CSSStyleImageValue::intrinsicRatio(bool& isNull) { isNull = isCachePending(); - if (isNull) { - return 0; - } - if (intrinsicHeight(isNull) == 0) { + if (isNull || intrinsicHeight(isNull) == 0) { isNull = true; return 0; }
diff --git a/third_party/WebKit/Source/core/css/cssom/CSSStyleImageValue.h b/third_party/WebKit/Source/core/css/cssom/CSSStyleImageValue.h index 5461df6b..1c6278c0 100644 --- a/third_party/WebKit/Source/core/css/cssom/CSSStyleImageValue.h +++ b/third_party/WebKit/Source/core/css/cssom/CSSStyleImageValue.h
@@ -25,8 +25,6 @@ public: virtual ~CSSStyleImageValue() {} - StyleValueType type() const override { return ImageType; } - double intrinsicWidth(bool& isNull) const; double intrinsicHeight(bool& isNull) const; double intrinsicRatio(bool& isNull); @@ -49,7 +47,6 @@ DEFINE_INLINE_VIRTUAL_TRACE() { visitor->trace(m_imageValue); - CSSStyleValue::trace(visitor); CSSResourceValue::trace(visitor); } @@ -57,10 +54,8 @@ CSSStyleImageValue(const CSSImageValue* imageValue) : m_imageValue(imageValue) {} - Member<const CSSImageValue> m_imageValue; - virtual LayoutSize imageLayoutSize() const { - DCHECK(!m_imageValue->isCachePending()); + DCHECK(!isCachePending()); return m_imageValue->cachedImage()->cachedImage()->imageSize( DoNotRespectImageOrientation, 1, ImageResource::IntrinsicSize); } @@ -73,8 +68,12 @@ return m_imageValue->cachedImage()->cachedImage()->getStatus(); } + const CSSImageValue* cssImageValue() const { return m_imageValue.get(); }; + private: PassRefPtr<Image> image() const; + + Member<const CSSImageValue> m_imageValue; }; } // namespace blink
diff --git a/third_party/WebKit/Source/core/css/cssom/CSSStyleImageValueTest.cpp b/third_party/WebKit/Source/core/css/cssom/CSSStyleImageValueTest.cpp index 34734daa..ebbce1f 100644 --- a/third_party/WebKit/Source/core/css/cssom/CSSStyleImageValueTest.cpp +++ b/third_party/WebKit/Source/core/css/cssom/CSSStyleImageValueTest.cpp
@@ -19,16 +19,19 @@ m_cachePending(cachePending), m_layoutSize(layoutSize) {} - bool m_cachePending; - LayoutSize m_layoutSize; + bool isCachePending() const override { return m_cachePending; } + LayoutSize imageLayoutSize() const override { return m_layoutSize; } CSSValue* toCSSValue() const override { return nullptr; } + StyleValueType type() const override { return Unknown; } - bool isCachePending() const override { return m_cachePending; } - - LayoutSize imageLayoutSize() const override { return m_layoutSize; } + private: + bool m_cachePending; + LayoutSize m_layoutSize; }; +} // namespace + TEST(CSSStyleImageValueTest, PendingCache) { FakeCSSStyleImageValue* styleImageValue = new FakeCSSStyleImageValue( CSSImageValue::create(""), true, LayoutSize(100, 100)); @@ -49,6 +52,4 @@ EXPECT_FALSE(isNull); } -} // namespace - } // namespace blink
diff --git a/third_party/WebKit/Source/core/css/cssom/CSSStyleValue.h b/third_party/WebKit/Source/core/css/cssom/CSSStyleValue.h index 0c98cc55..6dc5df42 100644 --- a/third_party/WebKit/Source/core/css/cssom/CSSStyleValue.h +++ b/third_party/WebKit/Source/core/css/cssom/CSSStyleValue.h
@@ -25,14 +25,13 @@ public: enum StyleValueType { + // This list corresponds to each non-abstract subclass. Unknown, AngleType, CalcLengthType, - ImageType, KeywordType, NumberType, PositionType, - ResourceType, SimpleLengthType, TransformType, URLImageType,
diff --git a/third_party/WebKit/Source/core/css/cssom/CSSURLImageValue.h b/third_party/WebKit/Source/core/css/cssom/CSSURLImageValue.h index df8c491..34d02892 100644 --- a/third_party/WebKit/Source/core/css/cssom/CSSURLImageValue.h +++ b/third_party/WebKit/Source/core/css/cssom/CSSURLImageValue.h
@@ -23,9 +23,9 @@ StyleValueType type() const override { return URLImageType; } - const CSSValue* toCSSValue() const { return m_imageValue.get(); } + const CSSValue* toCSSValue() const override { return cssImageValue(); } - const String& url() const { return m_imageValue->url(); } + const String& url() const { return cssImageValue()->url(); } private: explicit CSSURLImageValue(const CSSImageValue* imageValue)
diff --git a/third_party/WebKit/Source/core/css/cssom/CSSURLImageValueTest.cpp b/third_party/WebKit/Source/core/css/cssom/CSSURLImageValueTest.cpp index fbf834b0..d841a6e 100644 --- a/third_party/WebKit/Source/core/css/cssom/CSSURLImageValueTest.cpp +++ b/third_party/WebKit/Source/core/css/cssom/CSSURLImageValueTest.cpp
@@ -19,6 +19,8 @@ EXPECT_TRUE(isNull); } +} // namespace + TEST(CSSURLImageValueTest, CreateURLImageValueFromURL) { checkNullURLImageValue(CSSURLImageValue::create("http://localhost")); } @@ -28,6 +30,4 @@ CSSURLImageValue::create(CSSImageValue::create("http://localhost"))); } -} // namespace - } // namespace blink
diff --git a/third_party/WebKit/Source/core/css/cssom/CSSUnparsedValue.cpp b/third_party/WebKit/Source/core/css/cssom/CSSUnparsedValue.cpp index 6114e7a..68cca7a 100644 --- a/third_party/WebKit/Source/core/css/cssom/CSSUnparsedValue.cpp +++ b/third_party/WebKit/Source/core/css/cssom/CSSUnparsedValue.cpp
@@ -50,6 +50,7 @@ unparsedValue = nullptr; else unparsedValue = CSSUnparsedValue::create(fragments); + CSSStyleVariableReferenceValue* variableReference = CSSStyleVariableReferenceValue::create(variableName.toString(), unparsedValue); @@ -79,9 +80,10 @@ range.consume().serialize(builder); } } - if (!builder.isEmpty()) + if (!builder.isEmpty()) { fragments.append( StringOrCSSVariableReferenceValue::fromString(builder.toString())); + } return fragments; } @@ -102,22 +104,23 @@ StringBuilder tokens; for (unsigned i = 0; i < m_fragments.size(); i++) { - if (i) + if (i) { tokens.append("/**/"); - if (m_fragments[i].isString()) + } + if (m_fragments[i].isString()) { tokens.append(m_fragments[i].getAsString()); - else if (m_fragments[i].isCSSVariableReferenceValue()) + } else if (m_fragments[i].isCSSVariableReferenceValue()) { tokens.append( m_fragments[i].getAsCSSVariableReferenceValue()->variable()); - else + } else { NOTREACHED(); + } } CSSTokenizer::Scope scope(tokens.toString()); - - bool isAnimationTainted = false; - return CSSVariableReferenceValue::create( - CSSVariableData::create(scope.tokenRange(), isAnimationTainted, true)); + return CSSVariableReferenceValue::create(CSSVariableData::create( + scope.tokenRange(), false /* isAnimationTainted */, + true /* needsVariableResolution */)); } } // namespace blink
diff --git a/third_party/WebKit/Source/core/css/cssom/CSSUnparsedValue.h b/third_party/WebKit/Source/core/css/cssom/CSSUnparsedValue.h index 4ed43ba..c3b62213 100644 --- a/third_party/WebKit/Source/core/css/cssom/CSSUnparsedValue.h +++ b/third_party/WebKit/Source/core/css/cssom/CSSUnparsedValue.h
@@ -48,8 +48,20 @@ : CSSStyleValue(), m_fragments(fragments) {} private: + static CSSUnparsedValue* fromString(String string) { + HeapVector<StringOrCSSVariableReferenceValue> fragments; + fragments.append(StringOrCSSVariableReferenceValue::fromString(string)); + return create(fragments); + } + IterationSource* startIteration(ScriptState*, ExceptionState&) override; + FRIEND_TEST_ALL_PREFIXES(CSSUnparsedValueTest, ListOfStrings); + FRIEND_TEST_ALL_PREFIXES(CSSUnparsedValueTest, + ListOfCSSVariableReferenceValues); + FRIEND_TEST_ALL_PREFIXES(CSSUnparsedValueTest, MixedList); + FRIEND_TEST_ALL_PREFIXES(CSSVariableReferenceValueTest, MixedList); + HeapVector<StringOrCSSVariableReferenceValue> m_fragments; };
diff --git a/third_party/WebKit/Source/core/css/cssom/CSSUnparsedValueTest.cpp b/third_party/WebKit/Source/core/css/cssom/CSSUnparsedValueTest.cpp index be587b9..94a24cf 100644 --- a/third_party/WebKit/Source/core/css/cssom/CSSUnparsedValueTest.cpp +++ b/third_party/WebKit/Source/core/css/cssom/CSSUnparsedValueTest.cpp
@@ -11,43 +11,26 @@ namespace { -StringOrCSSVariableReferenceValue getStringOrCSSVariableReferenceValue( - String str) { - StringOrCSSVariableReferenceValue temp; - temp.setString(str); - return temp; -} - -StringOrCSSVariableReferenceValue getStringOrCSSVariableReferenceValue( - CSSStyleVariableReferenceValue* ref) { - StringOrCSSVariableReferenceValue temp; - temp.setCSSVariableReferenceValue(ref); - return temp; -} - -CSSUnparsedValue* unparsedValueFromString(String str) { - HeapVector<StringOrCSSVariableReferenceValue> fragments; - fragments.append(getStringOrCSSVariableReferenceValue(str)); - return CSSUnparsedValue::create(fragments); -} - CSSUnparsedValue* unparsedValueFromCSSVariableReferenceValue( - CSSStyleVariableReferenceValue* ref) { + CSSStyleVariableReferenceValue* variableReferenceValue) { HeapVector<StringOrCSSVariableReferenceValue> fragments; - fragments.append(getStringOrCSSVariableReferenceValue(ref)); + fragments.append( + StringOrCSSVariableReferenceValue::fromCSSVariableReferenceValue( + variableReferenceValue)); return CSSUnparsedValue::create(fragments); } +} // namespace + TEST(CSSUnparsedValueTest, EmptyList) { HeapVector<StringOrCSSVariableReferenceValue> fragments; - CSSUnparsedValue* unparsedValue = CSSUnparsedValue::create(fragments); EXPECT_EQ(unparsedValue->size(), 0UL); } -TEST(CSSUnparsedValueTest, ListOfString) { - CSSUnparsedValue* unparsedValue = unparsedValueFromString("Str"); +TEST(CSSUnparsedValueTest, ListOfStrings) { + CSSUnparsedValue* unparsedValue = CSSUnparsedValue::fromString("string"); EXPECT_EQ(unparsedValue->size(), 1UL); @@ -55,15 +38,16 @@ EXPECT_FALSE(unparsedValue->fragmentAtIndex(0).isNull()); EXPECT_FALSE(unparsedValue->fragmentAtIndex(0).isCSSVariableReferenceValue()); - EXPECT_EQ(unparsedValue->fragmentAtIndex(0).getAsString(), "Str"); + EXPECT_EQ(unparsedValue->fragmentAtIndex(0).getAsString(), "string"); } -TEST(CSSUnparsedValueTest, ListOfCSSVariableReferenceValue) { - CSSStyleVariableReferenceValue* ref = CSSStyleVariableReferenceValue::create( - "Ref", unparsedValueFromString("Str")); +TEST(CSSUnparsedValueTest, ListOfCSSVariableReferenceValues) { + CSSStyleVariableReferenceValue* variableReferenceValue = + CSSStyleVariableReferenceValue::create( + "Ref", CSSUnparsedValue::fromString("string")); CSSUnparsedValue* unparsedValue = - unparsedValueFromCSSVariableReferenceValue(ref); + unparsedValueFromCSSVariableReferenceValue(variableReferenceValue); EXPECT_EQ(unparsedValue->size(), 1UL); @@ -72,25 +56,20 @@ EXPECT_TRUE(unparsedValue->fragmentAtIndex(0).isCSSVariableReferenceValue()); EXPECT_EQ(unparsedValue->fragmentAtIndex(0).getAsCSSVariableReferenceValue(), - ref); + variableReferenceValue); } -TEST(CSSUnparsedValueTest, MixedContents) { +TEST(CSSUnparsedValueTest, MixedList) { + CSSStyleVariableReferenceValue* variableReferenceValue = + CSSStyleVariableReferenceValue::create( + "Ref", CSSUnparsedValue::fromString("string")); + HeapVector<StringOrCSSVariableReferenceValue> fragments; - - StringOrCSSVariableReferenceValue x = - getStringOrCSSVariableReferenceValue("Str"); - - CSSStyleVariableReferenceValue* ref = CSSStyleVariableReferenceValue::create( - "Ref", unparsedValueFromString("Str")); - StringOrCSSVariableReferenceValue y = - getStringOrCSSVariableReferenceValue(ref); - - StringOrCSSVariableReferenceValue z; - - fragments.append(x); - fragments.append(y); - fragments.append(z); + fragments.append(StringOrCSSVariableReferenceValue::fromString("string")); + fragments.append( + StringOrCSSVariableReferenceValue::fromCSSVariableReferenceValue( + variableReferenceValue)); + fragments.append(StringOrCSSVariableReferenceValue()); CSSUnparsedValue* unparsedValue = CSSUnparsedValue::create(fragments); @@ -98,16 +77,14 @@ EXPECT_TRUE(unparsedValue->fragmentAtIndex(0).isString()); EXPECT_FALSE(unparsedValue->fragmentAtIndex(0).isCSSVariableReferenceValue()); - EXPECT_EQ(unparsedValue->fragmentAtIndex(0).getAsString(), "Str"); + EXPECT_EQ(unparsedValue->fragmentAtIndex(0).getAsString(), "string"); EXPECT_TRUE(unparsedValue->fragmentAtIndex(1).isCSSVariableReferenceValue()); EXPECT_FALSE(unparsedValue->fragmentAtIndex(1).isString()); EXPECT_EQ(unparsedValue->fragmentAtIndex(1).getAsCSSVariableReferenceValue(), - ref); + variableReferenceValue); EXPECT_TRUE(unparsedValue->fragmentAtIndex(2).isNull()); } -} // namespace - } // namespace blink
diff --git a/third_party/WebKit/Source/core/css/cssom/CSSVariableReferenceValueTest.cpp b/third_party/WebKit/Source/core/css/cssom/CSSVariableReferenceValueTest.cpp index 4cf006cb..4cbe695 100644 --- a/third_party/WebKit/Source/core/css/cssom/CSSVariableReferenceValueTest.cpp +++ b/third_party/WebKit/Source/core/css/cssom/CSSVariableReferenceValueTest.cpp
@@ -9,63 +9,33 @@ namespace blink { -namespace { - -StringOrCSSVariableReferenceValue getStringOrCSSVariableReferenceValue( - String str) { - StringOrCSSVariableReferenceValue temp; - temp.setString(str); - return temp; -} - -StringOrCSSVariableReferenceValue getStringOrCSSVariableReferenceValue( - CSSStyleVariableReferenceValue* ref) { - StringOrCSSVariableReferenceValue temp; - temp.setCSSVariableReferenceValue(ref); - return temp; -} - -CSSUnparsedValue* unparsedValueFromString(String str) { - HeapVector<StringOrCSSVariableReferenceValue> fragments; - fragments.append(getStringOrCSSVariableReferenceValue(str)); - return CSSUnparsedValue::create(fragments); -} - TEST(CSSVariableReferenceValueTest, EmptyList) { HeapVector<StringOrCSSVariableReferenceValue> fragments; - CSSUnparsedValue* unparsedValue = CSSUnparsedValue::create(fragments); - CSSStyleVariableReferenceValue* ref = + CSSStyleVariableReferenceValue* variableReferenceValue = CSSStyleVariableReferenceValue::create("test", unparsedValue); - EXPECT_EQ(ref->variable(), "test"); - EXPECT_EQ(ref->fallback(), unparsedValue); + EXPECT_EQ(variableReferenceValue->variable(), "test"); + EXPECT_EQ(variableReferenceValue->fallback(), unparsedValue); } TEST(CSSVariableReferenceValueTest, MixedList) { HeapVector<StringOrCSSVariableReferenceValue> fragments; - - StringOrCSSVariableReferenceValue x = - getStringOrCSSVariableReferenceValue("Str"); - StringOrCSSVariableReferenceValue y = getStringOrCSSVariableReferenceValue( - CSSStyleVariableReferenceValue::create( - "Variable", unparsedValueFromString("Fallback"))); - StringOrCSSVariableReferenceValue z; - - fragments.append(x); - fragments.append(y); - fragments.append(z); + fragments.append(StringOrCSSVariableReferenceValue::fromString("string")); + fragments.append( + StringOrCSSVariableReferenceValue::fromCSSVariableReferenceValue( + CSSStyleVariableReferenceValue::create( + "Variable", CSSUnparsedValue::fromString("Fallback")))); + fragments.append(StringOrCSSVariableReferenceValue()); CSSUnparsedValue* unparsedValue = CSSUnparsedValue::create(fragments); - CSSStyleVariableReferenceValue* ref = + CSSStyleVariableReferenceValue* variableReferenceValue = CSSStyleVariableReferenceValue::create("test", unparsedValue); - EXPECT_EQ(ref->variable(), "test"); - EXPECT_EQ(ref->fallback(), unparsedValue); + EXPECT_EQ(variableReferenceValue->variable(), "test"); + EXPECT_EQ(variableReferenceValue->fallback(), unparsedValue); } -} // namespace - } // namespace blink
diff --git a/third_party/WebKit/Source/core/css/resolver/ViewportStyleResolver.cpp b/third_party/WebKit/Source/core/css/resolver/ViewportStyleResolver.cpp index c2367a1..91ba92d 100644 --- a/third_party/WebKit/Source/core/css/resolver/ViewportStyleResolver.cpp +++ b/third_party/WebKit/Source/core/css/resolver/ViewportStyleResolver.cpp
@@ -32,13 +32,16 @@ #include "core/CSSValueKeywords.h" #include "core/css/CSSDefaultStyleSheets.h" #include "core/css/CSSPrimitiveValueMappings.h" +#include "core/css/CSSStyleSheet.h" #include "core/css/CSSToLengthConversionData.h" #include "core/css/MediaValuesInitialViewport.h" #include "core/css/StylePropertySet.h" #include "core/css/StyleRule.h" +#include "core/css/StyleRuleImport.h" #include "core/css/StyleSheetContents.h" #include "core/css/resolver/ScopedStyleResolver.h" #include "core/dom/Document.h" +#include "core/dom/DocumentStyleSheetCollection.h" #include "core/dom/NodeComputedStyle.h" #include "core/dom/ViewportDescription.h" #include "core/frame/Settings.h" @@ -47,12 +50,21 @@ namespace blink { ViewportStyleResolver::ViewportStyleResolver(Document& document) - : m_document(document), m_hasAuthorStyle(false) { + : m_document(document) { DCHECK(document.frame()); m_initialViewportMedium = new MediaQueryEvaluator( MediaValuesInitialViewport::create(*document.frame())); } +void ViewportStyleResolver::reset() { + m_viewportDependentMediaQueryResults.clear(); + m_deviceDependentMediaQueryResults.clear(); + m_propertySet = nullptr; + m_hasAuthorStyle = false; + m_hasViewportUnits = false; + m_needsUpdate = NoUpdate; +} + void ViewportStyleResolver::collectViewportRulesFromUASheets() { CSSDefaultStyleSheets& defaultStyleSheets = CSSDefaultStyleSheets::instance(); WebViewportStyle viewportStyle = m_document->settings() @@ -82,6 +94,7 @@ } void ViewportStyleResolver::collectViewportRules() { + reset(); collectViewportRulesFromUASheets(); if (ScopedStyleResolver* scopedResolver = m_document->scopedStyleResolver()) scopedResolver->collectViewportRulesTo(this); @@ -98,7 +111,9 @@ } else if (rule->isMediaRule()) { StyleRuleMedia* mediaRule = toStyleRuleMedia(rule); if (!mediaRule->mediaQueries() || - m_initialViewportMedium->eval(mediaRule->mediaQueries())) + m_initialViewportMedium->eval(mediaRule->mediaQueries(), + &m_viewportDependentMediaQueryResults, + &m_deviceDependentMediaQueryResults)) collectViewportChildRules(mediaRule->childRules(), origin); } else if (rule->isSupportsRule()) { StyleRuleSupports* supportsRule = toStyleRuleSupports(rule); @@ -108,6 +123,42 @@ } } +void ViewportStyleResolver::collectViewportRulesFromImports( + StyleSheetContents& contents) { + for (const auto& importRule : contents.importRules()) { + if (!importRule->styleSheet()) + continue; + if (!importRule->styleSheet()->hasViewportRule()) + continue; + if (importRule->mediaQueries() && + m_initialViewportMedium->eval(importRule->mediaQueries(), + &m_viewportDependentMediaQueryResults, + &m_deviceDependentMediaQueryResults)) + collectViewportRulesFromAuthorSheetContents(*importRule->styleSheet()); + } +} + +void ViewportStyleResolver::collectViewportRulesFromAuthorSheetContents( + StyleSheetContents& contents) { + collectViewportRulesFromImports(contents); + if (contents.hasViewportRule()) + collectViewportChildRules(contents.childRules(), AuthorOrigin); +} + +void ViewportStyleResolver::collectViewportRulesFromAuthorSheet( + const CSSStyleSheet& sheet) { + DCHECK(sheet.contents()); + StyleSheetContents& contents = *sheet.contents(); + if (!contents.hasViewportRule() && contents.importRules().isEmpty()) + return; + if (sheet.mediaQueries() && + !m_initialViewportMedium->eval(sheet.mediaQueries(), + &m_viewportDependentMediaQueryResults, + &m_deviceDependentMediaQueryResults)) + return; + collectViewportRulesFromAuthorSheetContents(contents); +} + void ViewportStyleResolver::collectViewportRules(RuleSet* rules, Origin origin) { rules->compactRulesIfNeeded(); @@ -163,9 +214,6 @@ description.orientation = viewportArgumentValue(CSSPropertyOrientation); m_document->setViewportDescription(description); - - m_propertySet = nullptr; - m_hasAuthorStyle = false; } float ViewportStyleResolver::viewportArgumentValue(CSSPropertyID id) const { @@ -226,7 +274,7 @@ return defaultValue; } -Length ViewportStyleResolver::viewportLengthValue(CSSPropertyID id) const { +Length ViewportStyleResolver::viewportLengthValue(CSSPropertyID id) { ASSERT(id == CSSPropertyMaxHeight || id == CSSPropertyMinHeight || id == CSSPropertyMaxWidth || id == CSSPropertyMinWidth); @@ -256,17 +304,57 @@ Length result = primitiveValue->convertToLength( CSSToLengthConversionData(documentStyle, fontSizes, viewportSize, 1.0f)); - if (documentStyle->hasViewportUnits()) + if (documentStyle->hasViewportUnits()) { + // TODO (rune@opera.com): remove the setHasViewportUnit when + // initialViewportChanged() goes live. m_document->setHasViewportUnits(); + m_hasViewportUnits = true; + } documentStyle->setHasViewportUnits(documentStyleHasViewportUnits); return result; } +void ViewportStyleResolver::initialViewportChanged() { + if (m_needsUpdate == CollectRules) + return; + + auto& results = m_viewportDependentMediaQueryResults; + for (unsigned i = 0; i < results.size(); i++) { + if (m_initialViewportMedium->eval(results[i]->expression()) != + results[i]->result()) { + m_needsUpdate = CollectRules; + return; + } + } + if (m_hasViewportUnits) + m_needsUpdate = Resolve; +} + +void ViewportStyleResolver::setNeedsCollectRules() { + m_needsUpdate = CollectRules; +} + +void ViewportStyleResolver::updateViewport( + DocumentStyleSheetCollection& collection) { + if (m_needsUpdate == NoUpdate) + return; + if (m_needsUpdate == CollectRules) { + reset(); + collectViewportRulesFromUASheets(); + if (RuntimeEnabledFeatures::cssViewportEnabled()) + collection.collectViewportRules(*this); + } + resolve(); + m_needsUpdate = NoUpdate; +} + DEFINE_TRACE(ViewportStyleResolver) { visitor->trace(m_document); visitor->trace(m_propertySet); visitor->trace(m_initialViewportMedium); + visitor->trace(m_viewportDependentMediaQueryResults); + visitor->trace(m_deviceDependentMediaQueryResults); } } // namespace blink
diff --git a/third_party/WebKit/Source/core/css/resolver/ViewportStyleResolver.h b/third_party/WebKit/Source/core/css/resolver/ViewportStyleResolver.h index 913bbc2..4261e1b 100644 --- a/third_party/WebKit/Source/core/css/resolver/ViewportStyleResolver.h +++ b/third_party/WebKit/Source/core/css/resolver/ViewportStyleResolver.h
@@ -38,6 +38,7 @@ namespace blink { class Document; +class DocumentStyleSheetCollection; class MutableStylePropertySet; class StyleRuleViewport; @@ -48,29 +49,45 @@ return new ViewportStyleResolver(document); } + void initialViewportChanged(); + void setNeedsCollectRules(); + void updateViewport(DocumentStyleSheetCollection&); + + void collectViewportRulesFromAuthorSheet(const CSSStyleSheet&); + enum Origin { UserAgentOrigin, AuthorOrigin }; void collectViewportRules(); void collectViewportRules(RuleSet*, Origin); - void resolve(); DECLARE_TRACE(); private: explicit ViewportStyleResolver(Document&); + void reset(); + void resolve(); + + enum UpdateType { NoUpdate, Resolve, CollectRules }; + void collectViewportRulesFromUASheets(); void collectViewportChildRules(const HeapVector<Member<StyleRuleBase>>&, Origin); + void collectViewportRulesFromImports(StyleSheetContents&); + void collectViewportRulesFromAuthorSheetContents(StyleSheetContents&); void addViewportRule(StyleRuleViewport&, Origin); float viewportArgumentValue(CSSPropertyID) const; - Length viewportLengthValue(CSSPropertyID) const; + Length viewportLengthValue(CSSPropertyID); Member<Document> m_document; Member<MutableStylePropertySet> m_propertySet; Member<MediaQueryEvaluator> m_initialViewportMedium; - bool m_hasAuthorStyle; + MediaQueryResultList m_viewportDependentMediaQueryResults; + MediaQueryResultList m_deviceDependentMediaQueryResults; + bool m_hasAuthorStyle = false; + bool m_hasViewportUnits = false; + UpdateType m_needsUpdate = CollectRules; }; } // namespace blink
diff --git a/third_party/WebKit/Source/core/dom/Document.cpp b/third_party/WebKit/Source/core/dom/Document.cpp index 11f5f61..fbff453b 100644 --- a/third_party/WebKit/Source/core/dom/Document.cpp +++ b/third_party/WebKit/Source/core/dom/Document.cpp
@@ -428,8 +428,7 @@ m_importsController(initializer.importsController()), m_contextFeatures(ContextFeatures::defaultSwitch()), m_wellFormed(false), - m_printing(false), - m_wasPrinting(false), + m_printing(NotPrinting), m_paginatedForScreen(false), m_compatibilityMode(NoQuirksMode), m_compatibilityModeLocked(false), @@ -1935,8 +1934,6 @@ resolver.clearStyleSharingList(); - m_wasPrinting = m_printing; - DCHECK(!needsStyleRecalc()); DCHECK(!childNeedsStyleRecalc()); DCHECK(inStyleRecalc()); @@ -5393,9 +5390,10 @@ EventListener* listener, const String& contextURL, const WTF::OrdinalNumber& contextLine) { + Element* element = node && node->isElementNode() ? toElement(node) : nullptr; if (!ContentSecurityPolicy::shouldBypassMainWorld(this) && !contentSecurityPolicy()->allowInlineEventHandler( - listener->code(), contextURL, contextLine)) + element, listener->code(), contextURL, contextLine)) return false; // HTML says that inline script needs browsing context to create its execution
diff --git a/third_party/WebKit/Source/core/dom/Document.h b/third_party/WebKit/Source/core/dom/Document.h index dbf2430..689ee02 100644 --- a/third_party/WebKit/Source/core/dom/Document.h +++ b/third_party/WebKit/Source/core/dom/Document.h
@@ -628,9 +628,14 @@ DocumentParser* parser() const { return m_parser.get(); } ScriptableDocumentParser* scriptableDocumentParser() const; - bool printing() const { return m_printing; } - void setPrinting(bool isPrinting) { m_printing = isPrinting; } - bool wasPrinting() const { return m_wasPrinting; } + // FinishingPrinting denotes that the non-printing layout state is being + // restored. + enum PrintingState { NotPrinting, Printing, FinishingPrinting }; + bool printing() const { return m_printing == Printing; } + bool finishingOrIsPrinting() { + return m_printing == Printing || m_printing == FinishingPrinting; + } + void setPrinting(PrintingState state) { m_printing = state; } bool paginatedForScreen() const { return m_paginatedForScreen; } void setPaginatedForScreen(bool p) { m_paginatedForScreen = p; } @@ -1438,8 +1443,7 @@ Member<CSSStyleSheet> m_elemSheet; - bool m_printing; - bool m_wasPrinting; + PrintingState m_printing; bool m_paginatedForScreen; CompatibilityMode m_compatibilityMode;
diff --git a/third_party/WebKit/Source/core/dom/DocumentStyleSheetCollection.cpp b/third_party/WebKit/Source/core/dom/DocumentStyleSheetCollection.cpp index 8e163a7..1a8d918 100644 --- a/third_party/WebKit/Source/core/dom/DocumentStyleSheetCollection.cpp +++ b/third_party/WebKit/Source/core/dom/DocumentStyleSheetCollection.cpp
@@ -29,6 +29,7 @@ #include "core/dom/DocumentStyleSheetCollection.h" #include "core/css/resolver/StyleResolver.h" +#include "core/css/resolver/ViewportStyleResolver.h" #include "core/dom/Document.h" #include "core/dom/DocumentStyleSheetCollector.h" #include "core/dom/ProcessingInstruction.h" @@ -130,9 +131,22 @@ collection->dispose(); } -DEFINE_TRACE_WRAPPERS(DocumentStyleSheetCollection) { - for (auto sheet : m_styleSheetsForStyleSheetList) { - visitor->traceWrappers(sheet); +void DocumentStyleSheetCollection::collectViewportRules( + ViewportStyleResolver& viewportResolver) { + for (Node* node : m_styleSheetCandidateNodes) { + StyleSheetCandidate candidate(*node); + + if (candidate.isImport()) + continue; + StyleSheet* sheet = candidate.sheet(); + if (!sheet) + continue; + if (!candidate.canBeActivated( + document().styleEngine().preferredStylesheetSetName())) + continue; + viewportResolver.collectViewportRulesFromAuthorSheet( + *toCSSStyleSheet(sheet)); } } + } // namespace blink
diff --git a/third_party/WebKit/Source/core/dom/DocumentStyleSheetCollection.h b/third_party/WebKit/Source/core/dom/DocumentStyleSheetCollection.h index dd7c15a..5219819 100644 --- a/third_party/WebKit/Source/core/dom/DocumentStyleSheetCollection.h +++ b/third_party/WebKit/Source/core/dom/DocumentStyleSheetCollection.h
@@ -38,6 +38,7 @@ class DocumentStyleSheetCollector; class StyleEngine; class TreeScope; +class ViewportStyleResolver; class DocumentStyleSheetCollection final : public TreeScopeStyleSheetCollection { @@ -50,13 +51,12 @@ void updateActiveStyleSheets(StyleEngine&, StyleResolverUpdateMode); void collectStyleSheets(StyleEngine&, DocumentStyleSheetCollector&); + void collectViewportRules(ViewportStyleResolver&); DEFINE_INLINE_VIRTUAL_TRACE() { TreeScopeStyleSheetCollection::trace(visitor); } - DECLARE_VIRTUAL_TRACE_WRAPPERS(); - private: explicit DocumentStyleSheetCollection(TreeScope&);
diff --git a/third_party/WebKit/Source/core/dom/DocumentStyleSheetCollector.cpp b/third_party/WebKit/Source/core/dom/DocumentStyleSheetCollector.cpp index 67fdbaa1..5cbea56 100644 --- a/third_party/WebKit/Source/core/dom/DocumentStyleSheetCollector.cpp +++ b/third_party/WebKit/Source/core/dom/DocumentStyleSheetCollector.cpp
@@ -35,39 +35,43 @@ namespace blink { DocumentStyleSheetCollector::DocumentStyleSheetCollector( - HeapVector<Member<StyleSheet>>& sheetsForList, - HeapVector<Member<CSSStyleSheet>>& activeList, - HeapHashSet<Member<Document>>& visitedDocuments) - : m_styleSheetsForStyleSheetList(sheetsForList), - m_activeAuthorStyleSheets(activeList), + StyleSheetCollection* collection, + HeapVector<Member<StyleSheet>>* sheetsForList, + HeapHashSet<Member<Document>>* visitedDocuments) + : m_collection(collection), + m_styleSheetsForStyleSheetList(sheetsForList), m_visitedDocuments(visitedDocuments) {} DocumentStyleSheetCollector::~DocumentStyleSheetCollector() {} void DocumentStyleSheetCollector::appendActiveStyleSheets( const HeapVector<Member<CSSStyleSheet>>& sheets) { - m_activeAuthorStyleSheets.appendVector(sheets); + DCHECK(m_collection); + m_collection->appendActiveStyleSheets(sheets); } void DocumentStyleSheetCollector::appendActiveStyleSheet(CSSStyleSheet* sheet) { - m_activeAuthorStyleSheets.append(sheet); + DCHECK(m_collection); + m_collection->appendActiveStyleSheet(sheet); } void DocumentStyleSheetCollector::appendSheetForList(StyleSheet* sheet) { - m_styleSheetsForStyleSheetList.append(sheet); + if (m_styleSheetsForStyleSheetList) { + m_styleSheetsForStyleSheetList->append(sheet); + } else { + m_collection->appendSheetForList(sheet); + } } ActiveDocumentStyleSheetCollector::ActiveDocumentStyleSheetCollector( StyleSheetCollection& collection) - : DocumentStyleSheetCollector(collection.m_styleSheetsForStyleSheetList, - collection.m_activeAuthorStyleSheets, - m_visitedDocuments) {} + : DocumentStyleSheetCollector(&collection, nullptr, &m_visitedDocuments) {} ImportedDocumentStyleSheetCollector::ImportedDocumentStyleSheetCollector( DocumentStyleSheetCollector& collector, HeapVector<Member<StyleSheet>>& sheetForList) - : DocumentStyleSheetCollector(sheetForList, - collector.m_activeAuthorStyleSheets, + : DocumentStyleSheetCollector(collector.m_collection, + &sheetForList, collector.m_visitedDocuments) {} } // namespace blink
diff --git a/third_party/WebKit/Source/core/dom/DocumentStyleSheetCollector.h b/third_party/WebKit/Source/core/dom/DocumentStyleSheetCollector.h index 419774a..30ee18c 100644 --- a/third_party/WebKit/Source/core/dom/DocumentStyleSheetCollector.h +++ b/third_party/WebKit/Source/core/dom/DocumentStyleSheetCollector.h
@@ -47,9 +47,9 @@ public: friend class ImportedDocumentStyleSheetCollector; - DocumentStyleSheetCollector(HeapVector<Member<StyleSheet>>& sheetsForList, - HeapVector<Member<CSSStyleSheet>>& activeList, - HeapHashSet<Member<Document>>&); + DocumentStyleSheetCollector(StyleSheetCollection*, + HeapVector<Member<StyleSheet>>*, + HeapHashSet<Member<Document>>*); ~DocumentStyleSheetCollector(); void appendActiveStyleSheets(const HeapVector<Member<CSSStyleSheet>>&); @@ -57,14 +57,14 @@ void appendSheetForList(StyleSheet*); bool hasVisited(Document* document) const { - return m_visitedDocuments.contains(document); + return m_visitedDocuments->contains(document); } - void willVisit(Document* document) { m_visitedDocuments.add(document); } + void willVisit(Document* document) { m_visitedDocuments->add(document); } private: - HeapVector<Member<StyleSheet>>& m_styleSheetsForStyleSheetList; - HeapVector<Member<CSSStyleSheet>>& m_activeAuthorStyleSheets; - HeapHashSet<Member<Document>>& m_visitedDocuments; + Member<StyleSheetCollection> m_collection; + HeapVector<Member<StyleSheet>>* m_styleSheetsForStyleSheetList; + HeapHashSet<Member<Document>>* m_visitedDocuments; }; class ActiveDocumentStyleSheetCollector final
diff --git a/third_party/WebKit/Source/core/dom/Element.cpp b/third_party/WebKit/Source/core/dom/Element.cpp index 7a6688b..498d9de 100644 --- a/third_party/WebKit/Source/core/dom/Element.cpp +++ b/third_party/WebKit/Source/core/dom/Element.cpp
@@ -2644,11 +2644,6 @@ FrameSelection::CloseTyping | FrameSelection::ClearTypingStyle | FrameSelection::DoNotSetFocus); - - // TODO(xiaochengh): The use of updateStyleAndLayoutIgnorePendingStylesheets - // needs to be audited. See http://crbug.com/590369 for more details. - document().updateStyleAndLayoutIgnorePendingStylesheets(); - frame->selection().revealSelection(); } else if (layoutObject() && !layoutObject()->isLayoutPart()) { layoutObject()->scrollRectToVisible(boundingBox()); @@ -3836,7 +3831,8 @@ (containingShadowRoot() && containingShadowRoot()->type() == ShadowRootType::UserAgent) || document().contentSecurityPolicy()->allowInlineStyle( - document().url(), String(), startLineNumber, newStyleString)) { + this, document().url(), String(), startLineNumber, + newStyleString)) { setInlineStyleFromString(newStyleString); }
diff --git a/third_party/WebKit/Source/core/dom/Node.cpp b/third_party/WebKit/Source/core/dom/Node.cpp index fdc2090..a6bfba9 100644 --- a/third_party/WebKit/Source/core/dom/Node.cpp +++ b/third_party/WebKit/Source/core/dom/Node.cpp
@@ -2078,8 +2078,9 @@ #if DCHECK_IS_ON() DCHECK(!EventDispatchForbiddenScope::isEventDispatchForbidden()); #endif - UIEvent* event = UIEvent::create(EventTypeNames::DOMActivate, true, true, - document().domWindow(), detail); + UIEvent* event = UIEvent::create(); + event->initUIEvent(EventTypeNames::DOMActivate, true, true, + document().domWindow(), detail); event->setUnderlyingEvent(underlyingEvent); dispatchScopedEvent(event);
diff --git a/third_party/WebKit/Source/core/dom/Node.h b/third_party/WebKit/Source/core/dom/Node.h index 6bfe36c..784591c 100644 --- a/third_party/WebKit/Source/core/dom/Node.h +++ b/third_party/WebKit/Source/core/dom/Node.h
@@ -28,6 +28,7 @@ #include "bindings/core/v8/ExceptionStatePlaceholder.h" #include "bindings/core/v8/NodeOrString.h" +#include "bindings/core/v8/TraceWrapperMember.h" #include "core/CoreExport.h" #include "core/dom/MutationObserver.h" #include "core/dom/SimulatedClickOptions.h"
diff --git a/third_party/WebKit/Source/core/dom/NodeIntersectionObserverData.h b/third_party/WebKit/Source/core/dom/NodeIntersectionObserverData.h index 72b56bf3..1e33309 100644 --- a/third_party/WebKit/Source/core/dom/NodeIntersectionObserverData.h +++ b/third_party/WebKit/Source/core/dom/NodeIntersectionObserverData.h
@@ -5,7 +5,7 @@ #ifndef NodeIntersectionObserverData_h #define NodeIntersectionObserverData_h -#include "bindings/core/v8/ScriptWrappableVisitor.h" +#include "bindings/core/v8/TraceWrapperMember.h" #include "platform/heap/Handle.h" namespace blink {
diff --git a/third_party/WebKit/Source/core/dom/NodeRareData.h b/third_party/WebKit/Source/core/dom/NodeRareData.h index cf78936..4fa5f34 100644 --- a/third_party/WebKit/Source/core/dom/NodeRareData.h +++ b/third_party/WebKit/Source/core/dom/NodeRareData.h
@@ -22,7 +22,7 @@ #ifndef NodeRareData_h #define NodeRareData_h -#include "bindings/core/v8/ScriptWrappableVisitor.h" +#include "bindings/core/v8/TraceWrapperMember.h" #include "core/dom/MutationObserverRegistration.h" #include "core/dom/NodeListsNodeData.h" #include "platform/heap/Handle.h"
diff --git a/third_party/WebKit/Source/core/dom/Range.cpp b/third_party/WebKit/Source/core/dom/Range.cpp index 16b3bb86..94793f8 100644 --- a/third_party/WebKit/Source/core/dom/Range.cpp +++ b/third_party/WebKit/Source/core/dom/Range.cpp
@@ -958,10 +958,7 @@ } String Range::text() const { - // TODO(xiaochengh): The use of updateStyleAndLayoutIgnorePendingStylesheets - // needs to be audited. see http://crbug.com/590369 for more details. - ownerDocument().updateStyleAndLayoutIgnorePendingStylesheets(); - + DCHECK(!m_ownerDocument->needsLayoutTreeUpdate()); return plainText(EphemeralRange(this), TextIteratorEmitsObjectReplacementCharacter); } @@ -1599,8 +1596,10 @@ } void Range::expand(const String& unit, ExceptionState& exceptionState) { - VisiblePosition start = createVisiblePositionDeprecated(startPosition()); - VisiblePosition end = createVisiblePositionDeprecated(endPosition()); + m_ownerDocument->updateStyleAndLayoutIgnorePendingStylesheets(); + + VisiblePosition start = createVisiblePosition(startPosition()); + VisiblePosition end = createVisiblePosition(endPosition()); if (unit == "word") { start = startOfWord(start); end = endOfWord(end);
diff --git a/third_party/WebKit/Source/core/dom/ScriptLoader.cpp b/third_party/WebKit/Source/core/dom/ScriptLoader.cpp index 6ddc885..41d6c04c 100644 --- a/third_party/WebKit/Source/core/dom/ScriptLoader.cpp +++ b/third_party/WebKit/Source/core/dom/ScriptLoader.cpp
@@ -461,16 +461,13 @@ csp->allowScriptWithHash(sourceCode.source(), ContentSecurityPolicy::InlineType::Block); - ParserDisposition parserDisposition = - isParserInserted() ? ParserInserted : NotParserInserted; - AtomicString nonce = ContentSecurityPolicy::isNonceableElement(m_element.get()) ? m_element->fastGetAttribute(HTMLNames::nonceAttr) : AtomicString(); if (!m_isExternalScript && (!shouldBypassMainWorldCSP && - !csp->allowInlineScript(elementDocument->url(), nonce, parserDisposition, + !csp->allowInlineScript(m_element, elementDocument->url(), nonce, m_startLineNumber, sourceCode.source()))) { return false; }
diff --git a/third_party/WebKit/Source/core/dom/StyleElement.cpp b/third_party/WebKit/Source/core/dom/StyleElement.cpp index 73944d9a..323e76df 100644 --- a/third_party/WebKit/Source/core/dom/StyleElement.cpp +++ b/third_party/WebKit/Source/core/dom/StyleElement.cpp
@@ -159,7 +159,7 @@ bool passesContentSecurityPolicyChecks = shouldBypassMainWorldCSP(element) || csp->allowStyleWithHash(text, ContentSecurityPolicy::InlineType::Block) || - csp->allowInlineStyle(document.url(), + csp->allowInlineStyle(&element, document.url(), element.fastGetAttribute(HTMLNames::nonceAttr), m_startPosition.m_line, text);
diff --git a/third_party/WebKit/Source/core/dom/StyleEngine.cpp b/third_party/WebKit/Source/core/dom/StyleEngine.cpp index 8d064da..c056371b 100644 --- a/third_party/WebKit/Source/core/dom/StyleEngine.cpp +++ b/third_party/WebKit/Source/core/dom/StyleEngine.cpp
@@ -114,8 +114,8 @@ return it->value.get(); } -const HeapVector<Member<StyleSheet>>& StyleEngine::styleSheetsForStyleSheetList( - TreeScope& treeScope) { +const HeapVector<TraceWrapperMember<StyleSheet>>& +StyleEngine::styleSheetsForStyleSheetList(TreeScope& treeScope) { if (treeScope == m_document) return documentStyleSheetCollection().styleSheetsForStyleSheetList();
diff --git a/third_party/WebKit/Source/core/dom/StyleEngine.h b/third_party/WebKit/Source/core/dom/StyleEngine.h index 9d4e6a4..7529ec1 100644 --- a/third_party/WebKit/Source/core/dom/StyleEngine.h +++ b/third_party/WebKit/Source/core/dom/StyleEngine.h
@@ -30,6 +30,7 @@ #ifndef StyleEngine_h #define StyleEngine_h +#include "bindings/core/v8/TraceWrapperMember.h" #include "core/CoreExport.h" #include "core/css/CSSFontSelectorClient.h" #include "core/css/invalidation/StyleInvalidator.h" @@ -83,8 +84,8 @@ ~StyleEngine(); - const HeapVector<Member<StyleSheet>>& styleSheetsForStyleSheetList( - TreeScope&); + const HeapVector<TraceWrapperMember<StyleSheet>>& + styleSheetsForStyleSheetList(TreeScope&); const HeapVector<Member<CSSStyleSheet>>& injectedAuthorStyleSheets() const { return m_injectedAuthorStyleSheets;
diff --git a/third_party/WebKit/Source/core/dom/StyleSheetCollection.cpp b/third_party/WebKit/Source/core/dom/StyleSheetCollection.cpp index d87b5be9..2d9092f4 100644 --- a/third_party/WebKit/Source/core/dom/StyleSheetCollection.cpp +++ b/third_party/WebKit/Source/core/dom/StyleSheetCollection.cpp
@@ -40,7 +40,8 @@ } void StyleSheetCollection::swap(StyleSheetCollection& other) { - m_styleSheetsForStyleSheetList.swap(other.m_styleSheetsForStyleSheetList); + ::blink::swap(m_styleSheetsForStyleSheetList, + other.m_styleSheetsForStyleSheetList, this, &other); m_activeAuthorStyleSheets.swap(other.m_activeAuthorStyleSheets); } @@ -48,15 +49,21 @@ HeapVector<Member<StyleSheet>>& sheets) { // Only called for collection of HTML Imports that never has active sheets. DCHECK(m_activeAuthorStyleSheets.isEmpty()); - m_styleSheetsForStyleSheetList.swap(sheets); + ::blink::swap(m_styleSheetsForStyleSheetList, sheets, this); } void StyleSheetCollection::appendActiveStyleSheet(CSSStyleSheet* sheet) { m_activeAuthorStyleSheets.append(sheet); } +void StyleSheetCollection::appendActiveStyleSheets( + const HeapVector<Member<CSSStyleSheet>>& sheets) { + m_activeAuthorStyleSheets.appendVector(sheets); +} + void StyleSheetCollection::appendSheetForList(StyleSheet* sheet) { - m_styleSheetsForStyleSheetList.append(sheet); + m_styleSheetsForStyleSheetList.append( + TraceWrapperMember<StyleSheet>(this, sheet)); } DEFINE_TRACE(StyleSheetCollection) { @@ -64,4 +71,10 @@ visitor->trace(m_styleSheetsForStyleSheetList); } +DEFINE_TRACE_WRAPPERS(StyleSheetCollection) { + for (auto sheet : m_styleSheetsForStyleSheetList) { + visitor->traceWrappers(sheet); + } +} + } // namespace blink
diff --git a/third_party/WebKit/Source/core/dom/StyleSheetCollection.h b/third_party/WebKit/Source/core/dom/StyleSheetCollection.h index 8515cf97..da5ea83 100644 --- a/third_party/WebKit/Source/core/dom/StyleSheetCollection.h +++ b/third_party/WebKit/Source/core/dom/StyleSheetCollection.h
@@ -30,6 +30,7 @@ #ifndef StyleSheetCollection_h #define StyleSheetCollection_h +#include "bindings/core/v8/TraceWrapperMember.h" #include "core/CoreExport.h" #include "platform/heap/Handle.h" #include "wtf/Allocator.h" @@ -53,23 +54,26 @@ const HeapVector<Member<CSSStyleSheet>>& activeAuthorStyleSheets() const { return m_activeAuthorStyleSheets; } - const HeapVector<Member<StyleSheet>>& styleSheetsForStyleSheetList() const { + const HeapVector<TraceWrapperMember<StyleSheet>>& + styleSheetsForStyleSheetList() const { return m_styleSheetsForStyleSheetList; } void swap(StyleSheetCollection&); void swapSheetsForSheetList(HeapVector<Member<StyleSheet>>&); void appendActiveStyleSheet(CSSStyleSheet*); + void appendActiveStyleSheets(const HeapVector<Member<CSSStyleSheet>>&); void appendSheetForList(StyleSheet*); DECLARE_VIRTUAL_TRACE(); + DECLARE_VIRTUAL_TRACE_WRAPPERS(); void dispose(); protected: StyleSheetCollection(); - HeapVector<Member<StyleSheet>> m_styleSheetsForStyleSheetList; + HeapVector<TraceWrapperMember<StyleSheet>> m_styleSheetsForStyleSheetList; HeapVector<Member<CSSStyleSheet>> m_activeAuthorStyleSheets; };
diff --git a/third_party/WebKit/Source/core/dom/WhitespaceLayoutObjects.md b/third_party/WebKit/Source/core/dom/WhitespaceLayoutObjects.md index 6e2a614..55fdc953 100644 --- a/third_party/WebKit/Source/core/dom/WhitespaceLayoutObjects.md +++ b/third_party/WebKit/Source/core/dom/WhitespaceLayoutObjects.md
@@ -49,11 +49,11 @@ In the example above, we need to create a whitespace layout object to separate the A and B in the rendering. However, we only need to create a layout object -for one of the whitespace nodes as whitespaces collapse. +for one of the whitespace nodes as whitespace collapse. ### Preformatted text and editing -Some values of the CSS white-space property will cause whitespace not to +Some values of the CSS white-space property will cause whitespace to not collapse and affect layout and rendering also in block layout. In those cases we always create layout objects for whitespace nodes. @@ -77,19 +77,19 @@ ### Layout object re-attachment -During style recalculation, elements whose computed value for display change +During style recalculation, elements whose computed value for display changes will have its layout sub-tree re-attached. Attachment of the descendant layout -objects happens the same way as for inital layout tree attachment, but the +objects happens the same way as for initial layout tree attachment, but the interesting part for whitespace layout objects is how they are affected by re-attachment of sibling elements. Sibling nodes may or may not be re-attached during the same style recalc traversal depending on whether they change their -computed display value or not. +computed display values or not. #### Style recalc traversal -An important pre-requisite for how whitespace layout objects are re-attached +An important prerequisite for how whitespace layout objects are re-attached is the traversal order we use for style recalc. The current traversal order -makes it hard or costly to implement whitespace re-attachement without bugs in +makes it hard or costly to implement whitespace re-attachment without bugs in the presence of shadow trees, but let's describe what we do here. Style recalc happens in the shadow-including tree order with the exception that @@ -141,8 +141,8 @@ Initially, the whitespace before the B span above does not get a layout object. If we change the absolute positioned span in the shadow tree to static, we need to have a layout object for that whitespace node. However, since we traverse -traverse the light-tree children of #host after the shadow tree, we do not see -the text node before re-attaching the absolute positioned span. +the light-tree children of #host after the shadow tree, we do not see the text +node before re-attaching the absolute positioned span. Likewise we currently have issues with ::before and ::after elements because we do not keep track of text nodes and pass them to ::before/::after element
diff --git a/third_party/WebKit/Source/core/editing/DOMSelection.cpp b/third_party/WebKit/Source/core/editing/DOMSelection.cpp index 47b9e56..156ae73 100644 --- a/third_party/WebKit/Source/core/editing/DOMSelection.cpp +++ b/third_party/WebKit/Source/core/editing/DOMSelection.cpp
@@ -240,7 +240,9 @@ // no longer performs synchronous layout by itself. frame()->document()->updateStyleAndLayoutIgnorePendingStylesheets(); - frame()->selection().moveTo(selection.end(), SelDefaultAffinity); + SelectionInDOMTree::Builder builder; + builder.collapse(selection.end()); + frame()->selection().setSelection(createVisibleSelection(builder.build())); } void DOMSelection::collapseToStart(ExceptionState& exceptionState) { @@ -262,7 +264,9 @@ // no longer performs synchronous layout by itself. frame()->document()->updateStyleAndLayoutIgnorePendingStylesheets(); - frame()->selection().moveTo(selection.start(), SelDefaultAffinity); + SelectionInDOMTree::Builder builder; + builder.collapse(selection.start()); + frame()->selection().setSelection(createVisibleSelection(builder.build())); } void DOMSelection::empty() { @@ -362,6 +366,10 @@ else return; + // TODO(editing-dev): The use of updateStyleAndLayoutIgnorePendingStylesheets + // needs to be audited. See http://crbug.com/590369 for more details. + frame()->document()->updateStyleAndLayoutIgnorePendingStylesheets(); + frame()->selection().modify(alter, direction, granularity); } @@ -466,7 +474,7 @@ frame()->document()->updateStyleAndLayoutIgnorePendingStylesheets(); if (selection.isNone()) { - selection.setSelectedRange(newRange, VP_DEFAULT_AFFINITY); + selection.setSelectedRange(EphemeralRange(newRange), VP_DEFAULT_AFFINITY); return; } @@ -509,9 +517,8 @@ ASSERT_NO_EXCEPTION) < 0 ? newRange : originalRange; - Range* merged = Range::create(originalRange->startContainer()->document(), - start->startContainer(), start->startOffset(), - end->endContainer(), end->endOffset()); + const EphemeralRange merged = + EphemeralRange(start->startPosition(), end->endPosition()); TextAffinity affinity = selection.selection().affinity(); selection.setSelectedRange(merged, affinity); }
diff --git a/third_party/WebKit/Source/core/editing/EditingStyle.cpp b/third_party/WebKit/Source/core/editing/EditingStyle.cpp index 70589ec..1f67ac5d 100644 --- a/third_party/WebKit/Source/core/editing/EditingStyle.cpp +++ b/third_party/WebKit/Source/core/editing/EditingStyle.cpp
@@ -1413,10 +1413,10 @@ if (!m_mutableStyle) return; - // TODO(yosin): The use of updateStyleAndLayoutIgnorePendingStylesheets - // needs to be audited. see http://crbug.com/590369 for more details. - element->document().updateStyleAndLayoutIgnorePendingStylesheetsForNode( - element); + // StyleResolver requires clean style. + DCHECK_GE(element->document().lifecycle().state(), + DocumentLifecycle::StyleClean); + DCHECK(element->document().isActive()); // 1. Remove style from matched rules because style remain without repeating // it in inline style declaration @@ -1528,10 +1528,7 @@ Document& document = *selection.start().document(); - // TODO(xiaochengh): The use of updateStyleAndLayoutIgnorePendingStylesheets - // needs to be audited. see http://crbug.com/590369 for more details. - document.updateStyleAndLayoutIgnorePendingStylesheets(); - + DCHECK(!document.needsLayoutTreeUpdate()); DocumentLifecycle::DisallowTransitionScope disallowTransition( document.lifecycle());
diff --git a/third_party/WebKit/Source/core/editing/Editor.cpp b/third_party/WebKit/Source/core/editing/Editor.cpp index 129bf0e..2779b19c 100644 --- a/third_party/WebKit/Source/core/editing/Editor.cpp +++ b/third_party/WebKit/Source/core/editing/Editor.cpp
@@ -145,12 +145,6 @@ DCHECK(m_editor->m_preventRevealSelection); --m_editor->m_preventRevealSelection; if (!m_editor->m_preventRevealSelection) { - // TODO(xiaochengh): The use of updateStyleAndLayoutIgnorePendingStylesheets - // needs to be audited. See http://crbug.com/590369 for more details. - m_editor->frame() - .document() - ->updateStyleAndLayoutIgnorePendingStylesheets(); - m_editor->frame().selection().revealSelection( ScrollAlignment::alignToEdgeIfNeeded, RevealExtent); } @@ -846,6 +840,17 @@ respondToChangedContents(newSelection); } +static VisibleSelection correctedVisibleSelection( + const VisibleSelection& passedSelection) { + if (!passedSelection.base().isConnected() || + !passedSelection.extent().isConnected()) + return VisibleSelection(); + DCHECK(!passedSelection.base().document()->needsLayoutTreeUpdate()); + VisibleSelection correctedSelection = passedSelection; + correctedSelection.updateIfNeeded(); + return correctedSelection; +} + void Editor::unappliedEditing(EditCommandComposition* cmd) { EventQueueScope scope; frame().document()->updateStyleAndLayout(); @@ -857,8 +862,14 @@ InputEvent::InputType::Undo, nullAtom, InputEvent::EventIsComposing::NotComposing); - VisibleSelection newSelection(cmd->startingSelection()); - newSelection.validatePositionsIfNeeded(); + // TODO(editing-dev): The use of updateStyleAndLayoutIgnorePendingStylesheets + // needs to be audited. See http://crbug.com/590369 for more details. + // In the long term, we should stop editing commands from storing + // VisibleSelections as starting and ending selections. + frame().document()->updateStyleAndLayoutIgnorePendingStylesheets(); + + VisibleSelection newSelection = + correctedVisibleSelection(cmd->startingSelection()); if (newSelection.start().document() == frame().document() && newSelection.end().document() == frame().document()) changeSelectionAfterCommand( @@ -953,13 +964,6 @@ if (Page* page = editedFrame->page()) { LocalFrame* focusedOrMainFrame = toLocalFrame(page->focusController().focusedOrMainFrame()); - - // TODO(xiaochengh): The use of - // updateStyleAndLayoutIgnorePendingStylesheets - // needs to be audited. See http://crbug.com/590369 for more details. - focusedOrMainFrame->document() - ->updateStyleAndLayoutIgnorePendingStylesheets(); - focusedOrMainFrame->selection().revealSelection( ScrollAlignment::alignCenterIfNeeded); } @@ -1236,7 +1240,6 @@ focusedElement->setAttribute( dirAttr, direction == LeftToRightWritingDirection ? "ltr" : "rtl"); focusedElement->dispatchInputEvent(); - frame().document()->updateStyleAndLayoutTree(); return; } @@ -1257,11 +1260,6 @@ RevealExtentOption revealExtentOption) { if (m_preventRevealSelection) return; - - // TODO(xiaochengh): The use of updateStyleAndLayoutIgnorePendingStylesheets - // needs to be audited. See http://crbug.com/590369 for more details. - frame().document()->updateStyleAndLayoutIgnorePendingStylesheets(); - frame().selection().revealSelection(alignment, revealExtentOption); }
diff --git a/third_party/WebKit/Source/core/editing/FrameCaret.cpp b/third_party/WebKit/Source/core/editing/FrameCaret.cpp index 9fd6cd2..34d6350 100644 --- a/third_party/WebKit/Source/core/editing/FrameCaret.cpp +++ b/third_party/WebKit/Source/core/editing/FrameCaret.cpp
@@ -81,9 +81,17 @@ // Paint a block cursor instead of a caret in overtype mode unless the caret // is at the end of a line (in this case the FrameSelection will paint a // blinking caret as usual). - bool paintBlockCursor = - m_shouldShowBlockCursor && isActive() && - !isLogicalEndOfLine(createVisiblePositionDeprecated(caretPosition())); + bool paintBlockCursor = m_shouldShowBlockCursor && isActive(); + if (paintBlockCursor) { + // TODO(editing-dev): Use of updateStyleAndLayoutIgnorePendingStylesheets + // needs to be audited. see http://crbug.com/590369 for more details. + // In the long term, we should defer the update of the caret's appearance + // to prevent synchronous layout. + m_frame->document()->updateStyleAndLayoutIgnorePendingStylesheets(); + + if (isLogicalEndOfLine(createVisiblePosition(caretPosition()))) + paintBlockCursor = false; + } bool shouldBlink = !paintBlockCursor && shouldBlinkCaret();
diff --git a/third_party/WebKit/Source/core/editing/FrameSelection.cpp b/third_party/WebKit/Source/core/editing/FrameSelection.cpp index 2be9d69c..df3a10d 100644 --- a/third_party/WebKit/Source/core/editing/FrameSelection.cpp +++ b/third_party/WebKit/Source/core/editing/FrameSelection.cpp
@@ -162,13 +162,6 @@ options, align); } -void FrameSelection::moveTo(const Position& pos, TextAffinity affinity) { - SetSelectionOptions options = CloseTyping | ClearTypingStyle; - setSelection( - createVisibleSelection(pos, affinity, selection().isDirectional()), - options); -} - // TODO(xiaochengh): We should not use reference to return value. template <typename Strategy> static void adjustEndpointsAtBidiBoundary( @@ -370,10 +363,6 @@ ? ScrollAlignment::alignTopAlways : ScrollAlignment::alignToEdgeIfNeeded; - // TODO(xiaochengh): The use of updateStyleAndLayoutIgnorePendingStylesheets - // needs to be audited. See http://crbug.com/590369 for more details. - document().updateStyleAndLayoutIgnorePendingStylesheets(); - revealSelection(alignment, RevealExtent); } @@ -384,6 +373,42 @@ Event::create(EventTypeNames::selectionchange)); } +// TODO(yosin): We will make |selectionInDOMTree| version of |SetSelection()| +// as primary function instead of wrapper. +void FrameSelection::setSelection(const SelectionInDOMTree& newSelection, + SetSelectionOptions options, + CursorAlignOnScroll align, + TextGranularity granularity) { + if (!newSelection.isNone()) { + // TODO(editing-dev): The use of + // updateStyleAndLayoutIgnorePendingStylesheets + // needs to be audited. See http://crbug.com/590369 for more details. + newSelection.base() + .document() + ->updateStyleAndLayoutIgnorePendingStylesheets(); + } + setSelection(createVisibleSelection(newSelection), options, align, + granularity); +} + +// TODO(yosin): We will make |selectionInFlatTree| version of |SetSelection()| +// as primary function instead of wrapper. +void FrameSelection::setSelection(const SelectionInFlatTree& newSelection, + SetSelectionOptions options, + CursorAlignOnScroll align, + TextGranularity granularity) { + if (!newSelection.isNone()) { + // TODO(editing-dev): The use of + // updateStyleAndLayoutIgnorePendingStylesheets + // needs to be audited. See http://crbug.com/590369 for more details. + newSelection.base() + .document() + ->updateStyleAndLayoutIgnorePendingStylesheets(); + } + setSelection(createVisibleSelection(newSelection), options, align, + granularity); +} + void FrameSelection::setSelection(const VisibleSelection& newSelection, SetSelectionOptions options, CursorAlignOnScroll align, @@ -969,6 +994,10 @@ return; } + // TODO(xiaochengh): The use of updateStyleAndLayoutIgnorePendingStylesheets + // needs to be audited. See http://crbug.com/590369 for more details. + document().updateStyleAndLayoutIgnorePendingStylesheets(); + VisibleSelection newSelection( VisibleSelection::selectionFromContentsOfNode(root)); setSelection(newSelection); @@ -976,18 +1005,6 @@ notifyLayoutObjectOfSelectionChange(UserTriggered); } -bool FrameSelection::setSelectedRange(Range* range, - TextAffinity affinity, - SelectionDirectionalMode directional, - SetSelectionOptions options) { - if (!range || !range->isConnected()) - return false; - DCHECK_EQ(range->startContainer()->document(), - range->endContainer()->document()); - return setSelectedRange(EphemeralRange(range), affinity, directional, - options); -} - bool FrameSelection::setSelectedRange(const EphemeralRange& range, TextAffinity affinity, SelectionDirectionalMode directional, @@ -1153,7 +1170,6 @@ } document().clearFocusedElement(); } - } static String extractSelectedText(const FrameSelection& selection, @@ -1260,7 +1276,11 @@ void FrameSelection::revealSelection(const ScrollAlignment& alignment, RevealExtentOption revealExtentOption) { DCHECK(isAvailable()); - DCHECK(!document().needsLayoutTreeUpdate()); + + // TODO(editing-dev): The use of updateStyleAndLayoutIgnorePendingStylesheets + // needs to be audited. See http://crbug.com/590369 for more details. + // Calculation of absolute caret bounds requires clean layout. + document().updateStyleAndLayoutIgnorePendingStylesheets(); LayoutRect rect; @@ -1439,6 +1459,7 @@ } void FrameSelection::updateIfNeeded() { + DCHECK(!m_frame->document()->needsLayoutTreeUpdate()); m_selectionEditor->updateIfNeeded(); }
diff --git a/third_party/WebKit/Source/core/editing/FrameSelection.h b/third_party/WebKit/Source/core/editing/FrameSelection.h index c6d1f2b8..c2d3357 100644 --- a/third_party/WebKit/Source/core/editing/FrameSelection.h +++ b/third_party/WebKit/Source/core/editing/FrameSelection.h
@@ -111,20 +111,36 @@ return selection().isContentRichlyEditable(); } - // TODO(xiaochengh): Remove the |moveTo(VisiblePosition)| overload. + // TODO(yosin): We should make and rename |moveTo()| as implementation of + // |WebLoalFrameImpl::moveCaretSeleciton()|, since there is only one call + // site. void moveTo(const VisiblePosition&, EUserTriggered = NotUserTriggered, CursorAlignOnScroll = CursorAlignOnScroll::IfNeeded); - void moveTo(const Position&, TextAffinity); template <typename Strategy> const VisibleSelectionTemplate<Strategy>& visibleSelection() const; const VisibleSelection& selection() const; + + void setSelection(const SelectionInDOMTree&, + SetSelectionOptions = CloseTyping | ClearTypingStyle, + CursorAlignOnScroll = CursorAlignOnScroll::IfNeeded, + TextGranularity = CharacterGranularity); + + void setSelection(const SelectionInFlatTree&, + SetSelectionOptions = CloseTyping | ClearTypingStyle, + CursorAlignOnScroll = CursorAlignOnScroll::IfNeeded, + TextGranularity = CharacterGranularity); + + // TODO(yosin): We should use |SelectionInDOMTree| version instead of + // |VisibleSelection| version. void setSelection(const VisibleSelection&, SetSelectionOptions = CloseTyping | ClearTypingStyle, CursorAlignOnScroll = CursorAlignOnScroll::IfNeeded, TextGranularity = CharacterGranularity); + // TODO(yosin): We should use |SelectionInFlatTree| version instead of + // |VisibleSelectionInFlatTree| version. void setSelection(const VisibleSelectionInFlatTree&, SetSelectionOptions = CloseTyping | ClearTypingStyle, CursorAlignOnScroll = CursorAlignOnScroll::IfNeeded, @@ -136,13 +152,6 @@ setSelection(selection, CloseTyping | ClearTypingStyle, CursorAlignOnScroll::IfNeeded, granularity); } - // TODO(yosin) We should get rid of |Range| version of |setSelectedRagne()| - // for Oilpan. - bool setSelectedRange( - Range*, - TextAffinity, - SelectionDirectionalMode = SelectionDirectionalMode::NonDirectional, - SetSelectionOptions = CloseTyping | ClearTypingStyle); bool setSelectedRange( const EphemeralRange&, TextAffinity,
diff --git a/third_party/WebKit/Source/core/editing/FrameSelectionTest.cpp b/third_party/WebKit/Source/core/editing/FrameSelectionTest.cpp index cdcfc8b7..93968c58 100644 --- a/third_party/WebKit/Source/core/editing/FrameSelectionTest.cpp +++ b/third_party/WebKit/Source/core/editing/FrameSelectionTest.cpp
@@ -28,7 +28,6 @@ class FrameSelectionTest : public EditingTestBase { protected: - void setSelection(const VisibleSelection&); FrameSelection& selection() const; const VisibleSelection& visibleSelectionInDOMTree() const { return selection().selection(); @@ -57,10 +56,6 @@ Persistent<Text> m_textNode; }; -void FrameSelectionTest::setSelection(const VisibleSelection& newSelection) { - dummyPageHolder().frame().selection().setSelection(newSelection); -} - FrameSelection& FrameSelectionTest::selection() const { return dummyPageHolder().frame().selection(); } @@ -74,10 +69,10 @@ TEST_F(FrameSelectionTest, SetValidSelection) { Text* text = appendTextNode("Hello, World!"); document().view()->updateAllLifecyclePhases(); - VisibleSelection validSelection = - createVisibleSelection(Position(text, 0), Position(text, 5)); - EXPECT_FALSE(validSelection.isNone()); - setSelection(validSelection); + selection().setSelection( + SelectionInDOMTree::Builder() + .setBaseAndExtent(Position(text, 0), Position(text, 5)) + .build()); EXPECT_FALSE(selection().isNone()); } @@ -85,9 +80,8 @@ Text* text = appendTextNode("Hello, World!"); document().view()->updateAllLifecyclePhases(); - VisibleSelection validSelection = - createVisibleSelection(Position(text, 0), Position(text, 0)); - setSelection(validSelection); + selection().setSelection( + SelectionInDOMTree::Builder().collapse(Position(text, 0)).build()); selection().setCaretRectNeedsUpdate(); EXPECT_TRUE(selection().isCaretBoundsDirty()); selection().invalidateCaretRect(); @@ -109,10 +103,9 @@ document().body()->focus(); EXPECT_TRUE(document().body()->isFocused()); - VisibleSelection validSelection = - createVisibleSelection(Position(text, 0), Position(text, 0)); selection().setCaretVisible(true); - setSelection(validSelection); + selection().setSelection( + SelectionInDOMTree::Builder().collapse(Position(text, 0)).build()); EXPECT_TRUE(selection().isCaret()); EXPECT_TRUE(shouldPaintCaretForTesting()); @@ -220,8 +213,10 @@ Node* const two = FlatTreeTraversal::firstChild(*host); // Select "two" for selection in DOM tree // Select "twoone" for selection in Flat tree - selection().setSelection(createVisibleSelection( - PositionInFlatTree(host, 0), PositionInFlatTree(document().body(), 2))); + selection().setSelection(SelectionInFlatTree::Builder() + .collapse(PositionInFlatTree(host, 0)) + .extend(PositionInFlatTree(document().body(), 2)) + .build()); selection().modify(FrameSelection::AlterationExtend, DirectionForward, WordGranularity); EXPECT_EQ(Position(two, 0), visibleSelectionInDOMTree().start()); @@ -234,7 +229,8 @@ setBodyContent("<div id=sample>abc</div>"); Element* sample = document().getElementById("sample"); const Position endOfText(sample->firstChild(), 3); - selection().setSelection(createVisibleSelection(endOfText)); + selection().setSelection( + SelectionInDOMTree::Builder().collapse(endOfText).build()); EXPECT_FALSE(selection().modify(FrameSelection::AlterationMove, DirectionForward, CharacterGranularity, @@ -257,7 +253,9 @@ // Itinitializes with "Foo B|a>r Baz," (| means start and > means end). selection().setSelection( - createVisibleSelection(Position(text, 5), Position(text, 6))); + SelectionInDOMTree::Builder() + .setBaseAndExtent(Position(text, 5), Position(text, 6)) + .build()); EXPECT_EQ_SELECTED_TEXT("a"); // "Foo B|ar B>az," with the Character granularity. @@ -339,7 +337,8 @@ document().setDesignMode("on"); updateAllLifecyclePhases(); Element* sample = document().getElementById("sample"); - setSelection(createVisibleSelection(Position(sample, 0))); + selection().setSelection( + SelectionInDOMTree::Builder().collapse(Position(sample, 0)).build()); EXPECT_EQ(Position(document().body(), 0), selection().start()); EXPECT_EQ(selection().start(), caretPosition().position()); document().body()->remove(); @@ -347,6 +346,7 @@ // should be Position(HTML, 0). EXPECT_EQ(Position(document().documentElement(), 1), selection().start()); EXPECT_EQ(selection().start(), caretPosition().position()); + document().updateStyleAndLayout(); selection().updateIfNeeded(); // TODO(yosin): Once lazy canonicalization implemented, selection.start
diff --git a/third_party/WebKit/Source/core/editing/SelectionController.cpp b/third_party/WebKit/Source/core/editing/SelectionController.cpp index 9938d798..7cadac5 100644 --- a/third_party/WebKit/Source/core/editing/SelectionController.cpp +++ b/third_party/WebKit/Source/core/editing/SelectionController.cpp
@@ -196,8 +196,14 @@ newSelection.expandUsingGranularity(selection().granularity()); } } else if (m_selectionState != SelectionState::ExtendedSelection) { - newSelection = expandSelectionToRespectUserSelectAll( - innerNode, createVisibleSelection(visiblePos)); + if (visiblePos.isNull()) { + newSelection = VisibleSelectionInFlatTree(); + } else { + SelectionInFlatTree::Builder builder; + builder.collapse(visiblePos.toPositionWithAffinity()); + newSelection = expandSelectionToRespectUserSelectAll( + innerNode, createVisibleSelection(builder.build())); + } } // Updating the selection is considered side-effect of the event and so it @@ -262,7 +268,9 @@ if (m_selectionState != SelectionState::ExtendedSelection) { // Always extend selection here because it's caused by a mouse drag m_selectionState = SelectionState::ExtendedSelection; - newSelection = createVisibleSelection(targetPosition); + SelectionInFlatTree::Builder builder; + builder.collapse(targetPosition.toPositionWithAffinity()); + newSelection = createVisibleSelection(builder.build()); } if (RuntimeEnabledFeatures::userSelectAllEnabled()) { @@ -380,7 +388,9 @@ const VisiblePositionInFlatTree& pos = visiblePositionOfHitTestResult(adjustedHitTestResult); if (pos.isNotNull()) { - newSelection = createVisibleSelection(pos); + SelectionInFlatTree::Builder builder; + builder.collapse(pos.toPositionWithAffinity()); + newSelection = createVisibleSelection(builder.build()); newSelection.expandUsingGranularity(WordGranularity); } @@ -555,7 +565,9 @@ const VisiblePositionInFlatTree& pos = visiblePositionOfHitTestResult(event.hitTestResult()); if (pos.isNotNull()) { - newSelection = createVisibleSelection(pos); + SelectionInFlatTree::Builder builder; + builder.collapse(pos.toPositionWithAffinity()); + newSelection = createVisibleSelection(builder.build()); newSelection.expandUsingGranularity(ParagraphGranularity); } @@ -650,7 +662,11 @@ if (node && node->layoutObject() && hasEditableStyle(*node)) { const VisiblePositionInFlatTree pos = visiblePositionOfHitTestResult(event.hitTestResult()); - newSelection = createVisibleSelection(pos); + if (pos.isNotNull()) { + SelectionInFlatTree::Builder builder; + builder.collapse(pos.toPositionWithAffinity()); + newSelection = createVisibleSelection(builder.build()); + } } setSelectionIfNeeded(selection(), newSelection); @@ -794,8 +810,13 @@ const VisiblePositionInFlatTree& visiblePos = visiblePositionOfHitTestResult(mev.hitTestResult()); - VisibleSelectionInFlatTree newSelection = createVisibleSelection(visiblePos); - selection().setSelection(newSelection); + if (visiblePos.isNull()) { + selection().setSelection(VisibleSelectionInFlatTree()); + return; + } + SelectionInFlatTree::Builder builder; + builder.collapse(visiblePos.toPositionWithAffinity()); + selection().setSelection(createVisibleSelection(builder.build())); } void SelectionController::initializeSelectionState() {
diff --git a/third_party/WebKit/Source/core/editing/SelectionModifier.cpp b/third_party/WebKit/Source/core/editing/SelectionModifier.cpp index 81ac249..31ce4a4 100644 --- a/third_party/WebKit/Source/core/editing/SelectionModifier.cpp +++ b/third_party/WebKit/Source/core/editing/SelectionModifier.cpp
@@ -585,10 +585,7 @@ bool SelectionModifier::modify(EAlteration alter, SelectionDirection direction, TextGranularity granularity) { - // TODO(xiaochengh): The use of updateStyleAndLayoutIgnorePendingStylesheets - // needs to be audited. See http://crbug.com/590369 for more details. - frame()->document()->updateStyleAndLayoutIgnorePendingStylesheets(); - + DCHECK(!frame()->document()->needsLayoutTreeUpdate()); DocumentLifecycle::DisallowTransitionScope disallowTransition( frame()->document()->lifecycle());
diff --git a/third_party/WebKit/Source/core/editing/SurroundingText.cpp b/third_party/WebKit/Source/core/editing/SurroundingText.cpp index d62eb8c7..8c49e39 100644 --- a/third_party/WebKit/Source/core/editing/SurroundingText.cpp +++ b/third_party/WebKit/Source/core/editing/SurroundingText.cpp
@@ -104,6 +104,12 @@ DCHECK(m_contentRange); } +Document* SurroundingText::document() const { + if (m_contentRange) + return &m_contentRange->ownerDocument(); + return nullptr; +} + String SurroundingText::content() const { if (m_contentRange) return m_contentRange->text();
diff --git a/third_party/WebKit/Source/core/editing/SurroundingText.h b/third_party/WebKit/Source/core/editing/SurroundingText.h index 18f576f..bbdb4d50 100644 --- a/third_party/WebKit/Source/core/editing/SurroundingText.h +++ b/third_party/WebKit/Source/core/editing/SurroundingText.h
@@ -48,6 +48,8 @@ SurroundingText(const Range&, unsigned maxLength); SurroundingText(const Position&, unsigned maxLength); + Document* document() const; + String content() const; unsigned startOffsetInContent() const; unsigned endOffsetInContent() const;
diff --git a/third_party/WebKit/Source/core/editing/VisiblePosition.cpp b/third_party/WebKit/Source/core/editing/VisiblePosition.cpp index 63009d22..70f5441 100644 --- a/third_party/WebKit/Source/core/editing/VisiblePosition.cpp +++ b/third_party/WebKit/Source/core/editing/VisiblePosition.cpp
@@ -136,52 +136,6 @@ PositionTemplate<Strategy>::lastPositionInNode(node))); } -VisiblePosition createVisiblePositionDeprecated(const Position& position, - TextAffinity affinity) { - // TODO(xiaochengh): The use of updateStyleAndLayoutIgnorePendingStylesheets - // needs to be audited. See http://crbug.com/590369 for more details. - if (position.isNotNull()) - position.document()->updateStyleAndLayoutIgnorePendingStylesheets(); - - return VisiblePosition::create(PositionWithAffinity(position, affinity)); -} - -VisiblePosition createVisiblePositionDeprecated( - const PositionWithAffinity& positionWithAffinity) { - // TODO(xiaochengh): The use of updateStyleAndLayoutIgnorePendingStylesheets - // needs to be audited. See http://crbug.com/590369 for more details. - if (positionWithAffinity.isNotNull()) - positionWithAffinity.position() - .document() - ->updateStyleAndLayoutIgnorePendingStylesheets(); - - return VisiblePosition::create(positionWithAffinity); -} - -VisiblePositionInFlatTree createVisiblePositionDeprecated( - const PositionInFlatTree& position, - TextAffinity affinity) { - // TODO(xiaochengh): The use of updateStyleAndLayoutIgnorePendingStylesheets - // needs to be audited. See http://crbug.com/590369 for more details. - if (position.isNotNull()) - position.document()->updateStyleAndLayoutIgnorePendingStylesheets(); - - return VisiblePositionInFlatTree::create( - PositionInFlatTreeWithAffinity(position, affinity)); -} - -VisiblePositionInFlatTree createVisiblePositionDeprecated( - const PositionInFlatTreeWithAffinity& positionWithAffinity) { - // TODO(xiaochengh): The use of updateStyleAndLayoutIgnorePendingStylesheets - // needs to be audited. See http://crbug.com/590369 for more details. - if (positionWithAffinity.isNotNull()) - positionWithAffinity.position() - .document() - ->updateStyleAndLayoutIgnorePendingStylesheets(); - - return VisiblePositionInFlatTree::create(positionWithAffinity); -} - VisiblePosition createVisiblePosition(const Position& position, TextAffinity affinity) { return VisiblePosition::create(PositionWithAffinity(position, affinity));
diff --git a/third_party/WebKit/Source/core/editing/VisiblePosition.h b/third_party/WebKit/Source/core/editing/VisiblePosition.h index 811bf84ed..d0bd4d7 100644 --- a/third_party/WebKit/Source/core/editing/VisiblePosition.h +++ b/third_party/WebKit/Source/core/editing/VisiblePosition.h
@@ -138,20 +138,6 @@ using VisiblePositionInFlatTree = VisiblePositionTemplate<EditingInFlatTreeStrategy>; -// |createVisiblePositionDeprecated| updates layout before creating the -// VisiblePosition, which messes up the rendering pipeline. The callers should -// ensure clean layout by themselves and call |createVisiblePosition| instead. -CORE_EXPORT VisiblePosition -createVisiblePositionDeprecated(const Position&, - TextAffinity = VP_DEFAULT_AFFINITY); -CORE_EXPORT VisiblePosition -createVisiblePositionDeprecated(const PositionWithAffinity&); -CORE_EXPORT VisiblePositionInFlatTree -createVisiblePositionDeprecated(const PositionInFlatTree&, - TextAffinity = VP_DEFAULT_AFFINITY); -CORE_EXPORT VisiblePositionInFlatTree -createVisiblePositionDeprecated(const PositionInFlatTreeWithAffinity&); - CORE_EXPORT VisiblePosition createVisiblePosition(const Position&, TextAffinity = VP_DEFAULT_AFFINITY); CORE_EXPORT VisiblePosition createVisiblePosition(const PositionWithAffinity&);
diff --git a/third_party/WebKit/Source/core/editing/VisibleSelection.cpp b/third_party/WebKit/Source/core/editing/VisibleSelection.cpp index d8d2debe..62641a55 100644 --- a/third_party/WebKit/Source/core/editing/VisibleSelection.cpp +++ b/third_party/WebKit/Source/core/editing/VisibleSelection.cpp
@@ -134,17 +134,6 @@ return VisibleSelectionInFlatTree::create(selection); } -VisibleSelectionInFlatTree createVisibleSelection(const PositionInFlatTree& pos, - TextAffinity affinity, - bool isDirectional) { - DCHECK(!needsLayoutTreeUpdate(pos)); - SelectionInFlatTree::Builder builder; - builder.setAffinity(affinity).setIsDirectional(isDirectional); - if (pos.isNotNull()) - builder.collapse(pos); - return createVisibleSelection(builder.build()); -} - VisibleSelectionInFlatTree createVisibleSelection( const PositionInFlatTree& base, const PositionInFlatTree& extent, @@ -162,14 +151,6 @@ } VisibleSelectionInFlatTree createVisibleSelection( - const VisiblePositionInFlatTree& pos, - bool isDirectional) { - DCHECK(pos.isValid()); - return createVisibleSelection(pos.deepEquivalent(), pos.affinity(), - isDirectional); -} - -VisibleSelectionInFlatTree createVisibleSelection( const VisiblePositionInFlatTree& base, const VisiblePositionInFlatTree& extent, bool isDirectional) { @@ -246,11 +227,9 @@ template <typename Strategy> VisibleSelectionTemplate<Strategy> VisibleSelectionTemplate<Strategy>::selectionFromContentsOfNode(Node* node) { + DCHECK(node); DCHECK(!Strategy::editingIgnoresContent(node)); - - // TODO(xiaochengh): The use of updateStyleAndLayoutIgnorePendingStylesheets - // needs to be audited. see http://crbug.com/590369 for more details. - node->document().updateStyleAndLayoutIgnorePendingStylesheets(); + DCHECK(!needsLayoutTreeUpdate(*node)); typename SelectionTemplate<Strategy>::Builder builder; builder.collapse(PositionTemplate<Strategy>::firstPositionInNode(node)) @@ -864,7 +843,7 @@ Document* document = m_base.document(); if (!document) return; - document->updateStyleAndLayoutIgnorePendingStylesheets(); + DCHECK(!document->needsLayoutTreeUpdate()); const bool hasTrailingWhitespace = m_hasTrailingWhitespace; validate(m_granularity); if (!hasTrailingWhitespace) @@ -872,16 +851,6 @@ appendTrailingWhitespace(); } -// TODO(yosin): Since |validatePositionsIfNeeded()| is called just one place, -// we should move it to the call site. -template <typename Strategy> -void VisibleSelectionTemplate<Strategy>::validatePositionsIfNeeded() { - if (!m_base.isConnected() || !m_extent.isConnected()) { - *this = VisibleSelectionTemplate(); - return; - } - updateIfNeeded(); -} template <typename Strategy> static bool equalSelectionsAlgorithm(
diff --git a/third_party/WebKit/Source/core/editing/VisibleSelection.h b/third_party/WebKit/Source/core/editing/VisibleSelection.h index 195c3b94..916793c 100644 --- a/third_party/WebKit/Source/core/editing/VisibleSelection.h +++ b/third_party/WebKit/Source/core/editing/VisibleSelection.h
@@ -63,6 +63,8 @@ // |selectionFromContentsOfNode|. static VisibleSelectionTemplate create(const SelectionTemplate<Strategy>&); + // TODO(editing-dev): We should get rid of this function and instead, use + // EphemeralRangeTemplate::rangeOfContents and SelectionTemplate::Builder. static VisibleSelectionTemplate selectionFromContentsOfNode(Node*); SelectionType getSelectionType() const { return m_selectionType; } @@ -150,7 +152,6 @@ } void updateIfNeeded(); - void validatePositionsIfNeeded(); #ifndef NDEBUG void showTreeForThis() const; @@ -236,10 +237,6 @@ CORE_EXPORT VisibleSelectionInFlatTree createVisibleSelection(const SelectionInFlatTree&); CORE_EXPORT VisibleSelectionInFlatTree -createVisibleSelection(const PositionInFlatTree&, - TextAffinity, - bool isDirectional = false); -CORE_EXPORT VisibleSelectionInFlatTree createVisibleSelection(const PositionInFlatTree& base, const PositionInFlatTree& extent, TextAffinity = SelDefaultAffinity, @@ -250,9 +247,6 @@ bool isDirectional = false); CORE_EXPORT VisibleSelectionInFlatTree createVisibleSelection(const VisiblePositionInFlatTree&, - bool isDirectional = false); -CORE_EXPORT VisibleSelectionInFlatTree -createVisibleSelection(const VisiblePositionInFlatTree&, const VisiblePositionInFlatTree&, bool isDirectional = false);
diff --git a/third_party/WebKit/Source/core/editing/VisibleSelectionTest.cpp b/third_party/WebKit/Source/core/editing/VisibleSelectionTest.cpp index 26603e85..bbd7ef1 100644 --- a/third_party/WebKit/Source/core/editing/VisibleSelectionTest.cpp +++ b/third_party/WebKit/Source/core/editing/VisibleSelectionTest.cpp
@@ -79,7 +79,9 @@ selection = createVisibleSelection(createVisiblePosition(Position(one, 1))); selection.expandUsingGranularity(WordGranularity); selectionInFlatTree = - createVisibleSelection(createVisiblePosition(PositionInFlatTree(one, 1))); + createVisibleSelection(SelectionInFlatTree::Builder() + .collapse(PositionInFlatTree(one, 1)) + .build()); selectionInFlatTree.expandUsingGranularity(WordGranularity); EXPECT_EQ(Position(one, 1), selection.base()); @@ -96,7 +98,9 @@ selection = createVisibleSelection(createVisiblePosition(Position(two, 1))); selection.expandUsingGranularity(WordGranularity); selectionInFlatTree = - createVisibleSelection(createVisiblePosition(PositionInFlatTree(two, 1))); + createVisibleSelection(SelectionInFlatTree::Builder() + .collapse(PositionInFlatTree(two, 1)) + .build()); selectionInFlatTree.expandUsingGranularity(WordGranularity); EXPECT_EQ(Position(two, 1), selection.base()); @@ -112,8 +116,10 @@ // From a position at node in shadow tree selection = createVisibleSelection(createVisiblePosition(Position(three, 1))); selection.expandUsingGranularity(WordGranularity); - selectionInFlatTree = createVisibleSelection( - createVisiblePosition(PositionInFlatTree(three, 1))); + selectionInFlatTree = + createVisibleSelection(SelectionInFlatTree::Builder() + .collapse(PositionInFlatTree(three, 1)) + .build()); selectionInFlatTree.expandUsingGranularity(WordGranularity); EXPECT_EQ(Position(three, 1), selection.base()); @@ -129,8 +135,10 @@ // From a position at node in shadow tree selection = createVisibleSelection(createVisiblePosition(Position(four, 1))); selection.expandUsingGranularity(WordGranularity); - selectionInFlatTree = createVisibleSelection( - createVisiblePosition(PositionInFlatTree(four, 1))); + selectionInFlatTree = + createVisibleSelection(SelectionInFlatTree::Builder() + .collapse(PositionInFlatTree(four, 1)) + .build()); selectionInFlatTree.expandUsingGranularity(WordGranularity); EXPECT_EQ(Position(four, 1), selection.base()); @@ -146,8 +154,10 @@ // From a position at node in shadow tree selection = createVisibleSelection(createVisiblePosition(Position(five, 1))); selection.expandUsingGranularity(WordGranularity); - selectionInFlatTree = createVisibleSelection( - createVisiblePosition(PositionInFlatTree(five, 1))); + selectionInFlatTree = + createVisibleSelection(SelectionInFlatTree::Builder() + .collapse(PositionInFlatTree(five, 1)) + .build()); selectionInFlatTree.expandUsingGranularity(WordGranularity); EXPECT_EQ(Position(five, 1), selection.base()); @@ -403,7 +413,7 @@ // This is for crbug.com/627783, simulating restoring selection // in undo stack. -TEST_F(VisibleSelectionTest, validatePositionsIfNeededWithShadowHost) { +TEST_F(VisibleSelectionTest, updateIfNeededWithShadowHost) { setBodyContent("<div id=host></div><div id=sample>foo</div>"); setShadowContent("<content>", "host"); Element* sample = document().getElementById("sample"); @@ -416,9 +426,10 @@ // Simulates modifying DOM tree to invalidate distribution. Element* host = document().getElementById("host"); host->appendChild(sample); + document().updateStyleAndLayout(); // Simulates to restore selection from undo stack. - selection.validatePositionsIfNeeded(); + selection.updateIfNeeded(); EXPECT_EQ(Position(sample->firstChild(), 0), selection.start()); VisibleSelectionInFlatTree selectionInFlatTree;
diff --git a/third_party/WebKit/Source/core/editing/commands/CompositeEditCommand.cpp b/third_party/WebKit/Source/core/editing/commands/CompositeEditCommand.cpp index 870c5e8..b3b12ac4 100644 --- a/third_party/WebKit/Source/core/editing/commands/CompositeEditCommand.cpp +++ b/third_party/WebKit/Source/core/editing/commands/CompositeEditCommand.cpp
@@ -1953,6 +1953,9 @@ result = Position::inParentAfterNode(*enclosingAnchor); } + + document().updateStyleAndLayoutIgnorePendingStylesheets(); + // If visually just before an anchor, insert *outside* the anchor unless // it's the first VisiblePosition in a paragraph, to match NSTextView. if (visiblePos.deepEquivalent() == firstInAnchor.deepEquivalent()) {
diff --git a/third_party/WebKit/Source/core/editing/commands/EditorCommand.cpp b/third_party/WebKit/Source/core/editing/commands/EditorCommand.cpp index ff85ce3..6c5c75f 100644 --- a/third_party/WebKit/Source/core/editing/commands/EditorCommand.cpp +++ b/third_party/WebKit/Source/core/editing/commands/EditorCommand.cpp
@@ -195,6 +195,7 @@ const LocalFrame& frame, SelectionDirection direction, TextGranularity granularity) { + frame.document()->updateStyleAndLayoutIgnorePendingStylesheets(); SelectionModifier selectionModifier(frame, frame.selection().selection()); if (selectionModifier.selection().isCaret()) selectionModifier.modify(FrameSelection::AlterationExtend, direction, @@ -431,6 +432,7 @@ static TriState stateStyle(LocalFrame& frame, CSSPropertyID propertyID, const char* desiredValue) { + frame.document()->updateStyleAndLayoutIgnorePendingStylesheets(); if (frame.editor().behavior().shouldToggleStyleBasedOnStartOfSelection()) return frame.editor().selectionStartHasStyle(propertyID, desiredValue) ? TrueTriState @@ -439,6 +441,8 @@ } static String valueStyle(LocalFrame& frame, CSSPropertyID propertyID) { + frame.document()->updateStyleAndLayoutIgnorePendingStylesheets(); + // FIXME: Rather than retrieving the style at the start of the current // selection, we should retrieve the style present throughout the selection // for non-Mac platforms. @@ -1822,6 +1826,8 @@ static bool enabledVisibleSelection(LocalFrame& frame, Event* event, EditorCommandSource) { + frame.document()->updateStyleAndLayoutIgnorePendingStylesheets(); + // The term "visible" here includes a caret in editable text or a range in any // text. const VisibleSelection& selection = frame.editor().selectionForCommand(event); @@ -1832,6 +1838,8 @@ static bool enabledVisibleSelectionAndMark(LocalFrame& frame, Event* event, EditorCommandSource) { + frame.document()->updateStyleAndLayoutIgnorePendingStylesheets(); + const VisibleSelection& selection = frame.editor().selectionForCommand(event); return ((selection.isCaret() && selection.isContentEditable()) || selection.isRange()) && @@ -1841,6 +1849,8 @@ static bool enableCaretInEditableText(LocalFrame& frame, Event* event, EditorCommandSource) { + frame.document()->updateStyleAndLayoutIgnorePendingStylesheets(); + const VisibleSelection& selection = frame.editor().selectionForCommand(event); return selection.isCaret() && selection.isContentEditable(); } @@ -1860,6 +1870,8 @@ static bool enabledInEditableText(LocalFrame& frame, Event* event, EditorCommandSource) { + frame.document()->updateStyleAndLayoutIgnorePendingStylesheets(); + // We should update selection to canonicalize with current layout and style, // before accessing |FrameSelection::selection()|. frame.selection().updateIfNeeded(); @@ -1884,6 +1896,8 @@ static bool enabledInRichlyEditableText(LocalFrame& frame, Event*, EditorCommandSource) { + frame.document()->updateStyleAndLayoutIgnorePendingStylesheets(); + // We should update selection to canonicalize with current layout and style, // before accessing |FrameSelection::selection()|. frame.selection().updateIfNeeded(); @@ -1903,6 +1917,8 @@ static bool enabledRangeInEditableText(LocalFrame& frame, Event*, EditorCommandSource) { + frame.document()->updateStyleAndLayoutIgnorePendingStylesheets(); + // We should update selection to canonicalize with current layout and style, // before accessing |FrameSelection::selection()|. frame.selection().updateIfNeeded(); @@ -1912,6 +1928,8 @@ static bool enabledRangeInRichlyEditableText(LocalFrame& frame, Event*, EditorCommandSource) { + frame.document()->updateStyleAndLayoutIgnorePendingStylesheets(); + // We should update selection to canonicalize with current layout and style, // before accessing |FrameSelection::selection()|. frame.selection().updateIfNeeded();
diff --git a/third_party/WebKit/Source/core/editing/commands/ReplaceSelectionCommand.cpp b/third_party/WebKit/Source/core/editing/commands/ReplaceSelectionCommand.cpp index 30d84ca..8914318 100644 --- a/third_party/WebKit/Source/core/editing/commands/ReplaceSelectionCommand.cpp +++ b/third_party/WebKit/Source/core/editing/commands/ReplaceSelectionCommand.cpp
@@ -315,6 +315,8 @@ holder->appendChild(m_fragment); rootEditableElement->appendChild(holder); + + // TODO(editing-dev): Hoist this call to the call sites. m_document->updateStyleAndLayoutIgnorePendingStylesheets(); return holder; @@ -606,6 +608,14 @@ : toHTMLQuoteElement(enclosingNodeOfType( Position::firstPositionInNode(context), isMailHTMLBlockquoteElement, CanCrossEditingBoundary)); + + // EditingStyle::removeStyleFromRulesAndContext() uses StyleResolver, + // which requires clean style. + // TODO(editing-dev): There is currently no way to update style without + // updating layout. We might want to have updateLifcycleToStyleClean() + // similar to FrameView::updateLifecylceToLayoutClean() in Document. + document().updateStyleAndLayoutIgnorePendingStylesheets(); + if (blockquoteElement) newInlineStyle->removeStyleFromRulesAndContext( element, document().documentElement());
diff --git a/third_party/WebKit/Source/core/editing/commands/TypingCommand.cpp b/third_party/WebKit/Source/core/editing/commands/TypingCommand.cpp index 4f16d7ec..534f7b5c 100644 --- a/third_party/WebKit/Source/core/editing/commands/TypingCommand.cpp +++ b/third_party/WebKit/Source/core/editing/commands/TypingCommand.cpp
@@ -549,6 +549,7 @@ typingAddedToOpenCommand(DeleteKey); m_smartDelete = false; + document().updateStyleAndLayoutIgnorePendingStylesheets(); SelectionModifier selectionModifier(*frame, endingSelection()); selectionModifier.modify(FrameSelection::AlterationExtend, @@ -694,6 +695,7 @@ break; case CaretSelection: { m_smartDelete = false; + document().updateStyleAndLayoutIgnorePendingStylesheets(); // Handle delete at beginning-of-block case. // Do nothing in the case that the caret is at the start of a
diff --git a/third_party/WebKit/Source/core/editing/serializers/Serialization.cpp b/third_party/WebKit/Source/core/editing/serializers/Serialization.cpp index f87143b..bb8a5de 100644 --- a/third_party/WebKit/Source/core/editing/serializers/Serialization.cpp +++ b/third_party/WebKit/Source/core/editing/serializers/Serialization.cpp
@@ -276,7 +276,10 @@ return emptyString(); Document* document = startPosition.document(); - document->updateStyleAndLayoutIgnorePendingStylesheets(); + + DCHECK(!document->needsLayoutTreeUpdate()); + DocumentLifecycle::DisallowTransitionScope disallowTransition( + document->lifecycle()); HTMLElement* specialCommonAncestor = highestAncestorToWrapMarkup<Strategy>( startPosition, endPosition, shouldAnnotate, constrainingAncestor);
diff --git a/third_party/WebKit/Source/core/editing/spellcheck/SpellChecker.cpp b/third_party/WebKit/Source/core/editing/spellcheck/SpellChecker.cpp index 570ec08..6c24e05 100644 --- a/third_party/WebKit/Source/core/editing/spellcheck/SpellChecker.cpp +++ b/third_party/WebKit/Source/core/editing/spellcheck/SpellChecker.cpp
@@ -975,9 +975,7 @@ void SpellChecker::removeMarkers(const VisibleSelection& selection, DocumentMarker::MarkerTypes markerTypes) { - // TODO(xiaochengh): The use of updateStyleAndLayoutIgnorePendingStylesheets - // needs to be audited. See http://crbug.com/590369 for more details. - frame().document()->updateStyleAndLayoutIgnorePendingStylesheets(); + DCHECK(!frame().document()->needsLayoutTreeUpdate()); const EphemeralRange& range = selection.toNormalizedEphemeralRange(); if (range.isNull())
diff --git a/third_party/WebKit/Source/core/events/CompositionEvent.cpp b/third_party/WebKit/Source/core/events/CompositionEvent.cpp index ca90b2e..3971265b 100644 --- a/third_party/WebKit/Source/core/events/CompositionEvent.cpp +++ b/third_party/WebKit/Source/core/events/CompositionEvent.cpp
@@ -38,6 +38,7 @@ true, true, ComposedMode::Composed, + WTF::monotonicallyIncreasingTime(), view, 0, InputDeviceCapabilities::doesntFireTouchEventsSourceCapabilities()),
diff --git a/third_party/WebKit/Source/core/events/FocusEvent.cpp b/third_party/WebKit/Source/core/events/FocusEvent.cpp index 756eb03..ee7417b6 100644 --- a/third_party/WebKit/Source/core/events/FocusEvent.cpp +++ b/third_party/WebKit/Source/core/events/FocusEvent.cpp
@@ -51,6 +51,7 @@ canBubble, cancelable, ComposedMode::Composed, + WTF::monotonicallyIncreasingTime(), view, detail, sourceCapabilities),
diff --git a/third_party/WebKit/Source/core/events/SecurityPolicyViolationEvent.cpp b/third_party/WebKit/Source/core/events/SecurityPolicyViolationEvent.cpp index e59b529..bcbef373 100644 --- a/third_party/WebKit/Source/core/events/SecurityPolicyViolationEvent.cpp +++ b/third_party/WebKit/Source/core/events/SecurityPolicyViolationEvent.cpp
@@ -38,7 +38,7 @@ SecurityPolicyViolationEvent::SecurityPolicyViolationEvent( const AtomicString& type, const SecurityPolicyViolationEventInit& initializer) - : Event(type, initializer), + : Event(type, true, false, ComposedMode::Composed), m_disposition(ContentSecurityPolicyHeaderTypeEnforce), m_lineNumber(0), m_columnNumber(0),
diff --git a/third_party/WebKit/Source/core/events/TextEvent.cpp b/third_party/WebKit/Source/core/events/TextEvent.cpp index 28feed301..f870f8e 100644 --- a/third_party/WebKit/Source/core/events/TextEvent.cpp +++ b/third_party/WebKit/Source/core/events/TextEvent.cpp
@@ -69,8 +69,10 @@ true, true, ComposedMode::Composed, + WTF::monotonicallyIncreasingTime(), view, - 0), + 0, + nullptr), m_inputType(inputType), m_data(data), m_pastingFragment(nullptr), @@ -86,8 +88,10 @@ true, true, ComposedMode::Composed, + WTF::monotonicallyIncreasingTime(), view, - 0), + 0, + nullptr), m_inputType(TextEventInputPaste), m_data(data), m_pastingFragment(pastingFragment),
diff --git a/third_party/WebKit/Source/core/events/UIEvent.cpp b/third_party/WebKit/Source/core/events/UIEvent.cpp index 9eac49a..2ae955e8 100644 --- a/third_party/WebKit/Source/core/events/UIEvent.cpp +++ b/third_party/WebKit/Source/core/events/UIEvent.cpp
@@ -26,20 +26,6 @@ UIEvent::UIEvent() : m_detail(0), m_sourceCapabilities(nullptr) {} -// TODO(lanwei): Will add sourceCapabilities to all the subclass of UIEvent -// later, see https://crbug.com/476530. -UIEvent::UIEvent(const AtomicString& eventType, - bool canBubbleArg, - bool cancelableArg, - ComposedMode composedMode, - AbstractView* viewArg, - int detailArg, - InputDeviceCapabilities* sourceCapabilitiesArg) - : Event(eventType, canBubbleArg, cancelableArg, composedMode), - m_view(viewArg), - m_detail(detailArg), - m_sourceCapabilities(sourceCapabilitiesArg) {} - UIEvent::UIEvent(const AtomicString& eventType, bool canBubbleArg, bool cancelableArg,
diff --git a/third_party/WebKit/Source/core/events/UIEvent.h b/third_party/WebKit/Source/core/events/UIEvent.h index 525f1f27..c74113e 100644 --- a/third_party/WebKit/Source/core/events/UIEvent.h +++ b/third_party/WebKit/Source/core/events/UIEvent.h
@@ -42,14 +42,6 @@ public: static UIEvent* create() { return new UIEvent; } static UIEvent* create(const AtomicString& type, - bool canBubble, - bool cancelable, - AbstractView* view, - int detail) { - return new UIEvent(type, canBubble, cancelable, ComposedMode::Scoped, view, - detail); - } - static UIEvent* create(const AtomicString& type, const UIEventInit& initializer) { return new UIEvent(type, initializer); } @@ -83,16 +75,6 @@ protected: UIEvent(); - // TODO(crbug.com/563542): Remove of this ctor in favor of making - // platformTimeStamp (and perhaps sourceCapabilities) required in all - // constructions sites - UIEvent(const AtomicString& type, - bool canBubble, - bool cancelable, - ComposedMode, - AbstractView*, - int detail, - InputDeviceCapabilities* sourceCapabilities = nullptr); UIEvent(const AtomicString& type, bool canBubble, bool cancelable,
diff --git a/third_party/WebKit/Source/core/fetch/ResourceFetcher.cpp b/third_party/WebKit/Source/core/fetch/ResourceFetcher.cpp index 8e4b279b..5105488 100644 --- a/third_party/WebKit/Source/core/fetch/ResourceFetcher.cpp +++ b/third_party/WebKit/Source/core/fetch/ResourceFetcher.cpp
@@ -491,8 +491,9 @@ context().populateRequestData(request.mutableResourceRequest()); if (request.resourceRequest().httpHeaderField("Upgrade-Insecure-Requests") != - AtomicString("1")) + AtomicString("1")) { context().modifyRequestForCSP(request.mutableResourceRequest()); + } context().addClientHintsIfNecessary(request); context().addCSPHeaderIfNecessary(factory.type(), request); @@ -502,6 +503,12 @@ if (!request.url().isValid()) return nullptr; + unsigned long identifier = createUniqueIdentifier(); + request.mutableResourceRequest().setPriority(computeLoadPriority( + factory.type(), request, ResourcePriority::NotVisible)); + initializeResourceRequest(request.mutableResourceRequest(), factory.type(), + request.defer()); + if (!context().canRequest( factory.type(), request.resourceRequest(), MemoryCache::removeFragmentIdentifierIfNeeded(request.url()), @@ -511,11 +518,6 @@ return resourceForBlockedRequest(request, factory); } - unsigned long identifier = createUniqueIdentifier(); - request.mutableResourceRequest().setPriority(computeLoadPriority( - factory.type(), request, ResourcePriority::NotVisible)); - initializeResourceRequest(request.mutableResourceRequest(), factory.type(), - request.defer()); context().willStartLoadingResource( identifier, request.mutableResourceRequest(), factory.type()); if (!request.url().isValid())
diff --git a/third_party/WebKit/Source/core/fileapi/File.cpp b/third_party/WebKit/Source/core/fileapi/File.cpp index cc3081c..936b82d5 100644 --- a/third_party/WebKit/Source/core/fileapi/File.cpp +++ b/third_party/WebKit/Source/core/fileapi/File.cpp
@@ -60,9 +60,9 @@ static std::unique_ptr<BlobData> createBlobDataForFileWithType( const String& path, const String& contentType) { - std::unique_ptr<BlobData> blobData = BlobData::create(); + std::unique_ptr<BlobData> blobData = + BlobData::createForFileWithUnknownSize(path); blobData->setContentType(contentType); - blobData->appendFile(path); return blobData; }
diff --git a/third_party/WebKit/Source/core/frame/FrameView.cpp b/third_party/WebKit/Source/core/frame/FrameView.cpp index 5cfb85f..c1d058d 100644 --- a/third_party/WebKit/Source/core/frame/FrameView.cpp +++ b/third_party/WebKit/Source/core/frame/FrameView.cpp
@@ -853,7 +853,8 @@ return RuntimeEnabledFeatures::scrollAnchoringEnabled() && !RuntimeEnabledFeatures::rootLayerScrollingEnabled() && m_scrollAnchor.hasScroller() && - layoutBox()->style()->overflowAnchor() != AnchorNone; + layoutBox()->style()->overflowAnchor() != AnchorNone && + !m_frame->document()->finishingOrIsPrinting(); } static inline void layoutFromRootObject(LayoutObject& root) {
diff --git a/third_party/WebKit/Source/core/frame/LocalFrame.cpp b/third_party/WebKit/Source/core/frame/LocalFrame.cpp index 895e1b97..ebcbf86 100644 --- a/third_party/WebKit/Source/core/frame/LocalFrame.cpp +++ b/third_party/WebKit/Source/core/frame/LocalFrame.cpp
@@ -557,7 +557,8 @@ // the document. See https://bugs.webkit.org/show_bug.cgi?id=43704 ResourceCacheValidationSuppressor validationSuppressor(document()->fetcher()); - document()->setPrinting(printing); + document()->setPrinting(printing ? Document::Printing + : Document::FinishingPrinting); view()->adjustMediaTypeForPrinting(printing); if (shouldUsePrintingLayout()) { @@ -579,6 +580,9 @@ if (child->isLocalFrame()) toLocalFrame(child)->setPrinting(printing, FloatSize(), FloatSize(), 0); } + + if (!printing) + document()->setPrinting(Document::NotPrinting); } bool LocalFrame::shouldUsePrintingLayout() const { @@ -715,11 +719,7 @@ String LocalFrame::selectedTextForClipboard() const { if (!document()) return emptyString(); - - // TODO(xiaochengh): The use of updateStyleAndLayoutIgnorePendingStylesheets - // needs to be audited. See http://crbug.com/590369 for more details. - document()->updateStyleAndLayoutIgnorePendingStylesheets(); - + DCHECK(!document()->needsLayoutTreeUpdate()); return selection().selectedTextForClipboard(); }
diff --git a/third_party/WebKit/Source/core/frame/UseCounter.h b/third_party/WebKit/Source/core/frame/UseCounter.h index 8ce4de0..351a1b3 100644 --- a/third_party/WebKit/Source/core/frame/UseCounter.h +++ b/third_party/WebKit/Source/core/frame/UseCounter.h
@@ -1119,7 +1119,6 @@ V8RegExpPrototypeSourceGetter = 1396, V8RegExpPrototypeOldFlagGetter = 1397, V8DecimalWithLeadingZeroInStrictMode = 1398, - FormSubmissionNotInDocumentTree = 1399, GetUserMediaPrefixed = 1400, GetUserMediaLegacy = 1401, GetUserMediaPromise = 1402,
diff --git a/third_party/WebKit/Source/core/frame/csp/CSPDirectiveList.cpp b/third_party/WebKit/Source/core/frame/csp/CSPDirectiveList.cpp index bcb25c1..b37b62b4 100644 --- a/third_party/WebKit/Source/core/frame/csp/CSPDirectiveList.cpp +++ b/third_party/WebKit/Source/core/frame/csp/CSPDirectiveList.cpp
@@ -10,6 +10,7 @@ #include "core/dom/SpaceSplitString.h" #include "core/frame/LocalFrame.h" #include "core/frame/UseCounter.h" +#include "core/html/HTMLScriptElement.h" #include "core/inspector/ConsoleMessage.h" #include "platform/Crypto.h" #include "platform/RuntimeEnabledFeatures.h" @@ -125,7 +126,8 @@ const String& consoleMessage, const KURL& blockedURL, const String& contextURL, - const WTF::OrdinalNumber& contextLine) const { + const WTF::OrdinalNumber& contextLine, + Element* element) const { String message = isReportOnly() ? "[Report Only] " + consoleMessage : consoleMessage; m_policy->logToConsole(ConsoleMessage::create( @@ -134,7 +136,7 @@ m_policy->reportViolation( directiveText, effectiveDirective, message, blockedURL, m_reportEndpoints, m_header, m_headerType, ContentSecurityPolicy::InlineViolation, nullptr, - RedirectStatus::NoRedirect, contextLine.oneBasedInt()); + RedirectStatus::NoRedirect, contextLine.oneBasedInt(), element); } void CSPDirectiveList::reportViolationWithState( @@ -379,6 +381,7 @@ bool CSPDirectiveList::checkInlineAndReportViolation( SourceListDirective* directive, const String& consoleMessage, + Element* element, const String& contextURL, const WTF::OrdinalNumber& contextLine, bool isScript, @@ -408,7 +411,7 @@ directive->text(), isScript ? ContentSecurityPolicy::ScriptSrc : ContentSecurityPolicy::StyleSrc, consoleMessage + "\"" + directive->text() + "\"." + suffix + "\n", KURL(), - contextURL, contextLine); + contextURL, contextLine, element); if (!isReportOnly()) { if (isScript) @@ -492,6 +495,7 @@ } bool CSPDirectiveList::allowJavaScriptURLs( + Element* element, const String& contextURL, const WTF::OrdinalNumber& contextLine, ContentSecurityPolicy::ReportingStatus reportingStatus) const { @@ -500,12 +504,13 @@ operativeDirective(m_scriptSrc.get()), "Refused to execute JavaScript URL because it violates the following " "Content Security Policy directive: ", - contextURL, contextLine, true, "sha256-..."); + element, contextURL, contextLine, true, "sha256-..."); } return checkInline(operativeDirective(m_scriptSrc.get())); } bool CSPDirectiveList::allowInlineEventHandlers( + Element* element, const String& contextURL, const WTF::OrdinalNumber& contextLine, ContentSecurityPolicy::ReportingStatus reportingStatus) const { @@ -514,32 +519,37 @@ operativeDirective(m_scriptSrc.get()), "Refused to execute inline event handler because it violates the " "following Content Security Policy directive: ", - contextURL, contextLine, true, "sha256-..."); + element, contextURL, contextLine, true, "sha256-..."); } return checkInline(operativeDirective(m_scriptSrc.get())); } bool CSPDirectiveList::allowInlineScript( + Element* element, const String& contextURL, const String& nonce, - ParserDisposition parserDisposition, const WTF::OrdinalNumber& contextLine, ContentSecurityPolicy::ReportingStatus reportingStatus, const String& content) const { if (isMatchingNoncePresent(operativeDirective(m_scriptSrc.get()), nonce)) return true; - if (parserDisposition == NotParserInserted && allowDynamic()) + if (element && isHTMLScriptElement(element) && + !toHTMLScriptElement(element)->loader()->isParserInserted() && + allowDynamic()) { return true; - if (reportingStatus == ContentSecurityPolicy::SendReport) + } + if (reportingStatus == ContentSecurityPolicy::SendReport) { return checkInlineAndReportViolation( operativeDirective(m_scriptSrc.get()), "Refused to execute inline script because it violates the following " "Content Security Policy directive: ", - contextURL, contextLine, true, getSha256String(content)); + element, contextURL, contextLine, true, getSha256String(content)); + } return checkInline(operativeDirective(m_scriptSrc.get())); } bool CSPDirectiveList::allowInlineStyle( + Element* element, const String& contextURL, const String& nonce, const WTF::OrdinalNumber& contextLine, @@ -547,12 +557,13 @@ const String& content) const { if (isMatchingNoncePresent(operativeDirective(m_styleSrc.get()), nonce)) return true; - if (reportingStatus == ContentSecurityPolicy::SendReport) + if (reportingStatus == ContentSecurityPolicy::SendReport) { return checkInlineAndReportViolation( operativeDirective(m_styleSrc.get()), "Refused to apply inline style because it violates the following " "Content Security Policy directive: ", - contextURL, contextLine, false, getSha256String(content)); + element, contextURL, contextLine, false, getSha256String(content)); + } return checkInline(operativeDirective(m_styleSrc.get())); }
diff --git a/third_party/WebKit/Source/core/frame/csp/CSPDirectiveList.h b/third_party/WebKit/Source/core/frame/csp/CSPDirectiveList.h index 8c70a10..7d017f855 100644 --- a/third_party/WebKit/Source/core/frame/csp/CSPDirectiveList.h +++ b/third_party/WebKit/Source/core/frame/csp/CSPDirectiveList.h
@@ -42,19 +42,22 @@ return m_headerSource; } - bool allowJavaScriptURLs(const String& contextURL, + bool allowJavaScriptURLs(Element*, + const String& contextURL, const WTF::OrdinalNumber& contextLine, ContentSecurityPolicy::ReportingStatus) const; - bool allowInlineEventHandlers(const String& contextURL, + bool allowInlineEventHandlers(Element*, + const String& contextURL, const WTF::OrdinalNumber& contextLine, ContentSecurityPolicy::ReportingStatus) const; - bool allowInlineScript(const String& contextURL, + bool allowInlineScript(Element*, + const String& contextURL, const String& nonce, - ParserDisposition, const WTF::OrdinalNumber& contextLine, ContentSecurityPolicy::ReportingStatus, const String& scriptContent) const; - bool allowInlineStyle(const String& contextURL, + bool allowInlineStyle(Element*, + const String& contextURL, const String& nonce, const WTF::OrdinalNumber& contextLine, ContentSecurityPolicy::ReportingStatus, @@ -210,7 +213,8 @@ const String& consoleMessage, const KURL& blockedURL, const String& contextURL, - const WTF::OrdinalNumber& contextLine) const; + const WTF::OrdinalNumber& contextLine, + Element*) const; void reportViolationWithState( const String& directiveText, const String& effectiveDirective, @@ -246,6 +250,7 @@ ContentSecurityPolicy::WillNotThrowException) const; bool checkInlineAndReportViolation(SourceListDirective*, const String& consoleMessage, + Element*, const String& contextURL, const WTF::OrdinalNumber& contextLine, bool isScript,
diff --git a/third_party/WebKit/Source/core/frame/csp/ContentSecurityPolicy.cpp b/third_party/WebKit/Source/core/frame/csp/ContentSecurityPolicy.cpp index 3ff3966..94367f9 100644 --- a/third_party/WebKit/Source/core/frame/csp/ContentSecurityPolicy.cpp +++ b/third_party/WebKit/Source/core/frame/csp/ContentSecurityPolicy.cpp
@@ -30,7 +30,9 @@ #include "core/dom/DOMStringList.h" #include "core/dom/Document.h" #include "core/dom/Element.h" +#include "core/dom/ExecutionContextTask.h" #include "core/dom/SandboxFlags.h" +#include "core/events/EventQueue.h" #include "core/events/SecurityPolicyViolationEvent.h" #include "core/fetch/IntegrityMetadata.h" #include "core/frame/FrameClient.h" @@ -311,6 +313,30 @@ applyPolicySideEffectsToExecutionContext(); } +bool ContentSecurityPolicy::shouldEnforceEmbeddersPolicy( + const ResourceResponse& response, + SecurityOrigin* parentOrigin) { + if (response.url().isEmpty() || response.url().protocolIsAbout() || + response.url().protocolIsData() || response.url().protocolIs("blob") || + response.url().protocolIs("filesystem")) { + return true; + } + + if (parentOrigin->canAccess(SecurityOrigin::create(response.url()).get())) + return true; + + String header = response.httpHeaderField(HTTPNames::Allow_CSP_From); + header = header.stripWhiteSpace(); + if (header == "*") + return true; + if (RefPtr<SecurityOrigin> childOrigin = + SecurityOrigin::createFromString(header)) { + return parentOrigin->canAccess(childOrigin.get()); + } + + return false; +} + void ContentSecurityPolicy::addPolicyFromHeaderValue( const String& header, ContentSecurityPolicyHeaderType type, @@ -441,36 +467,42 @@ } template <bool (CSPDirectiveList::*allowed)( + Element*, const String&, const WTF::OrdinalNumber&, ContentSecurityPolicy::ReportingStatus) const> bool isAllowedByAll(const CSPDirectiveListVector& policies, + Element* element, const String& contextURL, const WTF::OrdinalNumber& contextLine, ContentSecurityPolicy::ReportingStatus reportingStatus) { bool isAllowed = true; - for (const auto& policy : policies) - isAllowed &= - (policy.get()->*allowed)(contextURL, contextLine, reportingStatus); + for (const auto& policy : policies) { + isAllowed &= (policy.get()->*allowed)(element, contextURL, contextLine, + reportingStatus); + } return isAllowed; } template < - bool (CSPDirectiveList::*allowed)(const String&, + bool (CSPDirectiveList::*allowed)(Element*, + const String&, const String&, const WTF::OrdinalNumber&, ContentSecurityPolicy::ReportingStatus, const String& content) const> bool isAllowedByAll(const CSPDirectiveListVector& policies, + Element* element, const String& contextURL, const String& nonce, const WTF::OrdinalNumber& contextLine, ContentSecurityPolicy::ReportingStatus reportingStatus, const String& content) { bool isAllowed = true; - for (const auto& policy : policies) - isAllowed &= (policy.get()->*allowed)(contextURL, nonce, contextLine, - reportingStatus, content); + for (const auto& policy : policies) { + isAllowed &= (policy.get()->*allowed)( + element, contextURL, nonce, contextLine, reportingStatus, content); + } return isAllowed; } @@ -628,14 +660,16 @@ } bool ContentSecurityPolicy::allowJavaScriptURLs( + Element* element, const String& contextURL, const WTF::OrdinalNumber& contextLine, ContentSecurityPolicy::ReportingStatus reportingStatus) const { return isAllowedByAll<&CSPDirectiveList::allowJavaScriptURLs>( - m_policies, contextURL, contextLine, reportingStatus); + m_policies, element, contextURL, contextLine, reportingStatus); } bool ContentSecurityPolicy::allowInlineEventHandler( + Element* element, const String& source, const String& contextURL, const WTF::OrdinalNumber& contextLine, @@ -649,31 +683,34 @@ m_policies)) return true; return isAllowedByAll<&CSPDirectiveList::allowInlineEventHandlers>( - m_policies, contextURL, contextLine, reportingStatus); + m_policies, element, contextURL, contextLine, reportingStatus); } bool ContentSecurityPolicy::allowInlineScript( + Element* element, const String& contextURL, const String& nonce, - ParserDisposition parserDisposition, const WTF::OrdinalNumber& contextLine, const String& scriptContent, ContentSecurityPolicy::ReportingStatus reportingStatus) const { + DCHECK(element); return isAllowedByAll<&CSPDirectiveList::allowInlineScript>( - m_policies, contextURL, nonce, parserDisposition, contextLine, - reportingStatus, scriptContent); + m_policies, element, contextURL, nonce, contextLine, reportingStatus, + scriptContent); } bool ContentSecurityPolicy::allowInlineStyle( + Element* element, const String& contextURL, const String& nonce, const WTF::OrdinalNumber& contextLine, const String& styleContent, ContentSecurityPolicy::ReportingStatus reportingStatus) const { + DCHECK(element); if (m_overrideInlineStyleAllowed) return true; return isAllowedByAll<&CSPDirectiveList::allowInlineStyle>( - m_policies, contextURL, nonce, contextLine, reportingStatus, + m_policies, element, contextURL, nonce, contextLine, reportingStatus, styleContent); } @@ -1116,7 +1153,8 @@ ViolationType violationType, LocalFrame* contextFrame, RedirectStatus redirectStatus, - int contextLine) { + int contextLine, + Element* element) { ASSERT(violationType == URLViolation || blockedURL.isEmpty()); // TODO(lukasza): Support sending reports from OOPIFs - @@ -1198,9 +1236,6 @@ LocalFrame* frame = document->frame(); if (!frame) return; - frame->localDOMWindow()->enqueueDocumentEvent( - SecurityPolicyViolationEvent::create( - EventTypeNames::securitypolicyviolation, violationData)); for (const String& endpoint : reportEndpoints) { // If we have a context frame we're dealing with 'frame-ancestors' and we @@ -1217,6 +1252,27 @@ PingLoader::sendViolationReport( frame, url, report, PingLoader::ContentSecurityPolicyViolationReport); } + + document->postTask( + BLINK_FROM_HERE, + createSameThreadTask(&ContentSecurityPolicy::dispatchViolationEvents, + wrapPersistent(this), violationData, + wrapPersistent(element), wrapPersistent(document))); +} + +void ContentSecurityPolicy::dispatchViolationEvents( + const SecurityPolicyViolationEventInit& violationData, + Element* element, + Document* document) { + SecurityPolicyViolationEvent* event = SecurityPolicyViolationEvent::create( + EventTypeNames::securitypolicyviolation, violationData); + DCHECK(event->bubbles()); + if (element && element->isConnected() && element->document() == document) { + event->setTarget(element); + document->domWindow()->getEventQueue()->enqueueEvent(event); + } else { + document->domWindow()->enqueueDocumentEvent(event); + } } void ContentSecurityPolicy::reportMixedContent(const KURL& mixedURL,
diff --git a/third_party/WebKit/Source/core/frame/csp/ContentSecurityPolicy.h b/third_party/WebKit/Source/core/frame/csp/ContentSecurityPolicy.h index a51449bb..0729e7d 100644 --- a/third_party/WebKit/Source/core/frame/csp/ContentSecurityPolicy.h +++ b/third_party/WebKit/Source/core/frame/csp/ContentSecurityPolicy.h
@@ -62,6 +62,7 @@ class KURL; class ResourceRequest; class SecurityOrigin; +class SecurityPolicyViolationEventInit; typedef int SandboxFlags; typedef HeapVector<Member<CSPDirectiveList>> CSPDirectiveListVector; @@ -143,10 +144,20 @@ std::unique_ptr<Vector<CSPHeaderAndType>> headers() const; - bool allowJavaScriptURLs(const String& contextURL, + // |element| will not be present for navigations to javascript URLs, + // as those checks happen in the middle of the navigation algorithm, + // and we generally don't have access to the responsible element. + bool allowJavaScriptURLs(Element*, + const String& contextURL, const WTF::OrdinalNumber& contextLine, ReportingStatus = SendReport) const; - bool allowInlineEventHandler(const String& source, + + // |element| will be present almost all of the time, but because of + // strangeness around targeting handlers for '<body>', '<svg>', and + // '<frameset>', it will be 'nullptr' for handlers on those + // elements. + bool allowInlineEventHandler(Element*, + const String& source, const String& contextURL, const WTF::OrdinalNumber& contextLine, ReportingStatus = SendReport) const; @@ -214,13 +225,14 @@ const String& nonce, RedirectStatus = RedirectStatus::NoRedirect, ReportingStatus = SendReport) const; - bool allowInlineScript(const String& contextURL, + bool allowInlineScript(Element*, + const String& contextURL, const String& nonce, - ParserDisposition, const WTF::OrdinalNumber& contextLine, const String& scriptContent, ReportingStatus = SendReport) const; - bool allowInlineStyle(const String& contextURL, + bool allowInlineStyle(Element*, + const String& contextURL, const String& nonce, const WTF::OrdinalNumber& contextLine, const String& styleContent, @@ -317,7 +329,8 @@ ViolationType, LocalFrame* = nullptr, RedirectStatus = RedirectStatus::FollowedRedirect, - int contextLine = 0); + int contextLine = 0, + Element* = nullptr); // Called when mixed content is detected on a page; will trigger a violation // report if the 'block-all-mixed-content' directive is specified for a @@ -354,6 +367,12 @@ static bool isNonceableElement(const Element*); + // This method checks whether the request should be allowed for an + // experimental EmbeddingCSP feature + // Please, see https://w3c.github.io/webappsec-csp/embedded/#origin-allowed. + static bool shouldEnforceEmbeddersPolicy(const ResourceResponse&, + SecurityOrigin*); + Document* document() const; private: @@ -375,6 +394,9 @@ bool shouldSendViolationReport(const String&) const; void didSendViolationReport(const String&); + void dispatchViolationEvents(const SecurityPolicyViolationEventInit&, + Element*, + Document*); Member<ExecutionContext> m_executionContext; bool m_overrideInlineStyleAllowed;
diff --git a/third_party/WebKit/Source/core/frame/csp/ContentSecurityPolicyTest.cpp b/third_party/WebKit/Source/core/frame/csp/ContentSecurityPolicyTest.cpp index c9dd095..207d34c 100644 --- a/third_party/WebKit/Source/core/frame/csp/ContentSecurityPolicyTest.cpp +++ b/third_party/WebKit/Source/core/frame/csp/ContentSecurityPolicyTest.cpp
@@ -7,6 +7,7 @@ #include "core/dom/Document.h" #include "core/fetch/IntegrityMetadata.h" #include "core/frame/csp/CSPDirectiveList.h" +#include "core/html/HTMLScriptElement.h" #include "core/loader/DocumentLoader.h" #include "core/testing/DummyPageHolder.h" #include "platform/Crypto.h" @@ -705,6 +706,7 @@ << "`, Nonce: `" << test.nonce << "`"); unsigned expectedReports = test.allowed ? 0u : 1u; + HTMLScriptElement* element = HTMLScriptElement::create(*document, true); // Enforce 'script-src' Persistent<ContentSecurityPolicy> policy = ContentSecurityPolicy::create(); @@ -713,8 +715,8 @@ ContentSecurityPolicyHeaderTypeEnforce, ContentSecurityPolicyHeaderSourceHTTP); EXPECT_EQ(test.allowed, - policy->allowInlineScript(contextURL, String(test.nonce), - ParserInserted, contextLine, content)); + policy->allowInlineScript(element, contextURL, String(test.nonce), + contextLine, content)); EXPECT_EQ(expectedReports, policy->m_violationReportsSent.size()); // Enforce 'style-src' @@ -724,7 +726,7 @@ ContentSecurityPolicyHeaderTypeEnforce, ContentSecurityPolicyHeaderSourceHTTP); EXPECT_EQ(test.allowed, - policy->allowInlineStyle(contextURL, String(test.nonce), + policy->allowInlineStyle(element, contextURL, String(test.nonce), contextLine, content)); EXPECT_EQ(expectedReports, policy->m_violationReportsSent.size()); @@ -735,7 +737,7 @@ ContentSecurityPolicyHeaderTypeReport, ContentSecurityPolicyHeaderSourceHTTP); EXPECT_TRUE(policy->allowInlineScript( - contextURL, String(test.nonce), ParserInserted, contextLine, content)); + element, contextURL, String(test.nonce), contextLine, content)); EXPECT_EQ(expectedReports, policy->m_violationReportsSent.size()); // Report 'style-src' @@ -744,8 +746,8 @@ policy->didReceiveHeader(String("style-src ") + test.policy, ContentSecurityPolicyHeaderTypeReport, ContentSecurityPolicyHeaderSourceHTTP); - EXPECT_TRUE(policy->allowInlineStyle(contextURL, String(test.nonce), - contextLine, content)); + EXPECT_TRUE(policy->allowInlineStyle( + element, contextURL, String(test.nonce), contextLine, content)); EXPECT_EQ(expectedReports, policy->m_violationReportsSent.size()); } } @@ -862,4 +864,56 @@ } } +TEST_F(ContentSecurityPolicyTest, ShouldEnforceEmbeddersPolicy) { + struct TestCase { + const char* resourceURL; + const bool inherits; + } cases[] = { + // Same-origin + {"https://example.test/index.html", true}, + // Cross-origin + {"http://example.test/index.html", false}, + {"http://example.test:8443/index.html", false}, + {"https://example.test:8443/index.html", false}, + {"http://not.example.test/index.html", false}, + {"https://not.example.test/index.html", false}, + {"https://not.example.test:8443/index.html", false}, + + // Inherit + {"about:blank", true}, + {"data:text/html,yay", true}, + {"blob:https://example.test/bbe708f3-defd-4852-93b6-cf94e032f08d", true}, + {"filesystem:http://example.test/temporary/index.html", true}, + }; + + for (const auto& test : cases) { + ResourceResponse response; + response.setURL(KURL(ParsedURLString, test.resourceURL)); + EXPECT_EQ(ContentSecurityPolicy::shouldEnforceEmbeddersPolicy( + response, secureOrigin.get()), + test.inherits); + + response.setHTTPHeaderField(HTTPNames::Allow_CSP_From, AtomicString("*")); + EXPECT_TRUE(ContentSecurityPolicy::shouldEnforceEmbeddersPolicy( + response, secureOrigin.get())); + + response.setHTTPHeaderField(HTTPNames::Allow_CSP_From, + AtomicString("* not a valid header")); + EXPECT_EQ(ContentSecurityPolicy::shouldEnforceEmbeddersPolicy( + response, secureOrigin.get()), + test.inherits); + + response.setHTTPHeaderField(HTTPNames::Allow_CSP_From, + AtomicString("http://example.test")); + EXPECT_EQ(ContentSecurityPolicy::shouldEnforceEmbeddersPolicy( + response, secureOrigin.get()), + test.inherits); + + response.setHTTPHeaderField(HTTPNames::Allow_CSP_From, + AtomicString("https://example.test")); + EXPECT_TRUE(ContentSecurityPolicy::shouldEnforceEmbeddersPolicy( + response, secureOrigin.get())); + } +} + } // namespace blink
diff --git a/third_party/WebKit/Source/core/html/HTMLFormElement.cpp b/third_party/WebKit/Source/core/html/HTMLFormElement.cpp index dd75c5d..86834c5 100644 --- a/third_party/WebKit/Source/core/html/HTMLFormElement.cpp +++ b/third_party/WebKit/Source/core/html/HTMLFormElement.cpp
@@ -347,9 +347,16 @@ if (!view || !frame || !frame->page()) return; - // See crbug.com/586749. - if (!isConnected()) - UseCounter::count(document(), UseCounter::FormSubmissionNotInDocumentTree); + // https://html.spec.whatwg.org/multipage/forms.html#form-submission-algorithm + // 2. If form document is not connected, has no associated browsing context, + // or its active sandboxing flag set has its sandboxed forms browsing + // context flag set, then abort these steps without doing anything. + if (!isConnected()) { + document().addConsoleMessage(ConsoleMessage::create( + JSMessageSource, WarningMessageLevel, + "Form submission canceled because the form is not connected")); + return; + } if (m_isSubmitting) return; @@ -414,7 +421,7 @@ submission->action())) return; document().frame()->script().executeScriptIfJavaScriptURL( - submission->action()); + submission->action(), this); return; }
diff --git a/third_party/WebKit/Source/core/html/HTMLFrameElementBase.cpp b/third_party/WebKit/Source/core/html/HTMLFrameElementBase.cpp index 7221524..5168a16 100644 --- a/third_party/WebKit/Source/core/html/HTMLFrameElementBase.cpp +++ b/third_party/WebKit/Source/core/html/HTMLFrameElementBase.cpp
@@ -96,7 +96,7 @@ return; toLocalFrame(contentFrame()) ->script() - .executeScriptIfJavaScriptURL(scriptURL); + .executeScriptIfJavaScriptURL(scriptURL, this); } void HTMLFrameElementBase::frameOwnerPropertiesChanged() {
diff --git a/third_party/WebKit/Source/core/html/HTMLInputElement.cpp b/third_party/WebKit/Source/core/html/HTMLInputElement.cpp index 7acf9f40..7ee21b5 100644 --- a/third_party/WebKit/Source/core/html/HTMLInputElement.cpp +++ b/third_party/WebKit/Source/core/html/HTMLInputElement.cpp
@@ -320,14 +320,8 @@ // case of RangeSelection. crbug.com/443061. if (layoutObject()) layoutObject()->scrollRectToVisible(boundingBox()); - if (document().frame()) { - // TODO(xiaochengh): The use of - // updateStyleAndLayoutIgnorePendingStylesheets needs to be audited. See - // http://crbug.com/590369 for more details. - document().updateStyleAndLayoutIgnorePendingStylesheets(); - + if (document().frame()) document().frame()->selection().revealSelection(); - } } else { HTMLTextFormControlElement::updateFocusAppearance(selectionBehavior); }
diff --git a/third_party/WebKit/Source/core/html/HTMLMediaElement.h b/third_party/WebKit/Source/core/html/HTMLMediaElement.h index a5fd674..8050c40 100644 --- a/third_party/WebKit/Source/core/html/HTMLMediaElement.h +++ b/third_party/WebKit/Source/core/html/HTMLMediaElement.h
@@ -29,7 +29,7 @@ #include "bindings/core/v8/ActiveScriptWrappable.h" #include "bindings/core/v8/ScriptPromise.h" -#include "bindings/core/v8/ScriptWrappableVisitor.h" +#include "bindings/core/v8/TraceWrapperMember.h" #include "core/CoreExport.h" #include "core/dom/ActiveDOMObject.h" #include "core/dom/ExceptionCode.h"
diff --git a/third_party/WebKit/Source/core/html/HTMLMetaElement.cpp b/third_party/WebKit/Source/core/html/HTMLMetaElement.cpp index 713c421f..9a84945 100644 --- a/third_party/WebKit/Source/core/html/HTMLMetaElement.cpp +++ b/third_party/WebKit/Source/core/html/HTMLMetaElement.cpp
@@ -497,7 +497,7 @@ return; HttpEquiv::process(document(), httpEquivValue, contentValue, - inDocumentHead(this)); + inDocumentHead(this), this); } WTF::TextEncoding HTMLMetaElement::computeEncoding() const {
diff --git a/third_party/WebKit/Source/core/html/HTMLTextAreaElement.cpp b/third_party/WebKit/Source/core/html/HTMLTextAreaElement.cpp index 12b94ab1..d38b101b 100644 --- a/third_party/WebKit/Source/core/html/HTMLTextAreaElement.cpp +++ b/third_party/WebKit/Source/core/html/HTMLTextAreaElement.cpp
@@ -254,13 +254,8 @@ case SelectionBehaviorOnFocus::None: return; } - if (document().frame()) { - // TODO(xiaochengh): The use of updateStyleAndLayoutIgnorePendingStylesheets - // needs to be audited. See http://crbug.com/590369 for more details. - document().updateStyleAndLayoutIgnorePendingStylesheets(); - + if (document().frame()) document().frame()->selection().revealSelection(); - } } void HTMLTextAreaElement::defaultEventHandler(Event* event) {
diff --git a/third_party/WebKit/Source/core/html/canvas/CanvasAsyncBlobCreator.cpp b/third_party/WebKit/Source/core/html/canvas/CanvasAsyncBlobCreator.cpp index 5d8a2e9..58af50f 100644 --- a/third_party/WebKit/Source/core/html/canvas/CanvasAsyncBlobCreator.cpp +++ b/third_party/WebKit/Source/core/html/canvas/CanvasAsyncBlobCreator.cpp
@@ -85,6 +85,69 @@ return mimeTypeEnum; } +void recordIdleTaskStatusHistogram( + CanvasAsyncBlobCreator::IdleTaskStatus status) { + DEFINE_STATIC_LOCAL(EnumerationHistogram, toBlobIdleTaskStatus, + ("Blink.Canvas.ToBlob.IdleTaskStatus", + CanvasAsyncBlobCreator::IdleTaskCount)); + toBlobIdleTaskStatus.count(status); +} + +// This enum is used in histogram and any more types should be appended at the +// end of the list. +enum ElapsedTimeHistogramType { + InitiateEncodingDelay, + IdleEncodeDuration, + ToBlobDuration, + NumberOfElapsedTimeHistogramTypes +}; + +void recordElapsedTimeHistogram(ElapsedTimeHistogramType type, + CanvasAsyncBlobCreator::MimeType mimeType, + double elapsedTime) { + if (type == InitiateEncodingDelay) { + if (mimeType == CanvasAsyncBlobCreator::MimeTypePng) { + DEFINE_STATIC_LOCAL( + CustomCountHistogram, toBlobPNGInitiateEncodingCounter, + ("Blink.Canvas.ToBlob.InitiateEncodingDelay.PNG", 0, 10000000, 50)); + toBlobPNGInitiateEncodingCounter.count(elapsedTime * 1000000.0); + } else if (mimeType == CanvasAsyncBlobCreator::MimeTypeJpeg) { + DEFINE_STATIC_LOCAL( + CustomCountHistogram, toBlobJPEGInitiateEncodingCounter, + ("Blink.Canvas.ToBlob.InitiateEncodingDelay.JPEG", 0, 10000000, 50)); + toBlobJPEGInitiateEncodingCounter.count(elapsedTime * 1000000.0); + } + } else if (type == IdleEncodeDuration) { + if (mimeType == CanvasAsyncBlobCreator::MimeTypePng) { + DEFINE_STATIC_LOCAL( + CustomCountHistogram, toBlobPNGIdleEncodeCounter, + ("Blink.Canvas.ToBlob.IdleEncodeDuration.PNG", 0, 10000000, 50)); + toBlobPNGIdleEncodeCounter.count(elapsedTime * 1000000.0); + } else if (mimeType == CanvasAsyncBlobCreator::MimeTypeJpeg) { + DEFINE_STATIC_LOCAL( + CustomCountHistogram, toBlobJPEGIdleEncodeCounter, + ("Blink.Canvas.ToBlob.IdleEncodeDuration.JPEG", 0, 10000000, 50)); + toBlobJPEGIdleEncodeCounter.count(elapsedTime * 1000000.0); + } + } else if (type == ToBlobDuration) { + if (mimeType == CanvasAsyncBlobCreator::MimeTypePng) { + DEFINE_STATIC_LOCAL(CustomCountHistogram, toBlobPNGCounter, + ("Blink.Canvas.ToBlobDuration.PNG", 0, 10000000, 50)); + toBlobPNGCounter.count(elapsedTime * 1000000.0); + } else if (mimeType == CanvasAsyncBlobCreator::MimeTypeJpeg) { + DEFINE_STATIC_LOCAL( + CustomCountHistogram, toBlobJPEGCounter, + ("Blink.Canvas.ToBlobDuration.JPEG", 0, 10000000, 50)); + toBlobJPEGCounter.count(elapsedTime * 1000000.0); + } else if (mimeType == CanvasAsyncBlobCreator::MimeTypeWebp) { + DEFINE_STATIC_LOCAL( + CustomCountHistogram, toBlobWEBPCounter, + ("Blink.Canvas.ToBlobDuration.WEBP", 0, 10000000, 50)); + toBlobWEBPCounter.count(elapsedTime * 1000000.0); + } + } +} + } // anonymous namespace CanvasAsyncBlobCreator* CanvasAsyncBlobCreator::create( @@ -181,12 +244,9 @@ void CanvasAsyncBlobCreator::initiateJpegEncoding(const double& quality, double deadlineSeconds) { ASSERT(isMainThread()); - DEFINE_STATIC_LOCAL( - CustomCountHistogram, toBlobJPEGInitiateEncodingCounter, - ("Blink.Canvas.ToBlob.InitiateEncodingDelay.JPEG", 0, 10000000, 50)); - toBlobJPEGInitiateEncodingCounter.count( - (WTF::monotonicallyIncreasingTime() - m_scheduleInitiateStartTime) * - 1000000.0); + recordElapsedTimeHistogram( + InitiateEncodingDelay, MimeTypeJpeg, + WTF::monotonicallyIncreasingTime() - m_scheduleInitiateStartTime); if (m_idleTaskStatus == IdleTaskSwitchedToMainThreadTask) { return; } @@ -210,12 +270,10 @@ void CanvasAsyncBlobCreator::initiatePngEncoding(double deadlineSeconds) { ASSERT(isMainThread()); - DEFINE_STATIC_LOCAL( - CustomCountHistogram, toBlobPNGInitiateEncodingCounter, - ("Blink.Canvas.ToBlob.InitiateEncodingDelay.PNG", 0, 10000000, 50)); - toBlobPNGInitiateEncodingCounter.count( - (WTF::monotonicallyIncreasingTime() - m_scheduleInitiateStartTime) * - 1000000.0); + recordElapsedTimeHistogram( + InitiateEncodingDelay, MimeTypePng, + WTF::monotonicallyIncreasingTime() - m_scheduleInitiateStartTime); + if (m_idleTaskStatus == IdleTaskSwitchedToMainThreadTask) { return; } @@ -256,11 +314,7 @@ m_idleTaskStatus = IdleTaskCompleted; m_elapsedTime += (WTF::monotonicallyIncreasingTime() - startTime); - DEFINE_STATIC_LOCAL( - CustomCountHistogram, toBlobPNGIdleEncodeCounter, - ("Blink.Canvas.ToBlob.IdleEncodeDuration.PNG", 0, 10000000, 50)); - toBlobPNGIdleEncodeCounter.count(m_elapsedTime * 1000000.0); - + recordElapsedTimeHistogram(IdleEncodeDuration, MimeTypePng, m_elapsedTime); if (isDeadlineNearOrPassed(deadlineSeconds)) { TaskRunnerHelper::get(TaskType::CanvasBlobSerialization, m_document) ->postTask( @@ -285,10 +339,8 @@ m_elapsedTime += (WTF::monotonicallyIncreasingTime() - startTime); if (m_numRowsCompleted == m_size.height()) { m_idleTaskStatus = IdleTaskCompleted; - DEFINE_STATIC_LOCAL( - CustomCountHistogram, toBlobJPEGIdleEncodeCounter, - ("Blink.Canvas.ToBlob.IdleEncodeDuration.JPEG", 0, 10000000, 50)); - toBlobJPEGIdleEncodeCounter.count(m_elapsedTime * 1000000.0); + recordElapsedTimeHistogram(IdleEncodeDuration, MimeTypeJpeg, m_elapsedTime); + if (isDeadlineNearOrPassed(deadlineSeconds)) { TaskRunnerHelper::get(TaskType::CanvasBlobSerialization, m_document) ->postTask( @@ -338,30 +390,12 @@ this->signalAlternativeCodePathFinishedForTesting(); } -void CanvasAsyncBlobCreator::recordIdleTaskStatusHistogram() { - DEFINE_STATIC_LOCAL(EnumerationHistogram, toBlobIdleTaskStatus, - ("Blink.Canvas.ToBlob.IdleTaskStatus", IdleTaskCount)); - toBlobIdleTaskStatus.count(m_idleTaskStatus); -} - void CanvasAsyncBlobCreator::createBlobAndInvokeCallback() { ASSERT(isMainThread()); - recordIdleTaskStatusHistogram(); + recordIdleTaskStatusHistogram(m_idleTaskStatus); - double elapsedTime = WTF::monotonicallyIncreasingTime() - m_startTime; - if (m_mimeType == MimeTypePng) { - DEFINE_STATIC_LOCAL(CustomCountHistogram, toBlobPNGCounter, - ("Blink.Canvas.ToBlobDuration.PNG", 0, 10000000, 50)); - toBlobPNGCounter.count(elapsedTime * 1000000.0); - } else if (m_mimeType == MimeTypeJpeg) { - DEFINE_STATIC_LOCAL(CustomCountHistogram, toBlobJPEGCounter, - ("Blink.Canvas.ToBlobDuration.JPEG", 0, 10000000, 50)); - toBlobJPEGCounter.count(elapsedTime * 1000000.0); - } else { - DEFINE_STATIC_LOCAL(CustomCountHistogram, toBlobWEBPCounter, - ("Blink.Canvas.ToBlobDuration.WEBP", 0, 10000000, 50)); - toBlobWEBPCounter.count(elapsedTime * 1000000.0); - } + recordElapsedTimeHistogram(ToBlobDuration, m_mimeType, + WTF::monotonicallyIncreasingTime() - m_startTime); Blob* resultBlob = Blob::create(m_encodedImage->data(), m_encodedImage->size(), convertMimeTypeEnumToString(m_mimeType)); @@ -375,7 +409,7 @@ void CanvasAsyncBlobCreator::createNullAndInvokeCallback() { ASSERT(isMainThread()); - recordIdleTaskStatusHistogram(); + recordIdleTaskStatusHistogram(m_idleTaskStatus); TaskRunnerHelper::get(TaskType::CanvasBlobSerialization, m_document) ->postTask(BLINK_FROM_HERE, WTF::bind(&BlobCallback::handleEvent,
diff --git a/third_party/WebKit/Source/core/html/canvas/CanvasAsyncBlobCreator.h b/third_party/WebKit/Source/core/html/canvas/CanvasAsyncBlobCreator.h index 5d8f5f8..178a267 100644 --- a/third_party/WebKit/Source/core/html/canvas/CanvasAsyncBlobCreator.h +++ b/third_party/WebKit/Source/core/html/canvas/CanvasAsyncBlobCreator.h
@@ -115,7 +115,6 @@ void idleTaskStartTimeoutEvent(double quality); void idleTaskCompleteTimeoutEvent(); - void recordIdleTaskStatusHistogram(); }; } // namespace blink
diff --git a/third_party/WebKit/Source/core/html/shadow/MediaControlsWindowEventListener.cpp b/third_party/WebKit/Source/core/html/shadow/MediaControlsWindowEventListener.cpp index c18500c..db2cc7b 100644 --- a/third_party/WebKit/Source/core/html/shadow/MediaControlsWindowEventListener.cpp +++ b/third_party/WebKit/Source/core/html/shadow/MediaControlsWindowEventListener.cpp
@@ -39,6 +39,8 @@ if (LocalDOMWindow* window = getLocalDOMWindow()) { window->addEventListener(EventTypeNames::click, this, false); + window->addEventListener(EventTypeNames::resize, this, false); + m_mediaControls->panelElement()->addEventListener(EventTypeNames::click, this, false); m_mediaControls->timelineElement()->addEventListener(EventTypeNames::click, @@ -47,6 +49,7 @@ EventTypeNames::click, this, false); m_mediaControls->volumeSliderElement()->addEventListener( EventTypeNames::click, this, false); + m_isActive = true; } } @@ -57,6 +60,8 @@ if (LocalDOMWindow* window = getLocalDOMWindow()) { window->removeEventListener(EventTypeNames::click, this, false); + window->removeEventListener(EventTypeNames::resize, this, false); + m_mediaControls->panelElement()->removeEventListener(EventTypeNames::click, this, false); m_mediaControls->timelineElement()->removeEventListener( @@ -72,11 +77,9 @@ void MediaControlsWindowEventListener::handleEvent( ExecutionContext* executionContext, Event* event) { - DCHECK(event->type() == EventTypeNames::click); - handleClickEvent(); -} + DCHECK(event->type() == EventTypeNames::click || + event->type() == EventTypeNames::resize); -void MediaControlsWindowEventListener::handleClickEvent() { if (!m_isActive) return; (*m_callback.get())();
diff --git a/third_party/WebKit/Source/core/html/shadow/MediaControlsWindowEventListener.h b/third_party/WebKit/Source/core/html/shadow/MediaControlsWindowEventListener.h index 577819d..1ce330c 100644 --- a/third_party/WebKit/Source/core/html/shadow/MediaControlsWindowEventListener.h +++ b/third_party/WebKit/Source/core/html/shadow/MediaControlsWindowEventListener.h
@@ -33,8 +33,6 @@ void handleEvent(ExecutionContext*, Event*) override; - void handleClickEvent(); - LocalDOMWindow* getLocalDOMWindow() const; Member<MediaControls> m_mediaControls;
diff --git a/third_party/WebKit/Source/core/html/track/TextTrack.h b/third_party/WebKit/Source/core/html/track/TextTrack.h index 68359273..2acf3c12 100644 --- a/third_party/WebKit/Source/core/html/track/TextTrack.h +++ b/third_party/WebKit/Source/core/html/track/TextTrack.h
@@ -27,7 +27,7 @@ #ifndef TextTrack_h #define TextTrack_h -#include "bindings/core/v8/ScriptWrappableVisitor.h" +#include "bindings/core/v8/TraceWrapperMember.h" #include "core/CoreExport.h" #include "core/events/EventTarget.h" #include "core/html/track/TrackBase.h"
diff --git a/third_party/WebKit/Source/core/html/track/TrackListBase.h b/third_party/WebKit/Source/core/html/track/TrackListBase.h index 482a4e8..9b9eb52b 100644 --- a/third_party/WebKit/Source/core/html/track/TrackListBase.h +++ b/third_party/WebKit/Source/core/html/track/TrackListBase.h
@@ -5,7 +5,7 @@ #ifndef TrackListBase_h #define TrackListBase_h -#include "bindings/core/v8/ScriptWrappableVisitor.h" +#include "bindings/core/v8/TraceWrapperMember.h" #include "core/events/EventTarget.h" #include "core/html/HTMLMediaElement.h" #include "core/html/track/TrackEvent.h"
diff --git a/third_party/WebKit/Source/core/inspector/InspectorNetworkAgent.cpp b/third_party/WebKit/Source/core/inspector/InspectorNetworkAgent.cpp index a977aeca..680151e 100644 --- a/third_party/WebKit/Source/core/inspector/InspectorNetworkAgent.cpp +++ b/third_party/WebKit/Source/core/inspector/InspectorNetworkAgent.cpp
@@ -511,6 +511,11 @@ } bool InspectorNetworkAgent::shouldBlockRequest(const ResourceRequest& request) { + if (m_state->booleanProperty(NetworkAgentState::cacheDisabled, false) && + request.getCachePolicy() == WebCachePolicy::ReturnCacheDataDontLoad) { + return true; + } + protocol::DictionaryValue* blockedURLs = m_state->getObject(NetworkAgentState::blockedURLs); if (!blockedURLs) @@ -630,6 +635,10 @@ request.setReportRawHeaders(true); if (m_state->booleanProperty(NetworkAgentState::cacheDisabled, false)) { + // It shouldn't be a ReturnCacheDataDontLoad request as those are blocked + // in shouldBlockRequest. + DCHECK_NE(WebCachePolicy::ReturnCacheDataDontLoad, + request.getCachePolicy()); request.setCachePolicy(WebCachePolicy::BypassingCache); request.setShouldResetAppCache(true); }
diff --git a/third_party/WebKit/Source/core/inspector/NetworkResourcesData.cpp b/third_party/WebKit/Source/core/inspector/NetworkResourcesData.cpp index 990a886..baa2ad87 100644 --- a/third_party/WebKit/Source/core/inspector/NetworkResourcesData.cpp +++ b/third_party/WebKit/Source/core/inspector/NetworkResourcesData.cpp
@@ -217,8 +217,8 @@ String filePath = response.downloadedFilePath(); if (!filePath.isEmpty()) { - std::unique_ptr<BlobData> blobData = BlobData::create(); - blobData->appendFile(filePath); + std::unique_ptr<BlobData> blobData = + BlobData::createForFileWithUnknownSize(filePath); AtomicString mimeType; if (response.isHTTP()) mimeType = extractMIMETypeFromMediaType(
diff --git a/third_party/WebKit/Source/core/layout/LayoutBlockFlow.cpp b/third_party/WebKit/Source/core/layout/LayoutBlockFlow.cpp index 18ee44b6..eff4a92 100644 --- a/third_party/WebKit/Source/core/layout/LayoutBlockFlow.cpp +++ b/third_party/WebKit/Source/core/layout/LayoutBlockFlow.cpp
@@ -2434,6 +2434,10 @@ LayoutBlock::absoluteQuads(quads); return; } + LayoutBoxModelObject::absoluteQuads(quads); +} + +void LayoutBlockFlow::absoluteQuadsForSelf(Vector<FloatQuad>& quads) const { // For blocks inside inlines, we go ahead and include margins so that we run // right up to the inline boxes above and below us (thus getting merged with // them to form a single irregular shape). @@ -2442,7 +2446,6 @@ LayoutRect localRect(LayoutPoint(), size()); localRect.expand(collapsedMarginBoxLogicalOutsets()); quads.append(localToAbsoluteQuad(FloatRect(localRect))); - continuation()->absoluteQuads(quads); } LayoutObject* LayoutBlockFlow::hoverAncestor() const {
diff --git a/third_party/WebKit/Source/core/layout/LayoutBlockFlow.h b/third_party/WebKit/Source/core/layout/LayoutBlockFlow.h index 22d9711..567d6d9 100644 --- a/third_party/WebKit/Source/core/layout/LayoutBlockFlow.h +++ b/third_party/WebKit/Source/core/layout/LayoutBlockFlow.h
@@ -412,6 +412,7 @@ void absoluteRects(Vector<IntRect>&, const LayoutPoint& accumulatedOffset) const override; void absoluteQuads(Vector<FloatQuad>&) const override; + void absoluteQuadsForSelf(Vector<FloatQuad>& quads) const override; LayoutObject* hoverAncestor() const final; LayoutUnit logicalRightOffsetForLine(
diff --git a/third_party/WebKit/Source/core/layout/LayoutBox.h b/third_party/WebKit/Source/core/layout/LayoutBox.h index 42c0477..5b7bb32 100644 --- a/third_party/WebKit/Source/core/layout/LayoutBox.h +++ b/third_party/WebKit/Source/core/layout/LayoutBox.h
@@ -207,6 +207,7 @@ // Use this with caution! No type checking is done! LayoutBox* firstChildBox() const; + LayoutBox* firstInFlowChildBox() const; LayoutBox* lastChildBox() const; int pixelSnappedWidth() const { return m_frameRect.pixelSnappedWidth(); } @@ -1575,6 +1576,13 @@ return toLayoutBox(parent()); } +inline LayoutBox* LayoutBox::firstInFlowChildBox() const { + LayoutBox* first = firstChildBox(); + while (first && first->isOutOfFlowPositioned()) + first = first->nextInFlowSiblingBox(); + return first; +} + inline LayoutBox* LayoutBox::firstChildBox() const { return toLayoutBox(slowFirstChild()); }
diff --git a/third_party/WebKit/Source/core/layout/LayoutBoxModelObject.cpp b/third_party/WebKit/Source/core/layout/LayoutBoxModelObject.cpp index a7047677..653dffb1 100644 --- a/third_party/WebKit/Source/core/layout/LayoutBoxModelObject.cpp +++ b/third_party/WebKit/Source/core/layout/LayoutBoxModelObject.cpp
@@ -620,6 +620,27 @@ return false; } +void LayoutBoxModelObject::absoluteQuadsForSelf( + Vector<FloatQuad>& quads) const { + NOTREACHED(); +} + +void LayoutBoxModelObject::absoluteQuads(Vector<FloatQuad>& quads) const { + absoluteQuadsForSelf(quads); + + // Iterate over continuations, avoiding recursion in case there are + // many of them. See crbug.com/653767. + for (const LayoutBoxModelObject* continuationObject = this->continuation(); + continuationObject; + continuationObject = continuationObject->continuation()) { + DCHECK(continuationObject->isLayoutInline() || + (continuationObject->isLayoutBlockFlow() && + toLayoutBlockFlow(continuationObject) + ->isAnonymousBlockContinuation())); + continuationObject->absoluteQuadsForSelf(quads); + } +} + void LayoutBoxModelObject::updateFromStyle() { const ComputedStyle& styleToUse = styleRef(); setHasBoxDecorationBackground(styleToUse.hasBoxDecorationBackground());
diff --git a/third_party/WebKit/Source/core/layout/LayoutBoxModelObject.h b/third_party/WebKit/Source/core/layout/LayoutBoxModelObject.h index 1dcec09..2db23f5 100644 --- a/third_party/WebKit/Source/core/layout/LayoutBoxModelObject.h +++ b/third_party/WebKit/Source/core/layout/LayoutBoxModelObject.h
@@ -402,7 +402,14 @@ bool backgroundStolenForBeingBody( const ComputedStyle* rootElementStyle = nullptr) const; + void absoluteQuads(Vector<FloatQuad>& quads) const override; + protected: + // Compute absolute quads for |this|, but not any continuations. May only be + // called for objects which can be or have continuations, i.e. LayoutInline or + // LayoutBlockFlow. + virtual void absoluteQuadsForSelf(Vector<FloatQuad>& quads) const; + void willBeDestroyed() override; LayoutPoint adjustedPositionRelativeTo(const LayoutPoint&,
diff --git a/third_party/WebKit/Source/core/layout/LayoutFlexibleBox.cpp b/third_party/WebKit/Source/core/layout/LayoutFlexibleBox.cpp index 5ad6f0d..cf82704 100644 --- a/third_party/WebKit/Source/core/layout/LayoutFlexibleBox.cpp +++ b/third_party/WebKit/Source/core/layout/LayoutFlexibleBox.cpp
@@ -460,7 +460,7 @@ // direction:rtl + flex-direction:column means the cross-axis direction is // flipped. - flipForRightToLeftColumn(); + flipForRightToLeftColumn(lineContexts); } DISABLE_CFI_PERF @@ -2259,22 +2259,30 @@ } } -void LayoutFlexibleBox::flipForRightToLeftColumn() { +void LayoutFlexibleBox::flipForRightToLeftColumn( + const Vector<LineContext>& lineContexts) { if (style()->isLeftToRightDirection() || !isColumnFlow()) return; LayoutUnit crossExtent = crossAxisExtent(); - for (LayoutBox* child = m_orderIterator.first(); child; - child = m_orderIterator.next()) { - if (child->isOutOfFlowPositioned()) - continue; - LayoutPoint location = flowAwareLocationForChild(*child); - // For vertical flows, setFlowAwareLocationForChild will transpose x and y, - // so using the y axis for a column cross axis extent is correct. - location.setY(crossExtent - crossAxisExtentForChild(*child) - location.y()); - if (!isHorizontalWritingMode()) - location.move(LayoutSize(0, -horizontalScrollbarHeight())); - setFlowAwareLocationForChild(*child, location); + for (size_t lineNumber = 0; lineNumber < lineContexts.size(); ++lineNumber) { + const LineContext& lineContext = lineContexts[lineNumber]; + for (size_t childNumber = 0; childNumber < lineContext.flexItems.size(); + ++childNumber) { + const FlexItem& flexItem = lineContext.flexItems[childNumber]; + if (flexItem.box->isOutOfFlowPositioned()) + continue; + + LayoutPoint location = flowAwareLocationForChild(*flexItem.box); + // For vertical flows, setFlowAwareLocationForChild will transpose x and + // y, + // so using the y axis for a column cross axis extent is correct. + location.setY(crossExtent - crossAxisExtentForChild(*flexItem.box) - + location.y()); + if (!isHorizontalWritingMode()) + location.move(LayoutSize(0, -horizontalScrollbarHeight())); + setFlowAwareLocationForChild(*flexItem.box, location); + } } }
diff --git a/third_party/WebKit/Source/core/layout/LayoutFlexibleBox.h b/third_party/WebKit/Source/core/layout/LayoutFlexibleBox.h index b294343..f8cf55c 100644 --- a/third_party/WebKit/Source/core/layout/LayoutFlexibleBox.h +++ b/third_party/WebKit/Source/core/layout/LayoutFlexibleBox.h
@@ -246,7 +246,7 @@ void alignChildren(const Vector<LineContext>&, LayoutObject* childToExclude); void applyStretchAlignmentToChild(LayoutBox& child, LayoutUnit lineCrossAxisExtent); - void flipForRightToLeftColumn(); + void flipForRightToLeftColumn(const Vector<LineContext>& lineContexts); void flipForWrapReverse(const Vector<LineContext>&, LayoutUnit crossAxisStartEdge);
diff --git a/third_party/WebKit/Source/core/layout/LayoutGrid.cpp b/third_party/WebKit/Source/core/layout/LayoutGrid.cpp index aa2938aa..26b4afd 100644 --- a/third_party/WebKit/Source/core/layout/LayoutGrid.cpp +++ b/third_party/WebKit/Source/core/layout/LayoutGrid.cpp
@@ -464,7 +464,7 @@ // all the cases with orthogonal flows require this extra cycle; we need a // more specific condition to detect whether child's min-content contribution // has changed or not. - if (!m_orthogonalChildren.isEmpty()) { + if (m_hasAnyOrthogonalChildren) { computeTrackSizesForDefiniteSize(ForColumns, sizingData, availableSpaceForColumns); computeTrackSizesForDefiniteSize(ForRows, sizingData, @@ -492,13 +492,9 @@ // computed again in the updateLogicalWidth call bellow. if (sizesLogicalWidthToFitContent(styleRef().logicalWidth()) || styleRef().logicalWidth().isIntrinsicOrAuto()) { - // We do cache orthogonal items during the placeItemsOnGrid call, which is - // executed later. However, we are - // only interested on running this logic when we are performing a - // relayout, hence we have already cached - // the orthogonal items. - for (auto* child : m_orthogonalChildren) { - if (child->isOutOfFlowPositioned()) + for (auto* child = firstInFlowChildBox(); child; + child = child->nextInFlowSiblingBox()) { + if (!isOrthogonalChild(*child)) continue; child->clearOverrideSize(); child->clearContainingBlockOverrideSize(); @@ -511,14 +507,8 @@ TextAutosizer::LayoutScope textAutosizerLayoutScope(this, &layoutScope); - // TODO(svillar): we won't need to do this once the intrinsic width - // computation is isolated from the LayoutGrid object state (it should not - // touch any attribute) (see crbug.com/627812) - if (m_autoRepeatColumns && - m_autoRepeatColumns != - computeAutoRepeatTracksCount(ForColumns, TrackSizing)) - dirtyGrid(); - placeItemsOnGrid(TrackSizing); + updateAutoRepeatTracksAndSetDirtyIfNeeded(TrackSizing); + placeItemsOnGrid(); GridSizingData sizingData(gridColumnCount(), gridRowCount()); @@ -688,7 +678,9 @@ void LayoutGrid::computeIntrinsicLogicalWidths( LayoutUnit& minLogicalWidth, LayoutUnit& maxLogicalWidth) const { - const_cast<LayoutGrid*>(this)->placeItemsOnGrid(IntrinsicSizeComputation); + const_cast<LayoutGrid*>(this)->updateAutoRepeatTracksAndSetDirtyIfNeeded( + IntrinsicSizeComputation); + const_cast<LayoutGrid*>(this)->placeItemsOnGrid(); GridSizingData sizingData(gridColumnCount(), gridRowCount()); computeTrackSizesForIndefiniteSize(ForColumns, sizingData, minLogicalWidth, @@ -1770,6 +1762,21 @@ } } +void LayoutGrid::updateAutoRepeatTracksAndSetDirtyIfNeeded( + SizingOperation sizingOperation) { + size_t newAutoRepeatColumns = + computeAutoRepeatTracksCount(ForColumns, sizingOperation); + size_t newAutoRepeatRows = + computeAutoRepeatTracksCount(ForRows, sizingOperation); + + if (m_autoRepeatColumns != newAutoRepeatColumns || + m_autoRepeatRows != newAutoRepeatRows) + dirtyGrid(); + + m_autoRepeatColumns = newAutoRepeatColumns; + m_autoRepeatRows = newAutoRepeatRows; +} + size_t LayoutGrid::computeAutoRepeatTracksCount( GridTrackSizingDirection direction, SizingOperation sizingOperation) const { @@ -1910,20 +1917,13 @@ return emptyTrackIndexes; } -void LayoutGrid::placeItemsOnGrid(SizingOperation sizingOperation) { +void LayoutGrid::placeItemsOnGrid() { if (!m_gridIsDirty) return; DCHECK(m_gridItemArea.isEmpty()); DCHECK(m_gridItemsIndexesMap.isEmpty()); - if (sizingOperation == IntrinsicSizeComputation) - m_autoRepeatColumns = styleRef().gridAutoRepeatColumns().size(); - else - m_autoRepeatColumns = - computeAutoRepeatTracksCount(ForColumns, sizingOperation); - m_autoRepeatRows = computeAutoRepeatTracksCount(ForRows, sizingOperation); - populateExplicitGridAndOrderIterator(); // We clear the dirty bit here as the grid sizes have been updated. @@ -1931,14 +1931,14 @@ Vector<LayoutBox*> autoMajorAxisAutoGridItems; Vector<LayoutBox*> specifiedMajorAxisAutoGridItems; - m_orthogonalChildren.shrink(0); + m_hasAnyOrthogonalChildren = false; for (LayoutBox* child = m_orderIterator.first(); child; child = m_orderIterator.next()) { if (child->isOutOfFlowPositioned()) continue; - if (isOrthogonalChild(*child)) - m_orthogonalChildren.append(child); + m_hasAnyOrthogonalChildren = + m_hasAnyOrthogonalChildren || isOrthogonalChild(*child); GridArea area = cachedGridArea(*child); if (!area.rows.isIndefinite()) @@ -1999,11 +1999,8 @@ ASSERT(m_gridItemsIndexesMap.isEmpty()); size_t childIndex = 0; - for (LayoutBox* child = firstChildBox(); child; + for (LayoutBox* child = firstInFlowChildBox(); child; child = child->nextInFlowSiblingBox()) { - if (child->isOutOfFlowPositioned()) - continue; - populator.collectChild(child); m_gridItemsIndexesMap.set(child, childIndex++);
diff --git a/third_party/WebKit/Source/core/layout/LayoutGrid.h b/third_party/WebKit/Source/core/layout/LayoutGrid.h index b3468a9..a04b97cb 100644 --- a/third_party/WebKit/Source/core/layout/LayoutGrid.h +++ b/third_party/WebKit/Source/core/layout/LayoutGrid.h
@@ -135,6 +135,7 @@ void ensureGridSize(size_t maximumRowSize, size_t maximumColumnSize); void insertItemIntoGrid(LayoutBox&, const GridArea&); + void updateAutoRepeatTracksAndSetDirtyIfNeeded(SizingOperation); size_t computeAutoRepeatTracksCount(GridTrackSizingDirection, SizingOperation) const; @@ -146,7 +147,7 @@ bool isEmptyAutoRepeatTrack(GridTrackSizingDirection, size_t lineNumber) const; - void placeItemsOnGrid(SizingOperation); + void placeItemsOnGrid(); void populateExplicitGridAndOrderIterator(); std::unique_ptr<GridArea> createEmptyGridAreaAtSpecifiedPositionsOutsideGrid( const LayoutBox&, @@ -348,7 +349,7 @@ size_t m_autoRepeatColumns{0}; size_t m_autoRepeatRows{0}; - Vector<LayoutBox*> m_orthogonalChildren; + bool m_hasAnyOrthogonalChildren; std::unique_ptr<OrderedTrackIndexSet> m_autoRepeatEmptyColumns{nullptr}; std::unique_ptr<OrderedTrackIndexSet> m_autoRepeatEmptyRows{nullptr};
diff --git a/third_party/WebKit/Source/core/layout/LayoutInline.cpp b/third_party/WebKit/Source/core/layout/LayoutInline.cpp index 82b4600..19ac4747 100644 --- a/third_party/WebKit/Source/core/layout/LayoutInline.cpp +++ b/third_party/WebKit/Source/core/layout/LayoutInline.cpp
@@ -775,14 +775,11 @@ } // unnamed namespace -void LayoutInline::absoluteQuads(Vector<FloatQuad>& quads) const { +void LayoutInline::absoluteQuadsForSelf(Vector<FloatQuad>& quads) const { AbsoluteQuadsGeneratorContext context(this, quads); generateLineBoxRects(context); if (quads.isEmpty()) context(FloatRect()); - - if (const LayoutBoxModelObject* continuation = this->continuation()) - continuation->absoluteQuads(quads); } LayoutUnit LayoutInline::offsetLeft(const Element* parent) const {
diff --git a/third_party/WebKit/Source/core/layout/LayoutInline.h b/third_party/WebKit/Source/core/layout/LayoutInline.h index 18e266a..6e3f34ba 100644 --- a/third_party/WebKit/Source/core/layout/LayoutInline.h +++ b/third_party/WebKit/Source/core/layout/LayoutInline.h
@@ -148,7 +148,6 @@ void absoluteRects(Vector<IntRect>&, const LayoutPoint& accumulatedOffset) const final; - void absoluteQuads(Vector<FloatQuad>&) const override; FloatRect localBoundingBoxRectForAccessibility() const final; LayoutSize offsetFromContainer(const LayoutObject*) const final; @@ -226,6 +225,8 @@ void invalidateDisplayItemClients(PaintInvalidationReason) const override; + void absoluteQuadsForSelf(Vector<FloatQuad>& quads) const override; + private: LayoutObjectChildList* virtualChildren() final { return children(); } const LayoutObjectChildList* virtualChildren() const final {
diff --git a/third_party/WebKit/Source/core/layout/LayoutTable.cpp b/third_party/WebKit/Source/core/layout/LayoutTable.cpp index 7e781b95..9fcc1b0 100644 --- a/third_party/WebKit/Source/core/layout/LayoutTable.cpp +++ b/third_party/WebKit/Source/core/layout/LayoutTable.cpp
@@ -361,7 +361,7 @@ // length and computes its actual value. LayoutUnit LayoutTable::convertStyleLogicalWidthToComputedWidth( const Length& styleLogicalWidth, - LayoutUnit availableWidth) { + LayoutUnit availableWidth) const { if (styleLogicalWidth.isIntrinsic()) return computeIntrinsicLogicalWidthUsing( styleLogicalWidth, availableWidth, @@ -382,7 +382,7 @@ } LayoutUnit LayoutTable::convertStyleLogicalHeightToComputedHeight( - const Length& styleLogicalHeight) { + const Length& styleLogicalHeight) const { LayoutUnit borderAndPaddingBefore = borderBefore() + (collapseBorders() ? LayoutUnit() : paddingBefore()); LayoutUnit borderAndPaddingAfter = @@ -455,6 +455,38 @@ setLogicalHeight(logicalHeight() + sectionLogicalHeight); } +LayoutUnit LayoutTable::logicalHeightFromStyle() const { + LayoutUnit computedLogicalHeight; + Length logicalHeightLength = style()->logicalHeight(); + if (logicalHeightLength.isIntrinsic() || + (logicalHeightLength.isSpecified() && logicalHeightLength.isPositive())) { + computedLogicalHeight = + convertStyleLogicalHeightToComputedHeight(logicalHeightLength); + } + + Length logicalMaxHeightLength = style()->logicalMaxHeight(); + if (logicalMaxHeightLength.isIntrinsic() || + (logicalMaxHeightLength.isSpecified() && + !logicalMaxHeightLength.isNegative())) { + LayoutUnit computedMaxLogicalHeight = + convertStyleLogicalHeightToComputedHeight(logicalMaxHeightLength); + computedLogicalHeight = + std::min(computedLogicalHeight, computedMaxLogicalHeight); + } + + Length logicalMinHeightLength = style()->logicalMinHeight(); + if (logicalMinHeightLength.isIntrinsic() || + (logicalMinHeightLength.isSpecified() && + !logicalMinHeightLength.isNegative())) { + LayoutUnit computedMinLogicalHeight = + convertStyleLogicalHeightToComputedHeight(logicalMinHeightLength); + computedLogicalHeight = + std::max(computedLogicalHeight, computedMinLogicalHeight); + } + + return computedLogicalHeight; +} + void LayoutTable::distributeExtraLogicalHeight(int extraLogicalHeight) { if (extraLogicalHeight <= 0) return; @@ -613,42 +645,18 @@ setLogicalHeight(tableBoxLogicalTop + borderAndPaddingBefore); - LayoutUnit computedLogicalHeight; - - Length logicalHeightLength = style()->logicalHeight(); - if (logicalHeightLength.isIntrinsic() || - (logicalHeightLength.isSpecified() && logicalHeightLength.isPositive())) - computedLogicalHeight = - convertStyleLogicalHeightToComputedHeight(logicalHeightLength); - - Length logicalMaxHeightLength = style()->logicalMaxHeight(); - if (logicalMaxHeightLength.isIntrinsic() || - (logicalMaxHeightLength.isSpecified() && - !logicalMaxHeightLength.isNegative())) { - LayoutUnit computedMaxLogicalHeight = - convertStyleLogicalHeightToComputedHeight(logicalMaxHeightLength); - computedLogicalHeight = - std::min(computedLogicalHeight, computedMaxLogicalHeight); - } - - Length logicalMinHeightLength = style()->logicalMinHeight(); - if (logicalMinHeightLength.isIntrinsic() || - (logicalMinHeightLength.isSpecified() && - !logicalMinHeightLength.isNegative())) { - LayoutUnit computedMinLogicalHeight = - convertStyleLogicalHeightToComputedHeight(logicalMinHeightLength); - computedLogicalHeight = - std::max(computedLogicalHeight, computedMinLogicalHeight); - } - + LayoutUnit computedLogicalHeight = logicalHeightFromStyle(); LayoutUnit totalSectionLogicalHeight; if (topSection) { totalSectionLogicalHeight = bottomSection->logicalBottom() - topSection->logicalTop(); } - distributeExtraLogicalHeight( - floorToInt(computedLogicalHeight - totalSectionLogicalHeight)); + if (!state.isPaginated() || + !crossesPageBoundary(tableBoxLogicalTop, computedLogicalHeight)) { + distributeExtraLogicalHeight( + floorToInt(computedLogicalHeight - totalSectionLogicalHeight)); + } bool isPaginated = view()->layoutState()->isPaginated(); LayoutUnit logicalOffset =
diff --git a/third_party/WebKit/Source/core/layout/LayoutTable.h b/third_party/WebKit/Source/core/layout/LayoutTable.h index 5cc61bed..ee21016 100644 --- a/third_party/WebKit/Source/core/layout/LayoutTable.h +++ b/third_party/WebKit/Source/core/layout/LayoutTable.h
@@ -469,9 +469,9 @@ LayoutUnit convertStyleLogicalWidthToComputedWidth( const Length& styleLogicalWidth, - LayoutUnit availableWidth); + LayoutUnit availableWidth) const; LayoutUnit convertStyleLogicalHeightToComputedHeight( - const Length& styleLogicalHeight); + const Length& styleLogicalHeight) const; LayoutRect overflowClipRect( const LayoutPoint& location, @@ -485,6 +485,10 @@ SubtreeLayoutScope&, LayoutUnit logicalLeft); + // Return the logical height based on the height, min-height and max-height + // properties from CSS. Will return 0 if auto. + LayoutUnit logicalHeightFromStyle() const; + void distributeExtraLogicalHeight(int extraLogicalHeight); void recalcCollapsedBordersIfNeeded();
diff --git a/third_party/WebKit/Source/core/layout/ScrollAnchorTest.cpp b/third_party/WebKit/Source/core/layout/ScrollAnchorTest.cpp index 2001464..f9716ea 100644 --- a/third_party/WebKit/Source/core/layout/ScrollAnchorTest.cpp +++ b/third_party/WebKit/Source/core/layout/ScrollAnchorTest.cpp
@@ -8,6 +8,7 @@ #include "core/frame/VisualViewport.h" #include "core/layout/LayoutBox.h" #include "core/layout/LayoutTestHelper.h" +#include "core/page/PrintContext.h" #include "core/paint/PaintLayerScrollableArea.h" #include "platform/testing/HistogramTester.h" @@ -869,6 +870,24 @@ EXPECT_EQ(nullptr, scrollAnchor(layoutViewport()).anchorObject()); } +// This test verifies that scroll anchoring is disabled when the document is in +// printing mode. +TEST_F(ScrollAnchorTest, AnchoringDisabledForPrinting) { + setBodyInnerHTML( + "<style> body { height: 1000px } div { height: 100px } </style>" + "<div id='block1'>abc</div>" + "<div id='block2'>def</div>"); + + ScrollableArea* viewport = layoutViewport(); + scrollLayoutViewport(ScrollOffset(0, 150)); + + // This will trigger printing and layout. + PrintContext::numberOfPages(document().frame(), FloatSize(500, 500)); + + EXPECT_EQ(150, viewport->scrollOffsetInt().height()); + EXPECT_EQ(nullptr, scrollAnchor(viewport).anchorObject()); +} + class ScrollAnchorCornerTest : public ScrollAnchorTest { protected: void checkCorner(Corner corner,
diff --git a/third_party/WebKit/Source/core/layout/compositing/CompositedLayerMapping.cpp b/third_party/WebKit/Source/core/layout/compositing/CompositedLayerMapping.cpp index a088bbb7..8a84bb0 100644 --- a/third_party/WebKit/Source/core/layout/compositing/CompositedLayerMapping.cpp +++ b/third_party/WebKit/Source/core/layout/compositing/CompositedLayerMapping.cpp
@@ -1256,8 +1256,8 @@ bool overflowClipRectOffsetChanged = oldScrollingLayerOffset != m_scrollingLayer->offsetFromLayoutObject(); - IntSize scrollSize(layoutBox->scrollWidth().toInt(), - layoutBox->scrollHeight().toInt()); + IntSize scrollSize(layoutBox->pixelSnappedScrollWidth(), + layoutBox->pixelSnappedScrollHeight()); if (scrollSize != m_scrollingContentsLayer->size() || overflowClipRectOffsetChanged) m_scrollingContentsLayer->setNeedsDisplay();
diff --git a/third_party/WebKit/Source/core/layout/line/BreakingContextInlineHeaders.h b/third_party/WebKit/Source/core/layout/line/BreakingContextInlineHeaders.h index 6b113b37..b4973d8 100644 --- a/third_party/WebKit/Source/core/layout/line/BreakingContextInlineHeaders.h +++ b/third_party/WebKit/Source/core/layout/line/BreakingContextInlineHeaders.h
@@ -815,8 +815,6 @@ len = end - start; } FloatRect rect = font.selectionRectForText(run, FloatPoint(), 0, 0, len); - DCHECK(m_width.fitsOnLine(rect.width() - - 1)); // avoid failure when rect is rounded up. return rewindToMidWordBreak(wordMeasurement, end, rect.width()); }
diff --git a/third_party/WebKit/Source/core/layout/ng/ng_block_layout_algorithm.cc b/third_party/WebKit/Source/core/layout/ng/ng_block_layout_algorithm.cc index 560b03f5..ac0af34d 100644 --- a/third_party/WebKit/Source/core/layout/ng/ng_block_layout_algorithm.cc +++ b/third_party/WebKit/Source/core/layout/ng/ng_block_layout_algorithm.cc
@@ -41,15 +41,15 @@ switch (state_) { case kStateInit: { border_and_padding_ = - computeBorders(*style_) + computePadding(*constraint_space, *style_); + ComputeBorders(*style_) + ComputePadding(*constraint_space, *style_); LayoutUnit inline_size = - computeInlineSizeForFragment(*constraint_space, *style_); + ComputeInlineSizeForFragment(*constraint_space, *style_); LayoutUnit adjusted_inline_size = inline_size - border_and_padding_.InlineSum(); // TODO(layout-ng): For quirks mode, should we pass blockSize instead of // -1? - LayoutUnit block_size = computeBlockSizeForFragment( + LayoutUnit block_size = ComputeBlockSizeForFragment( *constraint_space, *style_, NGSizeIndefinite); LayoutUnit adjusted_block_size(block_size); // Our calculated block-axis size may be indefinite at this point. @@ -76,7 +76,7 @@ NGFragment* fragment; if (!current_child_->Layout(constraint_space_for_children_, &fragment)) return false; - NGBoxStrut child_margins = computeMargins( + NGBoxStrut child_margins = ComputeMargins( *constraint_space_for_children_, *current_child_->Style(), constraint_space_for_children_->WritingMode(), constraint_space_for_children_->Direction()); @@ -108,7 +108,7 @@ content_size_ += border_and_padding_.block_end; // Recompute the block-axis size now that we know our content size. - LayoutUnit block_size = computeBlockSizeForFragment( + LayoutUnit block_size = ComputeBlockSizeForFragment( *constraint_space, *style_, content_size_); builder_->SetBlockSize(block_size) @@ -137,8 +137,8 @@ // Calculate borders and padding for the current child. NGBoxStrut border_and_padding = - computeBorders(*current_child_->Style()) + - computePadding(space, *current_child_->Style()); + ComputeBorders(*current_child_->Style()) + + ComputePadding(space, *current_child_->Style()); // Collapse BLOCK-START margins if there is no padding or border between // parent (current child) and its first in-flow child.
diff --git a/third_party/WebKit/Source/core/layout/ng/ng_box.cc b/third_party/WebKit/Source/core/layout/ng/ng_box.cc index 72f3af3..e7a4f4e6 100644 --- a/third_party/WebKit/Source/core/layout/ng/ng_box.cc +++ b/third_party/WebKit/Source/core/layout/ng/ng_box.cc
@@ -104,9 +104,19 @@ } void NGBox::PositionUpdated() { - if (layout_box_) { - layout_box_->setX(fragment_->LeftOffset()); - layout_box_->setY(fragment_->TopOffset()); + if (!layout_box_) + return; + DCHECK(layout_box_->parent()) << "Should be called on children only."; + + layout_box_->setX(fragment_->LeftOffset()); + layout_box_->setY(fragment_->TopOffset()); + + if (layout_box_->isFloating() && layout_box_->parent()->isLayoutBlockFlow()) { + FloatingObject* floating_object = toLayoutBlockFlow(layout_box_->parent()) + ->insertFloatingObject(*layout_box_); + floating_object->setX(fragment_->LeftOffset()); + floating_object->setY(fragment_->TopOffset()); + floating_object->setIsPlaced(true); } } @@ -125,7 +135,7 @@ layout_box_->setWidth(fragment_->Width()); layout_box_->setHeight(fragment_->Height()); NGBoxStrut border_and_padding = - computeBorders(*Style()) + computePadding(constraint_space, *Style()); + ComputeBorders(*Style()) + ComputePadding(constraint_space, *Style()); LayoutUnit intrinsic_logical_height = layout_box_->style()->isHorizontalWritingMode() ? fragment_->HeightOverflow()
diff --git a/third_party/WebKit/Source/core/layout/ng/ng_length_utils.cc b/third_party/WebKit/Source/core/layout/ng/ng_length_utils.cc index 54d4172..d84e13f1 100644 --- a/third_party/WebKit/Source/core/layout/ng/ng_length_utils.cc +++ b/third_party/WebKit/Source/core/layout/ng/ng_length_utils.cc
@@ -56,7 +56,7 @@ } // namespace -LayoutUnit resolveInlineLength(const NGConstraintSpace& constraintSpace, +LayoutUnit ResolveInlineLength(const NGConstraintSpace& constraintSpace, const ComputedStyle& style, const Length& length, LengthResolveType type) { @@ -75,14 +75,14 @@ NGBoxStrut border_and_padding; if (type != LengthResolveType::MarginBorderPaddingSize) { border_and_padding = - computeBorders(style) + computePadding(constraintSpace, style); + ComputeBorders(style) + ComputePadding(constraintSpace, style); } LayoutUnit container_size = constraintSpace.ContainerSize().inline_size; switch (length.type()) { case Auto: case FillAvailable: { NGBoxStrut margins = - computeMargins(constraintSpace, style, + ComputeMargins(constraintSpace, style, FromPlatformWritingMode(style.getWritingMode()), FromPlatformDirection(style.direction())); return std::max(border_and_padding.InlineSum(), @@ -115,7 +115,7 @@ } } -LayoutUnit resolveBlockLength(const NGConstraintSpace& constraintSpace, +LayoutUnit ResolveBlockLength(const NGConstraintSpace& constraintSpace, const ComputedStyle& style, const Length& length, LayoutUnit contentSize, @@ -137,13 +137,13 @@ NGBoxStrut border_and_padding; if (type != LengthResolveType::MarginBorderPaddingSize) { border_and_padding = - computeBorders(style) + computePadding(constraintSpace, style); + ComputeBorders(style) + ComputePadding(constraintSpace, style); } LayoutUnit container_size = constraintSpace.ContainerSize().block_size; switch (length.type()) { case FillAvailable: { NGBoxStrut margins = - computeMargins(constraintSpace, style, + ComputeMargins(constraintSpace, style, FromPlatformWritingMode(style.getWritingMode()), FromPlatformDirection(style.direction())); return std::max(border_and_padding.BlockSum(), @@ -180,38 +180,38 @@ } } -LayoutUnit computeInlineSizeForFragment( +LayoutUnit ComputeInlineSizeForFragment( const NGConstraintSpace& constraintSpace, const ComputedStyle& style) { if (constraintSpace.FixedInlineSize()) return constraintSpace.ContainerSize().inline_size; LayoutUnit extent = - resolveInlineLength(constraintSpace, style, style.logicalWidth(), + ResolveInlineLength(constraintSpace, style, style.logicalWidth(), LengthResolveType::ContentSize); Length maxLength = style.logicalMaxWidth(); if (!maxLength.isMaxSizeNone()) { - LayoutUnit max = resolveInlineLength(constraintSpace, style, maxLength, + LayoutUnit max = ResolveInlineLength(constraintSpace, style, maxLength, LengthResolveType::MaxSize); extent = std::min(extent, max); } LayoutUnit min = - resolveInlineLength(constraintSpace, style, style.logicalMinWidth(), + ResolveInlineLength(constraintSpace, style, style.logicalMinWidth(), LengthResolveType::MinSize); extent = std::max(extent, min); return extent; } -LayoutUnit computeBlockSizeForFragment(const NGConstraintSpace& constraintSpace, +LayoutUnit ComputeBlockSizeForFragment(const NGConstraintSpace& constraintSpace, const ComputedStyle& style, LayoutUnit contentSize) { if (constraintSpace.FixedBlockSize()) return constraintSpace.ContainerSize().block_size; LayoutUnit extent = - resolveBlockLength(constraintSpace, style, style.logicalHeight(), + ResolveBlockLength(constraintSpace, style, style.logicalHeight(), contentSize, LengthResolveType::ContentSize); if (extent == NGSizeIndefinite) { DCHECK_EQ(contentSize, NGSizeIndefinite); @@ -221,19 +221,19 @@ Length maxLength = style.logicalMaxHeight(); if (!maxLength.isMaxSizeNone()) { LayoutUnit max = - resolveBlockLength(constraintSpace, style, maxLength, contentSize, + ResolveBlockLength(constraintSpace, style, maxLength, contentSize, LengthResolveType::MaxSize); extent = std::min(extent, max); } LayoutUnit min = - resolveBlockLength(constraintSpace, style, style.logicalMinHeight(), + ResolveBlockLength(constraintSpace, style, style.logicalMinHeight(), contentSize, LengthResolveType::MinSize); extent = std::max(extent, min); return extent; } -NGBoxStrut computeMargins(const NGConstraintSpace& constraintSpace, +NGBoxStrut ComputeMargins(const NGConstraintSpace& constraintSpace, const ComputedStyle& style, const NGWritingMode writing_mode, const NGDirection direction) { @@ -241,21 +241,21 @@ // https://www.w3.org/TR/CSS2/box.html#value-def-margin-width NGPhysicalDimensions physical_dim; physical_dim.left = - resolveInlineLength(constraintSpace, style, style.marginLeft(), + ResolveInlineLength(constraintSpace, style, style.marginLeft(), LengthResolveType::MarginBorderPaddingSize); physical_dim.right = - resolveInlineLength(constraintSpace, style, style.marginRight(), + ResolveInlineLength(constraintSpace, style, style.marginRight(), LengthResolveType::MarginBorderPaddingSize); physical_dim.top = - resolveInlineLength(constraintSpace, style, style.marginTop(), + ResolveInlineLength(constraintSpace, style, style.marginTop(), LengthResolveType::MarginBorderPaddingSize); physical_dim.bottom = - resolveInlineLength(constraintSpace, style, style.marginBottom(), + ResolveInlineLength(constraintSpace, style, style.marginBottom(), LengthResolveType::MarginBorderPaddingSize); return ToLogicalDimensions(physical_dim, writing_mode, direction); } -NGBoxStrut computeBorders(const ComputedStyle& style) { +NGBoxStrut ComputeBorders(const ComputedStyle& style) { NGBoxStrut borders; borders.inline_start = LayoutUnit(style.borderStartWidth()); borders.inline_end = LayoutUnit(style.borderEndWidth()); @@ -264,22 +264,22 @@ return borders; } -NGBoxStrut computePadding(const NGConstraintSpace& constraintSpace, +NGBoxStrut ComputePadding(const NGConstraintSpace& constraintSpace, const ComputedStyle& style) { // Padding always gets computed relative to the inline size: // https://www.w3.org/TR/CSS2/box.html#value-def-padding-width NGBoxStrut padding; padding.inline_start = - resolveInlineLength(constraintSpace, style, style.paddingStart(), + ResolveInlineLength(constraintSpace, style, style.paddingStart(), LengthResolveType::MarginBorderPaddingSize); padding.inline_end = - resolveInlineLength(constraintSpace, style, style.paddingEnd(), + ResolveInlineLength(constraintSpace, style, style.paddingEnd(), LengthResolveType::MarginBorderPaddingSize); padding.block_start = - resolveInlineLength(constraintSpace, style, style.paddingBefore(), + ResolveInlineLength(constraintSpace, style, style.paddingBefore(), LengthResolveType::MarginBorderPaddingSize); padding.block_end = - resolveInlineLength(constraintSpace, style, style.paddingAfter(), + ResolveInlineLength(constraintSpace, style, style.paddingAfter(), LengthResolveType::MarginBorderPaddingSize); return padding; }
diff --git a/third_party/WebKit/Source/core/layout/ng/ng_length_utils.h b/third_party/WebKit/Source/core/layout/ng/ng_length_utils.h index 2a08e928..c9eafc07 100644 --- a/third_party/WebKit/Source/core/layout/ng/ng_length_utils.h +++ b/third_party/WebKit/Source/core/layout/ng/ng_length_utils.h
@@ -28,14 +28,14 @@ // Convert an inline-axis length to a layout unit using the given constraint // space. -CORE_EXPORT LayoutUnit resolveInlineLength(const NGConstraintSpace&, +CORE_EXPORT LayoutUnit ResolveInlineLength(const NGConstraintSpace&, const ComputedStyle&, const Length&, LengthResolveType); // Convert a block-axis length to a layout unit using the given constraint // space and content size. -CORE_EXPORT LayoutUnit resolveBlockLength(const NGConstraintSpace&, +CORE_EXPORT LayoutUnit ResolveBlockLength(const NGConstraintSpace&, const ComputedStyle&, const Length&, LayoutUnit contentSize, @@ -44,24 +44,24 @@ // Resolves the given length to a layout unit, constraining it by the min // logical width and max logical width properties from the ComputedStyle // object. -CORE_EXPORT LayoutUnit computeInlineSizeForFragment(const NGConstraintSpace&, +CORE_EXPORT LayoutUnit ComputeInlineSizeForFragment(const NGConstraintSpace&, const ComputedStyle&); // Resolves the given length to a layout unit, constraining it by the min // logical height and max logical height properties from the ComputedStyle // object. -CORE_EXPORT LayoutUnit computeBlockSizeForFragment(const NGConstraintSpace&, +CORE_EXPORT LayoutUnit ComputeBlockSizeForFragment(const NGConstraintSpace&, const ComputedStyle&, LayoutUnit contentSize); -CORE_EXPORT NGBoxStrut computeMargins(const NGConstraintSpace&, +CORE_EXPORT NGBoxStrut ComputeMargins(const NGConstraintSpace&, const ComputedStyle&, const NGWritingMode writing_mode, const NGDirection direction); -CORE_EXPORT NGBoxStrut computeBorders(const ComputedStyle&); +CORE_EXPORT NGBoxStrut ComputeBorders(const ComputedStyle&); -CORE_EXPORT NGBoxStrut computePadding(const NGConstraintSpace&, +CORE_EXPORT NGBoxStrut ComputePadding(const NGConstraintSpace&, const ComputedStyle&); // Resolves margin: auto in the inline direction after a box has been laid out.
diff --git a/third_party/WebKit/Source/core/layout/ng/ng_length_utils_test.cc b/third_party/WebKit/Source/core/layout/ng/ng_length_utils_test.cc index 568b7ffe..506d0fc 100644 --- a/third_party/WebKit/Source/core/layout/ng/ng_length_utils_test.cc +++ b/third_party/WebKit/Source/core/layout/ng/ng_length_utils_test.cc
@@ -35,34 +35,34 @@ return derived_constraint_space; } - LayoutUnit resolveInlineLength( + LayoutUnit ResolveInlineLength( const Length& length, LengthResolveType type = LengthResolveType::ContentSize) { NGConstraintSpace* constraintSpace = ConstructConstraintSpace(200, 300); - return ::blink::resolveInlineLength(*constraintSpace, *style_, length, + return ::blink::ResolveInlineLength(*constraintSpace, *style_, length, type); } - LayoutUnit resolveBlockLength( + LayoutUnit ResolveBlockLength( const Length& length, LengthResolveType type = LengthResolveType::ContentSize, LayoutUnit contentSize = LayoutUnit()) { NGConstraintSpace* constraintSpace = ConstructConstraintSpace(200, 300); - return ::blink::resolveBlockLength(*constraintSpace, *style_, length, + return ::blink::ResolveBlockLength(*constraintSpace, *style_, length, contentSize, type); } - LayoutUnit computeInlineSizeForFragment( + LayoutUnit ComputeInlineSizeForFragment( const NGConstraintSpace* constraintSpace = ConstructConstraintSpace(200, 300)) { - return ::blink::computeInlineSizeForFragment(*constraintSpace, *style_); + return ::blink::ComputeInlineSizeForFragment(*constraintSpace, *style_); } - LayoutUnit computeBlockSizeForFragment( + LayoutUnit ComputeBlockSizeForFragment( const NGConstraintSpace* constraintSpace = ConstructConstraintSpace(200, 300), LayoutUnit contentSize = LayoutUnit()) { - return ::blink::computeBlockSizeForFragment(*constraintSpace, *style_, + return ::blink::ComputeBlockSizeForFragment(*constraintSpace, *style_, contentSize); } @@ -70,140 +70,140 @@ }; TEST_F(NGLengthUtilsTest, testResolveInlineLength) { - EXPECT_EQ(LayoutUnit(60), resolveInlineLength(Length(30, Percent))); - EXPECT_EQ(LayoutUnit(150), resolveInlineLength(Length(150, Fixed))); + EXPECT_EQ(LayoutUnit(60), ResolveInlineLength(Length(30, Percent))); + EXPECT_EQ(LayoutUnit(150), ResolveInlineLength(Length(150, Fixed))); EXPECT_EQ(LayoutUnit(0), - resolveInlineLength(Length(Auto), LengthResolveType::MinSize)); - EXPECT_EQ(LayoutUnit(200), resolveInlineLength(Length(Auto))); - EXPECT_EQ(LayoutUnit(200), resolveInlineLength(Length(FillAvailable))); + ResolveInlineLength(Length(Auto), LengthResolveType::MinSize)); + EXPECT_EQ(LayoutUnit(200), ResolveInlineLength(Length(Auto))); + EXPECT_EQ(LayoutUnit(200), ResolveInlineLength(Length(FillAvailable))); EXPECT_EQ(LayoutUnit(200), - resolveInlineLength(Length(Auto), LengthResolveType::MaxSize)); - EXPECT_EQ(LayoutUnit(200), resolveInlineLength(Length(FillAvailable), + ResolveInlineLength(Length(Auto), LengthResolveType::MaxSize)); + EXPECT_EQ(LayoutUnit(200), ResolveInlineLength(Length(FillAvailable), LengthResolveType::MaxSize)); } TEST_F(NGLengthUtilsTest, testResolveBlockLength) { - EXPECT_EQ(LayoutUnit(90), resolveBlockLength(Length(30, Percent))); - EXPECT_EQ(LayoutUnit(150), resolveBlockLength(Length(150, Fixed))); - EXPECT_EQ(LayoutUnit(0), resolveBlockLength(Length(Auto))); - EXPECT_EQ(LayoutUnit(300), resolveBlockLength(Length(FillAvailable))); + EXPECT_EQ(LayoutUnit(90), ResolveBlockLength(Length(30, Percent))); + EXPECT_EQ(LayoutUnit(150), ResolveBlockLength(Length(150, Fixed))); + EXPECT_EQ(LayoutUnit(0), ResolveBlockLength(Length(Auto))); + EXPECT_EQ(LayoutUnit(300), ResolveBlockLength(Length(FillAvailable))); EXPECT_EQ(LayoutUnit(0), - resolveBlockLength(Length(Auto), LengthResolveType::ContentSize)); + ResolveBlockLength(Length(Auto), LengthResolveType::ContentSize)); EXPECT_EQ(LayoutUnit(300), - resolveBlockLength(Length(FillAvailable), + ResolveBlockLength(Length(FillAvailable), LengthResolveType::ContentSize)); } TEST_F(NGLengthUtilsTest, testComputeInlineSizeForFragment) { style_->setLogicalWidth(Length(30, Percent)); - EXPECT_EQ(LayoutUnit(60), computeInlineSizeForFragment()); + EXPECT_EQ(LayoutUnit(60), ComputeInlineSizeForFragment()); style_->setLogicalWidth(Length(150, Fixed)); - EXPECT_EQ(LayoutUnit(150), computeInlineSizeForFragment()); + EXPECT_EQ(LayoutUnit(150), ComputeInlineSizeForFragment()); style_->setLogicalWidth(Length(Auto)); - EXPECT_EQ(LayoutUnit(200), computeInlineSizeForFragment()); + EXPECT_EQ(LayoutUnit(200), ComputeInlineSizeForFragment()); style_->setLogicalWidth(Length(FillAvailable)); - EXPECT_EQ(LayoutUnit(200), computeInlineSizeForFragment()); + EXPECT_EQ(LayoutUnit(200), ComputeInlineSizeForFragment()); style_->setLogicalWidth(Length(CalculationValue::create( PixelsAndPercent(100, -10), ValueRangeNonNegative))); - EXPECT_EQ(LayoutUnit(80), computeInlineSizeForFragment()); + EXPECT_EQ(LayoutUnit(80), ComputeInlineSizeForFragment()); NGConstraintSpace* constraintSpace = ConstructConstraintSpace(120, 120, true, true); style_->setLogicalWidth(Length(150, Fixed)); - EXPECT_EQ(LayoutUnit(120), computeInlineSizeForFragment(constraintSpace)); + EXPECT_EQ(LayoutUnit(120), ComputeInlineSizeForFragment(constraintSpace)); style_->setLogicalWidth(Length(200, Fixed)); style_->setMaxWidth(Length(80, Percent)); - EXPECT_EQ(LayoutUnit(160), computeInlineSizeForFragment()); + EXPECT_EQ(LayoutUnit(160), ComputeInlineSizeForFragment()); style_->setLogicalWidth(Length(100, Fixed)); style_->setMinWidth(Length(80, Percent)); - EXPECT_EQ(LayoutUnit(160), computeInlineSizeForFragment()); + EXPECT_EQ(LayoutUnit(160), ComputeInlineSizeForFragment()); style_ = ComputedStyle::create(); style_->setMarginRight(Length(20, Fixed)); - EXPECT_EQ(LayoutUnit(180), computeInlineSizeForFragment()); + EXPECT_EQ(LayoutUnit(180), ComputeInlineSizeForFragment()); style_->setLogicalWidth(Length(100, Fixed)); style_->setPaddingLeft(Length(50, Fixed)); - EXPECT_EQ(LayoutUnit(150), computeInlineSizeForFragment()); + EXPECT_EQ(LayoutUnit(150), ComputeInlineSizeForFragment()); style_->setBoxSizing(BoxSizingBorderBox); - EXPECT_EQ(LayoutUnit(100), computeInlineSizeForFragment()); + EXPECT_EQ(LayoutUnit(100), ComputeInlineSizeForFragment()); // Content size should never be below zero, even with box-sizing: border-box // and a large padding... style_->setPaddingLeft(Length(400, Fixed)); - EXPECT_EQ(LayoutUnit(400), computeInlineSizeForFragment()); + EXPECT_EQ(LayoutUnit(400), ComputeInlineSizeForFragment()); // ...and the same goes for fill-available with a large padding. style_->setLogicalWidth(Length(FillAvailable)); - EXPECT_EQ(LayoutUnit(400), computeInlineSizeForFragment()); + EXPECT_EQ(LayoutUnit(400), ComputeInlineSizeForFragment()); // TODO(layout-ng): test {min,max}-content on max-width. } TEST_F(NGLengthUtilsTest, testComputeBlockSizeForFragment) { style_->setLogicalHeight(Length(30, Percent)); - EXPECT_EQ(LayoutUnit(90), computeBlockSizeForFragment()); + EXPECT_EQ(LayoutUnit(90), ComputeBlockSizeForFragment()); style_->setLogicalHeight(Length(150, Fixed)); - EXPECT_EQ(LayoutUnit(150), computeBlockSizeForFragment()); + EXPECT_EQ(LayoutUnit(150), ComputeBlockSizeForFragment()); style_->setLogicalHeight(Length(Auto)); - EXPECT_EQ(LayoutUnit(0), computeBlockSizeForFragment()); + EXPECT_EQ(LayoutUnit(0), ComputeBlockSizeForFragment()); style_->setLogicalHeight(Length(Auto)); EXPECT_EQ(LayoutUnit(120), - computeBlockSizeForFragment(ConstructConstraintSpace(200, 300), + ComputeBlockSizeForFragment(ConstructConstraintSpace(200, 300), LayoutUnit(120))); style_->setLogicalHeight(Length(FillAvailable)); - EXPECT_EQ(LayoutUnit(300), computeBlockSizeForFragment()); + EXPECT_EQ(LayoutUnit(300), ComputeBlockSizeForFragment()); style_->setLogicalHeight(Length(CalculationValue::create( PixelsAndPercent(100, -10), ValueRangeNonNegative))); - EXPECT_EQ(LayoutUnit(70), computeBlockSizeForFragment()); + EXPECT_EQ(LayoutUnit(70), ComputeBlockSizeForFragment()); NGConstraintSpace* constraintSpace = ConstructConstraintSpace(200, 200, true, true); style_->setLogicalHeight(Length(150, Fixed)); - EXPECT_EQ(LayoutUnit(200), computeBlockSizeForFragment(constraintSpace)); + EXPECT_EQ(LayoutUnit(200), ComputeBlockSizeForFragment(constraintSpace)); style_->setLogicalHeight(Length(300, Fixed)); style_->setMaxHeight(Length(80, Percent)); - EXPECT_EQ(LayoutUnit(240), computeBlockSizeForFragment()); + EXPECT_EQ(LayoutUnit(240), ComputeBlockSizeForFragment()); style_->setLogicalHeight(Length(100, Fixed)); style_->setMinHeight(Length(80, Percent)); - EXPECT_EQ(LayoutUnit(240), computeBlockSizeForFragment()); + EXPECT_EQ(LayoutUnit(240), ComputeBlockSizeForFragment()); style_ = ComputedStyle::create(); style_->setMarginTop(Length(20, Fixed)); style_->setLogicalHeight(Length(FillAvailable)); - EXPECT_EQ(LayoutUnit(280), computeBlockSizeForFragment()); + EXPECT_EQ(LayoutUnit(280), ComputeBlockSizeForFragment()); style_->setLogicalHeight(Length(100, Fixed)); style_->setPaddingBottom(Length(50, Fixed)); - EXPECT_EQ(LayoutUnit(150), computeBlockSizeForFragment()); + EXPECT_EQ(LayoutUnit(150), ComputeBlockSizeForFragment()); style_->setBoxSizing(BoxSizingBorderBox); - EXPECT_EQ(LayoutUnit(100), computeBlockSizeForFragment()); + EXPECT_EQ(LayoutUnit(100), ComputeBlockSizeForFragment()); // Content size should never be below zero, even with box-sizing: border-box // and a large padding... style_->setPaddingBottom(Length(400, Fixed)); - EXPECT_EQ(LayoutUnit(400), computeBlockSizeForFragment()); + EXPECT_EQ(LayoutUnit(400), ComputeBlockSizeForFragment()); // ...and the same goes for fill-available with a large padding. style_->setLogicalHeight(Length(FillAvailable)); - EXPECT_EQ(LayoutUnit(400), computeBlockSizeForFragment()); + EXPECT_EQ(LayoutUnit(400), ComputeBlockSizeForFragment()); // TODO(layout-ng): test {min,max}-content on max-height. } @@ -213,13 +213,13 @@ style_->setHeight(Length(20, Percent)); EXPECT_EQ(NGSizeIndefinite, - computeBlockSizeForFragment(ConstructConstraintSpace(200, -1), + ComputeBlockSizeForFragment(ConstructConstraintSpace(200, -1), LayoutUnit(-1))); EXPECT_EQ(LayoutUnit(20), - computeBlockSizeForFragment(ConstructConstraintSpace(200, -1), + ComputeBlockSizeForFragment(ConstructConstraintSpace(200, -1), LayoutUnit(10))); EXPECT_EQ(LayoutUnit(120), - computeBlockSizeForFragment(ConstructConstraintSpace(200, -1), + ComputeBlockSizeForFragment(ConstructConstraintSpace(200, -1), LayoutUnit(120))); } @@ -231,7 +231,7 @@ NGConstraintSpace* constraintSpace(ConstructConstraintSpace(200, 300)); - NGBoxStrut margins = computeMargins(*constraintSpace, *style_, + NGBoxStrut margins = ComputeMargins(*constraintSpace, *style_, HorizontalTopBottom, LeftToRight); EXPECT_EQ(LayoutUnit(20), margins.block_start); @@ -251,7 +251,7 @@ style_->setBorderLeftStyle(BorderStyleSolid); style_->setWritingMode(LeftToRightWritingMode); - NGBoxStrut borders = computeBorders(*style_); + NGBoxStrut borders = ComputeBorders(*style_); EXPECT_EQ(LayoutUnit(4), borders.block_start); EXPECT_EQ(LayoutUnit(3), borders.inline_end); @@ -268,7 +268,7 @@ NGConstraintSpace* constraintSpace(ConstructConstraintSpace(200, 300)); - NGBoxStrut padding = computePadding(*constraintSpace, *style_); + NGBoxStrut padding = ComputePadding(*constraintSpace, *style_); EXPECT_EQ(LayoutUnit(52), padding.block_start); EXPECT_EQ(LayoutUnit(), padding.inline_end);
diff --git a/third_party/WebKit/Source/core/loader/DocumentLoader.cpp b/third_party/WebKit/Source/core/loader/DocumentLoader.cpp index 7f68975..f2f9b3f 100644 --- a/third_party/WebKit/Source/core/loader/DocumentLoader.cpp +++ b/third_party/WebKit/Source/core/loader/DocumentLoader.cpp
@@ -448,6 +448,29 @@ } } + if (RuntimeEnabledFeatures::embedderCSPEnforcementEnabled() && + !frameLoader()->requiredCSP().isEmpty()) { + SecurityOrigin* parentSecurityOrigin = + frame()->tree().parent()->securityContext()->getSecurityOrigin(); + if (ContentSecurityPolicy::shouldEnforceEmbeddersPolicy( + response, parentSecurityOrigin)) { + m_contentSecurityPolicy->addPolicyFromHeaderValue( + frameLoader()->requiredCSP(), ContentSecurityPolicyHeaderTypeEnforce, + ContentSecurityPolicyHeaderSourceHTTP); + } else { + String message = "Refused to display '" + response.url().elidedString() + + "' because it has not opted-into the following policy " + "required by its embedder: '" + + frameLoader()->requiredCSP() + "'."; + ConsoleMessage* consoleMessage = ConsoleMessage::createForRequest( + SecurityMessageSource, ErrorMessageLevel, message, response.url(), + mainResourceIdentifier()); + frame()->document()->addConsoleMessage(consoleMessage); + cancelLoadAfterXFrameOptionsOrCSPDenied(response); + return; + } + } + DCHECK(!m_frame->page()->defersLoading()); m_response = response;
diff --git a/third_party/WebKit/Source/core/loader/FrameLoader.cpp b/third_party/WebKit/Source/core/loader/FrameLoader.cpp index 79fe934..83912c8 100644 --- a/third_party/WebKit/Source/core/loader/FrameLoader.cpp +++ b/third_party/WebKit/Source/core/loader/FrameLoader.cpp
@@ -951,7 +951,7 @@ return true; KURL url = request.resourceRequest().url(); - if (m_frame->script().executeScriptIfJavaScriptURL(url)) + if (m_frame->script().executeScriptIfJavaScriptURL(url, nullptr)) return false; if (!request.originDocument()->getSecurityOrigin()->canDisplay(url)) {
diff --git a/third_party/WebKit/Source/core/loader/HttpEquiv.cpp b/third_party/WebKit/Source/core/loader/HttpEquiv.cpp index 6a28964..f85dfdb 100644 --- a/third_party/WebKit/Source/core/loader/HttpEquiv.cpp +++ b/third_party/WebKit/Source/core/loader/HttpEquiv.cpp
@@ -22,16 +22,17 @@ void HttpEquiv::process(Document& document, const AtomicString& equiv, const AtomicString& content, - bool inDocumentHeadElement) { + bool inDocumentHeadElement, + Element* element) { DCHECK(!equiv.isNull()); DCHECK(!content.isNull()); if (equalIgnoringCase(equiv, "default-style")) { processHttpEquivDefaultStyle(document, content); } else if (equalIgnoringCase(equiv, "refresh")) { - processHttpEquivRefresh(document, content); + processHttpEquivRefresh(document, content, element); } else if (equalIgnoringCase(equiv, "set-cookie")) { - processHttpEquivSetCookie(document, content); + processHttpEquivSetCookie(document, content, element); } else if (equalIgnoringCase(equiv, "content-language")) { document.setContentLanguage(content); } else if (equalIgnoringCase(equiv, "x-dns-prefetch-control")) { @@ -96,10 +97,11 @@ } void HttpEquiv::processHttpEquivRefresh(Document& document, - const AtomicString& content) { + const AtomicString& content, + Element* element) { UseCounter::count(document, UseCounter::MetaRefresh); if (!document.contentSecurityPolicy()->allowInlineScript( - KURL(), "", ParserInserted, OrdinalNumber(), "", + element, KURL(), "", OrdinalNumber(), "", ContentSecurityPolicy::SuppressReport)) { UseCounter::count(document, UseCounter::MetaRefreshWhenCSPBlocksInlineScript); @@ -109,7 +111,8 @@ } void HttpEquiv::processHttpEquivSetCookie(Document& document, - const AtomicString& content) { + const AtomicString& content, + Element* element) { // FIXME: make setCookie work on XML documents too; e.g. in case of // <html:meta.....> if (!document.isHTMLDocument()) @@ -117,7 +120,7 @@ UseCounter::count(document, UseCounter::MetaSetCookie); if (!document.contentSecurityPolicy()->allowInlineScript( - KURL(), "", ParserInserted, OrdinalNumber(), "", + element, KURL(), "", OrdinalNumber(), "", ContentSecurityPolicy::SuppressReport)) { UseCounter::count(document, UseCounter::MetaSetCookieWhenCSPBlocksInlineScript);
diff --git a/third_party/WebKit/Source/core/loader/HttpEquiv.h b/third_party/WebKit/Source/core/loader/HttpEquiv.h index e90571b..ae7002c 100644 --- a/third_party/WebKit/Source/core/loader/HttpEquiv.h +++ b/third_party/WebKit/Source/core/loader/HttpEquiv.h
@@ -11,6 +11,7 @@ namespace blink { class Document; +class Element; /** * Handles a HTTP header equivalent set by a meta tag using @@ -27,13 +28,18 @@ static void process(Document&, const AtomicString& equiv, const AtomicString& content, - bool inDocumentHeadElement); + bool inDocumentHeadElement, + Element*); private: static void processHttpEquivDefaultStyle(Document&, const AtomicString& content); - static void processHttpEquivRefresh(Document&, const AtomicString& content); - static void processHttpEquivSetCookie(Document&, const AtomicString& content); + static void processHttpEquivRefresh(Document&, + const AtomicString& content, + Element*); + static void processHttpEquivSetCookie(Document&, + const AtomicString& content, + Element*); static void processHttpEquivXFrameOptions(Document&, const AtomicString& content); static void processHttpEquivContentSecurityPolicy(
diff --git a/third_party/WebKit/Source/core/paint/PaintLayerScrollableArea.cpp b/third_party/WebKit/Source/core/paint/PaintLayerScrollableArea.cpp index 9767274a..7cbd81d 100644 --- a/third_party/WebKit/Source/core/paint/PaintLayerScrollableArea.cpp +++ b/third_party/WebKit/Source/core/paint/PaintLayerScrollableArea.cpp
@@ -520,7 +520,7 @@ } IntSize PaintLayerScrollableArea::contentsSize() const { - return IntSize(scrollWidth().toInt(), scrollHeight().toInt()); + return IntSize(pixelSnappedScrollWidth(), pixelSnappedScrollHeight()); } IntPoint PaintLayerScrollableArea::lastKnownMousePosition() const { @@ -830,7 +830,8 @@ bool PaintLayerScrollableArea::shouldPerformScrollAnchoring() const { return RuntimeEnabledFeatures::scrollAnchoringEnabled() && m_scrollAnchor.hasScroller() && - layoutBox()->style()->overflowAnchor() != AnchorNone; + layoutBox()->style()->overflowAnchor() != AnchorNone && + !box().document().finishingOrIsPrinting(); } ScrollBehavior PaintLayerScrollableArea::scrollBehaviorStyle() const {
diff --git a/third_party/WebKit/Source/core/paint/TextPainterTest.cpp b/third_party/WebKit/Source/core/paint/TextPainterTest.cpp index d5cd80e..44fbf6de 100644 --- a/third_party/WebKit/Source/core/paint/TextPainterTest.cpp +++ b/third_party/WebKit/Source/core/paint/TextPainterTest.cpp
@@ -129,7 +129,7 @@ document().body()->setInlineStyleProperty(CSSPropertyWebkitPrintColorAdjust, CSSValueEconomy); document().settings()->setShouldPrintBackgrounds(false); - document().setPrinting(true); + document().setPrinting(Document::Printing); document().view()->updateAllLifecyclePhases(); TextPainter::Style textStyle = TextPainter::textPaintingStyle( @@ -150,7 +150,7 @@ document().body()->setInlineStyleProperty(CSSPropertyWebkitPrintColorAdjust, CSSValueEconomy); document().settings()->setShouldPrintBackgrounds(false); - document().setPrinting(true); + document().setPrinting(Document::Printing); document().view()->updateAllLifecyclePhases(); TextPainter::Style textStyle = TextPainter::textPaintingStyle(
diff --git a/third_party/WebKit/Source/core/svg/UnsafeSVGAttributeSanitizationTest.cpp b/third_party/WebKit/Source/core/svg/UnsafeSVGAttributeSanitizationTest.cpp index aeccbc8..3ebb888 100644 --- a/third_party/WebKit/Source/core/svg/UnsafeSVGAttributeSanitizationTest.cpp +++ b/third_party/WebKit/Source/core/svg/UnsafeSVGAttributeSanitizationTest.cpp
@@ -57,6 +57,7 @@ // Make the body editable, and put the caret in it. body->setAttribute(HTMLNames::contenteditableAttr, "true"); + frame.document()->updateStyleAndLayout(); frame.selection().setSelection( VisibleSelection::selectionFromContentsOfNode(body)); EXPECT_EQ(CaretSelection, frame.selection().getSelectionType());
diff --git a/third_party/WebKit/Source/core/testing/DeathAwareScriptWrappable.h b/third_party/WebKit/Source/core/testing/DeathAwareScriptWrappable.h index 386ff84..ef5ffcc 100644 --- a/third_party/WebKit/Source/core/testing/DeathAwareScriptWrappable.h +++ b/third_party/WebKit/Source/core/testing/DeathAwareScriptWrappable.h
@@ -6,7 +6,7 @@ #define DeathAwareScriptWrappable_h #include "bindings/core/v8/ScriptWrappable.h" -#include "bindings/core/v8/ScriptWrappableVisitor.h" +#include "bindings/core/v8/TraceWrapperMember.h" #include "platform/heap/Heap.h" #include "wtf/text/WTFString.h" #include <signal.h>
diff --git a/third_party/WebKit/Source/core/testing/Internals.cpp b/third_party/WebKit/Source/core/testing/Internals.cpp index 83402ec3..8f893178 100644 --- a/third_party/WebKit/Source/core/testing/Internals.cpp +++ b/third_party/WebKit/Source/core/testing/Internals.cpp
@@ -38,10 +38,6 @@ #include "core/HTMLNames.h" #include "core/SVGNames.h" #include "core/animation/DocumentTimeline.h" -#include "core/css/StyleSheetContents.h" -#include "core/css/resolver/StyleResolver.h" -#include "core/css/resolver/StyleResolverStats.h" -#include "core/css/resolver/ViewportStyleResolver.h" #include "core/dom/ClientRect.h" #include "core/dom/ClientRectList.h" #include "core/dom/DOMArrayBuffer.h" @@ -1226,6 +1222,9 @@ String Internals::rangeAsText(const Range* range) { ASSERT(range); + // Clean layout is required by plain text extraction. + range->ownerDocument().updateStyleAndLayoutIgnorePendingStylesheets(); + return range->text(); }
diff --git a/third_party/WebKit/Source/devtools/.gitignore b/third_party/WebKit/Source/devtools/.gitignore index 77731a4..f9757b2c 100644 --- a/third_party/WebKit/Source/devtools/.gitignore +++ b/third_party/WebKit/Source/devtools/.gitignore
@@ -10,3 +10,4 @@ config.gypi npm-debug.log /release +/scripts/local_node/runtimes
diff --git a/third_party/WebKit/Source/devtools/BUILD.gn b/third_party/WebKit/Source/devtools/BUILD.gn index cc76f43..44e01495 100644 --- a/third_party/WebKit/Source/devtools/BUILD.gn +++ b/third_party/WebKit/Source/devtools/BUILD.gn
@@ -754,6 +754,7 @@ "front_end/ui_lazy/overviewGrid.css", "front_end/ui_lazy/pieChart.css", "front_end/ui_lazy/timelineGrid.css", + "front_end/ui_lazy/ChartViewport.js", "front_end/ui_lazy/CommandMenu.js", "front_end/ui_lazy/DataGrid.js", "front_end/ui_lazy/FilteredListWidget.js",
diff --git a/third_party/WebKit/Source/devtools/PRESUBMIT.py b/third_party/WebKit/Source/devtools/PRESUBMIT.py index 48c11e1..d135a99f 100644 --- a/third_party/WebKit/Source/devtools/PRESUBMIT.py +++ b/third_party/WebKit/Source/devtools/PRESUBMIT.py
@@ -37,6 +37,18 @@ compile_note = "Be sure to run your patch by the compile_frontend.py script prior to committing!" +def _CheckNodeAndNPMModules(input_api, output_api): + node_script_path = input_api.os_path.join(input_api.PresubmitLocalPath(), "scripts", "install_node_deps.py") + process = input_api.subprocess.Popen( + [input_api.python_executable, node_script_path], + stdout=input_api.subprocess.PIPE, + stderr=input_api.subprocess.STDOUT) + out, _ = process.communicate() + if process.returncode != 0: + return [output_api.PresubmitError(out)] + return [output_api.PresubmitNotifyResult(out)] + + def _CheckDevtoolsStyle(input_api, output_api): local_paths = [f.AbsoluteLocalPath() for f in input_api.AffectedFiles() if f.Action() != "D"] @@ -54,8 +66,7 @@ out, _ = process.communicate() if process.returncode != 0: return [output_api.PresubmitError(out)] - if "NOTE" in out: - return [output_api.PresubmitNotifyResult(out)] + return [output_api.PresubmitNotifyResult(out)] return [] @@ -153,6 +164,7 @@ def CheckChangeOnUpload(input_api, output_api): results = [] + results.extend(_CheckNodeAndNPMModules(input_api, output_api)) results.extend(_CheckDevtoolsStyle(input_api, output_api)) results.extend(_CompileDevtoolsFrontend(input_api, output_api)) results.extend(_CheckConvertSVGToPNGHashes(input_api, output_api))
diff --git a/third_party/WebKit/Source/devtools/front_end/Runtime.js b/third_party/WebKit/Source/devtools/front_end/Runtime.js index dd1f05b0..35dc411 100644 --- a/third_party/WebKit/Source/devtools/front_end/Runtime.js +++ b/third_party/WebKit/Source/devtools/front_end/Runtime.js
@@ -1101,17 +1101,6 @@ var name = pair.shift(); Runtime._queryParamsObject[name] = pair.join("="); } - var flags = Runtime._queryParamsObject["flags"]; - delete Runtime._queryParamsObject["flags"]; - if (flags) { - try { - var parsedFlags = JSON.parse(window.decodeURIComponent(flags)); - for (var key in parsedFlags) - Runtime._queryParamsObject[key] = parsedFlags[key]; - } catch(e) { - console.error("Invalid startup flag: " + e); - } - } })();}
diff --git a/third_party/WebKit/Source/devtools/front_end/devtools.js b/third_party/WebKit/Source/devtools/front_end/devtools.js index 3d2d29a8..1ef19d9 100644 --- a/third_party/WebKit/Source/devtools/front_end/devtools.js +++ b/third_party/WebKit/Source/devtools/front_end/devtools.js
@@ -992,30 +992,6 @@ window.Object.observe = objectObserve; } -/** - * @suppressGlobalPropertiesCheck - */ -function sanitizeRemoteFrontendUrl() -{ - var remoteBaseRegexp = /^https:\/\/chrome-devtools-frontend\.appspot\.com\/serve_file\/@[0-9a-zA-Z]+\/?$/; - var remoteFrontendUrlRegexp = /^https:\/\/chrome-devtools-frontend\.appspot\.com\/serve_rev\/@?[0-9a-zA-Z]+\/(devtools|inspector)\.html$/; - var queryParams = location.search; - if (!queryParams) - return; - var params = queryParams.substring(1).split("&"); - for (var i = 0; i < params.length; ++i) { - var pair = params[i].split("="); - var name = pair.shift(); - var value = pair.join("="); - if (name === "remoteFrontendUrl" && !remoteFrontendUrlRegexp.test(value)) - location.search = ""; - if (name === "remoteBase" && !remoteBaseRegexp.test(value)) - location.search = ""; - if (name === "settings") - location.search = ""; - } -} - var staticKeyIdentifiers = new Map([ [0x12, "Alt"], [0x11, "Control"], @@ -1094,8 +1070,6 @@ */ function installBackwardsCompatibility() { - sanitizeRemoteFrontendUrl(); - if (window.location.search.indexOf("remoteFrontend") === -1) return; @@ -1170,14 +1144,11 @@ installBackwardsCompatibility(); } -sanitizeRemoteFrontendUrl(); if (window.document.head && (window.document.readyState === "complete" || window.document.readyState === "interactive")) installBackwardsCompatibility(); else window.addEventListener("DOMContentLoaded", windowLoaded, false); -})(window); - if (!DOMTokenList.prototype.__originalDOMTokenListToggle) { DOMTokenList.prototype.__originalDOMTokenListToggle = DOMTokenList.prototype.toggle; DOMTokenList.prototype.toggle = function(token, force) @@ -1187,3 +1158,5 @@ return this.__originalDOMTokenListToggle(token, !!force); } } + +})(window);
diff --git a/third_party/WebKit/Source/devtools/front_end/screencast/ScreencastView.js b/third_party/WebKit/Source/devtools/front_end/screencast/ScreencastView.js index 5a3dc2e..5564565 100644 --- a/third_party/WebKit/Source/devtools/front_end/screencast/ScreencastView.js +++ b/third_party/WebKit/Source/devtools/front_end/screencast/ScreencastView.js
@@ -708,8 +708,6 @@ _createNavigationBar: function() { this._navigationBar = this.element.createChild("div", "screencast-navigation"); - if (Runtime.queryParam("hideNavigation")) - this._navigationBar.classList.add("hidden"); this._navigationBack = this._navigationBar.createChild("button", "back"); this._navigationBack.disabled = true;
diff --git a/third_party/WebKit/Source/devtools/front_end/security/SecurityPanel.js b/third_party/WebKit/Source/devtools/front_end/security/SecurityPanel.js index 45c96b66..f6fab659 100644 --- a/third_party/WebKit/Source/devtools/front_end/security/SecurityPanel.js +++ b/third_party/WebKit/Source/devtools/front_end/security/SecurityPanel.js
@@ -634,7 +634,7 @@ var lockSpectrum = this._summarySection.createChild("div", "lock-spectrum"); lockSpectrum.createChild("div", "lock-icon lock-icon-secure").title = WebInspector.UIString("Secure"); lockSpectrum.createChild("div", "lock-icon lock-icon-neutral").title = WebInspector.UIString("Not Secure"); - lockSpectrum.createChild("div", "lock-icon lock-icon-insecure").title = WebInspector.UIString("Insecure (Broken)"); + lockSpectrum.createChild("div", "lock-icon lock-icon-insecure").title = WebInspector.UIString("Not Secure (Broken)"); this._summarySection.createChild("div", "triangle-pointer-container").createChild("div", "triangle-pointer-wrapper").createChild("div", "triangle-pointer"); @@ -681,7 +681,7 @@ this._summarySection.classList.add("security-summary-" + this._securityState); var summaryExplanationStrings = { "unknown": WebInspector.UIString("The security of this page is unknown."), - "insecure": WebInspector.UIString("This page is insecure (broken HTTPS)."), + "insecure": WebInspector.UIString("This page is not secure (broken HTTPS)."), "neutral": WebInspector.UIString("This page is not secure."), "secure": WebInspector.UIString("This page is secure (valid HTTPS).") } @@ -729,13 +729,13 @@ if (this._insecureContentStatus && (this._insecureContentStatus.ranMixedContent || this._insecureContentStatus.displayedMixedContent)) { if (this._insecureContentStatus.ranMixedContent) - this._addMixedContentExplanation(this._securityExplanationsMain, this._insecureContentStatus.ranInsecureContentStyle, WebInspector.UIString("Active Mixed Content"), WebInspector.UIString("You have recently allowed insecure content (such as scripts or iframes) to run on this site."), WebInspector.NetworkLogView.MixedContentFilterValues.BlockOverridden, showBlockOverriddenMixedContentInNetworkPanel); + this._addMixedContentExplanation(this._securityExplanationsMain, this._insecureContentStatus.ranInsecureContentStyle, WebInspector.UIString("Active Mixed Content"), WebInspector.UIString("You have recently allowed non-secure content (such as scripts or iframes) to run on this site."), WebInspector.NetworkLogView.MixedContentFilterValues.BlockOverridden, showBlockOverriddenMixedContentInNetworkPanel); if (this._insecureContentStatus.displayedMixedContent) this._addMixedContentExplanation(this._securityExplanationsMain, this._insecureContentStatus.displayedInsecureContentStyle, WebInspector.UIString("Mixed Content"), WebInspector.UIString("The site includes HTTP resources."), WebInspector.NetworkLogView.MixedContentFilterValues.Displayed, showDisplayedMixedContentInNetworkPanel); } if (this._panel.filterRequestCount(WebInspector.NetworkLogView.MixedContentFilterValues.Blocked) > 0) - this._addMixedContentExplanation(this._securityExplanationsExtra, SecurityAgent.SecurityState.Info, WebInspector.UIString("Blocked mixed content"), WebInspector.UIString("Your page requested insecure resources that were blocked."), WebInspector.NetworkLogView.MixedContentFilterValues.Blocked, showBlockedMixedContentInNetworkPanel); + this._addMixedContentExplanation(this._securityExplanationsExtra, SecurityAgent.SecurityState.Info, WebInspector.UIString("Blocked mixed content"), WebInspector.UIString("Your page requested non-secure resources that were blocked."), WebInspector.NetworkLogView.MixedContentFilterValues.Blocked, showBlockedMixedContentInNetworkPanel); /** * @param {!Event} e
diff --git a/third_party/WebKit/Source/devtools/front_end/ui_lazy/ChartViewport.js b/third_party/WebKit/Source/devtools/front_end/ui_lazy/ChartViewport.js new file mode 100644 index 0000000..d0818287 --- /dev/null +++ b/third_party/WebKit/Source/devtools/front_end/ui_lazy/ChartViewport.js
@@ -0,0 +1,482 @@ +// 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. + +/** + * @constructor + * @extends {WebInspector.VBox} + */ +WebInspector.ChartViewport = function() +{ + WebInspector.VBox.call(this, true); + + this.contentElement.addEventListener("mousewheel", this._onMouseWheel.bind(this), false); + this.contentElement.addEventListener("keydown", this._handleZoomPanKeys.bind(this), false); + + WebInspector.installInertialDragHandle(this.contentElement, this._startDragging.bind(this), this._dragging.bind(this), this._endDragging.bind(this), "-webkit-grabbing", null); + WebInspector.installDragHandle(this.contentElement, this._startRangeSelection.bind(this), this._rangeSelectionDragging.bind(this), this._endRangeSelection.bind(this), "text", null); + + /** @private */ + this._vScrollElement = this.contentElement.createChild("div", "flame-chart-v-scroll"); + this._vScrollContent = this._vScrollElement.createChild("div"); + this._vScrollElement.addEventListener("scroll", this._onScroll.bind(this), false); + + /** @private */ + this._selectionOverlay = this.contentElement.createChild("div", "flame-chart-selection-overlay hidden"); + /** @private */ + this._selectedTimeSpanLabel = this._selectionOverlay.createChild("div", "time-span"); + + this.reset(); +} + +WebInspector.ChartViewport.prototype = { + /** + * @return {boolean} + */ + isDragging: function() + { + return this._isDragging; + }, + + /** + * @override + * @return {!Array<!Element>} + */ + elementsToRestoreScrollPositionsFor: function() + { + return [this._vScrollElement]; + }, + + /** + * @private + */ + _updateScrollBar: function() + { + var showScroll = this._totalHeight > this._offsetHeight; + if (this._vScrollElement.classList.contains("hidden") === showScroll) { + this._vScrollElement.classList.toggle("hidden", !showScroll); + this._updateContentElementSize(); + } + }, + + /** + * @override + */ + onResize: function() + { + this._updateScrollBar(); + this._updateContentElementSize(); + this.scheduleUpdate(); + }, + + reset: function() + { + this._vScrollElement.scrollTop = 0; + /** @private */ + this._scrollTop = 0; + /** @private */ + this._rangeSelectionStart = 0; + /** @private */ + this._rangeSelectionEnd = 0; + /** @private */ + this._scrollTop = 0; + /** @private */ + this._isDragging = false; + /** @private */ + this._dragStartPointX = 0; + /** @private */ + this._dragStartPointY = 0; + /** @private */ + this._dragStartScrollTop = 0; + /** @private */ + this._timeWindowLeft = 0; + /** @private */ + this._timeWindowRight = 0; + /** @private */ + this._offsetWidth = 0; + /** @private */ + this._offsetHeight = 0; + /** @private */ + this._totalHeight = 0; + /** @private */ + this._pendingAnimationTimeLeft = 0; + /** @private */ + this._pendingAnimationTimeRight = 0; + }, + + /** + * @private + */ + _updateContentElementSize: function() + { + var offsetWidth = this._vScrollElement.offsetLeft; + if (!offsetWidth) + offsetWidth = this.contentElement.offsetWidth; + this._offsetWidth = offsetWidth; + this._offsetHeight = this.contentElement.offsetHeight; + }, + + setContentHeight: function(totalHeight) + { + this._totalHeight = totalHeight; + this._vScrollContent.style.height = totalHeight + "px"; + if (this._scrollTop + this._offsetHeight <= totalHeight) + return; + this._scrollTop = Math.max(0, totalHeight - this._offsetHeight); + this._vScrollElement.scrollTop = this._scrollTop; + }, + + /** + * @param {number} offset + * @param {number=} height + */ + setScrollOffset: function(offset, height) + { + height = height || 0; + if (this._vScrollElement.scrollTop > offset) + this._vScrollElement.scrollTop = offset; + else if (this._vScrollElement.scrollTop < offset - this._offsetHeight + height) + this._vScrollElement.scrollTop = offset - this._offsetHeight + height; + }, + + /** + * @return {number} + */ + scrollOffset: function() + { + return this._vScrollElement.scrollTop; + }, + + /** + * @param {!Event} e + * @private + */ + _onMouseWheel: function(e) + { + if (!this._enabled()) + return; + // Pan vertically when shift down only. + var panVertically = e.shiftKey && (e.wheelDeltaY || Math.abs(e.wheelDeltaX) === 120); + var panHorizontally = Math.abs(e.wheelDeltaX) > Math.abs(e.wheelDeltaY) && !e.shiftKey; + if (panVertically) { + this._vScrollElement.scrollTop -= (e.wheelDeltaY || e.wheelDeltaX) / 120 * this._offsetHeight / 8; + } else if (panHorizontally) { + var shift = -e.wheelDeltaX * this._pixelToTime; + this._muteAnimation = true; + this._handlePanGesture(shift); + this._muteAnimation = false; + } else { // Zoom. + const mouseWheelZoomSpeed = 1 / 120; + this._handleZoomGesture(Math.pow(1.2, -(e.wheelDeltaY || e.wheelDeltaX) * mouseWheelZoomSpeed) - 1); + } + + // Block swipe gesture. + e.consume(true); + }, + + /** + * @param {number} x + * @param {number} y + * @param {!MouseEvent} event + * @private + * @return {boolean} + */ + _startDragging: function(x, y, event) + { + if (event.shiftKey) + return false; + if (this._windowRight === Infinity) + return false; + this._isDragging = true; + this._initMaxDragOffset(event); + this._dragStartPointX = x; + this._dragStartPointY = y; + this._dragStartScrollTop = this._vScrollElement.scrollTop; + this.contentElement.style.cursor = ""; + this.hideHighlight(); + return true; + }, + + /** + * @param {number} x + * @param {number} y + * @private + */ + _dragging: function(x, y) + { + var pixelShift = this._dragStartPointX - x; + this._dragStartPointX = x; + this._muteAnimation = true; + this._handlePanGesture(pixelShift * this._pixelToTime); + this._muteAnimation = false; + + var pixelScroll = this._dragStartPointY - y; + this._vScrollElement.scrollTop = this._dragStartScrollTop + pixelScroll; + this._updateMaxDragOffset(x, y); + }, + + /** + * @private + */ + _endDragging: function() + { + this._isDragging = false; + this._updateHighlight(); + }, + + /** + * @param {!MouseEvent} event + * @private + */ + _initMaxDragOffset: function(event) + { + this._maxDragOffsetSquared = 0; + this._dragStartX = event.pageX; + this._dragStartY = event.pageY; + }, + + /** + * @param {number} x + * @param {number} y + * @private + */ + _updateMaxDragOffset: function(x, y) + { + var dx = x - this._dragStartX; + var dy = y - this._dragStartY; + var dragOffsetSquared = dx * dx + dy * dy; + this._maxDragOffsetSquared = Math.max(this._maxDragOffsetSquared, dragOffsetSquared); + }, + + /** + * @return {number} + */ + maxDragOffset: function() + { + return Math.sqrt(this._maxDragOffsetSquared); + }, + + /** + * @param {!MouseEvent} event + * @private + * @return {boolean} + */ + _startRangeSelection: function(event) + { + if (!event.shiftKey) + return false; + this._isDragging = true; + this._initMaxDragOffset(event); + this._selectionOffsetShiftX = event.offsetX - event.pageX; + this._selectionOffsetShiftY = event.offsetY - event.pageY; + this._selectionStartX = event.offsetX; + var style = this._selectionOverlay.style; + style.left = this._selectionStartX + "px"; + style.width = "1px"; + this._selectedTimeSpanLabel.textContent = ""; + this._selectionOverlay.classList.remove("hidden"); + this.hideHighlight(); + return true; + }, + + /** + * @private + */ + _endRangeSelection: function() + { + this._isDragging = false; + this._updateHighlight(); + }, + + hideRangeSelection: function() + { + this._selectionOverlay.classList.add("hidden"); + }, + + /** + * @param {!MouseEvent} event + * @private + */ + _rangeSelectionDragging: function(event) + { + this._updateMaxDragOffset(event.pageX, event.pageY); + var x = Number.constrain(event.pageX + this._selectionOffsetShiftX, 0, this._offsetWidth); + var start = this._cursorTime(this._selectionStartX); + var end = this._cursorTime(x); + this._rangeSelectionStart = Math.min(start, end); + this._rangeSelectionEnd = Math.max(start, end); + this._updateRangeSelectionOverlay(); + this._flameChartDelegate.updateRangeSelection(this._rangeSelectionStart, this._rangeSelectionEnd); + }, + + /** + * @private + */ + _updateRangeSelectionOverlay: function() + { + var /** @const */ margin = 100; + var left = Number.constrain(this._timeToPosition(this._rangeSelectionStart), -margin, this._offsetWidth + margin); + var right = Number.constrain(this._timeToPosition(this._rangeSelectionEnd), -margin, this._offsetWidth + margin); + var style = this._selectionOverlay.style; + style.left = left + "px"; + style.width = (right - left) + "px"; + var timeSpan = this._rangeSelectionEnd - this._rangeSelectionStart; + this._selectedTimeSpanLabel.textContent = Number.preciseMillisToString(timeSpan, 2); + }, + + /** + * @private + */ + _onScroll: function() + { + this._scrollTop = this._vScrollElement.scrollTop; + this.scheduleUpdate(); + }, + + /** + * @param {!Event} e + * @private + */ + _handleZoomPanKeys: function(e) + { + if (!WebInspector.KeyboardShortcut.hasNoModifiers(e)) + return; + var zoomMultiplier = e.shiftKey ? 0.8 : 0.3; + var panMultiplier = e.shiftKey ? 320 : 80; + if (e.keyCode === "A".charCodeAt(0)) { + this._handlePanGesture(-panMultiplier * this._pixelToTime); + e.consume(true); + } else if (e.keyCode === "D".charCodeAt(0)) { + this._handlePanGesture(panMultiplier * this._pixelToTime); + e.consume(true); + } else if (e.keyCode === "W".charCodeAt(0)) { + this._handleZoomGesture(-zoomMultiplier); + e.consume(true); + } else if (e.keyCode === "S".charCodeAt(0)) { + this._handleZoomGesture(zoomMultiplier); + e.consume(true); + } + }, + + /** + * @param {number} zoom + * @private + */ + _handleZoomGesture: function(zoom) + { + this._cancelAnimation(); + var bounds = this._windowForGesture(); + var cursorTime = this._cursorTime(this._lastMouseOffsetX); + bounds.left += (bounds.left - cursorTime) * zoom; + bounds.right += (bounds.right - cursorTime) * zoom; + this._requestWindowTimes(bounds); + }, + + /** + * @param {number} shift + * @private + */ + _handlePanGesture: function(shift) + { + this._cancelAnimation(); + var bounds = this._windowForGesture(); + shift = Number.constrain(shift, this._minimumBoundary - bounds.left, this._totalTime + this._minimumBoundary - bounds.right); + bounds.left += shift; + bounds.right += shift; + this._requestWindowTimes(bounds); + }, + + /** + * @private + * @return {{left: number, right: number}} + */ + _windowForGesture: function() + { + var windowLeft = this._timeWindowLeft ? this._timeWindowLeft : this._dataProvider.minimumBoundary(); + var windowRight = this._timeWindowRight !== Infinity ? this._timeWindowRight : this._dataProvider.minimumBoundary() + this._dataProvider.totalTime(); + return {left: windowLeft, right: windowRight}; + }, + + /** + * @param {{left: number, right: number}} bounds + * @private + */ + _requestWindowTimes: function(bounds) + { + bounds.left = Number.constrain(bounds.left, this._minimumBoundary, this._totalTime + this._minimumBoundary); + bounds.right = Number.constrain(bounds.right, this._minimumBoundary, this._totalTime + this._minimumBoundary); + if (bounds.right - bounds.left < WebInspector.FlameChart.MinimalTimeWindowMs) + return; + this._flameChartDelegate.requestWindowTimes(bounds.left, bounds.right); + }, + + /** + * @param {number} startTime + * @param {number} endTime + * @private + */ + _animateWindowTimes: function(startTime, endTime) + { + this._timeWindowLeft = startTime; + this._timeWindowRight = endTime; + this._updateHighlight(); + this.update(); + }, + + /** + * @private + */ + _animationCompleted: function() + { + delete this._cancelWindowTimesAnimation; + this._updateHighlight(); + }, + + /** + * @private + */ + _cancelAnimation: function() + { + if (this._cancelWindowTimesAnimation) { + this._timeWindowLeft = this._pendingAnimationTimeLeft; + this._timeWindowRight = this._pendingAnimationTimeRight; + this._cancelWindowTimesAnimation(); + delete this._cancelWindowTimesAnimation; + } + }, + + scheduleUpdate: function() + { + if (this._updateTimerId || this._cancelWindowTimesAnimation) + return; + this._updateTimerId = this.element.window().requestAnimationFrame(() => { + this._updateTimerId = 0; + this.update(); + }); + }, + + update: function() {}, + + /** + * @param {number} startTime + * @param {number} endTime + */ + setWindowTimes: function(startTime, endTime) + { + if (this._muteAnimation || this._timeWindowLeft === 0 || this._timeWindowRight === Infinity || (startTime === 0 && endTime === Infinity) || (startTime === Infinity && endTime === Infinity)) { + // Initial setup. + this._timeWindowLeft = startTime; + this._timeWindowRight = endTime; + this.scheduleUpdate(); + return; + } + this._cancelAnimation(); + this._cancelWindowTimesAnimation = WebInspector.animateFunction(this.element.window(), this._animateWindowTimes.bind(this), + [{from: this._timeWindowLeft, to: startTime}, {from: this._timeWindowRight, to: endTime}], 5, + this._animationCompleted.bind(this)); + this._pendingAnimationTimeLeft = startTime; + this._pendingAnimationTimeRight = endTime; + }, + + __proto__: WebInspector.VBox.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 378bc4e..3443605 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
@@ -49,14 +49,14 @@ /** * @constructor - * @extends {WebInspector.HBox} + * @extends {WebInspector.ChartViewport} * @param {!WebInspector.FlameChartDataProvider} dataProvider * @param {!WebInspector.FlameChartDelegate} flameChartDelegate * @param {!WebInspector.Setting=} groupExpansionSetting */ WebInspector.FlameChart = function(dataProvider, flameChartDelegate, groupExpansionSetting) { - WebInspector.HBox.call(this, true); + WebInspector.ChartViewport.call(this); this.registerRequiredCSS("ui_lazy/flameChart.css"); this.contentElement.classList.add("flame-chart-main-pane"); this._flameChartDelegate = flameChartDelegate; @@ -71,23 +71,13 @@ this.setDefaultFocusedElement(this._canvas); this._canvas.addEventListener("mousemove", this._onMouseMove.bind(this), false); this._canvas.addEventListener("mouseout", this._onMouseOut.bind(this), false); - this._canvas.addEventListener("mousewheel", this._onMouseWheel.bind(this), false); this._canvas.addEventListener("click", this._onClick.bind(this), false); this._canvas.addEventListener("keydown", this._onKeyDown.bind(this), false); - WebInspector.installInertialDragHandle(this._canvas, this._startCanvasDragging.bind(this), this._canvasDragging.bind(this), this._endCanvasDragging.bind(this), "-webkit-grabbing", null); - WebInspector.installDragHandle(this._canvas, this._startRangeSelection.bind(this), this._rangeSelectionDragging.bind(this), this._endRangeSelection.bind(this), "text", null); - - this._vScrollElement = this.contentElement.createChild("div", "flame-chart-v-scroll"); - this._vScrollContent = this._vScrollElement.createChild("div"); - this._vScrollElement.addEventListener("scroll", this._onScroll.bind(this), false); - this._scrollTop = 0; this._entryInfo = this.contentElement.createChild("div", "flame-chart-entry-info"); this._markerHighlighElement = this.contentElement.createChild("div", "flame-chart-marker-highlight-element"); this._highlightElement = this.contentElement.createChild("div", "flame-chart-highlight-element"); this._selectedElement = this.contentElement.createChild("div", "flame-chart-selected-element"); - this._selectionOverlay = this.contentElement.createChild("div", "flame-chart-selection-overlay hidden"); - this._selectedTimeSpanLabel = this._selectionOverlay.createChild("div", "time-span"); this._windowLeft = 0.0; this._windowRight = 1.0; @@ -502,15 +492,6 @@ }, /** - * @override - * @return {!Array.<!Element>} - */ - elementsToRestoreScrollPositionsFor: function() - { - return [this._vScrollElement]; - }, - - /** * @param {number} entryIndex */ highlightEntry: function(entryIndex) @@ -543,22 +524,14 @@ */ _timelineData: function() { + if (!this._dataProvider) + return null; var timelineData = this._dataProvider.timelineData(); if (timelineData !== this._rawTimelineData || timelineData.entryStartTimes.length !== this._rawTimelineDataLength) this._processTimelineData(timelineData); return this._rawTimelineData; }, - _cancelAnimation: function() - { - if (this._cancelWindowTimesAnimation) { - this._timeWindowLeft = this._pendingAnimationTimeLeft; - this._timeWindowRight = this._pendingAnimationTimeRight; - this._cancelWindowTimesAnimation(); - delete this._cancelWindowTimesAnimation; - } - }, - /** * @param {number} entryIndex */ @@ -576,10 +549,7 @@ var minEntryTimeWindow = Math.min(entryTotalTime, timeRight - timeLeft); var y = this._levelToHeight(timelineData.entryLevels[entryIndex]); - if (this._vScrollElement.scrollTop > y) - this._vScrollElement.scrollTop = y; - else if (this._vScrollElement.scrollTop < y - this._offsetHeight + this._barHeight) - this._vScrollElement.scrollTop = y - this._offsetHeight + this._barHeight; + this.setScrollOffset(y, this._barHeight); if (timeLeft > entryEndTime) { var delta = timeLeft - entryEndTime + minEntryTimeWindow; @@ -591,179 +561,14 @@ }, /** + * @override * @param {number} startTime * @param {number} endTime */ setWindowTimes: function(startTime, endTime) { - if (this._muteAnimation || this._timeWindowLeft === 0 || this._timeWindowRight === Infinity || (startTime === 0 && endTime === Infinity) || (startTime === Infinity && endTime === Infinity)) { - // Initial setup. - this._timeWindowLeft = startTime; - this._timeWindowRight = endTime; - this.scheduleUpdate(); - return; - } - - this._cancelAnimation(); + WebInspector.FlameChart.prototype.__proto__.setWindowTimes.call(this, startTime, endTime); this._updateHighlight(); - this._cancelWindowTimesAnimation = WebInspector.animateFunction(this.element.window(), this._animateWindowTimes.bind(this), - [{from: this._timeWindowLeft, to: startTime}, {from: this._timeWindowRight, to: endTime}], 5, - this._animationCompleted.bind(this)); - this._pendingAnimationTimeLeft = startTime; - this._pendingAnimationTimeRight = endTime; - }, - - /** - * @param {number} startTime - * @param {number} endTime - */ - _animateWindowTimes: function(startTime, endTime) - { - this._timeWindowLeft = startTime; - this._timeWindowRight = endTime; - this._updateHighlight(); - this.update(); - }, - - _animationCompleted: function() - { - delete this._cancelWindowTimesAnimation; - this._updateHighlight(); - }, - - /** - * @param {!MouseEvent} event - */ - _initMaxDragOffset: function(event) - { - this._maxDragOffsetSquared = 0; - this._dragStartX = event.pageX; - this._dragStartY = event.pageY; - }, - - /** - * @param {number} x - * @param {number} y - */ - _updateMaxDragOffset: function(x, y) - { - var dx = x - this._dragStartX; - var dy = y - this._dragStartY; - var dragOffsetSquared = dx * dx + dy * dy; - this._maxDragOffsetSquared = Math.max(this._maxDragOffsetSquared, dragOffsetSquared); - }, - - /** - * @return {number} - */ - _maxDragOffset: function() - { - return Math.sqrt(this._maxDragOffsetSquared); - }, - - /** - * @param {number} x - * @param {number} y - * @param {!MouseEvent} event - * @return {boolean} - */ - _startCanvasDragging: function(x, y, event) - { - if (event.shiftKey) - return false; - if (!this._timelineData() || this._timeWindowRight === Infinity) - return false; - this._isDragging = true; - this._initMaxDragOffset(event); - this._dragStartPointX = x; - this._dragStartPointY = y; - this._dragStartScrollTop = this._vScrollElement.scrollTop; - this._canvas.style.cursor = ""; - this.hideHighlight(); - return true; - }, - - /** - * @param {number} x - * @param {number} y - */ - _canvasDragging: function(x, y) - { - var pixelShift = this._dragStartPointX - x; - this._dragStartPointX = x; - this._muteAnimation = true; - this._handlePanGesture(pixelShift * this._pixelToTime); - this._muteAnimation = false; - - var pixelScroll = this._dragStartPointY - y; - this._vScrollElement.scrollTop = this._dragStartScrollTop + pixelScroll; - this._updateMaxDragOffset(x, y); - }, - - _endCanvasDragging: function() - { - this._isDragging = false; - this._updateHighlight(); - }, - - /** - * @param {!MouseEvent} event - * @return {boolean} - */ - _startRangeSelection: function(event) - { - if (!event.shiftKey) - return false; - this._isDragging = true; - this._initMaxDragOffset(event); - this._selectionOffsetShiftX = event.offsetX - event.pageX; - this._selectionOffsetShiftY = event.offsetY - event.pageY; - this._selectionStartX = event.offsetX; - var style = this._selectionOverlay.style; - style.left = this._selectionStartX + "px"; - style.width = "1px"; - this._selectedTimeSpanLabel.textContent = ""; - this._selectionOverlay.classList.remove("hidden"); - this.hideHighlight(); - return true; - }, - - _endRangeSelection: function() - { - this._isDragging = false; - this._updateHighlight(); - }, - - _hideRangeSelection: function() - { - this._selectionOverlay.classList.add("hidden"); - }, - - /** - * @param {!MouseEvent} event - */ - _rangeSelectionDragging: function(event) - { - this._updateMaxDragOffset(event.pageX, event.pageY); - var x = Number.constrain(event.pageX + this._selectionOffsetShiftX, 0, this._offsetWidth); - var start = this._cursorTime(this._selectionStartX); - var end = this._cursorTime(x); - this._rangeSelectionStart = Math.min(start, end); - this._rangeSelectionEnd = Math.max(start, end); - this._updateRangeSelectionOverlay(); - this._flameChartDelegate.updateRangeSelection(this._rangeSelectionStart, this._rangeSelectionEnd); - }, - - _updateRangeSelectionOverlay: function() - { - var /** @const */ margin = 100; - var left = Number.constrain(this._timeToPosition(this._rangeSelectionStart), -margin, this._offsetWidth + margin); - var right = Number.constrain(this._timeToPosition(this._rangeSelectionEnd), -margin, this._offsetWidth + margin); - var style = this._selectionOverlay.style; - style.left = left + "px"; - style.width = (right - left) + "px"; - var timeSpan = this._rangeSelectionEnd - this._rangeSelectionStart; - this._selectedTimeSpanLabel.textContent = Number.preciseMillisToString(timeSpan, 2); }, /** @@ -775,7 +580,7 @@ this._lastMouseOffsetY = event.offsetY; if (!this._enabled()) return; - if (this._isDragging) + if (this.isDragging()) return; if (this._coordinatesToGroupIndex(event.offsetX, event.offsetY) >= 0) { this.hideHighlight(); @@ -849,6 +654,9 @@ this._entryInfo.style.top = y + "px"; }, + /** + * @param {!Event} event + */ _onClick: function(event) { this.focus(); @@ -856,14 +664,14 @@ // So if there was drag (mouse move) in the middle of that events // we skip the click. Otherwise we jump to the sources. const clickThreshold = 5; - if (this._maxDragOffset() > clickThreshold) + if (this.maxDragOffset() > clickThreshold) return; var groupIndex = this._coordinatesToGroupIndex(event.offsetX, event.offsetY); if (groupIndex >= 0) { this._toggleGroupVisibility(groupIndex); return; } - this._hideRangeSelection(); + this.hideRangeSelection(); this.dispatchEventToListeners(WebInspector.FlameChart.Events.EntrySelected, this._highlightedEntryIndex); }, @@ -898,35 +706,8 @@ /** * @param {!Event} e */ - _onMouseWheel: function(e) - { - if (!this._enabled()) - return; - // Pan vertically when shift down only. - var panVertically = e.shiftKey && (e.wheelDeltaY || Math.abs(e.wheelDeltaX) === 120); - var panHorizontally = Math.abs(e.wheelDeltaX) > Math.abs(e.wheelDeltaY) && !e.shiftKey; - if (panVertically) { - this._vScrollElement.scrollTop -= (e.wheelDeltaY || e.wheelDeltaX) / 120 * this._offsetHeight / 8; - } else if (panHorizontally) { - var shift = -e.wheelDeltaX * this._pixelToTime; - this._muteAnimation = true; - this._handlePanGesture(shift); - this._muteAnimation = false; - } else { // Zoom. - const mouseWheelZoomSpeed = 1 / 120; - this._handleZoomGesture(Math.pow(1.2, -(e.wheelDeltaY || e.wheelDeltaX) * mouseWheelZoomSpeed) - 1); - } - - // Block swipe gesture. - e.consume(true); - }, - - /** - * @param {!Event} e - */ _onKeyDown: function(e) { - this._handleZoomPanKeys(e); this._handleSelectionNavigation(e); }, @@ -997,78 +778,6 @@ }, /** - * @param {!Event} e - */ - _handleZoomPanKeys: function(e) - { - if (!WebInspector.KeyboardShortcut.hasNoModifiers(e)) - return; - var zoomMultiplier = e.shiftKey ? 0.8 : 0.3; - var panMultiplier = e.shiftKey ? 320 : 80; - if (e.keyCode === "A".charCodeAt(0)) { - this._handlePanGesture(-panMultiplier * this._pixelToTime); - e.consume(true); - } else if (e.keyCode === "D".charCodeAt(0)) { - this._handlePanGesture(panMultiplier * this._pixelToTime); - e.consume(true); - } else if (e.keyCode === "W".charCodeAt(0)) { - this._handleZoomGesture(-zoomMultiplier); - e.consume(true); - } else if (e.keyCode === "S".charCodeAt(0)) { - this._handleZoomGesture(zoomMultiplier); - e.consume(true); - } - }, - - /** - * @param {number} zoom - */ - _handleZoomGesture: function(zoom) - { - this._cancelAnimation(); - var bounds = this._windowForGesture(); - var cursorTime = this._cursorTime(this._lastMouseOffsetX); - bounds.left += (bounds.left - cursorTime) * zoom; - bounds.right += (bounds.right - cursorTime) * zoom; - this._requestWindowTimes(bounds); - }, - - /** - * @param {number} shift - */ - _handlePanGesture: function(shift) - { - this._cancelAnimation(); - var bounds = this._windowForGesture(); - shift = Number.constrain(shift, this._minimumBoundary - bounds.left, this._totalTime + this._minimumBoundary - bounds.right); - bounds.left += shift; - bounds.right += shift; - this._requestWindowTimes(bounds); - }, - - /** - * @return {{left: number, right: number}} - */ - _windowForGesture: function() - { - var windowLeft = this._timeWindowLeft ? this._timeWindowLeft : this._dataProvider.minimumBoundary(); - var windowRight = this._timeWindowRight !== Infinity ? this._timeWindowRight : this._dataProvider.minimumBoundary() + this._dataProvider.totalTime(); - return {left: windowLeft, right: windowRight}; - }, - - /** - * @param {{left: number, right: number}} bounds - */ - _requestWindowTimes: function(bounds) - { - bounds.left = Number.constrain(bounds.left, this._minimumBoundary, this._totalTime + this._minimumBoundary); - bounds.right = Number.constrain(bounds.right, this._minimumBoundary, this._totalTime + this._minimumBoundary); - if (bounds.right - bounds.left < WebInspector.FlameChart.MinimalTimeWindowMs) - return; - this._flameChartDelegate.requestWindowTimes(bounds.left, bounds.right); - }, - - /** * @param {number} x * @return {number} */ @@ -1086,7 +795,7 @@ { if (x < 0 || y < 0) return -1; - y += this._scrollTop; + y += this.scrollOffset(); var timelineData = this._timelineData(); if (!timelineData) return -1; @@ -1153,7 +862,7 @@ { if (x < 0 || y < 0) return -1; - y += this._scrollTop; + y += this.scrollOffset(); var groups = this._rawTimelineData.groups || []; var group = this._groupOffsets.upperBound(y) - 1; @@ -1203,16 +912,7 @@ */ _markerIndexBeforeTime: function(time) { - /** - * @param {number} markerTimestamp - * @param {!WebInspector.FlameChartMarker} marker - * @return {number} - */ - function comparator(markerTimestamp, marker) - { - return markerTimestamp - marker.startTime(); - } - return this._timelineData().markers.lowerBound(time, comparator); + return this._timelineData().markers.lowerBound(time, (markerTimestamp, marker) => markerTimestamp - marker.startTime()); }, /** @@ -1228,8 +928,9 @@ var context = this._canvas.getContext("2d"); context.save(); var ratio = window.devicePixelRatio; + var top = this.scrollOffset(); context.scale(ratio, ratio); - context.translate(0, -this._scrollTop); + context.translate(0, -top); context.font = "11px " + WebInspector.fontFamily(); var timeWindowRight = this._timeWindowRight; @@ -1243,7 +944,6 @@ var textPadding = this._dataProvider.textPadding(); var minTextWidth = 2 * textPadding + this._measureWidth(context, "\u2026"); var barHeight = this._barHeight; - var top = this._scrollTop; var minVisibleBarLevel = Math.max(this._visibleLevelOffsets.upperBound(top) - 1, 0); /** @type {!Map<string, !Array<number>>} */ @@ -1360,7 +1060,6 @@ this._updateElementPosition(this._highlightElement, this._highlightedEntryIndex); this._updateElementPosition(this._selectedElement, this._selectedEntryIndex); this._updateMarkerHighlight(); - this._updateRangeSelectionOverlay(); }, /** @@ -1370,7 +1069,7 @@ _drawGroupHeaders: function(width, height) { var context = this._canvas.getContext("2d"); - var top = this._scrollTop; + var top = this.scrollOffset(); var ratio = window.devicePixelRatio; var barHeight = this._barHeight; var textBaseHeight = barHeight - this._dataProvider.textBaseline(); @@ -1772,8 +1471,8 @@ */ setSelectedEntry: function(entryIndex) { - if (entryIndex === -1 && !this._isDragging) - this._hideRangeSelection(); + if (entryIndex === -1 && !this.isDragging()) + this.hideRangeSelection(); if (this._selectedEntryIndex === entryIndex) return; this._selectedEntryIndex = entryIndex; @@ -1804,7 +1503,7 @@ var barCenter = barX + barWidth / 2; barWidth = Math.max(barWidth, elementMinWidth); barX = barCenter - barWidth / 2; - var barY = this._levelToHeight(timelineData.entryLevels[entryIndex]) - this._scrollTop; + var barY = this._levelToHeight(timelineData.entryLevels[entryIndex]) - this.scrollOffset(); var style = element.style; style.left = barX + "px"; style.top = barY + "px"; @@ -1924,61 +1623,28 @@ this._timeToPixel = totalPixels / this._totalTime; this._pixelToTime = this._totalTime / totalPixels; - - this._updateScrollBar(); }, _updateHeight: function() { - this._totalHeight = this._levelToHeight(this._dataProvider.maxStackDepth()); - this._vScrollContent.style.height = this._totalHeight + "px"; - if (this._scrollTop + this._offsetHeight > this._totalHeight) { - this._scrollTop = Math.max(0, this._totalHeight - this._offsetHeight); - this._vScrollElement.scrollTop = this._scrollTop; - } + var height = this._levelToHeight(this._dataProvider.maxStackDepth()); + this.setContentHeight(height); }, + /** + * @override + */ onResize: function() { - this._updateScrollBar(); - this._updateContentElementSize(); + WebInspector.FlameChart.prototype.__proto__.onResize.call(this); this.scheduleUpdate(); }, - _updateScrollBar: function() - { - var showScroll = this._totalHeight > this._offsetHeight; - if (this._vScrollElement.classList.contains("hidden") === showScroll) { - this._vScrollElement.classList.toggle("hidden", !showScroll); - this._updateContentElementSize(); - } - }, - - _updateContentElementSize: function() - { - var offsetWidth = this._vScrollElement.offsetLeft; - if (!offsetWidth) - offsetWidth = this.contentElement.offsetWidth; - this._offsetWidth = offsetWidth; - this._offsetHeight = this.contentElement.offsetHeight; - }, - - _onScroll: function() - { - this._scrollTop = this._vScrollElement.scrollTop; - this.scheduleUpdate(); - }, - - scheduleUpdate: function() - { - if (this._updateTimerId || this._cancelWindowTimesAnimation) - return; - this._updateTimerId = this.element.window().requestAnimationFrame(this.update.bind(this)); - }, - + /** + * @override + */ update: function() { - this._updateTimerId = 0; if (!this._timelineData()) return; this._resetCanvas(); @@ -1986,19 +1652,16 @@ this._updateBoundaries(); this._calculator._updateBoundaries(this); this._draw(this._offsetWidth, this._offsetHeight); - if (!this._isDragging) + if (!this.isDragging()) this._updateHighlight(); }, reset: function() { - this._vScrollElement.scrollTop = 0; - this._scrollTop = 0; + WebInspector.FlameChart.prototype.__proto__.reset.call(this); this._highlightedMarkerIndex = -1; this._highlightedEntryIndex = -1; this._selectedEntryIndex = -1; - this._rangeSelectionStart = 0; - this._rangeSelectionEnd = 0; /** @type {!Map<string,!Map<string,number>>} */ this._textWidth = new Map(); this.update(); @@ -2009,5 +1672,5 @@ return this._rawTimelineDataLength !== 0; }, - __proto__: WebInspector.HBox.prototype + __proto__: WebInspector.ChartViewport.prototype }
diff --git a/third_party/WebKit/Source/devtools/front_end/ui_lazy/module.json b/third_party/WebKit/Source/devtools/front_end/ui_lazy/module.json index 037a124..a2c72f0a 100644 --- a/third_party/WebKit/Source/devtools/front_end/ui_lazy/module.json +++ b/third_party/WebKit/Source/devtools/front_end/ui_lazy/module.json
@@ -24,6 +24,7 @@ "diff" ], "scripts": [ + "ChartViewport.js", "DataGrid.js", "ViewportDataGrid.js", "SortableDataGrid.js",
diff --git a/third_party/WebKit/Source/devtools/package.json b/third_party/WebKit/Source/devtools/package.json index 59cd180b..1383f86 100644 --- a/third_party/WebKit/Source/devtools/package.json +++ b/third_party/WebKit/Source/devtools/package.json
@@ -24,5 +24,8 @@ "bugs": { "url": "https://bugs.chromium.org/p/chromium/issues/list?can=2&q=component:Platform%3EDevTools%20&sort=-opened&colspec=ID%20Stars%20Owner%20Summary%20Modified%20Opened" }, - "homepage": "https://devtools.chrome.com" + "homepage": "https://devtools.chrome.com", + "devDependencies": { + "eslint": "3.5.0" + } }
diff --git a/third_party/WebKit/Source/devtools/scripts/install_node_deps.py b/third_party/WebKit/Source/devtools/scripts/install_node_deps.py new file mode 100755 index 0000000..eacd18d --- /dev/null +++ b/third_party/WebKit/Source/devtools/scripts/install_node_deps.py
@@ -0,0 +1,106 @@ +#!/usr/bin/env python +# +# 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. + +""" +Ensure node.js and npm modules are installed +""" + +import os +from os import path +import shutil +import subprocess +import sys + +MIN_NODE_VERSION = 4 +LOCAL_NODE_VERSION = '4.5.0' + +scripts_path = path.dirname(path.abspath(__file__)) +install_local_node_path = path.join(scripts_path, 'local_node', 'node.py') +local_node_runtimes_path = path.join(scripts_path, 'local_node', 'runtimes') +local_node_binary_path = path.join(local_node_runtimes_path, LOCAL_NODE_VERSION, 'bin', 'node') +local_npm_binary_path = path.join(local_node_runtimes_path, LOCAL_NODE_VERSION, 'bin', 'npm') + + +def main(): + (node_path, npm_path) = resolve_node_paths() + npm_install(npm_path) + + +def resolve_node_paths(): + if has_valid_global_node(): + return (which('node'), which('npm')) + has_installed_local_node = path.isfile(local_node_binary_path) + if has_installed_local_node: + return (local_node_binary_path, local_npm_binary_path) + if path.isdir(local_node_runtimes_path): + shutil.rmtree(local_node_runtimes_path) + if sys.platform == 'linux2': + install_node() + return (local_node_binary_path, local_npm_binary_path) + print('ERROR: Please install the latest node.js LTS version using the Mac or Windows installer:') + print('https://nodejs.org/en/download/') + raise + + +def has_valid_global_node(): + node_path = which('node') + if not node_path: + return False + node_process = popen([node_path, '--version']) + (node_process_out, _) = node_process.communicate() + if node_process.returncode != 0: + return False + major_version = node_process_out[1] + return int(major_version) >= MIN_NODE_VERSION + + +def install_node(): + print('Installing node.js locally at {}'.format(local_node_runtimes_path)) + print('NOTE: this does not add to PATH or affect global node installation') + node_env = {'NODE_VERSION': LOCAL_NODE_VERSION} + install_node_process = popen([install_local_node_path, '--version'], env=node_env) + (node_process_out, error) = install_node_process.communicate() + if install_node_process.returncode != 0: + print('Could not install node locally') + print(error) + raise + print(node_process_out) + + +def npm_install(npm_path): + print('Runing npm install using {}'.format(npm_path)) + npm_process = popen([npm_path, 'install']) + (npm_process_out, _) = npm_process.communicate() + if npm_process.returncode != 0: + print('WARNING: npm install had an issue') + print(npm_process_out) + + +# Based on http://stackoverflow.com/questions/377017/test-if-executable-exists-in-python. +def which(program): + def is_exe(fpath): + return path.isfile(fpath) and os.access(fpath, os.X_OK) + + fpath, fname = path.split(program) + if fpath: + if is_exe(program): + return program + else: + for part in os.environ['PATH'].split(os.pathsep): + part = part.strip('\"') + exe_file = path.join(part, program) + if is_exe(exe_file): + return exe_file + return None + + +def popen(arguments, env=None): + return subprocess.Popen( + arguments, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, env=env) + + +if __name__ == '__main__': + sys.exit(main())
diff --git a/third_party/WebKit/Source/devtools/scripts/lint_javascript.py b/third_party/WebKit/Source/devtools/scripts/lint_javascript.py index 9b8e77eb..70a9c89 100755 --- a/third_party/WebKit/Source/devtools/scripts/lint_javascript.py +++ b/third_party/WebKit/Source/devtools/scripts/lint_javascript.py
@@ -4,12 +4,13 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. -import os import os.path as path import re import subprocess import sys +import install_node_deps + files_to_lint = None if len(sys.argv) >= 2: @@ -48,37 +49,16 @@ scripts_path = path.dirname(path.abspath(__file__)) devtools_path = path.dirname(scripts_path) devtools_frontend_path = path.join(devtools_path, "front_end") - - -# Based on http://stackoverflow.com/questions/377017/test-if-executable-exists-in-python. -def which(program): - def is_exe(fpath): - return path.isfile(fpath) and os.access(fpath, os.X_OK) - - fpath, fname = path.split(program) - if fpath: - if is_exe(program): - return program - else: - for part in os.environ["PATH"].split(os.pathsep): - part = part.strip("\"") - exe_file = path.join(part, program) - if is_exe(exe_file): - return exe_file - return None - +eslint_path = path.join(devtools_path, "node_modules", ".bin", "eslint") print("Linting JavaScript with eslint...\n") def js_lint(files_list=None): eslint_errors_found = False - - eslint_path = which("eslint") - if not eslint_path: - print("!! NOTE: Skipping JavaScript linting because eslint is not installed.") - print("!! npm install -g eslint") - eslint_errors_found = False # Linting is opt-in for now, so this is a soft failure + if not path.isfile(eslint_path): + print("Failed to run eslint, run ./scripts/install_node_deps.py to install eslint") + eslint_errors_found = True return eslint_errors_found if files_list is None: @@ -87,7 +67,9 @@ eslintconfig_path = path.join(devtools_path, "front_end/.eslintrc.js") eslintignore_path = path.join(devtools_path, "front_end/.eslintignore") + (node_path, _) = install_node_deps.resolve_node_paths() exec_command = [ + node_path, eslint_path, "--config", to_platform_path_exact(eslintconfig_path), "--ignore-path", to_platform_path_exact(eslintignore_path), @@ -109,5 +91,3 @@ if errors_found: print("ERRORS DETECTED") sys.exit(1) -else: - print("OK")
diff --git a/third_party/WebKit/Source/devtools/scripts/local_node/__init__.py b/third_party/WebKit/Source/devtools/scripts/local_node/__init__.py new file mode 100644 index 0000000..05cc409 --- /dev/null +++ b/third_party/WebKit/Source/devtools/scripts/local_node/__init__.py
@@ -0,0 +1,3 @@ +# 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. \ No newline at end of file
diff --git a/third_party/WebKit/Source/devtools/scripts/buildbot/node.py b/third_party/WebKit/Source/devtools/scripts/local_node/node.py similarity index 98% rename from third_party/WebKit/Source/devtools/scripts/buildbot/node.py rename to third_party/WebKit/Source/devtools/scripts/local_node/node.py index 55c0156..09fd0f2 100755 --- a/third_party/WebKit/Source/devtools/scripts/buildbot/node.py +++ b/third_party/WebKit/Source/devtools/scripts/local_node/node.py
@@ -39,7 +39,7 @@ if sys.platform == 'win32': target = 'node.exe' elif sys.platform == 'darwin': - target = 'node-v%s-darwin-x86.tar.gz' % version + target = 'node-v%s-darwin-x64.tar.gz' % version elif sys.platform == 'linux2': target = 'node-v%s-linux-x86.tar.gz' % version else:
diff --git a/third_party/WebKit/Source/devtools/scripts/buildbot/npm.py b/third_party/WebKit/Source/devtools/scripts/local_node/npm.py similarity index 100% rename from third_party/WebKit/Source/devtools/scripts/buildbot/npm.py rename to third_party/WebKit/Source/devtools/scripts/local_node/npm.py
diff --git a/third_party/WebKit/Source/modules/BUILD.gn b/third_party/WebKit/Source/modules/BUILD.gn index 69e35c5..f2b5699 100644 --- a/third_party/WebKit/Source/modules/BUILD.gn +++ b/third_party/WebKit/Source/modules/BUILD.gn
@@ -273,6 +273,7 @@ "serviceworkers/ServiceWorkerContainerTest.cpp", "webaudio/AudioBasicProcessorHandlerTest.cpp", "webaudio/AudioWorkletThreadTest.cpp", + "webaudio/BaseAudioContextTest.cpp", "webaudio/ConvolverNodeTest.cpp", "webaudio/DynamicsCompressorNodeTest.cpp", "webaudio/ScriptProcessorNodeTest.cpp",
diff --git a/third_party/WebKit/Source/modules/EventTargetModulesFactory.in b/third_party/WebKit/Source/modules/EventTargetModulesFactory.in index 5ba198df..d458d97 100644 --- a/third_party/WebKit/Source/modules/EventTargetModulesFactory.in +++ b/third_party/WebKit/Source/modules/EventTargetModulesFactory.in
@@ -32,7 +32,6 @@ modules/presentation/PresentationConnectionList modules/presentation/PresentationRequest modules/remoteplayback/RemotePlayback -modules/remoteplayback/RemotePlaybackAvailability modules/screen_orientation/ScreenOrientation modules/sensor/Sensor modules/serviceworkers/ServiceWorker
diff --git a/third_party/WebKit/Source/modules/modules_idl_files.gni b/third_party/WebKit/Source/modules/modules_idl_files.gni index 4d12e73..a6e8caa 100644 --- a/third_party/WebKit/Source/modules/modules_idl_files.gni +++ b/third_party/WebKit/Source/modules/modules_idl_files.gni
@@ -219,7 +219,6 @@ "quota/StorageQuotaCallback.idl", "quota/StorageUsageCallback.idl", "remoteplayback/RemotePlayback.idl", - "remoteplayback/RemotePlaybackAvailability.idl", "screen_orientation/ScreenOrientation.idl", "sensor/AmbientLightSensor.idl", "sensor/AmbientLightSensorReading.idl",
diff --git a/third_party/WebKit/Source/modules/notifications/Notification.cpp b/third_party/WebKit/Source/modules/notifications/Notification.cpp index af9ad5b..eea467b 100644 --- a/third_party/WebKit/Source/modules/notifications/Notification.cpp +++ b/third_party/WebKit/Source/modules/notifications/Notification.cpp
@@ -137,7 +137,8 @@ ActiveDOMObject(context), m_type(type), m_state(State::Loading), - m_data(data) { + m_data(data), + m_requestedClose(false) { DCHECK(notificationManager()); } @@ -156,7 +157,7 @@ DCHECK_EQ(m_state, State::Loading); if (NotificationManager::from(getExecutionContext())->permissionStatus() != mojom::blink::PermissionStatus::GRANTED) { - dispatchErrorEvent(); + dispatchEvent(Event::create(EventTypeNames::error)); return; } @@ -179,48 +180,55 @@ } void Notification::close() { - if (m_state != State::Showing) + if (m_state != State::Showing) { + // TODO(peter): Abort the load instead of closing the notification after + // it's completed. + if (m_state == State::Loading || m_notificationId.isEmpty()) + m_requestedClose = true; + return; + } // Schedule the "close" event to be fired for non-persistent notifications. // Persistent notifications won't get such events for programmatic closes. if (m_type == Type::NonPersistent) { getExecutionContext()->postTask( - BLINK_FROM_HERE, createSameThreadTask(&Notification::dispatchCloseEvent, - wrapPersistent(this))); + BLINK_FROM_HERE, + createSameThreadTask(&Notification::didCloseNotification, + wrapPersistent(this))); m_state = State::Closing; - - notificationManager()->close(this); - return; + } else { + m_state = State::Closed; } - m_state = State::Closed; - SecurityOrigin* origin = getExecutionContext()->getSecurityOrigin(); DCHECK(origin); - notificationManager()->closePersistent(WebSecurityOrigin(origin), m_data.tag, - m_notificationId); + notificationManager()->close(WebSecurityOrigin(origin), m_data.tag, + m_notificationId); } -void Notification::dispatchShowEvent() { +void Notification::didShowNotification(const WebString& notificationId) { + DCHECK(m_notificationId.isEmpty()); + m_notificationId = notificationId; + dispatchEvent(Event::create(EventTypeNames::show)); + + if (m_requestedClose) + close(); } -void Notification::dispatchClickEvent() { +void Notification::didClickNotification() { UserGestureIndicator gestureIndicator( UserGestureToken::create(UserGestureToken::NewGesture)); + ScopedWindowFocusAllowedIndicator windowFocusAllowed(getExecutionContext()); dispatchEvent(Event::create(EventTypeNames::click)); } -void Notification::dispatchErrorEvent() { - dispatchEvent(Event::create(EventTypeNames::error)); -} - -void Notification::dispatchCloseEvent() { - // The notification should be Showing if the user initiated the close, or it - // should be Closing if the developer initiated the close. +void Notification::didCloseNotification() { + // The notification will be showing when the user initiated the close, or it + // will be closing if the developer initiated the close. if (m_state != State::Showing && m_state != State::Closing) return;
diff --git a/third_party/WebKit/Source/modules/notifications/Notification.h b/third_party/WebKit/Source/modules/notifications/Notification.h index ef5b78d..0d1b8eb 100644 --- a/third_party/WebKit/Source/modules/notifications/Notification.h +++ b/third_party/WebKit/Source/modules/notifications/Notification.h
@@ -90,10 +90,9 @@ DEFINE_ATTRIBUTE_EVENT_LISTENER(close); // WebNotificationDelegate interface. - void dispatchShowEvent() override; - void dispatchClickEvent() override; - void dispatchErrorEvent() override; - void dispatchCloseEvent() override; + void didShowNotification(const WebString& notificationId) override; + void didClickNotification() override; + void didCloseNotification() override; String title() const; String dir() const; @@ -175,6 +174,10 @@ String m_notificationId; + // Whether the developer has requested the notification to be closed whilst + // it's still in process of being shown. + bool m_requestedClose; + Member<AsyncMethodRunner<Notification>> m_prepareShowMethodRunner; Member<NotificationResourcesLoader> m_loader;
diff --git a/third_party/WebKit/Source/modules/payments/PaymentCurrencyAmount.idl b/third_party/WebKit/Source/modules/payments/PaymentCurrencyAmount.idl index b022c715..4768e4c 100644 --- a/third_party/WebKit/Source/modules/payments/PaymentCurrencyAmount.idl +++ b/third_party/WebKit/Source/modules/payments/PaymentCurrencyAmount.idl
@@ -9,4 +9,5 @@ ] dictionary PaymentCurrencyAmount { required DOMString currency; required DOMString value; + DOMString currencySystem = "urn:iso:std:iso:4217"; };
diff --git a/third_party/WebKit/Source/modules/payments/PaymentRequest.cpp b/third_party/WebKit/Source/modules/payments/PaymentRequest.cpp index ec17e259..7e33a29 100644 --- a/third_party/WebKit/Source/modules/payments/PaymentRequest.cpp +++ b/third_party/WebKit/Source/modules/payments/PaymentRequest.cpp
@@ -201,8 +201,9 @@ } String errorMessage; - if (!PaymentsValidators::isValidCurrencyCodeFormat(item.amount().currency(), - &errorMessage)) { + if (!PaymentsValidators::isValidCurrencyCodeFormat( + item.amount().currency(), item.amount().currencySystem(), + &errorMessage)) { exceptionState.throwTypeError(errorMessage); return; }
diff --git a/third_party/WebKit/Source/modules/payments/PaymentRequestDetailsTest.cpp b/third_party/WebKit/Source/modules/payments/PaymentRequestDetailsTest.cpp index 626cfa37..988948e 100644 --- a/third_party/WebKit/Source/modules/payments/PaymentRequestDetailsTest.cpp +++ b/third_party/WebKit/Source/modules/payments/PaymentRequestDetailsTest.cpp
@@ -98,6 +98,9 @@ case PaymentTestDataCurrencyCode: out << "currency "; break; + case PaymentTestDataCurrencySystem: + out << "currencySystem "; + break; case PaymentTestDataValue: out << "value "; break; @@ -314,146 +317,40 @@ PaymentTestDataCurrencyCode, PaymentTestOverwriteValue, "USD"), - DetailsTestCase(PaymentTestDetailTotal, - PaymentTestDataCurrencyCode, - PaymentTestOverwriteValue, - "US1"), - DetailsTestCase(PaymentTestDetailTotal, - PaymentTestDataCurrencyCode, - PaymentTestOverwriteValue, - "US"), - DetailsTestCase(PaymentTestDetailTotal, - PaymentTestDataCurrencyCode, - PaymentTestOverwriteValue, - "USD0"), - DetailsTestCase(PaymentTestDetailTotal, - PaymentTestDataCurrencyCode, - PaymentTestOverwriteValue, - "usd"), - DetailsTestCase(PaymentTestDetailTotal, - PaymentTestDataCurrencyCode, - PaymentTestOverwriteValue, - "ANYSTRING"), - DetailsTestCase(PaymentTestDetailTotal, - PaymentTestDataCurrencyCode, - PaymentTestOverwriteValue, - ""), - DetailsTestCase(PaymentTestDetailItem, PaymentTestDataCurrencyCode, PaymentTestOverwriteValue, "USD"), - DetailsTestCase(PaymentTestDetailItem, - PaymentTestDataCurrencyCode, - PaymentTestOverwriteValue, - "US1"), - DetailsTestCase(PaymentTestDetailItem, - PaymentTestDataCurrencyCode, - PaymentTestOverwriteValue, - "US"), - DetailsTestCase(PaymentTestDetailItem, - PaymentTestDataCurrencyCode, - PaymentTestOverwriteValue, - "USD0"), - DetailsTestCase(PaymentTestDetailItem, - PaymentTestDataCurrencyCode, - PaymentTestOverwriteValue, - "usd"), - DetailsTestCase(PaymentTestDetailItem, - PaymentTestDataCurrencyCode, - PaymentTestOverwriteValue, - "ANYSTRING"), - DetailsTestCase(PaymentTestDetailItem, - PaymentTestDataCurrencyCode, - PaymentTestOverwriteValue, - ""), - DetailsTestCase(PaymentTestDetailShippingOption, PaymentTestDataCurrencyCode, PaymentTestOverwriteValue, "USD"), - DetailsTestCase(PaymentTestDetailShippingOption, - PaymentTestDataCurrencyCode, - PaymentTestOverwriteValue, - "US1"), - DetailsTestCase(PaymentTestDetailShippingOption, - PaymentTestDataCurrencyCode, - PaymentTestOverwriteValue, - "US"), - DetailsTestCase(PaymentTestDetailShippingOption, - PaymentTestDataCurrencyCode, - PaymentTestOverwriteValue, - "USD0"), - DetailsTestCase(PaymentTestDetailShippingOption, - PaymentTestDataCurrencyCode, - PaymentTestOverwriteValue, - "usd"), - DetailsTestCase(PaymentTestDetailShippingOption, - PaymentTestDataCurrencyCode, - PaymentTestOverwriteValue, - "ANYSTRING"), - DetailsTestCase(PaymentTestDetailShippingOption, - PaymentTestDataCurrencyCode, - PaymentTestOverwriteValue, - ""), - - DetailsTestCase(PaymentTestDetailModifierTotal, - PaymentTestDataCurrencyCode, - PaymentTestOverwriteValue, - "USD"), DetailsTestCase(PaymentTestDetailModifierTotal, PaymentTestDataCurrencyCode, PaymentTestOverwriteValue, - "US1"), - DetailsTestCase(PaymentTestDetailModifierTotal, - PaymentTestDataCurrencyCode, - PaymentTestOverwriteValue, - "US"), - DetailsTestCase(PaymentTestDetailModifierTotal, - PaymentTestDataCurrencyCode, - PaymentTestOverwriteValue, - "USD0"), - DetailsTestCase(PaymentTestDetailModifierTotal, - PaymentTestDataCurrencyCode, - PaymentTestOverwriteValue, - "usd"), - DetailsTestCase(PaymentTestDetailModifierTotal, - PaymentTestDataCurrencyCode, - PaymentTestOverwriteValue, - "ANYSTRING"), - DetailsTestCase(PaymentTestDetailModifierTotal, - PaymentTestDataCurrencyCode, - PaymentTestOverwriteValue, - ""), - - DetailsTestCase(PaymentTestDetailModifierItem, - PaymentTestDataCurrencyCode, - PaymentTestOverwriteValue, "USD"), DetailsTestCase(PaymentTestDetailModifierItem, PaymentTestDataCurrencyCode, PaymentTestOverwriteValue, - "US1"), - DetailsTestCase(PaymentTestDetailModifierItem, - PaymentTestDataCurrencyCode, + "USD"))); + +INSTANTIATE_TEST_CASE_P( + ValidCurrencySystem, + PaymentRequestDetailsTest, + testing::Values(DetailsTestCase(PaymentTestDetailTotal, + PaymentTestDataCurrencySystem, PaymentTestOverwriteValue, - "US"), - DetailsTestCase(PaymentTestDetailModifierItem, - PaymentTestDataCurrencyCode, + "https://bitcoin.org"))); + +INSTANTIATE_TEST_CASE_P( + InvalidCurrencySystem, + PaymentRequestDetailsTest, + testing::Values(DetailsTestCase(PaymentTestDetailTotal, + PaymentTestDataCurrencySystem, PaymentTestOverwriteValue, - "USD0"), - DetailsTestCase(PaymentTestDetailModifierItem, - PaymentTestDataCurrencyCode, - PaymentTestOverwriteValue, - "usd"), - DetailsTestCase(PaymentTestDetailModifierItem, - PaymentTestDataCurrencyCode, - PaymentTestOverwriteValue, - "ANYSTRING"), - DetailsTestCase(PaymentTestDetailModifierItem, - PaymentTestDataCurrencyCode, - PaymentTestOverwriteValue, - ""))); + "\\^%\\", + true, + V8TypeError))); INSTANTIATE_TEST_CASE_P( ValidValueFormat,
diff --git a/third_party/WebKit/Source/modules/payments/PaymentTestHelper.cpp b/third_party/WebKit/Source/modules/payments/PaymentTestHelper.cpp index 06d31586..aae0339 100644 --- a/third_party/WebKit/Source/modules/payments/PaymentTestHelper.cpp +++ b/third_party/WebKit/Source/modules/payments/PaymentTestHelper.cpp
@@ -28,6 +28,15 @@ } else { itemAmount.setCurrency("USD"); } + + // Currency system is "urn:iso:std:iso:4217" by default. + if (data == PaymentTestDataCurrencySystem) { + if (modificationType == PaymentTestOverwriteValue) + itemAmount.setCurrencySystem(valueToUse); + else + itemAmount.setCurrencySystem(String()); // null string. + } + if (data == PaymentTestDataValue) { if (modificationType == PaymentTestOverwriteValue) itemAmount.setValue(valueToUse);
diff --git a/third_party/WebKit/Source/modules/payments/PaymentTestHelper.h b/third_party/WebKit/Source/modules/payments/PaymentTestHelper.h index f7c9a85..ff5361f 100644 --- a/third_party/WebKit/Source/modules/payments/PaymentTestHelper.h +++ b/third_party/WebKit/Source/modules/payments/PaymentTestHelper.h
@@ -41,6 +41,7 @@ PaymentTestDataLabel, PaymentTestDataAmount, PaymentTestDataCurrencyCode, + PaymentTestDataCurrencySystem, PaymentTestDataValue, };
diff --git a/third_party/WebKit/Source/modules/payments/PaymentsValidators.cpp b/third_party/WebKit/Source/modules/payments/PaymentsValidators.cpp index 9a9a3d6..d5cb3dc 100644 --- a/third_party/WebKit/Source/modules/payments/PaymentsValidators.cpp +++ b/third_party/WebKit/Source/modules/payments/PaymentsValidators.cpp
@@ -14,7 +14,27 @@ bool PaymentsValidators::isValidCurrencyCodeFormat( const String& code, + const String& system, String* optionalErrorMessage) { + if (system == "urn:iso:std:iso:4217") { + if (ScriptRegexp("^[A-Z]{3}$", TextCaseSensitive).match(code) == 0) + return true; + + if (optionalErrorMessage) + *optionalErrorMessage = "'" + code + + "' is not a valid ISO 4217 currency code, should " + "be 3 upper case letters [A-Z]"; + + return false; + } + + if (!KURL(KURL(), system).isValid()) { + if (optionalErrorMessage) + *optionalErrorMessage = "The currency system is not a valid URL"; + + return false; + } + if (code.length() <= maxiumStringLength) return true;
diff --git a/third_party/WebKit/Source/modules/payments/PaymentsValidators.h b/third_party/WebKit/Source/modules/payments/PaymentsValidators.h index cf6db8e..8bef124e 100644 --- a/third_party/WebKit/Source/modules/payments/PaymentsValidators.h +++ b/third_party/WebKit/Source/modules/payments/PaymentsValidators.h
@@ -17,10 +17,14 @@ public: // The most common identifiers are three-letter alphabetic codes as defined by - // [ISO4217] (for example, "USD" for US Dollars) however any string of at most - // 2048 characters is considered valid. Returns false if currency |code| is - // too long (greater than 2048). + // [ISO4217] (for example, "USD" for US Dollars). |system| is a URL that + // indicates the currency system that the currency identifier belongs to. By + // default, the value is urn:iso:std:iso:4217 indicating that currency is + // defined by [[ISO4217]], however any string of at most 2048 characters is + // considered valid in other currencySystem. Returns false if currency |code| + // is too long (greater than 2048). static bool isValidCurrencyCodeFormat(const String& code, + const String& system, String* optionalErrorMessage); // Returns true if |amount| is a valid currency code as defined in ISO 20022
diff --git a/third_party/WebKit/Source/modules/payments/PaymentsValidatorsTest.cpp b/third_party/WebKit/Source/modules/payments/PaymentsValidatorsTest.cpp index e2d904b..6b68029f 100644 --- a/third_party/WebKit/Source/modules/payments/PaymentsValidatorsTest.cpp +++ b/third_party/WebKit/Source/modules/payments/PaymentsValidatorsTest.cpp
@@ -11,23 +11,18 @@ namespace blink { namespace { -struct TestCase { - TestCase(const char* input, bool expectedValid) - : input(input), expectedValid(expectedValid) {} - ~TestCase() {} +struct CurrencyCodeTestCase { + CurrencyCodeTestCase(const char* code, const char* system, bool expectedValid) + : code(code), system(system), expectedValid(expectedValid) {} + ~CurrencyCodeTestCase() {} - const char* input; + const char* code; + const char* system; bool expectedValid; }; -std::ostream& operator<<(std::ostream& out, const TestCase& testCase) { - out << "'" << testCase.input << "' is expected to be " - << (testCase.expectedValid ? "valid" : "invalid"); - return out; -} - -class PaymentsCurrencyValidatorTest : public testing::TestWithParam<TestCase> { -}; +class PaymentsCurrencyValidatorTest + : public testing::TestWithParam<CurrencyCodeTestCase> {}; const char* longString2048() { static char longString[2049]; @@ -48,30 +43,61 @@ TEST_P(PaymentsCurrencyValidatorTest, IsValidCurrencyCodeFormat) { String errorMessage; EXPECT_EQ(GetParam().expectedValid, - PaymentsValidators::isValidCurrencyCodeFormat(GetParam().input, - &errorMessage)) + PaymentsValidators::isValidCurrencyCodeFormat( + GetParam().code, GetParam().system, &errorMessage)) << errorMessage; EXPECT_EQ(GetParam().expectedValid, errorMessage.isEmpty()) << errorMessage; - EXPECT_EQ( - GetParam().expectedValid, - PaymentsValidators::isValidCurrencyCodeFormat(GetParam().input, nullptr)); + EXPECT_EQ(GetParam().expectedValid, + PaymentsValidators::isValidCurrencyCodeFormat( + GetParam().code, GetParam().system, nullptr)); } INSTANTIATE_TEST_CASE_P( CurrencyCodes, PaymentsCurrencyValidatorTest, testing::Values( - // Any string of at most 2048 characters can be a valid currency code - TestCase("USD", true), - TestCase("US1", true), - TestCase("US", true), - TestCase("USDO", true), - TestCase("usd", true), - TestCase("ANYSTRING", true), - TestCase("", true), - TestCase(longString2048(), true), - TestCase(longString2049(), false))); + // The most common identifiers are three-letter alphabetic codes as + // defined by [ISO4217] (for example, "USD" for US Dollars). + // |system| is a URL that indicates the currency system that the + // currency identifier belongs to. By default, + // the value is urn:iso:std:iso:4217 indicating that currency is defined + // by [[ISO4217]], however any string of at most 2048 + // characters is considered valid in other currencySystem. Returns false + // if currency |code| is too long (greater than 2048). + CurrencyCodeTestCase("USD", "urn:iso:std:iso:4217", true), + CurrencyCodeTestCase("US1", "http://www.example.com", true), + CurrencyCodeTestCase("US1", "urn:iso:std:iso:4217", false), + CurrencyCodeTestCase("US", "http://www.example.com", true), + CurrencyCodeTestCase("US", "urn:iso:std:iso:4217", false), + CurrencyCodeTestCase("USDO", "http://www.example.com", true), + CurrencyCodeTestCase("USDO", "urn:iso:std:iso:4217", false), + CurrencyCodeTestCase("usd", "http://www.example.com", true), + CurrencyCodeTestCase("usd", "urn:iso:std:iso:4217", false), + CurrencyCodeTestCase("ANYSTRING", "http://www.example.com", true), + CurrencyCodeTestCase("ANYSTRING", "urn:iso:std:iso:4217", false), + CurrencyCodeTestCase("", "http://www.example.com", true), + CurrencyCodeTestCase("", "urn:iso:std:iso:4217", false), + CurrencyCodeTestCase(longString2048(), "http://www.example.com", true), + CurrencyCodeTestCase(longString2048(), "urn:iso:std:iso:4217", false), + CurrencyCodeTestCase(longString2049(), + "http://www.example.com", + false))); + +struct TestCase { + TestCase(const char* input, bool expectedValid) + : input(input), expectedValid(expectedValid) {} + ~TestCase() {} + + const char* input; + bool expectedValid; +}; + +std::ostream& operator<<(std::ostream& out, const TestCase& testCase) { + out << "'" << testCase.input << "' is expected to be " + << (testCase.expectedValid ? "valid" : "invalid"); + return out; +} class PaymentsAmountValidatorTest : public testing::TestWithParam<TestCase> {};
diff --git a/third_party/WebKit/Source/modules/push_messaging/PushSubscriptionOptions.cpp b/third_party/WebKit/Source/modules/push_messaging/PushSubscriptionOptions.cpp index c86b168..8059999da 100644 --- a/third_party/WebKit/Source/modules/push_messaging/PushSubscriptionOptions.cpp +++ b/third_party/WebKit/Source/modules/push_messaging/PushSubscriptionOptions.cpp
@@ -10,6 +10,7 @@ #include "modules/push_messaging/PushSubscriptionOptionsInit.h" #include "public/platform/WebString.h" #include "public/platform/modules/push_messaging/WebPushSubscriptionOptions.h" +#include "third_party/WebKit/Source/wtf/ASCIICType.h" #include "wtf/Assertions.h" #include "wtf/text/WTFString.h" @@ -21,10 +22,9 @@ String bufferSourceToString( const ArrayBufferOrArrayBufferView& applicationServerKey, ExceptionState& exceptionState) { - // Check the validity of the sender info. It must be a 65-byte uncompressed - // key, which has the byte 0x04 as the first byte as a marker. unsigned char* input; int length; + // Convert the input array into a string of bytes. if (applicationServerKey.isArrayBuffer()) { input = static_cast<unsigned char*>( applicationServerKey.getAsArrayBuffer()->data()); @@ -39,9 +39,16 @@ return String(); } - // If the key is valid, just treat it as a string of bytes and pass it to - // the push service. - if (length <= kMaxApplicationServerKeyLength) + // Check the validity of the sender info. It must either be a 65-byte + // uncompressed VAPID key, which has the byte 0x04 as the first byte or a + // numeric sender ID. + const bool isVapid = length == 65 && *input == 0x04; + const bool isSenderId = + length > 0 && length < kMaxApplicationServerKeyLength && + (std::find_if_not(input, input + length, + &WTF::isASCIIDigit<unsigned char>) == input + length); + + if (isVapid || isSenderId) return WebString::fromLatin1(input, length); exceptionState.throwDOMException(
diff --git a/third_party/WebKit/Source/modules/remoteplayback/BUILD.gn b/third_party/WebKit/Source/modules/remoteplayback/BUILD.gn index 8ab58df..9b66379 100644 --- a/third_party/WebKit/Source/modules/remoteplayback/BUILD.gn +++ b/third_party/WebKit/Source/modules/remoteplayback/BUILD.gn
@@ -10,7 +10,5 @@ "HTMLMediaElementRemotePlayback.h", "RemotePlayback.cpp", "RemotePlayback.h", - "RemotePlaybackAvailability.cpp", - "RemotePlaybackAvailability.h", ] }
diff --git a/third_party/WebKit/Source/modules/remoteplayback/HTMLMediaElementRemotePlayback.cpp b/third_party/WebKit/Source/modules/remoteplayback/HTMLMediaElementRemotePlayback.cpp index a3c07b1e..40ad55bd 100644 --- a/third_party/WebKit/Source/modules/remoteplayback/HTMLMediaElementRemotePlayback.cpp +++ b/third_party/WebKit/Source/modules/remoteplayback/HTMLMediaElementRemotePlayback.cpp
@@ -44,6 +44,7 @@ // static RemotePlayback* HTMLMediaElementRemotePlayback::remote( + ScriptState* scriptState, HTMLMediaElement& element) { HTMLMediaElementRemotePlayback& self = HTMLMediaElementRemotePlayback::from(element); @@ -52,7 +53,7 @@ return nullptr; if (!self.m_remote) - self.m_remote = RemotePlayback::create(element); + self.m_remote = RemotePlayback::create(scriptState, element); return self.m_remote; }
diff --git a/third_party/WebKit/Source/modules/remoteplayback/HTMLMediaElementRemotePlayback.h b/third_party/WebKit/Source/modules/remoteplayback/HTMLMediaElementRemotePlayback.h index e47b3d7..65793bb 100644 --- a/third_party/WebKit/Source/modules/remoteplayback/HTMLMediaElementRemotePlayback.h +++ b/third_party/WebKit/Source/modules/remoteplayback/HTMLMediaElementRemotePlayback.h
@@ -14,6 +14,7 @@ class HTMLMediaElement; class QualifiedName; class RemotePlayback; +class ScriptState; // Class used to implement the Remote Playback API. It is a supplement to // HTMLMediaElement. @@ -29,7 +30,7 @@ bool); static HTMLMediaElementRemotePlayback& from(HTMLMediaElement&); - static RemotePlayback* remote(HTMLMediaElement&); + static RemotePlayback* remote(ScriptState*, HTMLMediaElement&); DECLARE_VIRTUAL_TRACE();
diff --git a/third_party/WebKit/Source/modules/remoteplayback/HTMLMediaElementRemotePlayback.idl b/third_party/WebKit/Source/modules/remoteplayback/HTMLMediaElementRemotePlayback.idl index 58a6d08..e8e2d9c 100644 --- a/third_party/WebKit/Source/modules/remoteplayback/HTMLMediaElementRemotePlayback.idl +++ b/third_party/WebKit/Source/modules/remoteplayback/HTMLMediaElementRemotePlayback.idl
@@ -5,6 +5,6 @@ // https://w3c.github.io/remote-playback/#extension-to-the-htmlmediaelement partial interface HTMLMediaElement { - [RuntimeEnabled=RemotePlayback] readonly attribute RemotePlayback remote; + [CallWith=ScriptState, RuntimeEnabled=RemotePlayback] readonly attribute RemotePlayback remote; [CEReactions, Reflect] attribute boolean disableRemotePlayback; };
diff --git a/third_party/WebKit/Source/modules/remoteplayback/RemotePlayback.cpp b/third_party/WebKit/Source/modules/remoteplayback/RemotePlayback.cpp index bddeb4b1..5684ceb 100644 --- a/third_party/WebKit/Source/modules/remoteplayback/RemotePlayback.cpp +++ b/third_party/WebKit/Source/modules/remoteplayback/RemotePlayback.cpp
@@ -5,13 +5,14 @@ #include "modules/remoteplayback/RemotePlayback.h" #include "bindings/core/v8/ScriptPromiseResolver.h" +#include "bindings/modules/v8/RemotePlaybackAvailabilityCallback.h" #include "core/HTMLNames.h" #include "core/dom/DOMException.h" #include "core/dom/Document.h" +#include "core/dom/ExecutionContextTask.h" #include "core/events/Event.h" #include "core/html/HTMLMediaElement.h" #include "modules/EventTargetModules.h" -#include "modules/remoteplayback/RemotePlaybackAvailability.h" #include "platform/UserGestureIndicator.h" namespace blink { @@ -39,17 +40,21 @@ } // anonymous namespace // static -RemotePlayback* RemotePlayback::create(HTMLMediaElement& element) { - ASSERT(element.document().frame()); +RemotePlayback* RemotePlayback::create(ScriptState* scriptState, + HTMLMediaElement& element) { + DCHECK(element.document().frame()); + DCHECK(scriptState); - RemotePlayback* remotePlayback = new RemotePlayback(element); + RemotePlayback* remotePlayback = new RemotePlayback(scriptState, element); element.setRemotePlaybackClient(remotePlayback); return remotePlayback; } -RemotePlayback::RemotePlayback(HTMLMediaElement& element) +RemotePlayback::RemotePlayback(ScriptState* scriptState, + HTMLMediaElement& element) : ActiveScriptWrappable(this), + m_scriptState(scriptState), m_state(element.isPlayingRemotely() ? WebRemotePlaybackState::Connected : WebRemotePlaybackState::Disconnected), @@ -64,27 +69,88 @@ return &m_mediaElement->document(); } -ScriptPromise RemotePlayback::getAvailability(ScriptState* scriptState) { - ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); +ScriptPromise RemotePlayback::watchAvailability( + RemotePlaybackAvailabilityCallback* callback) { + ScriptPromiseResolver* resolver = + ScriptPromiseResolver::create(m_scriptState.get()); ScriptPromise promise = resolver->promise(); + if (m_mediaElement->fastHasAttribute(HTMLNames::disableremoteplaybackAttr)) { + resolver->reject(DOMException::create( + InvalidStateError, "disableRemotePlayback attribute is present.")); + return promise; + } + + // TODO(avayvod): implement steps 4 and 5 of the algorithm. + // https://crbug.com/655233 + int id; + do { + id = getExecutionContext()->circularSequentialID(); + } while (!m_availabilityCallbacks.add(id, callback).isNewEntry); + + // Report the current availability via the callback. + getExecutionContext()->postTask( + BLINK_FROM_HERE, + createSameThreadTask(&RemotePlayback::notifyInitialAvailability, + wrapPersistent(this), id), + "watchAvailabilityCallback"); + // TODO(avayvod): Currently the availability is tracked for each media element // as soon as it's created, we probably want to limit that to when the // page/element is visible (see https://crbug.com/597281) and has default // controls. If there are no default controls, we should also start tracking - // availability on demand meaning the Promise returned by getAvailability() + // availability on demand meaning the Promise returned by watchAvailability() // will be resolved asynchronously. - RemotePlaybackAvailability* availability = - RemotePlaybackAvailability::take(resolver, m_availability); - m_availabilityObjects.append(availability); - resolver->resolve(availability); + resolver->resolve(id); return promise; } -ScriptPromise RemotePlayback::prompt(ScriptState* scriptState) { - // TODO(avayvod): implement steps 4, 5, 8, 9 of the algorithm. +ScriptPromise RemotePlayback::cancelWatchAvailability(int id) { + ScriptPromiseResolver* resolver = + ScriptPromiseResolver::create(m_scriptState.get()); + ScriptPromise promise = resolver->promise(); + + if (m_mediaElement->fastHasAttribute(HTMLNames::disableremoteplaybackAttr)) { + resolver->reject(DOMException::create( + InvalidStateError, "disableRemotePlayback attribute is present.")); + return promise; + } + + auto iter = m_availabilityCallbacks.find(id); + if (iter == m_availabilityCallbacks.end()) { + resolver->reject(DOMException::create( + NotFoundError, "A callback with the given id is not found.")); + return promise; + } + + m_availabilityCallbacks.remove(iter); + + resolver->resolve(); + return promise; +} + +ScriptPromise RemotePlayback::cancelWatchAvailability() { + ScriptPromiseResolver* resolver = + ScriptPromiseResolver::create(m_scriptState.get()); + ScriptPromise promise = resolver->promise(); + + if (m_mediaElement->fastHasAttribute(HTMLNames::disableremoteplaybackAttr)) { + resolver->reject(DOMException::create( + InvalidStateError, "disableRemotePlayback attribute is present.")); + return promise; + } + + m_availabilityCallbacks.clear(); + + resolver->resolve(); + return promise; +} + +ScriptPromise RemotePlayback::prompt() { + // TODO(avayvod): implement steps 5, 8, 9 of the algorithm. // https://crbug.com/647441 - ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); + ScriptPromiseResolver* resolver = + ScriptPromiseResolver::create(m_scriptState.get()); ScriptPromise promise = resolver->promise(); if (m_mediaElement->fastHasAttribute(HTMLNames::disableremoteplaybackAttr)) { @@ -126,10 +192,19 @@ } bool RemotePlayback::hasPendingActivity() const { - return hasEventListeners() || !m_availabilityObjects.isEmpty() || + return hasEventListeners() || !m_availabilityCallbacks.isEmpty() || m_promptPromiseResolver; } +void RemotePlayback::notifyInitialAvailability(int callbackId) { + // May not find the callback if the website cancels it fast enough. + auto iter = m_availabilityCallbacks.find(callbackId); + if (iter == m_availabilityCallbacks.end()) + return; + + iter->value->call(m_scriptState.get(), this, m_availability); +} + void RemotePlayback::stateChanged(WebRemotePlaybackState state) { // We may get a "disconnected" state change while in the "disconnected" // state if initiated connection fails. So cleanup the promise resolvers @@ -167,8 +242,8 @@ return; m_availability = available; - for (auto& availabilityObject : m_availabilityObjects) - availabilityObject->availabilityChanged(available); + for (auto& callback : m_availabilityCallbacks.values()) + callback->call(m_scriptState.get(), this, m_availability); } void RemotePlayback::promptCancelled() { @@ -180,8 +255,15 @@ m_promptPromiseResolver = nullptr; } +void RemotePlayback::setV8ReferencesForCallbacks( + v8::Isolate* isolate, + const v8::Persistent<v8::Object>& wrapper) { + for (auto callback : m_availabilityCallbacks.values()) + callback->setWrapperReference(isolate, wrapper); +} + DEFINE_TRACE(RemotePlayback) { - visitor->trace(m_availabilityObjects); + visitor->trace(m_availabilityCallbacks); visitor->trace(m_promptPromiseResolver); visitor->trace(m_mediaElement); EventTargetWithInlineData::trace(visitor);
diff --git a/third_party/WebKit/Source/modules/remoteplayback/RemotePlayback.h b/third_party/WebKit/Source/modules/remoteplayback/RemotePlayback.h index a1b3e7db..c356d97 100644 --- a/third_party/WebKit/Source/modules/remoteplayback/RemotePlayback.h +++ b/third_party/WebKit/Source/modules/remoteplayback/RemotePlayback.h
@@ -7,6 +7,7 @@ #include "bindings/core/v8/ActiveScriptWrappable.h" #include "bindings/core/v8/ScriptPromise.h" +#include "bindings/core/v8/ScriptState.h" #include "core/events/EventTarget.h" #include "modules/ModulesExport.h" #include "platform/heap/Handle.h" @@ -21,7 +22,7 @@ class ExecutionContext; class HTMLMediaElement; class LocalFrame; -class RemotePlaybackAvailability; +class RemotePlaybackAvailabilityCallback; class ScriptPromiseResolver; class MODULES_EXPORT RemotePlayback final @@ -32,14 +33,27 @@ USING_GARBAGE_COLLECTED_MIXIN(RemotePlayback); public: - static RemotePlayback* create(HTMLMediaElement&); + static RemotePlayback* create(ScriptState*, HTMLMediaElement&); // EventTarget implementation. const WTF::AtomicString& interfaceName() const override; ExecutionContext* getExecutionContext() const override; - ScriptPromise getAvailability(ScriptState*); - ScriptPromise prompt(ScriptState*); + // Starts notifying the page about the changes to the remote playback devices + // availability via the provided callback. May start the monitoring of remote + // playback devices if it isn't running yet. + ScriptPromise watchAvailability(RemotePlaybackAvailabilityCallback*); + + // Cancels updating the page via the callback specified by its id. + ScriptPromise cancelWatchAvailability(int id); + + // Cancels all the callbacks watching remote playback availability changes + // registered with this element. + ScriptPromise cancelWatchAvailability(); + + // Shows the UI allowing user to change the remote playback state of the media + // element (by picking a remote playback device from the list, for example). + ScriptPromise prompt(); String state() const; @@ -53,18 +67,31 @@ DECLARE_VIRTUAL_TRACE(); private: + friend class V8RemotePlayback; friend class RemotePlaybackTest; - explicit RemotePlayback(HTMLMediaElement&); + explicit RemotePlayback(ScriptState*, HTMLMediaElement&); + + // Calls the specified availability callback with the current availability. + // Need a void() method to post it as a task. + void notifyInitialAvailability(int callbackId); // WebRemotePlaybackClient implementation. void stateChanged(WebRemotePlaybackState) override; void availabilityChanged(bool available) override; void promptCancelled() override; + // Prevent v8 from garbage collecting the availability callbacks. + // TODO(avayvod): remove when crbug.com/468240 is fixed and the references + // are maintained automatically. + void setV8ReferencesForCallbacks(v8::Isolate*, + const v8::Persistent<v8::Object>& wrapper); + + RefPtr<ScriptState> m_scriptState; WebRemotePlaybackState m_state; bool m_availability; - HeapVector<Member<RemotePlaybackAvailability>> m_availabilityObjects; + HeapHashMap<int, Member<RemotePlaybackAvailabilityCallback>> + m_availabilityCallbacks; Member<HTMLMediaElement> m_mediaElement; Member<ScriptPromiseResolver> m_promptPromiseResolver; };
diff --git a/third_party/WebKit/Source/modules/remoteplayback/RemotePlayback.idl b/third_party/WebKit/Source/modules/remoteplayback/RemotePlayback.idl index 65539fb..becc569 100644 --- a/third_party/WebKit/Source/modules/remoteplayback/RemotePlayback.idl +++ b/third_party/WebKit/Source/modules/remoteplayback/RemotePlayback.idl
@@ -9,8 +9,11 @@ "disconnected" }; +callback RemotePlaybackAvailabilityCallback = void(boolean available); + [ ActiveScriptWrappable, + Custom=VisitDOMWrapper, DependentLifetime, RuntimeEnabled=RemotePlayback ] interface RemotePlayback : EventTarget { @@ -19,6 +22,7 @@ attribute EventHandler onconnect; attribute EventHandler ondisconnect; - [CallWith=ScriptState] Promise<RemotePlaybackAvailability> getAvailability(); - [CallWith=ScriptState] Promise<void> prompt(); + Promise<long> watchAvailability(RemotePlaybackAvailabilityCallback callback); + Promise<void> cancelWatchAvailability(optional long id); + Promise<void> prompt(); };
diff --git a/third_party/WebKit/Source/modules/remoteplayback/RemotePlaybackAvailability.cpp b/third_party/WebKit/Source/modules/remoteplayback/RemotePlaybackAvailability.cpp deleted file mode 100644 index 7234fe3..0000000 --- a/third_party/WebKit/Source/modules/remoteplayback/RemotePlaybackAvailability.cpp +++ /dev/null
@@ -1,61 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "modules/remoteplayback/RemotePlaybackAvailability.h" - -#include "bindings/core/v8/ScriptPromiseResolver.h" -#include "core/dom/Document.h" -#include "core/events/Event.h" -#include "modules/EventTargetModulesNames.h" - -namespace blink { - -// static -RemotePlaybackAvailability* RemotePlaybackAvailability::take( - ScriptPromiseResolver* resolver, - bool value) { - return new RemotePlaybackAvailability(resolver->getExecutionContext(), value); -} - -RemotePlaybackAvailability::RemotePlaybackAvailability( - ExecutionContext* executionContext, - bool value) - : ActiveScriptWrappable(this), - ContextLifecycleObserver(executionContext), - m_value(value) { - ASSERT(executionContext->isDocument()); -} - -RemotePlaybackAvailability::~RemotePlaybackAvailability() = default; - -const AtomicString& RemotePlaybackAvailability::interfaceName() const { - return EventTargetNames::RemotePlaybackAvailability; -} - -ExecutionContext* RemotePlaybackAvailability::getExecutionContext() const { - return ContextLifecycleObserver::getExecutionContext(); -} - -void RemotePlaybackAvailability::availabilityChanged(bool value) { - if (m_value == value) - return; - - m_value = value; - dispatchEvent(Event::create(EventTypeNames::change)); -} - -bool RemotePlaybackAvailability::value() const { - return m_value; -} - -bool RemotePlaybackAvailability::hasPendingActivity() const { - return hasEventListeners(); -} - -DEFINE_TRACE(RemotePlaybackAvailability) { - EventTargetWithInlineData::trace(visitor); - ContextLifecycleObserver::trace(visitor); -} - -} // namespace blink
diff --git a/third_party/WebKit/Source/modules/remoteplayback/RemotePlaybackAvailability.h b/third_party/WebKit/Source/modules/remoteplayback/RemotePlaybackAvailability.h deleted file mode 100644 index 2a968ac..0000000 --- a/third_party/WebKit/Source/modules/remoteplayback/RemotePlaybackAvailability.h +++ /dev/null
@@ -1,53 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef RemotePlaybackAvailability_h -#define RemotePlaybackAvailability_h - -#include "bindings/core/v8/ActiveScriptWrappable.h" -#include "core/dom/ContextLifecycleObserver.h" -#include "core/events/EventTarget.h" - -namespace blink { - -class ExecutionContext; -class ScriptPromiseResolver; - -// Expose whether there is a remote playback device available for a media -// element. The object will be initialized with a default value passed via -// ::take() and will then listen to availability changes. -class RemotePlaybackAvailability final : public EventTargetWithInlineData, - public ActiveScriptWrappable, - public ContextLifecycleObserver { - DEFINE_WRAPPERTYPEINFO(); - USING_GARBAGE_COLLECTED_MIXIN(RemotePlaybackAvailability); - - public: - static RemotePlaybackAvailability* take(ScriptPromiseResolver*, bool); - ~RemotePlaybackAvailability() override; - - // EventTarget implementation. - const AtomicString& interfaceName() const override; - ExecutionContext* getExecutionContext() const override; - - void availabilityChanged(bool); - - bool value() const; - - // ScriptWrappable implementation. - bool hasPendingActivity() const final; - - DEFINE_ATTRIBUTE_EVENT_LISTENER(change); - - DECLARE_VIRTUAL_TRACE(); - - private: - RemotePlaybackAvailability(ExecutionContext*, bool); - - bool m_value; -}; - -} // namespace blink - -#endif // RemotePlaybackAvailability_h
diff --git a/third_party/WebKit/Source/modules/remoteplayback/RemotePlaybackAvailability.idl b/third_party/WebKit/Source/modules/remoteplayback/RemotePlaybackAvailability.idl deleted file mode 100644 index 0c9285f..0000000 --- a/third_party/WebKit/Source/modules/remoteplayback/RemotePlaybackAvailability.idl +++ /dev/null
@@ -1,14 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// https://w3c.github.io/remote-playback/#idl-def-remoteplaybackavailability - -[ - ActiveScriptWrappable, - DependentLifetime, - RuntimeEnabled=RemotePlayback, -] interface RemotePlaybackAvailability : EventTarget { - readonly attribute boolean value; - attribute EventHandler onchange; -};
diff --git a/third_party/WebKit/Source/modules/remoteplayback/RemotePlaybackTest.cpp b/third_party/WebKit/Source/modules/remoteplayback/RemotePlaybackTest.cpp index 9f83a7e2..9039d78 100644 --- a/third_party/WebKit/Source/modules/remoteplayback/RemotePlaybackTest.cpp +++ b/third_party/WebKit/Source/modules/remoteplayback/RemotePlaybackTest.cpp
@@ -59,7 +59,8 @@ auto pageHolder = DummyPageHolder::create(); HTMLMediaElement* element = HTMLVideoElement::create(pageHolder->document()); - RemotePlayback* remotePlayback = RemotePlayback::create(*element); + RemotePlayback* remotePlayback = + RemotePlayback::create(scope.getScriptState(), *element); MockFunction* resolve = MockFunction::create(scope.getScriptState()); MockFunction* reject = MockFunction::create(scope.getScriptState()); @@ -67,8 +68,7 @@ EXPECT_CALL(*resolve, call(::testing::_)).Times(0); EXPECT_CALL(*reject, call(::testing::_)).Times(1); - remotePlayback->prompt(scope.getScriptState()) - .then(resolve->bind(), reject->bind()); + remotePlayback->prompt().then(resolve->bind(), reject->bind()); cancelPrompt(remotePlayback); } @@ -78,7 +78,8 @@ auto pageHolder = DummyPageHolder::create(); HTMLMediaElement* element = HTMLVideoElement::create(pageHolder->document()); - RemotePlayback* remotePlayback = RemotePlayback::create(*element); + RemotePlayback* remotePlayback = + RemotePlayback::create(scope.getScriptState(), *element); auto connectingHandler = new ::testing::StrictMock<MockEventListener>(); auto connectHandler = new ::testing::StrictMock<MockEventListener>();
diff --git a/third_party/WebKit/Source/modules/webaudio/AudioBufferSourceNode.cpp b/third_party/WebKit/Source/modules/webaudio/AudioBufferSourceNode.cpp index b675a8d..4826d3d 100644 --- a/third_party/WebKit/Source/modules/webaudio/AudioBufferSourceNode.cpp +++ b/third_party/WebKit/Source/modules/webaudio/AudioBufferSourceNode.cpp
@@ -499,8 +499,7 @@ ExceptionState& exceptionState) { DCHECK(isMainThread()); - // TODO(mlamouri): record when this is called with a user gesture and could - // have started the AudioContext if following Safari iOS rules. + context()->maybeRecordStartAttempt(); if (playbackState() != UNSCHEDULED_STATE) { exceptionState.throwDOMException(InvalidStateError,
diff --git a/third_party/WebKit/Source/modules/webaudio/AudioNodeInput.cpp b/third_party/WebKit/Source/modules/webaudio/AudioNodeInput.cpp index 89cfd08..f91fbe03 100644 --- a/third_party/WebKit/Source/modules/webaudio/AudioNodeInput.cpp +++ b/third_party/WebKit/Source/modules/webaudio/AudioNodeInput.cpp
@@ -94,11 +94,13 @@ void AudioNodeInput::enable(AudioNodeOutput& output) { ASSERT(deferredTaskHandler().isGraphOwner()); - DCHECK(m_disabledOutputs.contains(&output)); // Move output from disabled list to active list. m_outputs.add(&output); - m_disabledOutputs.remove(&output); + if (m_disabledOutputs.size() > 0) { + DCHECK(m_disabledOutputs.contains(&output)); + m_disabledOutputs.remove(&output); + } changedOutputs(); // Propagate enabled state to outputs.
diff --git a/third_party/WebKit/Source/modules/webaudio/AudioScheduledSourceNode.cpp b/third_party/WebKit/Source/modules/webaudio/AudioScheduledSourceNode.cpp index f0e0584a..89e1174 100644 --- a/third_party/WebKit/Source/modules/webaudio/AudioScheduledSourceNode.cpp +++ b/third_party/WebKit/Source/modules/webaudio/AudioScheduledSourceNode.cpp
@@ -149,8 +149,7 @@ ExceptionState& exceptionState) { DCHECK(isMainThread()); - // TODO(mlamouri): record when this is called with a user gesture and could - // have started the AudioContext if following Safari iOS rules. + context()->maybeRecordStartAttempt(); if (playbackState() != UNSCHEDULED_STATE) { exceptionState.throwDOMException(InvalidStateError,
diff --git a/third_party/WebKit/Source/modules/webaudio/BaseAudioContext.cpp b/third_party/WebKit/Source/modules/webaudio/BaseAudioContext.cpp index a83ad8a..020e539 100644 --- a/third_party/WebKit/Source/modules/webaudio/BaseAudioContext.cpp +++ b/third_party/WebKit/Source/modules/webaudio/BaseAudioContext.cpp
@@ -108,6 +108,7 @@ if (document->settings() && document->settings()->mediaPlaybackRequiresUserGesture() && document->frame() && document->frame()->isCrossOriginSubframe()) { + m_autoplayStatus = AutoplayStatus::AutoplayStatusFailed; m_userGestureRequired = true; } @@ -145,6 +146,7 @@ DCHECK(!m_finishedSourceHandlers.size()); DCHECK(!m_isResolvingResumePromises); DCHECK(!m_resumeResolvers.size()); + DCHECK(!m_autoplayStatus.has_value()); } void BaseAudioContext::initialize() { @@ -189,6 +191,8 @@ DCHECK(m_listener); m_listener->waitForHRTFDatabaseLoaderThreadCompletion(); + recordAutoplayStatus(); + clear(); } @@ -562,6 +566,15 @@ } } +void BaseAudioContext::maybeRecordStartAttempt() { + if (!m_userGestureRequired || !UserGestureIndicator::processingUserGesture()) + return; + + DCHECK(!m_autoplayStatus.has_value() || + m_autoplayStatus != AutoplayStatus::AutoplayStatusSucceeded); + m_autoplayStatus = AutoplayStatus::AutoplayStatusFailedWithStart; +} + String BaseAudioContext::state() const { // These strings had better match the strings for AudioContextState in // AudioContext.idl. @@ -784,8 +797,12 @@ if (!m_userGestureRequired || !UserGestureIndicator::processingUserGesture()) return; + DCHECK(!m_autoplayStatus.has_value() || + m_autoplayStatus != AutoplayStatus::AutoplayStatusSucceeded); + UserGestureIndicator::utilizeUserGesture(); m_userGestureRequired = false; + m_autoplayStatus = AutoplayStatus::AutoplayStatusSucceeded; } bool BaseAudioContext::isAllowedToStart() const { @@ -816,6 +833,18 @@ rejectPendingDecodeAudioDataResolvers(); } +void BaseAudioContext::recordAutoplayStatus() { + if (!m_autoplayStatus.has_value()) + return; + + DEFINE_STATIC_LOCAL( + EnumerationHistogram, autoplayHistogram, + ("WebAudio.Autoplay.CrossOrigin", AutoplayStatus::AutoplayStatusCount)); + autoplayHistogram.count(m_autoplayStatus.value()); + + m_autoplayStatus.reset(); +} + const AtomicString& BaseAudioContext::interfaceName() const { return EventTargetNames::AudioContext; }
diff --git a/third_party/WebKit/Source/modules/webaudio/BaseAudioContext.h b/third_party/WebKit/Source/modules/webaudio/BaseAudioContext.h index 94474e47..d0e80b9 100644 --- a/third_party/WebKit/Source/modules/webaudio/BaseAudioContext.h +++ b/third_party/WebKit/Source/modules/webaudio/BaseAudioContext.h
@@ -54,6 +54,7 @@ class AudioBufferSourceNode; class AudioListener; class AudioSummingJunction; +class BaseAudioContextTest; class BiquadFilterNode; class ChannelMergerNode; class ChannelSplitterNode; @@ -299,6 +300,11 @@ // initialized internally if necessary. PeriodicWave* periodicWave(int type); + // For metrics purpose, records when start() is called on a + // AudioScheduledSourceHandler or a AudioBufferSourceHandler without a user + // gesture while the AudioContext requires a user gesture. + void maybeRecordStartAttempt(); + protected: explicit BaseAudioContext(Document*); BaseAudioContext(Document*, @@ -342,6 +348,23 @@ bool isAllowedToStart() const; private: + friend class BaseAudioContextTest; + + // Do not change the order of this enum, it is used for metrics. + enum AutoplayStatus { + // The AudioContext failed to activate because of user gesture requirements. + AutoplayStatusFailed = 0, + // Same as AutoplayStatusFailed but start() on a node was called with a user + // gesture. + AutoplayStatusFailedWithStart = 1, + // The AudioContext had user gesture requirements and was able to activate + // with a user gesture. + AutoplayStatusSucceeded = 2, + + // Keep at the end. + AutoplayStatusCount + }; + bool m_isCleared; void clear(); @@ -383,6 +406,9 @@ // resolvers. virtual void rejectPendingResolvers(); + // Record the current autoplay status and clear it. + void recordAutoplayStatus(); + // True if we're in the process of resolving promises for resume(). Resolving // can take some time and the audio context process loop is very fast, so we // don't want to call resolve an excessive number of times. @@ -422,6 +448,8 @@ // This is considering 32 is large enough for multiple channels audio. // It is somewhat arbitrary and could be increased if necessary. enum { MaxNumberOfChannels = 32 }; + + Optional<AutoplayStatus> m_autoplayStatus; }; } // namespace blink
diff --git a/third_party/WebKit/Source/modules/webaudio/BaseAudioContextTest.cpp b/third_party/WebKit/Source/modules/webaudio/BaseAudioContextTest.cpp new file mode 100644 index 0000000..89f73ac --- /dev/null +++ b/third_party/WebKit/Source/modules/webaudio/BaseAudioContextTest.cpp
@@ -0,0 +1,294 @@ +// 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 "modules/webaudio/BaseAudioContext.h" + +#include "core/dom/Document.h" +#include "core/frame/FrameOwner.h" +#include "core/frame/FrameView.h" +#include "core/frame/Settings.h" +#include "core/loader/DocumentLoader.h" +#include "core/loader/EmptyClients.h" +#include "core/testing/DummyPageHolder.h" +#include "platform/UserGestureIndicator.h" +#include "platform/testing/HistogramTester.h" +#include "platform/testing/TestingPlatformSupport.h" +#include "public/platform/WebAudioDevice.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace blink { + +namespace { + +const char* const kCrossOriginMetric = "WebAudio.Autoplay.CrossOrigin"; + +class MockCrossOriginFrameLoaderClient final : public EmptyFrameLoaderClient { + public: + static MockCrossOriginFrameLoaderClient* create(Frame* parent) { + return new MockCrossOriginFrameLoaderClient(parent); + } + + DEFINE_INLINE_VIRTUAL_TRACE() { + visitor->trace(m_parent); + EmptyFrameLoaderClient::trace(visitor); + } + + Frame* parent() const override { return m_parent.get(); } + Frame* top() const override { return m_parent.get(); } + + private: + explicit MockCrossOriginFrameLoaderClient(Frame* parent) : m_parent(parent) {} + + Member<Frame> m_parent; +}; + +class MockWebAudioDevice : public WebAudioDevice { + public: + explicit MockWebAudioDevice(double sampleRate) : m_sampleRate(sampleRate) {} + ~MockWebAudioDevice() override = default; + + void start() override {} + void stop() override {} + double sampleRate() override { return m_sampleRate; } + + private: + double m_sampleRate; +}; + +class BaseAudioContextTestPlatform : public TestingPlatformSupport { + public: + WebAudioDevice* createAudioDevice(size_t bufferSize, + unsigned numberOfInputChannels, + unsigned numberOfChannels, + double sampleRate, + WebAudioDevice::RenderCallback*, + const WebString& deviceId, + const WebSecurityOrigin&) override { + return new MockWebAudioDevice(sampleRate); + } + + double audioHardwareSampleRate() override { return 44100; } +}; + +} // anonymous namespace + +class BaseAudioContextTest : public ::testing::Test { + protected: + using AutoplayStatus = BaseAudioContext::AutoplayStatus; + + void SetUp() override { + m_dummyPageHolder = DummyPageHolder::create(); + m_dummyFrameOwner = DummyFrameOwner::create(); + document().updateSecurityOrigin( + SecurityOrigin::create("https", "example.com", 80)); + } + + void TearDown() override { + if (m_childFrame) { + m_childDocumentLoader->detachFromFrame(); + m_childDocumentLoader.clear(); + m_childFrame->detach(FrameDetachType::Remove); + } + } + + void createChildFrame() { + m_childFrame = LocalFrame::create( + MockCrossOriginFrameLoaderClient::create(document().frame()), + document().frame()->host(), m_dummyFrameOwner.get()); + m_childFrame->setView( + FrameView::create(m_childFrame.get(), IntSize(500, 500))); + m_childFrame->init(); + m_childDocumentLoader = DocumentLoader::create( + m_childFrame.get(), ResourceRequest("https://www.example.com"), + SubstituteData()); + + childDocument().updateSecurityOrigin( + SecurityOrigin::create("https", "cross-origin.com", 80)); + } + + Document& document() { return m_dummyPageHolder->document(); } + + Document& childDocument() { return *m_childFrame->document(); } + + ScriptState* getScriptStateFrom(const Document& document) { + return ScriptState::forMainWorld(document.frame()); + } + + void rejectPendingResolvers(BaseAudioContext* audioContext) { + audioContext->rejectPendingResolvers(); + } + + void recordAutoplayStatus(BaseAudioContext* audioContext) { + audioContext->recordAutoplayStatus(); + } + + private: + std::unique_ptr<DummyPageHolder> m_dummyPageHolder; + Persistent<DummyFrameOwner> m_dummyFrameOwner; + + Persistent<LocalFrame> m_childFrame; + Persistent<DocumentLoader> m_childDocumentLoader; + + BaseAudioContextTestPlatform m_testPlatform; +}; + +TEST_F(BaseAudioContextTest, AutoplayMetrics_NoRestriction) { + HistogramTester histogramTester; + + BaseAudioContext* audioContext = + BaseAudioContext::create(document(), ASSERT_NO_EXCEPTION); + recordAutoplayStatus(audioContext); + + histogramTester.expectTotalCount(kCrossOriginMetric, 0); +} + +TEST_F(BaseAudioContextTest, AutoplayMetrics_CreateNoGesture) { + HistogramTester histogramTester; + createChildFrame(); + childDocument().settings()->setMediaPlaybackRequiresUserGesture(true); + + BaseAudioContext* audioContext = + BaseAudioContext::create(childDocument(), ASSERT_NO_EXCEPTION); + recordAutoplayStatus(audioContext); + + histogramTester.expectBucketCount(kCrossOriginMetric, + AutoplayStatus::AutoplayStatusFailed, 1); + histogramTester.expectTotalCount(kCrossOriginMetric, 1); +} + +TEST_F(BaseAudioContextTest, AutoplayMetrics_CallResumeNoGesture) { + HistogramTester histogramTester; + createChildFrame(); + childDocument().settings()->setMediaPlaybackRequiresUserGesture(true); + + ScriptState::Scope scope(getScriptStateFrom(childDocument())); + + BaseAudioContext* audioContext = + BaseAudioContext::create(childDocument(), ASSERT_NO_EXCEPTION); + audioContext->resumeContext(getScriptStateFrom(childDocument())); + rejectPendingResolvers(audioContext); + recordAutoplayStatus(audioContext); + + histogramTester.expectBucketCount(kCrossOriginMetric, + AutoplayStatus::AutoplayStatusFailed, 1); + histogramTester.expectTotalCount(kCrossOriginMetric, 1); +} + +TEST_F(BaseAudioContextTest, AutoplayMetrics_CreateGesture) { + HistogramTester histogramTester; + createChildFrame(); + childDocument().settings()->setMediaPlaybackRequiresUserGesture(true); + + UserGestureIndicator userGestureScope( + UserGestureToken::create(UserGestureToken::NewGesture)); + + BaseAudioContext* audioContext = + BaseAudioContext::create(childDocument(), ASSERT_NO_EXCEPTION); + recordAutoplayStatus(audioContext); + + histogramTester.expectBucketCount(kCrossOriginMetric, + AutoplayStatus::AutoplayStatusSucceeded, 1); + histogramTester.expectTotalCount(kCrossOriginMetric, 1); +} + +TEST_F(BaseAudioContextTest, AutoplayMetrics_CallResumeGesture) { + HistogramTester histogramTester; + createChildFrame(); + childDocument().settings()->setMediaPlaybackRequiresUserGesture(true); + + ScriptState::Scope scope(getScriptStateFrom(childDocument())); + + BaseAudioContext* audioContext = + BaseAudioContext::create(childDocument(), ASSERT_NO_EXCEPTION); + + UserGestureIndicator userGestureScope( + UserGestureToken::create(UserGestureToken::NewGesture)); + + audioContext->resumeContext(getScriptStateFrom(childDocument())); + rejectPendingResolvers(audioContext); + recordAutoplayStatus(audioContext); + + histogramTester.expectBucketCount(kCrossOriginMetric, + AutoplayStatus::AutoplayStatusSucceeded, 1); + histogramTester.expectTotalCount(kCrossOriginMetric, 1); +} + +TEST_F(BaseAudioContextTest, AutoplayMetrics_NodeStartNoGesture) { + HistogramTester histogramTester; + createChildFrame(); + childDocument().settings()->setMediaPlaybackRequiresUserGesture(true); + + BaseAudioContext* audioContext = + BaseAudioContext::create(childDocument(), ASSERT_NO_EXCEPTION); + audioContext->maybeRecordStartAttempt(); + recordAutoplayStatus(audioContext); + + histogramTester.expectBucketCount(kCrossOriginMetric, + AutoplayStatus::AutoplayStatusFailed, 1); + histogramTester.expectTotalCount(kCrossOriginMetric, 1); +} + +TEST_F(BaseAudioContextTest, AutoplayMetrics_NodeStartGesture) { + HistogramTester histogramTester; + createChildFrame(); + childDocument().settings()->setMediaPlaybackRequiresUserGesture(true); + + BaseAudioContext* audioContext = + BaseAudioContext::create(childDocument(), ASSERT_NO_EXCEPTION); + + UserGestureIndicator userGestureScope( + UserGestureToken::create(UserGestureToken::NewGesture)); + audioContext->maybeRecordStartAttempt(); + recordAutoplayStatus(audioContext); + + histogramTester.expectBucketCount( + kCrossOriginMetric, AutoplayStatus::AutoplayStatusFailedWithStart, 1); + histogramTester.expectTotalCount(kCrossOriginMetric, 1); +} + +TEST_F(BaseAudioContextTest, AutoplayMetrics_NodeStartNoGestureThenSuccess) { + HistogramTester histogramTester; + createChildFrame(); + childDocument().settings()->setMediaPlaybackRequiresUserGesture(true); + + ScriptState::Scope scope(getScriptStateFrom(childDocument())); + + BaseAudioContext* audioContext = + BaseAudioContext::create(childDocument(), ASSERT_NO_EXCEPTION); + audioContext->maybeRecordStartAttempt(); + + UserGestureIndicator userGestureScope( + UserGestureToken::create(UserGestureToken::NewGesture)); + audioContext->resumeContext(getScriptStateFrom(childDocument())); + rejectPendingResolvers(audioContext); + recordAutoplayStatus(audioContext); + + histogramTester.expectBucketCount(kCrossOriginMetric, + AutoplayStatus::AutoplayStatusSucceeded, 1); + histogramTester.expectTotalCount(kCrossOriginMetric, 1); +} + +TEST_F(BaseAudioContextTest, AutoplayMetrics_NodeStartGestureThenSucces) { + HistogramTester histogramTester; + createChildFrame(); + childDocument().settings()->setMediaPlaybackRequiresUserGesture(true); + + ScriptState::Scope scope(getScriptStateFrom(childDocument())); + + BaseAudioContext* audioContext = + BaseAudioContext::create(childDocument(), ASSERT_NO_EXCEPTION); + + UserGestureIndicator userGestureScope( + UserGestureToken::create(UserGestureToken::NewGesture)); + audioContext->maybeRecordStartAttempt(); + audioContext->resumeContext(getScriptStateFrom(childDocument())); + rejectPendingResolvers(audioContext); + recordAutoplayStatus(audioContext); + + histogramTester.expectBucketCount(kCrossOriginMetric, + AutoplayStatus::AutoplayStatusSucceeded, 1); + histogramTester.expectTotalCount(kCrossOriginMetric, 1); +} + +} // namespace blink
diff --git a/third_party/WebKit/Source/modules/webaudio/ChannelSplitterNode.cpp b/third_party/WebKit/Source/modules/webaudio/ChannelSplitterNode.cpp index 4408762..3382682 100644 --- a/third_party/WebKit/Source/modules/webaudio/ChannelSplitterNode.cpp +++ b/third_party/WebKit/Source/modules/webaudio/ChannelSplitterNode.cpp
@@ -38,6 +38,9 @@ float sampleRate, unsigned numberOfOutputs) : AudioHandler(NodeTypeChannelSplitter, node, sampleRate) { + // These properties are fixed and cannot be changed by the user. + m_channelCount = numberOfOutputs; + setInternalChannelCountMode(Explicit); addInput(); // Create a fixed number of outputs (able to handle the maximum number of @@ -79,6 +82,34 @@ } } +void ChannelSplitterHandler::setChannelCount(unsigned long channelCount, + ExceptionState& exceptionState) { + DCHECK(isMainThread()); + BaseAudioContext::AutoLocker locker(context()); + + // channelCount cannot be changed from the number of outputs. + if (channelCount != numberOfOutputs()) { + exceptionState.throwDOMException( + InvalidStateError, + "ChannelSplitter: channelCount cannot be changed from " + + String::number(numberOfOutputs())); + } +} + +void ChannelSplitterHandler::setChannelCountMode( + const String& mode, + ExceptionState& exceptionState) { + DCHECK(isMainThread()); + BaseAudioContext::AutoLocker locker(context()); + + // channcelCountMode must be 'explicit'. + if (mode != "explicit") { + exceptionState.throwDOMException( + InvalidStateError, + "ChannelSplitter: channelCountMode cannot be changed from 'explicit'"); + } +} + // ---------------------------------------------------------------- ChannelSplitterNode::ChannelSplitterNode(BaseAudioContext& context,
diff --git a/third_party/WebKit/Source/modules/webaudio/ChannelSplitterNode.h b/third_party/WebKit/Source/modules/webaudio/ChannelSplitterNode.h index 021135f4..a45c310 100644 --- a/third_party/WebKit/Source/modules/webaudio/ChannelSplitterNode.h +++ b/third_party/WebKit/Source/modules/webaudio/ChannelSplitterNode.h
@@ -42,6 +42,8 @@ // AudioHandler void process(size_t framesToProcess) override; + void setChannelCount(unsigned long, ExceptionState&) final; + void setChannelCountMode(const String&, ExceptionState&) final; private: ChannelSplitterHandler(AudioNode&,
diff --git a/third_party/WebKit/Source/modules/webgl/WebGL2RenderingContextBase.cpp b/third_party/WebKit/Source/modules/webgl/WebGL2RenderingContextBase.cpp index 3d352b67a9..a91d0575 100644 --- a/third_party/WebKit/Source/modules/webgl/WebGL2RenderingContextBase.cpp +++ b/third_party/WebKit/Source/modules/webgl/WebGL2RenderingContextBase.cpp
@@ -135,19 +135,6 @@ GL_DEPTH32F_STENCIL8, }; -const GLenum kCompressedTextureFormatsETC2EAC[] = { - GL_COMPRESSED_R11_EAC, - GL_COMPRESSED_SIGNED_R11_EAC, - GL_COMPRESSED_RG11_EAC, - GL_COMPRESSED_SIGNED_RG11_EAC, - GL_COMPRESSED_RGB8_ETC2, - GL_COMPRESSED_SRGB8_ETC2, - GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2, - GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2, - GL_COMPRESSED_RGBA8_ETC2_EAC, - GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC, -}; - WebGL2RenderingContextBase::WebGL2RenderingContextBase( HTMLCanvasElement* passedCanvas, std::unique_ptr<WebGraphicsContext3DProvider> contextProvider, @@ -160,17 +147,6 @@ kSupportedInternalFormatsStorage, kSupportedInternalFormatsStorage + WTF_ARRAY_LENGTH(kSupportedInternalFormatsStorage)); - m_supportedInternalFormatsStorage.insert( - kCompressedTextureFormatsETC2EAC, - kCompressedTextureFormatsETC2EAC + - WTF_ARRAY_LENGTH(kCompressedTextureFormatsETC2EAC)); - m_compressedTextureFormatsETC2EAC.insert( - kCompressedTextureFormatsETC2EAC, - kCompressedTextureFormatsETC2EAC + - WTF_ARRAY_LENGTH(kCompressedTextureFormatsETC2EAC)); - m_compressedTextureFormats.append( - kCompressedTextureFormatsETC2EAC, - WTF_ARRAY_LENGTH(kCompressedTextureFormatsETC2EAC)); } WebGL2RenderingContextBase::~WebGL2RenderingContextBase() {
diff --git a/third_party/WebKit/Source/modules/webgl/WebGL2RenderingContextBase.idl b/third_party/WebKit/Source/modules/webgl/WebGL2RenderingContextBase.idl index 516bcd0d..ac6fab30 100644 --- a/third_party/WebKit/Source/modules/webgl/WebGL2RenderingContextBase.idl +++ b/third_party/WebKit/Source/modules/webgl/WebGL2RenderingContextBase.idl
@@ -268,16 +268,6 @@ const GLenum TRANSFORM_FEEDBACK_PAUSED = 0x8E23; const GLenum TRANSFORM_FEEDBACK_ACTIVE = 0x8E24; const GLenum TRANSFORM_FEEDBACK_BINDING = 0x8E25; - const GLenum COMPRESSED_R11_EAC = 0x9270; - const GLenum COMPRESSED_SIGNED_R11_EAC = 0x9271; - const GLenum COMPRESSED_RG11_EAC = 0x9272; - const GLenum COMPRESSED_SIGNED_RG11_EAC = 0x9273; - const GLenum COMPRESSED_RGB8_ETC2 = 0x9274; - const GLenum COMPRESSED_SRGB8_ETC2 = 0x9275; - const GLenum COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 = 0x9276; - const GLenum COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 = 0x9277; - const GLenum COMPRESSED_RGBA8_ETC2_EAC = 0x9278; - const GLenum COMPRESSED_SRGB8_ALPHA8_ETC2_EAC = 0x9279; const GLenum TEXTURE_IMMUTABLE_FORMAT = 0x912F; const GLenum MAX_ELEMENT_INDEX = 0x8D6B; const GLenum NUM_SAMPLE_COUNTS = 0x9380;
diff --git a/third_party/WebKit/Source/platform/RuntimeEnabledFeatures.in b/third_party/WebKit/Source/platform/RuntimeEnabledFeatures.in index 6e9a343..432aa28 100644 --- a/third_party/WebKit/Source/platform/RuntimeEnabledFeatures.in +++ b/third_party/WebKit/Source/platform/RuntimeEnabledFeatures.in
@@ -101,7 +101,7 @@ FileAPIBlobClose status=experimental FileSystem status=stable ForeignFetch status=experimental, origin_trial_feature_name=ForeignFetch -FramebustingNeedsSameOriginOrUserGesture status=stable +FramebustingNeedsSameOriginOrUserGesture status=test, settable_from_internals=True FullscreenUnprefixed status=test FrameTimingSupport status=experimental GamepadExtensions origin_trial_feature_name=WebVR @@ -259,4 +259,4 @@ WebShare status=experimental, origin_trial_feature_name=WebShare, origin_trial_os=android Worklet status=experimental ParseHTMLOnMainThread status=test -SendBeaconThrowForBlobWithNonSimpleType status=experimental \ No newline at end of file +SendBeaconThrowForBlobWithNonSimpleType status=experimental
diff --git a/third_party/WebKit/Source/platform/UserGestureIndicator.cpp b/third_party/WebKit/Source/platform/UserGestureIndicator.cpp index fccbf79..7f9a9b9 100644 --- a/third_party/WebKit/Source/platform/UserGestureIndicator.cpp +++ b/third_party/WebKit/Source/platform/UserGestureIndicator.cpp
@@ -25,6 +25,7 @@ #include "platform/UserGestureIndicator.h" +#include "platform/Histogram.h" #include "wtf/Assertions.h" #include "wtf/CurrentTime.h" @@ -45,7 +46,7 @@ m_consumableGestures++; } -bool UserGestureToken::hasGestures() { +bool UserGestureToken::hasGestures() const { return m_consumableGestures && !hasTimedOut(); } @@ -91,6 +92,27 @@ } } +// This enum is used in a histogram, so its values shouldn't change. +enum GestureMergeState { + OldTokenHasGesture = 1 << 0, + NewTokenHasGesture = 1 << 1, + GestureMergeStateEnd = 1 << 2, +}; + +// Remove this when user gesture propagation is standardized. See +// https://crbug.com/404161. +static void RecordUserGestureMerge(const UserGestureToken& oldToken, + const UserGestureToken& newToken) { + DEFINE_STATIC_LOCAL(EnumerationHistogram, gestureMergeHistogram, + ("Blink.Gesture.Merged", GestureMergeStateEnd)); + int sample = 0; + if (oldToken.hasGestures()) + sample |= OldTokenHasGesture; + if (newToken.hasGestures()) + sample |= NewTokenHasGesture; + gestureMergeHistogram.count(sample); +} + UserGestureToken* UserGestureIndicator::s_rootToken = nullptr; bool UserGestureIndicator::s_processedUserGestureSinceLoad = false; @@ -100,10 +122,12 @@ if (!isMainThread() || !m_token) return; - if (!s_rootToken) + if (!s_rootToken) { s_rootToken = m_token.get(); - else + } else { + RecordUserGestureMerge(*s_rootToken, *m_token); m_token->transferGestureTo(s_rootToken); + } s_processedUserGestureSinceLoad = true; }
diff --git a/third_party/WebKit/Source/platform/UserGestureIndicator.h b/third_party/WebKit/Source/platform/UserGestureIndicator.h index 86ec72f..41565a54 100644 --- a/third_party/WebKit/Source/platform/UserGestureIndicator.h +++ b/third_party/WebKit/Source/platform/UserGestureIndicator.h
@@ -66,7 +66,7 @@ } ~UserGestureToken() {} - bool hasGestures(); + bool hasGestures() const; void transferGestureTo(UserGestureToken*); bool consumeGesture(); void setTimeoutPolicy(TimeoutPolicy);
diff --git a/third_party/WebKit/Source/platform/blob/BlobData.cpp b/third_party/WebKit/Source/platform/blob/BlobData.cpp index f8f345e..7898a46 100644 --- a/third_party/WebKit/Source/platform/blob/BlobData.cpp +++ b/third_party/WebKit/Source/platform/blob/BlobData.cpp
@@ -74,7 +74,15 @@ } std::unique_ptr<BlobData> BlobData::create() { - return wrapUnique(new BlobData()); + return wrapUnique(new BlobData(FileCompositionStatus::NO_UNKNOWN_SIZE_FILES)); +} + +std::unique_ptr<BlobData> BlobData::createForFileWithUnknownSize( + const String& path) { + std::unique_ptr<BlobData> data = + wrapUnique(new BlobData(FileCompositionStatus::SINGLE_UNKNOWN_SIZE_FILE)); + data->m_items.append(BlobDataItem(path)); + return data; } void BlobData::detachFromCurrentThread() { @@ -93,23 +101,25 @@ void BlobData::appendData(PassRefPtr<RawData> data, long long offset, long long length) { + CHECK_EQ(m_fileComposition, FileCompositionStatus::NO_UNKNOWN_SIZE_FILES) + << "Blobs with a unknown-size file cannot have other items."; m_items.append(BlobDataItem(std::move(data), offset, length)); } -void BlobData::appendFile(const String& path) { - m_items.append(BlobDataItem(path)); -} - void BlobData::appendFile(const String& path, long long offset, long long length, double expectedModificationTime) { + CHECK_EQ(m_fileComposition, FileCompositionStatus::NO_UNKNOWN_SIZE_FILES) + << "Blobs with a unknown-size file cannot have other items."; m_items.append(BlobDataItem(path, offset, length, expectedModificationTime)); } void BlobData::appendBlob(PassRefPtr<BlobDataHandle> dataHandle, long long offset, long long length) { + CHECK_EQ(m_fileComposition, FileCompositionStatus::NO_UNKNOWN_SIZE_FILES) + << "Blobs with a unknown-size file cannot have other items."; m_items.append(BlobDataItem(std::move(dataHandle), offset, length)); } @@ -117,11 +127,15 @@ long long offset, long long length, double expectedModificationTime) { + CHECK_EQ(m_fileComposition, FileCompositionStatus::NO_UNKNOWN_SIZE_FILES) + << "Blobs with a unknown-size file cannot have other items."; m_items.append(BlobDataItem(url, offset, length, expectedModificationTime)); } void BlobData::appendText(const String& text, bool doNormalizeLineEndingsToNative) { + CHECK_EQ(m_fileComposition, FileCompositionStatus::NO_UNKNOWN_SIZE_FILES) + << "Blobs with a unknown-size file cannot have other items."; CString utf8Text = UTF8Encoding().encode(text, WTF::EntitiesForUnencodables); RefPtr<RawData> data = nullptr; Vector<char>* buffer; @@ -143,6 +157,8 @@ } void BlobData::appendBytes(const void* bytes, size_t length) { + CHECK_EQ(m_fileComposition, FileCompositionStatus::NO_UNKNOWN_SIZE_FILES) + << "Blobs with a unknown-size file cannot have other items."; if (canConsolidateData(length)) { m_items.last().data->mutableData()->append(static_cast<const char*>(bytes), length);
diff --git a/third_party/WebKit/Source/platform/blob/BlobData.h b/third_party/WebKit/Source/platform/blob/BlobData.h index 8ce648a..4e6aa56 100644 --- a/third_party/WebKit/Source/platform/blob/BlobData.h +++ b/third_party/WebKit/Source/platform/blob/BlobData.h
@@ -152,6 +152,10 @@ public: static std::unique_ptr<BlobData> create(); + // Calling append* on the returned object will check-fail. The caller can only + // have an unknown-length file if it is the only item in the blob. + static std::unique_ptr<BlobData> createForFileWithUnknownSize( + const String& path); // Detaches from current thread so that it can be passed to another thread. void detachFromCurrentThread(); @@ -163,9 +167,6 @@ void appendBytes(const void*, size_t length); void appendData(PassRefPtr<RawData>, long long offset, long long length); - // Do not use this version, please provide an offset and length - // (crbug.com/548512). - void appendFile(const String& path); void appendFile(const String& path, long long offset, long long length, @@ -187,11 +188,18 @@ private: FRIEND_TEST_ALL_PREFIXES(BlobDataTest, Consolidation); - BlobData() {} + enum class FileCompositionStatus { + SINGLE_UNKNOWN_SIZE_FILE, + NO_UNKNOWN_SIZE_FILES + }; + + explicit BlobData(FileCompositionStatus composition) + : m_fileComposition(composition) {} bool canConsolidateData(size_t length); String m_contentType; + FileCompositionStatus m_fileComposition; BlobDataItemList m_items; };
diff --git a/third_party/WebKit/Source/platform/blob/BlobDataTest.cpp b/third_party/WebKit/Source/platform/blob/BlobDataTest.cpp index 86dd7abb..f512f78 100644 --- a/third_party/WebKit/Source/platform/blob/BlobDataTest.cpp +++ b/third_party/WebKit/Source/platform/blob/BlobDataTest.cpp
@@ -13,7 +13,7 @@ TEST(BlobDataTest, Consolidation) { const size_t kMaxConsolidatedItemSizeInBytes = 15 * 1024; - BlobData data; + BlobData data(BlobData::FileCompositionStatus::NO_UNKNOWN_SIZE_FILES); const char* text1 = "abc"; const char* text2 = "def"; data.appendBytes(text1, 3u);
diff --git a/third_party/WebKit/Source/platform/fonts/FontCache.cpp b/third_party/WebKit/Source/platform/fonts/FontCache.cpp index 9756a47..7a24d76 100644 --- a/third_party/WebKit/Source/platform/fonts/FontCache.cpp +++ b/third_party/WebKit/Source/platform/fonts/FontCache.cpp
@@ -107,6 +107,29 @@ platformInit(); } + if (creationParams.creationType() == CreateFontByFamily) { +#if OS(MACOSX) + if (creationParams.family() == FontCache::legacySystemFontFamily()) { + return getFontPlatformData( + fontDescription, FontFaceCreationParams(FontFamilyNames::system_ui), + true); + } +#else + if (creationParams.family() == FontFamilyNames::system_ui) { + const AtomicString& actualFamily = FontCache::systemFontFamily(); +#if OS(LINUX) + if (actualFamily.isEmpty() || actualFamily == FontFamilyNames::system_ui) + return nullptr; +#else + DCHECK(!actualFamily.isEmpty() && + actualFamily != FontFamilyNames::system_ui); +#endif + return getFontPlatformData(fontDescription, + FontFaceCreationParams(actualFamily), true); + } +#endif + } + float size = fontDescription.effectiveFontSize(); unsigned roundedSize = size * FontCacheKey::precisionMultiplier(); FontCacheKey key = fontDescription.cacheKey(creationParams);
diff --git a/third_party/WebKit/Source/platform/fonts/FontCache.h b/third_party/WebKit/Source/platform/fonts/FontCache.h index 0176454..e984c6fd 100644 --- a/third_party/WebKit/Source/platform/fonts/FontCache.h +++ b/third_party/WebKit/Source/platform/fonts/FontCache.h
@@ -115,6 +115,15 @@ SkFontMgr* fontManager() { return m_fontManager.get(); } static void setFontManager(const sk_sp<SkFontMgr>&); +#if !OS(MACOSX) + static const AtomicString& systemFontFamily(); +#else + static const AtomicString& legacySystemFontFamily(); +#endif +#if OS(LINUX) + static void setSystemFontFamily(const char*); +#endif + #if OS(WIN) static bool antialiasedTextEnabled() { return s_antialiasedTextEnabled; } static bool lcdTextEnabled() { return s_lcdTextEnabled; }
diff --git a/third_party/WebKit/Source/platform/fonts/FontFamilyNames.in b/third_party/WebKit/Source/platform/fonts/FontFamilyNames.in index 504b7eb..4a80524 100644 --- a/third_party/WebKit/Source/platform/fonts/FontFamilyNames.in +++ b/third_party/WebKit/Source/platform/fonts/FontFamilyNames.in
@@ -8,3 +8,4 @@ -webkit-serif -webkit-pictograph -webkit-standard +system-ui
diff --git a/third_party/WebKit/Source/platform/fonts/android/FontCacheAndroid.cpp b/third_party/WebKit/Source/platform/fonts/android/FontCacheAndroid.cpp index d7c4fdf..a47fc8e 100644 --- a/third_party/WebKit/Source/platform/fonts/android/FontCacheAndroid.cpp +++ b/third_party/WebKit/Source/platform/fonts/android/FontCacheAndroid.cpp
@@ -39,6 +39,27 @@ namespace blink { +static AtomicString defaultFontFamily(SkFontMgr* fontManager) { + sk_sp<SkTypeface> typeface( + fontManager->legacyCreateTypeface(nullptr, SkFontStyle())); + SkString familyName; + typeface->getFamilyName(&familyName); + return familyName.c_str(); +} + +static AtomicString defaultFontFamily() { + if (SkFontMgr* fontManager = FontCache::fontCache()->fontManager()) + return defaultFontFamily(fontManager); + sk_sp<SkFontMgr> fm(SkFontMgr::RefDefault()); + return defaultFontFamily(fm.get()); +} + +// static +const AtomicString& FontCache::systemFontFamily() { + DEFINE_STATIC_LOCAL(AtomicString, systemFontFamily, (defaultFontFamily())); + return systemFontFamily; +} + PassRefPtr<SimpleFontData> FontCache::fallbackFontForCharacter( const FontDescription& fontDescription, UChar32 c,
diff --git a/third_party/WebKit/Source/platform/fonts/linux/FontCacheLinux.cpp b/third_party/WebKit/Source/platform/fonts/linux/FontCacheLinux.cpp index bfc61b7..7bdc2a3 100644 --- a/third_party/WebKit/Source/platform/fonts/linux/FontCacheLinux.cpp +++ b/third_party/WebKit/Source/platform/fonts/linux/FontCacheLinux.cpp
@@ -43,6 +43,22 @@ } } +static AtomicString& mutableSystemFontFamily() { + DEFINE_STATIC_LOCAL(AtomicString, systemFontFamily, ()); + return systemFontFamily; +} + +// static +const AtomicString& FontCache::systemFontFamily() { + return mutableSystemFontFamily(); +} + +// static +void FontCache::setSystemFontFamily(const char* familyName) { + DCHECK(familyName && *familyName); + mutableSystemFontFamily() = familyName; +} + void FontCache::getFontForCharacter( UChar32 c, const char* preferredLocale,
diff --git a/third_party/WebKit/Source/platform/fonts/mac/FontCacheMac.mm b/third_party/WebKit/Source/platform/fonts/mac/FontCacheMac.mm index 5956c7a7..aedc226 100644 --- a/third_party/WebKit/Source/platform/fonts/mac/FontCacheMac.mm +++ b/third_party/WebKit/Source/platform/fonts/mac/FontCacheMac.mm
@@ -61,6 +61,13 @@ const char* kColorEmojiFontMac = "Apple Color Emoji"; +// static +const AtomicString& FontCache::legacySystemFontFamily() { + DEFINE_STATIC_LOCAL(AtomicString, legacySystemFontFamily, + ("BlinkMacSystemFont")); + return legacySystemFontFamily; +} + static void invalidateFontCache() { if (!isMainThread()) { Platform::current()->mainThread()->getWebTaskRunner()->postTask(
diff --git a/third_party/WebKit/Source/platform/fonts/mac/FontFamilyMatcherMac.h b/third_party/WebKit/Source/platform/fonts/mac/FontFamilyMatcherMac.h index a1f6ec6..2b1d28e 100644 --- a/third_party/WebKit/Source/platform/fonts/mac/FontFamilyMatcherMac.h +++ b/third_party/WebKit/Source/platform/fonts/mac/FontFamilyMatcherMac.h
@@ -29,11 +29,12 @@ #include "platform/PlatformExport.h" #include "platform/fonts/FontTraits.h" +#include "wtf/Forward.h" #include <AppKit/NSFontManager.h> namespace blink { -PLATFORM_EXPORT NSFont* MatchNSFontFamily(NSString* desiredFamily, +PLATFORM_EXPORT NSFont* MatchNSFontFamily(const AtomicString& desiredFamily, NSFontTraitMask desiredTraits, FontWeight desiredWeight, float size);
diff --git a/third_party/WebKit/Source/platform/fonts/mac/FontFamilyMatcherMac.mm b/third_party/WebKit/Source/platform/fonts/mac/FontFamilyMatcherMac.mm index cef19ba..fb45882 100644 --- a/third_party/WebKit/Source/platform/fonts/mac/FontFamilyMatcherMac.mm +++ b/third_party/WebKit/Source/platform/fonts/mac/FontFamilyMatcherMac.mm
@@ -32,6 +32,7 @@ #import <AppKit/AppKit.h> #import <Foundation/Foundation.h> #import <math.h> +#include "platform/fonts/FontCache.h" #include "platform/fonts/FontTraits.h" #include "platform/LayoutTestSupport.h" #include "platform/mac/VersionUtilMac.h" @@ -125,11 +126,12 @@ // exact match comparing the desiredFamily to the PostScript name of the // installed fonts. If that fails we then do a search based on the family // names of the installed fonts. -NSFont* MatchNSFontFamily(NSString* desiredFamily, +NSFont* MatchNSFontFamily(const AtomicString& desiredFamilyString, NSFontTraitMask desiredTraits, FontWeight desiredWeight, float size) { - if ([desiredFamily isEqualToString:@"BlinkMacSystemFont"]) { + DCHECK_NE(desiredFamilyString, FontCache::legacySystemFontFamily()); + if (desiredFamilyString == FontFamilyNames::system_ui) { // On OSX 10.9, the default system font depends on the SDK version. When // compiled against the OSX 10.10 SDK, the font is .LucidaGrandeUI. When // compiled against the OSX 10.6 SDK, the font is Lucida Grande. Layout @@ -163,6 +165,7 @@ return font; } + NSString* desiredFamily = desiredFamilyString; NSFontManager* fontManager = [NSFontManager sharedFontManager]; // Do a simple case insensitive search for a matching font family.
diff --git a/third_party/WebKit/Source/platform/fonts/mac/FontFamilyMatcherMacTest.mm b/third_party/WebKit/Source/platform/fonts/mac/FontFamilyMatcherMacTest.mm index 5b5e72eb..66efa39a 100644 --- a/third_party/WebKit/Source/platform/fonts/mac/FontFamilyMatcherMacTest.mm +++ b/third_party/WebKit/Source/platform/fonts/mac/FontFamilyMatcherMacTest.mm
@@ -4,6 +4,8 @@ #import "platform/fonts/mac/FontFamilyMatcherMac.h" +#include "platform/FontFamilyNames.h" + #include <AppKit/AppKit.h> #include <gtest/gtest.h> @@ -17,7 +19,8 @@ void TestSystemFontContainsString(FontWeight desiredWeight, NSString* substring) { - NSFont* font = MatchNSFontFamily(@"BlinkMacSystemFont", 0, desiredWeight, 11); + NSFont* font = + MatchNSFontFamily(FontFamilyNames::system_ui, 0, desiredWeight, 11); EXPECT_TRUE([font.description containsString:substring]); }
diff --git a/third_party/WebKit/Source/platform/fonts/skia/FontCacheSkia.cpp b/third_party/WebKit/Source/platform/fonts/skia/FontCacheSkia.cpp index 16678e7..f163cdd 100644 --- a/third_party/WebKit/Source/platform/fonts/skia/FontCacheSkia.cpp +++ b/third_party/WebKit/Source/platform/fonts/skia/FontCacheSkia.cpp
@@ -211,6 +211,7 @@ #endif AtomicString family = creationParams.family(); + DCHECK_NE(family, FontFamilyNames::system_ui); // If we're creating a fallback font (e.g. "-webkit-monospace"), convert the // name into the fallback name (like "monospace") that fontconfig understands. if (!family.length() || family.startsWith("-webkit-")) {
diff --git a/third_party/WebKit/Source/platform/fonts/win/FontCacheSkiaWin.cpp b/third_party/WebKit/Source/platform/fonts/win/FontCacheSkiaWin.cpp index f29a489..979513d 100644 --- a/third_party/WebKit/Source/platform/fonts/win/FontCacheSkiaWin.cpp +++ b/third_party/WebKit/Source/platform/fonts/win/FontCacheSkiaWin.cpp
@@ -76,6 +76,11 @@ } // static +const AtomicString& FontCache::systemFontFamily() { + return menuFontFamily(); +} + +// static void FontCache::setMenuFontMetrics(const wchar_t* familyName, int32_t fontHeight) { s_menuFontFamilyName = new AtomicString(familyName);
diff --git a/third_party/WebKit/Source/platform/heap/PersistentNode.cpp b/third_party/WebKit/Source/platform/heap/PersistentNode.cpp index cb47bcf..30e077e4f 100644 --- a/third_party/WebKit/Source/platform/heap/PersistentNode.cpp +++ b/third_party/WebKit/Source/platform/heap/PersistentNode.cpp
@@ -117,7 +117,9 @@ slots = slots->m_next; } } - ASSERT(persistentCount == m_persistentCount); +#if DCHECK_IS_ON() + DCHECK_EQ(persistentCount, m_persistentCount); +#endif } bool CrossThreadPersistentRegion::shouldTracePersistentNode( @@ -173,4 +175,25 @@ } } +#if defined(ADDRESS_SANITIZER) +void CrossThreadPersistentRegion::unpoisonCrossThreadPersistents() { + MutexLocker lock(m_mutex); + int persistentCount = 0; + for (PersistentNodeSlots* slots = m_persistentRegion->m_slots; slots; + slots = slots->m_next) { + for (int i = 0; i < PersistentNodeSlots::slotCount; ++i) { + const PersistentNode& node = slots->m_slot[i]; + if (!node.isUnused()) { + ASAN_UNPOISON_MEMORY_REGION(node.self(), + sizeof(CrossThreadPersistent<void*>)); + ++persistentCount; + } + } + } +#if DCHECK_IS_ON() + DCHECK_EQ(persistentCount, m_persistentRegion->m_persistentCount); +#endif +} +#endif + } // namespace blink
diff --git a/third_party/WebKit/Source/platform/heap/PersistentNode.h b/third_party/WebKit/Source/platform/heap/PersistentNode.h index 0e518a39..ae2f683 100644 --- a/third_party/WebKit/Source/platform/heap/PersistentNode.h +++ b/third_party/WebKit/Source/platform/heap/PersistentNode.h
@@ -107,7 +107,7 @@ PersistentRegion() : m_freeListHead(nullptr), m_slots(nullptr) -#if ENABLE(ASSERT) +#if DCHECK_IS_ON() , m_persistentCount(0) #endif @@ -116,7 +116,7 @@ ~PersistentRegion(); PersistentNode* allocatePersistentNode(void* self, TraceCallback trace) { -#if ENABLE(ASSERT) +#if DCHECK_IS_ON() ++m_persistentCount; #endif if (UNLIKELY(!m_freeListHead)) @@ -133,7 +133,7 @@ ASSERT(m_persistentCount > 0); persistentNode->setFreeListNext(m_freeListHead); m_freeListHead = persistentNode; -#if ENABLE(ASSERT) +#if DCHECK_IS_ON() --m_persistentCount; #endif } @@ -157,7 +157,7 @@ PersistentNode* m_freeListHead; PersistentNodeSlots* m_slots; -#if ENABLE(ASSERT) +#if DCHECK_IS_ON() int m_persistentCount; #endif }; @@ -224,6 +224,10 @@ NO_SANITIZE_ADDRESS static bool shouldTracePersistentNode(Visitor*, PersistentNode*); +#if defined(ADDRESS_SANITIZER) + void unpoisonCrossThreadPersistents(); +#endif + private: friend class LockScope;
diff --git a/third_party/WebKit/Source/platform/heap/ThreadState.cpp b/third_party/WebKit/Source/platform/heap/ThreadState.cpp index ce2ba90..7c0d566a 100644 --- a/third_party/WebKit/Source/platform/heap/ThreadState.cpp +++ b/third_party/WebKit/Source/platform/heap/ThreadState.cpp
@@ -1139,10 +1139,18 @@ // Poisoning all unmarked objects in the other arenas. for (int i = 1; i < BlinkGC::NumberOfArenas; i++) m_arenas[i]->poisonArena(); + // CrossThreadPersistents in unmarked objects may be accessed from other + // threads (e.g. in CrossThreadPersistentRegion::shouldTracePersistent) and + // that would be fine. + ProcessHeap::crossThreadPersistentRegion().unpoisonCrossThreadPersistents(); } void ThreadState::poisonEagerArena() { m_arenas[BlinkGC::EagerSweepArenaIndex]->poisonArena(); + // CrossThreadPersistents in unmarked objects may be accessed from other + // threads (e.g. in CrossThreadPersistentRegion::shouldTracePersistent) and + // that would be fine. + ProcessHeap::crossThreadPersistentRegion().unpoisonCrossThreadPersistents(); } #endif
diff --git a/third_party/WebKit/Source/platform/image-decoders/jpeg/JPEGImageDecoder.cpp b/third_party/WebKit/Source/platform/image-decoders/jpeg/JPEGImageDecoder.cpp index d55252d9..30ace15 100644 --- a/third_party/WebKit/Source/platform/image-decoders/jpeg/JPEGImageDecoder.cpp +++ b/third_party/WebKit/Source/platform/image-decoders/jpeg/JPEGImageDecoder.cpp
@@ -414,14 +414,6 @@ case JCS_RGB: // libjpeg can convert GRAYSCALE image pixels to RGB. m_info.out_color_space = rgbOutputColorSpace(); -#if defined(TURBO_JPEG_RGB_SWIZZLE) - if (m_info.saw_JFIF_marker) - break; - // FIXME: Swizzle decoding does not support Adobe transform=0 - // images (yet), so revert to using JSC_RGB in that case. - if (m_info.saw_Adobe_marker && !m_info.Adobe_transform) - m_info.out_color_space = JCS_RGB; -#endif break; case JCS_CMYK: case JCS_YCCK:
diff --git a/third_party/WebKit/Source/platform/network/HTTPNames.in b/third_party/WebKit/Source/platform/network/HTTPNames.in index a07efff..5229a404 100644 --- a/third_party/WebKit/Source/platform/network/HTTPNames.in +++ b/third_party/WebKit/Source/platform/network/HTTPNames.in
@@ -16,6 +16,7 @@ Access-Control-Request-External Access-Control-Request-Headers Access-Control-Request-Method +Allow-CSP-From Cache-Control Content-DPR Content-Disposition
diff --git a/third_party/WebKit/Source/platform/network/ResourceResponse.cpp b/third_party/WebKit/Source/platform/network/ResourceResponse.cpp index 86ecc50..0e87da5 100644 --- a/third_party/WebKit/Source/platform/network/ResourceResponse.cpp +++ b/third_party/WebKit/Source/platform/network/ResourceResponse.cpp
@@ -617,8 +617,9 @@ m_downloadedFileHandle.clear(); return; } - std::unique_ptr<BlobData> blobData = BlobData::create(); - blobData->appendFile(m_downloadedFilePath); + // TODO(dmurph): Investigate whether we need the mimeType on this blob. + std::unique_ptr<BlobData> blobData = + BlobData::createForFileWithUnknownSize(m_downloadedFilePath); blobData->detachFromCurrentThread(); m_downloadedFileHandle = BlobDataHandle::create(std::move(blobData), -1); }
diff --git a/third_party/WebKit/Source/platform/scheduler/base/task_queue_impl.cc b/third_party/WebKit/Source/platform/scheduler/base/task_queue_impl.cc index f802607..100b3c7e 100644 --- a/third_party/WebKit/Source/platform/scheduler/base/task_queue_impl.cc +++ b/third_party/WebKit/Source/platform/scheduler/base/task_queue_impl.cc
@@ -518,17 +518,15 @@ DCHECK(should_notify_observers_); if (main_thread_only().blame_context) main_thread_only().blame_context->Enter(); - FOR_EACH_OBSERVER(base::MessageLoop::TaskObserver, - main_thread_only().task_observers, - WillProcessTask(pending_task)); + for (auto& observer : main_thread_only().task_observers) + observer.WillProcessTask(pending_task); } void TaskQueueImpl::NotifyDidProcessTask( const base::PendingTask& pending_task) { DCHECK(should_notify_observers_); - FOR_EACH_OBSERVER(base::MessageLoop::TaskObserver, - main_thread_only().task_observers, - DidProcessTask(pending_task)); + for (auto& observer : main_thread_only().task_observers) + observer.DidProcessTask(pending_task); if (main_thread_only().blame_context) main_thread_only().blame_context->Leave(); }
diff --git a/third_party/WebKit/Source/platform/scheduler/base/task_queue_manager.cc b/third_party/WebKit/Source/platform/scheduler/base/task_queue_manager.cc index 477c37d..fe875ae 100644 --- a/third_party/WebKit/Source/platform/scheduler/base/task_queue_manager.cc +++ b/third_party/WebKit/Source/platform/scheduler/base/task_queue_manager.cc
@@ -261,10 +261,11 @@ if (!delegate_->IsNested() && task_start_time != base::TimeTicks()) { // Only report top level task durations. base::TimeTicks task_end_time = lazy_now.Now(); - FOR_EACH_OBSERVER( - TaskTimeObserver, task_time_observers_, - ReportTaskTime(task_queue, MonotonicTimeInSeconds(task_start_time), - MonotonicTimeInSeconds(task_end_time))); + for (auto& observer : task_time_observers_) { + observer.ReportTaskTime(task_queue, + MonotonicTimeInSeconds(task_start_time), + MonotonicTimeInSeconds(task_end_time)); + } task_start_time = task_end_time; } @@ -342,8 +343,8 @@ TRACE_TASK_EXECUTION("TaskQueueManager::ProcessTaskFromWorkQueue", pending_task); if (queue->GetShouldNotifyObservers()) { - FOR_EACH_OBSERVER(base::MessageLoop::TaskObserver, task_observers_, - WillProcessTask(pending_task)); + for (auto& observer : task_observers_) + observer.WillProcessTask(pending_task); queue->NotifyWillProcessTask(pending_task); } TRACE_EVENT1(tracing_category_, "TaskQueueManager::RunTask", "queue", @@ -363,8 +364,8 @@ currently_executing_task_queue_ = prev_executing_task_queue; if (queue->GetShouldNotifyObservers()) { - FOR_EACH_OBSERVER(base::MessageLoop::TaskObserver, task_observers_, - DidProcessTask(pending_task)); + for (auto& observer : task_observers_) + observer.DidProcessTask(pending_task); queue->NotifyDidProcessTask(pending_task); }
diff --git a/third_party/WebKit/Source/platform/scheduler/renderer/task_queue_throttler.cc b/third_party/WebKit/Source/platform/scheduler/renderer/task_queue_throttler.cc index 9831427..63ecf66 100644 --- a/third_party/WebKit/Source/platform/scheduler/renderer/task_queue_throttler.cc +++ b/third_party/WebKit/Source/platform/scheduler/renderer/task_queue_throttler.cc
@@ -23,7 +23,9 @@ namespace scheduler { namespace { -const int kMaxBudgetLevelInSeconds = 1; +constexpr base::TimeDelta kMaxBudgetLevel = base::TimeDelta::FromSeconds(1); +constexpr base::TimeDelta kMaxThrottlingDuration = + base::TimeDelta::FromMinutes(1); base::Optional<base::TimeTicks> NextTaskRunTime(LazyNow* lazy_now, TaskQueue* queue) { @@ -70,10 +72,13 @@ TaskQueueThrottler::TimeBudgetPool::TimeBudgetPool( const char* name, TaskQueueThrottler* task_queue_throttler, - base::TimeTicks now) + base::TimeTicks now, + base::Optional<base::TimeDelta> max_budget_level, + base::Optional<base::TimeDelta> max_throttling_duration) : name_(name), task_queue_throttler_(task_queue_throttler), - max_budget_level_(base::TimeDelta::FromSeconds(kMaxBudgetLevelInSeconds)), + max_budget_level_(max_budget_level), + max_throttling_duration_(max_throttling_duration), last_checkpoint_(now), cpu_percentage_(1), is_enabled_(true) {} @@ -84,6 +89,7 @@ double cpu_percentage) { Advance(now); cpu_percentage_ = cpu_percentage; + EnforceBudgetLevelRestrictions(); } void TaskQueueThrottler::TimeBudgetPool::AddQueue(base::TimeTicks now, @@ -172,9 +178,14 @@ } void TaskQueueThrottler::TimeBudgetPool::RecordTaskRunTime( - base::TimeDelta task_run_time) { - if (is_enabled_) - current_budget_level_ -= task_run_time; + base::TimeTicks start_time, + base::TimeTicks end_time) { + DCHECK_LE(start_time, end_time); + Advance(end_time); + if (is_enabled_) { + current_budget_level_ -= (end_time - start_time); + EnforceBudgetLevelRestrictions(); + } } const char* TaskQueueThrottler::TimeBudgetPool::Name() const { @@ -206,9 +217,8 @@ void TaskQueueThrottler::TimeBudgetPool::Advance(base::TimeTicks now) { if (now > last_checkpoint_) { if (is_enabled_) { - current_budget_level_ = std::min( - current_budget_level_ + cpu_percentage_ * (now - last_checkpoint_), - max_budget_level_); + current_budget_level_ += cpu_percentage_ * (now - last_checkpoint_); + EnforceBudgetLevelRestrictions(); } last_checkpoint_ = now; } @@ -226,6 +236,21 @@ } } +void TaskQueueThrottler::TimeBudgetPool::EnforceBudgetLevelRestrictions() { + if (max_budget_level_) { + current_budget_level_ = + std::min(current_budget_level_, max_budget_level_.value()); + } + if (max_throttling_duration_) { + // Current budget level may be negative. + current_budget_level_ = + std::max(current_budget_level_, + -max_throttling_duration_.value() * cpu_percentage_); + } +} + +// TODO(altimin): Control max_budget_level and max_throttling_duration +// from Finch. TaskQueueThrottler::TaskQueueThrottler( RendererSchedulerImpl* renderer_scheduler, const char* tracing_category) @@ -234,6 +259,8 @@ tick_clock_(renderer_scheduler->tick_clock()), tracing_category_(tracing_category), time_domain_(new ThrottledTimeDomain(this, tracing_category)), + max_budget_level_(kMaxBudgetLevel), + max_throttling_duration_(kMaxThrottlingDuration), virtual_time_(false), weak_factory_(this) { pump_throttled_tasks_closure_.Reset(base::Bind( @@ -503,7 +530,8 @@ TaskQueueThrottler::TimeBudgetPool* TaskQueueThrottler::CreateTimeBudgetPool( const char* name) { TimeBudgetPool* time_budget_pool = - new TimeBudgetPool(name, this, tick_clock_->NowTicks()); + new TimeBudgetPool(name, this, tick_clock_->NowTicks(), max_budget_level_, + max_throttling_duration_); time_budget_pools_[time_budget_pool] = base::WrapUnique(time_budget_pool); return time_budget_pool; } @@ -518,7 +546,7 @@ if (!time_budget_pool) return; - time_budget_pool->RecordTaskRunTime(end_time - start_time); + time_budget_pool->RecordTaskRunTime(start_time, end_time); if (!time_budget_pool->HasEnoughBudgetToRun(end_time)) time_budget_pool->BlockThrottledQueues(end_time); }
diff --git a/third_party/WebKit/Source/platform/scheduler/renderer/task_queue_throttler.h b/third_party/WebKit/Source/platform/scheduler/renderer/task_queue_throttler.h index d184817..b458382 100644 --- a/third_party/WebKit/Source/platform/scheduler/renderer/task_queue_throttler.h +++ b/third_party/WebKit/Source/platform/scheduler/renderer/task_queue_throttler.h
@@ -69,7 +69,8 @@ // is scheduled. void RemoveQueue(base::TimeTicks now, TaskQueue* queue); - void RecordTaskRunTime(base::TimeDelta task_run_time); + void RecordTaskRunTime(base::TimeTicks start_time, + base::TimeTicks end_time); // Enables this time budget pool. Queues from this pool will be // throttled based on their run time. @@ -95,7 +96,9 @@ TimeBudgetPool(const char* name, TaskQueueThrottler* task_queue_throttler, - base::TimeTicks now); + base::TimeTicks now, + base::Optional<base::TimeDelta> max_budget_level, + base::Optional<base::TimeDelta> max_throttling_duration); bool HasEnoughBudgetToRun(base::TimeTicks now); base::TimeTicks GetNextAllowedRunTime(); @@ -111,12 +114,28 @@ // Disable all associated throttled queues. void BlockThrottledQueues(base::TimeTicks now); + // Increase |current_budget_level_| to satisfy max throttling duration + // condition if necessary. + // Decrease |current_budget_level_| to satisfy max budget level + // condition if necessary. + void EnforceBudgetLevelRestrictions(); + const char* name_; // NOT OWNED TaskQueueThrottler* task_queue_throttler_; + // Max budget level which we can accrue. + // Tasks will be allowed to run for this time before being throttled + // after a very long period of inactivity. + base::Optional<base::TimeDelta> max_budget_level_; + // Max throttling duration places a lower limit on time budget level, + // ensuring that one long task does not cause extremely long throttling. + // Note that this is not the guarantee that every task will run + // after desired run time + max throttling duration, but a guarantee + // that at least one task will be run every max_throttling_duration. + base::Optional<base::TimeDelta> max_throttling_duration_; + base::TimeDelta current_budget_level_; - base::TimeDelta max_budget_level_; base::TimeTicks last_checkpoint_; double cpu_percentage_; bool is_enabled_; @@ -236,6 +255,9 @@ const char* tracing_category_; // NOT OWNED std::unique_ptr<ThrottledTimeDomain> time_domain_; + base::Optional<base::TimeDelta> max_budget_level_; + base::Optional<base::TimeDelta> max_throttling_duration_; + CancelableClosureHolder pump_throttled_tasks_closure_; base::Optional<base::TimeTicks> pending_pump_throttled_tasks_runtime_; bool virtual_time_;
diff --git a/third_party/WebKit/Source/platform/scheduler/renderer/task_queue_throttler_unittest.cc b/third_party/WebKit/Source/platform/scheduler/renderer/task_queue_throttler_unittest.cc index caf64ea..8551647 100644 --- a/third_party/WebKit/Source/platform/scheduler/renderer/task_queue_throttler_unittest.cc +++ b/third_party/WebKit/Source/platform/scheduler/renderer/task_queue_throttler_unittest.cc
@@ -502,7 +502,8 @@ EXPECT_EQ(time_zero, pool->GetNextAllowedRunTime()); // Run an expensive task and make sure that we're throttled. - pool->RecordTaskRunTime(base::TimeDelta::FromMilliseconds(100)); + pool->RecordTaskRunTime(time_zero, + time_zero + base::TimeDelta::FromMilliseconds(100)); EXPECT_FALSE(pool->HasEnoughBudgetToRun( time_zero + base::TimeDelta::FromMilliseconds(500))); @@ -514,10 +515,11 @@ // Run a cheap task and make sure that it doesn't affect anything. EXPECT_TRUE(pool->HasEnoughBudgetToRun( time_zero + base::TimeDelta::FromMilliseconds(2000))); - pool->RecordTaskRunTime(base::TimeDelta::FromMilliseconds(20)); + pool->RecordTaskRunTime(time_zero + base::TimeDelta::FromMilliseconds(2000), + time_zero + base::TimeDelta::FromMilliseconds(2020)); EXPECT_TRUE(pool->HasEnoughBudgetToRun( - time_zero + base::TimeDelta::FromMilliseconds(2000))); - EXPECT_EQ(time_zero + base::TimeDelta::FromMilliseconds(2000), + time_zero + base::TimeDelta::FromMilliseconds(2020))); + EXPECT_EQ(time_zero + base::TimeDelta::FromMilliseconds(2020), pool->GetNextAllowedRunTime()); pool->Close(); @@ -803,5 +805,33 @@ base::TimeDelta::FromMilliseconds(105))); } +TEST_F(TaskQueueThrottlerTest, MaxThrottlingDuration) { + std::vector<base::TimeTicks> run_times; + + TaskQueueThrottler::TimeBudgetPool* pool = + task_queue_throttler_->CreateTimeBudgetPool("test"); + + pool->SetTimeBudget(base::TimeTicks(), 0.001); + pool->AddQueue(base::TimeTicks(), timer_queue_.get()); + + task_queue_throttler_->IncreaseThrottleRefCount(timer_queue_.get()); + + for (int i = 0; i < 5; ++i) { + timer_queue_->PostDelayedTask( + FROM_HERE, base::Bind(&ExpensiveTestTask, &run_times, clock_.get()), + base::TimeDelta::FromMilliseconds(200)); + } + + mock_task_runner_->RunUntilIdle(); + + EXPECT_THAT( + run_times, + ElementsAre(base::TimeTicks() + base::TimeDelta::FromSeconds(1), + base::TimeTicks() + base::TimeDelta::FromSeconds(62), + base::TimeTicks() + base::TimeDelta::FromSeconds(123), + base::TimeTicks() + base::TimeDelta::FromSeconds(184), + base::TimeTicks() + base::TimeDelta::FromSeconds(245))); +} + } // namespace scheduler } // namespace blink
diff --git a/third_party/WebKit/Source/platform/weborigin/SecurityOrigin.cpp b/third_party/WebKit/Source/platform/weborigin/SecurityOrigin.cpp index c60fbfa..b94f3b24 100644 --- a/third_party/WebKit/Source/platform/weborigin/SecurityOrigin.cpp +++ b/third_party/WebKit/Source/platform/weborigin/SecurityOrigin.cpp
@@ -40,6 +40,7 @@ #include "wtf/PtrUtil.h" #include "wtf/StdLibExtras.h" #include "wtf/text/StringBuilder.h" +#include "wtf/text/StringUTF8Adaptor.h" #include <memory> namespace blink { @@ -208,8 +209,7 @@ extractInnerURL(url).protocol())) return true; - if (SecurityPolicy::isOriginWhiteListedTrustworthy( - *SecurityOrigin::create(url).get())) + if (SecurityPolicy::isUrlWhiteListedTrustworthy(url)) return true; return false; @@ -387,7 +387,9 @@ } bool SecurityOrigin::isLocalhost() const { - // TODO(mkwst): Update this to call into net::IsLocalhost. + // Note: net::isLocalhost has looser checks which allow uppercase hosts, as + // well as hosts like "a.localhost". The net code is also less optimized and + // slower (mainly string and vector allocations). if (m_host == "localhost") return true; @@ -395,15 +397,15 @@ return true; // Test if m_host matches 127.0.0.1/8 - ASSERT(m_host.containsOnlyASCII()); - CString hostAscii = m_host.ascii(); + DCHECK(m_host.containsOnlyASCII()); + StringUTF8Adaptor utf8(m_host); Vector<uint8_t, 4> ipNumber; ipNumber.resize(4); int numComponents; - url::Component hostComponent(0, hostAscii.length()); + url::Component hostComponent(0, utf8.length()); url::CanonHostInfo::Family family = url::IPv4AddressToNumber( - hostAscii.data(), hostComponent, &(ipNumber)[0], &numComponents); + utf8.data(), hostComponent, &(ipNumber)[0], &numComponents); if (family != url::CanonHostInfo::IPV4) return false; return ipNumber[0] == 127;
diff --git a/third_party/WebKit/Source/platform/weborigin/SecurityPolicy.cpp b/third_party/WebKit/Source/platform/weborigin/SecurityPolicy.cpp index f52e848..32bf96b 100644 --- a/third_party/WebKit/Source/platform/weborigin/SecurityPolicy.cpp +++ b/third_party/WebKit/Source/platform/weborigin/SecurityPolicy.cpp
@@ -202,11 +202,20 @@ bool SecurityPolicy::isOriginWhiteListedTrustworthy( const SecurityOrigin& origin) { - if (origin.isUnique()) + // Early return if there are no whitelisted origins to avoid unnecessary + // allocations, copies, and frees. + if (origin.isUnique() || trustworthyOriginSet().isEmpty()) return false; return trustworthyOriginSet().contains(origin.toRawString()); } +bool SecurityPolicy::isUrlWhiteListedTrustworthy(const KURL& url) { + // Early return to avoid initializing the SecurityOrigin. + if (trustworthyOriginSet().isEmpty()) + return false; + return isOriginWhiteListedTrustworthy(*SecurityOrigin::create(url).get()); +} + bool SecurityPolicy::isAccessWhiteListed(const SecurityOrigin* activeOrigin, const SecurityOrigin* targetOrigin) { if (OriginAccessWhiteList* list =
diff --git a/third_party/WebKit/Source/platform/weborigin/SecurityPolicy.h b/third_party/WebKit/Source/platform/weborigin/SecurityPolicy.h index dd13310df..6ff5bc4e 100644 --- a/third_party/WebKit/Source/platform/weborigin/SecurityPolicy.h +++ b/third_party/WebKit/Source/platform/weborigin/SecurityPolicy.h
@@ -78,6 +78,7 @@ static void addOriginTrustworthyWhiteList(PassRefPtr<SecurityOrigin>); static bool isOriginWhiteListedTrustworthy(const SecurityOrigin&); + static bool isUrlWhiteListedTrustworthy(const KURL&); static bool referrerPolicyFromString(const String& policy, ReferrerPolicy* result);
diff --git a/third_party/WebKit/Source/web/BUILD.gn b/third_party/WebKit/Source/web/BUILD.gn index df66130..ae2aa7c 100644 --- a/third_party/WebKit/Source/web/BUILD.gn +++ b/third_party/WebKit/Source/web/BUILD.gn
@@ -201,6 +201,7 @@ "WebMediaDeviceChangeObserver.cpp", "WebMediaDevicesRequest.cpp", "WebMediaStreamRegistry.cpp", + "WebMemoryStatistics.cpp", "WebMetaElement.cpp", "WebNetworkStateNotifier.cpp", "WebNode.cpp",
diff --git a/third_party/WebKit/Source/web/ContextMenuClientImpl.cpp b/third_party/WebKit/Source/web/ContextMenuClientImpl.cpp index efa6a0b9..338a45c 100644 --- a/third_party/WebKit/Source/web/ContextMenuClientImpl.cpp +++ b/third_party/WebKit/Source/web/ContextMenuClientImpl.cpp
@@ -302,14 +302,10 @@ data.frameHistoryItem = WebHistoryItem(historyItem); } + // HitTestResult::isSelected() ensures clean layout by performing a hit test. if (r.isSelected()) { if (!isHTMLInputElement(*r.innerNode()) || toHTMLInputElement(r.innerNode())->type() != InputTypeNames::password) { - // TODO(xiaochengh): Use of updateStyleAndLayoutIgnorePendingStylesheets - // needs to be audited. See http://crbug.com/590369 for more details. - // Plain text extraction requires clean layout. - selectedFrame->document()->updateStyleAndLayoutIgnorePendingStylesheets(); - data.selectedText = selectedFrame->selectedText().stripWhiteSpace(); } }
diff --git a/third_party/WebKit/Source/web/WebLocalFrameImpl.cpp b/third_party/WebKit/Source/web/WebLocalFrameImpl.cpp index 2c3891b..efe1fe5 100644 --- a/third_party/WebKit/Source/web/WebLocalFrameImpl.cpp +++ b/third_party/WebKit/Source/web/WebLocalFrameImpl.cpp
@@ -1210,9 +1210,6 @@ // needs to be audited. see http://crbug.com/590369 for more details. frame()->document()->updateStyleAndLayoutIgnorePendingStylesheets(); - DocumentLifecycle::DisallowTransitionScope disallowTransition( - frame()->document()->lifecycle()); - frame()->selection().setSelectedRange( webRange.createEphemeralRange(frame()), VP_DEFAULT_AFFINITY, SelectionDirectionalMode::NonDirectional, NotUserTriggered); @@ -1331,6 +1328,11 @@ plugin->deleteSurroundingText(before, after); return; } + + // TODO(editing-dev): The use of updateStyleAndLayoutIgnorePendingStylesheets + // needs to be audited. See http://crbug.com/590369 for more details. + frame()->document()->updateStyleAndLayoutIgnorePendingStylesheets(); + frame()->inputMethodController().deleteSurroundingText(before, after); }
diff --git a/third_party/WebKit/Source/web/WebMemoryStatistics.cpp b/third_party/WebKit/Source/web/WebMemoryStatistics.cpp new file mode 100644 index 0000000..a12b65d --- /dev/null +++ b/third_party/WebKit/Source/web/WebMemoryStatistics.cpp
@@ -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. + +#include "public/web/WebMemoryStatistics.h" + +#include "platform/heap/Heap.h" +#include "wtf/allocator/Partitions.h" + +namespace blink { + +namespace { + +class LightPartitionStatsDumperImpl : public WTF::PartitionStatsDumper { + public: + LightPartitionStatsDumperImpl() : m_totalActiveBytes(0) {} + + void partitionDumpTotals( + const char* partitionName, + const WTF::PartitionMemoryStats* memoryStats) override { + m_totalActiveBytes += memoryStats->totalActiveBytes; + } + + void partitionsDumpBucketStats( + const char* partitionName, + const WTF::PartitionBucketMemoryStats*) override {} + + size_t totalActiveBytes() const { return m_totalActiveBytes; } + + private: + size_t m_totalActiveBytes; +}; + +} // namespace + +WebMemoryStatistics WebMemoryStatistics::Get() { + LightPartitionStatsDumperImpl dumper; + WebMemoryStatistics statistics; + + WTF::Partitions::dumpMemoryStats(true, &dumper); + statistics.partitionAllocTotalAllocatedBytes = dumper.totalActiveBytes(); + + statistics.blinkGCTotalAllocatedBytes = + ProcessHeap::totalAllocatedObjectSize() + + ProcessHeap::totalMarkedObjectSize(); + return statistics; +} + +} // namespace blink
diff --git a/third_party/WebKit/Source/web/WebPluginContainerImpl.cpp b/third_party/WebKit/Source/web/WebPluginContainerImpl.cpp index a971232..c707176e 100644 --- a/third_party/WebKit/Source/web/WebPluginContainerImpl.cpp +++ b/third_party/WebKit/Source/web/WebPluginContainerImpl.cpp
@@ -467,8 +467,9 @@ return WebString(); if (!m_element->document().contentSecurityPolicy()->allowJavaScriptURLs( - m_element->document().url(), OrdinalNumber())) + m_element, m_element->document().url(), OrdinalNumber())) { return WebString(); + } const KURL& kurl = url; DCHECK(kurl.protocolIs("javascript"));
diff --git a/third_party/WebKit/Source/web/WebSurroundingText.cpp b/third_party/WebKit/Source/web/WebSurroundingText.cpp index c2399fa..4972517 100644 --- a/third_party/WebKit/Source/web/WebSurroundingText.cpp +++ b/third_party/WebKit/Source/web/WebSurroundingText.cpp
@@ -80,6 +80,12 @@ } WebString WebSurroundingText::textContent() const { + DCHECK(m_private->document()); + + // TODO(editing-dev): The use of updateStyleAndLayoutIgnorePendingStylesheets + // needs to be audited. See http://crbug.com/590369 for more details. + m_private->document()->updateStyleAndLayoutIgnorePendingStylesheets(); + return m_private->content(); }
diff --git a/third_party/WebKit/public/BUILD.gn b/third_party/WebKit/public/BUILD.gn index 44d66f9e..4987365 100644 --- a/third_party/WebKit/public/BUILD.gn +++ b/third_party/WebKit/public/BUILD.gn
@@ -493,6 +493,7 @@ "web/WebMediaDevicesRequest.h", "web/WebMediaPlayerAction.h", "web/WebMediaStreamRegistry.h", + "web/WebMemoryStatistics.h", "web/WebMenuItemInfo.h", "web/WebMetaElement.h", "web/WebNavigationPolicy.h",
diff --git a/third_party/WebKit/public/platform/modules/notifications/WebNotificationDelegate.h b/third_party/WebKit/public/platform/modules/notifications/WebNotificationDelegate.h index 319d0d3..2ca0846d 100644 --- a/third_party/WebKit/public/platform/modules/notifications/WebNotificationDelegate.h +++ b/third_party/WebKit/public/platform/modules/notifications/WebNotificationDelegate.h
@@ -7,15 +7,16 @@ namespace blink { +class WebString; + // A delegate through which the embedder can trigger events on a Document-bound // Web Notifications object. Service Worker-bound Web Notifications will not // have a delegate, as their events will be fired on a Service Worker instead. class WebNotificationDelegate { public: - virtual void dispatchClickEvent() = 0; - virtual void dispatchShowEvent() = 0; - virtual void dispatchErrorEvent() = 0; - virtual void dispatchCloseEvent() = 0; + virtual void didShowNotification(const WebString& notificationId) = 0; + virtual void didClickNotification() = 0; + virtual void didCloseNotification() = 0; }; } // namespace blink
diff --git a/third_party/WebKit/public/platform/modules/notifications/WebNotificationManager.h b/third_party/WebKit/public/platform/modules/notifications/WebNotificationManager.h index 20aa454a..3496f6e0 100644 --- a/third_party/WebKit/public/platform/modules/notifications/WebNotificationManager.h +++ b/third_party/WebKit/public/platform/modules/notifications/WebNotificationManager.h
@@ -59,13 +59,10 @@ WebServiceWorkerRegistration*, WebNotificationGetCallbacks*) = 0; - // Closes a notification previously shown, and removes it if being shown. - virtual void close(WebNotificationDelegate*) = 0; - - // Closes a persistent notification identified by its notification Id. - virtual void closePersistent(const WebSecurityOrigin&, - const WebString& tag, - const WebString& notificationId) = 0; + // Closes a notification identified by its notification Id. + virtual void close(const WebSecurityOrigin&, + const WebString& tag, + const WebString& notificationId) = 0; // Indicates that the delegate object is being destroyed, and must no longer // be used by the embedder to dispatch events.
diff --git a/third_party/WebKit/public/web/WebMemoryStatistics.h b/third_party/WebKit/public/web/WebMemoryStatistics.h new file mode 100644 index 0000000..034224c --- /dev/null +++ b/third_party/WebKit/public/web/WebMemoryStatistics.h
@@ -0,0 +1,24 @@ +// 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 WebMemoryStatistics_h +#define WebMemoryStatistics_h + +#include "public/platform/WebCommon.h" + +namespace blink { + +struct WebMemoryStatistics { + size_t partitionAllocTotalAllocatedBytes; + size_t blinkGCTotalAllocatedBytes; + + WebMemoryStatistics() + : partitionAllocTotalAllocatedBytes(0), blinkGCTotalAllocatedBytes(0) {} + + BLINK_EXPORT static WebMemoryStatistics Get(); +}; + +} // namespace blink + +#endif
diff --git a/third_party/closure_compiler/externs/settings_private.js b/third_party/closure_compiler/externs/settings_private.js index ec9bd7e7..e29aa00 100644 --- a/third_party/closure_compiler/externs/settings_private.js +++ b/third_party/closure_compiler/externs/settings_private.js
@@ -1,9 +1,9 @@ -// 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. // This file was generated by: -// ./tools/json_schema_compiler/compiler.py. +// tools/json_schema_compiler/compiler.py. // NOTE: The format of types has changed. 'FooType' is now // 'chrome.settingsPrivate.FooType'. // Please run the closure compiler before committing changes. @@ -93,19 +93,19 @@ chrome.settingsPrivate.getPref = function(name, callback) {}; /** - * Gets the page zoom factor as an integer percentage. + * Gets the page zoom factor. * @param {function(number):void} callback - * @see https://developer.chrome.com/extensions/settingsPrivate#method-getDefaultZoomPercent + * @see https://developer.chrome.com/extensions/settingsPrivate#method-getDefaultZoom */ -chrome.settingsPrivate.getDefaultZoomPercent = function(callback) {}; +chrome.settingsPrivate.getDefaultZoom = function(callback) {}; /** - * Sets the page zoom factor from a zoom percentage. - * @param {number} percent + * Sets the page zoom factor. + * @param {number} zoom * @param {function(boolean):void=} callback - * @see https://developer.chrome.com/extensions/settingsPrivate#method-setDefaultZoomPercent + * @see https://developer.chrome.com/extensions/settingsPrivate#method-setDefaultZoom */ -chrome.settingsPrivate.setDefaultZoomPercent = function(percent, callback) {}; +chrome.settingsPrivate.setDefaultZoom = function(zoom, callback) {}; /** * <p>Fired when a set of prefs has changed.</p><p>|prefs| The prefs that @@ -113,4 +113,4 @@ * @type {!ChromeEvent} * @see https://developer.chrome.com/extensions/settingsPrivate#event-onPrefsChanged */ -chrome.settingsPrivate.onPrefsChanged; +chrome.settingsPrivate.onPrefsChanged; \ No newline at end of file
diff --git a/third_party/closure_compiler/interfaces/settings_private_interface.js b/third_party/closure_compiler/interfaces/settings_private_interface.js index 6cf7ad3..dbbaa57 100644 --- a/third_party/closure_compiler/interfaces/settings_private_interface.js +++ b/third_party/closure_compiler/interfaces/settings_private_interface.js
@@ -3,7 +3,7 @@ // found in the LICENSE file. // This file was generated by: -// ./tools/json_schema_compiler/compiler.py. +// tools/json_schema_compiler/compiler.py. /** @fileoverview Interface for settingsPrivate that can be overriden. */ @@ -40,19 +40,19 @@ getPref: assertNotReached, /** - * Gets the page zoom factor as an integer percentage. + * Gets the page zoom factor. * @param {function(number):void} callback - * @see https://developer.chrome.com/extensions/settingsPrivate#method-getDefaultZoomPercent + * @see https://developer.chrome.com/extensions/settingsPrivate#method-getDefaultZoom */ - getDefaultZoomPercent: assertNotReached, + getDefaultZoom: assertNotReached, /** - * Sets the page zoom factor from a zoom percentage. - * @param {number} percent + * Sets the page zoom factor. + * @param {number} zoom * @param {function(boolean):void=} callback - * @see https://developer.chrome.com/extensions/settingsPrivate#method-setDefaultZoomPercent + * @see https://developer.chrome.com/extensions/settingsPrivate#method-setDefaultZoom */ - setDefaultZoomPercent: assertNotReached, + setDefaultZoom: assertNotReached, }; /**
diff --git a/third_party/libvpx/BUILD.gn b/third_party/libvpx/BUILD.gn index 330022c..cf70ffd7 100644 --- a/third_party/libvpx/BUILD.gn +++ b/third_party/libvpx/BUILD.gn
@@ -48,18 +48,6 @@ "//third_party/libvpx/source/libvpx", "$root_gen_dir/third_party/libvpx", # Provides vpx_rtcd.h. ] - - if (current_cpu == "arm" && is_clang) { - # TODO(hans) Enable integrated-as (crbug.com/124610). - asmflags = [ "-fno-integrated-as" ] - if (is_android) { - rebased_android_toolchain_root = - rebase_path(android_toolchain_root, root_build_dir) - - # Else /usr/bin/as gets picked up. - asmflags += [ "-B${rebased_android_toolchain_root}/bin" ] - } - } } # gn orders flags on a target before flags from configs. The default config
diff --git a/tools/android/eclipse/.classpath b/tools/android/eclipse/.classpath index 54e5bfa..53012797 100644 --- a/tools/android/eclipse/.classpath +++ b/tools/android/eclipse/.classpath
@@ -207,7 +207,7 @@ <classpathentry kind="src" path="out/Debug/java_mojo/mojo_public_test_interfaces_mojom/src"/> <classpathentry kind="src" path="out/Debug/java_proto/cacheinvalidation_proto_java/src"/> <classpathentry kind="src" path="out/Debug/java_proto/document_tab_model_info_proto_java/src"/> - <classpathentry kind="src" path="out/Debug/java_proto/test_support_sync_proto_java/src"/> + <classpathentry kind="src" path="out/Debug/java_proto/test_support_proto_java/src"/> <classpathentry kind="src" path="out/Debug/remoting_apk/gen"/> <classpathentry kind="lib" path="third_party/android_tools/sdk/extras/google/gcm/gcm-client/dist/gcm.jar" sourcepath="third_party/android_tools/sdk/extras/google/gcm/gcm-client/src"/> <classpathentry kind="lib" path="third_party/android_tools/sdk/platforms/android-23/android.jar" sourcepath="third_party/android_tools/sdk/sources/"> @@ -272,7 +272,7 @@ <classpathentry kind="lib" path="out/Debug/lib.java/net/android/net_java.jar"/> <classpathentry kind="lib" path="out/Debug/lib.java/printing/printing_java.jar"/> <classpathentry kind="lib" path="out/Debug/lib.java/sync/android/sync_java.jar"/> - <classpathentry kind="lib" path="out/Debug/lib.java/sync/test_support_sync_proto_java.jar"/> + <classpathentry kind="lib" path="out/Debug/lib.java/sync/test_support_proto_java.jar"/> <classpathentry kind="lib" path="out/Debug/lib.java/third_party/android_data_chart/android_data_chart_java.jar"/> <classpathentry kind="lib" path="out/Debug/lib.java/third_party/android_media/android_media_java.jar"/> <classpathentry kind="lib" path="out/Debug/lib.java/third_party/android_protobuf/protobuf_nano_javalib.jar"/>
diff --git a/tools/clang/scripts/update.py b/tools/clang/scripts/update.py index e860100..b09a980 100755 --- a/tools/clang/scripts/update.py +++ b/tools/clang/scripts/update.py
@@ -304,6 +304,17 @@ args.gcc_toolchain = gcc_dir +def AddSvnToPathOnWin(): + """Download svn.exe and add it to PATH.""" + if sys.platform != 'win32': + return + svn_ver = 'svn-1.6.6-win' + svn_dir = os.path.join(LLVM_BUILD_TOOLS_DIR, svn_ver) + if not os.path.exists(svn_dir): + DownloadAndUnpack(CDS_URL + '/tools/%s.zip' % svn_ver, LLVM_BUILD_TOOLS_DIR) + os.environ['PATH'] = svn_dir + os.pathsep + os.environ.get('PATH', '') + + def AddCMakeToPath(): """Download CMake and add it to PATH.""" if sys.platform == 'win32': @@ -440,6 +451,7 @@ return 1 DownloadHostGcc(args) + AddSvnToPathOnWin() AddCMakeToPath() AddGnuWinToPath()
diff --git a/tools/gn/bootstrap/bootstrap.py b/tools/gn/bootstrap/bootstrap.py index b86757a..d66da1293 100755 --- a/tools/gn/bootstrap/bootstrap.py +++ b/tools/gn/bootstrap/bootstrap.py
@@ -288,7 +288,7 @@ else: cc = os.environ.get('CC', 'cc') cxx = os.environ.get('CXX', 'c++') - ld = os.environ.get('LD', cxx) + ld = cxx ar = os.environ.get('AR', 'ar') cflags = os.environ.get('CFLAGS', '').split()
diff --git a/tools/gritsettings/resource_ids b/tools/gritsettings/resource_ids index 82347ce..6a8cf6d1 100644 --- a/tools/gritsettings/resource_ids +++ b/tools/gritsettings/resource_ids
@@ -292,6 +292,9 @@ "chromecast/browser/cast_browser_resources.grd": { "includes": [30690], }, + "blimp/client/support/resources/blimp_strings.grd": { + "messages": [30700], + }, # Resource ids starting at 31000 are reserved for projects built on Chromium. }
diff --git a/tools/gritsettings/translation_expectations.pyl b/tools/gritsettings/translation_expectations.pyl index e3f5cc0c..599af2a 100644 --- a/tools/gritsettings/translation_expectations.pyl +++ b/tools/gritsettings/translation_expectations.pyl
@@ -49,6 +49,7 @@ "files": [ "android_webview/java/strings/android_webview_strings.grd", "blimp/client/app/android/java/strings/android_blimp_strings.grd", + "blimp/client/support/resources/blimp_strings.grd", "chrome/android/java/strings/android_chrome_strings.grd", "content/public/android/java/strings/android_content_strings.grd", "ui/android/java/strings/android_ui_strings.grd",
diff --git a/tools/mb/mb_config.pyl b/tools/mb/mb_config.pyl index 5e0d52c..289a3a4 100644 --- a/tools/mb/mb_config.pyl +++ b/tools/mb/mb_config.pyl
@@ -527,7 +527,8 @@ 'linux_chromium_dbg_32_ng': 'debug_trybot_x86', 'linux_chromium_dbg_ng': 'debug_trybot', 'linux_chromium_gn_upload': 'gn_linux_upload', - 'linux_chromium_headless_dbg': '//build/args/bots/tryserver.chromium.linux/headless_linux_dbg_trybot.gn', + 'linux_chromium_headless_dbg': '//build/args/bots/tryserver.chromium.linux/linux_chromium_headless_dbg.gn', + 'linux_chromium_headless_rel': '//build/args/bots/tryserver.chromium.linux/linux_chromium_headless_rel.gn', # This is intentionally a release_bot and not a release_trybot; # enabling DCHECKs seems to cause flaky failures that don't show up
diff --git a/tools/metrics/actions/actions.xml b/tools/metrics/actions/actions.xml index 5323eb5..de88be8 100644 --- a/tools/metrics/actions/actions.xml +++ b/tools/metrics/actions/actions.xml
@@ -3574,11 +3574,13 @@ <action name="Destination_MostVisited"> <owner>Please list the metric's owners. Add more owner tags as needed.</owner> <description>Please enter the description of this user action.</description> + <obsolete>No longer recorded.</obsolete> </action> <action name="Destination_MostVisited_OpenURL"> <owner>Please list the metric's owners. Add more owner tags as needed.</owner> <description>Please enter the description of this user action.</description> + <obsolete>No longer recorded.</obsolete> </action> <action name="Destination_Sessions"> @@ -9950,86 +9952,103 @@ <action name="MostVisited0"> <owner>Please list the metric's owners. Add more owner tags as needed.</owner> <description>Please enter the description of this user action.</description> + <obsolete>No longer recorded.</obsolete> </action> <action name="MostVisited1"> <owner>Please list the metric's owners. Add more owner tags as needed.</owner> <description>Please enter the description of this user action.</description> + <obsolete>No longer recorded.</obsolete> </action> <action name="MostVisited2"> <owner>Please list the metric's owners. Add more owner tags as needed.</owner> <description>Please enter the description of this user action.</description> + <obsolete>No longer recorded.</obsolete> </action> <action name="MostVisited3"> <owner>Please list the metric's owners. Add more owner tags as needed.</owner> <description>Please enter the description of this user action.</description> + <obsolete>No longer recorded.</obsolete> </action> <action name="MostVisited4"> <owner>Please list the metric's owners. Add more owner tags as needed.</owner> <description>Please enter the description of this user action.</description> + <obsolete>No longer recorded.</obsolete> </action> <action name="MostVisited5"> <owner>Please list the metric's owners. Add more owner tags as needed.</owner> <description>Please enter the description of this user action.</description> + <obsolete>No longer recorded.</obsolete> </action> <action name="MostVisited6"> <owner>Please list the metric's owners. Add more owner tags as needed.</owner> <description>Please enter the description of this user action.</description> + <obsolete>No longer recorded.</obsolete> </action> <action name="MostVisited7"> <owner>Please list the metric's owners. Add more owner tags as needed.</owner> <description>Please enter the description of this user action.</description> + <obsolete>No longer recorded.</obsolete> </action> <action name="MostVisited8"> <owner>Please list the metric's owners. Add more owner tags as needed.</owner> <description>Please enter the description of this user action.</description> + <obsolete>No longer recorded.</obsolete> </action> <action name="MostVisited9"> <owner>Please list the metric's owners. Add more owner tags as needed.</owner> <description>Please enter the description of this user action.</description> + <obsolete>No longer recorded.</obsolete> </action> <action name="MostVisitedReordered"> <owner>Please list the metric's owners. Add more owner tags as needed.</owner> <description>Please enter the description of this user action.</description> + <obsolete>No longer recorded.</obsolete> </action> <action name="MostVisited_BlacklistCleared"> <owner>Please list the metric's owners. Add more owner tags as needed.</owner> <description>Please enter the description of this user action.</description> + <obsolete>No longer recorded.</obsolete> </action> <action name="MostVisited_Clicked"> - <owner>Please list the metric's owners. Add more owner tags as needed.</owner> - <description>Please enter the description of this user action.</description> + <owner>sfiera@chromium.org</owner> + <owner>treib@chromium.org</owner> + <description>An NTP tile was clicked. Desktop only.</description> </action> <action name="MostVisited_UrlBlacklisted"> - <owner>Please list the metric's owners. Add more owner tags as needed.</owner> - <description>Please enter the description of this user action.</description> + <owner>sfiera@chromium.org</owner> + <owner>treib@chromium.org</owner> + <description>An NTP tile was blacklisted. iOS only.</description> </action> <action name="MostVisited_UrlPinned"> <owner>Please list the metric's owners. Add more owner tags as needed.</owner> <description>Please enter the description of this user action.</description> + <obsolete>No longer recorded.</obsolete> </action> <action name="MostVisited_UrlRemoved"> <owner>Please list the metric's owners. Add more owner tags as needed.</owner> <description>Please enter the description of this user action.</description> + <obsolete>No longer recorded.</obsolete> </action> <action name="MostVisited_UrlUnpinned"> <owner>Please list the metric's owners. Add more owner tags as needed.</owner> <description>Please enter the description of this user action.</description> + <obsolete>No longer recorded.</obsolete> </action> <action name="Mouse_Down">
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml index be127aa4..cf35fd4 100644 --- a/tools/metrics/histograms/histograms.xml +++ b/tools/metrics/histograms/histograms.xml
@@ -4107,6 +4107,16 @@ </summary> </histogram> +<histogram name="Blink.Gesture.Merged" enum="GestureMergeState"> + <owner>jyasskin@chromium.org</owner> + <owner>domenic@google.com</owner> + <summary> + How many times two user gesture tokens were merged by UserGestureIndicator, + and whether each token had an active gesture. One of the new token's + gestures, if any, is moved to the old token. + </summary> +</histogram> + <histogram name="Blink.MediaDocument.DownloadButton" enum="MediaDocumentDownloadButtonType"> <owner>qinmin@chromium.org</owner> @@ -5131,6 +5141,13 @@ </summary> </histogram> +<histogram name="Cast.Channel.Certificate" enum="CastCertificateStatus"> + <owner>ryanchung@google.com</owner> + <summary> + Records the result of the Cast certificate verification on the Cast sender. + </summary> +</histogram> + <histogram name="Cast.Network.Down.Duration.In.Seconds" units="seconds"> <owner>cast-analytics@google.com</owner> <summary> @@ -14075,21 +14092,20 @@ <histogram name="Event.Latency.TouchToFirstScrollUpdateSwapBegin" units="microseconds"> <owner>rbyers@chromium.org</owner> - <obsolete> - To be replaced by - Event.Latency.ScrollUpdate.Touch.TimeToFirstScrollUpdateSwapBegin2 in M56. - https://crbug.com/649754 - </obsolete> <summary> Time between initial creation of a touch event and the start of the frame swap on the GPU service caused by the generated ScrollUpdate gesture event if that ScrollUpdate is the first such event in a given scroll gesture event sequence. If no swap was induced by the event, no recording is made. + + To be replaced by + Event.Latency.ScrollUpdate.Touch.TimeToFirstScrollUpdateSwapBegin2 in M56. + https://crbug.com/649754 </summary> </histogram> <histogram name="Event.Latency.TouchToScrollUpdateSwap" units="microseconds"> - <owner>rbyers@chromium.org</owner> + <owner>tdresser@chromium.org</owner> <obsolete> Replaced by Event.Latency.TouchToScrollUpdateSwapBegin. crbug.com/478845 </obsolete> @@ -14102,16 +14118,15 @@ <histogram name="Event.Latency.TouchToScrollUpdateSwapBegin" units="microseconds"> - <owner>rbyers@chromium.org</owner> - <obsolete> - To be replaced by - Event.Latency.ScrollUpdate.Touch.TimeToScrollUpdateSwapBegin2 in M56. - https://crbug.com/649754 - </obsolete> + <owner>tdresser@chromium.org</owner> <summary> Time between initial creation of a touch event and start of the frame swap on the GPU service caused by the generated ScrollUpdate gesture event. If no swap was induced by the event, no recording is made. + + To be replaced by + Event.Latency.ScrollUpdate.Touch.TimeToScrollUpdateSwapBegin2 in M56. + https://crbug.com/649754 </summary> </histogram> @@ -37198,6 +37213,16 @@ </summary> </histogram> +<histogram name="NewTabPage.Languages.UILanguageRatioInTwoTopLanguages" + units="%"> + <owner>jkrcal@chromium.org</owner> + <summary> + Android: Percentage of how much in browsing is the UI language of Chrome + used compared to overall use of the two top languages that are reported to + Chrome content suggestion server. + </summary> +</histogram> + <histogram name="NewTabPage.Layout" enum="NTPLayout"> <owner>peconn@chromium.org</owner> <summary> @@ -40615,6 +40640,9 @@ </histogram> <histogram name="PageLoad.Internal.CommitToComplete.NoTimingIPCs" units="ms"> + <obsolete> + Deprecated on 10/14/2016. No longer needed. + </obsolete> <owner>bmcquade@chromium.org</owner> <summary> The delay between commit and completion, for page loads that did not receive @@ -40883,6 +40911,9 @@ </histogram> <histogram name="PageLoad.Timing2.NavigationToCommit" units="ms"> + <obsolete> + Deprecated in favor of PageLoad.ParseTiming.NavigationToParseStart + </obsolete> <owner>bmcquade@chromium.org</owner> <owner>csharrison@chromium.org</owner> <summary> @@ -48551,6 +48582,15 @@ <summary>Size of the web data database.</summary> </histogram> +<histogram name="ProfileReset.ResetRequestOrigin" + enum="ProfileResetRequestOriginEnum"> + <owner>alito@chromium.org</owner> + <summary> + Encodes from where the request for resetting the profile settings + originated. + </summary> +</histogram> + <histogram name="ProfileReset.SendFeedback" enum="Boolean"> <owner>engedy@chromium.org</owner> <owner>vasilii@chromium.org</owner> @@ -48623,6 +48663,55 @@ </summary> </histogram> +<histogram name="PurgeAndSuspend.Memory.BlinkGCKB" units="KB"> + <owner>tasak@google.com</owner> + <summary> + The memory usage of the BlinkGC allocator after a background renderer is + purged and suspended. Note: this metric is for A/B testing. + </summary> +</histogram> + +<histogram name="PurgeAndSuspend.Memory.DiscardableKB" units="KB"> + <owner>tasak@google.com</owner> + <summary> + The memory usage of the discardable memory after a background renderer is + purged and suspended. Note: this metric is for A/B testing. + </summary> +</histogram> + +<histogram name="PurgeAndSuspend.Memory.MallocMB" units="MB"> + <owner>tasak@google.com</owner> + <summary> + The memory usage of the malloc after a background renderer is purged and + suspended. Note: this metric is for A/B testing. + </summary> +</histogram> + +<histogram name="PurgeAndSuspend.Memory.PartitionAllocKB" units="KB"> + <owner>tasak@google.com</owner> + <summary> + The memory usage of PartitionAlloc after a background renderer is purged and + suspended. Note: this metric is for A/B testing. + </summary> +</histogram> + +<histogram name="PurgeAndSuspend.Memory.TotalAllocatedMB" units="MB"> + <owner>tasak@google.com</owner> + <summary> + The sum of the memory usages of PartitionAlloc, malloc, discardable memory, + mainThreadIsolate() and BlinkGC allocator after a backgrounded renderer is + purged and suspended. Note: this metric is for A/B testing. + </summary> +</histogram> + +<histogram name="PurgeAndSuspend.Memory.V8MainThreadIsolateMB" units="MB"> + <owner>tasak@google.com</owner> + <summary> + The memory usage of mainThreadIsolate() after a backgrounded renderer is + purged and suspended. Note: this metric is for A/B testing. + </summary> +</histogram> + <histogram name="PurgeAndSuspend.PendingTaskCount"> <owner>tasak@google.com</owner> <summary> @@ -55907,6 +55996,15 @@ </summary> </histogram> +<histogram name="ServiceWorker.ExternalRequest.Time" units="ms"> + <owner>lazyboy@chromium.org</owner> + <summary> + The duration an external request spent to keep a service worker alive. + Currently, extension service workers use external requests to keep the + worker alive during the time the worker requests an extension API. + </summary> +</histogram> + <histogram name="ServiceWorker.FetchEvent.Fallback.Time" units="ms"> <owner>jeremyarcher@chromium.org</owner> <summary> @@ -68289,6 +68387,11 @@ </summary> </histogram> +<histogram name="WebAudio.Autoplay.CrossOrigin" enum="WebAudioAutoplayStatus"> + <owner>mlamouri@chromium.org</owner> + <summary>The autoplay status of an AudioContext when destroyed.</summary> +</histogram> + <histogram name="WebAudio.BiquadFilter.Q.Highpass"> <owner>rtoy@chromium.org</owner> <owner>hongchan@chromium.org</owner> @@ -73623,6 +73726,7 @@ <int value="140" label="ARH_CREATED_STREAM_WITHOUT_AUTHORIZATION"/> <int value="141" label="MDDH_INVALID_DEVICE_TYPE_REQUEST"/> <int value="142" label="MDDH_UNAUTHORIZED_ORIGIN"/> + <int value="143" label="NMF_INVALID_ID_CLOSE"/> </enum> <enum name="BadMessageReasonExtensions" type="int"> @@ -74744,6 +74848,13 @@ <int value="4" label="Never recieved any data"/> </enum> +<enum name="CastCertificateStatus" type="int"> + <int value="0" label="OK"/> + <int value="1" label="InvalidCrl"/> + <int value="2" label="CertVerificationFailed"/> + <int value="3" label="CertRevoked"/> +</enum> + <enum name="CastOverlayEvents" type="int"> <int value="0" label="Created"/> <int value="1" label="Shown"/> @@ -81699,8 +81810,8 @@ <int value="1091" label="TABCAPTURE_CAPTUREOFFSCREENTAB"/> <int value="1092" label="LANGUAGESETTINGSPRIVATE_ADDSPELLCHECKWORD"/> <int value="1093" label="LANGUAGESETTINGSPRIVATE_REMOVESPELLCHECKWORD"/> - <int value="1094" label="SETTINGSPRIVATE_GETDEFAULTZOOMPERCENTFUNCTION"/> - <int value="1095" label="SETTINGSPRIVATE_SETDEFAULTZOOMPERCENTFUNCTION"/> + <int value="1094" label="SETTINGSPRIVATE_GETDEFAULTZOOMFUNCTION"/> + <int value="1095" label="SETTINGSPRIVATE_SETDEFAULTZOOMFUNCTION"/> <int value="1096" label="BLUETOOTHPRIVATE_CONNECT"/> <int value="1097" label="BLUETOOTHPRIVATE_FORGETDEVICE"/> <int value="1098" label="DISPLAYSOURCE_GETAVAILABLESINKS"/> @@ -83793,7 +83904,7 @@ <int value="1396" label="V8RegExpPrototypeSourceGetter"/> <int value="1397" label="V8RegExpPrototypeOldFlagGetter"/> <int value="1398" label="V8DecimalWithLeadingZeroInStrictMode"/> - <int value="1399" label="FormSubmissionNotInDocumentTree"/> + <int value="1399" label="OBSOLETE_FormSubmissionNotInDocumentTree"/> <int value="1400" label="GetUserMediaPrefixed"/> <int value="1401" label="GetUserMediaLegacy"/> <int value="1402" label="GetUserMediaPromise"/> @@ -86029,6 +86140,13 @@ <int value="20" label="Window resized double tap"/> </enum> +<enum name="GestureMergeState" type="int"> + <int value="0" label="Neither token had a gesture"/> + <int value="1" label="Only the old token had a gesture"/> + <int value="2" label="Only the new token had a gesture"/> + <int value="3" label="Both tokens had a gesture"/> +</enum> + <enum name="GesturePredictionResult" type="int"> <int value="0" label="Gesture occured and was predicted"/> <int value="1" label="Gesture occured but was not predicted"/> @@ -95532,6 +95650,14 @@ <int value="9" label="Switch to profile from context menu"/> </enum> +<enum name="ProfileResetRequestOriginEnum" type="int"> + <int value="0" label="Unspecified"/> + <int value="1" label="Unknown"/> + <int value="2" label="User click"/> + <int value="3" label="CCT"/> + <int value="4" label="Triggered reset"/> +</enum> + <enum name="ProfileSigninStatus" type="int"> <int value="0" label="All profiles signed in"/> <int value="1" label="All profiles not signed in"/> @@ -102193,6 +102319,12 @@ <int value="3" label="Dismiss to open a newly installed WebAPK"/> </enum> +<enum name="WebAudioAutoplayStatus" type="int"> + <int value="0" label="The AudioContext failed to autoplay"/> + <int value="1" label="Failed to autoplay but start() called on user gesture"/> + <int value="2" label="The AudioContext successfully autoplayed"/> +</enum> + <enum name="WebBluetoothConnectGATTOutcome" type="int"> <int value="0" label="Success"/> <int value="1" label="Device no longer in range"/>
diff --git a/tools/perf/core/trybot_command.py b/tools/perf/core/trybot_command.py index 86fe1cf..f2a139e1 100644 --- a/tools/perf/core/trybot_command.py +++ b/tools/perf/core/trybot_command.py
@@ -7,8 +7,8 @@ import logging import os import platform -import re import subprocess +import tempfile import urllib2 @@ -446,13 +446,8 @@ output = RunGit(['diff-index', 'HEAD']) if output: raise TrybotError( - 'Cannot send a try job with a dirty tree. Please commit ' - 'your changes locally first in %s repository.' % repo_path) - - # Make sure the tree does have local commits. - output = RunGit(['footers', 'HEAD']) - if output: - raise TrybotError('No local changes found in %s repository.' % repo_path) + 'Cannot send a try job with a dirty tree.\nPlease commit locally and ' + 'upload your changes to rietveld in %s repository.' % repo_path) return (repo_name, branch_name) @@ -501,6 +496,32 @@ raise TrybotError('URL %s on remote %s is not recognized on branch.'% ( cur_remote_url, cur_remote)) + def _GetChangeList(self): + """Gets the codereview URL for the current changes.""" + temp_file = None + json_output = None + try: + fd, temp_file = tempfile.mkstemp(suffix='.json', prefix='perf_try_cl') + os.close(fd) + RunGit(['cl', 'issue', '--json', temp_file], + 'Failed to run "git cl issue" command.') + with open(temp_file, 'r') as f: + json_output = json.load(f) + finally: + try: + if temp_file: + os.remove(temp_file) + except OSError: + pass + + # Make sure the local commits are uploaded to rietveld. + if not json_output.get('issue'): + raise TrybotError( + 'PLEASE NOTE: The workflow for Perf Try jobs is changed. ' + 'In order to run the perf try job, you must first upload your ' + 'changes to rietveld.') + return json_output.get('issue_url') + def _AttemptTryjob(self, options, extra_args): """Attempts to run a tryjob from a repo directory. @@ -533,10 +554,8 @@ branch_name, repo_info.get('url')) deps_override = {repo_info.get('src'): options.deps_revision} - arguments = [options.benchmark_name] + extra_args - - rietveld_url = self._UploadPatchToRietveld(repo_name, options) - print ('\nUploaded try job to rietveld.\nview progress here %s.' + rietveld_url = self._GetChangeList() + print ('\nRunning try job....\nview progress here %s.' '\n\tRepo Name: %s\n\tPath: %s\n\tBranch: %s' % ( rietveld_url, repo_name, repo_path, branch_name)) @@ -545,6 +564,7 @@ logging.warning('No builder is found for %s', bot_platform) continue try: + arguments = [options.benchmark_name] + extra_args self._RunTryJob(bot_platform, arguments, deps_override) # Even if git cl try throws TrybotError exception for any platform, # keep sending try jobs to other platforms. @@ -558,20 +578,6 @@ os.chdir(original_workdir) return 0 - def _UploadPatchToRietveld(self, repo_name, options): - """Uploads the patch to rietveld and returns rietveld URL.""" - output = RunGit(['cl', 'upload', '-f', '--bypass-hooks', '-m', - ('CL for %s perf tryjob to run %s benchmark ' - 'on %s platform(s)' % ( - repo_name, options.benchmark_name, options.trybot))], - 'Could not upload to rietveld for %s' % repo_name) - - match = re.search(r'https://codereview.chromium.org/[\d]+', output) - if not match: - raise TrybotError('Could not upload CL to rietveld for %s! Output %s' % - (repo_name, output)) - return match.group(0) - def _RunTryJob(self, bot_platform, arguments, deps_override): """Executes perf try job with benchmark test properties.
diff --git a/tools/perf/core/trybot_command_unittest.py b/tools/perf/core/trybot_command_unittest.py index 6a2cef0a..7bca1481 100644 --- a/tools/perf/core/trybot_command_unittest.py +++ b/tools/perf/core/trybot_command_unittest.py
@@ -7,6 +7,7 @@ import os import StringIO import sys +import tempfile import unittest from core import trybot_command @@ -39,6 +40,8 @@ self._mock_subprocess = self._subprocess_patcher.start() self._urllib2_patcher = mock.patch('core.trybot_command.urllib2') self._urllib2_mock = self._urllib2_patcher.start() + self._tempfile_patcher = mock.patch('core.trybot_command.tempfile') + self._tempfile_mock = self._tempfile_patcher.start() # Always set git command to 'git' to simplify testing across platforms. self._original_git_cmd = trybot_command._GIT_CMD trybot_command._GIT_CMD = 'git' @@ -48,6 +51,7 @@ self.log_output.close() self._subprocess_patcher.stop() self._urllib2_patcher.stop() + self._tempfile_patcher.stop() # Reset the cached builders in trybot_command trybot_command.Trybot._builders = None trybot_command._GIT_CMD = self._original_git_cmd @@ -78,6 +82,13 @@ data.read.return_value = json.dumps(bots_dict) self._urllib2_mock.urlopen.return_value = data + def _MockTempFile(self, issue, issue_url): + fd, temp_file = tempfile.mkstemp(suffix='.json', prefix='cl') + with open(temp_file, 'w') as f: + json.dump({"issue": issue, "issue_url": issue_url}, f) + self._tempfile_mock.mkstemp.return_value = (fd, temp_file) + return temp_file + def _AssertTryBotExceptions(self, message, func, *args): with self.assertRaises(trybot_command.TrybotError) as e: func(*args) @@ -340,22 +351,6 @@ options.repo_path ) - def testNoLocalCommits(self): - command, options = self._SetupTrybotCommand({'linux_perf_bisect': 'stuff'}, - 'linux') - self._ExpectProcesses(( - (['git', 'rev-parse', '--abbrev-ref', '--show-toplevel', 'HEAD'], - (0, '/root/path_to/repo/src\nbr\n', None)), - (['git', 'update-index', '--refresh', '-q'], (0, '', None,)), - (['git', 'diff-index', 'HEAD'], (0, '', None)), - (['git', 'footers', 'HEAD'], (0, 'CL footers', None)), - )) - self._AssertTryBotExceptions( - 'No local changes found in %s repository.' % options.repo_path, - command._GetRepoAndBranchName, - options.repo_path - ) - def testGetRepoAndBranchName(self): command, options = self._SetupTrybotCommand({'linux_perf_bisect': 'stuff'}, 'linux') @@ -364,7 +359,6 @@ (0, '/root/path_to/repo/src\nbr\n', None)), (['git', 'update-index', '--refresh', '-q'], (0, '', None,)), (['git', 'diff-index', 'HEAD'], (0, '', None)), - (['git', 'footers', 'HEAD'], (0, '', None)), )) self.assertEquals( command._GetRepoAndBranchName(options.repo_path), ('src', 'br')) @@ -442,49 +436,42 @@ {'win_perf_bisect': 'stuff'} ) - def testUploadPatchToRietveldGitCommandFailed(self): - command, options = self._SetupTrybotCommand({'linux_perf_bisect': 'stuff'}, - 'linux') + def testGetChangeListCommandError(self): + temp_file = self._MockTempFile(None, None) + command, _ = self._SetupTrybotCommand( + {'linux_perf_bisect': 'stuff'}, 'linux') self._ExpectProcesses(( - (['git', 'cl', 'upload', '-f', '--bypass-hooks', '-m', - ('CL for src perf tryjob to run sunspider benchmark on linux ' - 'platform(s)')], - (128, None, None)), + (['git', 'cl', 'issue', '--json', temp_file], (128, None, None)), )) self._AssertTryBotExceptions( - 'Could not upload to rietveld for src', - command._UploadPatchToRietveld, - 'src', - options - ) + 'Failed to run "git cl issue" command.', + command._GetChangeList) - def testUploadPatchToRietveldNoURLMatchFound(self): - command, options = self._SetupTrybotCommand({'linux_perf_bisect': 'stuff'}, - 'linux') + def testGetChangeListNoIssues(self): + temp_file = self._MockTempFile(None, None) + command, _ = self._SetupTrybotCommand( + {'linux_perf_bisect': 'stuff'}, 'linux') self._ExpectProcesses(( - (['git', 'cl', 'upload', '-f', '--bypass-hooks', '-m', - ('CL for src perf tryjob to run sunspider benchmark on linux ' - 'platform(s)')], - (0, 'stuff https://dummy.chromium.org/12345 stuff', None)), + (['git', 'cl', 'issue', '--json', temp_file], + (0, 'Issue number: None (None)', None)), )) self._AssertTryBotExceptions( - 'Could not upload CL to rietveld for src!', - command._UploadPatchToRietveld, - 'src', - options - ) + ('PLEASE NOTE: The workflow for Perf Try jobs is changed. ' + 'In order to run the perf try job, you must first upload your ' + 'changes to rietveld.'), + command._GetChangeList) - def testUploadPatchToRietveldOnSuccess(self): - command, options = self._SetupTrybotCommand({'linux_perf_bisect': 'stuff'}, - 'linux') + def testGetChangeListWithIssue(self): + temp_file = self._MockTempFile( + 12345, 'https://codereview.chromium.org/12345') + command, _ = self._SetupTrybotCommand( + {'linux_perf_bisect': 'stuff'}, 'linux') self._ExpectProcesses(( - (['git', 'cl', 'upload', '-f', '--bypass-hooks', '-m', - ('CL for src perf tryjob to run sunspider benchmark on linux ' - 'platform(s)')], + (['git', 'cl', 'issue', '--json', temp_file], (0, 'stuff https://codereview.chromium.org/12345 stuff', None)), )) - self.assertEquals(command._UploadPatchToRietveld('src', options), - 'https://codereview.chromium.org/12345') + self.assertEquals('https://codereview.chromium.org/12345', + command._GetChangeList()) def testRunTryJobFailed(self): test_args = self._ExpectedGitTryTestArgs('sunspider', 'release') @@ -608,29 +595,30 @@ @mock.patch('core.trybot_command.os.chdir', mock.MagicMock()) @mock.patch('core.trybot_command.os.path.exists', - mock.MagicMock(return_value='True')) - @mock.patch('core.trybot_command.os.path.abspath', - mock.MagicMock(return_value=trybot_command.CHROMIUM_SRC_PATH)) + mock.MagicMock(return_value=True)) def testAttemptTryjobForCrRepo(self): test_args = self._ExpectedGitTryTestArgs('sunspider', 'release') command, options = self._SetupTrybotCommand({'linux_perf_bisect': 'stuff'}, 'linux') + temp_file = self._MockTempFile( + 12345, 'https://codereview.chromium.org/12345') + self._ExpectProcesses(( (['git', 'rev-parse', '--abbrev-ref', '--show-toplevel', 'HEAD'], (0, '/root/path_to/repo/src\nbr\n', None)), (['git', 'update-index', '--refresh', '-q'], (0, '', None,)), (['git', 'diff-index', 'HEAD'], (0, '', None)), - (['git', 'footers', 'HEAD'], (0, '', None)), - (['git', 'cl', 'upload', '-f', '--bypass-hooks', '-m', - ('CL for src perf tryjob to run sunspider benchmark on linux ' - 'platform(s)')], + (['git', 'cl', 'issue', '--json', temp_file], (0, 'stuff https://codereview.chromium.org/12345 stuff', None)), (['git', 'cl', 'try', '-m', 'tryserver.chromium.perf', '-p', test_args, '-b', 'linux_perf_bisect'], (0, '', None)) )) - command._AttemptTryjob(options, []) - output = ('Uploaded try job to rietveld.\n' + with mock.patch('core.trybot_command.os.path.abspath', + return_value=trybot_command.CHROMIUM_SRC_PATH): + command._AttemptTryjob(options, []) + + output = ('Running try job....\n' 'view progress here https://codereview.chromium.org/12345.\n' '\tRepo Name: src\n' '\tPath: %s\n' @@ -642,30 +630,27 @@ @mock.patch('core.trybot_command.os.chdir', mock.MagicMock()) @mock.patch('core.trybot_command.os.path.exists', mock.MagicMock(return_value='True')) - @mock.patch('core.trybot_command.os.path.abspath', - mock.MagicMock(return_value=trybot_command.CHROMIUM_SRC_PATH)) def testAttemptTryjobAllForCrRepo(self): default_config = self._ExpectedGitTryTestArgs('sunspider', 'release') winx64_config = self._ExpectedGitTryTestArgs( 'sunspider', 'release_x64', 'x64') android_config = self._ExpectedGitTryTestArgs( 'sunspider', 'android-chromium', 'ia32') - command, options = self._SetupTrybotCommand( {'linux_perf_bisect': 'stuff', 'win_perf_bisect': 'stuff', 'winx64_perf_bisect': 'stuff', 'android_perf_bisect': 'stuff', 'mac_perf_bisect': 'stuff'}, 'all') + temp_file = self._MockTempFile( + 12345, 'https://codereview.chromium.org/12345') + self._ExpectProcesses(( (['git', 'rev-parse', '--abbrev-ref', '--show-toplevel', 'HEAD'], (0, '/root/path_to/repo/src\nbr\n', None)), (['git', 'update-index', '--refresh', '-q'], (0, '', None,)), (['git', 'diff-index', 'HEAD'], (0, '', None)), - (['git', 'footers', 'HEAD'], (0, '', None)), - (['git', 'cl', 'upload', '-f', '--bypass-hooks', '-m', - ('CL for src perf tryjob to run sunspider benchmark on all ' - 'platform(s)')], + (['git', 'cl', 'issue', '--json', temp_file], (0, 'stuff https://codereview.chromium.org/12345 stuff', None)), (['git', 'cl', 'try', '-m', 'tryserver.chromium.perf', '-p', default_config, '-b', 'win_perf_bisect'], (0, '', None)), @@ -678,8 +663,12 @@ (['git', 'cl', 'try', '-m', 'tryserver.chromium.perf', '-p', default_config, '-b', 'linux_perf_bisect'], (0, '', None)), )) - command._AttemptTryjob(options, []) - output = ('Uploaded try job to rietveld.\n' + + with mock.patch('core.trybot_command.os.path.abspath', + return_value=trybot_command.CHROMIUM_SRC_PATH): + command._AttemptTryjob(options, []) + + output = ('Running try job....\n' 'view progress here https://codereview.chromium.org/12345.\n' '\tRepo Name: src\n' '\tPath: %s\n' @@ -695,20 +684,20 @@ @mock.patch('core.trybot_command.os.chdir', mock.MagicMock()) @mock.patch('core.trybot_command.os.path.exists', mock.MagicMock(return_value='True')) - @mock.patch('core.trybot_command.os.path.abspath', - mock.MagicMock(return_value='root/path_to/repo/v8')) def testAttemptTryjobForDepsRepo(self): test_args = self._ExpectedGitTryTestArgs('sunspider', 'release') deps_override_arg = 'deps_revision_overrides={"src/v8": "feedbeed"}' command, options = self._SetupTrybotCommand( {'linux_perf_bisect': 'stuff'}, 'linux', repo_path='root/path_to/repo/v8') + temp_file = self._MockTempFile( + 12345, 'https://codereview.chromium.org/12345') + self._ExpectProcesses(( (['git', 'rev-parse', '--abbrev-ref', '--show-toplevel', 'HEAD'], (0, 'root/path_to/repo/v8\nbr\n', None)), (['git', 'update-index', '--refresh', '-q'], (0, '', None,)), (['git', 'diff-index', 'HEAD'], (0, '', None)), - (['git', 'footers', 'HEAD'], (0, '', None)), (['git', 'config', 'branch.br.remote'], (0, '.', None)), (['git', 'rev-parse', '--abbrev-ref', 'br@{upstream}'], (0, 'br1', None,)), @@ -716,17 +705,18 @@ (['git', 'config', 'remote.origin.url'], (0, 'https://chromium.googlesource.com/v8/v8.git', None)), (['git', 'rev-parse', 'br1@{upstream}'], (0, 'feedbeed', None)), - (['git', 'cl', 'upload', '-f', '--bypass-hooks', '-m', - ('CL for v8 perf tryjob to run sunspider benchmark on linux ' - 'platform(s)')], + (['git', 'cl', 'issue', '--json', temp_file], (0, 'stuff https://codereview.chromium.org/12345 stuff', None)), (['git', 'cl', 'try', '-m', 'tryserver.chromium.perf', '-p', test_args, '-p', deps_override_arg, '-b', 'linux_perf_bisect'], (0, '', None)) )) - command._AttemptTryjob(options, []) - output = ('Uploaded try job to rietveld.\n' + with mock.patch('core.trybot_command.os.path.abspath', + return_value='root/path_to/repo/v8'): + command._AttemptTryjob(options, []) + + output = ('Running try job....\n' 'view progress here https://codereview.chromium.org/12345.\n' '\tRepo Name: v8\n' '\tPath: root/path_to/repo/v8\n' @@ -737,8 +727,6 @@ @mock.patch('core.trybot_command.os.chdir', mock.MagicMock()) @mock.patch('core.trybot_command.os.path.exists', mock.MagicMock(return_value='True')) - @mock.patch('core.trybot_command.os.path.abspath', - mock.MagicMock(return_value='root/path_to/repo/v8')) def testAttemptTryjobAllForDepsRepo(self): default_config = self._ExpectedGitTryTestArgs('sunspider', 'release') deps_override_arg = 'deps_revision_overrides={"src/v8": "feedbeed"}' @@ -751,13 +739,14 @@ 'winx64_perf_bisect': 'stuff', 'android_perf_bisect': 'stuff'}, 'all', repo_path='root/path_to/repo/v8') + temp_file = self._MockTempFile( + 12345, 'https://codereview.chromium.org/12345') self._ExpectProcesses(( (['git', 'rev-parse', '--abbrev-ref', '--show-toplevel', 'HEAD'], (0, 'root/path_to/repo/v8\nbr\n', None)), (['git', 'update-index', '--refresh', '-q'], (0, '', None,)), (['git', 'diff-index', 'HEAD'], (0, '', None)), - (['git', 'footers', 'HEAD'], (0, '', None)), (['git', 'config', 'branch.br.remote'], (0, '.', None)), (['git', 'rev-parse', '--abbrev-ref', 'br@{upstream}'], (0, 'br1', None,)), @@ -766,9 +755,7 @@ (0, 'https://chromium.googlesource.com/v8/v8.git', None)), (['git', 'rev-parse', 'br1@{upstream}'], (0, 'feedbeed', None)), - (['git', 'cl', 'upload', '-f', '--bypass-hooks', '-m', - ('CL for v8 perf tryjob to run sunspider benchmark on all ' - 'platform(s)')], + (['git', 'cl', 'issue', '--json', temp_file], (0, 'stuff https://codereview.chromium.org/12345 stuff', None)), (['git', 'cl', 'try', '-m', 'tryserver.chromium.perf', '-p', android_config, '-p', deps_override_arg, @@ -780,8 +767,12 @@ '-p', default_config, '-p', deps_override_arg, '-b', 'linux_perf_bisect'], (0, '', None)), )) - command._AttemptTryjob(options, []) - output = ('Uploaded try job to rietveld.\n' + + with mock.patch('core.trybot_command.os.path.abspath', + return_value='root/path_to/repo/v8'): + command._AttemptTryjob(options, []) + + output = ('Running try job....\n' 'view progress here https://codereview.chromium.org/12345.\n' '\tRepo Name: v8\n' '\tPath: root/path_to/repo/v8\n' @@ -794,31 +785,31 @@ @mock.patch('core.trybot_command.os.chdir', mock.MagicMock()) @mock.patch('core.trybot_command.os.path.exists', mock.MagicMock(return_value='True')) - @mock.patch('core.trybot_command.os.path.abspath', - mock.MagicMock(return_value='root/path_to/repo/v8')) def testAttemptTryjobWithDepsRevisionArg(self): test_args = self._ExpectedGitTryTestArgs('sunspider', 'release') deps_override_arg = 'deps_revision_overrides={"src/v8": "feedbeed"}' command, options = self._SetupTrybotCommand( {'linux_perf_bisect': 'stuff'}, 'linux', repo_path='root/path_to/repo/v8', deps_revision='feedbeed') + temp_file = self._MockTempFile( + 12345, 'https://codereview.chromium.org/12345') + self._ExpectProcesses(( (['git', 'rev-parse', '--abbrev-ref', '--show-toplevel', 'HEAD'], (0, 'root/path_to/repo/v8\nbr\n', None)), (['git', 'update-index', '--refresh', '-q'], (0, '', None,)), (['git', 'diff-index', 'HEAD'], (0, '', None)), - (['git', 'footers', 'HEAD'], (0, '', None)), - (['git', 'cl', 'upload', '-f', '--bypass-hooks', '-m', - ('CL for v8 perf tryjob to run sunspider benchmark on linux ' - 'platform(s)')], + (['git', 'cl', 'issue', '--json', temp_file], (0, 'stuff https://codereview.chromium.org/12345 stuff', None)), (['git', 'cl', 'try', '-m', 'tryserver.chromium.perf', '-p', test_args, '-p', deps_override_arg, '-b', 'linux_perf_bisect'], (0, '', None)) )) - command._AttemptTryjob(options, []) + with mock.patch('core.trybot_command.os.path.abspath', + return_value='root/path_to/repo/v8'): + command._AttemptTryjob(options, []) - output = ('Uploaded try job to rietveld.\n' + output = ('Running try job....\n' 'view progress here https://codereview.chromium.org/12345.\n' '\tRepo Name: v8\n' '\tPath: root/path_to/repo/v8\n'
diff --git a/tools/perf/docs/perf_regression_sheriffing.md b/tools/perf/docs/perf_regression_sheriffing.md index cae219c..c56179f 100644 --- a/tools/perf/docs/perf_regression_sheriffing.md +++ b/tools/perf/docs/perf_regression_sheriffing.md
@@ -128,10 +128,20 @@ Also during your shift, please spend any spare time driving down bugs from the [regression backlog](http://go/triage-backlog). Treat these bugs as you would -your own - investigate the regressions, find out what the next step should be, -and then move the bug along. As the backlog only contains bugs that haven't been -modified in some time, you should be able to end your shift with an empty -backlog. +your own -- investigate the regressions, find out what the next step should be, +and then move the bug along. Some possible next steps and questions to answer +are: + +* Should the bug be closed? +* Are there questions that need to be answered? +* Are there people that should be added to the CC list? +* Is the correct owner assigned? + +When a bug does need to be pinged, rather than adding a generic "ping", it's +much much more effective to include the username and action item. + +You should aim to end your shift with an empty backlog, but it's important to +still advance each bug in a meaningful way. After your shift, please try to follow up on the bugs you filed weekly. Kick off new bisects if the previous ones failed, and if the bisect picks a likely
diff --git a/tools/perf/page_sets/loading_mobile.py b/tools/perf/page_sets/loading_mobile.py index aa04f80..a4a92d0 100644 --- a/tools/perf/page_sets/loading_mobile.py +++ b/tools/perf/page_sets/loading_mobile.py
@@ -34,8 +34,9 @@ # 'https://googleblog.blogspot.jp/2016/02/building-safer-web-for-everyone.html', 'https://www.google.co.id/#q=pengiriman+bunga', 'https://m.facebook.com/?soft=messages', + # Disabled because of crbug.com/656861 # pylint: disable=line-too-long - 'http://g1.globo.com/politica/noticia/2016/02/maioria-do-stf-autoriza-fisco-obter-dados-bancarios-sem-decisao-judicial.html', + # 'http://g1.globo.com/politica/noticia/2016/02/maioria-do-stf-autoriza-fisco-obter-dados-bancarios-sem-decisao-judicial.html', # pylint: disable=line-too-long 'https://m.baidu.com/s?word=%E9%B2%9C%E8%8A%B1%E9%80%9F%E9%80%92&oq=%E9%B2%9C%E8%8A%B1', # pylint: disable=line-too-long
diff --git a/tools/variations/fieldtrial_to_struct.py b/tools/variations/fieldtrial_to_struct.py index dec472d..970b0b3 100755 --- a/tools/variations/fieldtrial_to_struct.py +++ b/tools/variations/fieldtrial_to_struct.py
@@ -37,6 +37,9 @@ def _CreateExperiment(experiment_data): experiment = {'name': experiment_data['name']} + forcing_flags_data = experiment_data.get('forcing_flag') + if forcing_flags_data: + experiment['forcing_flag'] = forcing_flags_data params_data = experiment_data.get('params') if (params_data): experiment['params'] = [{'key': param, 'value': params_data[param]}
diff --git a/tools/variations/fieldtrial_to_struct_unittest.py b/tools/variations/fieldtrial_to_struct_unittest.py index 999b0be4..97f8308 100644 --- a/tools/variations/fieldtrial_to_struct_unittest.py +++ b/tools/variations/fieldtrial_to_struct_unittest.py
@@ -42,6 +42,17 @@ 'platforms': ['win'], 'experiments': [{'name': 'OtherGroup'}] } + ], + 'TrialWithForcingFlag': [ + { + 'platforms': ['win'], + 'experiments': [ + { + 'name': 'ForcedGroup', + 'forcing_flag': "my-forcing-flag" + } + ] + } ] } result = fieldtrial_to_struct._FieldTrialConfigToDescription(config, 'win') @@ -76,6 +87,15 @@ 'name': 'Trial2', 'experiments': [{'name': 'OtherGroup'}] }, + { + 'name': 'TrialWithForcingFlag', + 'experiments': [ + { + 'name': 'ForcedGroup', + 'forcing_flag': "my-forcing-flag" + } + ] + }, ] } }
diff --git a/tools/variations/unittest_data/expected_output.cc b/tools/variations/unittest_data/expected_output.cc index eb240180..4ac4cc4 100644 --- a/tools/variations/unittest_data/expected_output.cc +++ b/tools/variations/unittest_data/expected_output.cc
@@ -10,6 +10,18 @@ #include "test_output.h" +const FieldTrialTestingExperiment array_kFieldTrialConfig_experiments_2[] = { + { + "ForcedGroup", + NULL, + 0, + NULL, + 0, + NULL, + 0, + "my-forcing-flag", + }, +}; const char* const array_kFieldTrialConfig_enable_features_1[] = { "X", }; @@ -22,6 +34,7 @@ 1, NULL, 0, + NULL, }, }; const char* const array_kFieldTrialConfig_disable_features_0[] = { @@ -67,6 +80,7 @@ 2, array_kFieldTrialConfig_disable_features, 1, + NULL, }, { "TestGroup2-2", @@ -76,6 +90,7 @@ 2, array_kFieldTrialConfig_disable_features_0, 1, + NULL, }, }; const FieldTrialTestingExperiment array_kFieldTrialConfig_experiments[] = { @@ -87,6 +102,7 @@ 0, NULL, 0, + NULL, }, }; const FieldTrialTestingStudy array_kFieldTrialConfig_studies[] = { @@ -105,8 +121,13 @@ array_kFieldTrialConfig_experiments_1, 1, }, + { + "TrialWithForcingFlag", + array_kFieldTrialConfig_experiments_2, + 1, + }, }; const FieldTrialTestingConfig kFieldTrialConfig = { array_kFieldTrialConfig_studies, - 3, + 4, };
diff --git a/tools/variations/unittest_data/expected_output.h b/tools/variations/unittest_data/expected_output.h index a36e68d..97fe813 100644 --- a/tools/variations/unittest_data/expected_output.h +++ b/tools/variations/unittest_data/expected_output.h
@@ -26,6 +26,7 @@ const size_t enable_features_size; const char* const * disable_features; const size_t disable_features_size; + const char* const forcing_flag; }; struct FieldTrialTestingStudy {
diff --git a/tools/variations/unittest_data/test_config.json b/tools/variations/unittest_data/test_config.json index f17738b32..4a7b94c 100644 --- a/tools/variations/unittest_data/test_config.json +++ b/tools/variations/unittest_data/test_config.json
@@ -35,5 +35,16 @@ "platforms": ["win"], "experiments": [{"name": "TestGroup3", "enable_features": ["X"]}] } + ], + "TrialWithForcingFlag": [ + { + "platforms": ["win"], + "experiments": [ + { + "name": "ForcedGroup", + "forcing_flag": "my-forcing-flag" + } + ] + } ] }
diff --git a/ui/app_list/app_list_item.cc b/ui/app_list/app_list_item.cc index d0daa27..fbaed42 100644 --- a/ui/app_list/app_list_item.cc +++ b/ui/app_list/app_list_item.cc
@@ -17,12 +17,14 @@ } AppListItem::~AppListItem() { - FOR_EACH_OBSERVER(AppListItemObserver, observers_, ItemBeingDestroyed()); + for (auto& observer : observers_) + observer.ItemBeingDestroyed(); } void AppListItem::SetIcon(const gfx::ImageSkia& icon) { icon_ = icon; - FOR_EACH_OBSERVER(AppListItemObserver, observers_, ItemIconChanged()); + for (auto& observer : observers_) + observer.ItemIconChanged(); } void AppListItem::SetIsInstalling(bool is_installing) { @@ -30,9 +32,8 @@ return; is_installing_ = is_installing; - FOR_EACH_OBSERVER(AppListItemObserver, - observers_, - ItemIsInstallingChanged()); + for (auto& observer : observers_) + observer.ItemIsInstallingChanged(); } void AppListItem::SetPercentDownloaded(int percent_downloaded) { @@ -40,9 +41,8 @@ return; percent_downloaded_ = percent_downloaded; - FOR_EACH_OBSERVER(AppListItemObserver, - observers_, - ItemPercentDownloadedChanged()); + for (auto& observer : observers_) + observer.ItemPercentDownloadedChanged(); } void AppListItem::AddObserver(AppListItemObserver* observer) { @@ -96,7 +96,8 @@ return; name_ = name; short_name_.clear(); - FOR_EACH_OBSERVER(AppListItemObserver, observers_, ItemNameChanged()); + for (auto& observer : observers_) + observer.ItemNameChanged(); } void AppListItem::SetNameAndShortName(const std::string& name, @@ -105,7 +106,8 @@ return; name_ = name; short_name_ = short_name; - FOR_EACH_OBSERVER(AppListItemObserver, observers_, ItemNameChanged()); + for (auto& observer : observers_) + observer.ItemNameChanged(); } } // namespace app_list
diff --git a/ui/app_list/app_list_item_list.cc b/ui/app_list/app_list_item_list.cc index 74f632d2..6e1e564b 100644 --- a/ui/app_list/app_list_item_list.cc +++ b/ui/app_list/app_list_item_list.cc
@@ -84,9 +84,8 @@ // Insert the item and notify observers. app_list_items_.insert(app_list_items_.begin() + to_index, target_item); - FOR_EACH_OBSERVER(AppListItemListObserver, - observers_, - OnListItemMoved(from_index, to_index, target_item)); + for (auto& observer : observers_) + observer.OnListItemMoved(from_index, to_index, target_item); } void AppListItemList::SetItemPosition(AppListItem* item, @@ -120,9 +119,8 @@ << " To: " << to_index; item->set_position(new_position); app_list_items_.insert(app_list_items_.begin() + to_index, item); - FOR_EACH_OBSERVER(AppListItemListObserver, - observers_, - OnListItemMoved(from_index, to_index, item)); + for (auto& observer : observers_) + observer.OnListItemMoved(from_index, to_index, item); } void AppListItemList::HighlightItemInstalledFromUI(const std::string& id) { @@ -131,9 +129,8 @@ size_t index; if (FindItemIndex(highlighted_id_, &index)) { item_at(index)->set_highlighted(false); - FOR_EACH_OBSERVER(AppListItemListObserver, - observers_, - OnAppListItemHighlight(index, false)); + for (auto& observer : observers_) + observer.OnAppListItemHighlight(index, false); } highlighted_id_ = id; if (!FindItemIndex(highlighted_id_, &index)) { @@ -143,8 +140,8 @@ } item_at(index)->set_highlighted(true); - FOR_EACH_OBSERVER( - AppListItemListObserver, observers_, OnAppListItemHighlight(index, true)); + for (auto& observer : observers_) + observer.OnAppListItemHighlight(index, true); } // AppListItemList private @@ -179,16 +176,14 @@ EnsureValidItemPosition(item); size_t index = GetItemSortOrderIndex(item->position(), item->id()); app_list_items_.insert(app_list_items_.begin() + index, item_ptr.release()); - FOR_EACH_OBSERVER(AppListItemListObserver, - observers_, - OnListItemAdded(index, item)); + for (auto& observer : observers_) + observer.OnListItemAdded(index, item); if (item->id() == highlighted_id_) { // Item not present when highlight requested, so highlight it now. item->set_highlighted(true); - FOR_EACH_OBSERVER(AppListItemListObserver, - observers_, - OnAppListItemHighlight(index, true)); + for (auto& observer : observers_) + observer.OnAppListItemHighlight(index, true); } return item; } @@ -210,9 +205,8 @@ CHECK_LT(index, item_count()); AppListItem* item = app_list_items_[index]; app_list_items_.weak_erase(app_list_items_.begin() + index); - FOR_EACH_OBSERVER(AppListItemListObserver, - observers_, - OnListItemRemoved(index, item)); + for (auto& observer : observers_) + observer.OnListItemRemoved(index, item); return base::WrapUnique<AppListItem>(item); } @@ -270,9 +264,8 @@ cur->set_position(prev->position().CreateAfter()); prev = cur; } - FOR_EACH_OBSERVER(AppListItemListObserver, - observers_, - OnListItemMoved(index, index, app_list_items_[index])); + for (auto& observer : observers_) + observer.OnListItemMoved(index, index, app_list_items_[index]); } } // namespace app_list
diff --git a/ui/app_list/app_list_model.cc b/ui/app_list/app_list_model.cc index cf713d1..38c2d5c 100644 --- a/ui/app_list/app_list_model.cc +++ b/ui/app_list/app_list_model.cc
@@ -41,9 +41,8 @@ return; status_ = status; - FOR_EACH_OBSERVER(AppListModelObserver, - observers_, - OnAppListModelStatusChanged()); + for (auto& observer : observers_) + observer.OnAppListModelStatusChanged(); } void AppListModel::SetState(State state) { @@ -54,9 +53,8 @@ state_ = state; - FOR_EACH_OBSERVER(AppListModelObserver, - observers_, - OnAppListModelStateChanged(old_state, state_)); + for (auto& observer : observers_) + observer.OnAppListModelStateChanged(old_state, state_); } AppListItem* AppListModel::FindItem(const std::string& id) { @@ -232,17 +230,15 @@ AppListFolderItem* folder = FindFolderItem(item->folder_id()); DCHECK(folder); folder->item_list()->SetItemPosition(item, new_position); - FOR_EACH_OBSERVER(AppListModelObserver, - observers_, - OnAppListItemUpdated(item)); + for (auto& observer : observers_) + observer.OnAppListItemUpdated(item); } void AppListModel::SetItemName(AppListItem* item, const std::string& name) { item->SetName(name); DVLOG(2) << "AppListModel::SetItemName: " << item->ToDebugString(); - FOR_EACH_OBSERVER(AppListModelObserver, - observers_, - OnAppListItemUpdated(item)); + for (auto& observer : observers_) + observer.OnAppListItemUpdated(item); } void AppListModel::SetItemNameAndShortName(AppListItem* item, @@ -251,9 +247,8 @@ item->SetNameAndShortName(name, short_name); DVLOG(2) << "AppListModel::SetItemNameAndShortName: " << item->ToDebugString(); - FOR_EACH_OBSERVER(AppListModelObserver, - observers_, - OnAppListItemUpdated(item)); + for (auto& observer : observers_) + observer.OnAppListItemUpdated(item); } void AppListModel::DeleteItem(const std::string& id) { @@ -263,22 +258,22 @@ if (!item->IsInFolder()) { DCHECK_EQ(0u, item->ChildItemCount()) << "Invalid call to DeleteItem for item with children: " << id; - FOR_EACH_OBSERVER(AppListModelObserver, - observers_, - OnAppListItemWillBeDeleted(item)); + for (auto& observer : observers_) + observer.OnAppListItemWillBeDeleted(item); top_level_item_list_->DeleteItem(id); - FOR_EACH_OBSERVER(AppListModelObserver, observers_, OnAppListItemDeleted()); + for (auto& observer : observers_) + observer.OnAppListItemDeleted(); return; } AppListFolderItem* folder = FindFolderItem(item->folder_id()); DCHECK(folder) << "Folder not found for item: " << item->ToDebugString(); std::unique_ptr<AppListItem> child_item = RemoveItemFromFolder(folder, item); DCHECK_EQ(item, child_item.get()); - FOR_EACH_OBSERVER(AppListModelObserver, - observers_, - OnAppListItemWillBeDeleted(item)); + for (auto& observer : observers_) + observer.OnAppListItemWillBeDeleted(item); child_item.reset(); // Deletes item. - FOR_EACH_OBSERVER(AppListModelObserver, observers_, OnAppListItemDeleted()); + for (auto& observer : observers_) + observer.OnAppListItemDeleted(); } void AppListModel::DeleteUninstalledItem(const std::string& id) { @@ -329,8 +324,8 @@ void AppListModel::SetCustomLauncherPageEnabled(bool enabled) { custom_launcher_page_enabled_ = enabled; - FOR_EACH_OBSERVER(AppListModelObserver, observers_, - OnCustomLauncherPageEnabledStateChanged(enabled)); + for (auto& observer : observers_) + observer.OnCustomLauncherPageEnabledStateChanged(enabled); } std::vector<SearchResult*> AppListModel::FilterSearchResultsByDisplayType( @@ -367,8 +362,8 @@ void AppListModel::SetSearchEngineIsGoogle(bool is_google) { search_engine_is_google_ = is_google; - FOR_EACH_OBSERVER(AppListModelObserver, observers_, - OnSearchEngineIsGoogleChanged(is_google)); + for (auto& observer : observers_) + observer.OnSearchEngineIsGoogleChanged(is_google); } // Private methods @@ -376,9 +371,8 @@ void AppListModel::OnListItemMoved(size_t from_index, size_t to_index, AppListItem* item) { - FOR_EACH_OBSERVER(AppListModelObserver, - observers_, - OnAppListItemUpdated(item)); + for (auto& observer : observers_) + observer.OnAppListItemUpdated(item); } AppListFolderItem* AppListModel::FindOrCreateFolderItem( @@ -409,9 +403,8 @@ std::unique_ptr<AppListItem> item_ptr) { DCHECK(!item_ptr->IsInFolder()); AppListItem* item = top_level_item_list_->AddItem(std::move(item_ptr)); - FOR_EACH_OBSERVER(AppListModelObserver, - observers_, - OnAppListItemAdded(item)); + for (auto& observer : observers_) + observer.OnAppListItemAdded(item); return item; } @@ -419,9 +412,8 @@ std::unique_ptr<AppListItem> item_ptr) { DCHECK(!item_ptr->IsInFolder()); AppListItem* item = top_level_item_list_->AddItem(std::move(item_ptr)); - FOR_EACH_OBSERVER(AppListModelObserver, - observers_, - OnAppListItemUpdated(item)); + for (auto& observer : observers_) + observer.OnAppListItemUpdated(item); return item; } @@ -431,9 +423,8 @@ CHECK_NE(folder->id(), item_ptr->folder_id()); AppListItem* item = folder->item_list()->AddItem(std::move(item_ptr)); item->set_folder_id(folder->id()); - FOR_EACH_OBSERVER(AppListModelObserver, - observers_, - OnAppListItemUpdated(item)); + for (auto& observer : observers_) + observer.OnAppListItemUpdated(item); return item; }
diff --git a/ui/app_list/folder_image.cc b/ui/app_list/folder_image.cc index 258bc55..8d0282e 100644 --- a/ui/app_list/folder_image.cc +++ b/ui/app_list/folder_image.cc
@@ -223,7 +223,8 @@ icon_ = gfx::ImageSkia(new FolderImageSource(top_icons, icon_size), icon_size); - FOR_EACH_OBSERVER(FolderImageObserver, observers_, OnFolderImageUpdated()); + for (auto& observer : observers_) + observer.OnFolderImageUpdated(); } } // namespace app_list
diff --git a/ui/app_list/pagination_model.cc b/ui/app_list/pagination_model.cc index 0e568d81..c34ee7679a 100644 --- a/ui/app_list/pagination_model.cc +++ b/ui/app_list/pagination_model.cc
@@ -33,7 +33,8 @@ SelectPage(0, false /* animate */); if (selected_page_ >= total_pages_) SelectPage(std::max(total_pages_ - 1, 0), false /* animate */); - FOR_EACH_OBSERVER(PaginationModelObserver, observers_, TotalPagesChanged()); + for (auto& observer : observers_) + observer.TotalPagesChanged(); } void PaginationModel::SelectPage(int page, bool animate) { @@ -197,17 +198,18 @@ void PaginationModel::NotifySelectedPageChanged(int old_selected, int new_selected) { - FOR_EACH_OBSERVER(PaginationModelObserver, - observers_, - SelectedPageChanged(old_selected, new_selected)); + for (auto& observer : observers_) + observer.SelectedPageChanged(old_selected, new_selected); } void PaginationModel::NotifyTransitionStarted() { - FOR_EACH_OBSERVER(PaginationModelObserver, observers_, TransitionStarted()); + for (auto& observer : observers_) + observer.TransitionStarted(); } void PaginationModel::NotifyTransitionChanged() { - FOR_EACH_OBSERVER(PaginationModelObserver, observers_, TransitionChanged()); + for (auto& observer : observers_) + observer.TransitionChanged(); } int PaginationModel::CalculateTargetPage(int delta) const {
diff --git a/ui/app_list/search/history_data.cc b/ui/app_list/search/history_data.cc index 388415c..777990b 100644 --- a/ui/app_list/search/history_data.cc +++ b/ui/app_list/search/history_data.cc
@@ -145,8 +145,8 @@ if (loaded_data) loaded_data->swap(associations_); - FOR_EACH_OBSERVER( - HistoryDataObserver, observers_, OnHistoryDataLoadedFromStore()); + for (auto& observer : observers_) + observer.OnHistoryDataLoadedFromStore(); } void HistoryData::TrimEntries() {
diff --git a/ui/app_list/search_box_model.cc b/ui/app_list/search_box_model.cc index aa29fcc..4691883 100644 --- a/ui/app_list/search_box_model.cc +++ b/ui/app_list/search_box_model.cc
@@ -36,9 +36,8 @@ void SearchBoxModel::SetSpeechRecognitionButton( std::unique_ptr<SearchBoxModel::SpeechButtonProperty> speech_button) { speech_button_ = std::move(speech_button); - FOR_EACH_OBSERVER(SearchBoxModelObserver, - observers_, - SpeechRecognitionButtonPropChanged()); + for (auto& observer : observers_) + observer.SpeechRecognitionButtonPropChanged(); } void SearchBoxModel::SetHintText(const base::string16& hint_text) { @@ -46,7 +45,8 @@ return; hint_text_ = hint_text; - FOR_EACH_OBSERVER(SearchBoxModelObserver, observers_, HintTextChanged()); + for (auto& observer : observers_) + observer.HintTextChanged(); } void SearchBoxModel::SetAccessibleName(const base::string16& accessible_name) { @@ -54,7 +54,8 @@ return; accessible_name_ = accessible_name; - FOR_EACH_OBSERVER(SearchBoxModelObserver, observers_, HintTextChanged()); + for (auto& observer : observers_) + observer.HintTextChanged(); } void SearchBoxModel::SetSelectionModel(const gfx::SelectionModel& sel) { @@ -62,9 +63,8 @@ return; selection_model_ = sel; - FOR_EACH_OBSERVER(SearchBoxModelObserver, - observers_, - SelectionModelChanged()); + for (auto& observer : observers_) + observer.SelectionModelChanged(); } void SearchBoxModel::SetText(const base::string16& text) { @@ -77,7 +77,8 @@ UMA_HISTOGRAM_ENUMERATION("Apps.AppListSearchCommenced", 1, 2); } text_ = text; - FOR_EACH_OBSERVER(SearchBoxModelObserver, observers_, TextChanged()); + for (auto& observer : observers_) + observer.TextChanged(); } void SearchBoxModel::AddObserver(SearchBoxModelObserver* observer) {
diff --git a/ui/app_list/search_result.cc b/ui/app_list/search_result.cc index 7f64be1..63862ef 100644 --- a/ui/app_list/search_result.cc +++ b/ui/app_list/search_result.cc
@@ -41,26 +41,26 @@ } SearchResult::~SearchResult() { - FOR_EACH_OBSERVER(SearchResultObserver, observers_, OnResultDestroying()); + for (auto& observer : observers_) + observer.OnResultDestroying(); } void SearchResult::SetIcon(const gfx::ImageSkia& icon) { icon_ = icon; - FOR_EACH_OBSERVER(SearchResultObserver, - observers_, - OnIconChanged()); + for (auto& observer : observers_) + observer.OnIconChanged(); } void SearchResult::SetBadgeIcon(const gfx::ImageSkia& badge_icon) { badge_icon_ = badge_icon; - FOR_EACH_OBSERVER(SearchResultObserver, observers_, OnBadgeIconChanged()); + for (auto& observer : observers_) + observer.OnBadgeIconChanged(); } void SearchResult::SetActions(const Actions& sets) { actions_ = sets; - FOR_EACH_OBSERVER(SearchResultObserver, - observers_, - OnActionsChanged()); + for (auto& observer : observers_) + observer.OnActionsChanged(); } void SearchResult::SetIsInstalling(bool is_installing) { @@ -68,9 +68,8 @@ return; is_installing_ = is_installing; - FOR_EACH_OBSERVER(SearchResultObserver, - observers_, - OnIsInstallingChanged()); + for (auto& observer : observers_) + observer.OnIsInstallingChanged(); } void SearchResult::SetPercentDownloaded(int percent_downloaded) { @@ -78,9 +77,8 @@ return; percent_downloaded_ = percent_downloaded; - FOR_EACH_OBSERVER(SearchResultObserver, - observers_, - OnPercentDownloadedChanged()); + for (auto& observer : observers_) + observer.OnPercentDownloadedChanged(); } int SearchResult::GetPreferredIconDimension() const { @@ -100,7 +98,8 @@ } void SearchResult::NotifyItemInstalled() { - FOR_EACH_OBSERVER(SearchResultObserver, observers_, OnItemInstalled()); + for (auto& observer : observers_) + observer.OnItemInstalled(); } void SearchResult::AddObserver(SearchResultObserver* observer) {
diff --git a/ui/app_list/speech_ui_model.cc b/ui/app_list/speech_ui_model.cc index 927619d..f85109e 100644 --- a/ui/app_list/speech_ui_model.cc +++ b/ui/app_list/speech_ui_model.cc
@@ -35,9 +35,8 @@ result_ = result; is_final_ = is_final; - FOR_EACH_OBSERVER(SpeechUIModelObserver, - observers_, - OnSpeechResult(result, is_final)); + for (auto& observer : observers_) + observer.OnSpeechResult(result, is_final); } void SpeechUIModel::UpdateSoundLevel(int16_t level) { @@ -70,9 +69,8 @@ std::numeric_limits<uint8_t>::max() / range; } - FOR_EACH_OBSERVER(SpeechUIModelObserver, - observers_, - OnSpeechSoundLevelChanged(visible_level)); + for (auto& observer : observers_) + observer.OnSpeechSoundLevelChanged(visible_level); } void SpeechUIModel::SetSpeechRecognitionState(SpeechRecognitionState new_state, @@ -94,9 +92,8 @@ maximum_sound_level_ = kDefaultSoundLevel; } - FOR_EACH_OBSERVER(SpeechUIModelObserver, - observers_, - OnSpeechRecognitionStateChanged(new_state)); + for (auto& observer : observers_) + observer.OnSpeechRecognitionStateChanged(new_state); } void SpeechUIModel::AddObserver(SpeechUIModelObserver* observer) {
diff --git a/ui/app_list/views/app_list_view.cc b/ui/app_list/views/app_list_view.cc index beffb296..893d005 100644 --- a/ui/app_list/views/app_list_view.cc +++ b/ui/app_list/views/app_list_view.cc
@@ -621,9 +621,10 @@ bool active) { // Do not called inherited function as the bubble delegate auto close // functionality is not used. - if (widget == GetWidget()) - FOR_EACH_OBSERVER(AppListViewObserver, observers_, - OnActivationChanged(widget, active)); + if (widget == GetWidget()) { + for (auto& observer : observers_) + observer.OnActivationChanged(widget, active); + } } void AppListView::OnWidgetVisibilityChanged(views::Widget* widget,
diff --git a/ui/app_list/views/top_icon_animation_view.cc b/ui/app_list/views/top_icon_animation_view.cc index 32dc4a4..8e024e3 100644 --- a/ui/app_list/views/top_icon_animation_view.cc +++ b/ui/app_list/views/top_icon_animation_view.cc
@@ -82,9 +82,8 @@ void TopIconAnimationView::OnImplicitAnimationsCompleted() { SetVisible(false); - FOR_EACH_OBSERVER(TopIconAnimationObserver, - observers_, - OnTopIconAnimationsComplete()); + for (auto& observer : observers_) + observer.OnTopIconAnimationsComplete(); base::ThreadTaskRunnerHandle::Get()->DeleteSoon(FROM_HERE, this); }
diff --git a/ui/chromeos/translations/ui_chromeos_strings_lt.xtb b/ui/chromeos/translations/ui_chromeos_strings_lt.xtb index fa08264..7284757 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_lt.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_lt.xtb
@@ -2,7 +2,7 @@ <!DOCTYPE translationbundle> <translationbundle lang="lt"> <translation id="1119447706177454957">Vidinė klaida</translation> -<translation id="153454903766751181">Inicijuojamas korinio ryšio modemas...</translation> +<translation id="153454903766751181">Inicijuojamas mobiliojo ryšio modemas...</translation> <translation id="158849752021629804">Reikalingas namų tinklas</translation> <translation id="1661867754829461514">Trūksta PIN kodo</translation> <translation id="1773212559869067373">Autentifikavimo sertifikatas atmestas vietiniu mastu</translation> @@ -47,7 +47,7 @@ <translation id="6312403991423642364">Nežinoma tinklo klaida</translation> <translation id="6490455614072479501">Nepavyko prisijungti prie „<ph name="NAME" />“: <ph name="DETAILS" /> Serverio pranešimas: <ph name="SERVER_MSG" /></translation> -<translation id="6549021752953852991">Nėra jokių pasiekiamų korinio ryšio tinklų</translation> +<translation id="6549021752953852991">Nėra jokių pasiekiamų mobiliojo ryšio tinklų</translation> <translation id="6732801395666424405">Sertifikatai neįkelti</translation> <translation id="6857811139397017780">Suaktyvinti „<ph name="NETWORKSERVICE" />“</translation> <translation id="6935521024859866267">Aukštyn kojomis</translation> @@ -59,7 +59,7 @@ <translation id="7256405249507348194">Neatpažinta klaida: <ph name="DESC" /></translation> <translation id="7297443947353982503">Naudotojo vardas / slaptažodis netinkamas arba EAP autentifikavimas nepavyko</translation> <translation id="735745346212279324">VPN atjungtas</translation> -<translation id="7874779702599364982">Ieškoma korinio ryšio tinklų...</translation> +<translation id="7874779702599364982">Ieškoma mobiliojo ryšio tinklų...</translation> <translation id="7925247922861151263">AAA patikra nepavyko</translation> <translation id="7973962044839454485">Nepavyko autentifikuoti PGP dėl netinkamo naudotojo vardo ar slaptažodžio</translation> <translation id="8000066093800657092">Tinklo nėra</translation>
diff --git a/ui/gl/android/scoped_java_surface.cc b/ui/gl/android/scoped_java_surface.cc index 73fd856..1f0501b 100644 --- a/ui/gl/android/scoped_java_surface.cc +++ b/ui/gl/android/scoped_java_surface.cc
@@ -62,6 +62,11 @@ return j_surface_.is_null(); } +bool ScopedJavaSurface::IsValid() const { + JNIEnv* env = base::android::AttachCurrentThread(); + return !IsEmpty() && JNI_Surface::Java_Surface_isValid(env, j_surface_); +} + // static ScopedJavaSurface ScopedJavaSurface::AcquireExternalSurface(jobject surface) { JNIEnv* env = base::android::AttachCurrentThread();
diff --git a/ui/gl/android/scoped_java_surface.h b/ui/gl/android/scoped_java_surface.h index 5bf71d0..c88ada4 100644 --- a/ui/gl/android/scoped_java_surface.h +++ b/ui/gl/android/scoped_java_surface.h
@@ -43,6 +43,9 @@ // Checks whether the surface is an empty one. bool IsEmpty() const; + // Checks whether this object references a valid surface. + bool IsValid() const; + // Checks whether the surface is hardware protected so that no readback is // possible. bool is_protected() const { return is_protected_; }
diff --git a/ui/login/account_picker/screen_account_picker.js b/ui/login/account_picker/screen_account_picker.js index 6d4b8d5..69c5eaf 100644 --- a/ui/login/account_picker/screen_account_picker.js +++ b/ui/login/account_picker/screen_account_picker.js
@@ -183,12 +183,20 @@ /** @const */ var BUBBLE_OFFSET = 7; /** @const */ var BUBBLE_PADDING = 4; + // Anchor the bubble to the pod instead of the input if the pin keyboard + // is showing to avoid covering parts of the pin keyboard. + var bubbleAnchor; + if (activatedPod.pinContainer) + bubbleAnchor = activatedPod; + else + bubbleAnchor = activatedPod.mainInput; + // We want the bubble to point to where the input is after it is done - // tranisitioning. + // transitioning. var showBottomCallback = function() { activatedPod.removeEventListener("webkitTransitionEnd", showBottomCallback); - $('bubble').showContentForElement(activatedPod.mainInput, + $('bubble').showContentForElement(bubbleAnchor, cr.ui.Bubble.Attachment.BOTTOM, error, BUBBLE_OFFSET, BUBBLE_PADDING); @@ -204,7 +212,7 @@ var showTopCallback = function() { activatedPod.removeEventListener("webkitTransitionEnd", showTopCallback); - $('bubble').showContentForElement(activatedPod.mainInput, + $('bubble').showContentForElement(bubbleAnchor, cr.ui.Bubble.Attachment.TOP, error, BUBBLE_OFFSET, BUBBLE_PADDING);
diff --git a/ui/message_center/message_center_impl.cc b/ui/message_center/message_center_impl.cc index de7ef42..aa27168 100644 --- a/ui/message_center/message_center_impl.cc +++ b/ui/message_center/message_center_impl.cc
@@ -418,13 +418,11 @@ notification_list_->GetVisibleNotifications(blockers_)); for (const auto& id : blocked_ids) { - FOR_EACH_OBSERVER(MessageCenterObserver, - observer_list_, - OnNotificationUpdated(id)); + for (auto& observer : observer_list_) + observer.OnNotificationUpdated(id); } - FOR_EACH_OBSERVER(MessageCenterObserver, - observer_list_, - OnBlockingStateChanged(blocker)); + for (auto& observer : observer_list_) + observer.OnBlockingStateChanged(blocker); } void MessageCenterImpl::UpdateIconImage( @@ -448,8 +446,8 @@ notification_cache_.RecountUnread(); for (const auto& id : updated_ids) { - FOR_EACH_OBSERVER( - MessageCenterObserver, observer_list_, OnNotificationUpdated(id)); + for (auto& observer : observer_list_) + observer.OnNotificationUpdated(id); } } @@ -458,9 +456,8 @@ notification_queue_->ApplyChanges(this); } - FOR_EACH_OBSERVER(MessageCenterObserver, - observer_list_, - OnCenterVisibilityChanged(visibility)); + for (auto& observer : observer_list_) + observer.OnCenterVisibilityChanged(visibility); } bool MessageCenterImpl::IsMessageCenterVisible() const { @@ -544,11 +541,11 @@ notification_list_->GetVisibleNotifications(blockers_)); if (already_exists) { - FOR_EACH_OBSERVER( - MessageCenterObserver, observer_list_, OnNotificationUpdated(id)); + for (auto& observer : observer_list_) + observer.OnNotificationUpdated(id); } else { - FOR_EACH_OBSERVER( - MessageCenterObserver, observer_list_, OnNotificationAdded(id)); + for (auto& observer : observer_list_) + observer.OnNotificationAdded(id); } } @@ -594,13 +591,13 @@ notification_cache_.Rebuild( notification_list_->GetVisibleNotifications(blockers_)); if (old_id == new_id) { - FOR_EACH_OBSERVER( - MessageCenterObserver, observer_list_, OnNotificationUpdated(new_id)); + for (auto& observer : observer_list_) + observer.OnNotificationUpdated(new_id); } else { - FOR_EACH_OBSERVER(MessageCenterObserver, observer_list_, - OnNotificationRemoved(old_id, false)); - FOR_EACH_OBSERVER(MessageCenterObserver, observer_list_, - OnNotificationAdded(new_id)); + for (auto& observer : observer_list_) + observer.OnNotificationRemoved(old_id, false); + for (auto& observer : observer_list_) + observer.OnNotificationAdded(new_id); } } @@ -636,9 +633,8 @@ notification_list_->RemoveNotification(copied_id); notification_cache_.Rebuild( notification_list_->GetVisibleNotifications(blockers_)); - FOR_EACH_OBSERVER(MessageCenterObserver, - observer_list_, - OnNotificationRemoved(copied_id, by_user)); + for (auto& observer : observer_list_) + observer.OnNotificationRemoved(copied_id, by_user); } void MessageCenterImpl::RemoveNotificationsForNotifierId( @@ -679,9 +675,8 @@ notification_list_->GetVisibleNotifications(blockers_)); } for (const auto& id : ids) { - FOR_EACH_OBSERVER(MessageCenterObserver, - observer_list_, - OnNotificationRemoved(id, by_user)); + for (auto& observer : observer_list_) + observer.OnNotificationRemoved(id, by_user); } } @@ -701,8 +696,8 @@ } if (updated) { - FOR_EACH_OBSERVER(MessageCenterObserver, observer_list_, - OnNotificationUpdated(notification_id)); + for (auto& observer : observer_list_) + observer.OnNotificationUpdated(notification_id); } } @@ -722,8 +717,8 @@ } if (updated) { - FOR_EACH_OBSERVER(MessageCenterObserver, observer_list_, - OnNotificationUpdated(notification_id)); + for (auto& observer : observer_list_) + observer.OnNotificationUpdated(notification_id); } } @@ -745,8 +740,8 @@ } if (updated) { - FOR_EACH_OBSERVER(MessageCenterObserver, observer_list_, - OnNotificationUpdated(notification_id)); + for (auto& observer : observer_list_) + observer.OnNotificationUpdated(notification_id); } } @@ -774,8 +769,8 @@ notification_list_->GetNotificationDelegate(id); if (delegate.get()) delegate->Click(); - FOR_EACH_OBSERVER( - MessageCenterObserver, observer_list_, OnNotificationClicked(id)); + for (auto& observer : observer_list_) + observer.OnNotificationClicked(id); } void MessageCenterImpl::ClickOnNotificationButton(const std::string& id, @@ -790,9 +785,8 @@ notification_list_->GetNotificationDelegate(id); if (delegate.get()) delegate->ButtonClick(button_index); - FOR_EACH_OBSERVER( - MessageCenterObserver, observer_list_, OnNotificationButtonClicked( - id, button_index)); + for (auto& observer : observer_list_) + observer.OnNotificationButtonClicked(id, button_index); } void MessageCenterImpl::ClickOnSettingsButton(const std::string& id) { @@ -800,8 +794,8 @@ notification_list_->GetNotificationDelegate(id); if (delegate.get()) delegate->SettingsClick(); - FOR_EACH_OBSERVER(MessageCenterObserver, observer_list_, - OnNotificationSettingsClicked()); + for (auto& observer : observer_list_) + observer.OnNotificationSettingsClicked(); } void MessageCenterImpl::MarkSinglePopupAsShown(const std::string& id, @@ -813,8 +807,8 @@ #else notification_list_->MarkSinglePopupAsShown(id, mark_notification_as_read); notification_cache_.RecountUnread(); - FOR_EACH_OBSERVER( - MessageCenterObserver, observer_list_, OnNotificationUpdated(id)); + for (auto& observer : observer_list_) + observer.OnNotificationUpdated(id); #endif // defined(OS_CHROMEOS) } @@ -831,10 +825,8 @@ notification_list_->GetNotificationDelegate(id); if (delegate.get()) delegate->Display(); - FOR_EACH_OBSERVER( - MessageCenterObserver, - observer_list_, - OnNotificationDisplayed(id, source)); + for (auto& observer : observer_list_) + observer.OnNotificationDisplayed(id, source); } void MessageCenterImpl::SetNotifierSettingsProvider( @@ -855,9 +847,8 @@ void MessageCenterImpl::SetQuietMode(bool in_quiet_mode) { if (in_quiet_mode != notification_list_->quiet_mode()) { notification_list_->SetQuietMode(in_quiet_mode); - FOR_EACH_OBSERVER(MessageCenterObserver, - observer_list_, - OnQuietModeChanged(in_quiet_mode)); + for (auto& observer : observer_list_) + observer.OnQuietModeChanged(in_quiet_mode); } quiet_mode_timer_.reset(); } @@ -865,8 +856,8 @@ void MessageCenterImpl::SetLockedState(bool locked) { if (locked != locked_) { locked_ = locked; - FOR_EACH_OBSERVER(MessageCenterObserver, observer_list_, - OnLockedStateChanged(locked)); + for (auto& observer : observer_list_) + observer.OnLockedStateChanged(locked); } } @@ -878,8 +869,8 @@ quiet_mode_timer_->Reset(); } else { notification_list_->SetQuietMode(true); - FOR_EACH_OBSERVER( - MessageCenterObserver, observer_list_, OnQuietModeChanged(true)); + for (auto& observer : observer_list_) + observer.OnQuietModeChanged(true); quiet_mode_timer_.reset(new base::OneShotTimer); quiet_mode_timer_->Start(
diff --git a/ui/message_center/notification_blocker.cc b/ui/message_center/notification_blocker.cc index 9ad1656..80353e8b 100644 --- a/ui/message_center/notification_blocker.cc +++ b/ui/message_center/notification_blocker.cc
@@ -34,8 +34,8 @@ } void NotificationBlocker::NotifyBlockingStateChanged() { - FOR_EACH_OBSERVER( - NotificationBlocker::Observer, observers_, OnBlockingStateChanged(this)); + for (auto& observer : observers_) + observer.OnBlockingStateChanged(this); } } // namespace message_center
diff --git a/ui/ozone/platform/wayland/fake_server.cc b/ui/ozone/platform/wayland/fake_server.cc index 52424c9..1e02b33 100644 --- a/ui/ozone/platform/wayland/fake_server.cc +++ b/ui/ozone/platform/wayland/fake_server.cc
@@ -367,10 +367,12 @@ (void)server_fd.release(); base::Thread::Options options; - options.message_pump_factory = - base::Bind(&FakeServer::CreateMessagePump, base::Unretained(this)); + options.message_loop_type = MessageLoop::TYPE_IO; if (!base::Thread::StartWithOptions(options)) return false; + task_runner()->PostTask(FROM_HERE, + base::Bind(&FakeServer::StartWatchingFileDescriptor, + base::Unretained(this))); setenv("WAYLAND_SOCKET", base::UintToString(client_fd.release()).c_str(), 1); @@ -395,19 +397,17 @@ resume_event_.Wait(); } -std::unique_ptr<base::MessagePump> FakeServer::CreateMessagePump() { - auto pump = base::WrapUnique(new base::MessagePumpLibevent); - pump->WatchFileDescriptor(wl_event_loop_get_fd(event_loop_), true, - base::MessagePumpLibevent::WATCH_READ, &controller_, - this); - return std::move(pump); +void FakeServer::StartWatchingFileDescriptor() { + controller_ = base::FileDescriptorWatcher::WatchReadable( + wl_event_loop_get_fd(event_loop_), + base::Bind(&FakeServer::OnFileCanReadWithoutBlocking, + base::Unretained(this))); } -void FakeServer::OnFileCanReadWithoutBlocking(int fd) { +void FakeServer::OnFileCanReadWithoutBlocking() { wl_event_loop_dispatch(event_loop_, 0); wl_display_flush_clients(display_.get()); } -void FakeServer::OnFileCanWriteWithoutBlocking(int fd) {} } // namespace wl
diff --git a/ui/ozone/platform/wayland/fake_server.h b/ui/ozone/platform/wayland/fake_server.h index 8aa5e181e..fe97c2a 100644 --- a/ui/ozone/platform/wayland/fake_server.h +++ b/ui/ozone/platform/wayland/fake_server.h
@@ -7,8 +7,10 @@ #include <wayland-server-core.h> +#include <memory> + #include "base/bind.h" -#include "base/message_loop/message_pump_libevent.h" +#include "base/files/file_descriptor_watcher_posix.h" #include "base/synchronization/waitable_event.h" #include "base/threading/thread.h" #include "testing/gmock/include/gmock/gmock.h" @@ -182,7 +184,7 @@ void operator()(wl_display* display); }; -class FakeServer : public base::Thread, base::MessagePumpLibevent::Watcher { +class FakeServer : public base::Thread { public: FakeServer(); ~FakeServer() override; @@ -213,11 +215,9 @@ private: void DoPause(); - std::unique_ptr<base::MessagePump> CreateMessagePump(); + void StartWatchingFileDescriptor(); - // base::MessagePumpLibevent::Watcher - void OnFileCanReadWithoutBlocking(int fd) override; - void OnFileCanWriteWithoutBlocking(int fd) override; + void OnFileCanReadWithoutBlocking(); std::unique_ptr<wl_display, DisplayDeleter> display_; wl_client* client_ = nullptr; @@ -232,7 +232,7 @@ MockSeat seat_; MockXdgShell xdg_shell_; - base::MessagePumpLibevent::FileDescriptorWatcher controller_; + std::unique_ptr<base::FileDescriptorWatcher::Controller> controller_; DISALLOW_COPY_AND_ASSIGN(FakeServer); };
diff --git a/ui/views/controls/button/custom_button.cc b/ui/views/controls/button/custom_button.cc index 63092b9..73d94ebe 100644 --- a/ui/views/controls/button/custom_button.cc +++ b/ui/views/controls/button/custom_button.cc
@@ -94,6 +94,8 @@ } void CustomButton::StartThrobbing(int cycles_til_stop) { + if (!animate_on_state_change_) + return; is_throbbing_ = true; hover_animation_.StartThrobbing(cycles_til_stop); } @@ -403,7 +405,6 @@ : Button(listener), state_(STATE_NORMAL), hover_animation_(this), - animate_on_state_change_(true), is_throbbing_(false), triggerable_event_flags_(ui::EF_LEFT_MOUSE_BUTTON), request_focus_on_press_(false),
diff --git a/ui/views/controls/button/custom_button.h b/ui/views/controls/button/custom_button.h index a73d5008c..161824c 100644 --- a/ui/views/controls/button/custom_button.h +++ b/ui/views/controls/button/custom_button.h
@@ -42,6 +42,7 @@ void SetState(ButtonState state); // Starts throbbing. See HoverAnimation for a description of cycles_til_stop. + // This method does nothing if |animate_on_state_change_| is false. void StartThrobbing(int cycles_til_stop); // Stops throbbing immediately. @@ -165,8 +166,8 @@ gfx::ThrobAnimation hover_animation_; - // Should we animate when the state changes? Defaults to true. - bool animate_on_state_change_; + // Should we animate when the state changes? + bool animate_on_state_change_ = false; // Is the hover animation running because StartThrob was invoked? bool is_throbbing_;
diff --git a/ui/views/controls/button/image_button.cc b/ui/views/controls/button/image_button.cc index 483d971bb..d9426bea 100644 --- a/ui/views/controls/button/image_button.cc +++ b/ui/views/controls/button/image_button.cc
@@ -48,6 +48,8 @@ } void ImageButton::SetImage(ButtonState for_state, const gfx::ImageSkia* image) { + if (for_state == STATE_HOVERED) + set_animate_on_state_change(image != nullptr); images_[for_state] = image ? *image : gfx::ImageSkia(); PreferredSizeChanged(); if (state() == for_state)
diff --git a/ui/views/controls/button/md_text_button.cc b/ui/views/controls/button/md_text_button.cc index a29530c..6b914ac5 100644 --- a/ui/views/controls/button/md_text_button.cc +++ b/ui/views/controls/button/md_text_button.cc
@@ -91,6 +91,15 @@ UpdateColors(); } +void MdTextButton::OnPaintBackground(gfx::Canvas* canvas) { + LabelButton::OnPaintBackground(canvas); + if (hover_animation().is_animating() || state() == STATE_HOVERED) { + const int kHoverAlpha = is_prominent_ ? 0x0c : 0x05; + SkScalar alpha = hover_animation().CurrentValueBetween(0, kHoverAlpha); + canvas->FillRect(GetLocalBounds(), SkColorSetA(SK_ColorBLACK, alpha)); + } +} + void MdTextButton::OnFocus() { LabelButton::OnFocus(); FocusRing::Install(this); @@ -192,6 +201,8 @@ set_request_focus_on_press(false); LabelButton::SetFontList(GetMdFontList()); + set_animate_on_state_change(true); + // Paint to a layer so that the canvas is snapped to pixel boundaries (useful // for fractional DSF). SetPaintToLayer(true);
diff --git a/ui/views/controls/button/md_text_button.h b/ui/views/controls/button/md_text_button.h index 0ec17642..6633fa49 100644 --- a/ui/views/controls/button/md_text_button.h +++ b/ui/views/controls/button/md_text_button.h
@@ -30,6 +30,9 @@ // See |bg_color_override_|. void SetBgColorOverride(const base::Optional<SkColor>& color); + // View: + void OnPaintBackground(gfx::Canvas* canvas) override; + // LabelButton: void OnFocus() override; void OnBlur() override;
diff --git a/ui/views/controls/focus_ring.cc b/ui/views/controls/focus_ring.cc index af52a50..29adfa0 100644 --- a/ui/views/controls/focus_ring.cc +++ b/ui/views/controls/focus_ring.cc
@@ -34,8 +34,8 @@ const char FocusRing::kViewClassName[] = "FocusRing"; // static -void FocusRing::Install(views::View* parent, - ui::NativeTheme::ColorId override_color_id) { +views::View* FocusRing::Install(views::View* parent, + ui::NativeTheme::ColorId override_color_id) { DCHECK(parent->HasFocus()); FocusRing* ring = GetFocusRing(parent); if (!ring) { @@ -45,6 +45,7 @@ ring->override_color_id_ = override_color_id; ring->Layout(); ring->SchedulePaint(); + return ring; } // static
diff --git a/ui/views/controls/focus_ring.h b/ui/views/controls/focus_ring.h index c2e6cfd..53aa19d3 100644 --- a/ui/views/controls/focus_ring.h +++ b/ui/views/controls/focus_ring.h
@@ -21,7 +21,7 @@ // Create a FocusRing and adds it to |parent|, or updates the one that already // exists. |override_color_id| will be used in place of the default coloration // when provided. - static void Install(views::View* parent, + static View* Install(views::View* parent, ui::NativeTheme::ColorId override_color_id = ui::NativeTheme::kColorId_NumColors);
diff --git a/ui/views/controls/label.h b/ui/views/controls/label.h index 9421d1d..4481b35 100644 --- a/ui/views/controls/label.h +++ b/ui/views/controls/label.h
@@ -199,11 +199,11 @@ // The RenderText instances used to display elided and multi-line text. std::vector<std::unique_ptr<gfx::RenderText>> lines_; - SkColor requested_enabled_color_; - SkColor actual_enabled_color_; - SkColor requested_disabled_color_; - SkColor actual_disabled_color_; - SkColor background_color_; + SkColor requested_enabled_color_ = SK_ColorRED; + SkColor actual_enabled_color_ = SK_ColorRED; + SkColor requested_disabled_color_ = SK_ColorRED; + SkColor actual_disabled_color_ = SK_ColorRED; + SkColor background_color_ = SK_ColorRED; // Set to true once the corresponding setter is invoked. bool enabled_color_set_;
diff --git a/ui/views/controls/menu/menu_controller.cc b/ui/views/controls/menu/menu_controller.cc index aa608d55..29996dc5 100644 --- a/ui/views/controls/menu/menu_controller.cc +++ b/ui/views/controls/menu/menu_controller.cc
@@ -532,7 +532,13 @@ // WARNING: the call to MenuClosed deletes us. return; } - ExitAsyncRun(); + + // On Windows and Linux the destruction of this menu's Widget leads to the + // teardown of the platform specific drag-and-drop Widget. Do not shutdown + // while dragging, leave the Widget hidden until drag-and-drop has completed, + // at which point all menus will be destroyed. + if (!drag_in_progress_) + ExitAsyncRun(); } void MenuController::AddNestedDelegate(
diff --git a/ui/views/controls/menu/menu_controller_unittest.cc b/ui/views/controls/menu/menu_controller_unittest.cc index 486e927..451b469 100644 --- a/ui/views/controls/menu/menu_controller_unittest.cc +++ b/ui/views/controls/menu/menu_controller_unittest.cc
@@ -389,6 +389,12 @@ menu_controller_->showing_ = true; } + // Tests that the menu does not destroy itself when canceled during a drag. + void TestCancelAllDuringDrag() { + menu_controller_->CancelAll(); + EXPECT_EQ(0, menu_controller_delegate_->on_menu_closed_called()); + } + protected: void SetPendingStateItem(MenuItemView* item) { menu_controller_->pending_state_.item = item; @@ -1411,6 +1417,27 @@ StartDrag(); } +// Tests that if a CancelAll is called during drag-and-drop that it does not +// destroy the MenuController. On Windows and Linux this destruction also +// destroys the Widget used for drag-and-drop, thereby ending the drag. +TEST_F(MenuControllerTest, CancelAllDuringDrag) { + // This test creates two native widgets, but expects the child native widget + // to be able to reach up and use the parent native widget's aura + // objects. https://crbug.com/614037 + if (IsMus()) + return; + + MenuController* controller = menu_controller(); + controller->SetAsyncRun(true); + + TestDragDropClient drag_drop_client(base::Bind( + &MenuControllerTest::TestCancelAllDuringDrag, base::Unretained(this))); + aura::client::SetDragDropClient(owner()->GetNativeWindow()->GetRootWindow(), + &drag_drop_client); + AddButtonMenuItems(); + StartDrag(); +} + #endif // defined(USE_AURA) } // namespace test
diff --git a/ui/views/controls/scroll_view.cc b/ui/views/controls/scroll_view.cc index 68ee68f..a358128 100644 --- a/ui/views/controls/scroll_view.cc +++ b/ui/views/controls/scroll_view.cc
@@ -12,6 +12,7 @@ #include "ui/native_theme/native_theme.h" #include "ui/views/background.h" #include "ui/views/border.h" +#include "ui/views/controls/focus_ring.h" #include "ui/views/style/platform_style.h" #include "ui/views/widget/widget.h" @@ -271,6 +272,18 @@ vert_sb_ = vert_sb; } +void ScrollView::SetHasFocusRing(bool has_focus_ring) { + if (has_focus_ring == (focus_ring_ != nullptr)) + return; + if (has_focus_ring) { + focus_ring_ = FocusRing::Install(this); + } else { + FocusRing::Uninstall(this); + focus_ring_ = nullptr; + } + SchedulePaint(); +} + gfx::Size ScrollView::GetPreferredSize() const { if (!is_bounded()) return View::GetPreferredSize(); @@ -294,6 +307,9 @@ } void ScrollView::Layout() { + if (focus_ring_) + focus_ring_->Layout(); + gfx::Rect available_rect = GetContentsBounds(); if (is_bounded()) { int content_width = available_rect.width();
diff --git a/ui/views/controls/scroll_view.h b/ui/views/controls/scroll_view.h index 5f55c20d..ff444bb 100644 --- a/ui/views/controls/scroll_view.h +++ b/ui/views/controls/scroll_view.h
@@ -88,6 +88,9 @@ void SetHorizontalScrollBar(ScrollBar* horiz_sb); void SetVerticalScrollBar(ScrollBar* vert_sb); + // Sets whether this ScrollView has a focus ring or not. + void SetHasFocusRing(bool has_focus_ring); + // View overrides: gfx::Size GetPreferredSize() const override; int GetHeightForWidth(int width) const override; @@ -181,6 +184,9 @@ // than the viewport). bool hide_horizontal_scrollbar_; + // Focus ring, if one is installed. + View* focus_ring_ = nullptr; + DISALLOW_COPY_AND_ASSIGN(ScrollView); };
diff --git a/ui/views/controls/tree/tree_view.cc b/ui/views/controls/tree/tree_view.cc index a87875e7..fd195e2 100644 --- a/ui/views/controls/tree/tree_view.cc +++ b/ui/views/controls/tree/tree_view.cc
@@ -11,6 +11,7 @@ #include "base/message_loop/message_loop.h" #include "ui/accessibility/ax_view_state.h" #include "ui/base/ime/input_method.h" +#include "ui/base/material_design/material_design_controller.h" #include "ui/base/resource/resource_bundle.h" #include "ui/events/event.h" #include "ui/events/keycodes/keyboard_codes.h" @@ -21,6 +22,7 @@ #include "ui/gfx/skia_util.h" #include "ui/native_theme/native_theme.h" #include "ui/resources/grit/ui_resources.h" +#include "ui/views/controls/focus_ring.h" #include "ui/views/controls/prefix_selector.h" #include "ui/views/controls/scroll_view.h" #include "ui/views/controls/textfield/textfield.h" @@ -631,6 +633,8 @@ // Notify the InputMethod so that it knows to query the TextInputClient. if (GetInputMethod()) GetInputMethod()->OnCaretBoundsChanged(GetPrefixSelector()); + + SetHasFocusRing(true); } void TreeView::OnBlur() { @@ -639,6 +643,7 @@ SchedulePaintForNode(selected_node_); if (selector_) selector_->OnViewBlur(); + SetHasFocusRing(false); } bool TreeView::OnClickOrTap(const ui::LocatedEvent& event) { @@ -1057,6 +1062,22 @@ return arrow_bounds.Contains(point); } +void TreeView::SetHasFocusRing(bool shows) { + if (!ui::MaterialDesignController::IsSecondaryUiMaterial() || + !PlatformStyle::kTreeViewHasFocusRing) { + return; + } + // If this View is the grandchild of a ScrollView, use the grandparent + // ScrollView for the focus ring instead of this View so that the focus ring + // won't be scrolled. Since ScrollViews have a single content view, which they + // wrap in a ScrollView::Viewport, being the grandchild of a ScrollView + // implies being the sole grandchild, which means it's fine to wrap the focus + // ring around the grandparent here. + View* grandparent = parent() ? parent()->parent() : nullptr; + if (grandparent && grandparent->GetClassName() == ScrollView::kViewClassName) + static_cast<ScrollView*>(grandparent)->SetHasFocusRing(shows); +} + // InternalNode ---------------------------------------------------------------- TreeView::InternalNode::InternalNode()
diff --git a/ui/views/controls/tree/tree_view.h b/ui/views/controls/tree/tree_view.h index 5eb096e..61638067 100644 --- a/ui/views/controls/tree/tree_view.h +++ b/ui/views/controls/tree/tree_view.h
@@ -24,9 +24,10 @@ namespace views { +class PrefixSelector; +class ScrollView; class Textfield; class TreeViewController; -class PrefixSelector; // TreeView displays hierarchical data as returned from a TreeModel. The user // can expand, collapse and edit the items. A Controller may be attached to @@ -349,6 +350,11 @@ // control. bool IsPointInExpandControl(InternalNode* node, const gfx::Point& point); + // Sets whether a focus ring is visible on this control or not. This function + // does nothing if focus rings aren't enabled in general or if the platform's + // style does not use focus rings on TreeViews. + void SetHasFocusRing(bool); + // The model, may be null. ui::TreeModel* model_;
diff --git a/ui/views/examples/button_example.cc b/ui/views/examples/button_example.cc index 18410cf6..de882104 100644 --- a/ui/views/examples/button_example.cc +++ b/ui/views/examples/button_example.cc
@@ -59,16 +59,19 @@ container->AddChildView(new BlueButton(this, ASCIIToUTF16("Blue Button"))); - container->AddChildView( - MdTextButton::Create(nullptr, base::ASCIIToUTF16("Material design"))); - MdTextButton* md_button = - MdTextButton::Create(nullptr, base::ASCIIToUTF16("Default")); - md_button->SetIsDefault(true); - container->AddChildView(md_button); - md_button = - MdTextButton::Create(nullptr, base::ASCIIToUTF16("Call to action")); - md_button->SetProminent(true); - container->AddChildView(md_button); + md_button_ = + MdTextButton::Create(this, base::ASCIIToUTF16("Material design")); + container->AddChildView(md_button_); + + md_default_button_ = + MdTextButton::Create(this, base::ASCIIToUTF16("Default")); + md_default_button_->SetIsDefault(true); + container->AddChildView(md_default_button_); + + md_prominent_button_ = + MdTextButton::Create(this, base::ASCIIToUTF16("Call to action")); + md_prominent_button_->SetProminent(true); + container->AddChildView(md_prominent_button_); ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); image_button_ = new ImageButton(this); @@ -122,14 +125,18 @@ } void ButtonExample::ButtonPressed(Button* sender, const ui::Event& event) { - if (sender == label_button_) + if (sender == label_button_) { LabelButtonPressed(label_button_, event); - else if (sender == styled_button_) + } else if (sender == styled_button_) { LabelButtonPressed(styled_button_, event); - else if (sender == disabled_button_) + } else if (sender == disabled_button_) { LabelButtonPressed(disabled_button_, event); - else + } else if (sender == md_button_ || sender == md_default_button_ || + sender == md_prominent_button_) { + static_cast<CustomButton*>(sender)->StartThrobbing(5); + } else { PrintStatus("Image Button Pressed! count: %d", ++count_); + } } } // namespace examples
diff --git a/ui/views/examples/button_example.h b/ui/views/examples/button_example.h index 956759c..81ace67 100644 --- a/ui/views/examples/button_example.h +++ b/ui/views/examples/button_example.h
@@ -13,6 +13,7 @@ class ImageButton; class LabelButton; +class MdTextButton; namespace examples { @@ -36,6 +37,9 @@ LabelButton* label_button_ = nullptr; LabelButton* styled_button_ = nullptr; LabelButton* disabled_button_ = nullptr; + MdTextButton* md_button_ = nullptr; + MdTextButton* md_default_button_ = nullptr; + MdTextButton* md_prominent_button_ = nullptr; ImageButton* image_button_ = nullptr; const gfx::ImageSkia* icon_ = nullptr;
diff --git a/ui/views/mus/input_method_mus.cc b/ui/views/mus/input_method_mus.cc index aceca35..9166d5d 100644 --- a/ui/views/mus/input_method_mus.cc +++ b/ui/views/mus/input_method_mus.cc
@@ -14,6 +14,8 @@ #include "ui/platform_window/mojo/text_input_state.mojom.h" #include "ui/views/mus/text_input_client_impl.h" +using ui::mojom::EventResult; + namespace views { //////////////////////////////////////////////////////////////////////////////// @@ -31,6 +33,31 @@ connector->ConnectToInterface("service:ui", &ime_server_); } +void InputMethodMus::DispatchKeyEvent( + ui::KeyEvent* event, + std::unique_ptr<base::Callback<void(EventResult)>> ack_callback) { + DCHECK(event->type() == ui::ET_KEY_PRESSED || + event->type() == ui::ET_KEY_RELEASED); + + // If no text input client, do nothing. + if (!GetTextInputClient()) { + ignore_result(DispatchKeyEventPostIME(event)); + if (ack_callback) { + ack_callback->Run(event->handled() ? EventResult::HANDLED + : EventResult::UNHANDLED); + } + return; + } + + // IME driver will notify us whether it handled the event or not by calling + // ProcessKeyEventCallback(), in which we will run the |ack_callback| to tell + // the window server if client handled the event or not. + input_method_->ProcessKeyEvent( + ui::Event::Clone(*event), + base::Bind(&InputMethodMus::ProcessKeyEventCallback, + base::Unretained(this), *event, Passed(&ack_callback))); +} + //////////////////////////////////////////////////////////////////////////////// // InputMethodMus, ui::InputMethod implementation: @@ -52,28 +79,7 @@ } void InputMethodMus::DispatchKeyEvent(ui::KeyEvent* event) { - DCHECK(event->type() == ui::ET_KEY_PRESSED || - event->type() == ui::ET_KEY_RELEASED); - - // If no text input client, do nothing. - if (!GetTextInputClient()) { - ignore_result(DispatchKeyEventPostIME(event)); - return; - } - - // TODO(moshayedi): crbug.com/641355. Currently if we stop propagation of - // non-char events here, accelerators ddn't work. This is because we send the - // event ack too early in NativeWidgetMus. We should send both char and - // non-char events to the IME driver once we fix this. - if (event->is_char()) { - // IME driver will notify the text input client if it is not interested in - // event, which in turn will call DispatchKeyEventPostIME(). - input_method_->ProcessKeyEvent(ui::Event::Clone(*event)); - event->StopPropagation(); - return; - } - - ignore_result(DispatchKeyEventPostIME(event)); + DispatchKeyEvent(event, nullptr); } void InputMethodMus::OnTextInputTypeChanged(const ui::TextInputClient* client) { @@ -114,7 +120,7 @@ InputMethodBase::OnDidChangeFocusedClient(focused_before, focused); UpdateTextInputType(); - text_input_client_ = base::MakeUnique<TextInputClientImpl>(focused, this); + text_input_client_ = base::MakeUnique<TextInputClientImpl>(focused); ime_server_->StartSession(text_input_client_->CreateInterfacePtrAndBind(), GetProxy(&input_method_)); } @@ -131,4 +137,27 @@ } } +void InputMethodMus::ProcessKeyEventCallback( + const ui::KeyEvent& event, + std::unique_ptr<base::Callback<void(EventResult)>> ack_callback, + bool handled) { + EventResult event_result; + if (!handled) { + // If not handled by IME, try dispatching the event to delegate to see if + // any client-side post-ime processing needs to be done. This includes cases + // like backspace, return key, etc. + std::unique_ptr<ui::Event> event_clone = ui::Event::Clone(event); + ignore_result(DispatchKeyEventPostIME(event_clone->AsKeyEvent())); + event_result = + event_clone->handled() ? EventResult::HANDLED : EventResult::UNHANDLED; + } else { + event_result = EventResult::HANDLED; + } + // |ack_callback| can be null if the standard form of DispatchKeyEvent() is + // called instead of the version which provides a callback. In mus+ash we + // use the version with callback, but some unittests use the standard form. + if (ack_callback) + ack_callback->Run(event_result); +} + } // namespace views
diff --git a/ui/views/mus/input_method_mus.h b/ui/views/mus/input_method_mus.h index b1f7475..9052e38 100644 --- a/ui/views/mus/input_method_mus.h +++ b/ui/views/mus/input_method_mus.h
@@ -15,7 +15,10 @@ namespace ui { class Window; -} // namespace mojo +namespace mojom { +enum class EventResult; +} // namespace mojom +} // namespace ui namespace views { @@ -28,6 +31,10 @@ ~InputMethodMus() override; void Init(service_manager::Connector* connector); + void DispatchKeyEvent( + ui::KeyEvent* event, + std::unique_ptr<base::Callback<void(ui::mojom::EventResult)>> + ack_callback); // Overridden from ui::InputMethod: void OnFocus() override; @@ -49,6 +56,11 @@ ui::TextInputClient* focused) override; void UpdateTextInputType(); + void ProcessKeyEventCallback( + const ui::KeyEvent& event, + std::unique_ptr<base::Callback<void(ui::mojom::EventResult)>> + ack_callback, + bool handled); // The toplevel window which is not owned by this class. This may be null // for tests.
diff --git a/ui/views/mus/native_widget_mus.cc b/ui/views/mus/native_widget_mus.cc index 84fd935d..9bfd9a5 100644 --- a/ui/views/mus/native_widget_mus.cc +++ b/ui/views/mus/native_widget_mus.cc
@@ -46,6 +46,7 @@ #include "ui/views/drag_utils.h" #include "ui/views/mus/drag_drop_client_mus.h" #include "ui/views/mus/drop_target_mus.h" +#include "ui/views/mus/input_method_mus.h" #include "ui/views/mus/window_manager_connection.h" #include "ui/views/mus/window_manager_constants_converters.h" #include "ui/views/mus/window_manager_frame_values.h" @@ -548,6 +549,9 @@ aura::SetMusWindow(content_, window_); window->SetLocalProperty(kNativeWidgetMusKey, this); window_tree_host_ = base::MakeUnique<WindowTreeHostMus>(this, window_); + input_method_ = + base::MakeUnique<InputMethodMus>(window_tree_host_.get(), window_); + window_tree_host_->SetSharedInputMethod(input_method_.get()); } NativeWidgetMus::~NativeWidgetMus() { @@ -715,10 +719,8 @@ // TODO(moshayedi): crbug.com/641039. Investigate whether there are any cases // where we need input method but don't have the WindowManagerConnection here. - if (WindowManagerConnection::Exists()) { - window_tree_host_->InitInputMethod( - WindowManagerConnection::Get()->connector()); - } + if (WindowManagerConnection::Exists()) + input_method_->Init(WindowManagerConnection::Get()->connector()); focus_client_ = base::MakeUnique<FocusControllerMus>(new FocusRulesImpl(hosted_window)); @@ -1511,10 +1513,17 @@ ui::Window* view, const ui::Event& event_in, std::unique_ptr<base::Callback<void(EventResult)>>* ack_callback) { + std::unique_ptr<ui::Event> event = ui::Event::Clone(event_in); + + if (event->IsKeyEvent()) { + input_method_->DispatchKeyEvent(event->AsKeyEvent(), + std::move(*ack_callback)); + return; + } + // Take ownership of the callback, indicating that we will handle it. EventAckHandler ack_handler(std::move(*ack_callback)); - std::unique_ptr<ui::Event> event = ui::Event::Clone(event_in); // TODO(markdittmer): This should be this->OnEvent(event.get()), but that // can't happen until IME is refactored out of in WindowTreeHostMus. platform_window_delegate()->DispatchEvent(event.get());
diff --git a/ui/views/mus/native_widget_mus.h b/ui/views/mus/native_widget_mus.h index 257038b..3b932987 100644 --- a/ui/views/mus/native_widget_mus.h +++ b/ui/views/mus/native_widget_mus.h
@@ -59,6 +59,7 @@ } class DropHelper; class DropTargetMus; +class InputMethodMus; class TooltipManagerAura; class WidgetDelegate; @@ -301,6 +302,8 @@ std::unique_ptr<corewm::TooltipController> tooltip_controller_; std::unique_ptr<TooltipManagerAura> tooltip_manager_; + std::unique_ptr<InputMethodMus> input_method_; + base::WeakPtrFactory<NativeWidgetMus> close_widget_factory_; DISALLOW_COPY_AND_ASSIGN(NativeWidgetMus);
diff --git a/ui/views/mus/text_input_client_impl.cc b/ui/views/mus/text_input_client_impl.cc index 59b4b99..2503b7f 100644 --- a/ui/views/mus/text_input_client_impl.cc +++ b/ui/views/mus/text_input_client_impl.cc
@@ -9,11 +9,8 @@ namespace views { -TextInputClientImpl::TextInputClientImpl(ui::TextInputClient* text_input_client, - InputMethodMus* input_method) - : text_input_client_(text_input_client), - input_method_(input_method), - binding_(this) {} +TextInputClientImpl::TextInputClientImpl(ui::TextInputClient* text_input_client) + : text_input_client_(text_input_client), binding_(this) {} TextInputClientImpl::~TextInputClientImpl() {} @@ -46,10 +43,4 @@ } } -void TextInputClientImpl::OnUnhandledEvent( - std::unique_ptr<ui::Event> key_event) { - DCHECK(key_event && key_event->IsKeyEvent()); - input_method_->DispatchKeyEventPostIME(key_event->AsKeyEvent()); -} - } // namespace views
diff --git a/ui/views/mus/text_input_client_impl.h b/ui/views/mus/text_input_client_impl.h index cb51a6c..24b2827 100644 --- a/ui/views/mus/text_input_client_impl.h +++ b/ui/views/mus/text_input_client_impl.h
@@ -20,8 +20,7 @@ // notifies the underlying ui::TextInputClient accordingly. class TextInputClientImpl : public ui::mojom::TextInputClient { public: - TextInputClientImpl(ui::TextInputClient* text_input_client, - InputMethodMus* input_method); + explicit TextInputClientImpl(ui::TextInputClient* text_input_client); ~TextInputClientImpl() override; ui::mojom::TextInputClientPtr CreateInterfacePtrAndBind(); @@ -29,10 +28,8 @@ private: // ui::mojom::TextInputClient: void OnCompositionEvent(ui::mojom::CompositionEventPtr event) override; - void OnUnhandledEvent(std::unique_ptr<ui::Event> key_event) override; ui::TextInputClient* text_input_client_; - InputMethodMus* input_method_; mojo::Binding<ui::mojom::TextInputClient> binding_; DISALLOW_COPY_AND_ASSIGN(TextInputClientImpl);
diff --git a/ui/views/mus/window_tree_host_mus.cc b/ui/views/mus/window_tree_host_mus.cc index 4af43f2..0d08e1b 100644 --- a/ui/views/mus/window_tree_host_mus.cc +++ b/ui/views/mus/window_tree_host_mus.cc
@@ -59,9 +59,6 @@ platform_window()->SetBounds(window->bounds()); compositor()->SetHostHasTransparentBackground(true); - - input_method_ = base::MakeUnique<InputMethodMus>(this, window); - SetSharedInputMethod(input_method_.get()); } WindowTreeHostMus::~WindowTreeHostMus() { @@ -69,15 +66,9 @@ DestroyDispatcher(); } -void WindowTreeHostMus::InitInputMethod(service_manager::Connector* connector) { - input_method_->Init(connector); -} - void WindowTreeHostMus::DispatchEvent(ui::Event* event) { - if (event->IsKeyEvent() && GetInputMethod()) { - GetInputMethod()->DispatchKeyEvent(event->AsKeyEvent()); - return; - } + // Key events are sent to InputMethodMus directly from NativeWidgetMus. + DCHECK(!event->IsKeyEvent()); WindowTreeHostPlatform::DispatchEvent(event); }
diff --git a/ui/views/mus/window_tree_host_mus.h b/ui/views/mus/window_tree_host_mus.h index 9afca03..84c4649e 100644 --- a/ui/views/mus/window_tree_host_mus.h +++ b/ui/views/mus/window_tree_host_mus.h
@@ -22,7 +22,6 @@ namespace views { -class InputMethodMus; class NativeWidgetMus; class PlatformWindowMus; @@ -32,8 +31,6 @@ ~WindowTreeHostMus() override; NativeWidgetMus* native_widget() { return native_widget_; } - void InitInputMethod(service_manager::Connector* connector); - private: // aura::WindowTreeHostPlatform: void DispatchEvent(ui::Event* event) override; @@ -43,7 +40,6 @@ gfx::ICCProfile GetICCProfileForCurrentDisplay() override; NativeWidgetMus* native_widget_; - std::unique_ptr<InputMethodMus> input_method_; DISALLOW_COPY_AND_ASSIGN(WindowTreeHostMus); };
diff --git a/ui/views/style/platform_style.cc b/ui/views/style/platform_style.cc index b5860607..706f0ab 100644 --- a/ui/views/style/platform_style.cc +++ b/ui/views/style/platform_style.cc
@@ -42,6 +42,7 @@ const bool PlatformStyle::kTextfieldDragVerticallyDragsToEnd = false; const CustomButton::NotifyAction PlatformStyle::kMenuNotifyActivationAction = CustomButton::NOTIFY_ON_RELEASE; +const bool PlatformStyle::kTreeViewHasFocusRing = false; const bool PlatformStyle::kTreeViewSelectionPaintsEntireRow = false; const bool PlatformStyle::kUseRipples = true;
diff --git a/ui/views/style/platform_style.h b/ui/views/style/platform_style.h index b4cf8de..411506c 100644 --- a/ui/views/style/platform_style.h +++ b/ui/views/style/platform_style.h
@@ -48,6 +48,9 @@ // The menu button's action to show the menu. static const CustomButton::NotifyAction kMenuNotifyActivationAction; + // Whether TreeViews get a focus ring on the entire TreeView when focused. + static const bool kTreeViewHasFocusRing; + // Whether selecting a row in a TreeView selects the entire row or only the // label for that row. static const bool kTreeViewSelectionPaintsEntireRow;
diff --git a/ui/views/style/platform_style_mac.mm b/ui/views/style/platform_style_mac.mm index c8317df0..5562aa82 100644 --- a/ui/views/style/platform_style_mac.mm +++ b/ui/views/style/platform_style_mac.mm
@@ -23,6 +23,7 @@ const bool PlatformStyle::kDefaultLabelButtonHasBoldFont = false; const bool PlatformStyle::kDialogDefaultButtonCanBeCancel = false; const bool PlatformStyle::kTextfieldDragVerticallyDragsToEnd = true; +const bool PlatformStyle::kTreeViewHasFocusRing = true; const bool PlatformStyle::kTreeViewSelectionPaintsEntireRow = true; const bool PlatformStyle::kUseRipples = false;
diff --git a/ui/webui/resources/images/vr_back.svg b/ui/webui/resources/images/vr_back.svg new file mode 100644 index 0000000..bef096c --- /dev/null +++ b/ui/webui/resources/images/vr_back.svg
@@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg width="58px" height="58px" viewBox="0 0 58 58" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <title>Fill 1</title> + <defs> + <filter x="-50%" y="-50%" width="200%" height="200%" filterUnits="objectBoundingBox" id="filter-1"> + <feOffset dx="0" dy="2" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset> + <feGaussianBlur stdDeviation="7" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur> + <feColorMatrix values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.130321558 0" type="matrix" in="shadowBlurOuter1" result="shadowMatrixOuter1"></feColorMatrix> + <feMerge> + <feMergeNode in="shadowMatrixOuter1"></feMergeNode> + <feMergeNode in="SourceGraphic"></feMergeNode> + </feMerge> + </filter> + </defs> + <g id="Layout" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> + <g id="omni-idle" transform="translate(-803.000000, -920.000000)" fill="#565656"> + <g id="omni" filter="url(#filter-1)" transform="translate(782.000000, 896.000000)"> + <g id="Back" transform="translate(26.000000, 27.000000)"> + <g id="back" transform="translate(8.000000, 8.000000)"> + <path d="M17.0289822,28.2849399 L6.74548952,18 L29.916,18 L29.916,17.9982651 C29.9438573,17.9994179 29.9718611,18 30,18 C31.104,18 32,17.104 32,16 C32,14.896 31.104,14 30,14 C29.9718611,14 29.9438573,14.0005821 29.916,14.0017349 L29.916,14 L6.74548952,14 L17.0289822,3.71506014 C17.6106299,3.365158 18,2.72777375 18,2 C18,0.896 17.104,0 16,0 C15.4266494,0 14.9093992,0.241663132 14.5446194,0.628619359 L14.502,0.586 L0.29,14.798 L0.354827342,14.8628732 C0.131113098,15.1858039 1.13686838e-12,15.5776834 1.13686838e-12,16 C1.13686838e-12,16.4223166 0.131113098,16.8141961 0.354827342,17.1371268 L0.29,17.202 L14.502,31.414 L14.5446194,31.3713806 C14.9093992,31.7583369 15.4266494,32 16,32 C17.104,32 18,31.104 18,30 C18,29.2722263 17.6106299,28.634842 17.0289822,28.2849399 Z" id="Fill-1"></path> + </g> + </g> + </g> + </g> + </g> +</svg>
diff --git a/ui/webui/resources/images/vr_overflow.svg b/ui/webui/resources/images/vr_overflow.svg new file mode 100644 index 0000000..a2856ea --- /dev/null +++ b/ui/webui/resources/images/vr_overflow.svg
@@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg width="36px" height="59px" viewBox="0 0 36 59" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <title>menu</title> + <defs> + <filter x="-50%" y="-50%" width="200%" height="200%" filterUnits="objectBoundingBox" id="filter-1"> + <feOffset dx="0" dy="2" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset> + <feGaussianBlur stdDeviation="7" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur> + <feColorMatrix values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.130321558 0" type="matrix" in="shadowBlurOuter1" result="shadowMatrixOuter1"></feColorMatrix> + <feMerge> + <feMergeNode in="shadowMatrixOuter1"></feMergeNode> + <feMergeNode in="SourceGraphic"></feMergeNode> + </feMerge> + </filter> + </defs> + <g id="Layout" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> + <g id="omni-idle" transform="translate(-1452.000000, -921.000000)" fill="#565656"> + <g id="omni" filter="url(#filter-1)" transform="translate(782.000000, 896.000000)"> + <path d="M688,44.25 C690.208,44.25 692,42.402 692,40.125 C692,37.848 690.208,36 688,36 C685.79,36 684,37.848 684,40.125 C684,42.402 685.79,44.25 688,44.25 L688,44.25 Z M688,48.375 C685.79,48.375 684,50.223 684,52.5 C684,54.777 685.79,56.625 688,56.625 C690.208,56.625 692,54.777 692,52.5 C692,50.223 690.208,48.375 688,48.375 L688,48.375 Z M688,60.75 C685.79,60.75 684,62.598 684,64.875 C684,67.152 685.79,69 688,69 C690.208,69 692,67.152 692,64.875 C692,62.598 690.208,60.75 688,60.75 L688,60.75 Z" id="menu"></path> + </g> + </g> + </g> +</svg>
diff --git a/ui/webui/resources/images/vr_reload.svg b/ui/webui/resources/images/vr_reload.svg new file mode 100644 index 0000000..8f027cb1 --- /dev/null +++ b/ui/webui/resources/images/vr_reload.svg
@@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg width="90px" height="90px" viewBox="0 0 90 90" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <title>reload</title> + <defs> + <filter x="-50%" y="-50%" width="200%" height="200%" filterUnits="objectBoundingBox" id="filter-1"> + <feOffset dx="0" dy="2" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset> + <feGaussianBlur stdDeviation="15" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur> + <feColorMatrix values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.29 0" type="matrix" in="shadowBlurOuter1" result="shadowMatrixOuter1"></feColorMatrix> + <feMerge> + <feMergeNode in="shadowMatrixOuter1"></feMergeNode> + <feMergeNode in="SourceGraphic"></feMergeNode> + </feMerge> + </filter> + </defs> + <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> + <g id="02_overflow-menu" transform="translate(-1536.000000, -906.000000)" fill="#5A5A5A"> + <g id="overflow" filter="url(#filter-1)" transform="translate(1418.000000, 603.000000)"> + <path d="M174.368309,334.631691 L179,330 L179,344 L165,344 L171.534496,337.465504 C169.361142,335.323093 166.373342,334 163.071316,334 C156.413774,334 151.017829,339.372 151.017829,346 C151.017829,352.628 156.413774,358 163.071316,358 C168.32061,358 172.487099,354.75 174.013874,350.218 L174.234533,350.194419 C174.606882,349.395503 175.341308,349 176.006604,349 C176.8934,349 178,349.632779 178,351.00095 C178,351.295844 177.936326,351.575824 177.822014,351.82782 L177.913177,351.822 C175.528596,357.682 169.813234,362 163.071316,362 C154.195932,362 147,354.836 147,346 C147,337.164 154.195932,330 163.071316,330 C167.479103,330 171.468518,331.768738 174.368309,334.631691 Z" id="reload"></path> + </g> + </g> + </g> +</svg>
diff --git a/ui/webui/resources/webui_resources.grd b/ui/webui/resources/webui_resources.grd index 1753e0b08..0190e3f 100644 --- a/ui/webui/resources/webui_resources.grd +++ b/ui/webui/resources/webui_resources.grd
@@ -468,8 +468,8 @@ file="js/chromeos/ui_account_tweaks.js" type="chrome_html" /> </if> - <part file="cr_elements_resources.grdp" /> <if expr="not is_android"> + <part file="cr_elements_resources.grdp" /> <part file="polymer_resources.grdp" /> </if> </structures>
diff --git a/url/gurl.cc b/url/gurl.cc index 8b5c8926..98a0300 100644 --- a/url/gurl.cc +++ b/url/gurl.cc
@@ -180,14 +180,6 @@ return EmptyStringForGURL(); } -bool GURL::operator==(const GURL& other) const { - return spec_ == other.spec_; -} - -bool GURL::operator!=(const GURL& other) const { - return spec_ != other.spec_; -} - bool GURL::operator<(const GURL& other) const { return spec_ < other.spec_; } @@ -510,3 +502,19 @@ std::ostream& operator<<(std::ostream& out, const GURL& url) { return out << url.possibly_invalid_spec(); } + +bool operator==(const GURL& x, const GURL& y) { + return x.possibly_invalid_spec() == y.possibly_invalid_spec(); +} + +bool operator!=(const GURL& x, const GURL& y) { + return !(x == y); +} + +bool operator==(const GURL& x, const base::StringPiece& spec) { + return x.possibly_invalid_spec() == spec; +} + +bool operator!=(const GURL& x, const base::StringPiece& spec) { + return !(x == spec); +}
diff --git a/url/gurl.h b/url/gurl.h index c9111d3..ce7e33c 100644 --- a/url/gurl.h +++ b/url/gurl.h
@@ -132,10 +132,6 @@ return parsed_; } - // Defiant equality operator! - bool operator==(const GURL& other) const; - bool operator!=(const GURL& other) const; - // Allows GURL to used as a key in STL (for example, a std::set or std::map). bool operator<(const GURL& other) const; bool operator>(const GURL& other) const; @@ -447,4 +443,13 @@ // Stream operator so GURL can be used in assertion statements. URL_EXPORT std::ostream& operator<<(std::ostream& out, const GURL& url); +URL_EXPORT bool operator==(const GURL& x, const GURL& y); +URL_EXPORT bool operator!=(const GURL& x, const GURL& y); + +// Equality operator for comparing raw spec_. This should be used in place of +// url == GURL(spec) where |spec| is known (i.e. constants). This is to prevent +// needlessly re-parsing |spec| into a temporary GURL. +URL_EXPORT bool operator==(const GURL& x, const base::StringPiece& spec); +URL_EXPORT bool operator!=(const GURL& x, const base::StringPiece& spec); + #endif // URL_GURL_H_